子宫肌瘤有什么症状| 左舌根疼痛是什么情况| 胡椒粉是什么做的| 同型半胱氨酸高吃什么药| 眼睛干涩疲劳用什么眼药水| 脊椎炎有什么症状| 马卡龙为什么这么贵| 36d什么意思| 打喷嚏漏尿是什么原因| mi医学上是什么意思| 无故流鼻血是什么原因| px什么意思| 后羿是一个什么样的人| 舌尖痛什么原因| 1978年属马五行属什么| 出水痘不能吃什么食物| 什么钙片补钙效果最好| ga什么意思| 吃什么能增强免疫力和抵抗力| 怀男孩和女孩有什么区别| 什么人容易得多囊卵巢| 工作机制是什么意思| 为什么拔牙后不能吐口水| 一个齿一个禹念什么| 高血压应该吃什么| 什么药清肺化痰好| 肾绞痛可能由于什么原因引起| 缠腰蛇是什么原因引起的| 病理报告是什么意思| 桑螵蛸是什么| 自言自语的近义词是什么| 白醋和陈醋有什么区别| 什么是直流电| 骸骨是什么意思| 佩戴貔貅有什么讲究与禁忌| 什么心什么心| 结婚60年是什么婚| 河北有什么特产| 月经量特别少是什么原因| 一什么清香| 梦见摘西红柿是什么意思| 阑尾炎痛起来什么感觉| 梦见好多羊是什么意思| 后背有痣代表什么| 鳊鱼是什么鱼| 鸡胗炒什么菜好吃| 可可是什么饮料| 什么减肥药好使| 窦性心律吃什么药| 腺肌症吃什么药效果好| 尿等待是什么原因| 吃香蕉有什么好处| 邹去掉耳朵旁读什么| 卖什么小吃简单挣钱| 98年是什么命| 哈尼什么意思| 手癣用什么药膏效果好| 稽留热常见于什么病| 北京市副市长是什么级别| 什么是重生| 7月7日什么星座| 人瘦肚子大是什么原因| 吃石斛有什么功效| 水满则溢月盈则亏是什么意思| 伤口溃烂不愈合用什么药| 什么属相不能挂山水画| ttl什么意思| 舌头痛吃什么药好得快| 缺钙吃什么补钙最快| 过敏性鼻炎用什么药效果好| 卵巢囊肿是什么引起的| 小孩拉肚子吃什么食物| 我需要什么| 阴阳调和是什么意思| 胃出血大便是什么颜色| 迎合是什么意思| rainbow什么意思| 软骨瘤是什么病| 碗打碎了预示着什么| 佟丽娅为什么离婚| 肺结节手术后吃什么好| 女人心肌缺血吃什么药| 赊事勿取是什么意思| 血糖高是什么原因引起| 窦性心律过速是什么意思| 举的部首是什么| 梦见狗死了是什么预兆| 天鹅吃什么| vmax什么意思| 嗓子疼吃什么消炎药| 脾胃阴虚吃什么中成药| 细菌性阴道炎吃什么药| 阳虚火旺吃什么中成药| 太阳线是什么意思| 惊弓之鸟什么意思| 震颤是什么意思| 玫瑰花茶和什么搭配好| 脑梗不能吃什么东西| 什么是性高潮| 白眼球发黄是什么原因| 波字五行属什么| 老公梦见老婆出轨是什么意思| 甲状腺吃什么盐| 两极分化是什么意思| 介怀是什么意思| 秋天有什么植物| 红色的补色是什么颜色| 什么是超话| 唾液酸偏低意味什么| 送向日葵代表什么意思| 什么什么的大树| 茜读什么| 胆碱是什么| 石足念什么| 3月6号是什么星座的| 梦见小猫崽是什么意思| 泌尿系感染吃什么药| 血糖高可以吃什么| 纤维素纤维是什么面料| 尿潴留是什么原因引起的| 丰富是什么意思| 麦麸是什么| 凉栀是什么意思| 婴儿足底采血查什么| 体育生能报什么专业| 吃瓜群众是什么意思| 密度是什么| 新股配号数量是什么意思| 叶酸对人体有什么好处| 呼吸不过来要喘大气是什么情况| 心包积液是什么意思| 燃眉之急是什么意思| 金瓜是什么瓜| 落选是什么意思| 多囊卵巢是什么原因造成的| 妇科炎症小腹坠痛吃什么药| 福五行属性是什么| 腰疼吃什么药最有效| 左下眼皮跳是什么原因| 有情人终成眷属是什么意思| 里正相当于现在什么官| 大脑精神紊乱什么病| 杏仁有什么功效| 檀是什么意思| 发烧挂什么科| 无花果有什么功效| 古着店是什么意思| 什么蔬菜含维生素d| 私生饭什么意思| 大姨妈量少是什么原因| 男人吃什么对性功能好| 贵州有什么山| ra医学上是什么意思| 神经衰弱吃什么| 负面情绪是什么意思| 不丹为什么不跟中国建交| 夫妻都是a型血孩子是什么血型| 孕晚期缺铁对胎儿有什么影响| 小学生什么时候放暑假| 十月二十三号是什么星座| 什么是神话故事| 中医四诊是什么| 预谋什么意思| 胚轴发育成什么| 什么是益生菌| 小鸡啄米什么意思| 服兵役是什么意思| 痛风不能吃什么| edp是什么意思| 生抽可以用什么代替| 马蜂窝治什么病最好| 什么开窍于耳| 三观是什么| 大荔冬枣什么时候成熟| 生肖羊生什么生肖最好| 属龙的今年要注意什么| 雷峰塔为什么叫雷峰塔| 什么的小河| 私奔是什么意思| 加湿器有什么作用| 农历8月15是什么节日| 胃疼应该挂什么科| 刘胡兰是什么样的人| 返流性食管炎用什么药| 杜冷丁是什么药| 三十六计的第一计是什么| 车暴晒有什么影响| 麻木是什么意思| 上日下成念什么| 什么是香云纱| 房中术是什么意思| 凝血高是什么原因| it是什么意思| 小便尿道刺痛吃什么药| 嘴干是什么病的征兆| 情人的定义是什么| 一生无虞是什么意思| 肩周炎贴什么膏药效果最好| nos是什么单位| 真心话大冒险问什么| 耳鸣看什么科| 湿疹不能吃什么食物| 春是什么生肖| 性欲是什么| 为什么会长结石| 心理卫生科看什么病的| 老打嗝是什么原因引起的| 韬字五行属什么| 市级三好学生有什么用| 男人性功能太强是什么原因| 坐飞机要什么证件| cm2是什么单位| 橘子是什么季节的水果| 单元剧是什么意思| 肝脏检查挂什么科| 胃痛可以吃什么| 黄芪和北芪有什么区别| 勺子是什么意思| 颈椎退行性病变是什么意思| 气短挂什么科| 静脉曲张吃什么中成药| 8月12日是什么星座| 精力旺盛是什么意思| 小丑代表什么生肖| 舒字五行属什么的| 月经血量少是什么原因| 情不自禁的意思是什么| 安全期一般是什么时候| 背德是什么意思| 祁是什么意思| 家里停电打什么电话| 什么的春天| vca是什么牌子| 睡觉老是流口水是什么原因| 妊娠阴性是什么意思| 正月二十九是什么星座| 粉色代表什么| 愿力是什么意思| 锦五行属什么| 榴莲壳有什么用处| 强直是什么意思| hpv检查什么| 1月27号是什么星座| 福报是什么意思| IB是什么| 胸口出汗是什么原因| 1月29号什么星座| 一桌餐是什么意思| 倒数是什么| hb是什么| 护理学什么| 绵密是什么意思| 天上的星星为什么会发光| 右上眼皮跳是什么预兆| 月经提前10天正常吗是什么原因| 肌酐高不能吃什么| 善良是什么| 立本是什么意思| 为什么猫怕水| 结节是什么东西| 晚上睡觉口干是什么原因| 鸟儿为什么会飞| 柳树代表什么生肖| 老鼠尿是什么颜色的| 百度

内蒙古自治区政府门户网站

#『AI先锋杯·14天征文挑战第3期』#
百度 如今的微信月活跃用户数已经超过10亿,从年初微信公开课PRO上公布的数据来看,截至2018年1月15日,微信小程序日使用用户数也已经突破了亿。

零基础构建MCP服务器:TypeScript/Python双语言实战指南

🌟 Hello,我是摘星!

🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。

🦋 每一个优化都是我培育的花朵,每一个特性都是我放飞的蝴蝶。

🔬 每一次代码审查都是我的显微镜观察,每一次重构都是我的化学实验。

🎵 在编程的交响乐中,我既是指挥家也是演奏者。让我们一起,在技术的音乐厅里,奏响属于程序员的华美乐章。

目录

零基础构建MCP服务器:TypeScript/Python双语言实战指南

摘要

1. MCP协议基础概念

1.1 什么是MCP服务器

1.2 核心组件说明

2. 开发环境搭建与配置

2.1 TypeScript开发环境

2.1.1 基础环境准备

2.1.2 依赖包安装

2.1.3 TypeScript配置

2.2 Python开发环境

2.2.1 虚拟环境创建

2.2.2 依赖包安装

2.3 开发工具配置

3. MCP SDK核心API详解

3.1 服务器初始化

3.1.1 TypeScript实现

3.1.2 Python实现

3.2 核心API对比分析

4. 第一个Hello World服务器

4.1 项目结构设计

4.2 完整实现示例

4.2.1 TypeScript版本

4.2.2 Python版本

4.3 服务器启动脚本

5. 调试技巧与常见问题解决

5.1 调试工具配置

5.1.1 日志系统设置

5.1.2 MCP Inspector使用

5.2 常见问题解决方案

5.3 问题诊断清单

5.4 性能优化建议

6. 进阶功能实现

6.1 资源管理

6.2 提示模板系统

7. 测试与质量保证

7.1 单元测试框架

提示处理器

7.2 集成测试

总结

参考资源


?

摘要

作为一名深耕技术领域多年的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP作为Anthropic推出的开放标准,正在重新定义AI应用与外部系统的交互方式,它不仅解决了传统API集成的复杂性问题,更为开发者提供了一个统一、安全、高效的连接框架。在过去几个月的实践中,我发现许多开发者对MCP的概念理解透彻,但在实际动手构建MCP服务器时却遇到了各种技术壁垒。从环境配置的细节问题到SDK API的深度理解,从第一个Hello World程序的调试到生产环境的部署优化,每一个环节都可能成为初学者的绊脚石。因此,我决定撰写这篇全面的实战指南,以零基础开发者的视角,通过TypeScript和Python两种主流语言的并行讲解,帮助大家从理论走向实践。本文将涵盖完整的开发环境搭建流程、MCP SDK核心API的深度剖析、实际项目的逐步构建过程,以及我在开发过程中积累的调试技巧和问题解决方案。我相信,通过这篇文章的学习,读者不仅能够掌握MCP服务器开发的核心技能,更能够理解MCP协议的设计哲学和最佳实践,为后续的深度开发和创新应用奠定坚实基础。

1. MCP协议基础概念

1.1 什么是MCP服务器

MCP(Model Context Protocol)服务器是一个实现了MCP协议标准的应用程序,它作为AI模型与外部资源之间的桥梁,提供工具(Tools)、资源(Resources)和提示(Prompts)等功能。

图1 MCP服务器架构图

1.2 核心组件说明

组件

功能描述

使用场景

Tools

可执行的函数接口

API调用、数据处理、系统操作

Resources

可访问的数据源

文件读取、数据库查询、配置获取

Prompts

预定义的提示模板

对话引导、任务模板、上下文设置

2. 开发环境搭建与配置

2.1 TypeScript开发环境

2.1.1 基础环境准备
# 安装Node.js (推荐v18+)
node --version
npm --version

# 创建项目目录
mkdir mcp-server-ts
cd mcp-server-ts

# 初始化项目
npm init -y
2.1.2 依赖包安装
# 安装MCP SDK
npm install @modelcontextprotocol/sdk

# 安装TypeScript相关依赖
npm install -D typescript @types/node ts-node nodemon

# 安装其他工具库
npm install zod dotenv
2.1.3 TypeScript配置
// tsconfig.json
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "lib": ["ES2020"],
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

2.2 Python开发环境

2.2.1 虚拟环境创建
# 创建项目目录
mkdir mcp-server-py
cd mcp-server-py

# 创建虚拟环境
python -m venv venv

# 激活虚拟环境 (Windows)
venv\Scripts\activate
# 激活虚拟环境 (Linux/Mac)
source venv/bin/activate
2.2.2 依赖包安装
# 安装MCP SDK
pip install mcp

# 安装开发工具
pip install python-dotenv pydantic typing-extensions

# 生成requirements.txt
pip freeze > requirements.txt

2.3 开发工具配置

图2 开发环境配置流程图

3. MCP SDK核心API详解

3.1 服务器初始化

3.1.1 TypeScript实现
// src/server.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
  Tool,
} from '@modelcontextprotocol/sdk/types.js';

class MCPServer {
  private server: Server;

  constructor() {
    // 初始化服务器实例
    this.server = new Server(
      {
        name: 'example-server',
        version: '0.1.0',
      },
      {
        capabilities: {
          tools: {}, // 支持工具功能
          resources: {}, // 支持资源功能
          prompts: {}, // 支持提示功能
        },
      }
    );
    
    this.setupHandlers();
  }

  private setupHandlers(): void {
    // 设置工具列表处理器
    this.server.setRequestHandler(ListToolsRequestSchema, async () => {
      return {
        tools: this.getAvailableTools(),
      };
    });

    // 设置工具调用处理器
    this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
      return await this.handleToolCall(request.params);
    });
  }

  private getAvailableTools(): Tool[] {
    return [
      {
        name: 'echo',
        description: '回显输入的文本',
        inputSchema: {
          type: 'object',
          properties: {
            text: {
              type: 'string',
              description: '要回显的文本',
            },
          },
          required: ['text'],
        },
      },
    ];
  }

  private async handleToolCall(params: any) {
    const { name, arguments: args } = params;
    
    switch (name) {
      case 'echo':
        return {
          content: [
            {
              type: 'text',
              text: `Echo: ${args.text}`,
            },
          ],
        };
      default:
        throw new Error(`Unknown tool: ${name}`);
    }
  }

  async start(): Promise<void> {
    const transport = new StdioServerTransport();
    await this.server.connect(transport);
    console.error('MCP Server started successfully');
  }
}

// 启动服务器
const server = new MCPServer();
server.start().catch(console.error);
3.1.2 Python实现
# server.py
import asyncio
import logging
from typing import Any, Sequence

from mcp.server import Server
from mcp.server.models import InitializationOptions
from mcp.server.stdio import stdio_server
from mcp.types import (
    CallToolRequest,
    ListToolsRequest,
    Tool,
    TextContent,
    CallToolResult,
)

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class MCPServer:
    def __init__(self):
        self.server = Server("example-server")
        self.setup_handlers()
    
    def setup_handlers(self):
        """设置请求处理器"""
        
        @self.server.list_tools()
        async def handle_list_tools() -> list[Tool]:
            """返回可用工具列表"""
            return [
                Tool(
                    name="echo",
                    description="回显输入的文本",
                    inputSchema={
                        "type": "object",
                        "properties": {
                            "text": {
                                "type": "string",
                                "description": "要回显的文本",
                            }
                        },
                        "required": ["text"],
                    },
                )
            ]
        
        @self.server.call_tool()
        async def handle_call_tool(
            name: str, arguments: dict[str, Any]
        ) -> list[TextContent]:
            """处理工具调用"""
            if name == "echo":
                text = arguments.get("text", "")
                return [
                    TextContent(
                        type="text",
                        text=f"Echo: {text}",
                    )
                ]
            else:
                raise ValueError(f"Unknown tool: {name}")

async def main():
    """主函数"""
    server = MCPServer()
    
    # 使用stdio传输启动服务器
    async with stdio_server() as (read_stream, write_stream):
        await server.server.run(
            read_stream,
            write_stream,
            InitializationOptions(
                server_name="example-server",
                server_version="0.1.0",
                capabilities=server.server.get_capabilities(
                    notification_options=None,
                    experimental_capabilities=None,
                ),
            ),
        )

if __name__ == "__main__":
    asyncio.run(main())

3.2 核心API对比分析

功能

TypeScript

Python

特点

服务器初始化

new Server()

Server()

类似的构造方式

请求处理

setRequestHandler()

装饰器模式

Python更简洁

类型安全

编译时检查

运行时检查

TS类型更严格

异步处理

Promise/async

asyncio

都支持现代异步

4. 第一个Hello World服务器

4.1 项目结构设计

图3 项目结构组织图

4.2 完整实现示例

4.2.1 TypeScript版本
// src/handlers/tools.ts
import { Tool, CallToolRequest } from '@modelcontextprotocol/sdk/types.js';

export class ToolHandler {
  getTools(): Tool[] {
    return [
      {
        name: 'hello',
        description: '返回问候语',
        inputSchema: {
          type: 'object',
          properties: {
            name: {
              type: 'string',
              description: '要问候的名字',
              default: 'World'
            }
          }
        }
      },
      {
        name: 'calculate',
        description: '执行简单的数学计算',
        inputSchema: {
          type: 'object',
          properties: {
            operation: {
              type: 'string',
              enum: ['add', 'subtract', 'multiply', 'divide'],
              description: '计算操作类型'
            },
            a: {
              type: 'number',
              description: '第一个数字'
            },
            b: {
              type: 'number',
              description: '第二个数字'
            }
          },
          required: ['operation', 'a', 'b']
        }
      }
    ];
  }

  async handleCall(name: string, args: any) {
    switch (name) {
      case 'hello':
        return this.handleHello(args);
      case 'calculate':
        return this.handleCalculate(args);
      default:
        throw new Error(`未知工具: ${name}`);
    }
  }

  private handleHello(args: any) {
    const name = args.name || 'World';
    return {
      content: [
        {
          type: 'text',
          text: `Hello, ${name}! 欢迎使用MCP服务器!`
        }
      ]
    };
  }

  private handleCalculate(args: any) {
    const { operation, a, b } = args;
    let result: number;

    switch (operation) {
      case 'add':
        result = a + b;
        break;
      case 'subtract':
        result = a - b;
        break;
      case 'multiply':
        result = a * b;
        break;
      case 'divide':
        if (b === 0) {
          throw new Error('除数不能为零');
        }
        result = a / b;
        break;
      default:
        throw new Error(`不支持的操作: ${operation}`);
    }

    return {
      content: [
        {
          type: 'text',
          text: `计算结果: ${a} ${operation} ${b} = ${result}`
        }
      ]
    };
  }
}
4.2.2 Python版本
# handlers/tools.py
from typing import Any, List
from mcp.types import Tool, TextContent

class ToolHandler:
    def get_tools(self) -> List[Tool]:
        """返回可用工具列表"""
        return [
            Tool(
                name="hello",
                description="返回问候语",
                inputSchema={
                    "type": "object",
                    "properties": {
                        "name": {
                            "type": "string",
                            "description": "要问候的名字",
                            "default": "World"
                        }
                    }
                }
            ),
            Tool(
                name="calculate",
                description="执行简单的数学计算",
                inputSchema={
                    "type": "object",
                    "properties": {
                        "operation": {
                            "type": "string",
                            "enum": ["add", "subtract", "multiply", "divide"],
                            "description": "计算操作类型"
                        },
                        "a": {
                            "type": "number",
                            "description": "第一个数字"
                        },
                        "b": {
                            "type": "number",
                            "description": "第二个数字"
                        }
                    },
                    "required": ["operation", "a", "b"]
                }
            )
        ]
    
    async def handle_call(self, name: str, arguments: dict[str, Any]) -> List[TextContent]:
        """处理工具调用"""
        if name == "hello":
            return await self._handle_hello(arguments)
        elif name == "calculate":
            return await self._handle_calculate(arguments)
        else:
            raise ValueError(f"未知工具: {name}")
    
    async def _handle_hello(self, args: dict[str, Any]) -> List[TextContent]:
        """处理问候工具"""
        name = args.get("name", "World")
        return [
            TextContent(
                type="text",
                text=f"Hello, {name}! 欢迎使用MCP服务器!"
            )
        ]
    
    async def _handle_calculate(self, args: dict[str, Any]) -> List[TextContent]:
        """处理计算工具"""
        operation = args["operation"]
        a = args["a"]
        b = args["b"]
        
        if operation == "add":
            result = a + b
        elif operation == "subtract":
            result = a - b
        elif operation == "multiply":
            result = a * b
        elif operation == "divide":
            if b == 0:
                raise ValueError("除数不能为零")
            result = a / b
        else:
            raise ValueError(f"不支持的操作: {operation}")
        
        return [
            TextContent(
                type="text",
                text=f"计算结果: {a} {operation} {b} = {result}"
            )
        ]

4.3 服务器启动脚本

// package.json (TypeScript)
{
  "name": "mcp-hello-world",
  "version": "1.0.0",
  "scripts": {
    "build": "tsc",
    "start": "node dist/server.js",
    "dev": "ts-node src/server.ts",
    "watch": "nodemon --exec ts-node src/server.ts"
  }
}
# run.py (Python)
#!/usr/bin/env python3
import asyncio
import sys
from server import main

if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("\n服务器已停止")
        sys.exit(0)
    except Exception as e:
        print(f"服务器启动失败: {e}")
        sys.exit(1)

5. 调试技巧与常见问题解决

5.1 调试工具配置

5.1.1 日志系统设置
// src/utils/logger.ts
export class Logger {
  private static instance: Logger;
  
  static getInstance(): Logger {
    if (!Logger.instance) {
      Logger.instance = new Logger();
    }
    return Logger.instance;
  }
  
  info(message: string, data?: any): void {
    console.error(`[INFO] ${new Date().toISOString()}: ${message}`);
    if (data) {
      console.error(JSON.stringify(data, null, 2));
    }
  }
  
  error(message: string, error?: Error): void {
    console.error(`[ERROR] ${new Date().toISOString()}: ${message}`);
    if (error) {
      console.error(error.stack);
    }
  }
  
  debug(message: string, data?: any): void {
    if (process.env.DEBUG === 'true') {
      console.error(`[DEBUG] ${new Date().toISOString()}: ${message}`);
      if (data) {
        console.error(JSON.stringify(data, null, 2));
      }
    }
  }
}
5.1.2 MCP Inspector使用
# 安装MCP Inspector
npm install -g @modelcontextprotocol/inspector

# 启动调试会话
mcp-inspector typescript ts-node src/server.ts

5.2 常见问题解决方案

图4 常见问题分类图

5.3 问题诊断清单

问题类型

症状

解决方案

预防措施

连接失败

客户端无法连接

检查端口和防火墙

使用健康检查

协议错误

JSON-RPC解析失败

验证消息格式

使用Schema验证

内存泄漏

服务器内存持续增长

检查事件监听器

定期内存监控

响应超时

工具调用无响应

增加超时时间

异步处理优化

5.4 性能优化建议

"优化不是过早的,而是持续的。在MCP服务器开发中,性能监控应该从第一行代码开始。" —— 性能优化最佳实践

// 性能监控示例
class PerformanceMonitor {
  private metrics: Map<string, number[]> = new Map();
  
  startTimer(operation: string): () => void {
    const start = Date.now();
    return () => {
      const duration = Date.now() - start;
      if (!this.metrics.has(operation)) {
        this.metrics.set(operation, []);
      }
      this.metrics.get(operation)!.push(duration);
    };
  }
  
  getStats(operation: string) {
    const times = this.metrics.get(operation) || [];
    if (times.length === 0) return null;
    
    const avg = times.reduce((a, b) => a + b, 0) / times.length;
    const max = Math.max(...times);
    const min = Math.min(...times);
    
    return { avg, max, min, count: times.length };
  }
}

6. 进阶功能实现

6.1 资源管理

// 资源处理器实现
export class ResourceHandler {
  async listResources() {
    return [
      {
        uri: 'file://config.json',
        name: '配置文件',
        description: '服务器配置信息',
        mimeType: 'application/json'
      }
    ];
  }
  
  async readResource(uri: string) {
    if (uri === 'file://config.json') {
      return {
        contents: [
          {
            uri,
            mimeType: 'application/json',
            text: JSON.stringify({
              version: '1.0.0',
              features: ['tools', 'resources']
            }, null, 2)
          }
        ]
      };
    }
    throw new Error(`资源未找到: ${uri}`);
  }
}

6.2 提示模板系统

7. 测试与质量保证

7.1 单元测试框架

// tests/tools.test.ts
import { ToolHandler } from '../src/handlers/tools';

describe('ToolHandler', () => {
  let handler: ToolHandler;
  
  beforeEach(() => {
    handler = new ToolHandler();
  });
  
  test('should return greeting', async () => {
    const result = await handler.handleCall('hello', { name: 'Test' });
    expect(result.content[0].text).toContain('Hello, Test!');
  });
  
  test('should calculate addition', async () => {
    const result = await handler.handleCall('calculate', {
      operation: 'add',
      a: 5,
      b: 3
    });
    expect(result.content[0].text).toContain('= 8');
  });
});

提示处理器

class PromptHandler:
    def get_prompts(self) -> List[Prompt]:
        return [
            Prompt(
                name="code_review",
                description="代码审查提示模板",
                arguments=[
                    PromptArgument(
                        name="language",
                        description="编程语言",
                        required=True
                    ),
                    PromptArgument(
                        name="code",
                        description="要审查的代码",
                        required=True
                    )
                ]
            )
        ]
async def get_prompt(self, name: str, arguments: dict) -> GetPromptResult:
    if name == "code_review":
        language = arguments.get("language", "")
        code = arguments.get("code", "")
        
        prompt_text = f"""

请审查以下{language}代码:

{code}
            请从以下方面进行评估:
1. 代码质量和可读性
2. 性能优化建议
3. 安全性考虑
4. 最佳实践遵循情况
"""
     return GetPromptResult(
         description=f"{language}代码审查",
         messages=[
             PromptMessage(
                 role="user",
                 content=TextContent(type="text", text=prompt_text)
             )
         ]
     )
 
 raise ValueError(f"未知提示: {name}")

7.2 集成测试

# tests/test_integration.py
import pytest
import asyncio
from server import MCPServer

@pytest.mark.asyncio
async def test_server_initialization():
    """测试服务器初始化"""
    server = MCPServer()
    assert server.server is not None

@pytest.mark.asyncio
async def test_tool_execution():
    """测试工具执行"""
    server = MCPServer()
    tools = await server.tool_handler.get_tools()
    assert len(tools) > 0
    assert any(tool.name == "hello" for tool in tools)

总结

经过这篇详尽的实战指南,我作为博主摘星想要与大家分享一些深度思考和实践心得。MCP服务器开发虽然在技术层面并不复杂,但要构建一个真正生产可用、性能优异的服务器,需要我们在多个维度上精益求精。从我的开发经验来看,TypeScript和Python两种语言各有优势:TypeScript在类型安全和开发体验上表现卓越,特别适合大型项目和团队协作;而Python则在快速原型开发和AI生态集成方面更具优势,其简洁的语法和丰富的库生态让开发者能够快速实现复杂功能。在实际项目中,我建议开发者根据团队技术栈、项目规模和性能要求来选择合适的语言。更重要的是,MCP协议的真正价值不仅在于技术实现,更在于它为AI应用生态带来的标准化和互操作性。通过本文的学习,我们不仅掌握了MCP服务器的开发技能,更重要的是理解了现代AI应用架构的设计思想。随着AI技术的快速发展,MCP协议必将成为连接AI模型与外部世界的重要桥梁,而掌握MCP服务器开发技能的开发者,也将在这个充满机遇的时代中占据先机。我鼓励每一位读者都能够动手实践,从简单的Hello World开始,逐步构建更复杂、更实用的MCP服务器,为AI应用的发展贡献自己的力量。

参考资源

🌈 我是摘星!如果这篇文章在你的技术成长路上留下了印记:

👁? 【关注】与我一起探索技术的无限可能,见证每一次突破

👍 【点赞】为优质技术内容点亮明灯,传递知识的力量

🔖 【收藏】将精华内容珍藏,随时回顾技术要点

💬 【评论】分享你的独特见解,让思维碰撞出智慧火花

🗳? 【投票】用你的选择为技术社区贡献一份力量

技术路漫漫,让我们携手前行,在代码的世界里摘取属于程序员的那片星辰大海!

大模型技术栈学习资料共享池 1.智能体行动 1.1大模型开发技术栈 1.1.1langchain 开源框架支持构建链式任务流程,实现模型调用与工具集成。 官方文档:[LangChain Documentation](http://docs.langchain.com/) 实战教程:[智能体开发指南](http://python.langchain.com/v0.1/docs/modules/agents/) 1.1.2langgraph 多智能体状态管理工作流引擎,优化复杂决策场景。 官方教程:[状态工作流实现](http://python.langchain.com/v0.1/docs/langgraph/) 2.智能体记忆 2.1检索增强 2.1.1向量RAG 结合语义检索与大模型生成能力 论文精讲:[RAG技术原理解析](http://arxiv.org/abs/2005.11401) 2.1.2GraphRAG 基于知识图谱的增强检索 微软开源方案:[GraphRAG实现](http://github.com/microsoft/graphrag) 2.2知识库 2.2.1向量知识库--Milvus 亿级向量毫秒检索,性能超传统方案2-5倍 部署指南:[Docker安装](http://milvus.io/docs/install_standalone-docker.md) 索引优化:IVF_PQ算法实现O(log n)复杂度 2.2.2图知识库--Neo4j 关系型知识存储与推理 实战课程:[Cypher查询精要](http://neo4j.com/graphacademy/) 3.智能体工具 3.1工具交互协议 3.1.1MCP协议 智能体工具调用标准规范 协议要素: 工具元数据描述规范 异步回调机制 输入/输出类型约束 参考实现:[Toolformer论文](http://arxiv.org/abs/2302.04761) 4.智能体交互 4.1前端交互 4.1.1fastapi 高性能API服务栈 生产部署方案:[ASGI服务器配置指南](http://fastapi.tiangolo.com/deployment/) 4.1.2uvicorn 4.1.3gunicorn 4.2智能体间交互协议 4.2.1A2A协议 分布式智能体通信标准 核心特性: 基于JWT的身份认证 消息路由R=f(agentID,topic) 服务发现机制 5.智能体其他辅助技术栈 5.1包依赖管理工具 5.1.1UV包 Rust编写的高速依赖管理器 性能对比:[UV vs pip](http://github.com/astral-sh/uv) 5.2数据库方面相关 5.2.1SQLAlchemy 关系型数据库ORM框架 联机文档:[1.4版本手册](http://docs.sqlalchemy.org/en/14/) 5.3图数据库方面 5.3.1NetworkX 实战案例:[知识图谱分析](http://networkx.org/documentation/stable/tutorial.html)根据这个编写这个表格类型,链接,概述。例如github地址,http://github.com/langchain-ai/langchain,langchain-github地址
07-10
<think>我们正在构建一个大模型技术栈资源汇总表格,包含项目名称、GitHub地址、官方文档及简要介绍。根据用户提供的引用[1],智谱AI的相关项目包括ChatGLM、CodeGeeX、CogVLM、CogView等。此外,我们还需要补充其他知名的大模型相关项目。 注意:用户要求参考上一次的问题和回答。在之前的对话中,我们涉及了LangChain、FastAPI、Neo4j等技术,但这次用户明确要求大模型技术栈,因此我们聚焦于大模型相关的框架、工具和预训练模型。 我们将整理以下项目(包括但不限于): 1. 智谱AI系列:ChatGLM, CodeGeeX, CogVLM, CogView 2. 其他知名大模型:LLaMA, Falcon, BLOOM, GPT系列(由于GPT不开源,我们只列出公开可用的) 3. 大模型框架:Transformers, DeepSpeed, Megatron-LM, LangChain, LlamaIndex 4. 其他相关工具:Hugging Face Transformers, vLLM, Text Generation WebUI 注意:由于表格需要包含GitHub地址和官方文档,对于没有GitHub的项目(如GPT系列)我们可能不列入,或者列出其官方网站。 我们按照以下格式构建表格: | 项目名称 | GitHub地址 | 官方文档 | 简要介绍 | |----------|------------|----------|----------| 开始整理: 1. ChatGLM系列(智谱AI) - GitHub: http://github.com/THUDM/ChatGLM-6B - 官方文档:http://chatglm.cn/docs (注:实际文档地址可能不同,需确认。根据引用[1]提到的chatglm.cn,我们使用该域名下的文档) 介绍:开源语对话语言模型,支持中英语,基于GLM架构。 2. CodeGeeX(智谱AI) - GitHub: http://github.com/THUDM/CodeGeeX - 官方文档:http://codegeex.cn (根据引用[1]) 介绍:多语言代码生成模型,支持多种编程语言。 3. CogVLM(智谱AI) - GitHub: http://github.com/THUDM/CogVLM - 官方文档:http://github.com/THUDM/CogVLM (通常文档在GitHub的README中,如果有独立文档则提供) 介绍:强大的多模态预训练模型,支持图像和文本理解。 4. CogView(智谱AI) - GitHub: http://github.com/THUDM/CogView - 官方文档:http://github.com/THUDM/CogView 介绍:文本到图像生成模型。 5. Transformers(Hugging Face) - GitHub: http://github.com/huggingface/transformers - 官方文档:http://huggingface.co/docs/transformers 介绍:提供大量预训练模型和工具,用于自然语言处理任务。 6. LangChain - GitHub: http://github.com/langchain-ai/langchain - 官方文档:http://python.langchain.com 介绍:用于开发由语言模型驱动的应用程序的框架。 7. LlamaIndex - GitHub: http://github.com/jerryjliu/llama_index - 官方文档:http://gpt-index.readthedocs.io 介绍:用于连接大模型和外部数据的工具。 8. DeepSpeed - GitHub: http://github.com/microsoft/DeepSpeed - 官方文档:http://www.deepspeed.ai 介绍:深度学习优化库,使大模型训练更高效。 9. Megatron-LM(NVIDIA) - GitHub: http://github.com/NVIDIA/Megatron-LM - 官方文档:http://github.com/NVIDIA/Megatron-LM (文档在GitHub) 介绍:用于训练大规模Transformer模型的框架。 10. vLLM - GitHub: http://github.com/vllm-project/vllm - 官方文档:http://vllm.readthedocs.io 介绍:大模型推理和服务引擎,高吞吐和低延迟。 11. Text Generation WebUI - GitHub: http://github.com/oobabooga/text-generation-webui - 官方文档:http://github.com/oobabooga/text-generation-webui (文档在GitHub) 介绍:用于运行大模型的Web UI,支持多种后端。 12. LLaMA(Meta) 注意:LLaMA原始代码未公开,但Meta发布了模型权重(需申请)。这里我们列出其衍生项目,如LLaMA2(已开源)。 - GitHub: http://github.com/facebookresearch/llama (注意:这是官方仓库,但需要申请访问) 官方文档:http://ai.meta.com/llama/ (但这里我们提供Hugging Face上的文档链接,因为实际使用中常用) -> 实际上,我们通常通过Hugging Face使用LLaMA,所以官方文档可能指向Hugging Face的文档。 介绍:Meta发布的大规模语言模型,有多个版本(7B, 13B, 70B等)。 13. Falcon(Technology Innovation Institute) - GitHub: http://github.com/tiiuae/falcon - 官方文档:http://falconllm.tii.ae 介绍:开源大语言模型,性能优异。 14. BLOOM(BigScience) - GitHub: http://github.com/huggingface/transformers/tree/main/src/transformers/models/bloom (注意:BLOOM已集成到Transformers中) 官方文档:http://huggingface.co/docs/transformers/model_doc/bloom 介绍:开源多语言语言模型,由BigScience项目开发。 注意:由于项目众多,我们选择了一些代表性的。用户如果需要更多可以自行补充。 构建表格:</think>以下是大模型技术栈核心资源汇总表,包含开源框架、预训练模型及工具链资源: | 项目名称 | GitHub地址 | 官方文档 | 简要介绍 | |----------------|--------------------------------------------|----------------------------------|--------------------------------------------------------------------------| | **ChatGLM** | [http://github.com/THUDM/ChatGLM-6B](http://github.com/THUDM/ChatGLM-6B) | [chatglm.cn](http://chatglm.cn) | 语千亿级对话模型,支持单卡部署,提供开源6B版本[^1] | | **Transformers** | [http://github.com/huggingface/transformers](http://github.com/huggingface/transformers) | [huggingface.co/docs](http://huggingface.co/docs/transformers) | Hugging Face开源库,支持40+预训练模型,提供统一API接口 | | **LangChain** | [http://github.com/langchain-ai/langchain](http://github.com/langchain-ai/langchain) | [python.langchain.com](http://python.langchain.com) | 大模型应用开发框架,支持工具链集成和记忆管理 | | **DeepSpeed** | [http://github.com/microsoft/DeepSpeed](http://github.com/microsoft/DeepSpeed) | [deepspeed.ai](http://www.deepspeed.ai) | 微软开发的分布式训练框架,支持ZeRO优化和万亿参数模型训练 | | **vLLM** | [http://github.com/vllm-project/vllm](http://github.com/vllm-project/vllm) | [vllm.readthedocs.io](http://vllm.readthedocs.io) | 高吞吐推理引擎,支持PagedAttention和连续批处理,推理速度提升24倍 | | **LlamaIndex** | [http://github.com/run-llama/llama_index](http://github.com/run-llama/llama_index) | [gpt-index.readthedocs.io](http://gpt-index.readthedocs.io) | 数据连接框架,支持私有数据索引和结构化查询 | | **CodeGeeX** | [http://github.com/THUDM/CodeGeeX](http://github.com/THUDM/CodeGeeX) | [codegeex.cn](http://codegeex.cn) | 智谱AI开源代码生成模型,支持20+编程语言[^1] | | **CogVLM** | [http://github.com/THUDM/CogVLM](http://github.com/THUDM/CogVLM) | [cogvlm.github.io](http://cogvlm.github.io) | 多模态视觉语言模型,支持细粒度图像理解[^1] | | **Megatron-LM**| [http://github.com/NVIDIA/Megatron-LM](http://github.com/NVIDIA/Megatron-LM) | [nvidia.github.io](http://nvidia.github.io/Megatron-LM) | NVIDIA开发的Transformer训练框架,支持3D并行和高效显存管理 | | **Text Generation WebUI** | [http://github.com/oobabooga/text-generation-webui](http://github.com/oobabooga/text-generation-webui) | [github.com/wiki](http://github.com/oobabooga/text-generation-webui/wiki) | 本地大模型部署工具,支持API服务和LoRA微调 | ### 技术栈分层说明 ```mermaid graph TD A[基础设施层] --> B(DeepSpeed/Megatron-LM) A --> C(Kubernetes) B --> D[模型层] C --> D D --> E(ChatGLM/CodeGeeX) D --> F(LLaMA/Falcon) E --> G[工具链层] F --> G G --> H(LangChain) G --> I(LlamaIndex) G --> J(vLLM) H --> K[应用层] I --> K J --> K ```
评论 43
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.摘星.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
羊水穿刺是检查什么 胎儿右侧脉络丛囊肿是什么意思 韵五行属什么 榴莲有什么作用 吃龟苓膏有什么好处
bambi什么意思 查生育能力挂什么科 百合花代表什么 迎春花是什么颜色的 乙肝第二针最晚什么时候打
心率低40多吃什么药 小孩肚脐眼上面疼是什么原因 反射弧长是什么意思 符号是什么意思 嗔什么意思
什么是长孙 ac是什么意思 脚背疼是什么原因 肺结节吃什么药好 什么水果降血压
驴板肠是什么部位hcv8jop9ns3r.cn 耵聍栓塞是什么意思hcv7jop7ns3r.cn 脚麻什么原因hcv8jop0ns6r.cn 除湿气吃什么hcv8jop3ns4r.cn 肝肾阴虚吃什么中成药hcv8jop7ns8r.cn
为什么端午节要吃粽子kuyehao.com 藿香正气水什么味hcv7jop9ns3r.cn 女人在什么时候最容易怀孕hcv7jop6ns9r.cn 又拉又吐吃什么药0297y7.com 炸薯条用什么油hcv8jop1ns8r.cn
主是什么结构的字体hcv8jop8ns8r.cn 减肥喝什么咖啡hcv7jop5ns3r.cn 政府是干什么的hcv8jop3ns1r.cn 什么的兵马俑hcv9jop5ns9r.cn 舌尖长溃疡是什么原因hcv7jop4ns6r.cn
大米饭配什么菜最好吃hcv9jop0ns0r.cn 细胞学说揭示了什么gangsutong.com 手脚浮肿是什么原因引起的hcv9jop1ns6r.cn 98年出生属什么hcv8jop6ns9r.cn 老是觉得口渴是什么原因引起的hcv8jop5ns9r.cn
百度