| name | typescript-mcp-server-generator |
|---|---|
| description | Generate a complete MCP server project in TypeScript using the MCP TypeScript SDK v2 (@modelcontextprotocol/server) with tools, resources, and proper configuration |
Create a complete Model Context Protocol (MCP) server in TypeScript using the MCP TypeScript SDK v2 with the following specifications:
- Project Structure: Create a new TypeScript/Node.js project with proper directory structure
- NPM Packages: The v1 monolithic
@modelcontextprotocol/sdkpackage is retired. Use the focused v2 packages:@modelcontextprotocol/server— server implementation (stdio transport via the@modelcontextprotocol/server/stdiosubpath)@modelcontextprotocol/node— Node HTTP transport (NodeStreamableHTTPServerTransport), or a framework adapter:@modelcontextprotocol/express,@modelcontextprotocol/hono,@modelcontextprotocol/fastify— each adapter requires its peer framework to be installed alongside it (e.g.@modelcontextprotocol/express+express)@modelcontextprotocol/core— shared protocol schemas (import*Schemaconstants from here, not fromsdk/types.js)zod@^4.2— v2 requires Zod 4.2+; do not use zod@3
- Runtime: Node.js 20+ (v2 minimum); ESM-first with
"type": "module"(a CommonJS build is also shipped, sorequire()works if needed) - Server Type: Choose between HTTP (Streamable HTTP transport) or stdio-based server. SSE and WebSocket transports were removed in v2 — do not generate them.
- Tools: Create at least one useful tool with proper schema validation
- Error Handling: Include comprehensive error handling and validation
- Initialize with
npm initand create package.json - Install dependencies:
@modelcontextprotocol/server,zod@^4.2, and the transport package —@modelcontextprotocol/nodefor plain Node HTTP, or a framework adapter together with its peer framework (e.g.npm install @modelcontextprotocol/express express) - Configure TypeScript with ES modules:
"type": "module"in package.json - Add dev dependencies:
tsxorts-nodefor development - Create proper .gitignore file
- Use
McpServerclass from@modelcontextprotocol/serverfor high-level implementation - Set server name and version
- Choose the appropriate transport:
- HTTP (Node):
NodeStreamableHTTPServerTransportfrom@modelcontextprotocol/node - HTTP (Web Standard runtimes):
WebStandardStreamableHTTPServerTransportfrom@modelcontextprotocol/server - stdio:
StdioServerTransportfrom@modelcontextprotocol/server/stdio
- HTTP (Node):
- For HTTP: prefer a framework adapter (
@modelcontextprotocol/express, etc.) with proper middleware and error handling - Note that v2 uses Web Standard
Headers/Requesttypes; read headers withctx.http?.req?.headers.get('x-custom')
- Use
registerTool()with a config object — v1 variadic.tool()signatures are gone:server.registerTool('greet', { description: 'Greet user', inputSchema: z.object({ name: z.string() }) }, async ({ name }, ctx) => { return { content: [{ type: 'text', text: `Hello, ${name}!` }] }; });
- Schemas must be full Zod objects (
z.object({...})) — raw shape objects ({ name: z.string() }) are deprecated - Provide clear
titleanddescriptionfields - Return both
contentandstructuredContentin results - The handler's second parameter is a structured
ctxobject (replaces v1extra):ctx.mcpReq.signal,ctx.mcpReq.id,ctx.mcpReq.send(...),ctx.mcpReq.notify(...) - Implement proper error handling with try-catch blocks; use the v2 error hierarchy (
ProtocolError,SdkError,SdkHttpErrorwith.status) instead of v1McpError/StreamableHTTPError - Support async operations where appropriate
- Add resources using
registerResource()with ResourceTemplate for dynamic URIs - Add prompts using
registerPrompt()with argument schemas (same config-object style asregisterTool()) - Consider adding completion support for better UX; note the v2
completable()wrapper order:completable(z.string(), callback).optional()(optional applied outside)
- Use TypeScript for type safety
- Follow async/await patterns consistently
- Implement proper cleanup on transport close events
- Use environment variables for configuration
- Add inline comments for complex logic
- Structure code with clear separation of concerns
- Data processing and transformation
- External API integrations
- File system operations (read, search, analyze)
- Database queries
- Text analysis or summarization (LLM-assisted via the multi-round
input_requiredpattern) - System information retrieval
-
For HTTP Servers:
- Port configuration via environment variables
- CORS setup for browser clients
- Session management (stateless vs stateful)
- DNS rebinding protection for local servers
- Strict
Content-Typehandling: v2 rejects non-application/jsonPOST bodies
-
For stdio Servers:
- Proper stdin/stdout handling
- Environment-based configuration
- Process lifecycle management
- Run the official codemod first:
npx @modelcontextprotocol/codemod@latest v1-to-v2 . - Then search for
@mcp-codemod-errormarkers for the parts requiring manual judgment (transport choice, header reads, error classification) - Swap
McpError + ErrorCodechecks for the new error classes; HTTP status now lives onerror.status, noterror.code Server.createMessage(),listRoots(),sendLoggingMessage()and theroots/sampling/loggingcapability fields are deprecated in v2 — avoid them in new code
- Explain how to run the server (
npm startornpx tsx server.ts) - Provide MCP Inspector command:
npx @modelcontextprotocol/inspector - For HTTP servers, include connection URL:
http://localhost:PORT/mcp - Include example tool invocations
- Add troubleshooting tips for common issues
- LLM-powered tools using the multi-round
input_requiredpattern (the v2 replacement for the deprecated sampling subsystem) - User input elicitation for interactive workflows
- Dynamic tool registration with enable/disable capabilities
- Notification debouncing for bulk updates
- Resource links for efficient data references
Generate a complete, production-ready MCP server with comprehensive documentation, type safety, and error handling.