
AI Agent 的能力边界已经不取决于模型本身而取决于它能不能调用外部工具、能不能记住一套稳定工作流。当前做 Agent 扩展主要有两条主线MCP 和 Skill。MCP 解决的是Agent 怎么访问外部数据和工具的标准化问题Skill 解决的是Agent 怎么按固定流程完成一类任务的技能沉淀问题。这两个概念在网上讨论很多但大部分教程要么只讲概念要么只给一个配置文件缺少从零搭建、客户端接入、效果验证到批量任务的一整套可落地路径。这篇文章会把完整链路铺开先讲 MCP 与 Skill 的定位和配合方式再带读者从零写一个 MCP Server配置到主流客户端里编写并挂载 Skill最后做一次综合实战并给出接口 API 封装、批量任务设计、资源占用观察和常见问题排查清单。内容偏实践不需要特殊显卡普通开发机即可完成。1. AI Agent 能力扩展核心概念速览能力项说明核心扩展方式MCPModel Context Protocol、SkillMCP 的作用标准化地让 Agent 调用外部工具、读取外部数据、操作本地或远程服务Skill 的作用把一类任务的执行流程、提示词模板、脚本依赖封装成可复用技能是否需要 GPU不需要MCP Server 本身就是普通本地服务模型推理环节才需要 GPU 或云端 API支持的语言主要是 Python、Node.js/TypeScript也可以使用任意能实现协议的服务常见客户端Claude Desktop、Cursor、各类自研 Agent 框架批量任务可以通过封装 HTTP 接口或任务队列实现适合场景数据库查询、文件读写、网页信息抓取、设计工具联动、代码仓库操作、定时生成内容等不适合场景需要极致低延迟的实时控制或 Agent 本身不支持工具调用的场景从能力和门槛来看MCP 适合让 Agent 长出手脚的场景Skill 适合让 Agent 按固定套路干活的场景。两者并不冲突实际项目里往往搭配使用MCP 负责连接真实世界Skill 负责沉淀工作方法。2. MCP 与 Skill 的定位区别与配合方式2.1 MCP 是什么MCP全称 Model Context Protocol是一套开放协议用来定义 AI 模型与外部工具、数据源之间的交互方式。可以把 MCP 理解为 Agent 世界的 USB-C 接口外设不需要为每台电脑单独设计接口只要符合标准协议插上就能用。MCP Server 负责暴露具体能力MCP Client 负责让 Agent 发现和调用这些能力。一个典型的 MCP Server 可以做的事情包括读取本地文件目录和文件内容。执行 SQL 查询并返回结构化结果。调用外部 HTTP API 获取实时数据。连接设计软件、数据库客户端、开发工具等例如 Figma、Blender、Unity、Matlab 等工具出现的 MCP 需求本质都是想通过协议暴露各自能力。把操作结果以结构化 JSON 返回给模型。MCP 协议定义了工具调用、资源读取、提示词模板等能力点。对开发者来说最有价值的是工具调用Tools让 Agent 根据任务自动选择调用哪个工具、传什么参数。2.2 Skill 是什么Skill 是另一种能力扩展形式。它不强制使用协议而是把一个完整任务所需的提示词、操作步骤、脚本、依赖信息打包在一个目录里。当 Agent 遇到匹配的任务时会加载对应 Skill按其中定义的流程执行。Skill 更接近技能包或工作流模板。举例来说一个代码审查 Skill里面包含审查规范、检查项列表、输出报告模板。一个数学建模 Skill里面包含问题拆解步骤、常见模型选型建议、论文结构模板。一个科研 Skill里面包含文献检索策略、实验记录模板、结果分析流程。这些内容如果全部靠对话临时交代模型很容易遗漏细节写成 Skill 后Agent 每次都能按固定标准执行输出稳定性明显更高。2.3 两者的核心区别与配合对比维度MCPSkill核心定位能力接入协议工作流与技能封装解决的问题Agent 如何调用外部工具和数据Agent 如何按固定流程完成任务实现方式定义 Server、暴露工具/资源定义 Skill 目录、提示词模板、脚本依赖关系需要客户端支持协议需要 Agent 支持 Skill 加载机制典型场景查数据库、读文件、调 API代码审查、报告生成、数据处理流程实际项目中两者可以配合MCP 负责把数据库、文件系统、外部 API 接进来Skill 负责定义拿到数据之后做什么、按什么模板输出。例如一个数据分析 AgentMCP 负责执行查询和读取数据Skill 负责把结果整理成固定格式的分析报告。3. 本地环境准备与前置条件在动手之前先确认本机环境满足基本要求。这里给出一份通用检查清单具体版本号以当前官方文档为准。3.1 基础软件Python 3.10 或更高版本用于运行 MCP Server 示例。Node.js 18 或更高版本如果想把 MCP Server 用 TypeScript 编写。一个支持 MCP 的客户端例如 Claude Desktop、Cursor或者其他支持该协议的 IDE 插件。Git用于拉取项目模板和示例代码。包管理工具Python 使用 pip 或 uvNode 使用 npm 或 pnpm。3.2 模型推理环境如果 Agent 使用云端模型 API本地只需要有网络和调用密钥如果使用本地模型需要额外准备推理框架和显卡资源。本文涉及的 MCP Server 和 Skill 本身不需要 GPU模型推理环节的资源占用需根据具体模型和上下文长度实测评估。3.3 网络和端口MCP Server 如果通过 stdio 方式启动不占用 HTTP 端口如果选择 HTTP/SSE 方式启动则需要注意端口冲突。建议统一使用 127.0.0.1 作为监听地址避免把本地调试服务暴露到公网。3.4 一个最小验证目录建议把所有实验内容放在一个独立目录中结构如下agent-lab/ ├── mcp-servers/ ├── skills/ ├── configs/ ├── inputs/ └── outputs/这样测试阶段操作路径清晰后续接入批量任务时也能直接复用目录结构。4. 快速搭建第一个 MCP Server4.1 安装依赖这里使用 Python 编写 MCP Server。先创建虚拟环境并安装官方 SDKpython -m venv .venv source .venv/bin/activate # Windows 下执行 .venv\Scripts\activate pip install mcp[cli]安装完成后可以用mcp命令检查是否可用mcp --version如果命令提示不存在说明 Python 的脚本目录没有加入 PATH可以改用python -m mcp --version验证。4.2 编写一个最小 MCP Server创建一个server.py内容如下from mcp.server.fastmcp import FastMCP mcp FastMCP(demo-server) mcp.tool() def get_current_time() - str: 返回当前服务器时间格式为 YYYY-MM-DD HH:MM:SS。 from datetime import datetime return datetime.now().strftime(%Y-%m-%d %H:%M:%S) mcp.tool() def read_text_file(path: str) - str: 读取指定文本文件的内容。请确保路径是合法且已授权的文件路径。 with open(path, r, encodingutf-8) as f: return f.read() if __name__ __main__: mcp.run()这段代码定义了两个工具一个返回当前时间一个读取文本文件。mcp.run()默认以 stdio 模式启动客户端会通过标准输入输出与 Server 通信不占用 HTTP 端口。4.3 本地启动验证在终端直接运行python server.py程序启动后不会有明显的 Web 页面输出因为它等待客户端通过标准输入发送协议消息。此时可以打开另一个终端用 MCP Inspector 做交互验证mcp dev server.py该命令会启动一个本地调试面板可以在里面查看工具列表、手动调用工具、观察返回结果。这一步是验证工具是否正常最直接的方式。如果工具列表中能看到get_current_time和read_text_file说明 MCP Server 本身没有问题接下来进入客户端接入阶段。5. 在客户端中配置 MCP不同客户端配置方式略有差异核心思路一致告诉客户端 MCP Server 的启动命令和参数。5.1 Claude Desktop 配置示例打开客户端的配置文件在mcpServers字段下添加一条记录{ mcpServers: { demo-server: { command: python, args: [ /absolute/path/to/server.py ] } } }注意command字段需要填写python在当前环境中的准确路径虚拟环境下最好填写绝对路径。例如{ mcpServers: { demo-server: { command: /path/to/.venv/bin/python, args: [ /path/to/server.py ] } } }保存后重启客户端在对话中问一句现在几点如果 Agent 自动调用了get_current_time工具说明 MCP 配置生效。5.2 Cursor 配置示例在 Cursor 中打开 MCP 配置面板可以手动添加 MCP Server{ mcpServers: { demo-server: { command: python, args: [/path/to/server.py] } } }配置完成后在对话中明确说明请使用 demo-server 中的工具观察客户端是否识别到工具列表。如果客户端支持自动发现工具调用会更自然。5.3 验证思路无论使用哪个客户端都可以从三个角度判断接入是否成功工具是否出现在客户端的工具列表中。Agent 是否能在对话中主动选择调用该工具。工具返回结果是否被 Agent 正确引用并继续处理。如果工具没有出现在列表中优先检查command和args的路径是否正确以及 Server 启动时是否报错。6. Skill 的编写与挂载6.1 Skill 的基本结构一个 Skill 通常包含一个说明文件如 SKILL.md以及若干脚本、模板和资源文件。这里以代码审查为例skills/ └── code-reviewer/ ├── SKILL.md └── templates/ └── review_report.mdSKILL.md 负责描述技能功能、适用场景、执行步骤和输出模板。示例--- name: code-reviewer description: 对指定代码进行系统性审查重点检查安全、性能、可维护性并输出结构化报告。 --- # 代码审查 Skill ## 使用场景 当用户要求审查代码、查找潜在问题或改进代码质量时使用。 ## 执行步骤 1. 阅读代码确认语言和框架。 2. 按以下维度依次检查 - 安全性注入、越权、敏感信息泄露。 - 性能循环、查询次数、资源释放。 - 可维护性命名、函数长度、代码重复。 3. 输出审查报告按严重程度排序。 ## 输出模板 使用 templates/review_report.md 中的格式输出。6.2 把 Skill 挂载到 AgentSkill 的挂载方式取决于 Agent 实现。常见方式有两种文件目录挂载把 Skill 目录放到 Agent 指定的 skills 目录下Agent 启动时扫描加载。配置声明挂载在 Agent 配置文件中声明 Skill 的名称和路径。以自研 Agent 框架为例伪配置如下skills: - name: code-reviewer path: ./skills/code-reviewer enabled: true如果使用的是支持 Skill 机制的现成客户端按官方文档放进对应目录即可。6.3 验证 Skill 是否生效启动 Agent 后给出一个测试请求例如请审查一下这段 Python 代码。如果 Agent 能自动识别到 code-reviewer 技能并输出结构化审查报告说明 Skill 挂载成功。如果 Agent 没有触发 Skill可以从三个方向排查Skill 描述是否足够清晰、名称是否与实际任务匹配、Agent 是否启用了 Skill 加载功能。7. 综合实战数据库查询与报告生成这一节把 MCP 和 Skill 结合起来完成一个实际任务让 Agent 查询 SQLite 数据库中的表结构分析数据生成一份报告并保存到本地。7.1 扩展 MCP Server在原来的server.py中增加 SQLite 查询工具import sqlite3 mcp.tool() def query_sqlite(db_path: str, sql: str) - str: 在指定的 SQLite 数据库中执行只读查询返回 JSON 字符串。仅允许 SELECT 语句。 sql_clean sql.strip().lower() if not sql_clean.startswith(select): return only SELECT queries are allowed conn sqlite3.connect(ffile:{db_path}?modero, uriTrue) try: cur conn.cursor() cur.execute(sql) columns [desc[0] for desc in cur.description] rows cur.fetchall() return json.dumps({columns: columns, rows: rows}, ensure_asciiFalse, defaultstr) finally: conn.close()这样设计有两个好处强制以只读方式打开数据库避免 Agent 误操作写入数据限制只能执行 SELECT降低安全风险。7.2 准备测试数据库可以用 SQLite 命令创建一个简单的用户表CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, city TEXT, created_at TEXT ); INSERT INTO users (name, city, created_at) VALUES (Alice, Beijing, 2024-01-01), (Bob, Shanghai, 2024-02-03), (Carol, Shenzhen, 2024-03-05);7.3 编写报告生成 Skill在 skills 目录下新建>--- name:>请使用>from fastapi import FastAPI, HTTPException from pydantic import BaseModel app FastAPI() class QueryRequest(BaseModel): db_path: str sql: str app.post(/api/query) def query_endpoint(req: QueryRequest): try: result query_sqlite(req.db_path, req.sql) return {success: True, data: result} except Exception as e: raise HTTPException(status_code400, detailstr(e))启动服务uvicorn api_server:app --host 127.0.0.1 --port 8000调用示例curl -X POST http://127.0.0.1:8000/api/query \ -H Content-Type: application/json \ -d {db_path: test.db, sql: SELECT city, COUNT(*) FROM users GROUP BY city}8.2 批量任务设计批量任务的关键是可控和可恢复。建议使用输入目录加输出目录的结构把所有 SQL 查询文件放入inputs程序循环读取文件内容逐条调用接口结果写入outputs。import json import requests import pathlib input_dir pathlib.Path(./inputs) output_dir pathlib.Path(./outputs) output_dir.mkdir(exist_okTrue) url http://127.0.0.1:8000/api/query for f in sorted(input_dir.glob(*.sql)): sql f.read_text(encodingutf-8) payload {db_path: test.db, sql: sql} try: resp requests.post(url, jsonpayload, timeout30) resp.raise_for_status() out_file output_dir / f.with_suffix(.json).name out_file.write_text(json.dumps(resp.json(), ensure_asciiFalse, indent2), encodingutf-8) except Exception as e: print(f[FAIL] {f.name}: {e})批量任务要特别注意两个问题接口失败时的重试与日志记录以及数据库只读权限控制。建议每个任务都记录状态重试时跳过已完成项。9. 资源占用与性能观察MCP Server 本身是轻量进程CPU 和内存占用通常很低。真正的资源消耗发生在模型推理环节尤其是处理工具返回的大段 JSON 时。9.1 上下文长度对性能的影响Agent 每调用一次工具工具的参数和返回值都会被写入模型上下文。如果query_sqlite返回几千行数据单次调用就可能占满上下文窗口。观察点工具返回数据越大后续对话可用上下文越少。上下文超长后客户端可能报错或忽略部分内容。解决办法是让工具返回精简结果例如限制最多返回 200 行或者先查询行数再决定是否拉全量数据。9.2 工具调用次数对耗时的影响Agent 完成任务需要多次调用工具每一次调用都会增加一次模型请求。例如生成报告的过程可能需要 5 到 10 次工具调用整体耗时取决于模型响应速度和网络延迟。本地模型场景下显存和推理速度会成为瓶颈。可以采用两个优化策略将多个相关查询合并成一个工具例如获取表结构并返回行数减少往返次数。在 Skill 中明确要求 Agent 在一次工具调用中获取尽可能多的信息。9.3 如何观察占用情况使用top或任务管理器观察 MCP Server 进程的 CPU 和内存。使用客户端日志观察每次模型请求的上下文 token 用量。批量任务时观察接口响应时间和失败率必要时限制并发数避免瞬时请求过多。10. 常见问题与排查方法问题现象可能原因排查方式解决方案客户端找不到 MCP 工具Server 启动失败或 command/args 路径错误查看 MCP 面板日志检查路径改为 Python 绝对路径先单独启动 Server 确认无报错工具调用返回错误参数不合法或工具内部异常用 MCP Inspector 手动调用工具根据错误信息修正参数检查数据库路径和 SQL 语法配置 JSON 不生效配置文件格式错误或字段拼写错误检查 json 合法性使用 JSON 校验工具校验配置MCP Server 启动后端口占用使用了 HTTP/SSE 模式但端口被占用查看端口监听情况更换端口或改用 stdio 模式Agent 一直不调用某个工具工具描述不清晰或模型未识别意图检查工具 name 和 docstring优化工具描述在对话中明确要求使用对应工具工具返回数据过大查询返回了全量数据查看客户端上下文用量在工具内部限制返回行数或让 Agent 先做汇总查询批量任务中途失败接口异常或单条数据导致崩溃查看日志和失败文件增加重试机制记录失败任务跳过已完成项Skill 不触发Skill 描述与用户请求不匹配检查 SKILL.md 的描述信息调整描述增加触发关键词和适用场景说明模型不支持工具调用使用的模型没有 tool use 能力查看模型文档更换支持工具调用的模型或改用提示词工程方案本地数据被意外修改MCP 工具包含写操作检查工具实现按最小权限原则设计工具数据库优先只读11. 最佳实践与使用边界11.1 工程化建议第一次接入时先在小范围测试不要直接对接生产数据库。保留一套最小可运行配置。所有代码路径使用相对目录或统一的环境变量方便迁移。模型文件、Skill 文件、输入素材、输出结果分目录管理。批量任务必须加日志和失败重试避免中途中断后从头开始。接口服务只监听 127.0.0.1如果确实需要远程访问要增加身份认证和访问限制。11.2 安全与合规边界MCP 工具赋予 Agent 真实操作能力后权限控制非常重要。数据库工具默认只读禁止任意执行写操作。文件读写工具限定在指定目录范围内避免越权读取系统文件。涉及人脸、声音、版权素材的 Agent 应用必须获得明确授权。通过 MCP 连接设计工具、协作平台或数据库时注意账号权限最小化。输出内容商用前需要人工复核尤其是自动生成报告、代码或文案的场景。11.3 什么时候不要用 MCP 或 Skill对于简单的静态指令直接写在提示词里就够了引入 MCP 会增加维护成本。如果 Agent 模型本身不支持工具调用MCP 协议层扩展也很难发挥作用。这种场景下优先切换模型或先解决模型能力问题。12. 总结与下一步MCP 和 Skill 是目前 AI Agent 能力扩展最值得优先掌握的两套工具。MCP 让 Agent 能接入真实数据和工具Skill 让 Agent 能按固定流程产出稳定结果两者结合几乎可以覆盖大部分工程化场景。建议先做三件事第一按文章第 4 节写一个最小 MCP Server跑通工具调用第二在常用客户端里配置 MCP确认工具能被模型识别和调用第三写一个简单 Skill完成一次技能触发到结果输出的闭环验证。这三步全部跑通后再考虑封装 HTTP API 和批量任务。最容易踩的坑集中在路径配置、工具返回数据过大和 Skill 描述不匹配这三块。路径问题通过绝对路径加日志可以解决数据过大的问题靠限制返回行数解决Skill 不触发靠优化描述解决。后续想继续深入可以从三个方向扩展让 MCP Server 接入更多专业工具设计更复杂的 Skill 组合流程以及把 Agent 能力做成可调用的内部服务。这套能力和架构会在未来很长时间内持续发挥作用。