ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【Lambda】LambdaでMCPサーバーを動かす!uv + コンテナで解決する方法

この記事を共有する

目次

はじめに

皆さんこんにちは!パーソル&サーバーワークスの小泉です。
「LambdaでMCPサーバーを使いたい!...でも標準環境じゃ動かない...」そんな問題に直面したことはありませんか?
本記事では uvとコンテナイメージを利用してAWS Lambda(以下、Lambda)上でAWS Documentation MCP Serverを動かす方法 を解説します!

結論

Lambdaの標準機能ではMCPサーバーを動かせませんが、uvとMCPサーバーを含めたコンテナイメージを使うことで、この制約を回避できます。
ただし、Lambdaは実行環境が制限されており、キャッシュや一部ファイルシステムへの書き込みができないため、工夫が必要です。

手順

1. ディレクトリ構造

まずは以下の構成を準備します。

.
├── Dockerfile
├── requirements.txt
└── lambda_function.py

2. Dockerfileの作成

uvとMCPサーバーを含めたLambda用のDockerfileを用意します。

FROM public.ecr.aws/lambda/python:3.10
WORKDIR /var/task
# 必要な依存をインストール (tar, gzip, curl, git)
RUN yum -y install tar gzip curl git && yum clean all
# uv をインストール
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
# uv/uvx を /usr/local/bin にコピー
RUN cp /root/.local/bin/uv /usr/local/bin/uv && \
    cp /root/.local/bin/uvx /usr/local/bin/uvx && \
    chmod +x /usr/local/bin/uv /usr/local/bin/uvx
# Lambda 環境で uv がキャッシュ書き込みできるように設定
ENV HOME=/tmp
ENV UV_CACHE_DIR=/tmp/.uv-cache
# Python 依存ライブラリ
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Lambda 関数コード
COPY . .
# エントリーポイント
CMD ["lambda_function.lambda_handler"]

3. requirements.txt の内容

boto3
strands-agents
mcp
# AWS Docs MCP Server
git+https://github.com/awslabs/mcp.git@main#subdirectory=src/aws-documentation-mcp-server

4. Lambda関数の作成 (lambda_function.py)

import uuid
from strands import Agent
from strands.models import BedrockModel
from strands.tools.mcp import MCPClient
from mcp import stdio_client, StdioServerParameters
# ==== Bedrock モデル ====
bedrock_model = BedrockModel(
    region_name="us-east-1",
    model_id="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
)
# ==== MCP クライアント ====
mcp = MCPClient(
    lambda: stdio_client(
        StdioServerParameters(
            command="uvx",
            args=["awslabs.aws-documentation-mcp-server@latest"],
        )
    )
)
# ==== Lambda エントリーポイント ====
def lambda_handler(event, context=None):
    query = event.get("query", "EC2インスタンスタイプについて教えて")
    try:
        with mcp:
            tools = mcp.list_tools_sync()
            agent = Agent(
                model=bedrock_model,
                tools=tools,
                system_prompt="AWS公式ドキュメントを参照して必ず自然文で答えてください。"
            )
            result = agent(query)
        # === ここで必ず文字列に整形 ===
        msg = getattr(result, "message", result)
        if isinstance(msg, dict) and "content" in msg and isinstance(msg["content"], list):
            texts = [item.get("text", str(item)) for item in msg["content"]]
            reply = "\n".join(texts)
        elif isinstance(msg, list):
            texts = [m.get("text", str(m)) if isinstance(m, dict) else str(m) for m in msg]
            reply = "\n".join(texts)
        elif isinstance(msg, dict):
            if "text" in msg:
                reply = msg["text"]
            elif "content" in msg:
                reply = msg["content"] if isinstance(msg["content"], str) else str(msg["content"])
            else:
                reply = str(msg)
        elif isinstance(msg, str):
            reply = msg
        elif hasattr(msg, "content"):
            reply = msg.content
        else:
            reply = str(msg)
        return {"statusCode": 200, "body": reply}
    except Exception as e:
        return {"statusCode": 500, "body": str(e)}

5. Dockerイメージのビルドとプッシュ

Amazon ECR(以下、ECR)にリポジトリを作成し、イメージをプッシュします。

docker build -t mcp-lambda .
aws ecr create-repository --repository-name mcp-lambda --region ap-northeast-1
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com
docker tag mcp-lambda:latest {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/mcp-lambda:latest
docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/mcp-lambda:latest

6. Lambda関数の作成と動作確認

ECRにプッシュしたイメージを元にLambda関数を作成し、テストイベントを投げるとMCPサーバーが動作します。

cwl-mcp.pnglambda-mcp.png

まとめ

  • Lambdaの標準環境ではMCPサーバーを直接動かすことはできない
  • コンテナイメージ+uvを使えばMCPサーバーを呼び出せる
  • キャッシュや書き込み制限があるので/tmpを使う工夫が必要

この記事は私が書きました

小泉 和貴

記事一覧

全国を旅行することを目標に、仕事を頑張っています。

小泉 和貴

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。