Skip to main content

@ttoss/http-server-mcp

Model Context Protocol (MCP) server integration for @ttoss/http-server.

Installation

pnpm add @ttoss/http-server-mcp

Quick Start

import { App, bodyParser, cors } from '@ttoss/http-server';
import {
createMcpRouter,
Server as McpServer,
z,
} from '@ttoss/http-server-mcp';

// Create MCP server
const mcpServer = new McpServer({
name: 'my-mcp-server',
version: '1.0.0',
});

// Register tools
mcpServer.registerTool(
'get-weather',
{
description: 'Get weather information for a location',
inputSchema: {
location: z.string().describe('City name'),
},
},
async ({ location }) => ({
content: [
{
type: 'text',
text: `Weather in ${location}: Sunny, 72°F`,
},
],
})
);

// Create HTTP server
const app = new App();
app.use(cors());
app.use(bodyParser());

// Mount MCP router
const mcpRouter = createMcpRouter(mcpServer);
app.use(mcpRouter.routes());

app.listen(3000, () => {
console.log('MCP server running on http://localhost:3000/mcp');
});

API Reference

createMcpRouter(server, options?)

Creates a Koa router configured to handle MCP protocol requests.

Parameters:

  • server (McpServer) - MCP server instance with registered tools and resources
  • options (McpRouterOptions) - Optional configuration
    • path (string) - HTTP path for MCP endpoint (default: '/mcp')
    • sessionIdGenerator (() => string) - Session ID generator for stateful servers (default: undefined for stateless)

Returns: Router - Koa router instance

Examples

Basic Tool

import { Server as McpServer, z } from '@ttoss/http-server-mcp';

const server = new McpServer({
name: 'calculator',
version: '1.0.0',
});

server.registerTool(
'add',
{
description: 'Add two numbers',
inputSchema: {
a: z.number().describe('First number'),
b: z.number().describe('Second number'),
},
},
async ({ a, b }) => ({
content: [
{
type: 'text',
text: `${a} + ${b} = ${a + b}`,
},
],
})
);

Multiple Tools

server.registerTool(
'multiply',
{
description: 'Multiply two numbers',
inputSchema: {
a: z.number(),
b: z.number(),
},
},
async ({ a, b }) => ({
content: [{ type: 'text', text: String(a * b) }],
})
);

server.registerTool(
'divide',
{
description: 'Divide two numbers',
inputSchema: {
a: z.number(),
b: z.number(),
},
},
async ({ a, b }) => {
if (b === 0) {
throw new Error('Division by zero');
}
return {
content: [{ type: 'text', text: String(a / b) }],
};
}
);

Custom Path

const router = createMcpRouter(server, {
path: '/api/mcp',
});

Resources

server.resource(
'config://app',
'Application configuration',
'application/json',
async () => ({
contents: [
{
uri: 'config://app',
mimeType: 'application/json',
text: JSON.stringify({ version: '1.0.0', env: 'production' }),
},
],
})
);

With CORS and Multiple Endpoints

import { App, bodyParser, cors, Router } from '@ttoss/http-server';
import { createMcpRouter } from '@ttoss/http-server-mcp';

const app = new App();
app.use(cors());
app.use(bodyParser());

// Health check endpoint
const healthRouter = new Router();
healthRouter.get('/health', (ctx) => {
ctx.body = { status: 'ok' };
});

// MCP endpoint
const mcpRouter = createMcpRouter(mcpServer);

app.use(healthRouter.routes());
app.use(mcpRouter.routes());

app.listen(3000);

Protocol Details

This package implements the Model Context Protocol over HTTP using JSON responses (no SSE streaming). It uses the StreamableHTTPServerTransport from the MCP SDK with enableJsonResponse: true and adapts Koa's context-based middleware to work with the MCP SDK's Node.js request/response expectations.

Supported HTTP methods:

  • POST /mcp - Send JSON-RPC requests/notifications
  • DELETE /mcp - Terminate session (optional)

Resources