TypeScript函数转MCP服务器工具

将纯TypeScript函数转换为MCP服务器的开发工具,适用于需要快速构建MCP服务的开发者。

  • by kolodny
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 kolodny/mcp-compiler

使用说明

mcp编译器

将纯TypeScript函数转换为MCP服务器。

安装

npm install mcp-compiler

用法

// tools.ts

/** add number */
export const add = async (num1: number, num2?: number) => num1 + (num2 ?? 0);

/** say hi to user */
export const sayHi = (name: string) => `Hi, ${name}`;

export const makeUser = (user: {
  /** Name of user */ name: string;
  /** Age of user */ age?: number;
}) => user;
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import * as z from 'zod/v4';

import { compile, generateSchemas } from 'mcp-compiler';
import * as tools from './tools';

const pathToTools = `${__dirname}/tools.ts`;
const schemas = generateSchemas(pathToTools); // OK for dev, pre-build and load from file for release.
const compiled = compile({ tools, schemas, z });

const server = new McpServer(
  { name: 'My-Server', version: '1.0.0' },
  { capabilities: { tools: {} } }
);

for (const { name, description } of compiled.tools) {
  const zodSchemas = compiled.makeZodSchemas(name);
  const fn = compiled.callTool.bind(null, name);
  server.registerTool(name, { ...zodSchemas, description }, fn);
}

async function runServer() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error(`MCP Server running on stdio`);
}

runServer().catch((error) => {
  console.error(`Fatal error running server:`, error);
  process.exit(1);
});
Use with low level Server class for advanced use cases
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
} from '@modelcontextprotocol/sdk/types.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

import { compile, generateSchemas } from 'mcp-compiler';
import * as tools from './tools';

const pathToTools = `${__dirname}/tools.ts`;
const schemas = generateSchemas(pathToTools); // OK for dev, pre-build and load from file for release.
const compiled = compile({ tools, schemas });

const server = new Server(
  { name: 'My-Server', version: '1.0.0' },
  { capabilities: { tools: {} } }
);
server.setRequestHandler(ListToolsRequestSchema, compiled.ListToolsHandler);
server.setRequestHandler(CallToolRequestSchema, compiled.CallToolHandler);

async function runServer() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error(`MCP Server running on stdio`);
}

runServer().catch((error) => {
  console.error(`Fatal error running server:`, error);
  process.exit(1);
});