资讯动态

MCP与Skill:大模型工具调用与技能编排入门指南

发布时间:2026/10/24 2:46:01 来源:尧图企业网站定制
如果你只会写几行 Python却最近总被群里的“老法师”用 MCP、Skill 这些词刷屏那么这篇就是写给你的。大模型本身的能力差距正在缩小真正决定一个程序好不好用的往往是怎么让模型和现有系统“握手”。MCP 和 Skill 就是这套握手规范里最核心的两个概念。这篇文章不搞术语轰炸只讲人话MCP 到底是什么、Skill 到底解决什么问题、小白该怎么动手跑通一个最小可用的 Demo以及你会碰到的几个典型坑。看完你至少能回答两个问题别人说“接了一个 MCP Server”时在说什么别人说“给 Agent 配了一个 Skill”时又是在说什么。1. 先搞懂为什么大模型应用需要 MCP 和 Skill1.1 大模型的能力边界很多刚入门的程序员有个误解以为大模型是万能的。实际上它本质上是一个非常擅长“续写文本”的系统。你问它一个问题它生成的答案是来自训练时见过的统计规律并不是真的联网查到了最新数据也不具备操作外部系统的能力。换句话说模型知道很多知识但它“手脚不全”。它没法替你打开本地的 Excel、查数据库里的订单、给内部通讯工具发一条消息也没法直接调用你们公司内部系统的接口。那怎么办过去大家做的方案是“硬编码”。比如检测到用户说“查询天气”就在代码里写死一个函数去请求天气 API再把结果塞回对话里。这种方式在只有一个工具时还行但当你接十个、几十个工具时问题就来了每个工具的鉴权方式不一样、参数格式不一样、返回值类型不一样你不得不在业务代码里写一堆 if/else。更麻烦的是每换一个大模型可能又要重新写一套调用逻辑。总之整个链路又脆又难维护。这时候出现了两个关键概念。一个叫 MCP它想解决工具连接方式的标准化问题另一个叫 Skill它想解决“模型怎么用这些工具完成复杂任务”的流程化问题。你可以这样理解MCP 是“通道”Skill 是“打法”。通道负责把工具安全地送到模型手边打法负责把零散工具编排成一整套可复用的操作流程。1.2 为什么要从“小白”的视角去理解它们如果你是资深后端看到 MCP 第一反应可能是去读协议规范但大多数刚接触 AI 应用开发的同学更需要先建立一个正确的心智模型。我见过太多人一上来就去啃几十页的协议文档结果越看越晕最后连一个工具都没跑通。我的建议是先用生活化的类比抓住主干再跑一个最小 Demo 验证理解最后回头补细节。打个比方。MCP 就像电脑上的 USB-C 接口。以前每个设备都要自己设计一个专属接口鼠标用圆口、键盘用方口、显示器用专用视频线现在很多设备统一到 USB-C 之后一个充电器能充所有设备一个读卡器能接所有相机。MCP 就是想给“大模型 外部工具”的组合打造一个通用的 USB-C 标准。Skill 则更像手机里的“快捷指令”或者“自动化流程”。有了底层接口还不够你还得告诉设备先做哪一步、再做哪一步、遇到异常怎么办。Skill 打包的正是这套“操作手册”。它把触发条件、执行步骤、需要调用的工具、失败兜底都装进一个文件让一个复杂业务场景可以反复调用。这就是为什么很多 AI Agent 项目会把 Skill 当成核心资产来管理。2. 深入理解 MCP模型与工具之间的“标准插座”2.1 从一次典型的工具调用说起我们先看一个最简单的场景用户问“现在几点”。传统做法里前端把这句话传给模型模型如果足够聪明会回复“我无法获取当前时间”。要想让它真的知道时间你就得在请求前后加一层逻辑先用正则或意图分类判断用户是不是在问时间然后调用系统时间接口再把结果拼接成一句话返回给模型。MCP 出现之后流程变成了这样模型看到用户的问题发现自己的知识里没有“当前时间”这个信息于是它在上下文中检查有没有可用的工具。如果发现一个名为get_server_time的工具就会生成一个“调用该工具”的特殊请求。这个请求交给 MCP 的 Client再转发给对应的 MCP ServerServer 执行后把结果原路返回。模型拿到时间文本后再组织成自然语言回答用户。关键点在于“有哪些工具可用”和“怎么调用工具”都是标准化的。MCP 定义了核心的两类方法tools/list用于让模型侧发现可用工具tools/call用于实际执行工具。你不需要再为每个工具写一套私有协议只要让 Server 端实现这些标准方法即可。2.2 三个关键角色Host、Client、Server理解 MCP 的架构只需要记住三个角色。角色作用生活类比Host运行模型的应用程序比如你的聊天机器人、IDE 插件或自动化脚本旅行者本人ClientHost 内部负责与 MCP Server 通信的组件翻译/秘书Server实际执行工具能力的独立进程比如数据库查询进程当地服务商整个协作顺序是这样的用户输入进入 HostHost 把上下文交给模型模型决定需要某个工具后Host 指挥 Client 向对应 Server 发送标准请求Server 执行工具并返回结构化结果Host 再把结果写回上下文让模型继续生成最终回答。一个 Host 可以同时连多个 Server一个 Server 也可以被多个 Host 复用。这种一对多、多对一的设计让工具能力变成了一种可灵活接入的“服务”。还有一个细节容易被忽略MCP 默认的通信方式有两种一种是本地进程间通过 stdin/stdout 传消息称作 stdio适合开发调试另一种是通过 HTTP常被包装成 SSE 或 Streamable HTTP远程传输适合跨机器部署。小白最开始跑 Demo 用 stdio 就够了等真正要部署到服务器上再研究远程传输。2.3 MCP 最常见的三类落地场景第一类是“本地资源读取”。最常见的做法是给模型接一个文件读取工具让它能总结项目代码、读配置、查日志。这类 Server 通常部署在开发者的笔记本上权限控制在本地。第二类是“第三方 API 封装”。很多 SaaS 服务有 API但没有 MCP 接口你可以写一个很薄的 Server把 API 包装成标准工具。这样模型就能通过它查天气、查物流、发消息。注意调用第三方 API 时要处理好鉴权和限流不要把 token 直接写在工具参数里。第三类是“企业内部系统对接”。这是 MCP 在真正产生价值的地方。很多公司有内部的后台系统模型没法直接访问。把常用查询接口包装成 MCP Server 后业务方只需把地址和权限配好模型就能在合规范围内查询订单、搜索员工日程、检索知识库。一个包装好的 Server任何兼容 MCP 的 AI 应用都可以立刻接入不需要重新开发集成层。这里我特别想提醒小白不要为了用 MCP 而用 MCP。如果只是写一个一次性脚本直接调函数可能更简单。MCP 的优势在于跨应用复用和标准化当你的工具会被多种 AI 应用使用时才值得引入。3. Skill 到底是什么从“一句话提示词”到“一套可复用技能”3.1 MCP 管通道Skill 管打法单独有 MCP模型只是拿到了“可以在哪些工具中选择”的能力。可真实业务里完成一个任务往往需要多步操作。比方说“生成项目周报”你需要先读取 Git 提交记录、再聚合各成员的工时数据、最后套用固定的 Markdown 模板输出。如果每一步都让模型自己现想它大概率会漏掉某一步或者把输出格式写得五花八门。Skill 要解决的正是这个问题。它可以被理解成一种“高层次的策略文件”描述什么情况下使用、按照什么顺序执行哪些动作、每个动作的参数怎么填、结果应该长什么样。和一段提示词相比Skill 最大的不同是“结构化”。提示词只是给模型一段文字建议而 Skill 可以被调度器解析成一步步指令甚至可以和具体的 MCP 工具调用绑定。用一句话总结MCP 定义了“你能用什么”Skill 定义了“你应该怎么用好它们”。前者是工具层标准化后者是任务层编排。3.2 Skill 的典型长相与字段设计虽然没有严格的 Skill 格式标准但我在实际项目中总结出一套挺好用的字段结构非常适合小白参考{ name: weekly_report, description: 根据代码仓库提交记录自动生成周报, triggers: [周报, 本周总结, weekly report], steps: [ {tool: git_log, params: {since: last_monday, format: json}}, {tool: keyword_summary, params: {source: previous_result}}, {tool: md_template, params: {title: 项目周报, content: previous_result}} ], examples: [ {input: 帮我生成本周周报, output: 周报已生成共25次提交重点包括登录模块重构…} ], fallback: 如果git_log执行失败尝试读取本地changelog文件 }这个文件看起来简单但信息量很大。name是技能唯一标识description写清楚适用场景方便上层 Agent 做意图匹配triggers是触发词用来快速命中用户意图steps是核心告诉系统要依次调用哪些工具examples是给模型参考的少样本示例fallback是兜底策略避免出现异常后整个流程崩溃。很多初学者容易把 Skill 做成一个超级 Prompt里面写“你要像一个项目经理一样去总结周报”。诚然Prompt 也有用但纯 Prompt 缺少“执行确定性”。Skill 真正的威力在于它把关键的步骤变成可执行节点哪怕模型再笨调度器也能按步操作而不是让模型自由发挥。3.3 Skill 如何与 Agent 配合工作Agent 是一个能够自主拆解任务、调用外部工具、决定下一步动作的程序。Skill 则可以看成是 Agent 的“技能包”或者“武器库”。当用户提问进来Agent 首先做意图识别判断命中哪个 Skill。命中后Agent 把 Skill 的步骤展开逐步调用对应工具每一步的结果都回填到上下文中供下一步参考。整个过程像一条流水线。这里有个容易混淆的点Skill 不是只能用在 Agent 里。你可以在一个普通的聊天机器人里手动触发 Skill也可以在一个定时任务里调用 Skill。有没有 Agent 只是决定了“谁来做决策”而 Skill 本身是纯描述性的“做法”。我曾经在一个很简单的命令行工具里只用了一个 Skill没有引入任何 Agent 框架一样完成了“读取目录 → 统计文件类型 → 生成报告”的自动化。所以建议小白学习时先不要被 Agent 这个词吓住你完全可以先掌握“Skill 工具调用”这条线。4. 小白实操半小时跑通一个 MCP Server Skill 最小 Demo4.1 环境准备只需要三样东西在动手之前把环境准备好。我用的是 Python 3.10 以上环境需要能安装第三方库。进入项目目录执行pip install mcp如果你把 MCP SDK 装上就可以开始写 Server 了。为了演示方便我们不依赖任何模型 API只需要 MCP 的 Client 和 Server 在本地通过 stdio 互通。这样也方便你在没有网络的情况下验证整个机制。然后创建一个server.py文件和一个host.py文件。这个 Demo 要做的事情是server.py暴露两个工具一个是返回服务器时间一个是读取本地文本文件host.py作为客户端连接 Server打印出工具列表然后实际调用其中一个工具。最后我们再加入一个极简 Skill 的示例演示怎么把步骤编排到业务逻辑里。4.2 第一步写一个最小的 MCP Server直接贴代码# server.py from datetime import datetime from mcp.server.fastmcp import FastMCP # 创建 MCP Server 实例名称可以按业务来取 mcp FastMCP(demo-server) # 用装饰器声明这是一个工具 mcp.tool() def get_server_time() - str: 返回当前服务器时间的字符串格式为 ISO 8601。 return datetime.now().isoformat() mcp.tool() def read_text_file(path: str) - str: 读取指定路径的文本文件返回前2000个字符。路径必须是绝对路径。 with open(path, r, encodingutf-8) as f: return f.read()[:2000] if __name__ __main__: # 默认使用 stdio 方式运行便于本地调试 mcp.run()这段代码里FastMCP是 MCP SDK 提供的高级封装帮你省掉了大量底层协议处理。mcp.tool()装饰器把函数变成标准化工具函数名就是工具名docstring 就是工具描述。这个 docstring 特别重要因为模型 Agent 是靠它来判断“什么时候调用这个工具”的。写描述的时候一定要准确这个工具是干什么的、参数是什么、有没有副作用。千万不要写“一个很牛的函数”这种废话。在项目目录下运行python server.py正常情况下程序会一直挂起等待输入因为没有客户端连接。这一步只是确认没有语法错误。4.3 第二步写一个 Client验证工具列表和调用再打开新终端创建一个host.py# host.py import asyncio from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client async def main(): # 告诉客户端用哪个命令启动 Server server_params StdioServerParameters(commandpython, args[server.py]) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: # 初始化握手 await session.initialize() # 工具发现 tools await session.list_tools() print(可用工具:, [t.name for t in tools.tools]) # 调用 get_server_time result await session.call_tool(get_server_time, {}) print(返回内容:, result.content) asyncio.run(main())这时运行python host.py你应该会看到两行输出工具列表包含get_server_time和read_text_file调用结果是一个对象里面带着当前时间。如果你看到了说明 MCP 的“发现工具 → 调用工具”闭环已经跑通了。这个流程就是所有 MCP 应用最核心的骨架。后面你接任何复杂系统本质上都是在扩展更多工具。建议你在继续往下读之前亲手把这步跑通否则后面的内容很容易变成“纸上谈兵”。4.4 第三步把 Skill 定义成 JSON并写一个手动调度器现在做一个名为system_status的 Skill目标是根据用户输入依次调用时间工具和文件读取工具最终返回服务器状态摘要。可以先定义一个 JSON 文件skill.json{ name: system_status, description: 获取服务器当前时间和指定日志文件内容生成简短的运行状态摘要。, triggers: [状态, 服务器, 检查], steps: [ {tool: get_server_time, params: {}}, {tool: read_text_file, params: {path: /tmp/status.log}} ] }注意这里我把read_text_file的参数写死了在实际业务中可以通过解析用户输入来动态填参。然后写一个极简的调度函数# skill_runner.py import json import asyncio from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client def load_skill(path): with open(path, r, encodingutf-8) as f: return json.load(f) async def run_skill(skill_path, mcp_session): skill load_skill(skill_path) print(f命中技能: {skill[name]}) results [] for step in skill[steps]: print(f执行工具: {step[tool]}参数: {step[params]}) res await mcp_session.call_tool(step[tool], step[params]) results.append(res.content) return results async def main(): server_params StdioServerParameters(commandpython, args[server.py]) async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() results await run_skill(skill.json, session) for i, r in enumerate(results): print(f第{i1}步结果: {r}) asyncio.run(main())这段代码暴露了一个重要思路Skill 的steps可以被调度器一步一步执行而不是把整个流程交给模型自由发挥。虽然在真正的 Agent 框架里调度器会更复杂可能还要结合模型做动态判断但对于理解核心概念已经足够。4.5 扩展把这一套接到真实模型上如果你手上有一个能调用的模型接口可以用下面这个思路把 Demo 升级成“用户对话 → Agent 决策 → Skill 调用 → 自然语言回复”。大致流程是用户输入先发给模型同时告诉模型“当前可用的工具列表”模型返回一个结构化意图表示想调用哪个 Skill你的代码再执行 Skill 中的步骤最后把执行结果和原始问题一起再次发给模型让它生成最终回复。这个升级听起来复杂但你仔细看它并没有引入什么魔法。多出来的部分只是一个“如何根据模型输出决定执行顺序”的胶水层。所以我的建议是先不要急着研究太多 Agent 框架能手动把 Skill 跑起来你已经超过了半数刚入门的人。5. 常见问题与排查技巧实录5.1 连不上 Server一直报错或卡住这个概率最高。很多小白复制了代码却发现host.py运行后没有任何输出或者报Connection closed。第一件事是确认server.py和host.py在同一个项目目录下并且server.py没有语法错误、端口冲突或 import 异常。第二件事是检查你的 MCP SDK 版本和文档示例是否匹配新老版本的 API 名字可能不一样比如FastMCP是较新版本才提供的。第三件事是不要同时开着多个server.py进程避免资源被占用。如果还不行我建议你把 Server 代码缩到最短只保留一个返回pong的工具先跑通链路再逐步加逻辑。很多人一上来就写了一堆复杂工具结果某一个函数抛异常整个 Server 低调退出Client 自然连不上。这种“最小化复现”的思路能帮你快速定位问题。5.2 模型侧看不到工具或者工具描述不准确在 MCP 里工具列表是通过tools/list暴露的。如果模型侧看不到工具常见原因是 Server 名称错误、工具没有用装饰器注册、或者 Client 和 Server 之间的初始化握手没有完成。建议在 Client 端把tools.tools打印出来先确认工具到底有没有暴露到客户端再去排查模型侧为什么没有触发。另外工具描述写得太抽象是另一个大坑。比如你写“处理数据”模型根本不知道什么时候该调用它。应该写成“当用户询问某个城市未来24小时天气时使用参数 city 为城市中文名如北京返回为 JSON 格式”。描述越具体模型触发得越准确。这个细节非常重要直接决定了你的工具是被频繁使用还是永远躺在列表里吃灰。5.3 按照 Skill 步骤执行时顺序乱了或重复了如果我们用的是纯 Prompt 方式让模型执行多步任务它有可能漏步骤、重复步骤、甚至自己发明新的步骤。我的解决办法是把关键动作放进 Skill 的steps数组并在调度器里用状态机来保证顺序。比如当前步骤必须在上一步结果返回后才能执行失败就进入fallback成功则继续下一步。不是所有任务都需要模型参与决策固定流程坚决走代码动态任务才交给模型。还有一个经验Skill 的triggers不要太宽泛。比如你写服务器那用户聊到“服务器选型”时也可能触发导致执行错误。最好写多个具体的触发词比如服务器状态、检查服务器、当前系统状态并且description里也说明“仅用于运维排查场景不用于选购建议”。5.4 Token 消耗爆炸上下文越用越乱很多人在接了一堆工具后发现每次对话都把全部工具定义塞进上下文结果 Token 还没说几句正经话就快用完了。解决方案是“按需注入”只把当前场景最可能用到的工具描述放进上下文其他工具通过 MCP 的资源模板或 Skill 触发机制延迟加载。举个例子我维护过一套 50 个工具的 MCP Server但每个会话开始时只注入 3~5 个工具模型的判断准确率和响应速度都提升了很多。如果你使用的是 Skill 体系也可以把每个 Skill 的description和examples单独存好平时不加载。当调度器匹配到某个 Skill 时再把该 Skill 的详细信息注入对话。这相当于给上下文做“瘦身”是工程化时性价比极高的一步。5.5 安全边界工具不该是无条件信任的这一点必须时刻记着。模型生成的调用意图不总是可信的用户输入里可能藏着恶意文本试图诱导模型去调用危险工具。所以所有关键工具都要做权限控制比如文件读取工具限制只能读白名单目录数据库查询工具强制开启只读事务执行命令的工具要禁止拼接 shell涉及真金白银的操作必须加人工确认。我记得有个项目在接入 MCP 后测试人员把一句请读取 /etc/passwd发给模型模型真的尝试去读文件了。如果我们没有做路径白名单这就是一个安全事故。安全性不需要一开始做到完美但要在写第一个工具时就把“最小权限”的思维刻进习惯里。6. 从 Demo 到工程化值得记住的几条经验6.1 先跑通再优化我见过太多人被网上那些复杂架构图劝退但真相是工程化能力是一步步长出来的。你先把最简单的 MCP Server 跑通再封装一个 Skill然后再考虑高并发、多 Server 管理、权限中心这些。先跑通的意义在于给你建立信心原来这些概念没那么玄。6.2 日志和可观测性是命根子当你只在本机调 Demo 时print够用了。但一旦你的 MCP Server 开始被多个应用使用就必须给每个请求加上唯一 ID并记录耗时、状态、请求参数摘要。我习惯的日志格式很简单time2025-01-15T10:00:0008:00 call_id9f3a2b toolget_server_time statusok latency23ms有了这种日志线上排查问题的效率会高很多。以后你接 MCP 生态大概率会遇到某个工具偶尔失败的问题如果日志里没有 trace 信息你根本不知道是 Client 端超时还是 Server 端异常。6.3 给小白的学习路线建议第一步把tools/list和tools/call这两个方法理解透这是 MCP 的命脉。第二步把自己平时写的一个 Python 脚本改造成 MCP Server不必有真实业务只要能暴露一两个工具就行。第三步挑一个你每天都在做的重复劳动把它拆成一份 Skill JSON。第四步再去看开源 Agent 框架你会发现自己已经能读懂它们的设计了。学习路径不要太陡只要沿着这四步走一周时间足够让你从“听说过 MCP”变成“能讲清楚 MCP 和 Skill 的关系”。真的概念本身不难难的是动手前就想看懂一切。到这里MCP 和 Skill 的核心概念就讲完了。最后再说个个人体会我最开始也被这两个词绕得头晕后来通过自己写了一个“读取目录并统计文件大小”的 Server再配上一个配套的 Skill才真正理解它们一个管通道、一个管打法。现在回头看代码量并不多关键是动手跑通那一下。希望这篇指南也能帮你跨过“看不懂、不会用”的坎。如果你跑通了上面的 Demo你已经在正确的路上了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑