
Claude Cowork から AWS MCP Serverを利用してs3に接続してみた
クラウド事業本部、あきやまです。
最近、Claude Coworkを使う機会が増えてきたのですが、ふとCoworkからAWS環境にあるS3に接続できるのか気になったため今回はaws-mcp-serverを利用し接続できるか検証したのでその過程をブログにしていきます。
環境
| 項目 | 値 |
|---|---|
| OS | macOS (Darwin 25.5.0) |
| Claude Desktop | 1.40609.0 |
| MCP | AWS MCP Server(リモート、AWS Sign-In の OAuth) |
| エンドポイント | https://aws-mcp.us-east-1.api.aws/mcp?oauth=initialize |
| S3 リージョン | 対象バケットのリージョン(例: ap-northeast-1) |
仕組み
接続と認可の流れです。
Cowork はローカルの ~/.aws を読みません。
Anthropic 側から公開の AWS MCP Server へリモート接続し、AWS Sign-In の OAuth 2.1 でトークンを付けます。
トークンは権限を足しません。
下流の S3 呼び出しは、サインインした IAM プリンシパルの既存ポリシーで評価されます。
Claude Desktop 向けのエンドポイントは次です。
https://aws-mcp.us-east-1.api.aws/mcp?oauth=initialize
やってみた
Step 1: 読み取り専用の専用プリンシパルを用意する
日常の AdministratorAccess で Sign-In すると、エージェントは本人と同じ広さで S3 を見ます。
検証用に、Cowork 専用の IAM ユーザーまたは Identity Center の許可セットを切ります。
付ける権限は次の 2 系統だけです。
- AWS MCP Server へ OAuth するための
signin:AuthorizeOAuth2Accessとsignin:CreateOAuth2Token - 対象バケットの一覧とオブジェクト取得
マネージドポリシー AWSMCPSignInOAuthAccessPolicy でも 1 は足せます。
S3 側はカスタムポリシーにします。
対象バケット名を REPLACE_WITH_BUCKET_NAME に置き換えた例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowOAuthToAwsMcpServer",
"Effect": "Allow",
"Action": [
"signin:AuthorizeOAuth2Access",
"signin:CreateOAuth2Token"
],
"Resource": "arn:aws:signin:*:*:service-principal/aws-mcp.amazonaws.com"
},
{
"Sid": "AllowListAndLocateOneBucket",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::REPLACE_WITH_BUCKET_NAME"
},
{
"Sid": "AllowReadObjectsInOneBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource": "arn:aws:s3:::REPLACE_WITH_BUCKET_NAME/*"
},
{
"Sid": "DenyListAllBuckets",
"Effect": "Deny",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Sid": "DenyS3Writes",
"Effect": "Deny",
"Action": [
"s3:PutObject",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:CreateBucket",
"s3:DeleteBucket"
],
"Resource": "*"
}
]
}
s3:ListBucket の Resource はバケット ARN です。
s3:GetObject の Resource はオブジェクト ARN(末尾 /*)です。
この対応を取り違えると、一覧も取得もどちらも落ちます。
s3:ListAllMyBuckets は入れていません。
これを付けると ListBuckets でアカウント内のバケット名が並びます。
「中身は 1 バケットだけ」でも、名前の列挙は別の情報漏えいです。
プレフィックスまで閉じたい場合は、s3:ListBucket に s3:prefix 条件を足し、GetObject の Resource を arn:aws:s3:::バケット/プレフィックス/* にします。
今回はバケット単位です。
Step 2: Cowork に AWS MCP Server をカスタムコネクタとして追加する
Claude Desktop で次の順です。
- カスタマイズ > コネクタ
- カスタムコネクタを追加
- 名前は識別しやすいもの(例:
aws-mcp) - URL に
https://aws-mcp.us-east-1.api.aws/mcp?oauth=initializeを入れる - 追加する
ローカルの AWS CLI プロファイルを JSON に書く手順ではありません。
Cowork の隔離環境から ~/.aws を読ませる前提にもしません。
Step 3: AWS Sign-In で専用プリンシパルとして承認する
ターミナルから今回利用予定のIAMユーザーに対しaws loginを利用して事前にログインします。
Step 4: 対象バケットを指定して中身を聞く
Cowork に、対象バケット名を渡します。
今回のバケットは cowork-s3-readonly-ae8947b2 です。
AWS MCP を使って、バケット cowork-s3-readonly-ae8947b2 の中身を確認してください。

注意点・制約
専用プリンシパルで Sign-In し忘れると、この記事の IAM は効いていません。
ブラウザの既存セッションが管理者のまま、が一番やりがちです。
OAuth では、1 セッションで複数 AWS プロファイルを切り替える公式サポートはありません。
アカウントをまたぐ作業は、今回の読み取り専用フローの外です。
まとめ
- Cowork からは、AWS MCP Server をカスタムコネクタにし、AWS Sign-In でつなぎます
- 特定バケットだけ読む境界は、コネクタ設定ではなく IAM です
ListBucketとGetObjectを 1 バケットに閉じ、ListAllMyBucketsは付けません











