ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MCP 和 Skill 到底有什么区别?一次跟 Claude 的深夜对话把这件事聊透了

MCP 和 Skill 到底有什么区别?一次跟 Claude 的深夜对话把这件事聊透了 1. 深夜那个问题MCP 和 Skill 到底谁在干活先说我当时卡在哪。用 Claude Code 写自动化脚本有一阵子了.claude/skills/下面塞了好几个 Markdown 技能文件.mcp.json里也挂了两个 MCP Server。两边都能让 Claude 帮我干活用起来手感差不多于是脑子里冒出一个很自然的念头既然 Skill 里可以写「遇到这种情况就执行一段 Python 脚本」那 MCP 是不是纯属多余脚本什么都能干开浏览器、连数据库、发请求为什么还要多写一层 Server 包装这个问题不搞清楚配置就会乱写。我见过不少人把该做成 MCP 的东西硬塞进 Skill结果每次调用都要重新登录、重新启动进程也见过把纯提示词流程硬包成 MCP Server白白多维护几百行代码。所以这篇文章不聊概念空转直接拆职责边界再给你一套能复制进项目的配置骨架最后用日志验证调用路径到底走的是哪条。先把结论摆前面方便你对号入座MCP 是给模型用的结构化工具接口Skill 是给模型看的流程指令。一个解决「能不能稳定调到外部能力」一个解决「知不知道按什么步骤做」。两者不是替代关系是上下游关系。你一个人自用、流程固定、脚本自己熟Skill 脚本能覆盖八成场景一旦要分享给别人、要高频调用、要跨编辑器复用、要保持常驻状态MCP 那层壳就从「多余」变成「临界点」。下面按「问题场景 → 前置准备 → 可复制配置 → 验证请求 → 报错排查 → 按需分流」的顺序走每一步都给命令和文件片段你可以边看边在自己项目里落地。2. 前置准备TaoToken 接入 Claude Code 的模型与密钥在拆 MCP 和 Skill 之前得先让 Claude Code 能跑起来。Claude Code 默认走 Anthropic 官方通道但很多人在国内网络环境下配置模型端点时会遇到连通性和鉴权问题。我这边统一用 TaoToken 做模型接入层它提供 Anthropic 兼容的 API 端点Claude Code 只要改 Base URL 和 Key 就能接上MCP 和 Skill 的调试都不受影响。你需要准备三样东西一个可用的 API Key、正确的 Base URL、以及要调用的 Model ID。这三件套在 Claude Code、Cline、Codex 这类工具里是通用的缺一个都会报鉴权或模型不存在。第一步拿到 API Key。打开 TaoToken 控制台的 API Keys 页面创建https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite创建后复制那串sk-开头的密钥只显示一次丢了就重建。这里提醒一句Key 不要提交到 Git放进环境变量或者本地 settings 文件并且把该文件加进.gitignore。第二步确认 Base URL。Claude Code 走 Anthropic 协议时填https://taotoken.net/api注意这个地址后面不加 UTM 参数直接作为 API Base 使用。如果你用的是 OpenAI 兼容协议的工具端点路径可能不同以接入文档为准https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite第三步选 Model ID。Claude Code 场景下选 Anthropic 系列的模型 ID具体可用列表在模型对话页能看到也可以直接在对话里试https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite把这三样写进 Claude Code 的配置。Claude Code 读取的是用户级或项目级的settings.json环境变量方式最省事写进 shell 配置export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的密钥 export ANTHROPIC_MODEL你的模型ID写完后source ~/.zshrc或重开终端然后claude启动能正常对话就说明模型通道通了。这一步是整个调试的地基MCP 和 Skill 的日志都建立在 Claude Code 能正常发起请求之上。如果你更想用图形化方式管理多个模型端点也可以用 Coding Plan 做长期编码场景的配置https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite前置准备做完接下来才是正题MCP 和 Skill 各自怎么声明、怎么触发、日志里长什么样。3. 可复制配置settings.json 里 MCP 与 Skill 的声明骨架这一节是全文最该抄的部分。Claude Code 的扩展配置分散在几个文件里很多人搞混就是因为不知道哪个文件管哪件事。我按「项目根目录」为基准给你一套完整骨架。先看目录结构心里有个图your-project/ ├── .claude/ │ ├── settings.json # 项目级设置声明 MCP 与权限 │ └── skills/ │ └── deploy-check/ │ └── SKILL.md # 一个 Skill 就是一个 Markdown ├── .mcp.json # MCP Server 声明项目级 └── scripts/ └── upload.py # Skill 里可能调用的脚本MCP 的声明放在.mcp.json这是 Claude Code 识别 MCP Server 的标准位置。一个最小可用的 stdio 类型 Server 长这样{ mcpServers: { video-uploader: { command: python, args: [-m, mcp_server_upload], env: { UPLOAD_TOKEN: ${UPLOAD_TOKEN} } } } }字段含义command是启动进程的可执行文件args是参数env是注入给子进程的环境变量。Claude Code 启动时会拉起这个进程通过 stdio 做 JSON-RPC 通信。注意${UPLOAD_TOKEN}这种写法是从宿主环境读取不要把明文密钥写进.mcp.json。Skill 的声明不需要在 settings.json 里注册Claude Code 会自动扫描.claude/skills/下的子目录每个子目录里放一个SKILL.md。文件名固定内容就是给模型看的指令。一个部署检查 Skill 的例子--- name: deploy-check description: 部署前检查清单当用户提到部署、上线、release 时触发 --- # 部署前检查 按顺序执行以下步骤每步都要报告结果 1. 运行 git status确认没有未提交的改动 2. 运行 pytest -q确认测试全绿 3. 检查 .env 中是否包含 DEBUGtrue如果有则中止并提醒 4. 全部通过后输出「可以部署」并附上当前 commit hashdescription字段很关键Claude 靠它判断什么时候该加载这个 Skill。写得太泛会误触发写得太窄会不触发。settings.json里主要管权限和 MCP 的启用开关项目级配置示例{ permissions: { allow: [ Bash(git status), Bash(pytest:*), mcp__video-uploader__upload ], deny: [ Bash(rm -rf:*) ] }, enableAllProjectMcpServers: true }这里mcp__video-uploader__upload是 MCP 工具的权限标识格式是mcp__server名__工具名。Skill 本身不需要在这里声明权限但 Skill 里如果让 Claude 执行 Bash 命令那些命令要落在allow列表里否则会弹确认。三件套对照记一下Base URL Key Model ID管模型通道.mcp.json管外部进程.claude/skills/*/SKILL.md管流程指令。三者互不冲突可以同时生效。配置写完重启 Claude Code让它重新加载。接下来就是验证。4. 验证请求分别触发 MCP 工具与 Skill 指令看日志配置对不对不看文档看日志。这一节给你两个明确的触发动作以及日志里该出现什么。验证 MCP 调用路径。启动 Claude Code 时加调试参数让它打印 MCP 连接过程claude --mcp-debug启动后你应该看到类似输出[mcp] connecting to server: video-uploader [mcp] server video-uploader started, pid48213 [mcp] discovered tools: upload, list_videos, delete_video这三行说明 Server 进程起来了工具列表也拿到了。然后在对话里直接说「用 video-uploader 上传 ./demo.mp4」观察日志[mcp] call tool: video-uploader.upload [mcp] args: {file_path: ./demo.mp4} [mcp] result: {ok: true, url: ...}看到call tool这一行就证明走的是 MCP 通道参数是结构化 JSON没有「猜参数名」的环节。这就是 MCP 的核心价值Schema 约束让调用确定性接近满分。验证 Skill 加载路径。Skill 的触发靠语义匹配你在对话里说「帮我做部署前检查」Claude 会去匹配description。想看它到底加载了哪个 Skill用claude --verbose触发后日志里会出现[skill] matched: deploy-check (score0.87) [skill] loading .claude/skills/deploy-check/SKILL.md然后 Claude 会按 SKILL.md 里的步骤逐条执行日志里跟着出现Bash(git status)、Bash(pytest:*)这些工具调用。注意区别Skill 本身不执行任何东西它只是把一段指令注入上下文真正干活的是 Claude 随后调用的内置工具或 MCP 工具。一个能同时看到两者协作的场景。假设你的 Skill 里写「上传前先跑 upload.py 检查文件」而 upload.py 又通过 MCP 暴露成工具。触发 Skill 后日志会呈现这样的链路[skill] matched: pre-upload-check [skill] loading SKILL.md [tool] Bash(python scripts/check.py) [mcp] call tool: video-uploader.upload [mcp] result: {ok: true}这条链路把职责边界展示得很清楚Skill 负责「先检查再上传」这个流程编排MCP 负责「上传」这个具体动作的稳定执行。Skill 是导演MCP 是演员。导演知道戏怎么走但真正上台动手的是演员。验证通过后你对自己项目里每个扩展走哪条路就心里有数了。接下来处理踩坑。5. 常见报错排查401、local proxy failed 与 reading choices配置阶段最容易撞的几类错误我按真实日志对照给你排查路径。401 Unauthorized。日志长这样API Error: 401 {error:{type:authentication_error,message:invalid x-api-key}}原因通常是 Key 没生效或写错位置。检查顺序先echo $ANTHROPIC_API_KEY确认环境变量真的导出了再确认 Claude Code 读的是哪个 settings 文件用户级和项目级可能互相覆盖最后确认 Key 没有多余空格或换行。如果用的是 TaoToken 的 Key去控制台确认这个 Key 没被删除或禁用。重新导出后必须重开终端source有时对已启动的进程无效。local proxy failed。日志Error: local proxy failed to start: listen tcp 127.0.0.1:xxxx: bind: address already in use这是本地端口被占用常见于上一次 Claude Code 没退干净或者别的工具占了同一个端口。处理办法lsof -i :端口号找到进程 kill 掉或者改配置换端口。如果你在 settings 里配了自定义代理端口确认没有和系统里其他服务冲突。这类错误和网络通道无关纯粹是本地资源争用。reading choices 相关报错。日志Error: reading choices - undefined (reading choices)这个报错通常出现在用 OpenAI 兼容协议的工具里但实际请求打到了 Anthropic 协议的端点返回结构对不上。根因是协议不匹配Anthropic 返回的是content数组OpenAI 返回的是choices数组。检查你的 Base URL 和工具要求的协议是否一致。Claude Code 走 Anthropic 协议Base URL 用https://taotoken.net/api如果你在 Cline 这类工具里选了 OpenAI 兼容模式端点路径要按接入文档改。协议选错返回体解析必然失败。OAuth 相关报错。日志Error: OAuth token expired, please re-authenticate如果你用的是需要 OAuth 的 MCP Server比如某些云服务官方 Servertoken 过期就会这样。处理方式是重新走一遍该 Server 的授权流程或者改用 API Key 鉴权的 Server。注意区分模型通道的鉴权和 MCP Server 自己的鉴权是两套401 可能来自任意一层看报错里的 URL 判断是哪层。MCP Server 起不来但没报错。日志里只有connecting没有started。多半是command路径不对或者 Python 模块没装。手动跑一遍.mcp.json里的命令python -m mcp_server_upload看它报什么。手动能跑通Claude Code 里跑不通就是环境变量没传进去检查env字段。Skill 不触发。日志里没有[skill] matched。检查SKILL.md的description是否覆盖了你的说法以及文件路径是否是.claude/skills/名字/SKILL.md。目录层级错一层就扫不到。排查完这些你的配置基本就稳了。最后说下不同场景该往哪条路走。6. 按场景分流什么时候用 Skill什么时候上 MCP回到最初那个问题。我实测下来的判断标准很简单看四个维度。分享范围。只有你自己用Skill 脚本够。要分享给团队甚至公开发布上 MCP。因为 Skill 依赖 Claude 去「理解」你的脚本怎么调每个人理解可能有偏差MCP 的 Schema 是机器读的一百个人调同一套接口参数不会错。调用频率。一天调几次脚本启动开销无所谓。一天调几百次MCP 的常驻进程优势就出来了。脚本方案每次都要冷启动、重新登录、重新初始化20 次调用就是 20 次登录MCP Server 启动一次登录态留在内存后续都是毫秒级函数调用。跨工具复用。只在 Claude Code 里用Skill 没问题。要在 Claude Desktop、Cursor、其他支持 MCP 的编辑器里共用同一套能力必须 MCP。Skill 是 Claude Code 专属格式别的工具不认。状态保持。需要数据库连接池、常驻浏览器窗口、WebSocket 长连接这些 Skill 做不到因为 Skill 只是注入上下文没有独立进程。MCP Server 是独立进程想常驻什么就常驻什么。把这四条套到你的场景上答案基本就出来了。个人自用、低频、单工具、无状态Skill 脚本覆盖八成需求别为了那 10% 到 20% 的稳定性提升去多写一层 Server 包装。但一旦命中「多人、高频、跨工具、要状态」任意一条MCP 那层壳就不是多余是临界点。如果你打算把 MCP 能力长期跑在编码和 Agent 场景里可以用 Coding Plan 统一管理模型端点和调用配额https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite需要新建或轮换 API Key 时走这里https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite配置细节和协议差异查接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite想先在对话里试模型 ID 和返回结构用模型对话页https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewrite最后留一个我踩过的坑别在 Skill 里写「如果脚本失败就重试三次」这种逻辑去替代 MCP 的稳定性。重试解决的是偶发失败解决不了「参数猜错」这种系统性不确定。该上 Schema 的地方重试一百次也还是猜。把流程编排交给 Skill把确定性执行交给 MCP各司其职日志里那条调用链路会告诉你分工对不对。
返回列表