
从“只会聊天”到“真正干活”这是每个AI Agent使用者都会遇到的坎。很多人在试用Agent之后会有一个共同困惑模型本身的智商不差写代码、写文案、做分析都能聊得头头是道但要让它“真的动手干活”就立刻露馅——让它查数据库它说没有访问权限让它操作设计工具它说无法调用外部软件让它按照一套固定的规范执行任务它每次都要你把规则重新讲一遍。问题不在于大模型而在于Agent缺了两样东西连接外部工具的能力和固化工作流程的能力。前者叫MCP后者叫Skill。这篇文章的选题在技术社区里非常热门很多人已经在B站、公众号、技术博客里见过这两个词但真正能说清楚“MCP解决什么问题、Skill解决什么问题、两者怎么配合、实际项目里怎么落地”的内容仍然稀缺。多数教程只讲概念不讲场景只给一个Demo不给全链路实践。这篇文章的目标很明确用一套完整的最小示例带你从零理解MCP和Skill的原理然后在本地跑通一个可扩展的Agent能力架构。读完你可以判断自己项目里该用MCP、该用Skill还是两者结合也能直接动手改造你自己的Agent。1. AI Agent能力扩展到底扩展的是什么先说一个容易踩的误区很多人以为Agent能力扩展就是“给模型加提示词”。实际上Agent能力的核心是三个维度感知能力Agent能否读取外部数据比如数据库、文件、API返回结果。行动能力Agent能否调用外部工具比如发送邮件、操作浏览器、执行命令行。经验能力Agent能否按照你沉淀的固定流程完成任务而不是每次都重新推理一遍。普通对话模型只具备“推理能力”它可以在上下文中理解你给出的信息但无法主动获取新信息也无法对外部世界产生影响。AI Agent的本质是在模型外面包了一圈“能力层”。这个能力层负责接收模型发出的请求转化成真实世界的操作再把操作结果返回给模型让模型继续决策。问题就出在这一圈“能力层”上。早期做法是每个项目自己写调用逻辑调用数据库就写JDBC代码调用浏览器就写Selenium脚本调用设计软件就找对应SDK。结果是每个Agent项目都有一堆“手写工具”零散、不可复用、换一个客户端就全部失效。MCP和Skill的出现就是为了解决这种碎片化问题但它们的发力点不同MCP解决“工具怎么被调用”的问题它是一套标准化协议让Agent可以统一连接外部数据源和工具不用为每个工具单独写集成代码。Skill解决“任务怎么做”的问题它是一套可复用的流程和知识封装把某个特定任务的最佳实践、脚本、注意事项打包让Agent一遇到同类任务就能按成熟流程执行。用一句话概括MCP管“连接”Skill管“流程”。这两者不是竞争关系而是分工关系。MCP负责让Agent连接到数据库、设计软件、浏览器、业务系统Skill负责在Agent连接好工具之后告诉它“这个任务应该按什么步骤、用什么脚本、输出什么格式”。这才是往“通用Agent”方向走的核心路径。2. MCP与Skill核心概念深度解析2.1 MCP模型上下文协议MCP全称Model Context Protocol模型上下文协议。它是由Anthropic在2024年底提出并开源的一套开放协议目的是标准化AI应用与外部数据源、工具之间的通信方式。如果你理解了USB-C接口就理解了MCP。USB-C统一了充电口和数据口让手机、电脑、显示器、扩展坞之间可以即插即用。MCP做的事情类似它定义了AI应用Host如何连接外部能力Server。有了这个统一标准开发者只需要把能力封装成MCP Server任何支持MCP的客户端都能直接调用。MCP架构里通常有三个角色角色说明类比MCP Host运行Agent和模型的客户端比如Claude Desktop、Claude Code、Cursor电脑操作系统MCP Client客户端内部负责与Server建立连接的组件一个Host可以连多个Client操作系统里的驱动框架MCP Server提供具体能力的服务比如数据库服务、文件服务、外部API服务外接设备从通信层面看MCP基于JSON-RPC 2.0协议支持stdio和Streamable HTTP两种传输方式stdioServer作为客户端子进程运行适合本地工具启动快数据不经过网络。HTTP/SSEServer以远程服务方式运行适合跨机器、多客户端共享能力。MCP Server本质上是一个可以被Agent“发现”的工具集合。Server端会向客户端发送工具列表、工具描述、参数Schema当Agent决定调用某个工具时客户端把模型生成的参数传给ServerServer执行真实逻辑返回结构化结果。2.2 Skill技能包Skill这个概念在不同产品里有不同实现但核心思想一致把完成某个任务所需的指令、流程、脚本、示例、注意事项打包成一个可复用的“技能包”。你可以把Skill理解为Agent岗位的“员工手册”。一个新员工入职后如果只有智商没有培训他需要很长时间才能按公司规范完成任务。但如果有一份详细的手册里面写着接到这个任务后第一步做什么、用什么工具模板、遇到异常怎么处理、输出格式是什么他就能快速上手。Skill就是给Agent用的“员工手册”。以Claude Skills为例一个Skill通常是一个带固定结构的目录skill-name/ ├── SKILL.md # 技能说明主文件 ├── scripts/ # 可执行脚本 ├── references/ # 参考资料、模板、示例子文件 └── assets/ # 其他静态资源SKILL.md文件里有技能的名称、描述、使用场景、执行步骤、注意事项、依赖环境等结构化信息。当Agent遇到的用户问题与Skill描述匹配时系统会自动把对应Skill内容加载进上下文Agent就“学会了”这个任务应该怎么做。2.3 MCP和Skill的区别到底在哪里先看对比表对比维度MCPSkill解决核心问题工具和数据的连接标准化任务流程和知识的结构化封装本质一套通信协议/接口标准一套提示词脚本资源的组合包主要组成Server、Client、JSON-RPC、工具定义SKILL.md、脚本、参考文档作用位置Agent的外部连接真实世界Agent的上下文指导行为方式能否独立执行不能必须由Host调用不能必须由Agent加载后执行典型场景查询数据库、调API、操作浏览器代码审查、数据处理、标准报告生成有没有代码必须有Server实现代码可以有脚本也可以纯文档复用方式跨客户端复用跨任务复用这里要强调一个关键判断MCP和Skill不是二选一而是上下游关系。一个复杂任务往往需要两者配合。以“数据库巡检”为例Agent通过MCP Server连接数据库获得执行SQL的能力然后通过一个“数据库巡检Skill”学会巡检流程包括先查慢查询日志、再查表空间占比、最后生成巡检报告。MCP提供“手”Skill提供“操作手册”。初学者最容易犯的错误是把所有任务逻辑都塞进MCP工具导致Server代码又长又难维护或者把所有工具调用细节都写进Skill的提示词里导致上下文窗口被占满、模型理解混乱。正确的做法是能用协议标准化的连接动作交给MCP能用文档和脚本固化的经验流程交给Skill。2.4 Computer Use、MCP、Skill三者关系开发圈里还有一个高频搜索词是Computer Use。很多人把它和MCP放在一起比较其实它们是不同层面的东西。Computer Use是让AI像人一样操作电脑界面的能力通过截图识别界面元素、模拟鼠标键盘操作来完成任务。它不依赖对方提供API因为它是从“界面”层面操作。MCP则是从“接口”层面连接能力它要求对方提供符合协议的工具或数据服务。MCP调用更稳定、更可靠因为它走的是结构化接口不是视觉识别Computer Use的优点是通用缺点是慢、不稳定、容易被界面变化影响。Skill在这两者之上它决定“要不要用MCP、要不要用Computer Use、按照什么顺序用”。真正完整的Agent架构是三者叠加Skill负责流程编排MCP负责调用结构化工具Computer Use负责兜底处理没有接口的遗留系统。3. 环境准备与前置条件在开始动手之前先确认你的环境具备哪些条件。3.1 软件环境清单本文的实践示例采用“通用工程思路”不绑定某个特定商业产品。你只需要满足以下基础条件即可依赖用途版本建议Python 3.9编写MCP Server和Skill脚本建议3.10及以上版本以实际环境为准Node.js 18部分MCP SDK需要建议18及以上Claude Desktop或Claude Code作为MCP Host和Agent运行环境以官方最新版本为准uv或pipPython依赖管理最新稳定版需要注意的是我这里不会写死某个具体SDK版本因为MCP和Skill生态处在快速迭代期版本变化很快。你完全可以使用其他支持MCP的客户端比如Cursor、JetBrains IDE插件等。核心原理是一样的配置文件名和位置可能有差异。3.2 前置知识要求阅读本文建议具备以下基础了解Python基础语法能读懂函数定义和异步调用。了解JSON、Markdown基本语法。用过至少一个AI对话客户端知道Prompt是什么。理解“工具调用”Function Calling / Tool Use的基本概念。如果你完全不懂编程本文的代码部分可以照抄运行但要理解原理还需要补充一点Python基础。3.3 安全提醒本文会涉及通过MCP访问外部工具和数据库的示例。所有示例均使用模拟数据或演示数据不会操作真实生产数据库。你在自己项目里接入数据库、文件系统、支付接口等敏感能力时务必遵守最小权限原则给Agent分配只读账号或专用低权限账号不要使用管理员账号。4. 核心流程拆解MCP与Skill的分工模型在写代码前先想清楚整体流程。一个标准的“Agent能力扩展”建设过程分为五个阶段能力盘点列出Agent需要连接的资源比如哪些数据库、哪些API、哪些本地工具。连接层建设MCP为每个资源编写MCP Server或选用现成Server。流程封装Skill把高频任务写成Skill沉淀标准操作步骤。联调验证在真实场景中验证Agent能否正确选择工具、按Skill流程执行。安全加固配置权限边界、日志审计、超时控制。下面两章分别完成MCP和Skill的最小示例然后在第6章把它们串起来。5. 完整示例一用MCP给Agent接上“数据库查询”能力这一节从零实现一个最小MCP Server功能是让Agent查询一张演示用的用户表。我们用一个本地SQLite数据库做演示模拟“Agent通过MCP连接数据库”的真实场景。5.1 初始化Python项目和安装依赖mkdir mcp-demo-server cd mcp-demo-server python3 -m venv .venv source .venv/bin/activate安装MCP官方Python SDK和SQLite驱动pip install mcp sqlite3-utilsmcp是官方Python SDKsqlite3-utils是为了方便操作SQLite演示数据。SQLite本身是Python内置库你也可以直接用sqlite3。5.2 创建演示数据库python3 -c import sqlite3 conn sqlite3.connect(demo.db) c conn.cursor() c.execute(CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, email TEXT, role TEXT)) c.execute(\INSERT INTO users (name, email, role) VALUES (张三, zhangsanexample.com, admin)\) c.execute(\INSERT INTO users (name, email, role) VALUES (李四, lisiexample.com, editor)\) c.execute(\INSERT INTO users (name, email, role) VALUES (王五, wangwuexample.com, viewer)\) conn.commit() conn.close() print(demo.db created) 这里用了两条INSERT语句插入演示数据。真实项目中SQLite数据应该来自业务系统这里只是为了有数据可查。5.3 编写MCP Server文件路径mcp-demo-server/server.pyimport sqlite3 from pathlib import Path from typing import Any from mcp.server import Server from mcp.server.stdio import stdio_server from mcp.server.models import InitializationOptions import mcp.server.notification as notification import mcp.types as types DB_PATH Path(__file__).parent / demo.db app Server(demo-db-server) app.list_tools() async def list_tools() - list[types.Tool]: 声明Agent可见的工具列表。 return [ types.Tool( namequery_users, description查询users表中的用户数据支持按姓名模糊搜索。, inputSchema{ type: object, properties: { keyword: { type: string, description: 按姓名模糊搜索的关键字可为空。, }, limit: { type: integer, description: 最多返回多少条默认10。, }, }, }, ) ] app.call_tool() async def call_tool(name: str, arguments: dict[str, Any]) - list[types.TextContent]: 执行Agent请求的工具调用。 if name ! query_users: raise ValueError(fUnknown tool: {name}) conn sqlite3.connect(DB_PATH) cursor conn.cursor() keyword arguments.get(keyword, ) limit int(arguments.get(limit, 10)) if keyword: cursor.execute( SELECT id, name, email, role FROM users WHERE name LIKE ? LIMIT ?, (f%{keyword}%, limit), ) else: cursor.execute( SELECT id, name, email, role FROM users LIMIT ?, (limit,), ) rows cursor.fetchall() conn.close() lines [id|name|email|role] for row in rows: lines.append(|.join(str(col) for col in row)) return [types.TextContent(typetext, text\n.join(lines))] async def main() - None: 启动stdio模式的MCP Server。 async with stdio_server() as (read_stream, write_stream): await app.run( read_stream, write_stream, InitializationOptions( server_namedemo-db-server, server_version0.1.0, ), ) if __name__ __main__: import asyncio asyncio.run(main())这段代码有四个关键部分list_tools()向Agent声明这个Server提供哪些工具。Agent看到的是工具名、描述和参数Schema并不会看到你的数据库连接细节。call_tool()Agent决定调用工具后客户端会把参数传到这里由这个函数执行真实数据库查询。query_users工具的inputSchema告诉模型它需要哪些参数、参数类型是什么这决定了模型能否正确生成调用参数。stdio_server()使用标准输入输出作为MCP通信管道这是本地MCP Server最常见的运行方式。5.4 配置MCP客户端不同客户端配置方式不同这里给出两个主流示例。Claude Desktop的配置文件位于claude_desktop_config.jsonWindows和macOS路径不同。常见路径是macOS~/Library/Application Support/Claude/claude_desktop_config.jsonWindows%APPDATA%\Claude\claude_desktop_config.json{ mcpServers: { demo-db: { command: python3, args: [ /absolute/path/to/mcp-demo-server/server.py ] } } }Claude Code的配置方式类似可以在项目根目录创建.mcp.json{ mcpServers: { demo-db: { command: python3, args: [ /absolute/path/to/mcp-demo-server/server.py ] } } }配置完成后重启客户端让MCP Server随客户端启动。注意/absolute/path/to/必须替换成你机器上server.py的真实绝对路径否则客户端找不到Server。5.5 运行与验证MCP Server在终端直接运行Server看它能否正常启动python3 server.py如果代码无误进程会一直挂着等待输入说明Server已经启动。这不是卡死是stdio模式在等待客户端通过标准输入发送JSON-RPC请求。在Claude Desktop中你可以直接询问帮我查一下users表里所有名字带“张”的用户如果配置成功模型会调用query_users工具返回id|name|email|role 1|张三|zhangsanexample.com|admin如果你在对话中看到工具调用过程说明MCP连接已经打通。这里有个判断标准模型是否真的把查询参数传给了工具而不是自己在上下文里编造数据。可以通过让模型查询一个数据库里不存在的用户来验证比如“查一下名字叫测试用户的人”如果模型老实地返回空结果说明它真的在执行SQL不是猜答案。6. 完整示例二用Skill封装“标准代码审查”流程MCP解决了Agent能不能调用数据库的问题但“怎么高效地完成一次代码审查”这类流程问题还需要Skill来解决。6.1 Skill目录结构我们创建一个名为code-review-skill的技能包code-review-skill/ ├── SKILL.md ├── scripts/ │ └── check_security.py └── references/ └── review_checklist.md6.2 编写SKILL.md文件路径code-review-skill/SKILL.md--- name: code-review-skill description: 对代码变更执行结构化安全审查。当用户要求审查代码、检查Pull Request、评估提交质量时使用此技能。 --- # 代码审查技能 ## 技能目标 按照统一标准对代码变更进行审查输出结构化的审查报告重点发现安全漏洞、性能隐患和逻辑错误。 ## 适用场景 - 用户要求审查一段代码、一个Commit或一个Pull Request - 用户要求评估提交安全性 - 用户要求检查SQL注入、命令注入、敏感信息泄露等风险 ## 执行步骤 1. 定位需要审查的代码范围和语言类型。 2. 读取代码内容重点关注用户输入入口、数据库操作、系统命令调用、文件读写、认证授权逻辑。 3. 运行安全检查脚本提取当前变更的关键风险点。 4. 按严重级别分类输出严重 / 警告 / 建议。 5. 每个问题必须给出问题描述、代码位置、风险解释、修复建议。 ## 输出格式 审查报告必须使用以下格式 ### 审查范围 - 文件 - 语言 - 变更概述 ### 发现的问题 #### [严重级] 问题标题 - 位置文件:行号 - 风险说明... - 修复建议... ### 审查结论 - 是否建议合并 - 需要修改的内容SKILL.md的结构很重要。description字段决定了Skill是否会被自动触发所以要写清楚“什么时候该用”“什么时候不该用”。执行步骤不要写模糊指令要写“定位→读取→执行脚本→分类→输出”这种可执行动作。6.3 编写Skill配套脚本文件路径code-review-skill/scripts/check_security.py#!/usr/bin/env python3 简单的代码安全扫描脚本用于Skill辅助检查。 import re import sys from pathlib import Path PATTERNS { SQL拼接: r(?:SELECT|INSERT|UPDATE|DELETE).*f[\]|.*\.*(?:cursor|execute), 命令注入: ros\.system|subprocess.*shellTrue, 硬编码密码: rpassword\s*\s*[\][^\][\], eval执行: r\beval\(|\bexec\(, 危险反序列化: rpickle\.loads|yaml\.load\s*\([^)]*Loader\s*\s*yaml\.Loader, } def scan_file(path: Path) - list[dict]: findings [] try: lines path.read_text(encodingutf-8, errorsignore).splitlines() except Exception: return findings for idx, line in enumerate(lines, 1): for rule_name, pattern in PATTERNS.items(): if re.search(pattern, line, re.IGNORECASE): findings.append({ file: str(path), line: idx, rule: rule_name, code: line.strip(), }) return findings def main() - None: target Path(sys.argv[1]) if len(sys.argv) 1 else Path(.) if target.is_dir(): files filter(lambda p: p.suffix in {.py, .js, .java, .go, .ts}, target.rglob(*)) else: files [target] all_findings [] for f in files: all_findings.extend(scan_file(f)) if not all_findings: print(未发现匹配的安全风险模式。) return for item in all_findings: print(f{item[file]}:{item[line]} [{item[rule]}] {item[code]}) if __name__ __main__: main()这个脚本是一个最小风险评估示例它通过正则匹配代码里的危险模式。真实项目中Skill配套脚本可以调用SonarQube API、Bandit、Semgrep等专业工具返回结构化JSON给Agent。脚本的价值是让Agent不只是凭印象审查代码而是真正运行静态检查工具。6.4 让Skill被Agent加载Skill的加载方式取决于你使用的客户端。以Claude Code为例你可以把code-review-skill放到项目的.claude/skills/目录下your-project/ ├── .claude/ │ └── skills/ │ └── code-review-skill/ │ ├── SKILL.md │ ├── scripts/ │ │ └── check_security.py │ └── references/ │ └── review_checklist.md然后在对话中请求请审查src/目录下的Python代码变更Agent会根据Skill的description匹配任务加载SKILL.md内容并按技能步骤执行。你可以让Agent在审查前先运行脚本先运行check_security.py扫描src/再结合扫描结果输出审查报告有两点需要注意。第一Skill不是插件不需要“安装”它本质上是目录和文档。Agent是你把Skill的内容“喂”给它它再按文档执行。因此Skill内容的质量直接决定执行质量。第二同一个Skill可以被多个项目复用。你可以把通用技能放到用户全局skills目录把项目特定技能放到项目级skills目录形成两级复用结构。6.5 验证Skill执行效果执行后你应该看到模型输出一份结构整齐的审查报告并且提到脚本扫描结果。如果模型只是泛泛而谈“这段代码存在安全风险”没有具体文件、行号和修复建议说明SKILL.md里的输出格式约束不够严格需要增强格式指令。这里有一个验证技巧准备一段包含明显SQL拼接和硬编码密码的测试代码然后让Agent审查。如果它能在报告中准确指出这两个问题并给出具体行号说明Skill的流程生效了。6.6 把MCP和Skill组合起来单独跑通MCP和Skill之后试着组合成一个真实任务“对数据库进行安全巡检并输出报告”。这个任务需要用到你前面写的两个能力通过MCP工具query_users读取数据库数据。通过Skill的流程模板把巡检步骤和报告格式固定下来。你可以创建一个新的db-inspection-skill/SKILL.md执行步骤里明确写先列出当前MCP Server提供的数据库工具再调用工具读取表结构和抽样数据检查是否存在空密码、弱权限、敏感字段明文等问题最后按统一格式输出巡检报告。这样你就得到了一套可以复用的Agent工程架构MCP连接数据能力Skill管控任务流程。7. 运行结果与效果验证的完整路径7.1 验证MCP是否配置成功在支持MCP的客户端里通常有一个工具列表界面。判断标准是启动客户端时Server进程是否被拉起。工具列表是否能看到query_users。向Agent提问时是否出现“正在调用工具”的交互提示。如果Agent回答“我没有权限访问数据库”最可能的原因是MCP Server没有启动成功而不是模型拒绝执行。先回到终端确认Server是否有报错。7.2 验证Skill是否被正确触发Skill触发的判断标准是Agent是否按照SKILL.md里的执行步骤输出而不是自由发挥。Agent是否主动运行了scripts/里的脚本。输出格式是否和SKILL.md要求一致。如果Agent完全没提Skill内容可能是description写得不准确模型没有把当前任务和Skill关联起来。试着调整描述加入更多触发关键词比如“代码审查”“Pull Request检查”“安全扫描”。8. 常见问题与排查方法下表总结了实践中最常遇到的几种情况。问题现象可能原因排查方式解决方案客户端启动时MCP连接失败server.py路径不正确或Python环境不对查看客户端日志确认command和args路径改用绝对路径用which python3确认解释器位置Server在终端正常启动但Agent看不到工具客户端没重启或配置格式错误检查配置文件JSON格式确认mcpServers层级修改后完全退出客户端再重启Agent调用工具时报参数错误inputSchema参数类型和call_tool函数处理不一致在call_tool里打印arguments内容统一参数命名增加类型转换和默认值Agent不调用工具直接编造答案工具描述不清晰模型不清楚该工具适用场景检查Tool的description和inputSchema描述重写描述加入触发条件和参数示例Skill没触发description关键词覆盖不够查看客户端日志确认Skill加载情况增加关键词补充负面触发条件Skill脚本执行失败脚本依赖未安装或路径不对在终端手动运行脚本验证在SKILL.md的依赖项里写明安装命令数据库查询暴露敏感信息权限配置过大检查数据库账号权限为Agent创建只读账号限制可查询表调用外部API超时MCP Server未设置超时时间或外部服务慢查看Server日志在工具调用中增加超时控制重试机制这里重点说一个新手最容易忽略的点MCP工具不是越多越好。每个工具都会占用Agent的上下文空间。工具描述、参数Schema都会作为系统提示的一部分传给模型。如果你在一个Server里注册了50个工具模型在做决策时反而更容易选错。更合理的做法是每个Server聚焦一个领域比如db-server只连接数据库http-server只提供HTTP请求工具。9. 最佳实践与工程建议9.1 选型什么时候用MCP什么时候用Skill如果你的需求是“让Agent访问一个外部资源”优先考虑MCP。数据库连接、第三方API调用、文件系统读取、搜索服务都是MCP的典型场景。如果你的需求是“让Agent规范化完成一类任务”优先考虑Skill。代码审查、数据清洗、日报生成、测试用例编写这些有固定流程和经验沉淀的任务适合写成Skill。如果需求两者都有可以采用组合模式MCP提供通用工具Skill在工具之上定义流程。不要让Skill直接承载工具实现细节不要让MCP Server承载业务流程逻辑。9.2 安全边界Agent连接外部能力时必须守住底线MCP看起来是纯技术问题实际上是权限问题。给Agent接入数据库时强烈建议使用专用只读账号通过视图限制可访问字段。以MySQL为例CREATE USER agent_rolocalhost IDENTIFIED BY strong_password; GRANT SELECT ON biz_db.* TO agent_rolocalhost;这样Agent最多只能查询不能修改、删除、创建表。如果业务上确实需要写操作也应该通过一个受控的MCP工具实现工具内部做参数白名单校验而不是把写权限直接交给Agent。文件操作也是一样。给Agent的文件访问范围应该限定在特定目录不要在Server里暴露整个家目录。9.3 上下文管理控制Skill的加载成本SKILL.md不是越长越好。一个几百行的Skill文档每次触发都会占用上下文TokenAgent理解核心步骤的难度也会增加。经验是SKILL.md主文件控制在100-200行把补充资料放到references/子文件需要时才让Agent读取。脚本放到scripts/目录不要直接粘在主文件里。9.4 团队协作把Skill当代码管理Skill是一堆Markdown和脚本文件完全可以用Git管理。建议在团队仓库里创建一个skills/目录每个Skill一个子目录通过Pull Request评审Skill内容变更。Skill更新应该和代码更新走同样的流程否则会出现“技能过期”问题——Skill里的命令还在用旧参数但实际业务接口已经变了。9.5 日志审计生产环境使用MCP连接真实业务系统后一定要记录工具调用日志。记录内容至少包括调用时间调用Agent会话ID工具名称传入参数返回结果摘要耗时这样即使Agent误调用了某个工具也能快速定位责任链。10. 从Demo到生产你的下一步行动清单看完文章建议按这套路径从Demo迈向生产第一步复现本文两个示例确保MCP Server能启动、Skill能被触发。这一步通常需要半天时间目的是建立“连接”和“流程”两个心智模型。第二步盘点你自己的真实高频任务。不要一上来就想做一个通用Agent先选出1到2个重复性最高的任务比如“查询业务报表”“代码提交前自检”“生成测试数据”。第三步把任务的工具访问层用MCP封装把流程规则用Skill封装。跑通一个“单一任务全流程”再扩展下一个。第四步做安全审计。检查MCP Server绑定的权限、日志是否完整、工具调用是否有超时和熔断。第五步和团队一起维护Skill仓库把个人经验变成团队资产。这一步的工程价值往往比优化模型Prompt大得多。MCP和Skill不是万能药但它们确实把AI Agent从“依赖模型临场发挥”推进到了“可装配、可复用、可治理”的工程阶段。真正拉开Agent能力差距的从来不只是一个更强的模型而是你围绕模型建了多少条可靠的“连接”、沉淀了多少套高质量的“流程”。