Skip to main content
Glama
ingeno

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.