开篇回顾

上篇我们搭建了天气查询和数据库查询两个 MCP Server,并成功对接了阿里云百炼 + Qwen 智能体。本篇我们深入一层:MCP 协议底层是怎么通信的?2026 年国内生态发展到什么程度?生产环境怎么落地?面试会问什么?


一、MCP 协议怎么工作的

1.1 JSON-RPC 2.0:通信的语言

MCP 所有通信都是标准 JSON-RPC 2.0 格式。一次工具调用的请求长这样:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_weather",
    "arguments": {
      "city": "北京"
    }
  }
}

Server 处理后返回:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "晴,25°C,湿度 40%"
      }
    ]
  }
}

就是普通的 JSON,没有任何黑魔法。

1.2 三大核心能力

MCP Server 不只提供工具调用,还有两个重要能力:

能力 方法 用途
Tools tools/listtools/call 执行操作(查天气、查数据库)
Resources resources/listresources/read 提供数据(文档、配置、知识库)
Prompts prompts/listprompts/get 提供提示词模板

Resources 的典型场景:把公司内部文档注册为 Resource,大模型回答用户问题时能自动引用。

Prompts 的典型场景:预设"生成周报"、"代码审查"等模板,User 一键调用。

1.3 一次调用的完整生命周期

用户提问:"北京天气怎么样?"
    ↓
Host 将问题 + 工具清单发给大模型
    ↓
大模型判断:"需要调用 get_weather 工具,参数 city=北京"
    ↓
Host 通过 MCP Client 发送 tools/call 请求
    ↓
MCP Server 执行 get_weather("北京"),返回 "晴,25°C"
    ↓
Host 将结果交还给大模型
    ↓
大模型组织回复:"北京今天晴天,气温 25°C,适合出行。"

整个过程对用户完全透明,体验就像是模型自己知道天气。


二、MCP 生态现状(2026)

2.1 国内平台支持

平台 MCP 支持方式 特点
阿里云百炼 原生 MCP 服务广场 预置 50+ 云端服务 + 20+ 本地工具,业界最完整
通义千问 API 层原生支持 Qwen3.7 可直接对接 MCP Server
百度千帆 AppBuilder 集成 低代码方式接入 MCP 工具
扣子(Coze) 插件市场兼容 MCP 扣子插件可导出为 MCP Server

2.2 主流 SDK

语言 SDK 适用场景
Python mcp 快速原型、AI 应用开发
TypeScript @modelcontextprotocol/sdk 前端工具、Node.js 服务
Java Spring AI MCP 企业级后端集成

Java 开发者可以在 Spring Boot 项目中直接引入:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-mcp</artifactId>
</dependency>

然后用注解定义一个 MCP 工具,Spring AI 自动完成协议适配。

2.3 MCP 服务广场

不需要从零写 Server 的场景:阿里云百炼 MCP 服务广场已预置了 高德地图、天气、快递查询、机票酒店、MySQL、PostgreSQL、飞书、钉钉 等 50+ 常用服务。在广场一键添加,无需部署,直接使用。


三、生产环境落地指南

3.1 部署方式选择

方式 启动延迟 运维成本 适用场景
本地 STDIO 即时 个人开发、桌面端
云函数(FC) < 100ms 极低 生产环境推荐
Docker 秒级 中等 需要复杂依赖
K8s Deployment 秒级 较高 企业级高可用

推荐路径:开发用 STDIO,上线用阿里云 FC,零运维、按调用量付费。

3.2 三个最常见的坑

坑一:工具超时

MCP Server 调用外部 API 时可能超时,大模型会一直等。

解决:设置合理的超时时间(建议 10-30 秒),超时后返回友好错误信息,让模型换策略。

@server.call_tool()
async def call_tool(name, arguments):
    try:
        result = await asyncio.wait_for(call_external_api(), timeout=10)
        return result
    except asyncio.TimeoutError:
        return {"content": [{"type": "text",
            "text": "查询超时,请稍后重试"}]}

坑二:模型"幻觉调用"

大模型可能编造不存在的工具名,或传入格式错误的参数。

解决:Server 端做好参数校验 + 返回清晰的错误信息。同时写好工具描述,让模型更容易理解工具的边界。

坑三:敏感信息泄漏

数据库密码、API Key 写在代码里提交到 Git。

解决:所有敏感信息走环境变量或密钥管理服务。

import os
DB_PASSWORD = os.environ["DB_PASSWORD"]  # 绝不硬编码

3.3 提示词技巧

想让大模型更准确地调用你的 MCP 工具,工具描述要写好:

❌ 差:查询天气
✅ 好:根据城市名称查询实时天气,返回温度、天气状况和湿度。
       仅支持中国城市,输入格式如"北京"、"上海浦东"。

描述里写清楚:功能、输入格式、限制条件、返回内容


四、面试高频考点

以下 8 道题是 2026 年面试中出现频率最高的 MCP 相关问题:

Q1:MCP 和 Function Call 的本质区别?

MCP 是协议,Function Call 是功能。MCP 定义了模型与工具之间通信的标准,具有跨模型、跨平台、可复用的特点;Function Call 是单个模型提供的函数调用能力,工具定义与模型绑定。就像 USB 协议 vs 某个设备的专用接口。

Q2:MCP Server 的并发模型怎么设计?

取决于部署场景。STDIO 模式天然单连接,无需考虑并发;HTTP/云函数模式下,每个请求独立,平台自动处理并发。如果自己用 Docker 部署,建议用异步框架(Python asyncio / Node.js),单进程可处理数百并发连接。

Q3:MCP Server 如何保证安全?

三层防护:① 数据库账号只读权限,最小化授权;② Server 层 SQL 白名单,禁止危险操作;③ 敏感信息走环境变量或密钥管理服务,不入代码仓库。

Q4:工具调用失败了,MCP 协议层面怎么处理?

MCP 返回标准 JSON-RPC 错误响应,包含 codemessage。大模型读取错误信息后,可以尝试换参数重试或向用户说明失败原因。关键是要返回结构化的、模型能理解的错误信息。

Q5:MCP 适合什么场景,不适合什么场景?

适合:需要大模型与外部系统交互的场景——数据库查询、API 调用、文件操作、发送通知。不适合:纯文本对话、需要极高实时性的场景(MCP 多一跳有延迟)、单次调用耗时超过 30 秒的重任务。

Q6:一个 Host 可以接多少个 MCP Server?

理论上无上限。实际取决于 Host 的上下文窗口——注册的 Server 越多,工具清单越长,会挤占模型的 context。建议控制在 5-10 个 Server、总共不超过 30 个工具。

Q7:Resources 和 Tools 什么时候用哪个?

Tools 是"做事情"(查天气、发邮件),Resources 是"给资料"(文档、知识库、配置文件)。用户问"帮我查订单"用 Tool,用户问"公司请假流程是什么"用 Resource。

Q8:如果我想把现有的 REST API 变成 MCP Server,怎么做?

两种方式:① 包装模式——在 MCP Server 的 call_tool() 里调用现有 API,最快速;② 阿里云百炼支持直接从 OpenAPI 规范生成 MCP Server,上传 Swagger/OpenAPI 文件即可。


写在最后

MCP 协议解决了一个朴素的问题:大模型再聪明,没有手就干不了活。

它不是什么高深的技术,只是一个标准化的协议。但正是这个标准化,让 AI 应用开发从一个"手工作坊"变成了"工业流水线"——写完一个 MCP Server,所有模型都能用。

2026 年,MCP 已经从早期的概念验证进入了大规模落地阶段。现在学习 MCP,不算早,也绝不算晚,刚好是最合适的时机。


系列文章

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐