MCP 协议实战:让 AI Agent 真正连上你的业务系统
MCP 协议实战让 AI Agent 真正连上你的业务系统MCP 正在成为 AI Agent 接入外部工具的HTTP 时刻。但读文档和实际落地之间隔着一个真实的业务系统。背景上个月给出海电商团队搭一个运营数据 Agent需求很朴素自然语言查订单、分析 SKU 周转、对比各站点 GMV。传统做法是写个 RAG SQL GeneratorPrompt 里拼一堆 Schema 让 LLM 猜怎么查。但有两个根本问题Schema 膨胀出海业务跨多国多站点表结构随站点定制Prompt 塞不下安全风险让 LLM 直接拼 SQL白名单纯靠 Prompt 约束 防君子不防小人我需要一种方式让 Agent 像调用 HTTP API 一样调内部服务 ——MCP (Model Context Protocol)恰好是这个抽象。插一句这让我想起早期门户时代的「频道模板系统」。CMS 后台给编辑一个结构化表单编辑填参数不用碰 HTML。MCP 对 Agent 做的事本质上一样 —— 给 LLM 一个结构化的工具契约让它不用碰底层实现。技术方案MCP 是什么两句话说清楚MCP 是 Anthropic 提出的开放协议定义了两个角色MCP Server暴露 Tools / Resources / Prompts 的服务端MCP Client调用这些能力的一方通常是 AI Agent Host如 Claude Desktop、Cursor、自建 Agent通信走 JSON-RPC 2.0支持stdio和Server-Sent Events (SSE)两种传输。对业务系统集成来说SSE 是最实用的方案 —— 不需要 Agent 和 Server 在同一台机器上。架构设计┌──────────────┐ SSE(HTTP) ┌──────────────┐ gRPC ┌──────────────┐ │ AI Agent │ ◄──────────────► │ MCP Server │ ◄──────────► │ 业务服务 │ │ (Claude/自建) │ │ (Node.js) │ │ (订单/BI等) │ └──────────────┘ └──────────────┘ └──────────────┘MCP Server 充当翻译层把 Agent 的工具调用请求翻译成内部 RPC把返回结果格式化成 Tool Result。选型理由不用改现有服务MCP Server 作为独立 Sidecar 部署业务服务零侵入SSE 模式天然支持跨机器Agent 在云端MCP Server 在内网过一层 API Gateway 就行TypeScript 生态modelcontextprotocol/sdk官方 SDK和现有 Node 技术栈匹配实施步骤Step 1创建 MCP Server 项目mkdir order-mcp-server cd order-mcp-server npm init -y npm install modelcontextprotocol/sdk express cors npm install -D typescript types/node tsxStep 2定义 Tool 清单按业务需求定义了 3 个 Tool// tools/schema.ts export const TOOLS: ToolDefinition[] [ { name: query_orders, description: 按站点、日期范围、订单状态查询订单列表, parameters: { type: object, properties: { site: { type: string, enum: [US, SEA, ME, LATAM], description: 站点代码 }, startDate: { type: string, description: 开始日期格式 YYYY-MM-DD }, endDate: { type: string, description: 结束日期格式 YYYY-MM-DD }, status: { type: string, enum: [PENDING, SHIPPED, DELIVERED, CANCELED] }, limit: { type: number, default: 20 } }, required: [site, startDate, endDate] } }, { name: get_sku_metrics, description: 查询 SKU 的周转天数、库存深度、近 30 天销量, parameters: { type: object, properties: { skuCode: { type: string, description: SKU 编码 }, site: { type: string, enum: [US, SEA, ME, LATAM] } }, required: [skuCode, site] } }, { name: compare_gmv, description: 对比多个站点的 GMV支持同比/环比, parameters: { type: object, properties: { sites: { type: array, items: { type: string }, description: 站点列表 }, compareType: { type: string, enum: [yoy, mom], description: 同比/环比 } }, required: [sites] } } ];注意Tool 的description就是 Agent 的API 文档。写得越精确Agent 调用越准确。这里踩过一个坑 —— 最早compare_gmv没限制sites数组长度Agent 一次传 12 个站点后端 SQL 直接超时。Step 3实现 SSE MCP Server// server.ts import { McpServer } from modelcontextprotocol/sdk/server/mcp.js; import { SSEServerTransport } from modelcontextprotocol/sdk/server/sse.js; import express from express; import { TOOLS } from ./tools/schema; import { OrderService } from ./services/order; const app express(); const transportMap new Mapstring, SSEServerTransport(); // SSE endpoint — 建立长连接 app.get(/sse, async (req, res) { const transport new SSEServerTransport(/messages, res); const mcpServer new McpServer({ name: order-mcp-server, version: 1.0.0 }); // 注册 Tools for (const tool of TOOLS) { mcpServer.tool( tool.name, tool.description, tool.parameters, async (args: any) { return await OrderService.handleToolCall(tool.name, args); } ); } transportMap.set(transport.sessionId, transport); await mcpServer.connect(transport); res.on(close, () transportMap.delete(transport.sessionId)); }); // POST endpoint — 接收 JSON-RPC 消息 app.post(/messages, express.json(), async (req, res) { const sessionId req.query.sessionId as string; const transport transportMap.get(sessionId); if (!transport) { res.status(404).end(); return; } await transport.handlePostMessage(req, res); }); app.listen(3001, () console.log(MCP Server running on :3001));关键点SSE 模式下需要维护sessionId → transport映射。每次请求带sessionIdquery param 来路由到正确的长连接。Step 4在 Agent 侧配置 MCP Client以 Claude Desktop 为例编辑claude_desktop_config.json{ mcpServers: { order-service: { url: https://internal-api.your-company.com/mcp/sse, headers: { Authorization: Bearer your-api-token } } } }自建 AgentWorkBuddy 等则需要在 Agent 侧实现 MCP Client 的 SSE transport。SDK 提供了标准客户端接入代码如下import { Client } from modelcontextprotocol/sdk/client/index.js; import { SSEClientTransport } from modelcontextprotocol/sdk/client/sse.js; const transport new SSEClientTransport( new URL(https://internal-api/mcp/sse) ); const client new Client({ name: my-agent, version: 1.0.0 }); await client.connect(transport); // 获取可用工具列表 const tools await client.listTools(); // 调工具 const result await client.callTool({ name: compare_gmv, arguments: { sites: [US, SEA], compareType: mom } });踩坑记录坑 1SSE 重连风暴现象Agent 掉线后重连短时间内创建了 200 个 SSE 连接服务 OOM。根因Claude Desktop 的重连退避算法默认最大值太小30s突发重连时瞬间打满连接池。解决Server 侧加maxConnectionsPerClient限制我们设 5旧连接加 60s TTL超时主动断Agent 侧reconnect.backoff调到最大 120s// 连接数限制 const MAX_PER_CLIENT 5; const clientConnectionCount new Mapstring, number(); app.get(/sse, (req, res) { const clientId req.headers[x-client-id] as string || req.ip; const count clientConnectionCount.get(clientId) || 0; if (count MAX_PER_CLIENT) { res.status(429).json({ error: Too many connections }); return; } clientConnectionCount.set(clientId, count 1); res.on(close, () { const c clientConnectionCount.get(clientId) || 1; clientConnectionCount.set(clientId, Math.max(0, c - 1)); }); // ... rest of handler });坑 2Tool Result 太大导致上下文爆炸现象query_orders一次返回 500 条订单每条含完整地址、物流轨迹、备注。Agent 收到后 Token 直接飙到上限后续对话全丢。解决Tool 返回做摘要化只返回关键字段列表类结果限制行数大量数据走Resource 模式而非 Tool Result。Agent 拿到 Resource URI 后按需读取// Tool 返回精简版附带 Resource URI async function queryOrders(args: QueryOrdersArgs) { const orders await OrderService.query(args); return { content: [{ type: text, text: JSON.stringify({ total: orders.total, summary: orders.items.slice(0, 20).map(o ({ id: o.id, site: o.site, status: o.status, amount: o.amount, createdAt: o.createdAt })), _more: mcp-resource://orders/detail?ids${orders.itemIds.join(,)} }) }] }; }坑 3认证 token 泄露到 LLM现象有一天翻 Agent 日志发现一次 Tool 调用的错误信息里包含了服务端返回的Authorization header expired: Bearer sk-xxx...。这个信息构成了 LLM 的上下文如果后续对话持续token 有概率被泄露。解决MCP Server 层的错误信息做脱敏处理不透露任何 credential/token/secretsasync function handleToolCall(toolName: string, args: any) { try { return await callInternalService(toolName, args); } catch (err: any) { // 永远不要让原始错误信息进入 Agent 上下文 return { isError: true, content: [{ type: text, text: Service temporarily unavailable, please retry }] }; } }实际内网的错误信息打全量日志到 ELKAgent 只看脱敏后的消息。总结MCP 的意义不在于技术本身有多复杂它就是个 JSON-RPC over SSE而在于标准化了 Agent ↔ 工具之间的契约。这跟当年互联网从各种自定义二进制协议收敛到 HTTP 的逻辑一样标准化降低集成成本、催生生态。几个关键收获Tool description 是最重要的文档写得不精确 Agent 调不对SSE 连接的生命周期管理是线上最大的坑重连策略、连接池、TTL 都要提前设计Tool Result 的粒度决定了 Token 消耗宁可多分几个小 Tool也别用一个巨型 Tool 塞所有数据安全审计要覆盖 Tool→Agent 的返回路径任何错误信息都可能成为 LLM 的上下文目前在出海业务侧MCP Server 已经接了订单、库存、物流三个域。下一步打算把多站点的 BI 指标也通过 MCP 暴露让运营能把「东南亚站上月 GMV 环比为什么掉了 15%」这种问题直接问 Agent。作者lotusxyhf互联网老兵转型出海 AI Agent 赛道。从门户到 AI踩过的坑比写过的代码还多。欢迎评论区交流。

相关新闻

信号处理中波动度量的选择:平均偏差、方差与标准差详解

信号处理中波动度量的选择:平均偏差、方差与标准差详解

1. 信号处理中的“波动”度量:不止是标准差在信号处理这个行当里,我们每天都在和数据打交道。无论是音频降噪、图像增强,还是雷达目标检测,核心任务之一就是从充满“噪声”的原始信号中,提取出我们真正关心的“信息”。…

2026/8/7 14:06:27 阅读更多 →
机动车固定测速仪 8寸可翻转液晶触摸屏 机动车测速仪解决方案

机动车固定测速仪 8寸可翻转液晶触摸屏 机动车测速仪解决方案

本设备采用8寸可翻转液晶触摸屏,角度可调节。 配备远程监控录像机具备自动抓怕占用应急车道。本设备用了窄波雷达可规避电子狗的监测。防止车辆速度快等行为。本设备支持内置电池供电,使用方便。本设备支持接入后台管理服务,方便工作人员对数…

2026/8/6 12:15:53 阅读更多 →
G-Helper:华硕笔记本性能管理的轻量级革命,告别Armoury Crate臃肿体验

G-Helper:华硕笔记本性能管理的轻量级革命,告别Armoury Crate臃肿体验

G-Helper:华硕笔记本性能管理的轻量级革命,告别Armoury Crate臃肿体验 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, Pro…

2026/8/6 12:15:53 阅读更多 →

最新新闻

电子电路反馈原理:从负反馈到稳定性设计,硬件工程师必备

电子电路反馈原理:从负反馈到稳定性设计,硬件工程师必备

1. 项目概述:从“反馈”说起,为什么它无处不在? 聊到电子电路,无论是你手机里的充电管理芯片,还是音响功放里的运放,甚至是工厂里控制电机转速的驱动器,背后都离不开一个核心概念—— 反馈 。…

2026/8/7 15:21:26 阅读更多 →
Kafka Producer拦截器实战:从监控统计到链路追踪的完整指南

Kafka Producer拦截器实战:从监控统计到链路追踪的完整指南

1. 从“发出去就行”到“发得明明白白”:为什么我们需要Producer拦截器在Kafka的生产者(Producer)开发中,很多朋友,尤其是刚入门的开发者,常常会陷入一个思维定式:我的任务就是把消息成功发送到…

2026/8/7 15:21:26 阅读更多 →
安卓应用脱壳实战:Frida-DexDump原理与逆向工程应用

安卓应用脱壳实战:Frida-DexDump原理与逆向工程应用

1. 项目概述 如果你正在研究安卓应用的安全,或者对逆向工程感兴趣,那你一定绕不开“脱壳”这个词。简单来说,很多安卓应用为了保护自己的核心代码不被轻易分析和篡改,会使用各种加固技术,把原本清晰的Dex文件&#xff…

2026/8/7 15:21:26 阅读更多 →
Unity游戏开发:从状态机到行为树,打造类银河恶魔城BOSS战AI系统

Unity游戏开发:从状态机到行为树,打造类银河恶魔城BOSS战AI系统

1. 项目概述:从零到一构建“苍蝇之母”BOSS战 做独立游戏开发,尤其是像《空洞骑士》这种以精妙战斗和氛围感著称的类银河恶魔城游戏,制作第一个可玩的BOSS绝对是一个里程碑式的节点。这不仅仅是放一个模型、写几行攻击代码那么简单&#xff0…

2026/8/7 15:21:26 阅读更多 →
MicMute:Windows麦克风一键静音的终极免费解决方案

MicMute:Windows麦克风一键静音的终极免费解决方案

MicMute:Windows麦克风一键静音的终极免费解决方案 【免费下载链接】MicMute Mute default mic clicking tray icon or shortcut 项目地址: https://gitcode.com/gh_mirrors/mi/MicMute 你是否厌倦了在远程会议中手忙脚乱地寻找麦克风设置?是否在…

2026/8/7 15:21:26 阅读更多 →
本科生必备AIGC工具指南:提升效率与学术诚信

本科生必备AIGC工具指南:提升效率与学术诚信

1. 为什么本科生需要关注AIGC工具? 最近两年,AIGC(人工智能生成内容)技术正在彻底改变我们的内容创作方式。作为一名带过上百名本科生的导师,我发现很多同学还在用传统方式写论文、做PPT、处理数据,这实在太…

2026/8/7 15:20:26 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →