π§ cdk-serverless-mcp-server
About
# π§ cdk-serverless-mcp-server A super simple Model Context Protocol (MCP) server deployed on AWS Lambda and exposed via Amazon API Gateway, deployed with AWS CDK. This skeleton is based on the awesome work of [FrΓ©dΓ©ric Barthelet](https://github.com/fredericbarthelet): which has developed a middy middleware for Modelβ¦
Explore
- πͺ Minimal MCP server setup using @modelcontextprotocol/sdk
- π Deployed as a single AWS Lambda function
- π HTTP POST endpoint exposed via API Gateway at /mcp
- π Supports local development testing with jest
- π§ͺ Includes a simple example tool (add) with JSON-RPC interaction
- Node.js v22+
- AWS CDK v2+
1. Install dependencies:
npm install
2. Install AWS CDK globally (if not already installed):
npm install -g aws-cdk
3. Test Locally with jest
npm run test
Just run:
npm run layer-dependencies-install # install dependencies for the layer
Then, deploy the stack:
cdk bootstrap
cdk deploy
After deployment, the MCP server will be live at the URL output by the command.
curl --location 'http://your-endpoint/dev/mcp' \
--header 'content-type: application/json' \
--header 'accept: application/json' \
--header 'jsonrpc: 2.0' \
--data '{
"jsonrpc": "2.0",
"method": "tools/list",
"id": 1
}'
curl --location 'http://your-endpoint/dev/mcp' \
--header 'content-type: application/json' \
--header 'accept: application/json' \
--header 'jsonrpc: 2.0' \
--data '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "add",
"arguments": {
"a": 5,
"b": 3
}
}
}'
Long story
- π Read the full article here on dev.to - π Read the first article of the series here on dev.toπ Features
- πͺ Minimal MCP server setup using @modelcontextprotocol/sdk - π Deployed as a single AWS Lambda function - π HTTP POST endpoint exposed via API Gateway at /mcp - π Supports local development testing with jest - π§ͺ Includes a simple example tool (add) with JSON-RPC interactionπ¦ Project Structure
cdk-serverless-mcp-server/
βββ __tests__/ # Jest tests
βββ bin/ # CDK entry point
βββ cdk-serverless-mcp-server.ts # CDK app
βββ lib/ # CDK stack
β βββ cdk-serverless-mcp-server-stack.ts # CDK stack
βββ src/ # Source code
β βββ index.mjs # MCP server handler
βββ .gitignore # Git ignore file
βββ cdk.json # CDK Project config
βββ package.json # Project dependencies
βββ package-lock.json # Project lock file
βββ README.md # This documentation file
π Prerequisites
- Node.js v22+ - AWS CDK v2+π Getting Started
1. Install dependencies:
npm install
2. Install AWS CDK globally (if not already installed):
npm install -g aws-cdk
3. Test Locally with jest
npm run test
𧬠Code Breakdown
This code is based on the awesome work of FrΓ©dΓ©ric Barthelet: which has developed a middy middleware for Model Context Protocol (MCP) server integration with AWS Lambda functions in this reposrc/index.js
import middy from "@middy/core";
import httpErrorHandler from "@middy/http-error-handler";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import mcpMiddleware from "middy-mcp";
const server = new McpServer({
name: "Lambda hosted MCP Server",
version: "1.0.0",
});
server.tool("add", { a: z.number(), b: z.number() }, async ({ a, b }) => ({
content: [{ type: "text", text: String(a + b) }],
}));
export const handler = middy()
.use(mcpMiddleware({ server }))
.use(httpErrorHandler());
π‘ Deploy to AWS
Just run:
npm run layer-dependencies-install # install dependencies for the layer
Then, deploy the stack:
cdk bootstrap
cdk deploy
After deployment, the MCP server will be live at the URL output by the command.
π§ͺ Once deployed, test with curl requests
List tools
curl --location 'http://your-endpoint/dev/mcp' \
--header 'content-type: application/json' \
--header 'accept: application/json' \
--header 'jsonrpc: 2.0' \
--data '{
"jsonrpc": "2.0",
"method": "tools/list",
"id": 1
}'
β Use the add Tool
curl --location 'http://your-endpoint/dev/mcp' \
--header 'content-type: application/json' \
--header 'accept: application/json' \
--header 'jsonrpc: 2.0' \
--data '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "add",
"arguments": {
"a": 5,
"b": 3
}
}
}'
π License
MIT β feel free to fork, tweak, and deploy your own version!Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.



