项目简介

'tmcp' 是一个用于构建Model Context Protocol (MCP) 服务器的轻量级框架。它提供标准化的接口,让LLM客户端能够访问和管理资源、调用工具以及渲染Prompt模板。'tmcp' 的设计理念是Schema无关,这意味着你可以通过适配器集成各种主流的Schema验证库(如Zod、Valibot等),以实现类型安全的输入和输出验证。它支持多种传输协议,包括STDIO、HTTP和SSE,以适应不同类型的应用场景。

主要功能点

  • 上下文管理:托管和管理各种数据资源,LLM可以根据URI访问这些资源。
  • 工具调用:注册外部功能作为工具,LLM可以调用这些工具执行特定任务。
  • Prompt模板:定义可定制的Prompt模板,用于生成LLM交互内容。
  • Schema无关:通过可插拔的适配器支持多种流行的Schema验证库,实现类型安全和数据验证。
  • 多传输协议:原生支持STDIO (命令行/桌面应用)、HTTP (Web客户端) 和SSE (Web实时通信) 等传输方式。
  • 会话管理:处理多个客户端会话,管理各自的状态和能力。
  • 能力声明:服务器向客户端声明其支持的MCP功能。

安装步骤

  1. 初始化项目: 首先,确保你的环境中安装了Node.js和npm/pnpm/bun。在你的项目目录下,运行以下命令安装 'tmcp' 核心库和选择的Schema适配器:
    pnpm install tmcp
    # 例如,如果你选择使用Zod作为Schema验证库:
    pnpm install @tmcp/adapter-zod zod
    # 或者如果你选择使用Valibot:
    pnpm install @tmcp/adapter-valibot valibot
    # 根据你的需求,安装相应的传输层:
    pnpm install @tmcp/transport-stdio  # 适用于命令行或桌面应用
    pnpm install @tmcp/transport-http   # 适用于Web客户端,需要HTTP服务器
    pnpm install @tmcp/transport-sse    # 适用于Web客户端,使用Server-Sent Events
  2. 创建服务器文件: 在你项目中的一个文件(例如 'src/server.js')中编写你的MCP服务器逻辑。

服务器配置 (MCP客户端使用)

MCP客户端(通常是LLM应用或开发者工具)需要通过JSON格式的配置来启动和连接到'tmcp'服务器。以下是针对不同传输协议的示例配置信息,用户需要将这些信息传递给其MCP客户端:

  • STDIO传输 (命令行/桌面应用) 此配置用于客户端通过标准输入/输出与MCP服务器通信。

    {
      "name": "my-mcp-server",
      "command": "node",
      "args": ["src/server.js"],
      "capabilities": {
        "tools": { "listChanged": true },
        "prompts": { "listChanged": true },
        "resources": { "listChanged": true, "subscribe": true }
      }
    }
    • 'name': 服务器的唯一名称。
    • 'command': 启动MCP服务器进程的命令,例如 'node'、'deno run'、'bun run'。
    • 'args': 传递给 'command' 的参数,通常是服务器主文件的路径。
    • 'capabilities': 客户端期望服务器提供的功能,例如工具、Prompt、资源列表变更通知和资源订阅。
  • HTTP传输 (Web客户端) 此配置用于客户端通过HTTP协议与MCP服务器通信。服务器需要通过HTTP服务器(如Express, Koa, Bun.serve等)托管。

    {
      "name": "my-http-mcp-server",
      "url": "http://localhost:3000/mcp",
      "capabilities": {
        "tools": { "listChanged": true },
        "prompts": { "listChanged": true },
        "resources": { "listChanged": true, "subscribe": true }
      }
    }
    • 'name': 服务器的唯一名称。
    • 'url': MCP服务器的HTTP端点URL。
    • 'capabilities': 同上。
  • SSE (Server-Sent Events) 传输 (Web客户端) 此配置用于客户端通过SSE协议与MCP服务器通信,通常用于Web客户端获取实时通知。服务器同样需要通过HTTP服务器托管。

    {
      "name": "my-sse-mcp-server",
      "url": "http://localhost:3000/sse",
      "endpoint": "http://localhost:3000/message",
      "capabilities": {
        "tools": { "listChanged": true },
        "prompts": { "listChanged": true },
        "resources": { "listChanged": true, "subscribe": true }
      }
    }
    • 'name': 服务器的唯一名称。
    • 'url': MCP服务器的SSE连接端点URL。
    • 'endpoint': 用于发送MCP请求的HTTP POST端点URL。
    • 'capabilities': 同上。

基本使用方法

以下是一个使用Zod和STDIO传输的基本服务器示例:

  1. 编写服务器代码 ('src/server.js'):

    import { McpServer } from 'tmcp';
    import { ZodJsonSchemaAdapter } from '@tmcp/adapter-zod';
    import { StdioTransport } from '@tmcp/transport-stdio';
    import { z } from 'zod';
    
    // 1. 初始化Schema适配器
    const adapter = new ZodJsonSchemaAdapter();
    
    // 2. 创建MCP服务器实例
    const server = new McpServer(
    	{
    		name: 'my-simple-mcp-server',
    		version: '1.0.0',
    		description: '一个简单的MCP服务器示例',
    	},
    	{
    		adapter,
    		capabilities: {
    			tools: { listChanged: true },
    			prompts: { listChanged: true },
    			resources: { listChanged: true },
    		},
    	},
    );
    
    // 3. 定义并注册一个工具
    server.tool(
    	{
    		name: 'calculate_sum',
    		description: '计算两个数字的和',
    		schema: z.object({
    			a: z.number().describe('第一个数字'),
    			b: z.number().describe('第二个数字'),
    		}),
    	},
    	async ({ a, b }) => {
    		return {
    			content: [
    				{
    					type: 'text',
    					text: '两个数字的和是: ${a + b}',
    				},
    			],
    		};
    	},
    );
    
    // 4. 定义并注册一个Prompt模板
    server.prompt(
    	{
    		name: 'greeting_prompt',
    		description: '生成问候语',
    		schema: z.object({
    			name: z.string().describe('要问候的名字'),
    		}),
    	},
    	async ({ name }) => {
    		return {
    			messages: [
    				{
    					role: 'user',
    					content: {
    						type: 'text',
    						text: '请生成一个对 ${name} 的友好问候语。',
    					},
    				},
    			],
    		};
    	},
    );
    
    // 5. 启动STDIO传输
    const transport = new StdioTransport(server);
    transport.listen();
    
    console.log('MCP服务器已启动,等待客户端连接...');
  2. 运行服务器: 在你的项目根目录运行:

    node src/server.js

    服务器将在标准输入/输出上等待MCP客户端的连接。

信息

分类

AI与计算