4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【MCP】Claude DesktopからLambda関数を呼び出しS3のファイルを取得する(lambda-tool-mcp-server)

Last updated at Posted at 2025-06-06

目的

最近MCPの動きがとても速いですね。
今回はMCPを使うことで何ができるのか。
それを体験できるハンズオンとなっています。

今回作るもの
AWS lambda-tool-mcp-serverを使い、AWS環境にあるS3バケットの情報をローカルのClaude Desktopから自然言語指示で取得する

・全体構成

  • MCPクライアントにはClaude Desktopを使います。
  • MCPサーバーにはAWS公式のlambda-tool-mcp-serverをローカルコンテナで使います。
  • MCPツールにはS3と連携させたLambda関数を使います。

image.png

・デモ

image.png

前提条件

  • Dockerがインストールされていることとします。
  • Claude Desktopがインストールされていることとします。
  • 本手順はWindows(WSL)環境を使います。
  • MCPサーバーからLambda関数実行のためのAWS認証情報にはAWS_ACCESS_KEY_IDおよびAWS_SECRET_ACCESS_KEYを使います。

AWS リソースの作成

まずはAWS側の準備で、赤枠の部分を構築してきます。

image.png

AWSからLambda関数のサンプルが提供されており、samコマンドで一気に立ち上げることもできますが、
ここでは自作のLambda関数を使うことでよりMCPへの理解を深めます。

S3バケットの作成

まずはバケットを作成します。
今回はダミーで構いません。
設定値もデフォルトで作ります。

image.png

作成したバケット内には適当なファイルを入れておきます。

image.png

ロールの作成

Lambda用のロールを作成します。
Lambda関数の実行とS3へのアクセスポリシーをアタッチしておきます。

項目 内容
名前 lambda-s3-full-access-role
信頼ポリシー ※下記参照
許可ポリシー • AWSLambdaBasicExecutionRole
• AmazonS3FullAccess
※ 信頼ポリシー
信頼ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com"
                ]
            }
        }
    ]
}

image.png

Lambdaの作成

S3バケットの一覧を取得するLambda関数

① Lambda関数の作成

項目 設定値
関数名 lambda-tool-mcp-s3-bucket-list
ランタイム Python 3.13
アーキテクチャ x86_64
既存のロール名 lambda-s3-full-access-role

image.png

② コードを記述

今回はシンプルにすべてのS3バケット名を取得する関数になります。

lambda_function.py
import boto3

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    response = s3.list_buckets()
    buckets = [bucket['Name'] for bucket in response['Buckets']]
        
    return {
        'Buckets': buckets
    }
レスポンス内容
レスポンス内容
{
  "Buckets": [
    "hello-noguchi-bucket",
    "nice-noguchi-bucket"
  ]
}

③ 説明を追加

一般設定からLambda関数の説明を記載します。

ここの記載内容でAIがLambda関数の機能を理解するため、しっかり書きましょう。

Get a list of buckets in S3.

image.png

S3バケットのファイルの一覧を取得するLambda関数

① Lambda関数の作成

項目 設定値
関数名 lambda-tool-mcp-s3-file-list
ランタイム Python 3.13
アーキテクチャ x86_64
既存のロール名 lambda-s3-full-access-role

image.png

② コードを記述

今回は指定されたS3バケット名にあるファイルを一覧取得する関数になります。

lambda_function.py
import boto3
import json

def lambda_handler(event, context):
   s3 = boto3.client('s3')
   
   bucket_name = event.get('bucket_name')
   
   response = s3.list_objects_v2(Bucket=bucket_name)
   
   files = []
   if 'Contents' in response:
       files = [obj['Key'] for obj in response['Contents']]
   
   return {
        'fileName': files
   }
リクエスト内容
リクエスト内容
{
  "bucket_name": "hello-noguchi-bucket"
}
レスポンス内容
レスポンス内容
{
  "fileName": [
    "hello_file1.txt",
    "hello_file2.txt"
  ]
}

③ 説明を追加

一般設定からLambda関数の説明を記載します。

ここの記載内容でAIがLambda関数の機能を理解するため、しっかり書きましょう。

Get a list of files in the S3 bucket.

image.png

スキーマの作成

EventBridgeのスキーマを設定します。
ここではLambda関数lambda-tool-mcp-s3-file-listがどのようなリクエストを受け付けるかを定義します。
今回はパラメータbucket_nameをstring型で受け取ることを前提としています。

ここの記載内容でAIがLambda関数の使い方を理解するため、しっかり書きましょう。

項目 設定値
スキーマレジストリ 適当なレジストリ(なければ新規作成)
スキーマ名 S3FileListSchema
スキーマタイプ JSON Schema Draft 4
スキーマ内容 ※下記参照
※スキーマ内容
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "title": "S3FileListInput",
  "description": "Input schema for listing files in an S3 bucket",
  "required": ["bucket_name"],
  "properties": {
    "bucket_name": {
      "type": "string",
      "pattern": "^[a-z0-9.-]{3,63}$",
      "description": "S3 bucket name (must follow AWS naming conventions)"
    }
  },
  "additionalProperties": false
}

image.png

スキーマの設定

EventBrigeでスキーマを作成したら、Lambda関数lambda-toop-mcp-s3-file-listのタグへ紐づけます。

項目 設定値
tool-input-schema-arn <スキーマ ARN>

image.png

MCPサーバーの準備

次にMCP側の準備で、赤枠の部分をローカルに構築してきます。
image.png

AWSから公式にいくつものMCPサーバーが提供されています。
まずは以下のリポジトリからコードを取得してください。

その中で、今回使うソースはmcp/src/lambda-tool-mcp-serverになります。

機能の概念や使い方はREADME.mdにも書かれているので一読をお勧めします。

フォルダ構成の概要はこちら↓

フォルダ構成説明
lambda-tool-mcp-server/
├── 📄 設定・ドキュメント
│   ├── pyproject.toml           # Python パッケージ設定(依存関係、ビルド設定)
│   ├── README.md               # プロジェクトの説明・使用方法
│   ├── CHANGELOG.md            # バージョン履歴
│   ├── LICENSE                 # Apache 2.0 ライセンス
│   ├── NOTICE                  # 法的通知
│   └── uv.lock                 # 依存関係ロックファイル
├── 🐳 Docker関連
│   ├── Dockerfile              # コンテナイメージ定義
│   └── docker-healthcheck.sh   # ヘルスチェックスクリプト
├── 📦 メインコード
│   └── awslabs/
│       ├── __init__.py
│       └── lambda_tool_mcp_server/
│           ├── __init__.py
│           └── server.py       # MCPサーバーのメイン実装
├── 📚 使用例
│   └── examples/
│       ├── README.md
│       └── sample_functions/   # サンプルLambda関数
│           ├── customer-create/
│           ├── customer-id-from-email/
│           ├── customer-info-from-id/
│           ├── samconfig.toml  # SAM設定
│           └── template.yml    # SAMテンプレート
└── 🧪 テスト
    ├── tests/
    │   ├── test_*.py          # 各種テストファイル
    │   ├── conftest.py        # pytest設定
    │   └── README.md
    └── run_tests.sh           # テスト実行スクリプト

また、MCPサーバーを動かす方法には以下の2つの方法があります。

  • PythonパッケージマネージャーでMCP サーバーを実行
  • Docker コンテナでMCP サーバーを実行

今回はDockerを使います。
※READMEにPythonでの実行方法も記載されています。

Dockerイメージのビルド

下記コマンドで対象のフォルダのDockerfileをビルドします。

$ cd src/lambda-tool-mcp-server
$ docker build --no-cache -t awslabs/lambda-tool-mcp-server .

コマンドが成功したらDockerイメージが作成されているかと思います。

image.png

Claude DesktopのMCP構成を編集

この先の手順はClaude Desktopを開発者モードにしておく必要があります。
手順は以下を参考にしてください。

まず、Claude Desktopのclaude_desktop_config.jsonファイルを編集し、以下を記載します。
argsの内容は環境に応じて変更する必要がありますので、以下を参照に設定してください。

項目 設定値
--volume AWS認証情報をマウント
.awsの設定内容は下記参照
--env FUNCTION_LIST Lambda関数名
複数ある場合はカンマ区切りでつなげる
--env FUNCTION_INPUT_SCHEMA_ARN_TAG_KEY Lambda関数のタグに設定したスキーマのタグKey名
--env AWS_REGION リージョン名
--env AWS_PROFILE 使用するAWSプロファイル
※ .awsファイルの設定内容例
./aws/credentials
[profile my_profile]
region = ap-northeast-1
output = json
./aws/config
[my_profile]
aws_access_key_id = <IAMユーザーのアクセスキー>
aws_secret_access_key = <IAMユーザーのシークレットアクセスキー>
claude_desktop_config.json
{
    "mcpServers": {
      "awslabs.lambda-tool-mcp-server": {
        "command": "docker",
        "args": [
            "run",
            "--rm",
            "--interactive",
            "--volume",
            "C:\\Users\\user\\.aws:/app/.aws:ro", 
            "--env",
            "FUNCTION_LIST=lambda-toop-mcp-s3-bucket-list,lambda-toop-mcp-s3-file-list",
            "--env",
            "FUNCTION_INPUT_SCHEMA_ARN_TAG_KEY=tool-input-schema-arn",
            "--env",
            "AWS_REGION=ap-northeast-1",
            "--env",
            "AWS_PROFILE=my_profile",
            "awslabs/lambda-tool-mcp-server:latest"
        ],
        "env": {},
        "disabled": false,
        "autoApprove": []
      }
    }
}

※他のargsに設定できる項目についてはREADME.mdを参照してください。

ここまでくれば準備OKです。
お疲れ様でした。

MCPサーバーの起動

Claude Desktopを起動します。
すると同時にコンテナが立ち上がりMCPサーバー「sever.py」が起動されます。

image.png

この状態でClaude Desktopを見ると、先ほど作成したLambda関数がToolとして登録されていることが確認できます。

image.png

MCPサーバーを使う

Claude Desktopに以下の指示を投げてみてください。

S3バケットの一覧を教えてください。

image.png

バケットの一覧が取得できました。
次にバケットの中身を聞いてみましょう。

hello-noguchi-bucketにはどのようなファイルが格納されていますか?

image.png

正しくファイルも取得できていますね。
ちなみに最初に外部連携許可を求められるかと思いますが、こちらは確認後許可してください。

image.png

(補足)

実際にどのようにMCPサーバーがLambda関数を認識、実行しているかはsever.pyを読み解くと理解が深まると思われますので、お時間がある方はぜひ。

まとめ

2024年11月にAnthropicからMCPが提唱され早半年がたちました。
今では多くのサービスがMCPサーバーとの連携を前提としたToolを出しており、MCPという概念が標準化されたといっても過言ではありません。
以前まで当たり前だったRAGも今ではMCPで代用できる部分が多く、技術の移り変わりの速さに焦りを感じております。

今回のLambda関数はシンプルにS3からバケットやファイルを取得するだけの処理でしたが、
Lambda関数に実装する機能次第でMCPができることがかなり広がるかと思います。

皆さんも早めにMCPを触っておきましょう!!
(これすらも少し経っただけで古いものになる時代かもしれませんが。。。)

仲間を募集しています!

ARIではエンジニア・ITコンサルタント・PM職全方位で仲間を募集しております。
カジュアル面談、随時受付中です!
ご興味ある方はこちらをご覧ください。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?