OpenAPI Lambda MCP Server
by ingeno
README.md
# OpenAPI MCP Server - AWS Lambda Deployment
Serverless deployment of the [AWS Labs OpenAPI MCP Server](https://awslabs.github.io/mcp/servers/openapi-mcp-server/) on AWS Lambda with API Gateway.
## Overview
This project wraps the awslabs openapi-mcp-server to run as a serverless Lambda function, enabling MCP (Model Context Protocol) clients to interact with OpenAPI-defined APIs through AWS infrastructure.
## Architecture
- **Lambda Function**: FastMCP server with HTTP transport (Starlette ASGI)
- **API Gateway**: HTTP API exposing the MCP endpoints
- **Transport**: Mangum ASGI adapter (no child process overhead)
## Prerequisites
- Python 3.12+
- [uv](https://github.com/astral-sh/uv) package manager
- AWS CLI configured
- AWS CDK CLI: `npm install -g aws-cdk`
## Local Setup
Install dependencies:
```bash
uv sync
```
## Deployment
### 1. Bootstrap CDK (first time only)
```bash
cdk bootstrap
```
### 2. Deploy Stack
```bash
cd cdk
cdk deploy \
--parameters ApiName=MyAPI \
--parameters ApiBaseUrl=https://api.example.com \
--parameters ApiSpecUrl=https://api.example.com/openapi.json \
--parameters AuthType=none
```
### Configuration Parameters
- `ApiName`: Display name for the API
- `ApiBaseUrl`: Base URL of the target API
- `ApiSpecUrl`: URL to the OpenAPI specification (JSON or YAML)
- `AuthType`: Authentication method (`none`, `basic`, `bearer`, `api_key`, `cognito`)
### Additional Auth Configuration
Set environment variables in [cdk/openapi_mcp_stack.py](cdk/openapi_mcp_stack.py) for authentication:
**Basic Auth:**
- `AUTH_USERNAME`
- `AUTH_PASSWORD`
**Bearer Token:**
- `AUTH_TOKEN`
**API Key:**
- `AUTH_API_KEY`
- `AUTH_API_KEY_NAME`
- `AUTH_API_KEY_IN` (header/query/cookie)
**Cognito:**
- `AUTH_COGNITO_CLIENT_ID`
- `AUTH_COGNITO_USERNAME`
- `AUTH_COGNITO_PASSWORD`
- `AUTH_COGNITO_USER_POOL_ID`
- `AUTH_COGNITO_REGION`
### 3. Get API URL
After deployment, CDK outputs the API Gateway URL:
```bash
# Output example:
# OpenApiMcpStack.ApiUrl = https://abc123.execute-api.us-east-1.amazonaws.com/
```
## Testing
Test the deployed Lambda function:
```bash
curl -X POST https://<api-url>/message \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "method": "tools/list", "id": 1}'
```
## Performance Considerations
- **Cold Start**: ~1-2 seconds (initializes MCP server + loads OpenAPI spec)
- **Warm Start**: ~100-300ms (reuses server instance)
- **Timeout**: 30 seconds (configurable in stack)
- **Memory**: 512 MB (configurable in stack)
## Cost Optimization
- Requests: Pay per invocation
- Memory/Duration: 512 MB x execution time
- API Gateway: HTTP API (cheaper than REST API)
## Development
Run MCP server locally:
```bash
uv run awslabs.openapi-mcp-server \
--api-name MyAPI \
--api-url https://api.example.com \
--spec-url https://api.example.com/openapi.json
```
## Cleanup
```bash
cd cdk
cdk destroy
```
## License
This project includes code from [awslabs/mcp](https://github.com/awslabs/mcp) licensed under Apache-2.0.
See [LICENSE](LICENSE) and [NOTICE](NOTICE) files.