mcp-codegen
v0.0.6-beta
Published
The official MCP TypeScript SDK requires modeling MCP Tool Schema using a type-system called [Zod](https://zod.dev/). `mcp-codegen` allows you to leverage plain-old-TypeScript-objects.
Readme
mcp-codegen
The official MCP TypeScript SDK requires modeling MCP Tool Schema using a type-system called Zod. mcp-codegen allows you to leverage plain-old-TypeScript-objects.
Installation
npm install mcp-codegenBuild
This package is built using esbuild to transpile TypeScript to ES2015 (ES6) for broad compatibility. The build process generates both JavaScript and TypeScript declaration files.
npm run build:allExports
The package exports the following components:
McpRequired()- Decorator for required fieldsMcpOptional()- Decorator for optional fieldsFormat(format: string)- Decorator for field format specificationSchemaBuilder- Function to generate Zod schema from decorated classesPrimitives- TypeScript type for primitive valuesZOD_METADATA,ZOD_PROPS- Internal constants
Dependencies
- TypeScript experimental decorators (legacy only, TC39 coming soon)
- Reflect and reflect-metadata
- Zod to JSON Schema (Zod4 coming soon)
Getting Started
Decorate TypeScript Class
Build MCP Tool schema using TypeScript classes and decorators.
import { McpRequired, McpOptional, Format } from "mcp-codegen";
export class ToolCallInput {
im_just_a_prop: string;
@McpRequired()
query: string;
@McpRequired()
async: boolean;
@McpOptional()
max?: number;
@Format('bigint')
@McpOptional()
variance?: number;
@McpOptional()
queryId?: string;
@Format('date-time')
@McpOptional()
createdAt?: string;
}Generate Zod object and JSON Schema
import { ToolCallInput } from "decorated-typescript-class";
import { SchemaBuilder } from "mcp-codegen";
import zodToJsonSchema from "zod-to-json-schema";
const zodObject = SchemaBuilder(ToolCallInput);
const jsonSchema = zodToJsonSchema(z.object(zodObject));Generated JSON Schema
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"async": {
"type": "boolean"
},
"max": {
"type": "number"
},
"variance": {
"type": "integer",
"format": "int64"
},
"queryId": {
"type": "string"
},
"createdAt": {
"type": "string",
"format": "date-time"
}
},
"required": [
"query",
"async"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Consume in MCP Tool Handler
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
new McpServer().registerTool(
"example-tool",
{
title: "Example Tool",
inputSchema: toolSchema // Output of SchemaBuilder
},
(args: ToolCallInput): Promise<CallToolResult> => {
return Promise.resolve({
content: [
{
type: "text",
text: `Results for query: ${args.query}` // Required type
},
{
type: "text",
text: `Results requested: ${args.max || 100}` // Optional type
}
]
});
}
)