这是一篇面向 CSDN 开发者社区的 AI Agent 能力扩展教程。核心不是讲概念,而是带你把 MCP 和 Skill 真正用起来:先跑通一个可调用的 MCP Server,再写一个自定义 Skill,最后用脚本批量调用并完成效果验证。文章会给出完整目录结构、代码示例、配置方法和常见问题排查清单,直接照着做即可。
这次我们来看 AI Agent 能力扩展中最核心的两块:MCP(Model Context Protocol)和 Skill。MCP 解决 Agent 怎么连接外部工具和数据源,Skill 解决 Agent 怎么按专业流程处理复杂任务。两者不是同一维度的东西,但配合起来能让 Agent 从“只能聊天”变成“能调工具、能按模板产出结果”。目前社区里讨论热度很高的 AI Agent、MCP Server、Agent Skill,基本都围绕这两条线展开,值得系统过一遍。
本文会演示三件事。第一,从零搭建一个 MCP Server,暴露两个可调用的工具;第二,在主流 Agent 客户端中注册这个 MCP 服务,并完成一次真实调用;第三,创建一个自定义 Skill,让 Agent 按照指定的步骤输出结构化结果。最后还会给出一套批量任务调用脚本,直接复用即可。如果你正在做 Agent 开发,或者想优化 Cursor、Claude Desktop、自建 Agent 的工作流,这篇文章可以直接收藏。
先说结论:MCP 适合做工具、数据源、文件系统的标准化接入,Skill 适合做方法论的沉淀和复用。一个管“手”,一个管“脑”。下面进入正题。
1. AI Agent 能力扩展核心速览
| 能力项 | 说明 |
|---|---|
| 核心概念 | MCP 是模型上下文协议,用于 Agent 与外部工具/数据源通信;Skill 是可复用的技能包,通常以 SKILL.md 为核心 |
| 解决问题 | MCP 解决工具接入标准化问题,Skill 解决复杂任务执行流程的封装问题 |
| 启动方式 | MCP Server 可用 Python 或 Node 实现,命令启动,也可接入客户端;Skill 通过目录和配置文件加载 |
| 主要功能 | 工具调用、数据读取、API 对接、批量任务、结构化输出、专业技能封装 |
| 适合场景 | 本地文件管理、数据库查询、信息检索、代码评审、报告生成、业务数据处理 |
| 硬件门槛 | 无需特殊 GPU,普通开发机即可运行 MCP Server 和 Skill 逻辑 |
| 是否支持批量任务 | 支持,MCP 工具可按脚本循环调用,Skill 可对多份输入重复执行 |
| 是否支持 API | 支持,MCP 本身基于 JSON-RPC,也有官方 SDK 做编程式调用 |
| 学习成本 | 中等,核心是理解协议模型、工具注册方式和上下文注入方式 |
2. MCP 与 Skill 的基本概念与应用边界
2.1 MCP 解决什么问题
MCP 是一个开放协议,目标是让 AI 模型在运行过程中动态发现并调用外部工具、数据资源和提示模板。它把“Agent 想用工具”和“工具具体怎么暴露”解耦。传统接法是写死函数调用,每个平台一套接口;MCP 让工具提供方用统一协议暴露能力,Agent 端只需要实现一个 MCP Client 即可对接任何兼容 Server。
从结构上看,MCP 有三个核心角色:MCP Server 暴露工具和数据;MCP Client 发起连接并调用;宿主应用(比如 Claude Desktop、Cursor、自研 Agent)把工具结果回传给大模型。传输层常用 stdio 或 SSE,请求格式基于 JSON-RPC 2.0。这意味着我们可以用自己熟悉的语言快速写一个 Server,不需要关心大模型内部实现。
2.2 Skill 解决什么问题
Skill 通常是一组“提示词 + 脚本 + 参考资源”的组合,用于让 Agent 在特定任务上按照约定流程执行。MCP 解决的是“能不能调用外部能力”,Skill 解决的是“能不能把任务做专业”。举个例子:同样让 Agent 写周报,普通的提示词只能得到一个粗略结果;如果加载了“周报生成 Skill”,Agent 会先收集本周 Commit、再按“目标、进展、风险、下一步”结构输出,效果稳定得多。
有些 Agent 框架里 Skill 是纯 Markdown 形式的提示词模板,有些则允许附带 Python/Shell 脚本,用于处理本地文件或调 API。无论实现方式如何,核心思想一致:把专家知识固化下来,按需加载,不污染普通对话的上下文。
2.3 适用场景与合规边界
MCP 和 Skill 适合解决以下问题:
- 需要 Agent 查询数据库、读取文件、调用内部 API。
- 需要把重复性任务沉淀成标准流程,比如代码审查、纪要总结、PPT 大纲生成。
- 需要让多个 Agent 共享同一套工具和技能库。
- 需要批量处理大量输入文件,并通过脚本控制调用节奏。
使用边界方面,必须注意三条底线。第一,MCP Server 如果接入本地文件或数据库,一定要做最小权限控制,只暴露必要的数据范围。第二,不要在 Skill 或 MCP 配置中硬编码敏感密钥,尤其是数据库密码、API Token。第三,AI 生成结果存在幻觉和不确定性,涉及关键业务决策时必须人工复核。另外,如果通过 MCP 接入第三方网站或抓取他人数据,要确认是否符合平台规则和版权要求。
3. 环境准备与项目初始化
3.1 基础环境
本文的 MCP Server 示例使用 Python 实现,需要准备以下环境:
- Python 3.10 或更高版本,建议使用虚拟环境隔离依赖。
- pip 或 uv,用于安装 Python 包。
- Node.js 18+ 可选,用于运行 MCP Inspector 等调试工具。
- 一个支持 MCP 的 Agent 客户端,或用官方 Python SDK 自行编写调用端。
注意,不同 MCP SDK 版本的方法名和参数略有差异,安装时建议参考对应版本文档。以下命令是通用示例,实际路径按项目调整。
mkdir ai-agent-extension && cd ai-agent-extension python -m venv .venv # Windows .venv\Scripts\activate # Linux / macOS source .venv/bin/activate pip install "mcp[cli]"安装完成后,可以执行下面命令检查版本:
mcp --version如果提示找不到命令,通常说明安装目录没有加入 PATH,或者需要以模块方式运行:
python -m mcp --version3.2 项目目录结构
建议按下面的结构组织项目,后续维护起来更清晰:
ai-agent-extension/ ├── .venv/ ├── mcp_server.py ├── client_batch.py ├── skills/ │ └── meeting_summarizer/ │ ├── SKILL.md │ └── summarize.py ├── config/ │ └── mcp_config.json └── outputs/其中:
mcp_server.py是 MCP Server 入口。client_batch.py是批量调用示例。skills/存放自定义 Skill。config/mcp_config.json是客户端注册 MCP 用的配置。outputs/保存批量任务输出。
不要把所有文件都堆在根目录,后续模型文件、输入素材、输出结果分目录管理能少踩很多坑。
4. 创建一个最简单的 MCP Server
4.1 编写 MCP Server
以下代码使用官方 MCP Python SDK 的 FastMCP 封装,代码量最精简。它会暴露两个工具:get_weather和add。生产环境下,get_weather需要接入真实天气 API,这里用固定结果做演示。
# mcp_server.py from mcp.server.fastmcp import FastMCP mcp = FastMCP("TutorialDemo") @mcp.tool() def get_weather(city: str) -> str: """根据城市名称返回模拟天气信息。生产环境请接入真实天气 API。""" # 演示逻辑,实际开发时替换为 requests 调用 return f"{city} 天气:晴,22°C,湿度 45%,东南风 3 级" @mcp.tool() def add(a: float, b: float) -> float: """两个数字相加。""" return a + b if __name__ == "__main__": mcp.run()说明:
@mcp.tool()装饰器会把函数注册成 MCP 工具。- 函数名和 docstring 会被客户端作为工具名和说明展示,所以写得越清晰越好。
mcp.run()默认使用 stdio 传输,适合本地客户端调用;如果需要 HTTP 模式,可以查阅官方文档配置其他 transport。
4.2 启动与验证
先直接用 Python 运行,确认没有报错:
python mcp_server.py正常情况下进程会保持前台运行,等待客户端连接。但这样启动不会输出内容,适合验证语法和依赖是否正确。
更推荐使用 MCP Inspector 来做可视化调试。MCP Inspector 是官方提供的调试界面,可以列出工具、预览参数并手动调用。参考命令如下:
npx @modelcontextprotocol/inspector python mcp_server.py如果 Node 环境正常,命令执行后会在终端打印一个本地地址,打开浏览器即可看到调试界面。Inspector 中可以看到工具列表,点击单个工具输入参数,返回结果就会显示在右侧面板。
如果 Inspector 无法启动,也可以先跳过,直接在客户端中注册后验证。
5. 在主流 Agent 客户端中接入 MCP
5.1 注册 MCP 服务
以 Claude Desktop 为例,注册方式是在配置文件里增加mcpServers。配置路径因操作系统和客户端版本不同有差异,请以实际安装目录为准。核心配置内容如下:
{ "mcpServers": { "tutorial-demo": { "command": "python", "args": ["/绝对路径/mcp_server.py"], "env": {} } } }需要注意:
command必须是可执行命令的完整名称。如果 Python 在虚拟环境内,建议写虚拟环境内的 Python 绝对路径,避免找不到包。args中要使用绝对路径,否则客户端可能定位不到mcp_server.py。env用于传递环境变量,尽量保持为空或只放入安全变量。
在 Cursor 中,注册入口通常在 Settings > MCP 或通过命令行/mcp打开。界面操作和配置文件本质相同,最终都是生成类似的 MCP 配置。
5.2 调用工具并观察结果
注册成功后,重启客户端,然后在对话中自然描述你的需求。比如输入:
帮我查一下上海的天气。如果 MCP 通道正常,客户端会调用get_weather工具,并返回类似“上海 天气:晴,22°C...”的结果。注意,大模型是否自动调用工具取决于提示词和工具描述,所以工具说明一定要写清楚。你可以在提示词中显式要求“使用天气工具”。
在调试阶段,优先用 MCP Inspector 确认工具本身没问题,再进客户端集成,可以显著减少排查时间。
6. 创建和使用 Skill
6.1 Skill 目录规范
Skill 的表现形式很多,本文采用一个通用结构:每个 Skill 一个文件夹,核心是SKILL.md,可选附带脚本和参考文件。例如:
skills/ └── meeting_summarizer/ ├── SKILL.md └── summarize.pySKILL.md用于描述 Skill 的触发条件、执行步骤和输出模板。Agent 收到任务时,通过读取SKILL.md来判断是否应该启用这个 Skill。
6.2 SKILL.md 模板
下面是一个“会议摘要生成器”的 SKILL.md 示例:
--- name: meeting_summarizer description: 根据会议转写文本生成结构化摘要,包含主题、结论、待办事项和风险点。 --- # 会议摘要生成器 当用户提供会议文本时,按以下步骤处理: 1. 提取参会人和会议时间。 2. 识别会议主题和关键结论。 3. 列出待办事项,标注负责人(如果文本中有)。 4. 输出 Markdown 格式摘要,包含“会议主题”“关键结论”“待办事项”“风险提示”四个小节。 ## 示例 输入会议记录段落,输出如下格式: ## 会议主题 (一句话概括) ## 关键结论 (列出 2-4 条核心结论) ## 待办事项 - [ ] 事项描述 @负责人 ## 风险提示 (如果没有风险,写“无明显风险”)这样的 Skill 文件重点在于描述“怎么做”,而不是“为什么”。Agent 不需要理解背景,只需要按照步骤执行。越具体,输出越稳定。
如果 Skill 需要处理本地文件,可以配合一个 Python 脚本。例如summarize.py读取一份转录文本并输出 Markdown:
# summarize.py import sys def generate_summary(raw_text: str) -> str: lines = [line.strip() for line in raw_text.splitlines() if line.strip()] # 这里只是一个简单示例,实际可用大模型进一步处理 topic = lines[0] if lines else "未知" return f"## 会议主题\n{topic}\n\n## 关键结论\n- 待补充\n\n## 待办事项\n- [ ] 待补充"仅做演示,真实场景下可接入大模型 API 完成抽取。
6.3 在自研 Agent 中加载 Skill
如果你的 Agent 是自己写的,可以写一个简单的 Skill 加载器,启动时读取技能目录,把 SKILL.md 内容拼到系统提示词中。示例代码如下:
import os SKILLS_DIR = "./skills" def load_skill_prompt(skill_name: str) -> str: skill_path = os.path.join(SKILLS_DIR, skill_name, "SKILL.md") if not os.path.exists(skill_path): return "" with open(skill_path, "r", encoding="utf-8") as f: return f.read() def build_system_prompt(user_request: str) -> str: system_prompt = "你是专业 AI 助手。\n" # 按需加载技能,这里简单演示固定加载 if "会议" in user_request or "摘要" in user_request: system_prompt += "\n[技能:meeting_summarizer]\n" system_prompt += load_skill_prompt("meeting_summarizer") return system_prompt在具体 Agent 流程中,将build_system_prompt(user_request)返回的内容作为 system prompt,再让大模型生成回答,就能让 Skill 发挥作用。
不要一开始就加载所有 Skill,否则上下文会被无关提示词占满,也会增加 token 消耗,并可能干扰模型的判断。按需加载是更稳妥的做法。
7. 接口 API 与批量任务实践
MCP 除了在聊天客户端中使用,也可以直接用 SDK 编程调用,方便集成到后台服务中。
7.1 用 SDK 调用 MCP 工具
假设你已经在项目目录下创建了mcp_server.py,可以写一个客户端脚本调用工具:
# client_batch.py import asyncio from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client async def query_weather(city: str): server_params = StdioServerParameters( command="python", args=["mcp_server.py"], cwd="." ) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() result = await session.call_tool("get_weather", {"city": city}) print(f"{city} -> {result}") if __name__ == "__main__": asyncio.run(query_weather("上海"))这个脚本会启动一个 MCP Server 子进程,连接后调用工具并打印结果。如果需要在同一会话中调用多个工具,可以把async with块扩展,在块内连续调用。
7.2 批量任务与重试
批量任务的本质是循环调用工具,并处理不同的输入。下面演示一个并发调用的简化示例:
import asyncio from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client CITIES = ["北京", "上海", "广州", "深圳", "杭州"] async def call_one(session, city): result = await session.call_tool("get_weather", {"city": city}) return city, result async def main(): server_params = StdioServerParameters(command="python", args=["mcp_server.py"]) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() tasks = [call_one(session, city) for city in CITIES] results = await asyncio.gather(*tasks, return_exceptions=True) for city, res in zip(CITIES, results): if isinstance(res, Exception): print(f"{city} 调用失败: {res}") else: print(f"{city} 调用成功: {res}") if __name__ == "__main__": asyncio.run(main())注意,这里使用asyncio.gather实现并发,但并发数量不宜设置过大,否则会对本地 MCP Server 或底层 API 造成压力。更保守的做法是按顺序调用,例如for city in CITIES,每个调用间隔一段时间,特别适合外部 API 有频率限制的场景。
针对批量任务,建议增加如下措施:
- 记录每个任务的输入、输出、耗时,便于追踪。
- 对失败的调用设置重试,比如指数退避重试 3 次。
- 将成功和失败结果分开存储,避免一个异常中断整个队列。
8. 性能、资源与调优建议
MCP Server 本身是轻量进程,不依赖特定 GPU,普通 CPU 即可运行。但实际使用中,性能瓶颈往往出现在几个方面。
第一是 Token 消耗。MCP 返回的结果和 Skill 的提示词都会占用上下文窗口。如果工具返回一个超长 HTML 或日志,大模型会消耗大量 token,成本明显上升。建议在 Server 端先做截断或摘要,只返回必要字段。
第二是并发连接数。每个客户端连接都会启动一个 MCP Server 子进程,而子进程又有自己的内存占用。如果同一台机器启动几十个不同 MCP Server,内存压力会变大。实际部署时,可以复用同一个 Server 进程,或者把多个工具放进同一个 Server,而不是拆成很多小 Server。
第三是启动速度。基于 Python 的 SDK 启动时需要导入一堆依赖,首次调用可能要 2-5 秒。如果对延迟敏感,可以考虑用 Node 实现 MCP Server,或者做长驻进程。
第四是上下文中 Skill 文件过大。一个大 SKILL.md 可能几千字,每个请求都带入会显著增加 token。建议把 SKILL.md 控制在几百行以内,把详细资料拆分到附加文件,按需读取。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 客户端无法发现 MCP Server | 配置文件路径错误或服务启动失败 | 查看客户端日志;单独运行python mcp_server.py | 修正路径、检查依赖安装 |
| 工具调用返回空或报错 | MCP Server 中函数参数名称不匹配 | 在 Inspector 中手动传参测试 | 调整函数签名,保持参数名一致 |
找不到mcp包 | 安装到了错误的 Python 环境 | 检查当前虚拟环境是否激活 | 在项目虚拟环境内重新安装mcp[cli] |
| 端口冲突或连接被拒 | 多个 MCP 服务占用相同端口 | 查看端口占用列表 | 修改服务端口或使用 stdio 模式 |
| 大模型不主动调用工具 | 工具描述不够清晰 | 查看工具列表是否正常展示 | 优化 docstring,加入触发条件示例 |
| Skill 没有生效 | 系统提示词中没有注入 SKILL.md 内容 | 打印拼接后的 system prompt | 调整加载逻辑,确保调用前读取最新文件 |
| 批量任务中一部分失败 | 外部 API 限流或网络波动 | 查看错误类型和状态码 | 增加重试逻辑和调用间隔 |
| 显存或内存占用过高 | 同时启动过多 MCP Server | 查看进程列表 | 合并工具、减少连接数或不适用 GPU 场景 |
10. 最佳实践与安全建议
基于 MCP 和 Skill 构建 AI Agent 能力扩展时,建议遵循以下实践。
第一是“小步快跑”。先用一个最简单的 MCP 工具跑通链路,再逐步增加工具和技能。示例中的天气查询和加法函数是最小验证单元,能帮助确认环境、SDK、客户端配置全链路正常。
第二是“配置最小化”。MCP Server 只暴露完成任务所必需的能力。例如,只读场景不要开放写操作;数据库连接使用只读账号;文件访问限定目录。Skill 的加载也建议按需,不要全量注入。
第三是“密钥隔离”。不要在 MCP Server 代码、SKILL.md 或配置文件中写死 API Key。建议通过环境变量或密钥管理服务注入,并在日志中隐藏敏感字段。
第四是“效果复核”。MCP 和 Skill 能提升 Agent 的自主性,但生成结果仍可能出错。在自动化流程中加入人工审核环节,比如在批量任务执行前设置干跑模式,先看输出样例再全量执行。
第五是“合规授权”。如果 MCP 需要抓取外部网页、访问第三方平台数据,必须确认已获得授权,并遵守平台条款。涉及个人数据时,要脱敏并征得相关方同意。这也是内容生成类应用最容易忽视的环节。
11. 总结与下一步
MCP 和 Skill 是当前 AI Agent 能力扩展的两条主线。MCP 管工具和数据接入,Skill 管专业流程沉淀。看完这篇教程,建议你先动手跑通mcp_server.py,在 Inspector 里调用get_weather和add,然后把自定义 Skill 接入到自己的 Agent 中。整个链路只需要一个普通开发机和 Python 环境,本身没有太高门槛,容易踩的坑主要在依赖安装、路径配置和上下文管理上。
后续可以从三个方向继续深入:一是把 MCP Server 从本地工具扩展成访问真实数据库或内部 API 的服务;二是构建自己的 Skill 模板库,把工作流固化下来;三是结合批量任务脚本,把 Agent 能力接入定时任务或消息队列,形成真正的自动化生产力工具。建议先把今天的最小示例保存好,后续所有复杂能力都基于这个骨架扩展即可。