)
1. 从 MCP 到 SkillsLLM 工具链到底在解决什么问题如果你刚开始接触大模型应用开发大概率会被一堆名词砸晕Function Calling、MCP、Agent、Skills、AGENTS.md……每个词单独看都能理解串在一起就不知道它们之间是什么关系了。这一节我想先把这条演进脉络讲清楚让你知道每个机制诞生的背景和它要解决的具体痛点后面再动手配置就不会觉得是在抄一段看不懂的 JSON。先说最基础的问题大模型本身只会输出文本。你问它“今天北京天气怎么样”它没法真的去查天气只能根据训练数据编一个听起来合理的答案。要让模型真正“做事”就必须给它接上外部工具——查数据库、调接口、读写文件、执行命令。早期大家用的是 Function Calling也就是在请求里把可用函数的定义名字、参数、描述一起发给模型模型决定调用哪个、传什么参数你的代码负责执行再把结果塞回对话。这个机制能用但每接一个新工具就要改一次代码工具定义散落在各个项目里没法复用。MCPModel Context Protocol就是在这个背景下被提出来的。它想做的事情是把“模型怎么发现和调用工具”这件事标准化。你写一个 MCP Server声明自己提供哪些工具、每个工具需要什么参数任何支持 MCP 的客户端Claude Desktop、Cline、各种 IDE 插件都能连上来用。听起来很美好但实际用起来问题不少。最典型的就是上下文爆炸假设你接了 5 个 MCP Server每个 Server 暴露 20 个工具那就是 100 个工具定义要一次性塞进上下文。这些定义本身就占掉大量 token留给真正对话的空间被严重挤压。而且很多工具这次对话根本用不上却每次都要加载。Skills 的思路完全不同。它不再要求模型“预先知道所有工具”而是把专业知识和操作流程打包成文件系统里的一个文件夹。模型需要做什么就去读对应的 SKILL.md里面用自然语言写清楚步骤、注意事项、可以调用哪些脚本。需要执行具体操作时模型写代码bash、python、node去跑而不是通过一个标准化的工具调用协议。这样做的好处是上下文里只加载当前任务相关的技能不会一次性把所有能力都塞进来技能本身是文件可以用 git 管理、可以分享、可以嵌套引用。用一个类比来理解MCP 像是给模型配了一套标准化的遥控器每个按钮对应一个功能但遥控器上按钮太多就按不过来Skills 像是给模型一本操作手册加一个工具箱手册告诉它遇到什么情况该翻到哪一页、用哪个工具工具本身是通用的代码执行不需要为每个功能单独做一个按钮。两者不是替代关系。在单机环境、个人开发、任务相对固定的场景下Skills 更轻量、更灵活。但到了商业环境你需要对接第三方服务、需要标准化的鉴权和审计、需要跨团队复用同一套接口定义MCP 仍然是更合适的选择。Anthropic 自己的文档里也明确说 Skills 和 MCP 是互补的Skills 负责“怎么做”的流程知识MCP 负责“连什么”的服务接入。对于小白程序员来说我的建议是先理解两者各自解决什么问题然后从实际需求出发选择。如果你只是想让自己本地的 AI 编程助手更懂你的项目规范写一个 AGENTS.md 或者一个简单的 Skill 就够了。如果你要对接公司内部的服务、要让多个不同的 AI 客户端都能用同一套工具那就需要认真设计 MCP Server。下面几节我会带你实际配置一遍把两种方式都跑通。2. TaoToken 统一 Key/API 通道的前置准备在动手配置 MCP 和 Skills 之前有一个绕不开的问题你得先有一个能稳定调用的模型 API。不管你是用 Claude Code、Cline 还是自己写脚本背后都需要一个 API 端点和一个 Key。很多教程会假设你已经有了某个厂商的账号但实际情况是不同模型的接入方式、计费方式、可用性都不一样来回切换很麻烦。TaoToken 做的事情就是提供一个统一的 API 通道。你注册之后拿到一个 Key就可以通过同一个 Base URL 调用不同的模型不用为每个模型单独维护一套配置。对于需要频繁切换模型做对比、或者在一个项目里同时用多个模型的场景这个方式能省掉不少重复配置的工作。先明确几个关键信息后面配置会反复用到项目值官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endAPI Base URLhttps://taotoken.net/api模型对话入口https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewriteCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite拿到 Key 之后你需要知道怎么在代码里用它。TaoToken 的 API 兼容 OpenAI 的接口格式这意味着绝大多数支持 OpenAI SDK 的工具和框架都可以直接接入只需要改 Base URL 和 Key。比如用 Python 的 openai 库from openai import OpenAI client OpenAI( api_key你的TaoToken Key, base_urlhttps://taotoken.net/api ) response client.chat.completions.create( modelclaude-sonnet-4-20250514, messages[ {role: user, content: 用一句话解释什么是 MCP} ] ) print(response.choices[0].message.content)这段代码里唯一需要改的就是 api_key 和 base_urlmodel 参数填你想用的模型 ID。如果你用的是其他语言或者工具只要它支持自定义 OpenAI 兼容端点配置方式都一样。有一点需要提醒不要把 Key 硬编码在代码里提交到 git。推荐用环境变量export TAOTOKEN_API_KEY你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api然后在代码里读环境变量。这样本地开发和部署到服务器都能用同一套代码只是环境变量不同。如果你用的是 Claude Code 这类命令行工具它有自己的配置文件。Claude Code 的配置通常在~/.claude/settings.json或者项目根目录的.claude/settings.json。你需要设置的是 API 端点和 Key。具体配置方式在下一节会给出完整片段。另外如果你打算长期用 AI 辅助编码可以了解一下 Coding Plan。它和按量计费的 API Key 是两种不同的使用方式适合不同的场景。按量计费适合调用量不稳定、需要精细控制成本的场景Coding Plan 适合每天都有大量编码辅助需求、希望成本更可预测的场景。具体选哪个可以到控制台看一下当前的用量和计费方式再决定。准备工作到这里就差不多了。核心就是三样东西一个 Key、一个 Base URL、一个你想用的模型 ID。后面不管是配 MCP 还是配 Skills都是围绕这三样东西展开。3. 可复制配置MCP Server 与 Skills 的完整片段这一节给出可以直接复制使用的配置片段。我会分别给出 MCP 和 Skills 的配置方式你可以根据自己的工具选择对应的部分。所有配置里的 Key 和 Base URL 都替换成你自己的。3.1 Claude Code 的 settings.json 配置Claude Code 是目前对 Skills 支持最完整的工具之一。它的配置文件在~/.claude/settings.json全局或项目根目录的.claude/settings.json项目级。项目级配置会覆盖全局配置推荐把项目相关的配置放在项目里方便团队共享。{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: 你的TaoToken Key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 }, permissions: { allow: [ Bash(git status), Bash(git diff:*), Bash(npm run test:*), Read ] } }这里三个关键字段ANTHROPIC_BASE_URL指向 TaoToken 的 API 地址ANTHROPIC_API_KEY填你的 KeyANTHROPIC_MODEL指定默认使用的模型。permissions 字段控制 Claude Code 可以自动执行哪些操作不需要每次确认。刚开始用的时候建议把权限收紧一些只放开你确定安全的命令后面熟悉了再逐步放宽。3.2 Cline 的 MCP 配置Cline 是 VS Code 里的一个 AI 编程插件支持 MCP。它的 MCP 配置在 VS Code 的 settings.json 里路径是.vscode/settings.json或者用户级的 settings。{ cline.mcpServers: { filesystem: { command: npx, args: [ -y, modelcontextprotocol/server-filesystem, /Users/你的用户名/projects ] }, taotoken-bridge: { command: npx, args: [ -y, taotoken/mcp-bridge ], env: { TAOTOKEN_API_KEY: 你的TaoToken Key, TAOTOKEN_BASE_URL: https://taotoken.net/api } } } }这个配置里定义了两个 MCP Server一个是官方的 filesystem server让模型可以读写指定目录下的文件另一个是 TaoToken 的 bridge用来把 MCP 请求转发到 TaoToken 的 API。注意 filesystem server 的 args 里要填你实际的项目路径不要直接复制我的路径。3.3 Codex 的 auth.json 配置如果你用的是 Codex 或者类似的工具配置方式又不一样。Codex 通常读~/.codex/auth.json{ openai_api_key: 你的TaoToken Key, api_base: https://taotoken.net/api, model: claude-sonnet-4-20250514 }这个文件里三个字段分别对应 Key、Base URL 和模型 ID。Codex 的配置相对简单因为它本身的功能比较聚焦。3.4 Skills 的目录结构Skills 的配置方式和 MCP 完全不同。它不是写在一个 JSON 文件里而是在文件系统里创建一个目录结构。一个典型的 Skill 长这样.claude/skills/ └── code-review/ ├── SKILL.md ├── scripts/ │ └── check_style.py └── references/ └── style-guide.mdSKILL.md是这个技能的主文件里面用自然语言描述这个技能是做什么的、什么时候用、怎么用。比如一个代码审查技能的 SKILL.md 可能长这样--- name: code-review description: 对当前项目的代码变更进行审查检查代码风格、潜在 bug 和安全隐患 --- # 代码审查技能 ## 何时使用 当用户要求审查代码、检查 PR、或者提到帮我看看这段代码时使用。 ## 步骤 1. 先用 git diff 查看当前未提交的变更 2. 读取 references/style-guide.md 了解项目的代码规范 3. 对每个变更文件检查以下方面 - 命名是否符合规范 - 是否有明显的逻辑错误 - 是否有硬编码的密钥或敏感信息 - 错误处理是否完整 4. 运行 scripts/check_style.py 做自动化检查 5. 汇总问题并按严重程度排序输出 ## 注意事项 - 不要自动修改代码只输出审查意见 - 如果变更超过 500 行先询问用户是否要分批审查这个文件的关键在于它用自然语言写清楚了流程模型读到之后就知道该怎么执行。scripts 目录里放可执行的脚本references 目录里放参考文档。模型在执行过程中可以按需读取这些文件而不是一次性全部加载。3.5 AGENTS.md 的写法AGENTS.md 是比 Skill 更轻量的一种方式适合放项目级的通用规范。它放在项目根目录所有支持这个约定的工具都会自动读取。# 项目开发规范 ## 代码风格 - Python 使用 black 格式化行宽 88 - JavaScript 使用 prettier配置见 .prettierrc - 所有公开函数必须有 docstring ## 提交规范 - commit message 使用 conventional commits 格式 - 每个 PR 必须关联一个 issue ## 测试要求 - 新增功能必须有单元测试 - 测试覆盖率不低于 80% ## 禁止事项 - 不要在代码里硬编码任何密钥 - 不要直接修改 main 分支 - 不要跳过 pre-commit hookAGENTS.md 的好处是简单直接不需要理解任何协议。坏处是它只能放静态的规范文本没法像 Skill 那样包含可执行脚本和复杂的流程控制。配置片段到这里就齐了。你可以根据自己的工具选择对应的部分先把最基本的跑通再逐步加复杂度。4. 验证请求从本地跑通一次完整调用配置写完之后最重要的一步是验证它真的能工作。这一节我会带你从最简单的 API 调用开始逐步验证到 MCP 和 Skills 是否生效。每一步都有明确的预期结果如果哪一步不对可以对照下一节的排查清单。4.1 验证 API Key 和 Base URL先用 curl 做最基础的验证确认 Key 和 Base URL 是通的curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer 你的TaoToken Key \ -d { model: claude-sonnet-4-20250514, messages: [ {role: user, content: 回复一个字好} ], max_tokens: 10 }如果配置正确你会收到一个 JSON 响应里面 choices[0].message.content 应该是“好”或者类似的简短回复。如果返回 401说明 Key 不对如果返回 404说明 Base URL 或者路径不对如果返回 model not found说明模型 ID 写错了。这一步看起来简单但能排除掉大部分基础配置问题。很多人后面遇到的各种奇怪报错根源都是 Key 或者 Base URL 没配对。4.2 验证 Python SDK 调用curl 通了之后再用 Python SDK 验证一遍因为后面写代码主要用 SDKimport os from openai import OpenAI client OpenAI( api_keyos.environ.get(TAOTOKEN_API_KEY), base_urlos.environ.get(TAOTOKEN_BASE_URL, https://taotoken.net/api) ) try: response client.chat.completions.create( modelclaude-sonnet-4-20250514, messages[{role: user, content: 用一句话说明你是什么模型}], max_tokens100 ) print(调用成功) print(模型回复, response.choices[0].message.content) print(消耗 token, response.usage.total_tokens) except Exception as e: print(调用失败, str(e))预期输出是模型的一句话自我介绍以及本次调用的 token 消耗。如果这里报错先检查环境变量有没有正确设置。在终端里echo $TAOTOKEN_API_KEY看看能不能打印出你的 Key。4.3 验证 Claude Code 是否读到配置如果你配了 Claude Code打开终端进入一个项目目录运行claude --version确认版本没问题之后直接运行claude进入交互模式然后输入/status这个命令会显示当前使用的 API 端点、模型和认证状态。如果显示的是你配置的 TaoToken 地址和模型 ID说明配置生效了。如果显示的还是默认的 Anthropic 地址说明 settings.json 没有被正确读取检查一下文件路径和 JSON 格式。4.4 验证 MCP Server 是否启动对于 Cline 的 MCP 配置在 VS Code 里打开 Cline 面板应该能看到 MCP Servers 的状态指示。如果配置正确filesystem server 会显示为绿色已连接。点击它可以查看这个 server 提供了哪些工具。你也可以在 Cline 的对话里直接问“你现在有哪些可用的 MCP 工具”如果配置生效模型会列出 filesystem server 提供的工具比如 read_file、write_file、list_directory 等。4.5 验证 Skill 是否被识别对于 Skills验证方式取决于你用的工具。以 Claude Code 为例在项目目录下运行claude然后输入/skills如果 Skill 配置正确会列出当前可用的技能。你应该能看到.claude/skills/目录下定义的技能名称。如果没有显示检查一下 SKILL.md 的 frontmatter 格式是否正确特别是 name 和 description 字段。然后可以实际触发一次技能。比如你定义了一个 code-review 技能可以输入帮我审查一下当前的代码变更观察 Claude Code 是否按照 SKILL.md 里定义的步骤执行先跑 git diff再读 style-guide.md然后运行检查脚本。如果它跳过了某些步骤说明 SKILL.md 里的描述不够明确需要调整措辞。4.6 验证 AGENTS.md 是否生效AGENTS.md 的验证最简单在项目里问一个和规范相关的问题。比如你的 AGENTS.md 里写了“Python 使用 black 格式化行宽 88”那就问这个项目的 Python 代码用什么格式化工具行宽是多少如果模型回答 black 和 88说明 AGENTS.md 被正确读取了。如果回答不知道或者给了错误答案检查文件是否在项目根目录、文件名是否大小写正确有些工具要求全大写 AGENTS.md。走完这六步验证你应该对整套配置是否生效有了清晰的判断。任何一步失败都不要跳过因为后面的步骤依赖前面的基础。下一节我会列出常见的报错和对应的解决方法。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth配置过程中遇到报错是正常的关键是要能快速定位问题出在哪一层。这一节我整理了四类最常见的错误每一类都给出具体的报错信息和排查步骤。5.1 401 Unauthorized报错长这样Error code: 401 - {error: {message: Invalid API key provided, type: invalid_request_error}}这是最常见的一类错误原因通常有三个第一Key 本身不对。可能是复制的时候多了空格、少了字符或者 Key 已经过期被撤销了。到控制台的 API Keys 页面重新生成一个然后完整复制粘贴。注意不要手动输入 Key一定要复制。第二Key 没有正确传递。如果你用环境变量检查变量名是否和代码里读的一致。比如代码里读的是TAOTOKEN_API_KEY但你设置的是TAOTOKEN_KEY那就读不到。在终端里env | grep -i taotoken确认一下。第三Authorization header 格式不对。正确的格式是Bearer 你的KeyBearer 和 Key 之间有一个空格。如果你用 SDKSDK 会自动处理这个格式不用手动拼。如果你是手写 HTTP 请求检查一下 header 有没有拼错。排查顺序先用 curl 直接测试排除代码问题curl 通了再检查代码里的读取逻辑。5.2 local proxy failed报错长这样Error: local proxy failed: dial tcp 127.0.0.1:7890: connect: connection refused这个错误说明你的工具在尝试通过本地代理访问网络但代理没有运行。常见于之前配置过代理、后来代理关掉了但环境变量还留着的情况。检查环境变量里有没有HTTP_PROXY、HTTPS_PROXY、ALL_PROXY这些设置env | grep -i proxy如果有而且指向一个已经不存在的本地端口把它们清掉unset HTTP_PROXY unset HTTPS_PROXY unset ALL_PROXY然后重新运行你的命令。如果是在 IDE 里可能需要在 IDE 的设置里关掉代理配置。VS Code 的话检查http.proxy设置项。5.3 reading choices 相关报错报错长这样KeyError: choices或者TypeError: NoneType object is not subscriptable这个错误说明 API 返回的响应里没有 choices 字段通常是因为请求本身失败了但代码没有检查错误就直接去读 choices。根本原因可能是前面几种错误之一只是被这个报错掩盖了。正确的做法是在读 choices 之前先检查响应response client.chat.completions.create(...) if response.choices: print(response.choices[0].message.content) else: print(响应中没有 choices完整响应, response)更好的方式是用 try-except 捕获异常把完整的错误信息打印出来try: response client.chat.completions.create(...) print(response.choices[0].message.content) except Exception as e: print(f请求失败{type(e).__name__}: {e})这样你能看到真正的错误原因而不是被表面的 KeyError 误导。5.4 OAuth 相关报错报错长这样Error: OAuth authentication failed: invalid_client或者Error: redirect_uri_mismatch这类错误通常出现在你尝试用 OAuth 方式登录某个服务的时候。如果你用的是 API Key 方式一般不会遇到。但有些工具默认走 OAuth 流程需要你在配置里显式指定用 API Key。以 Claude Code 为例如果你看到 OAuth 相关的报错检查 settings.json 里有没有正确设置ANTHROPIC_API_KEY。如果这个字段为空Claude Code 可能会尝试走 OAuth 流程。确保 Key 字段有值并且格式正确。另外有些工具会缓存之前的认证状态。如果你之前用 OAuth 登录过后来改成 API Key可能需要清除缓存。Claude Code 的缓存通常在~/.claude/目录下可以尝试删除credentials.json之类的文件让它重新读取配置。5.5 MCP Server 启动失败报错长这样MCP server filesystem failed to start: spawn npx ENOENT这个错误说明系统找不到 npx 命令。npx 是 Node.js 自带的包执行工具出现这个错误说明 Node.js 没有安装或者没有加到 PATH 里。检查 Node.js 是否安装node --version npm --version npx --version如果任何一个命令报 command not found就需要先安装 Node.js。安装完成之后重启终端和 IDE让 PATH 更新生效。如果 Node.js 已经装了但还是报这个错可能是 IDE 的环境变量和终端不一致。在 VS Code 里可以尝试在 settings.json 里指定 npx 的完整路径{ cline.mcpServers: { filesystem: { command: /usr/local/bin/npx, args: [-y, modelcontextprotocol/server-filesystem, /path/to/project] } } }用which npx找到实际路径替换上去。5.6 Skill 不生效如果你定义了 Skill 但模型没有按预期使用它先检查 SKILL.md 的 frontmatter--- name: code-review description: 对当前项目的代码变更进行审查 ---name 和 description 是必须的而且 description 要写清楚“什么时候用这个技能”。如果 description 写得太模糊模型可能不知道什么时候该调用它。比如写成“代码相关”就不如“当用户要求审查代码、检查 PR 时使用”来得明确。另外检查目录结构。Skill 必须放在工具指定的目录下比如 Claude Code 是.claude/skills/每个技能一个子目录子目录里必须有 SKILL.md。目录名和 name 字段最好保持一致避免混淆。如果还是不行在对话里直接问模型“你有没有看到 code-review 这个技能”根据它的回答判断是技能没被加载还是加载了但模型没有触发。前者是配置问题后者是 description 措辞问题。6. 长期编码与 Agent 场景的接入建议把 MCP 和 Skills 跑通之后接下来要考虑的是怎么在长期项目里用好它们。这一节分享一些实际使用中的经验和建议帮你少走弯路。先说模型选择。不同的模型在代码任务上的表现差异很大。有些模型擅长生成代码有些擅长理解大型代码库有些在长上下文里表现更稳定。如果你做的是日常编码辅助可以先用一个综合能力强的模型作为默认如果遇到特别复杂的重构或者架构设计再切换到推理能力更强的模型。TaoToken 的好处是你可以在同一个 Key 下切换模型不用为每个模型单独配置。在控制台里可以看到各个模型的调用量和消耗根据实际数据调整默认模型。再说 Skills 的组织方式。刚开始不要贪多先写一两个最常用的技能。比如你的项目有特定的代码规范就写一个 code-review 技能你经常需要查数据库就写一个 database-query 技能。每个技能都要有明确的触发条件和步骤不要写得太泛。一个“什么都能做”的技能等于什么都没做。技能之间可以互相引用。比如一个“发布新版本”的技能可以在步骤里引用“运行测试”技能和“更新 changelog”技能。这样你把复杂的流程拆成可复用的模块维护起来也方便。但注意不要嵌套太深三层以上就容易混乱了。对于 MCP我的建议是只在必要时使用。MCP 适合对接外部服务、需要标准化鉴权的场景。如果你只是想让模型读写本地文件、执行本地命令Skills 加代码执行就够了不需要额外跑一个 MCP Server。每多一个 Server 就多一份维护成本和出错概率。关于成本控制有几个实用的做法。第一在 Skills 里明确写清楚什么时候不需要读取参考文档避免模型每次都把所有文件读一遍。第二MCP Server 的工具定义尽量精简不需要的工具不要暴露。第三定期到控制台看用量如果发现某个模型或者某个技能消耗异常及时调整。如果你每天都有大量的编码辅助需求可以了解一下 Coding Plan。它和按量计费的 API Key 是两种不同的模式适合不同的使用强度。按量计费适合调用量波动大、需要精细控制的情况Coding Plan 适合每天都有稳定需求、希望成本可预测的情况。具体选哪个可以到控制台看一下自己的历史用量再决定。最后说一个容易被忽略的点版本管理。你的 Skills 目录、AGENTS.md、MCP 配置都应该纳入 git 管理。这样团队成员可以共享同一套配置新人入职不用从头配一遍。但注意不要把 Key 提交到仓库里用环境变量或者单独的本地配置文件来存 Key在 .gitignore 里排除掉。实际用下来这套组合最舒服的地方在于Skills 让模型懂你的项目规范MCP 让模型能连外部服务统一的 API 通道让你不用为每个模型单独折腾配置。三者配合起来日常编码的效率提升是实实在在的。刚开始配置可能会花点时间但一次配好之后后面就是持续受益。如果你在配置过程中遇到这篇没覆盖到的问题可以到接入文档里查一下或者在模型对话里直接问。文档地址是 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite API Keys 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。先把最简单的 curl 调通再一步步往上加遇到报错对照第五节的排查清单大部分问题都能自己解决。