start.ts•3.08 kB
#!/usr/bin/env tsx
import { Command } from 'commander';
import express from 'express';
import cors from 'cors';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
import { createMCPServer } from '../src/index.js';
const program = new Command();
// Logger function to avoid linter errors with console statements
const log = (message: string) => {
process.stderr.write(`${message}\n`);
};
program
.name('typescript-mcp-boilerplate')
.description('TypeScript MCP Boilerplate CLI')
.version('1.0.0');
program
.command('stdio')
.description('Start the MCP server with stdio transport')
.action(async () => {
try {
const server = createMCPServer();
const transport = new StdioServerTransport();
await server.connect(transport);
log('TypeScript MCP Boilerplate server running on stdio');
} catch (error) {
log(`Server error: ${error}`);
process.exit(1);
}
});
program
.command('http')
.description('Start the MCP server with HTTP transport')
.option('-p, --port <port>', 'Port to listen on', '3000')
.action(async (options) => {
try {
const port = parseInt(options.port, 10);
if (isNaN(port) || port < 1 || port > 65535) {
throw new Error(`Invalid port: ${options.port}`);
}
const server = createMCPServer();
const transport = new StreamableHTTPServerTransport({
sessionIdGenerator: () => crypto.randomUUID(),
});
await server.connect(transport);
const app = express();
// Middleware
app.use(
cors({
origin: '*',
methods: ['GET', 'POST', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization', 'Mcp-Session-Id'],
}),
);
app.use(express.json());
// Handle all MCP requests
app.use('/', async (req, res) => {
try {
log(`Received request: ${JSON.stringify(req.body)}`);
await transport.handleRequest(req, res, req.body);
} catch (error) {
log(`Request handling error: ${error}`);
if (!res.headersSent) {
res.status(500).json({ error: 'Internal server error' });
}
}
});
const httpServer = app.listen(port, () => {
log(`TypeScript MCP Boilerplate server running on HTTP port ${port}`);
log(`Connect to: http://localhost:${port}`);
});
// Graceful shutdown
const shutdown = () => {
log('Shutting down HTTP server...');
httpServer.close(() => {
process.exit(0);
});
setTimeout(() => {
log('Forcibly closing all connections');
httpServer.closeAllConnections();
process.exit(0);
}, 10 * 1000).unref();
};
process.on('SIGINT', shutdown);
process.on('SIGTERM', shutdown);
} catch (error) {
log(`Server error: ${error}`);
process.exit(1);
}
});
program.parse();