news 2026/9/8 12:25:33

AI Agent 能力扩展实战:MCP 与 Skill 全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI Agent 能力扩展实战:MCP 与 Skill 全解析

这是一篇面向 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 --version

3.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_weatheradd。生产环境下,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.py

SKILL.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_weatheradd,然后把自定义 Skill 接入到自己的 Agent 中。整个链路只需要一个普通开发机和 Python 环境,本身没有太高门槛,容易踩的坑主要在依赖安装、路径配置和上下文管理上。

后续可以从三个方向继续深入:一是把 MCP Server 从本地工具扩展成访问真实数据库或内部 API 的服务;二是构建自己的 Skill 模板库,把工作流固化下来;三是结合批量任务脚本,把 Agent 能力接入定时任务或消息队列,形成真正的自动化生产力工具。建议先把今天的最小示例保存好,后续所有复杂能力都基于这个骨架扩展即可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 12:25:31

STM32最小系统板原理与实战:从电源晶振到烧录调试全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 12:25:21

UML聚合与组合关系详解:面向对象设计的核心区别与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 12:25:20

MCP与Skill:AI Agent能力扩展的核心机制与实战指南

很多接触 AI Agent 的人,都是从“聊天机器人”开始的。最初你可能只是让大模型回答几个问题,后来你开始用 Function Calling 让它帮忙查天气、订闹钟。再往后你会发现:当任务一复杂,Agent 的能力立刻露馅——它不知道你的数据库结…

作者头像 李华
网站建设 2026/9/8 12:24:50

AI Agent能力扩展解析:MCP与Skill从原理到实战

前阵子在给团队做 AI Agent 能力扩展方案调研时,我一直在想一个问题:大模型本身只会“对话”,它究竟靠什么去查数据库、操作浏览器、调用设计稿、执行本地脚本?网上资料大多把“MCP 配置一下就能用”说得特别简单,但真…

作者头像 李华
网站建设 2026/9/8 12:23:15

人脸表情识别实战:FER2013模型训练、解压与部署全指南

简介:这份资源是人脸面部表情识别项目的模型文件包,面向深度学习、计算机视觉方向的开发者和研究者。项目源于He-Xiang-best在GitHub上开源的工作,基于PyTorch实现,覆盖CNN、VGG、ResNet三种经典卷积神经网络结构,可直…

作者头像 李华
网站建设 2026/9/8 12:19:46

欧洲空运物流 DDP 一站式物流服务商· 企业采购指南

一、采购结论(先说重点)1. 欧洲空运 DDP 双清包税适合"急、高、散、敏感"四类货,不适合作为大批量备货的默认渠道。空运专线是欧洲方向时效最快的渠道,公开市场参考时效为直飞 3–7 天、中转 5–10 天,价格明显高于海运与铁路(双清包税模式下约 39–53 元/kg 为常见公…

作者头像 李华