1. 从零跑通智能体原型:MCP 与 Agent Skills 到底解决什么问题
如果你刚开始接触大模型智能体开发,大概率会遇到这样一个尴尬局面:模型能聊天,但一让它“去查数据库”“去读本地文件”“去调用某个接口”,它就只会编。你给它写一堆提示词,它还是不知道该先做什么、后做什么。MCP 和 Agent Skills 就是来解决这个问题的。
MCP(Model Context Protocol)是一套标准化协议,负责让智能体“够得着”外部工具和数据。你可以把它理解成 USB 接口:不管外接的是键盘、鼠标还是硬盘,插口形状统一,系统就能识别。Agent Skills 则是“操作手册”,它告诉模型在什么场景下该用哪个工具、按什么顺序用、注意哪些坑。两者结合,才能让智能体从“能聊”变成“能干活”。
这篇内容面向刚入门大模型智能体开发的读者,目标很明确:给你一份可复制的 MCP 服务端配置片段、一套 Agent Skills 目录结构,以及本地启动、工具注册、调用验证的完整动作清单。你不需要先成为协议专家,跟着步骤走,就能在本地跑通一个可用的智能体原型。适合谁?适合会一点 Python、想快速看到智能体跑起来效果、不想被概念绕晕的开发者。
我试过把 MCP 和 Skills 拆开单独用,结果要么工具连上了但模型不会用,要么提示词写得很细但模型根本调不到工具。后来把两者按“连接层 + 知识层”组合起来,整个流程才顺畅。下面按实际落地顺序展开。
2. TaoToken 前置准备:MCP 服务端接入大模型 API 的配置方法
在跑通 MCP 之前,你需要一个稳定的大模型 API 入口。TaoToken 提供兼容 OpenAI 风格的接口,适合用来做智能体原型验证。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基础地址是 https://taotoken.net/api 。
先拿到 API Key。进入控制台创建密钥,路径是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=mcp_agent_skills_guide&utm_campaign=rewrite ,密钥管理页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=mcp_agent_skills_guide&utm_campaign=rewrite 。创建后复制保存,后面配置里要用到。
模型选择上,智能体场景建议用支持工具调用(function calling / tool use)的模型。你可以在模型对话页先测试模型是否正常响应: https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=mcp_agent_skills_guide&utm_campaign=rewrite 。如果只是做长期编码或 Agent 任务,可以了解 Coding Plan: https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=mcp_agent_skills_guide&utm_campaign=rewrite 。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=mcp_agent_skills_guide&utm_campaign=rewrite ,里面写了 Base URL、鉴权方式和请求示例。Claude Code 相关接入参考 https://taotoken.net/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=mcp_agent_skills_guide&utm_campaign=rewrite 。
这里要强调一个关键点:MCP 服务端本身不负责“思考”,它只负责暴露工具。真正决定调用哪个工具的是大模型。所以你的 MCP 客户端需要把工具列表传给模型,模型返回工具调用请求,客户端再执行。TaoToken 的 API 在这里扮演的就是模型推理入口。
配置时三个要素必须齐全:Base URL、API Key、Model ID。缺一个都会导致 401 或模型找不到。下面给出可直接复制的配置片段。
3. 可复制配置:MCP 服务端 JSON 与 Agent Skills 目录结构
先看 MCP 客户端配置。以常见的mcp.json或settings.json为例,路径通常放在项目根目录或用户配置目录。下面是一份可复制的 JSON 片段,把 TaoToken 作为模型提供方,同时注册一个本地 MCP 服务端:
{ "mcpServers": { "local-tools": { "command": "python", "args": ["mcp_server.py"], "env": { "TAOTOKEN_API_KEY": "你的API Key", "TAOTOKEN_BASE_URL": "https://taotoken.net/api", "TAOTOKEN_MODEL": "你的Model ID" } } }, "llm": { "provider": "openai-compatible", "base_url": "https://taotoken.net/api", "api_key": "你的API Key", "model": "你的Model ID" } }如果你用的是 TOML 格式(比如某些 CLI 工具),等价写法如下:
[llm] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "你的API Key" model = "你的Model ID" [mcp_servers.local-tools] command = "python" args = ["mcp_server.py"] [mcp_servers.local-tools.env] TAOTOKEN_API_KEY = "你的API Key" TAOTOKEN_BASE_URL = "https://taotoken.net/api" TAOTOKEN_MODEL = "你的Model ID"再看 Agent Skills 目录结构。一个规范的 Skill 就是一个文件夹,核心是SKILL.md,附加脚本和参考文档按需放置:
skills/ └── db-query-assistant/ ├── SKILL.md ├── query_runner.py ├── schema_reference.md └── examples/ └── sample_queries.mdSKILL.md的 Frontmatter 必须包含name和description,这是模型选择技能的唯一依据:
--- name: db-query-assistant description: > 将自然语言问题转换为 SQL 查询并执行,适用于员工信息、 薪资统计、部门分析等场景。当用户询问数据库相关问题时使用。 version: 1.0.0 allowed_tools: [run_sql, get_schema] --- # 数据库查询助手 ## 工作流程 1. 先调用 get_schema 获取表结构 2. 根据用户问题生成 SQL 3. 调用 run_sql 执行并返回结果 4. 对结果做简要解读 ## 注意事项 - 禁止执行 DELETE、DROP 等破坏性语句 - 查询前必须确认字段名存在MCP 服务端mcp_server.py的最小实现,暴露两个工具:
from mcp.server import Server from mcp.server.stdio import stdio_server from mcp.types import Tool, TextContent app = Server("local-tools") @app.list_tools() async def list_tools(): return [ Tool( name="get_schema", description="获取数据库表结构", inputSchema={"type": "object", "properties": {}} ), Tool( name="run_sql", description="执行只读 SQL 查询", inputSchema={ "type": "object", "properties": {"sql": {"type": "string"}}, "required": ["sql"] } ) ] @app.call_tool() async def call_tool(name, arguments): if name == "get_schema": return [TextContent(type="text", text="employees(id, name, salary, dept)")] if name == "run_sql": sql = arguments["sql"] if any(k in sql.upper() for k in ["DELETE", "DROP", "UPDATE"]): return [TextContent(type="text", text="拒绝执行破坏性语句")] return [TextContent(type="text", text=f"模拟执行: {sql}")] raise ValueError(f"未知工具: {name}") async def main(): async with stdio_server() as (read, write): await app.run(read, write, app.create_initialization_options()) if __name__ == "__main__": import asyncio asyncio.run(main())这份配置里 Base URL、API Key、Model ID 三件套齐全,MCP 服务端和 Skills 目录也对应上了。接下来启动验证。
4. 本地启动与调用验证:确认智能体真的调到了工具
先安装依赖:
pip install mcp openai启动 MCP 服务端单独测试:
python mcp_server.py如果进程没有立刻退出、也没有报错,说明 stdio 服务端在等待客户端连接。接着用客户端脚本发起一次完整调用。下面这段代码模拟“模型决定调用工具”的流程:
import asyncio from openai import OpenAI client = OpenAI( base_url="https://taotoken.net/api", api_key="你的API Key" ) tools = [ { "type": "function", "function": { "name": "get_schema", "description": "获取数据库表结构", "parameters": {"type": "object", "properties": {}} } }, { "type": "function", "function": { "name": "run_sql", "description": "执行只读 SQL 查询", "parameters": { "type": "object", "properties": {"sql": {"type": "string"}}, "required": ["sql"] } } } ] response = client.chat.completions.create( model="你的Model ID", messages=[{"role": "user", "content": "帮我查一下 employees 表里薪资最高的前 5 个人"}], tools=tools, tool_choice="auto" ) msg = response.choices[0].message if msg.tool_calls: for call in msg.tool_calls: print("模型请求调用:", call.function.name) print("参数:", call.function.arguments) else: print("模型直接回复:", msg.content)实测下来,如果配置正确,你会看到类似输出:
模型请求调用: get_schema 参数: {}或者直接请求run_sql并带上 SQL 参数。这说明模型已经根据工具描述做出了选择。接下来把工具执行结果回传给模型,让它生成最终回答:
messages = [ {"role": "user", "content": "帮我查一下 employees 表里薪资最高的前 5 个人"}, msg ] for call in msg.tool_calls: result = "模拟执行: SELECT * FROM employees ORDER BY salary DESC LIMIT 5" messages.append({ "role": "tool", "tool_call_id": call.id, "content": result }) final = client.chat.completions.create( model="你的Model ID", messages=messages ) print(final.choices[0].message.content)到这一步,一个最小可用的智能体原型就跑通了:模型负责决策,MCP 负责执行,Skills 负责告诉模型流程和边界。你可以把SKILL.md的内容作为系统提示词注入,观察模型是否按步骤先查 schema 再查数据。
5. 常见报错排查:401、local proxy failed、reading choices 怎么处理
第一个高频报错是 401 Unauthorized。原因通常是 API Key 没填、填错,或者 Base URL 写成了带路径的地址。检查base_url是否为https://taotoken.net/api,不要多加/v1或斜杠。Key 是否复制完整、有没有多余空格。如果用的是环境变量,确认变量名和代码里读取的一致。
第二个是local proxy failed或连接被拒绝。这通常出现在 MCP 客户端启动服务端时。检查command和args是否能手动执行成功。比如python mcp_server.py在终端能跑,但客户端里跑不起来,多半是工作目录不对。把args改成绝对路径,或者在配置里加cwd字段指定目录。另外确认 Python 环境里装了mcp包,虚拟环境路径要和客户端使用的一致。
第三个是reading choices相关报错,比如KeyError: 'choices'或返回结构里没有choices。这通常说明请求没有真正到达模型接口,或者返回的是错误 JSON。先打印完整响应体:
print(response.model_dump_json(indent=2))如果看到的是错误信息而不是choices,多半是 Model ID 写错、账户额度不足或请求格式不对。确认model字段和 TaoToken 控制台里可用的模型名一致。工具调用场景下,还要确认模型本身支持 function calling,否则返回里不会有tool_calls。
第四个是 OAuth 或鉴权头冲突。有些客户端会自动加Authorization头,和你手动配置的 Key 冲突。检查配置里是否重复设置了鉴权信息,保留一处即可。如果出现invalid api key但 Key 确认没错,尝试重新生成一个 Key,排除复制污染。
第五个是工具注册后模型不调用。先确认tools数组确实传给了请求,再确认工具description是否足够清晰。描述太模糊,模型会忽略。把“查询数据”改成“执行只读 SQL 查询并返回结果”,命中率会明显提升。
6. 继续深入:把原型扩展成可维护的智能体
跑通最小原型后,下一步是把 Skills 的渐进式披露用起来。初始只加载SKILL.md的 Frontmatter,等模型判断相关再读全文。这样即使你装了十几个技能,初始上下文也不会爆炸。
具体做法是在系统提示词里只放技能名称和描述列表,模型决定用哪个后,再动态读取对应SKILL.md正文。MCP 工具列表也按需加载,不要一次性把所有 schema 塞进去。
如果你要做长期编码或 Agent 任务,可以走 Coding Plan: https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=mcp_agent_skills_guide&utm_campaign=rewrite 。需要继续拿 Key 或管理额度,去 API Keys 页面: https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=mcp_agent_skills_guide&utm_campaign=rewrite 。接入细节查文档: https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=mcp_agent_skills_guide&utm_campaign=rewrite 。想先验证模型对话效果,用模型对话页: https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=mcp_agent_skills_guide&utm_campaign=rewrite 。
最后给一个实用建议:把每次工具调用的输入输出都打日志。智能体出问题时,九成能在日志里找到是模型选错工具、参数格式不对,还是服务端执行失败。日志比反复改提示词有效得多。