Skip to main content
Glama

HelloWorld MCP Server

by gemyago
start.ts3.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();

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/gemyago/typescript-mcp-boilerplate'

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