MCP 2026-07 规范深度解析:当 AI 工具调用协议走向生产级基础设施
引言:从"调工具"到"建系统"的质变
2026 年 7 月 28 日,Model Context Protocol(MCP)正式发布 2026-07 规范候选版(Release Candidate),这是 MCP 自 2024 年推出以来规模最大的一次系统性修订。官方将这次更新定性为「协议推出以来规模最大的一次修订」,绝非夸张。
从表面看,这次更新增加了无状态核心、能力发现、JSON Schema 完整化、链路追踪、MCP Apps 等一系列新特性。但如果我们穿透这些技术术语,会发现一个更本质的变化:MCP 正在从「让 AI 会调工具」的轻量连接协议,演化为「让 AI 系统能规模化运行」的生产级基础设施。
这次升级的核心意义,不是又多了几种调用方式,而是推动整个 MCP 生态进入企业级部署的深水区。
本文将从工程师视角出发,深度解析 MCP 2026-07 的核心变化:无状态化改造、能力发现与治理、任务与多轮对话扩展、企业数据集成实践,以及这些变化对开发者意味着什么。
一、背景:MCP 是什么,为什么需要它
1.1 连接 AI 与外部世界的问题
在 MCP 出现之前,AI 应用连接外部工具面临一个结构性问题:每个 AI 应用和每个工具之间的集成都是定制开发,形成经典的 N×M 集成噩梦。
以一个企业内部 AI 助手为例,它可能需要:
- 查询内部 CRM 系统获取客户数据
- 访问公司知识库文档
- 操作文件系统读写报告
- 调用第三方 API(天气、地图、支付)
- 控制智能设备
在没有统一协议的时代,每新增一个工具,都需要为 AI 应用编写专门的适配代码、处理权限验证和错误处理。这就是所谓的「最后一公里」问题:模型的推理能力再强,如果无法安全、可扩展地连接外部世界,其价值就大打折扣。
1.2 MCP 的设计哲学
MCP 由 Anthropic 设计并开源,核心目标是为 LLM 与外部工具之间建立标准化、安全、可扩展的通信机制。
你可以把它理解为三层东西:
- AI 世界的「USB 协议」:就像 USB-C 让电脑即插即用各种外设,MCP 让 LLM 即插即用各种工具
- 模型的「系统调用接口」:为 LLM 提供统一的外部资源请求规范
- 工具生态的「通用插座」:任何符合 MCP 的工具可被任何支持 MCP 的 AI 应用直接使用
1.3 经典架构:三层角色与通信模型
MCP 采用经典的 Client-Server 架构,核心包含三个角色:
┌─────────────────────────────────────────────────────┐
│ MCP Host (AI 应用) │
│ 例如:Claude Desktop、Cursor IDE、QClaw │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ MCP Client │ │ MCP Client │ │ MCP Client │ │
│ │ (文件工具) │ │ (数据库工具) │ │ (搜索工具) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
└─────────┼─────────────────┼─────────────────┼─────────┘
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ MCP Server │ │ MCP Server │ │ MCP Server │
│ (文件系统) │ │ (数据库) │ │ (网络搜索) │
└───────────┘ └───────────┘ └───────────┘
MCP 服务器(Server):独立进程,暴露工具(Tools)、资源(Resources)和提示模板(Prompts)。作为独立进程运行,与客户端隔离。
MCP 客户端(Client):集成在 AI 应用中,负责发现服务器能力、管理工具调用、聚合多服务器能力。
MCP 主机(Host):协调多个客户端,管理会话上下文,是用户与 AI 交互的入口。
通信基于 JSON-RPC 2.0,传输层支持 stdio(本地进程)和 SSE(远程服务)。
二、2026-07 规范的核心变化:四个生产化信号
MCP 2026-07 的变化非常多,但归纳起来,对生产部署影响最大的有四个方向,我们称之为「四个生产化信号」。
2.1 信号一:无状态核心——从「会话绑定」到「请求自包含」
这是 2026-07 最基础、也最关键的变化。
旧版的工作方式:
Client → Load Balancer → 固定 Server 实例 + Session Store
(需要 Sticky Session)
远程 MCP 在早期版本中需要维护协议会话状态。客户端先完成握手,后续请求依赖同一份 Session。这意味着:
- 负载均衡器必须使用 sticky session(会话粘性)
- 共享 Session Store 成为必需
- 实例故障需要会话恢复机制
- 容器化部署和 Serverless 扩展困难
新版的工作方式:
Client → 普通 Load Balancer → 任意 Server 实例
(无协议层会话状态)
2026-07 取消了 initialize/initialized 握手和 Mcp-Session-Id。每个请求携带完成处理所需的全部信息,不再依赖某台固定服务器保存的协议会话。
工程含义:
- ✅ 可以水平扩容,任意实例可处理任意请求
- ✅ 可使用普通轮询负载均衡,无需 sticky session
- ✅ 故障切换自然发生,无需会话恢复
- ✅ 减少共享状态,简化容器和 Serverless 部署
- ✅ 可复用成熟的 HTTP 网关和负载均衡体系
无状态 ≠ 业务无状态:
需要特别强调:无状态化的是协议层会话。业务逻辑仍然可以有状态——比如用户认证状态、权限上下文、积分限额等。这些通过请求参数或外部存储独立维护,不再耦合在协议会话中。
Python 实现示例——旧版 vs 新版服务端:
# ========== 旧版方式:维护 Session 状态 ==========
import asyncio
from mcp.server import Server
app = Server("my-server")
sessions = {} # 需要维护会话状态存储
@app.list_tools()
async def list_tools():
return []
@app.call_tool()
async def call_tool(name: str, arguments: dict, session_id: str):
# 每个请求必须携带 session_id
session = sessions.get(session_id)
if not session:
raise ValueError("Invalid session")
# 执行业务逻辑...
return result
# 问题:需要 sticky session,无法横向扩展
# ========== 新版方式:无状态请求自包含 ==========
from mcp.server import Server
from mcp.server.stdio import stdio_server
import asyncio
app = Server("my-server")
@app.list_tools()
async def list_tools():
# 无状态:不需要 session 上下文
return [
Tool(
name="search_database",
description="Query enterprise data",
inputSchema={
"type": "object",
"properties": {
"company_name": {"type": "string"},
"data_type": {"type": "string", "enum": ["basic", "risk", "shareholder"]}
}
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict):
# 每个请求独立可处理,参数中包含完整上下文
company = arguments.get("company_name")
data_type = arguments.get("data_type")
# 通过参数传递认证信息(不再依赖协议会话)
# auth_token = arguments.get("_auth_token") # 由网关/客户端注入
result = await query_enterprise_data(company, data_type)
return TextContent(type="text", text=str(result))
async def main():
async with stdio_server() as (read_stream, write_stream):
await app.run(
read_stream,
write_stream,
app.create_initialization_options()
)
# 关键:无需 session 存储,可任意横向扩容
TypeScript 实现示例——新版服务端:
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from '@modelcontextprotocol/sdk/types.js';
const server = new Server(
{ name: 'enterprise-data-mcp', version: '1.0.0' },
{ capabilities: { tools: {} } }
);
// 无状态工具注册:每个工具都有完整 Schema
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: 'query_company',
description: 'Query enterprise basic information',
inputSchema: {
type: 'object',
properties: {
company_name: { type: 'string', description: 'Company name' },
use_history: {
type: 'boolean',
description: 'Query historical records instead of current',
default: false
}
},
required: ['company_name']
}
},
{
name: 'risk_scan',
description: 'Comprehensive risk scanning for an enterprise',
inputSchema: {
type: 'object',
properties: {
company_id: { type: 'string', description: 'Unified social credit code' }
},
required: ['company_id']
}
}
]
};
});
// 无状态调用处理:每次调用完全独立
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
switch (name) {
case 'query_company': {
// 直接使用请求参数中的数据,无需 session 上下文
const result = await queryCompany(args.company_name, args.use_history);
return {
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]
};
}
case 'risk_scan': {
const result = await performRiskScan(args.company_id);
return {
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }]
};
}
default:
throw new Error(`Unknown tool: ${name}`);
}
});
// 启动:无状态,可直接水平扩展
const transport = new StdioServerTransport();
server.connect(transport);
2.2 信号二:能力发现——从「列清单」到「可治理」
旧版的问题:
当 MCP Server 只有 10 个工具时,列出所有工具给 AI 是合理的。但当一个平台拥有 9 个 Server、197 个工具时(参考企查查 MCP 的实际规模),列清单就变成了噪音。
AI 可能选错工具、重复调用、误解空数据含义、把当前状态和历史状态混为一谈。工具越多,治理越重要。
新版的能力发现体系:
2026-07 引入了一套完整的能力发现与治理机制:
// server/capabilities 响应示例(2026-07 新增)
{
"capabilities": {
"tools": {
"list": true,
"discoverable": true, // 新增:可被网关发现
"cacheable": true, // 新增:可缓存
"cache": {
"ttlMs": 300000, // 缓存 5 分钟
"scope": "server" // server|account|user
}
},
"resources": {
"list": true,
"subscribe": true,
"discoverable": true
}
},
"methods": ["tools/call", "tools/list", "server/discover"],
"name": "enterprise-data-mcp",
"version": "1.0.0"
}
新增的 server/discover 方法让客户端可以按需了解服务端能力,而不仅仅是一次性拉取完整清单。配合 ttlMs 和 cacheScope,稳定的工具清单和资源拥有了明确的缓存策略。
Mcp-Method 和 Mcp-Name 头字段:
新版 MCP 在 HTTP 传输层引入了标准化的元数据头:
Mcp-Method:标识调用的方法类型Mcp-Name:标识调用的工具名称
这些头字段让负载均衡网关可以识别特定工具调用,实施限流、审计和路由策略。
# Python 服务端:标注能力发现元数据
from mcp.server import Server
from mcp.types import Tool
app = Server("enterprise-mcp")
# 能力元数据注解
@app.list_tools(
discoverable=True,
cache_ttl_seconds=300,
cache_scope="server"
)
async def list_tools():
return [
Tool(
name="company_search",
description="Search enterprise by name (current records only)",
inputSchema={...},
metadata={
"capability_group": "enterprise_basic",
"rate_limit": "100/minute",
"requires_auth": True,
"data_freshness": "realtime"
}
),
Tool(
name="company_history",
description="Search historical records (changes over time)",
inputSchema={...},
metadata={
"capability_group": "enterprise_history",
"rate_limit": "50/minute",
"requires_auth": True,
"data_freshness": "daily_snapshot"
}
)
]
能力分组与路由策略:
对于大型 MCP 服务端,工具分类治理至关重要:
# 能力分组:让 AI 理解工具边界
CAPABILITY_GROUPS = {
"enterprise_basic": {
"tools": ["company_search", "company_detail", "branch_list"],
"description": "Current enterprise records — real-time data",
"priority": "high",
"cache_ttl": 300
},
"enterprise_history": {
"tools": ["company_history", "change_records", "historical_risk"],
"description": "Historical enterprise records — snapshot data",
"priority": "medium",
"cache_ttl": 3600
},
"risk_assessment": {
"tools": ["risk_scan", "litigation_check", "executive_risk"],
"description": "Risk dimension scanning",
"priority": "high",
"cache_ttl": 600
},
"document_analysis": {
"tools": ["parse_pdf", "extract_tables", "ocr_scan"],
"description": "Document structure extraction",
"priority": "low",
"cache_ttl": 0 # 不缓存,实时处理
}
}
# 工具选择决策逻辑
async def select_tools(task: str, context: dict) -> list[str]:
"""根据任务上下文选择合适的工具集"""
if "历史" in task or "历年" in task or "变化" in task:
return CAPABILITY_GROUPS["enterprise_history"]["tools"]
elif "风险" in task or "诉讼" in task or "失信" in task:
return CAPABILITY_GROUPS["risk_assessment"]["tools"]
elif "文档" in task or "PDF" in task or "合同" in task:
return CAPABILITY_GROUPS["document_analysis"]["tools"]
else:
return CAPABILITY_GROUPS["enterprise_basic"]["tools"]
2.3 信号三:任务治理——从「一次调用」到「持续完成」
长任务的困境:
在旧版 MCP 中,一次 tools/call 就是完整的交互。但真实业务场景中,很多任务无法在单次调用中完成:
- 金融机构的对公尽调任务:需要先查主体、再扫风险、最后出报告
- 法律领域的批量案例检索:需要分批查询、聚合、去重
- 数据导出任务:需要多轮确认、大文件分片传输
- 需要人工确认的关键节点:比如「是否将此企业加入黑名单?」
新版的任务体系:
2026-07 引入了 Multi Round-Trip Requests、Tasks 和 MCP Apps 三个互补机制:
// Tasks 协议扩展示例
{
"jsonrpc": "2.0",
"method": "tasks/create",
"params": {
"task": {
"id": "task_20260723_001",
"description": "Enterprise KYB verification: 企查查科技股份有限公司",
"steps": [
{
"step_id": 1,
"tool": "company_search",
"args": { "company_name": "企查查科技股份有限公司" },
"on_success": "next",
"on_failure": "abort"
},
{
"step_id": 2,
"tool": "risk_scan",
"args": { "company_id": "${step1.company_id}" },
"on_success": "next",
"on_failure": "retry:3"
},
{
"step_id": 3,
"tool": "generate_report",
"args": {
"company_id": "${step1.company_id}",
"risk_data": "${step2.results}",
"require_human_approval": true // 关键节点需人工确认
},
"on_success": "complete",
"on_failure": "abort"
}
],
"timeout_seconds": 300,
"retry_policy": { "max_retries": 3, "backoff": "exponential" }
}
}
}
MCP Apps 的交互界面:
MCP Apps 是 2026-07 引入的另一个重要概念,它为复杂任务提供了标准化的交互界面能力:
# MCP App 界面定义示例
@app.mcp_app("/kyb_verification")
class KYBVerificationApp:
"""企业 KYB 核验 MCP 应用"""
steps = [
Step(
id="entity_anchor",
name="企业主体锚定",
tool="company_search",
description="通过企业名称锚定唯一主体",
required_fields=["company_name"],
validation={
"min_confidence": 0.9,
"require_human_if_multiple": True # 多候选时必须人工确认
}
),
Step(
id="risk_scan",
name="风险维度扫描",
tool="risk_scan",
description="综合扫描工商、经营、司法等风险维度",
depends_on=["entity_anchor"],
skip_if=lambda ctx: ctx.entity_confidence > 0.95 and ctx.is_domestic_company
),
Step(
id="report_generation",
name="生成核验报告",
tool="generate_kyb_report",
description="汇总所有数据生成结构化报告",
depends_on=["risk_scan"],
require_human_approval=True, # 关键步骤需要人工确认
approval_fields=["blacklist_decision", "risk_level_override"]
)
]
def get_context_schema(self) -> dict:
"""定义任务上下文的数据契约"""
return {
"entity": {
"type": "object",
"properties": {
"name": {"type": "string"},
"credit_code": {"type": "string"},
"confidence": {"type": "number", "minimum": 0, "maximum": 1}
}
},
"risk_data": {
"type": "object",
"properties": {
"total_risk_count": {"type": "integer"},
"high_risk_items": {"type": "array", "items": {"type": "string"}},
"judicial_freeze": {"type": "boolean"}
}
},
"approval": {
"type": "object",
"properties": {
"blacklist_decision": {"type": "string", "enum": ["add", "remove", "pending"]},
"risk_level_override": {"type": "string", "enum": ["high", "medium", "low"]},
"reviewer": {"type": "string"},
"review_note": {"type": "string"}
}
}
}
2.4 信号四:结构化交付——从「自然语言答案」到「可验证证据链」
为什么需要结构化:
企业级 MCP 交付的不只是答案,而是答案的结构和运行轨迹。这是因为:
- 审计要求:金融、监管场景需要完整的过程可追溯
- 合规要求:AI 结论需要人工复核时,需要提供可验证依据
- 反幻觉要求:结构化数据比自然语言更容易被验证
JSON Schema 完整化:
2026-07 将 JSON Schema 支持升级到 JSON Schema 2020-12,并为所有工具输入输出定义了完整 Schema:
from mcp.types import Tool
from pydantic import BaseModel, Field
# 使用 Pydantic 定义工具输出的完整 Schema
class CompanyBasicInfo(BaseModel):
"""企业基础信息的数据契约"""
company_name: str = Field(description="企业全称")
unified_credit_code: str = Field(description="统一社会信用代码")
legal_representative: str = Field(description="法定代表人")
registered_capital: float = Field(description="注册资本(万元)")
establishment_date: str = Field(description="成立日期 YYYY-MM-DD")
business_status: str = Field(
description="经营状态:存续/吊销/注销/迁出",
enum=["存续", "吊销", "注销", "迁出"]
)
main_business: str = Field(description="主营业务")
class Config:
json_schema_extra = {
"example": {
"company_name": "企查查科技股份有限公司",
"unified_credit_code": "91110108MA01XXXXXX",
"legal_representative": "张三",
"registered_capital": 5000.0,
"establishment_date": "2014-03-17",
"business_status": "存续",
"main_business": "企业信用信息查询服务"
}
}
@app.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "query_company":
result = await queryCompany(arguments["company_name"])
# 返回结构化结果(而非纯文本)
return [
ContentBlock(
type="resource",
resource=Resource(
uri="schema://company/basic_info",
mimeType="application/json",
text=result.model_dump_json() # 完整 Schema + 数据
)
)
]
W3C Trace Context 链路追踪:
新版 MCP 集成了 W3C Trace Context 标准,为每次工具调用提供标准化链路追踪:
from mcp.server import Server
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
tracer = trace.get_tracer("enterprise-mcp")
@app.middleware
async def tracing_middleware(request, call_next):
# 从请求头提取 Trace Context
trace_context = extract_trace_context(request.headers)
with tracer.start_as_current_span(
f"mcp.{request.method}",
context=trace_context,
attributes={
"mcp.method": request.method,
"mcp.tool.name": getattr(request, 'tool_name', 'unknown'),
"mcp.server.name": "enterprise-data-mcp",
"enterprise.tenant_id": request.headers.get("X-Tenant-ID"),
"enterprise.user_id": request.headers.get("X-User-ID"),
}
) as span:
try:
result = await call_next(request)
# 记录完整调用链:请求 → 工具 → 数据源 → 响应
span.set_attribute("mcp.result.count", len(result))
span.set_attribute("mcp.trace.id", span.get_span_context().trace_id)
return result
except Exception as e:
span.record_exception(e)
span.set_status(StatusCode.ERROR, str(e))
raise
每次调用的链路信息(Trace ID、Span ID)会随响应头返回:
HTTP/1.1 200 OK
Content-Type: application/json
traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
tracestate: congo=t61rcWkgMzE,mcp.server=enterprise-data-mcp
X-MCP-Trace-ID: 0af7651916cd43dd8448eb211c80319c
X-MCP-Span-ID: b7ad6b7169203331
三、完整的企业尽调任务:查对、选对、读对、说清
企查查 MCP 的实际业务场景最能说明 2026-07 规范变化的实际价值。以金融机构常见的企业 KYB 核验为例:
3.1 任务描述
用户请求:
「请帮我对企查查科技股份有限公司做一份完整的 KYB 核验报告,重点核验主体真实性、股东结构及最近 3 年的司法风险。」
3.2 可信执行四步法
第一步:查对主体
async def step1_entity_anchor(company_name: str, use_history: bool = False):
"""
主体锚定:企业简称、曾用名和同名主体都可能导致查错对象。
AI 不能直接拿简称进入风险工具,而应先完成企业识别,
并使用统一社会信用代码或企业唯一标识锚定主体。
"""
search_results = await queryCompany(company_name, use_history=use_history)
if len(search_results) == 0:
return {"status": "not_found", "message": "未找到匹配企业"}
if len(search_results) == 1:
entity = search_results[0]
return {
"status": "anchored",
"entity": entity,
"anchor_type": "unique_match"
}
# 多候选:必须请求用户确认,而非猜一个最像的
return {
"status": "multiple_candidates",
"candidates": search_results,
"require_confirmation": True,
"message": f"找到 {len(search_results)} 个匹配企业,请选择:"
}
第二步:选对能力
async def step2_capability_selection(entity_id: str, task_intent: str):
"""
风险调查 ≠ 把所有工具调用一遍。
采用「先扫后钻」策略:先执行综合风险扫描,
获得各风险维度的数量和分布,再对非零、高风险维度继续查询。
"""
# 1. 先做综合扫描(一次调用获取全维度概览)
scan_result = await comprehensiveRiskScan(entity_id)
# 2. 分析风险分布,决定下钻维度
risk_distribution = scan_result["distribution"]
action_plan = []
for dimension, count in risk_distribution.items():
if count == 0:
continue # 零风险维度跳过
elif count > 10 and dimension in ["litigation", "executive_risk"]:
# 高风险维度:做专项下钻
action_plan.append({
"tool": f"{dimension}_detail",
"args": {"entity_id": entity_id, "limit": count},
"priority": "high"
})
else:
# 低风险维度:仅记录摘要
action_plan.append({
"tool": f"{dimension}_summary",
"args": {"entity_id": entity_id},
"priority": "low"
})
return {
"scan_summary": scan_result,
"action_plan": action_plan,
"estimated_calls": len(action_plan) + 1, # +1 for final report
"estimated_cost": calculate_cost(action_plan)
}
第三步:读对数据
def interpret_results(tool_results: dict, task_context: dict):
"""
AI 需要区分:
- 当前记录 vs 历史记录
- 已确认信息 vs 待核实信息
- 未发现公开记录 vs 企业绝对没有风险
"""
interpretations = {}
for tool_name, raw_data in tool_results.items():
# 解析数据时点
data_timestamp = raw_data.get("data_timestamp")
is_current = raw_data.get("record_type") == "current"
is_historical = raw_data.get("record_type") == "historical"
# 判断风险是否为零
risk_count = raw_data.get("total_count", 0)
risk_status = (
"no_public_records_found" # 找到了零记录
if risk_count == 0
else f"{risk_count}_items_found" # 找到了风险记录
)
# 生成解释文本
interpretations[tool_name] = {
"data_timestamp": data_timestamp,
"record_type": raw_data.get("record_type"),
"risk_status": risk_status,
"explanation": generate_explanation(tool_name, raw_data, task_context),
"confidence_note": (
"historical_data_confirmed"
if is_historical
else "current_data_verified"
),
"boundary_note": (
"AI可以描述记录内容,但不能替代金融机构作出授信决定"
)
}
return interpretations
第四步:说清依据
def generate_report(entity: dict, results: dict, interpretations: dict):
"""
最终报告不只包含自然语言结论,还应保留完整证据链,
使客户能够复核结论是怎样形成的。
"""
report = {
"report_metadata": {
"report_id": generate_report_id(),
"generated_at": get_current_timestamp(),
"task_description": "企业 KYB 核验报告",
"data_scope": "最近36个月"
},
"entity_anchor": {
"company_name": entity["name"],
"unified_credit_code": entity["credit_code"],
"legal_representative": entity["legal_rep"],
"verification_confidence": entity["confidence"],
"verification_method": "统一社会信用代码锚定"
},
"evidence_chain": {
"steps_executed": [],
"tools_used": [],
"data_sources": [],
"key_fields": [],
"generation_reasoning": []
},
"findings": interpretations,
"conclusion": {
"ai_summary": generate_ai_summary(results),
"human_review_required": True,
"review_focus": ["blacklist_decision", "risk_level_final"]
},
"compliance": {
"data_timestamp": get_current_timestamp(),
"data_source": "企查查企业数据平台",
"ai_conclusion_boundary": "AI结论仅供参考,金融机构须独立判断"
}
}
return report
四、MCP 生态的企业落地:工具、治理与最佳实践
4.1 五层能力矩阵:从工具箱到能力平台
企查查 MCP 的实践最有参考价值,因为它代表了一个超大型 MCP 部署的真实经验。他们的核心结论是:MCP 不只是工具箱,而是能力矩阵。
┌─────────────────────────────────────────────────┐
│ 全局约束层(Global Constraints) │
│ 实体锚定规则 │ 当前/历史区分 │ 引用纪律 │ 输出边界 │
├─────────────────────────────────────────────────┤
│ SKILL 层(业务任务编排) │
│ 企业核验 │ UBO识别 │ 尽调 │ 风险扫描 │ 报告生成 │
├─────────────────────────────────────────────────┤
│ Resources 层(稳定知识) │
│ 术语表 │ 数据字典 │ 工具映射 │ 报告模板 │ 方法论 │
├─────────────────────────────────────────────────┤
│ Server 层(专业能力边界) │
│ 企业数据 Server │ 法律数据 Server │ 文档解析 Server │
├─────────────────────────────────────────────────┤
│ Tool 层(原子数据能力) │
│ 工商信息 │ 股权结构 │ 风险维度 │ 知产 │ 司法记录 │
└─────────────────────────────────────────────────┘
这个五层模型回答了 Agent 的五个根本问题:
- Tool 层回答:我有什么能力?
- Server 层回答:这些能力属于哪个专业范围?
- Resources 层回答:调用前需要理解什么?
- SKILL 层回答:怎样组合这些能力完成任务?
- Global Constraints 层回答:哪些边界不能越过?
4.2 Resources 的战略价值
在五层能力矩阵中,Resources 层往往是开发者最容易忽视、但对企业级 MCP 最关键的一层。
Resources 不是另一个数据查询工具,而是供 AI 按需读取的稳定知识资产:
# 企查查 MCP 的 Resources 设计
RESOURCES = {
# 术语表:帮助 AI 理解专业术语
"terminology/glossary": Resource(
uri="enterprise://knowledge/glossary",
name="企业数据术语表",
description="工商、股权、司法等领域的专业术语解释",
content="""
## 关键术语
### 统一社会信用代码
由18位数字或大写字母组成,是企业的唯一身份标识。
AI 应优先使用此代码锚定企业,而非名称。
### 受益所有人(UBO)
最终控制企业的自然人,通常通过股权穿透确定。
穿透层级建议不超过5层。
### 司法冻结
法院对资产采取的强制措施,表示企业涉及未决诉讼。
发现此记录应触发高风险标注。
"""
),
# 数据字典:明确每个字段的含义和取值范围
"datadict/company_basic": Resource(
uri="enterprise://datadict/basic",
name="企业基础信息字段字典",
content="""
## 字段说明
| 字段 | 类型 | 说明 | 取值示例 |
|------|------|------|----------|
| business_status | string | 经营状态 | 存续/吊销/注销/迁出 |
| registered_capital | float | 注册资本(万元) | 5000.0 |
| employee_count | int | 参保人数 | 1200 |
"""
),
# 工具映射:告诉 AI 什么场景用什么工具
"toolmap/enterprise": Resource(
uri="enterprise://toolmap",
name="企业数据工具使用指南",
content="""
## 工具选择决策树
Q1: 需要当前数据还是历史数据?
→ 当前 → company_search, company_detail
→ 历史 → company_history, change_records
Q2: 需要实时数据还是快照数据?
→ 实时 → 工商信息、股东信息
→ 快照 → 年报数据、信用评级
Q3: 涉及哪些具体维度?
→ 司法 → litigation_search, judgment_retrieval
→ 知识产权 → patent_query, trademark_search
→ 经营异常 → operation_anomaly_check
"""
),
# 报告模板:结构化输出的标准格式
"templates/kyb_report": Resource(
uri="enterprise://templates/kyb",
name="KYB 核验报告模板",
content="""
## 报告结构规范
1. 封面:企业名称、报告编号、生成时间
2. 主体确认:信用代码、法人、经营状态
3. 股权结构:穿透图 + 主要股东列表
4. 风险摘要:各维度风险数量统计
5. 详细发现:每个风险记录的完整信息
6. AI 结论:综合评估 + 置信度说明
7. 合规声明:数据来源、时间点、AI 局限性说明
"""
)
}
Resources 的核心价值在于:把知识从分散的 Prompt 中拆分出来,让 AI 在需要时可以精确查找、按需使用,而不是把所有知识都塞进系统提示词。
4.3 Extensions 扩展机制
2026-07 将 Extensions 提升为一等公民,建立了更正式的协议演进机制。
# MCP Extension 示例:自定义扩展能力
from mcp.types import Extension
# 定义企业级扩展
enterprise_extension = Extension(
name="enterprise-capabilities",
version="1.0.0",
capabilities={
"multi_step_workflow": True, # 多步骤工作流
"human_approval_gate": True, # 人工确认门控
"audit_logging": True, # 审计日志
"structured_output": True # 结构化输出
},
custom_methods=[
"enterprise/entity_resolve",
"enterprise/risk_score",
"enterprise/generate_kyb_report"
]
)
@app.register_extension(enterprise_extension)
async def register_enterprise_extension():
return {
"extension": "enterprise-capabilities",
"version": "1.0.0",
"enabled": True,
"methods": enterprise_extension.custom_methods
}
五、从 MCP 到 Agent 互联网:协议栈全景
5.1 Agent 通信的三层需求
MCP 解决的是 Agent 与外部工具的通信问题。但完整的 Agent 系统还需要解决另外两类通信:
| 交互对象 | 核心问题 | 对应协议 |
|---|---|---|
| 外部工具/数据源 | 如何调用 API、查询数据库、访问文件系统? | MCP |
| 其他 Agent | 如何发现对方、协商任务、传递结果? | A2A / ACP / ANP |
| 人类用户 | 如何呈现界面、接收指令、反馈状态? | A2UI / AG-UI |
2026 年,Linux 基金会旗下 Agentic AI Foundation (AAIF) 已经汇聚了 MCP、A2A、ACP 等主流协议,并完成了 ACP 向 A2A 的合并。这标志着 Agent 通信协议栈正在从分散走向整合。
5.2 为什么需要 A2A(Agent-to-Agent)
MCP 让单个 Agent 调用工具。但当系统中有多个专业 Agent 时:
┌──────────────────────────────────────────────────────┐
│ Multi-Agent System │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 销售 Agent │ ←→│ 协作层 │←→ │ 法务 Agent │ │
│ │ │ │ (A2A) │ │ │ │
│ └────┬─────┘ └──────────┘ └────┬─────┘ │
│ │ │ │
│ ↓ ↓ │
│ ┌─────────────────────────────────────────┐ │
│ │ 工具层 (MCP) │ │
│ │ CRM工具 │ 合同工具 │ 邮件工具 │ 文档工具 │ │
│ └─────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘
A2A 协议让不同供应商的 Agent 之间能够:
- 发现彼此:了解对方能做什么
- 协商任务:分解复杂任务并分配给合适的 Agent
- 传递结果:安全地传递中间结果和最终产出
5.3 协议栈的协同
完整的 Agent 互联网协议栈:
┌─────────────────────────────────────────────┐
│ 人类用户界面层 (A2UI / AG-UI) │
├─────────────────────────────────────────────┤
│ Agent 间协作层 (A2A / ANP) │
├─────────────────────────────────────────────┤
│ Agent → 工具层 (MCP) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 工具 A │ │ 工具 B │ │ 工具 C │ │
│ │ (MCP) │ │ (MCP) │ │ (MCP) │ │
│ └─────────┘ └─────────┘ └─────────┘ │
├─────────────────────────────────────────────┤
│ 数据源层 (API / Database / Files) │
└─────────────────────────────────────────────┘
典型场景的协议流转:
用户:「帮我分析这笔交易的对手方风险」
1. A2UI层:用户通过对话界面提交请求
2. A2A层:主 Agent 将任务分解
→ 分配给「企业数据 Agent」:查询对手方基本信息
→ 分配给「风险 Agent」:执行风险扫描
→ 分配给「报告 Agent」:生成分析报告
3. MCP层:各 Agent 调用对应的工具
→ 企业数据 Agent → MCP Server → 企查查数据 API
→ 风险 Agent → MCP Server → 企查查风险数据 API
4. 数据源层:真实的数据查询和计算
六、MCP 2026-07 开发者迁移指南
6.1 协议兼容矩阵
| 功能 | 旧版(< 2026-07) | 新版(2026-07) | 迁移方式 |
|---|---|---|---|
| 会话状态 | 必须维护 Session | 完全无状态 | 移除 session 管理代码 |
| 负载均衡 | 需 sticky session | 普通轮询 | 网关配置简化 |
| 工具发现 | 一次性全量清单 | 支持按需 + 缓存 | 增加 cache 策略 |
| 链路追踪 | 无 | W3C Trace Context | 添加 trace 中间件 |
| 长任务 | 单次调用 | Tasks + MCP Apps | 重构工作流 |
| Schema | 部分支持 | JSON Schema 2020-12 | 补全所有 Schema |
6.2 Python SDK 迁移示例
# ========== 迁移前(基于旧版 SDK)==========
from mcp.server import Server
from mcp.session import SessionManager
server = Server("my-mcp-server")
session_manager = SessionManager() # 旧版需要会话管理
@app.call_tool()
async def call_tool(name: str, arguments: dict, session: Session):
# 依赖 session 存储上下文
ctx = session.get_context()
user_id = ctx.user_id
credits = ctx.remaining_credits
# ... 业务逻辑
return result
# ========== 迁移后(2026-07 风格)==========
from mcp.server import Server
from mcp.server.stdio import stdio_server
server = Server(
name="my-mcp-server",
version="2.0.0",
capabilities={"tools": {"list": True, "discoverable": True}}
)
# 无状态:上下文通过请求参数传递
@app.call_tool()
async def call_tool(name: str, arguments: dict):
# 认证信息从请求头/参数中获取,而非 session
auth_info = arguments.pop("_auth", {})
user_id = auth_info.get("user_id")
credits = auth_info.get("remaining_credits")
# ... 业务逻辑(完全无状态)
return result
async def main():
async with stdio_server() as streams:
await server.run(*streams, server.create_initialization_options())
6.3 生产部署架构
# docker-compose.yml - 2026-07 MCP 服务端部署
version: '3.8'
services:
# 无状态 MCP 服务实例(可水平扩展)
mcp-server-1:
image: enterprise-mcp:2.0.0
environment:
- MCP_SERVER_NAME=enterprise-data-mcp
- MCP_VERSION=2026-07
- LOG_LEVEL=info
- OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
deploy:
replicas: 3 # 多副本,无状态
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
# 普通 HTTP 负载均衡器(不再需要 sticky session)
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- mcp-server-1
# nginx.conf 中使用普通轮询:
# upstream mcp_backend {
# least_conn; # 最少连接优先
# server mcp-server-1:8080;
# server mcp-server-2:8080;
# server mcp-server-3:8080;
# }
# 链路追踪收集器
otel-collector:
image: otel/opentelemetry-collector:0.100.0
command: ["--config=/etc/otel-collector-config.yaml"]
# 审计日志存储
audit-logger:
image: elasticsearch:8.12.0
environment:
- discovery.type=single-node
volumes:
- ./audit-data:/usr/share/elasticsearch/data
# MCP Gateway(可选,企业级功能)
mcp-gateway:
image: mcp-gateway:1.0.0
environment:
- RATE_LIMIT_ENABLED=true
- CAPABILITY_DISCOVERY=true
- TRACE_ENABLED=true
ports:
- "8081:8081"
depends_on:
- nginx
- otel-collector
6.4 性能基准参考
企查查 MCP 的实际生产数据(2026 年 7 月):
| 指标 | 数值 |
|---|---|
| MCP Server 实例数 | 9 个独立服务 |
| 工具总数 | 197 个 |
| 平均工具响应时间 | < 200ms |
| 并发请求峰值 | 5000 QPS |
| 无状态化后扩容效率 | 3x(对比旧版 sticky session) |
| 链路追踪覆盖率 | 100% |
| 平均任务完成轮次 | 4.2 步 |
七、总结与展望
7.1 核心变化回顾
MCP 2026-07 是 MCP 发展史上的一个转折点:
- 无状态化:让 MCP 从需要特殊网关的「专有协议」变成了可以无缝接入现有基础设施的「标准 HTTP 服务」
- 能力治理:让 MCP 从「工具罗列」进化到「能力编排」,为大模型提供了更聪明的工具使用策略
- 任务体系:让 MCP 从「单次调用」扩展到「复杂工作流」,支持人工确认节点和长任务状态管理
- 结构化交付:让 MCP 交付的不仅是答案,更是答案的来源、推理过程和可验证证据
7.2 对开发者的影响
对于已经在使用 MCP 的开发者:
- 如果是服务端开发者:重点关注无状态化迁移和能力 Schema 完善
- 如果是客户端开发者:重点关注能力发现 API 和链路追踪集成
- 如果是企业架构师:重点关注 MCP Apps 和 Extensions 的业务编排能力
对于还没有接入 MCP 的开发者:
- MCP 2026-07 是最佳入场时机——无状态化大幅降低了部署复杂度
- 建议从最简单的场景开始:一个 MCP Server、3-5 个工具,先跑通全流程
- 重点关注 Resources 层的设计——这是企业级 MCP 与玩具级 MCP 的分水岭
7.3 未来展望
随着 A2A、ACP 等 Agent 间协议与 MCP 的深度整合,我们正在见证 Agent 互联网 的基础设施逐步成型。
未来三到五年,最有可能发生的演进:
- MCP Server 注册与发现平台会像 Docker Hub 一样成为标配
- MCP Gateway 会成为企业 AI 架构的标准组件
- 协议标准化会催生 MCP 认证体系(类似 TLS 证书)
- 多 Agent 协作会通过 MCP+A2A 的组合成为主流架构模式
MCP 正在从一个「让 AI 调用工具」的协议,变成「让 AI 系统规模化运行」的基础设斀。这次 2026-07 规范,是这个转变中最关键的一步。
本文参考资料:MCP 2026-07 RC 规范文档、企查查 MCP 工程实践、腾讯网《MCP 2026-07-28 发布在即》专题报道、CSDN《AI新范式 07 多智能体标准协议深度解析》。