编程 MCP 2026-07 规范深度解析:从工具调用协议到生产级 Agent 基础设施

2026-07-23 18:45:50 +0800 CST views 7

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 方法让客户端可以按需了解服务端能力,而不仅仅是一次性拉取完整清单。配合 ttlMscacheScope,稳定的工具清单和资源拥有了明确的缓存策略。

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 交付的不只是答案,而是答案的结构运行轨迹。这是因为:

  1. 审计要求:金融、监管场景需要完整的过程可追溯
  2. 合规要求:AI 结论需要人工复核时,需要提供可验证依据
  3. 反幻觉要求:结构化数据比自然语言更容易被验证

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 的五个根本问题:

  1. Tool 层回答:我有什么能力?
  2. Server 层回答:这些能力属于哪个专业范围?
  3. Resources 层回答:调用前需要理解什么?
  4. SKILL 层回答:怎样组合这些能力完成任务?
  5. 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 互联网 的基础设施逐步成型。

未来三到五年,最有可能发生的演进:

  1. MCP Server 注册与发现平台会像 Docker Hub 一样成为标配
  2. MCP Gateway 会成为企业 AI 架构的标准组件
  3. 协议标准化会催生 MCP 认证体系(类似 TLS 证书)
  4. 多 Agent 协作会通过 MCP+A2A 的组合成为主流架构模式

MCP 正在从一个「让 AI 调用工具」的协议,变成「让 AI 系统规模化运行」的基础设斀。这次 2026-07 规范,是这个转变中最关键的一步。


本文参考资料:MCP 2026-07 RC 规范文档、企查查 MCP 工程实践、腾讯网《MCP 2026-07-28 发布在即》专题报道、CSDN《AI新范式 07 多智能体标准协议深度解析》。

推荐文章

html一些比较人使用的技巧和代码
2024-11-17 05:05:01 +0800 CST
Python 基于 SSE 实现流式模式
2025-02-16 17:21:01 +0800 CST
Vue3中如何处理异步操作?
2024-11-19 04:06:07 +0800 CST
JavaScript 上传文件的几种方式
2024-11-18 21:11:59 +0800 CST
程序员茄子在线接单