企业内部 MCP server 怎么写:从协议到生产部署
2026 年,MCP(Model Context Protocol)已成为 企业 AI Agent对接内部系统的事实标准。一次写好的 MCP server,可以被 Claude Desktop、Cursor、自研 Agent、第三方 SaaS 同时调用。本文给一份从最小可用到生产部署的实战手册。
一、MCP 协议简介
MCP 是 Anthropic 2024 年开源、2026 年被 OpenAI/Google 跟进的标准。核心三个原语:
- Resources:只读数据,比如「内部 wiki 某页」、「订单 #123 的状态」
- Tools:可执行动作,比如「创建工单」、「查询数据库」、「调用支付」
- Prompts:可复用 prompt 模板,比如「请用合规口径回答金融问题」
传输层:stdio(本地工具)或 HTTP + SSE(企业内网常用)。
二、最小 TS server 模板
// pnpm add @modelcontextprotocol/sdk-typescript
import { Server } from "@modelcontextprotocol/sdk-typescript/server";
import { StdioServerTransport } from "@modelcontextprotocol/sdk-typescript/server/stdio";
const server = new Server({ name: "company-internal", version: "1.0.0" });
server.setRequestHandler("tools/list", async () => ({
tools: [{
name: "get_order_status",
description: "查询某订单当前状态",
inputSchema: {
type: "object",
properties: { orderId: { type: "string" } },
required: ["orderId"]
}
}]
}));
server.setRequestHandler("tools/call", async (req) => {
if (req.params.name === "get_order_status") {
const data = await fetchOrder(req.params.arguments.orderId);
return { content: [{ type: "text", text: JSON.stringify(data) }] };
}
throw new Error("unknown tool");
});
await server.connect(new StdioServerTransport());
三、企业鉴权(生产必做)
// HTTP transport + OIDC 校验
import { HttpServerTransport } from "@modelcontextprotocol/sdk-typescript/server/http";
import { verifyJwt } from "./auth";
const transport = new HttpServerTransport({
port: 8080,
middleware: [async (req, next) => {
const token = req.headers["authorization"]?.replace("Bearer ", "");
const user = await verifyJwt(token);
if (!user) throw new Error("unauthorized");
req.user = user;
await next();
}]
});
// 每个 tool 还要做行级权限:
server.setRequestHandler("tools/call", async (req) => {
await checkPermission(req.user, req.params.name, req.params.arguments);
await audit(req.user, req.params.name, req.params.arguments);
// ...
});
四、内网部署
- 容器化:Docker 镜像,pnpm 多阶段构建,体积控制在 200MB 内
- 反向代理:Nginx 或 Envoy 接 mTLS,Agent 客户端必须挂内部 CA 证书
- 多副本 + 健康检查:/health 接口返回 200,K8s liveness/readiness 探针标配
- 可观测:Prometheus 暴露 mcp_tool_call_duration_seconds_bucket,每个 tool 一个 label
- 限流:按用户 + 按 tool 双维度,避免 Agent 失控调用打挂下游
五、多 Agent 复用与版本管理
# 一份 MCP server 同时被这些 Agent 接:
# - Claude Desktop(员工日常)
# - 内部客服 Agent
# - 数据分析 Agent
# - 第三方 SaaS(合规白名单)
# tool 命名带版本:
v1_get_order_status ← 现存版本
v2_get_order_status ← 新版(params 多一字段)
# 公告日历:
v2 发布 → 公告 30 天 → v1 标 deprecated → 60 天后下线
六、性能与成本经验
- Agent 单次会话平均调 3-8 次 tool;P95 控在 200ms 以内才不影响对话体验
- 缓存:只读 Resources 用 ETag + edge cache,命中率可到 60%
- 批量化:把「单条查询」改成「批量查询 tool」,token 消耗 -40%
- 日志体积:每天每千次会话约 1-3GB tool 日志,按月归档到对象存储
七、6 个常见错误
- ❌ 没做鉴权:内网穿透即被任意 Agent 调用,是事故起点
- ❌ tool 描述太短:模型选错工具,对话变笨。描述要写「什么场景下用 + 返回什么」
- ❌ 所有 tool 共享一个 schema:参数验证形同虚设
- ❌ 不做审计日志:出事查不出谁的 Agent 干的
- ❌ 同步阻塞调下游:一个慢接口把整个 MCP server 卡死
- ❌ 无版本管理:升级 tool 直接破坏现有 Agent
常见问题
MCP 是什么,包含哪些核心原语?
MCP 即 Model Context Protocol,是标准化 Agent 与工具对话的协议。核心三个原语:Resources(只读数据,如内部 wiki 某页或某订单状态)、Tools(可执行动作,如创建工单、查询数据库)、Prompts(可复用的 prompt 模板)。传输层用 stdio(本地工具)或 HTTP 加 SSE(企业内网常用)。
为什么企业内部 MCP server 一定要做鉴权?
没做鉴权是事故起点:内网穿透后即可被任意 Agent 调用。生产环境的 HTTP transport 应接 OIDC、mTLS 或内部 SSO,每次 CallTool 都校验 token 与用户的行级权限,并记录审计日志,否则出事时查不出是谁的 Agent 干的。
一个 MCP server 能被多个 Agent 复用吗?
可以。一份写好的 MCP server 能同时被 Claude Desktop、内部客服 Agent、数据分析 Agent、合规白名单内的第三方 SaaS 接入。建议 tool 命名带版本前缀(如 v1_、v2_),新版本发布后公告一段时间,再把旧版本标记 deprecated 并延后下线,避免突袭式破坏现有 Agent。
内网部署 MCP server 要注意哪些工程要点?
容器化用 Docker 多阶段构建控制镜像体积;反向代理用 Nginx 或 Envoy 接 mTLS;多副本加 /health 健康检查配合 K8s 探针;可观测用 Prometheus 暴露每个 tool 的调用指标;并按用户和 tool 双维度限流,避免 Agent 失控调用打挂下游。
艾景特能帮企业做 MCP server 吗?
可以。艾景特科技(Aijentra)帮企业把 CRM、ERP、内部 API、知识库一次封装成 MCP server,供所有 Agent 复用,交付内容含审计与多 Agent 接入。可写信至 [email protected] 咨询 MCP 方案。
需要为内部系统写 MCP server?
艾景特帮企业把 CRM / ERP / 内部 API / 知识库一次封装成 MCP server,所有 Agent 复用,6-10 周交付,含审计与多 Agent 接入。
咨询 MCP 方案