🦌

TypeScript (Express) でMCPサーバを作成してCDKでLambdaにデプロイしてCodexで使うところまで

に公開
2025/11/17

MCPサーバの作り方などは、すでにたくさん記事が出ていると思うので目新しい情報はないかもですが、タイトルに記載の構成でサクッとMCPを作りたい場合のリファレンスになればと思い、記事に残しておきます。

MCPサーバの提供方法としては、HTTPサーバにデプロイするStreamable HTTPで実装しています。

最終的なソースコードは以下に置いています。

https://github.com/hisami/mcp-node-lambda

ExpressでMCPサーバを作る

@modelcontextprotocol/sdkという公式SDKがあるので、それを使います。

https://github.com/hisami/mcp-node-lambda/blob/main/src/server.ts#L1-L54

内容は公式SDKのサンプルにもある、身長と体重の入力からBMIを計算するツールです。

ローカルで動作確認するために、動作確認用のクライアントツールも作成しています。(Githubにプッシュしてるコードの身長、体重は今の自分の理想を入れてます笑)

https://github.com/hisami/mcp-node-lambda/blob/main/src/client.ts

ここまでできたら、npx ts-node src/server.tsでサーバを立ち上げ、npx ts-node src/client.tsを実行します。以下の形式で返却されたら成功です。

BMI: [ { type: 'text', text: '{"bmi":21.132713440405748}' } ]

CDKでLambdaにデプロイする

Lambda環境でコンテナで作成したアプリケーションを実行できる、Lambda Web Adapterを使います。

Lambda Web Adapterの説明は以下の記事にも記載してますが、コンテナで動くアプリを超簡単にLambdaに動かせるようにする仕組みです。

https://zenn.dev/ncdc/articles/c141f3f30c07b3

ということで、まずはコンテナで動かせるようにするためにDockerfileを作成します。

https://github.com/hisami/mcp-node-lambda/blob/main/Dockerfile

今回は、MCPサーバの検証用ということで、起動速度などは無視して、ts-nodeを使って起動しています。

コンテナで動作することを確認するために、以下でサーバを起動して、先ほどのクライアントツールで確認します。

docker build -t mcp-node-lambda .
docker run -d --rm -p 8080:8080 mcp-node-lambda

ここまでの動きが問題なければ、続いてCDKでデプロイします。

infraディレクトリ内でcdk init --language typescriptで雛形を作った後、以下を編集します。

https://github.com/hisami/mcp-node-lambda/blob/main/infra/lib/infra-stack.ts

ここまでできたら、cdk deployでデプロイするとLambda FunctionのURLが表示されるので、先ほどのクライアントツールのURLの部分をそちらに書き換えて、同じレスポンスが返ってきたら成功です。

Codex CLIから使う

config.tomlで以下の設定を追加します。Codex CLIのバージョンが古いと、以下の設定が使えないので、必要に応じてバージョンアップしてください。

rmcp_client = true

[mcp_servers.mcp-node-lambda]
url = "https://${Lambda FunctionのURL}/mcp"

これで、「身長が182cm、体重が70kgの場合のBMIをmcp-node-lambdaを使って教えて」と送ると、以下のような回答が返ってきます。
「mcp-node-lambdaのBMI計算エンドポイントを使ったところ、身長182cm・体重70kgのBMIは約21.13でした。標準的な範囲(18.5〜25)に収まっています。」

以上、特別新しいことはしてないですが、参考になれば嬉しいです。

Discussion