- 公開日
- 最終更新日
【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サーバーが動作します。


まとめ
- Lambdaの標準環境ではMCPサーバーを直接動かすことはできない
- コンテナイメージ+uvを使えばMCPサーバーを呼び出せる
- キャッシュや書き込み制限があるので/tmpを使う工夫が必要
この記事は私が書きました
小泉 和貴
記事一覧全国を旅行することを目標に、仕事を頑張っています。