Skip to main content
Glama

Serverless MCP

by hteek

Serverless MCP

A serverless implementation of the Model Context Protocol (MCP) using AWS Lambda, CloudFront, and Cognito authentication. This project provides a complete infrastructure for hosting MCP servers in the cloud with OAuth 2.0 authentication, real-time streaming via Server-Sent Events with JSON-RPC 2.0 messaging format, and scalable serverless architecture. The implementation includes RFC-compliant OAuth 2.0 support with OAuth 2.0 Authorization Server Metadata (RFC 8414), OAuth 2.0 Dynamic Client Registration Protocol (RFC 7591), and OAuth 2.0 Protected Resource Metadata (RFC 9728). Features a custom transport implementation compatible with the official Model Context Protocol TypeScript SDK.

Features

  • MCP Protocol Implementation: Full support for Model Context Protocol with tools and resources

  • Serverless Architecture: AWS Lambda functions with CloudFront distribution

  • OAuth 2.0 Authentication: Secure authentication using AWS Cognito

  • Real-time Streaming: Server-Sent Events (SSE) support for live communication

  • Session Management: Stateful and stateless session handling

  • Custom Domain: SSL certificates and Route 53 DNS configuration

  • GitHub Actions Deployment: OIDC-based CI/CD pipeline

Related MCP server: AWS CodePipeline MCP Server

Architecture

The project consists of two main CDK stacks:

  1. ServerlessMcpStack: Core infrastructure including Lambda functions, CloudFront distribution, Cognito user pool, and DynamoDB table

  2. GitHubOidcStack: GitHub Actions OIDC provider for secure deployments

serverless-mcp architecture

Prerequisites

  • Node.js 22

  • pnpm >= 10.12

  • AWS CLI configured with appropriate permissions

  • A registered domain name with Route 53 hosted zone

Installation

  1. Clone the repository:

git clone https://github.com/hteek/serverless-mcp.git cd serverless-mcp
  1. Install dependencies:

pnpm install
  1. Configure your domain settings in config/default.ts:

export default { domainName: 'your-domain.com', github: { owner: 'your-github-username', repo: 'your-repo-name', }, hostedZoneId: 'YOUR_ROUTE53_HOSTED_ZONE_ID', project: 'your-project-name', };

Development

Build and Test

# Build the project pnpm build # Watch for changes during development pnpm watch # Run tests pnpm test # Run tests in watch mode pnpm test:watch # Run tests with UI pnpm test:ui

Code Quality

# Lint code pnpm lint # Fix linting issues pnpm lint:fix # Format code pnpm format # Check formatting pnpm format:check

Deployment

Prerequisites

  1. Ensure your AWS credentials are configured

  2. Verify your domain is registered and the hosted zone ID is correct

  3. Build the project: pnpm build

Manual Deployment

# Deploy both stacks pnpm cdk deploy --all # Deploy specific stack pnpm cdk deploy serverless-mcp pnpm cdk deploy serverless-mcp-github-oidc # Preview changes pnpm cdk diff # Generate CloudFormation templates pnpm cdk synth

GitHub Actions Deployment

This project includes three GitHub Actions workflows for automated deployment:

1. Continuous Integration and Deployment (ci.yml)

Trigger: Pushes to main branch and pull requests

Jobs:

  • CI Pipeline: Runs build, lint, and tests on all pushes and PRs

  • Automated Deployment: Deploys to AWS when changes are pushed to main

Environment: Uses development environment with AWS_ACCOUNT variable

2. Manual Deployment (manual-deploy.yml)

Trigger: Manual workflow dispatch via GitHub UI

Usage: For ad-hoc deployments without code changes

3. Reusable Deploy Workflow (deploy.yml)

Purpose: Shared deployment logic used by other workflows

Features:

  • OIDC authentication with AWS

  • Installs dependencies and builds project

  • Deploys using CDK with no approval required

Initial Setup

  1. Deploy GitHub OIDC Stack (one-time setup):

pnpm cdk deploy serverless-mcp-github-oidc
  1. Configure GitHub Environment:

    • Go to your GitHub repository → Settings → Environments

    • Create a development environment

    • Add environment variable: AWS_ACCOUNT with your AWS account ID

  2. Verify Deployment:

    • The GitHub OIDC stack creates an IAM role: github-actions-role

    • This role has the necessary permissions for CDK deployment

    • No long-lived AWS credentials needed in GitHub secrets

Deployment Process

Automatic Deployment:

  1. Push changes to main branch

  2. CI workflow runs: build → lint → test → deploy

  3. Deployment uses OIDC to assume AWS role

  4. CDK deploys the serverless-mcp stack

Manual Deployment:

  1. Go to Actions tab in GitHub repository

  2. Select "manual deploy" workflow

  3. Click "Run workflow" on main branch

Monitoring Deployments

  • GitHub Actions: View workflow runs in the Actions tab

  • AWS CloudFormation: Check stack status in AWS console

  • CloudWatch: Monitor Lambda function logs and metrics

Usage

MCP Server Endpoints

Once deployed, your MCP server will be available at:

  • Main endpoint: https://your-domain.com/mcp

  • Authentication: https://auth.your-domain.com

Available MCP Tools

The server implements the following AWS Cost Explorer tools:

  • get_today_date: Get the current date to help with relative date queries

    { "name": "get_today_date" }
  • get_dimension_values: Get available values for AWS Cost Explorer dimensions (SERVICE, REGION, etc.)

    { "name": "get_dimension_values", "arguments": { "dimensionKey": "SERVICE", "startDate": "2024-01-01", "endDate": "2024-01-31" } }
  • get_tag_values: Get available values for a specific tag key

    { "name": "get_tag_values", "arguments": { "tagKey": "Environment", "startDate": "2024-01-01", "endDate": "2024-01-31" } }
  • get_cost_and_usage: Retrieve AWS cost and usage data with filtering and grouping

    { "name": "get_cost_and_usage", "arguments": { "startDate": "2024-01-01", "endDate": "2024-01-31", "granularity": "MONTHLY", "groupBy": [{"Type": "DIMENSION", "Key": "SERVICE"}] } }
  • get_cost_forecast: Generate cost forecasts based on historical usage patterns

    { "name": "get_cost_forecast", "arguments": { "startDate": "2024-02-01", "endDate": "2024-02-29", "metric": "UNBLENDED_COST" } }
  • get_cost_and_usage_comparisons: Compare costs between two time periods

    { "name": "get_cost_and_usage_comparisons", "arguments": { "baseStartDate": "2024-01-01", "baseEndDate": "2024-01-31", "comparisonStartDate": "2024-02-01", "comparisonEndDate": "2024-02-29" } }
  • get_cost_comparison_drivers: Analyze what drove cost changes between periods

    { "name": "get_cost_comparison_drivers", "arguments": { "baseStartDate": "2024-01-01", "baseEndDate": "2024-01-31", "comparisonStartDate": "2024-02-01", "comparisonEndDate": "2024-02-29" } }

Available MCP Resources

  • greeting: Dynamic greeting resource

    • Template: greeting://[name]

    • Example: greeting://world returns "Hello, world!"

Client Connection

Connect to your MCP server using any MCP-compatible client:

import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { StreamableHTTPTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'; const transport = new StreamableHTTPTransport('https://your-domain.com/mcp'); const client = new Client( { name: 'my-client', version: '1.0.0' }, { capabilities: {} } ); await client.connect(transport);

Configuration

Environment-Specific Settings

Create environment-specific configuration files in the config/ directory:

  • config/development.ts

  • config/production.ts

  • config/staging.ts

CDK Context

Modify cdk.json to adjust CDK feature flags and behavior.

Monitoring and Debugging

  • CloudWatch Logs: Lambda function logs are automatically sent to CloudWatch

  • AWS X-Ray: Distributed tracing is enabled for performance monitoring

  • Metrics: Custom metrics are collected using AWS Lambda Powertools

Security

  • Authentication: OAuth 2.0 with AWS Cognito

  • HTTPS: All traffic encrypted with SSL/TLS

  • IAM: Least privilege access policies

  • Session Management: Secure session handling with validation

Contributing

  1. Fork the repository

  2. Create a feature branch: git checkout -b feature/new-feature

  3. Make your changes and add tests

  4. Run linting and tests: pnpm lint && pnpm test

  5. Commit your changes: git commit

  6. Push and create a pull request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

For issues and questions:

  1. Check the documentation for development guidance

  2. Open an issue on GitHub

  3. Review CloudWatch logs for debugging information

Useful Commands

  • pnpm build - Compile TypeScript to JavaScript

  • pnpm watch - Watch for changes and compile

  • pnpm test - Run Vitest unit tests

  • pnpm cdk deploy - Deploy infrastructure to AWS

  • pnpm cdk diff - Compare deployed stack with current state

  • pnpm cdk synth - Generate CloudFormation templates

  • pnpm cdk destroy - Remove all AWS resources

-
security - not tested
F
license - not found
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hteek/serverless-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server