1. MCP是什么?初学者友好的解释
Model Context Protocol (MCP) 是一个开源协议,它允许大型语言模型(LLM)如Claude等安全地与外部工具和数据源交互。简单来说,MCP就像是AI模型与外部世界的"沟通桥梁"。使用MCP,AI可以查询数据库、读写文件、发送邮件,甚至控制其他应用程序,而不需要完全开放系统权限。
想象一下,你正在与Claude聊天,突然需要它帮你查看今天的天气、在日历中添加会议、或者在数据库中查询信息。没有外部工具接入能力,Claude只能说"对不起,我无法访问实时数据"。而通过MCP,Claude可以通过预定义的安全接口与这些工具通信,完成你的请求。
为什么要使用MCP?
- 安全性:MCP提供了一种受控方式让AI与外部系统交互,而不是给予无限制的系统访问权限
- 结构化:使用标准化的方式定义工具、资源和提示,使AI能够更好地理解和使用它们
- 易于扩展:你可以创建自己的MCP服务器来扩展AI的能力,让它能够与你的应用或服务交互
MCP的工作原理
MCP采用客户端-服务器模型,其工作流程如下:
用户界面
(如Claude)
| ◄────► |
MCP客户端
(Claude Desktop)
| ◄────► |
MCP服务器
(你开发的服务器)
|
↓ | ||||
外部服务和数据源
(数据库、API等)
|
当用户要求AI完成某项任务时,MCP客户端会将请求转发到适当的MCP服务器。服务器执行操作并返回结果,然后AI使用这些结果为用户提供答案。整个过程对用户来说是透明的,就像是AI本身具备了这些能力一样。
MCP服务器的核心组件
MCP服务器主要由以下几个组件组成:
- 工具(Tools):AI可以调用的函数,如"搜索数据库"、"发送邮件"等
- 资源(Resources):AI可以访问的数据源,如文档、数据库表等
- 提示(Prompts):预定义的对话模板,帮助用户快速开始有结构的对话
这三个组件之间的关系可以用下图表示:
MCP服务器
| ||
工具
(Tools)
• 函数调用
• API集成
• 系统操作
|
资源
(Resources)
• 数据访问
• 文档读取
• 信息库
|
提示
(Prompts)
• 对话模板
• 引导用户
• 结构化交互
|
2. 开发环境准备
在开始开发MCP服务器之前,我们需要准备开发环境。这个过程包括安装必要的工具和库,创建项目目录,以及设置开发环境变量。
安装Python 3.10+
| → |
安装pip和venv
| → |
创建虚拟环境
|
↓ | ||||
初始化项目结构
| ← |
配置pyproject.toml
| ← |
安装MCP SDK
|
2.1 安装Python
确保你的系统上安装了Python 3.10或更高版本。可以使用以下命令检查Python版本:
python --version
如果需要安装或更新Python,可以从Python官网下载最新版本。
2.2 创建虚拟环境
虚拟环境允许你为每个项目创建独立的Python环境,避免依赖冲突。这就像是为每个项目提供了一个独立的"房间",里面只安装该项目需要的"家具"(依赖包)。当你切换项目时,只需简单地"搬家"(切换虚拟环境),而不是重新布置整个"房子"(全局Python环境)。
3. MCP服务器项目结构
一个良好的项目结构能够让开发和维护变得更加轻松。就像一座精心设计的建筑,每个房间都有特定的用途,每个组件都有明确的位置。
标准项目结构
一个基本的MCP服务器项目结构如下:
my-mcp-server/
├── pyproject.toml # 项目配置和依赖管理
├── src/
│ └── my_mcp_server/ # 包含服务器代码的模块
│ ├── __init__.py # 定义入口点和命令行接口
│ ├── __main__.py # 直接运行模块的入口点
│ └── server.py # 主要的服务器实现代码
└── tests/ # 测试代码目录
各个文件的作用
┌─────────────────────────────────────────────────────────────────────┐
│ pyproject.toml │
│ │
│ • 定义项目元数据(名称、版本、描述等) │
│ • 声明项目依赖 │
│ • 配置构建系统 │
│ • 设置开发工具(如linter、测试工具) │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ __init__.py │
│ │
│ • 将目录标记为Python包 │
│ • 定义命令行入口点 │
│ • 处理命令行参数 │
│ • 配置日志系统 │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ __main__.py │
│ │
│ • 允许模块作为脚本运行 │
│ • 调用主函数 │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ server.py │
│ │
│ • 实现服务器核心逻辑 │
│ • 定义工具、资源和提示 │
│ • 处理MCP协议通信 │
└─────────────────────────────────────────────────────────────────────┘
创建这些文件:
mkdir -p src/my_mcp_server tests
touch pyproject.toml src/my_mcp_server/__init__.py src/my_mcp_server/__main__.py src/my_mcp_server/server.py
4. 基础配置:pyproject.toml
pyproject.toml
是Python项目的"身份证",它不仅包含项目的基本信息,还声明了项目的依赖关系和构建配置。正确配置这个文件对于项目的分发和安装至关重要。
pyproject.toml的重要性
在现代Python项目中,pyproject.toml
已经逐渐替代了传统的setup.py
,成为了声明项目元数据和依赖的标准方式。它使用TOML格式,比传统的Python脚本更加结构化和易于解析。
一个完整的配置示例
[project]
name = "my-mcp-server"
version = "0.1.0"
description = "我的第一个MCP服务器"
readme = "README.md"
requires-python = ">=3.10"
authors = [{ name = "你的名字" }]
dependencies = [
"click>=8.1.7", # 命令行参数处理
"mcp>=1.0.0", # Python MCP SDK
"pydantic>=2.0.0", # 数据验证和模式定义
]
[project.scripts]
my-mcp-server = "my_mcp_server:main"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.uv]
dev-dependencies = ["pyright>=1.1.389", "ruff>=0.7.3", "pytest>=8.0.0"]
依赖选择说明
在上述配置中,我们选择了以下几个关键依赖:
- click:一个用于创建优雅命令行界面的库,它使得解析命令行参数变得简单直观
- mcp:Python的MCP SDK,提供了实现MCP服务器所需的所有基础功能
- pydantic:一个数据验证和设置管理库,用于定义强类型的数据模型和参数验证
这些依赖就像是建筑的基础材料,每一个都承担着特定的功能,共同构建起一个稳固的MCP服务器。
5. 命令行接口
命令行接口是用户与你的MCP服务器交互的入口。在这一节,我们将实现一个简单但功能完备的命令行界面。
5.1 命令行参数处理
命令行接口的工作流程如下:
解析命令行参数
| → |
配置日志级别
| → |
启动MCP服务器
|
↓ | ||||
监听客户端请求
| ← |
处理请求
| ← |
返回响应
|
6. 服务器主逻辑
服务器主逻辑是MCP服务器的核心部分,负责接收客户端请求、调用相应的工具或资源,并返回结果。
6.1 服务器生命周期
MCP服务器的生命周期如下:
初始化
创建服务器实例
| → |
等待请求
监听标准输入
| → |
接收请求
解析JSON请求
|
↓↑ | ||||
关闭
清理资源
| ← |
发送响应
写入标准输出
| ← |
处理请求
调用工具/资源
|
7. 高级特性:资源和提示
除了工具之外,MCP服务器还可以提供资源和提示,让AI模型获取更多上下文信息和提供更结构化的交互。这些特性就像是服务器提供的"文档"和"模板",使AI能够更好地理解和使用服务器的功能。
MCP组件关系图
┌───────────────────────────────────────────────────────────────────┐
│ MCP服务器 │
│ │
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ │ │ │ │ │ │
│ │ 工具 │ │ 资源 │ │ 提示 │ │
│ │ (Tools) │ │ (Resources) │ │ (Prompts) │ │
│ │ │ │ │ │ │ │
│ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ SQLite数据库连接 │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────────────┘
8.1 添加资源
资源是AI可以访问的数据源,可以是文本文档、JSON数据、图片等。在我们的问候服务器中,我们添加了一个"支持的语言"资源,用于告诉AI我们支持哪些语言。
资源请求流程
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ AI请求资源列表 │────► 服务器返回资源列表 │────► AI请求特定资源 │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └────────┬────────┘
│
▼
┌─────────────────┐
│ │
│ 服务器返回资源内容 │
│ │
└─────────────────┘
代码实现
from pydantic import AnyUrl
from mcp.types import Resource
# 在serve函数中添加这个处理器
@server.list_resources()
async def list_resources() -> list[Resource]:
"""列出可用的资源"""
return [
Resource(
name="Supported Languages",
uri=AnyUrl("supported-languages://list"),
description="支持的问候语言列表"
)
]
@server.read_resource()
async def read_resource(uri: AnyUrl) -> str:
"""读取资源内容"""
if str(uri) == "supported-languages://list":
languages = {
"english": "英语",
"chinese": "中文",
"spanish": "西班牙语",
"french": "法语",
"japanese": "日语"
}
language_list = "\n".join([f"- {code}: {name}" for code, name in languages.items()])
return f"# 支持的语言\n\n{language_list}"
raise ValueError(f"未知资源: {uri}")
8.2 添加提示
提示是预定义的对话模板,有助于引导用户以特定结构与AI交互。在我们的问候服务器中,我们添加了一个"问候演示"提示,让用户可以更轻松地体验服务器的功能。
提示请求流程
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ 用户选择提示 │────► AI请求提示列表 │────► 服务器返回提示列表│
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └────────┬────────┘
│
▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ AI使用提示内容 │◄────┤ 服务器返回提示内容 │◄────┤ AI请求特定提示 │
│ 引导对话 │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
代码实现
from mcp.types import Prompt, PromptMessage, GetPromptResult
@server.list_prompts()
async def list_prompts() -> list[Prompt]:
"""列出可用的提示"""
return [
Prompt(
name="greeting-demo",
description="问候演示提示",
argument_schema={
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "用户名"
}
},
"required": ["name"]
}
)
]
@server.get_prompt()
async def get_prompt(name: str, arguments: dict[str, str] | None) -> GetPromptResult:
"""获取提示内容"""
if name != "greeting-demo" or not arguments or "name" not in arguments:
raise ValueError("无效的提示名称或缺少必要参数")
user_name = arguments["name"]
prompt_text = f"""
这是一个问候服务演示。你好,{user_name}!
这个服务器支持以下工具:
- get_greeting: 生成不同语言的问候语
- get_time_greeting: 根据当前时间生成不同语言的问候语
试试用不同的语言问候{user_name}!
"""
return GetPromptResult(
name="greeting-demo",
description=f"针对{user_name}的问候演示",
messages=[
PromptMessage(
role="user",
content=TextContent(type="text", text=prompt_text.strip()),
)
],
)
用户体验角度
从用户的角度来看,资源和提示极大地提升了交互体验:
- 资源:用户可以通过AI了解服务器支持的语言和其他重要信息,而不需要额外的文档
- 提示:用户可以通过选择提示快速开始一个结构化的对话,无需从零开始
这就像是访问一个网站时,有清晰的导航菜单和预先设计的表单,让用户不必猜测如何使用网站的功能。
9. 安装和运行
完成代码后,是时候将我们的服务器安装到本地环境并运行了。这个阶段就像是将精心设计的菜肴从厨房端到餐桌上,让用户可以品尝你的成果。
安装流程
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ 开发模式安装 │────► 运行服务器 │────► 测试功能 │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
安装命令
# 安装开发模式
uv pip install -e . # 或使用 pip install -e .
# 运行服务器
my-mcp-server -v
为什么使用开发模式?
开发模式(-e
选项)创建一个指向你项目源代码的链接,而不是复制代码到安装目录。这意味着:
- 修改源代码后无需重新安装
- 可以立即看到代码更改的效果
- 开发和调试更加方便
这就像是在一个工作室里进行创作,你可以随时调整和改进你的作品,而不需要每次都重新从头开始。
10. 与Claude Desktop集成
将你的MCP服务器与Claude Desktop集成是让它发挥作用的关键步骤。通过这种集成,Claude可以利用你的服务器提供的工具、资源和提示,增强其功能。
10.1 集成步骤
打开Claude Desktop
| → |
编辑配置文件
| → |
添加服务器配置
|
↓ | ||||
开始对话
使用新工具
| ← |
重启Claude Desktop
| ← |
保存配置
|
10.2 详细配置指南
将你的MCP服务器集成到Claude Desktop中需要几个简单的步骤。想象一下,你正在向Claude介绍一位新朋友(你的MCP服务器),这样Claude就能够利用这位朋友的特殊技能。
配置文件位置
Claude Desktop的配置文件通常位于:
- macOS:
~/Library/Application Support/Claude/config.json
- Windows:
%APPDATA%\Claude\config.json
- Linux:
~/.config/Claude/config.json
配置内容
在配置文件中,你需要在mcpServers
部分添加你的服务器信息:
{
"mcpServers": {
"greeting": {
"command": "my-mcp-server",
"args": ["-v"]
}
}
}
这个配置告诉Claude Desktop:
- 有一个名为"greeting"的MCP服务器可用
- 启动这个服务器的命令是
my-mcp-server
- 运行时使用
-v
参数(启用INFO级别的日志)
服务器注册过程
当Claude Desktop启动时,它会自动检查配置文件中列出的所有MCP服务器,并尝试连接它们。如果连接成功,服务器提供的工具、资源和提示就会在Claude中变得可用。
这个过程就像是Claude在启动时"认识"了所有可用的朋友(服务器),并了解了它们各自的特长(工具和资源),以便在需要时向它们寻求帮助。
用户交互模式
一旦集成完成,用户可以通过以下方式与你的MCP服务器交互:
- 直接请求:用户可以直接要求Claude使用特定的工具,例如"用中文问候我"
- 资源查询:Claude可以查询服务器提供的资源,例如"列出支持的语言"
- 提示选择:用户可以选择预定义的提示,快速开始特定类型的对话
从用户的角度来看,整个过程是无缝的,就像是Claude本身具有了这些能力一样。这种透明性是MCP最大的优势之一,它使AI的能力扩展变得简单而自然。
11. 测试你的MCP服务器
测试是确保MCP服务器稳定性和可靠性的关键环节。通过全面测试,你可以在部署前发现并修复潜在问题。
11.1 测试流程
测试流程应该包括单元测试、集成测试和端到端测试,确保服务器的各个组件和整体功能都能正常工作。
启动测试客户端
| → |
列举可用工具
| → |
调用工具
|
↓ | ||||
验证输出结果
| ← |
接收响应
| ← |
发送参数
|
12. 高级示例:数据库查询服务器
随着你的MCP服务器开发技能提升,你可以尝试创建更复杂的服务器。一个常见的高级应用是数据库查询服务器,它允许AI模型与数据库交互,执行查询、插入、更新和删除操作。
12.1 SQLite数据库服务器架构
一个SQLite数据库MCP服务器的架构如下:
SQLite MCP服务器
| ||
查询执行工具
• 执行SQL语句
• 返回查询结果
• 错误处理
|
表结构查询工具
• 列出所有表
• 获取表结构
• 提供表数据字典
|
业务洞察资源
• 提供商业分析
• 常用查询模板
• 数据解释指南
|
SQLite数据库连接
|
13. 最佳实践
在MCP服务器开发过程中,遵循最佳实践不仅可以提高代码质量,还可以增强服务器的安全性、可靠性和可维护性。这就像是建造房屋时遵循建筑规范,确保房屋不仅美观,还安全、耐用。
1. 安全性最佳实践
安全性是MCP服务器开发中最重要的考虑因素之一。就像你不会给陌生人你家的钥匙一样,你应该谨慎控制AI对系统的访问权限。
┌───────────────────────────────────────────────────────────────────┐
│ 安全最佳实践 │
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ │ │ │ │ │ │
│ │ 输入验证 │ │ 权限控制 │ │ 敏感操作确认 │ │
│ │ │ │ │ │ │ │
│ │ • 类型检查 │ │ • 最小权限原则 │ │ • 二次确认 │ │
│ │ • 范围验证 │ │ • 资源隔离 │ │ • 操作日志 │ │
│ │ • 注入防护 │ │ • 认证机制 │ │ • 撤销机制 │ │
│ │ │ │ │ │ │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │
└───────────────────────────────────────────────────────────────────┘
具体措施:
- 使用参数验证:使用Pydantic等工具验证所有输入
- 避免直接执行shell命令:如果必须执行,严格过滤参数
- 限制文件系统访问:只允许访问特定目录
- 使用参数化查询:防止SQL注入攻击
- 实现速率限制:防止资源耗尽攻击
2. 错误处理最佳实践
良好的错误处理可以提高服务器的稳定性和用户体验。就像一个好的导航系统不仅能带你到目的地,还能在遇到道路封闭时提供替代路线。
具体措施:
- 提供有意义的错误消息:清晰说明问题所在
- 区分用户错误和系统错误:不同类型的错误需要不同的处理方式
- 实现适当的日志记录:记录错误详情,但避免泄露敏感信息
- 优雅降级:在部分功能不可用时,仍能提供有限服务
- 异常隔离:确保一个工具的故障不会影响其他工具
3. 性能优化最佳实践
性能优化可以使你的服务器更加高效和响应迅速。就像一位厨师会不断优化他的烹饪流程,使美食更快地端上餐桌。
具体措施:
- 缓存常用数据:减少重复计算和查询
- 使用异步操作:避免阻塞服务器
- 优化数据库查询:使用索引,减少不必要的查询
- 限制响应大小:分页返回大型结果集
- 资源池化:重用数据库连接等资源
4. 代码组织最佳实践
良好的代码组织使得维护和扩展服务器变得更加容易。这就像是一个整洁有序的工作空间,能够提高工作效率和创造力。
具体措施:
- 模块化设计:将功能分解为小型、专注的模块
- 关注点分离:将业务逻辑与MCP服务器层分开
- 使用依赖注入:减少组件间的耦合
- 遵循编码规范:使用一致的命名和格式化风格
- 编写文档和注释:解释复杂的逻辑和设计决策
5. 用户体验最佳实践
良好的用户体验可以使你的服务器更容易使用和理解。就像一个精心设计的用户界面可以让复杂的应用变得直观易用。
具体措施:
- 提供详细的工具描述:清晰说明工具的功能和参数
- 返回格式化的结果:使结果易于阅读和理解
- 创建有用的提示模板:帮助用户快速开始
- 提供示例和教程:展示如何使用服务器
- 收集用户反馈:不断改进服务器
14. 常见问题
在开发和使用MCP服务器的过程中,你可能会遇到各种问题。提前了解这些问题及其解决方案,就像在旅行前了解可能的路障和绕行路线,可以让你的开发之旅更加顺畅。
1. 调试问题
调试是开发过程中不可避免的一部分,掌握有效的调试技巧可以节省大量时间。
常见问题:服务器启动失败
症状:运行服务器命令时出错,服务器无法启动
可能原因:
- 依赖缺失或版本不兼容
- 配置文件错误
- 端口已被占用
解决方案:
- 使用
-v
或-vv
增加日志详细程度 - 检查所有依赖是否正确安装
- 验证配置文件格式和内容
- 检查是否有其他服务使用相同端口
常见问题:工具调用失败
症状:工具列表显示正常,但调用时出错
可能原因:
- 工具实现有bug
- 参数验证失败
- 外部资源不可用
解决方案:
- 添加特定于工具的调试日志
- 使用测试客户端检查参数传递
- 验证所有外部依赖是否可用
2. 性能问题
随着使用量的增加,你可能会遇到性能瓶颈,及时识别和解决这些问题对于维护良好的用户体验至关重要。
常见问题:响应缓慢
症状:工具调用需要很长时间才能返回结果
可能原因:
- 复杂计算或查询
- 外部资源响应慢
- 资源泄漏
解决方案:
- 分析性能瓶颈,使用性能分析工具
- 实现缓存机制
- 优化算法和查询
- 使用异步处理长时间运行的任务
常见问题:内存使用过高
症状:服务器随着时间推移消耗越来越多的内存
可能原因:
- 内存泄漏
- 缓存策略不当
- 大型响应没有流式处理
解决方案:
- 使用内存分析工具检测泄漏
- 实现缓存大小限制和过期策略
- 对大型响应使用分页或流式处理
3. 集成问题
将MCP服务器与Claude或其他客户端集成时,可能会遇到各种问题。
常见问题:Claude无法识别服务器
症状:Claude报告找不到MCP服务器
可能原因:
- 配置文件路径错误
- 服务器命令不在PATH中
- 服务器名称配置错误
解决方案:
- 验证配置文件位置和内容
- 确保服务器命令可全局访问
- 重启Claude Desktop应用
常见问题:通信错误
症状:Claude可以启动服务器,但无法正常通信
可能原因:
- MCP协议实现不兼容
- 输入/输出流设置不正确
- 编码问题
解决方案:
- 更新到最新版本的MCP SDK
- 确保使用正确的流处理器(通常是stdio)
- 检查字符编码是否一致
4. 部署问题
将MCP服务器部署到生产环境可能会带来新的挑战。
常见问题:依赖冲突
症状:服务器在开发环境运行正常,但在生产环境失败
可能原因:
- 依赖版本不一致
- 系统库不兼容
- 权限问题
解决方案:
- 使用虚拟环境或容器隔离依赖
- 明确指定所有依赖的版本
- 使用
pip freeze > requirements.txt
锁定依赖
常见问题:多用户访问冲突
症状:多个用户同时使用服务器时出现问题
可能原因:
- 资源竞争
- 缺乏并发控制
- 状态管理不当
解决方案:
- 实现适当的锁和并发控制
- 为每个用户会话创建独立的状态
- 使用队列系统管理负载
15. 结论
恭喜!你现在已经了解了如何使用Python创建自己的MCP服务器。MCP为AI模型提供了一种安全、结构化的方式与外部世界交互,而你可以通过创建自己的服务器来扩展这些能力。
你学到了什么
通过这篇指南,你已经掌握了MCP服务器开发的全过程,从基本概念到高级应用:
- MCP的核心概念:工具、资源和提示如何共同工作
- 项目结构设计:如何组织你的代码以实现清晰和可维护性
- 服务器实现:如何使用Python MCP SDK创建服务器
- 高级特性:如何添加资源和提示来增强用户体验
- 测试和调试:如何确保你的服务器正常工作
- 集成和部署:如何将你的服务器与Claude Desktop集成
- 最佳实践:如何编写安全、高效、可维护的代码
下一步
MCP服务器开发是一个广阔的领域,有无限的可能性。随着你的经验积累,你可以:
- 创建更复杂的服务器:实现更多样化的功能
- 探索新的集成点:连接更多的外部服务和API
- 优化性能和安全性:提升服务器的质量
- 分享你的创造:将你的服务器发布到开源社区
- 开发自定义UI:创建专门的界面来使用你的服务器
从简单的问候服务器到复杂的数据库查询工具,可能性是无限的。随着你的经验积累,你可以创建更复杂、更有用的服务器,以满足你的特定需求。
最后的思考
MCP代表了AI与外部世界交互的新范式。通过创建自己的MCP服务器,你不仅扩展了AI的能力,还参与塑造了AI与人类协作的未来。就像是给AI提供了新的感官和能力,让它能够以更加有用和安全的方式融入我们的日常生活和工作。
希望这篇指南对你有所帮助!如果你有任何问题或建议,请随时联系我。祝你在MCP服务器开发之旅中取得成功!