1. 面试官为什么总盯着 MCP 和 Skills 不放如果你最近面过 AI Agent 相关岗位大概率被问过这类问题“MCP 和 Function Call 到底差在哪”“Skills 的渐进式加载怎么省 Token”“A2A 和 MCP 会不会打架”这些不是八股而是面试官在判断你有没有真正落地过工具生态。MCPModel Context Protocol解决的核心问题不是“Agent 能不能调用工具”——Function Call 早就做到了——而是“换了模型之后工具还能不能被调用”。Skills 解决的也不是“Agent 知不知道某件事”而是“需要的时候能不能只加载那本手册而不是把整个图书馆塞进上下文”。我试过在同一个 Agent 项目里从 Claude 切到另一个模型工具层几乎零改动那一刻才真正理解标准化的价值。这篇就按面试高频考点拆先讲清 MCP 协议与 Skills 工具生态的底层逻辑再给一份可复制的 MCP 服务端config.toml骨架和 Skills 注册配置最后用 TaoToken 统一 Key/API 通道跑通一次完整的工具调用链路。适合正在准备 AI Agent 面试、或者要把内部能力标准化成 MCP Server 的开发者。2. 先把 TaoToken 通道准备好在验证工具调用链路之前需要一个统一的模型 API 入口。TaoToken 在这里扮演的是“模型侧的统一通道”——你不需要为每个模型单独维护一套 Key 和 Base URLMCP Client 在调用模型时指向同一个地址即可。这对面试场景特别有用面试官问你“换模型工具层要不要改”你可以直接演示同一套 MCP Server 配置只换模型名就跑通。具体操作登录后进入控制台在 API Keys 页面创建一个 Key。这个 Key 会用于后续所有模型请求。地址方面官网入口是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基址是https://taotoken.net/api注意 API 地址不带 UTM 参数。如果你要长期做编码类 Agent可以了解 Coding Plan如果只是验证模型对话用模型对话入口即可。注意Key 只创建一次后续 MCP Client 的模型配置和工具调用验证都复用它。不要把 Key 硬编码进提交到 Git 的配置文件用环境变量注入。创建完 Key 后把它写进环境变量后面所有命令都从这里读取export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api这一步看起来简单但它是后面“统一通道”验证的前提。很多人在面试里讲 MCP 讲得头头是道一问“你怎么验证工具调用真的通了”就卡住——因为他们的 Key 散落在各个模型 SDK 里根本没法快速切换验证。3. 可复制的 MCP 服务端 config.toml 骨架MCP 的三角架构是 Host / Client / Server。Host 是用户交互的应用比如 IDE 或自研 Agent 平台Client 是 Host 内部负责与单个 Server 通信的组件Server 是实际暴露能力的程序。面试里经常考“为什么是三角而不是直线”——答案是三权分立Host 管治理权限、审计、生命周期Client 管通信JSON-RPC 2.0Server 管能力Tools/Resources/Prompts。下面这份config.toml是一个 MCP 服务端的骨架覆盖了 Server 元信息、传输层、工具注册和 Skills 挂载。你可以直接拿去改# mcp-server/config.toml # MCP Server 骨架配置传输层 工具注册 Skills 挂载 [server] name internal-tools-server version 1.0.0 description 内部能力标准化 MCP Server暴露查询与操作类工具 # 传输层开发用 stdio生产用 streamable_http [transport] type streamable_http # 可选 stdio / sse / streamable_http host 0.0.0.0 port 8787 path /mcp # stdio 模式下无需 host/portHost 直接拉起子进程 # 模型通道统一指向 TaoToken换模型只改 model 字段 [model] provider taotoken base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY # 从环境变量读取不写死 model claude-sonnet # 换模型只改这一行 max_tokens 4096 # 工具注册每个工具对应一个 handler [[tools]] name search_docs description 在内部文档库中检索关键词返回匹配的文档片段。当用户询问内部规范、流程、制度时使用。 handler handlers.search_docs input_schema { type object, properties { query { type string }, top_k { type integer, default 5 } }, required [query] } annotations { readOnlyHint true } [[tools]] name create_ticket description 创建一个内部工单。当用户明确要求提交问题、报障、申请资源时使用。 handler handlers.create_ticket input_schema { type object, properties { title { type string }, body { type string }, priority { type string, enum [low, medium, high] } }, required [title, body] } annotations { destructiveHint false, idempotentHint false } # Skills 挂载渐进式加载启动时只读 front matter [skills] enabled true root_dir ./skills max_skills 100 # 超过 100 个建议拆分或清理 preload_metadata_only true # 只预加载元信息正文按需加载这份配置里有几个面试常考的点。第一annotations里的readOnlyHint和destructiveHint是 MCP 2025 规范引入的 Tool AnnotationsHost 可以据此做风险分级——只读工具自动放行破坏性工具弹人工确认。第二transport.type选streamable_http而不是sse因为前者支持 Serverless 和标准 HTTP 基础设施是云端生产的推荐方案。第三model段统一指向 TaoToken换模型只改model一行工具层完全不动——这正是 MCP “一次开发到处可调”的体现。4. Skills 注册配置与渐进式加载Skills 的本质是“渐进式加载的能力包”。一个 Skill 是一个文件夹里面有SKILL.md和若干资源文件。Agent 启动时只加载每个SKILL.md的 YAML front mattername、description、trigger需要时才加载完整正文再需要时才加载引用的资源文件。这是 Token 经济学也是认知科学——专家不是记住一切而是知道去哪查。下面是一个SKILL.md的注册配置示例--- name: code-review description: 审查代码质量发现 bug、安全漏洞、性能问题并给出改进建议。 trigger: 当用户提交代码并要求审查review检查时使用 trigger_keywords: [review, 审查, 代码检查, code review] version: 1.2.0 --- # 代码审查技能 ## 审查流程 1. 语法检查确认代码无语法错误 2. 逻辑审查分析控制流发现潜在 bug 3. 安全审查检查常见安全漏洞详见 checklist.md 4. 性能审查识别性能瓶颈 5. 风格审查检查代码风格一致性 ## 输出格式 使用 templates/review_report.md 中的模板输出审查报告 ## 深度资源 - 详细检查清单见 checklist.md - 代码示例见 examples/ 目录 - 自动分析可调用 scripts/analyzer.py对应的目录结构skills/ └── code-review/ ├── SKILL.md # 元信息 正文 ├── checklist.md # 深度资源按需加载 ├── examples/ │ ├── good_code.py │ └── bad_code.py ├── scripts/ │ └── analyzer.py └── templates/ └── review_report.md渐进式加载分三层启动时只读 front matter200 个技能约 3000 Token模型判断需要某技能后加载SKILL.md正文约 2000-5000 Token正文引用资源且模型判断需要时再加载可部分加载。对比一次性加载 200 个技能约 20 万 Token渐进式加载总共 5000-8000 Token节省 95% 以上。面试里如果被问“Skills 和 MCP Tools 什么关系”一句话答MCP Tools 是动作层外部的手执行操作Skills 是知识层内在的脑提供方法论。两者配合——先翻手册学方法再用工具执行。5. 验证一次完整的工具调用链路配置写好了接下来验证它真的能跑通。这一步是面试里最能体现“落地能力”的部分。整个链路是MCP Client 连接 Server →tools/list发现工具 → 模型决策调用 →tools/call执行 → 结果返回模型。先启动 MCP Servercd mcp-server python -m mcp_server --config config.toml # 输出MCP Server listening on http://0.0.0.0:8787/mcp然后用一个最小 Client 脚本验证工具发现和调用。这里模型通道走 TaoToken# verify_mcp.py import os, json, httpx BASE os.environ[TAOTOKEN_BASE_URL] KEY os.environ[TAOTOKEN_API_KEY] MCP http://127.0.0.1:8787/mcp # 1. 通过 MCP 协议获取工具列表 def list_tools(): payload {jsonrpc: 2.0, id: 1, method: tools/list, params: {}} r httpx.post(MCP, jsonpayload, timeout10) return r.json()[result][tools] # 2. 调用模型让它决定是否调用工具 def ask_model(tools, user_msg): headers {Authorization: fBearer {KEY}, Content-Type: application/json} body { model: claude-sonnet, messages: [{role: user, content: user_msg}], tools: [{name: t[name], description: t[description], input_schema: t[inputSchema]} for t in tools], } r httpx.post(f{BASE}/v1/messages, headersheaders, jsonbody, timeout60) return r.json() # 3. 执行工具调用 def call_tool(name, args): payload {jsonrpc: 2.0, id: 2, method: tools/call, params: {name: name, arguments: args}} r httpx.post(MCP, jsonpayload, timeout30) return r.json()[result] if __name__ __main__: tools list_tools() print(发现工具, [t[name] for t in tools]) resp ask_model(tools, 帮我查一下内部报销流程的文档) print(模型响应, json.dumps(resp, ensure_asciiFalse)[:500])运行后你会看到类似输出发现工具 [search_docs, create_ticket] 模型响应 {content: [{type: tool_use, name: search_docs, input: {query: 内部报销流程, top_k: 5}}], ...}模型返回了tool_use说明它根据工具描述决定调用search_docs。接着 Client 把tool_use的 name 和 input 传给call_toolServer 执行后返回文档片段再回传给模型生成最终回答。整条链路跑通说明 MCP Server 配置、Skills 挂载、TaoToken 模型通道三者都正常。提示验证模型对话是否正常可以用模型对话入口单独测一次如果要做长期编码 AgentCoding Plan 更适合持续调用场景。6. 本篇常见错排查报错一tools/list返回空数组。检查config.toml里[[tools]]的handler路径是否可导入。Python 里handlers.search_docs要求handlers/目录下有__init__.py且search_docs是可调用对象。另一个常见原因是 Server 启动时工具注册失败但没报错——加日志确认每个 handler 都注册成功。报错二模型不调用工具直接回答。大概率是工具描述写得太模糊。面试考点工具描述是写给模型看的不是写给人看的。把description改成“当用户询问内部规范、流程、制度时使用”这种带触发条件的描述模型判断会准很多。另外确认input_schema的required字段没有把可选参数也列进去。报错三tools/call返回Method not found。检查传输层是否匹配。如果config.toml写的是streamable_http但 Client 用 stdio 方式连接就会找不到方法。stdio 模式下 Host 直接拉起子进程不走 HTTP 端口HTTP 模式下才用httpx.post到/mcp。报错四Skills 没被加载。检查skills.root_dir路径是否正确以及SKILL.md的 front matter 是否是合法 YAML---开头结尾。如果preload_metadata_only true启动时只加载元信息正文要等模型判断后才加载——这是预期行为不是 bug。报错五模型请求 401。检查TAOTOKEN_API_KEY环境变量是否注入成功以及base_url是否写成了带 UTM 的官网地址。API 基址是https://taotoken.net/api不带任何查询参数。7. 面试与落地之间的那座桥回到面试场景。当面试官问“MCP 和 Function Call 的区别”你可以从五个维度答定义位置API 请求体 vs Server 端、适配责任开发者 vs Client、发现机制硬编码 vs 动态发现、执行位置应用代码 vs Server 端、生态模式私有化 vs 标准化。当问“Skills 怎么省 Token”你答渐进式加载三层元信息、完整描述、资源文件200 技能从 20 万 Token 降到 5-8 千。但光答概念不够。面试官更想看到的是你能不能在 30 分钟内搭出一个可运行的 MCP Server用统一通道跑通一次工具调用并且知道出错时去哪查。这套config.toml骨架 Skills 注册配置 TaoToken 验证链路就是那座桥——左边是面试题库里的名词右边是能跑起来的代码。如果你要长期做编码类 Agent建议把模型通道固定成 TaoToken 的统一入口工具层用 MCP 标准化知识层用 Skills 渐进加载。这样换模型时只改一行model字段工具和技能完全不动。接入文档和 API Keys 都在控制台里排障时优先看这两处。
