MCP企业级应用案例
本文用真实存在的官方 MCP Server(filesystem / postgres / github / slack 等)讲企业落地,并给出多租户 MCP 网关、工具调用审计、与 SIEM 集成的工程方案。所有代码均基于唯一官方 SDK
@modelcontextprotocol/sdk,不使用任何虚构包,可直接作为面试回答。
目录
- ⚠️ 关于本文的修订说明
- 🧱 真实可用的官方 MCP Server
- 🏢 案例1:内部知识库 + 数据库问答(filesystem + postgres)
- 🛠️ 案例2:研发协作助手(github + slack)
- 🚪 企业落地核心:多租户 MCP 网关
- 🧾 工具调用审计与 SIEM 集成
- 📝 落地最佳实践清单
⚠️ 关于本文的修订说明
旧版本曾给出 @mcp/core、@mcp/resources、@mcp/medical-resources、@mcp/ecommerce-resources、HL7AuthenticationProvider 等虚构包,以及「准确率提升 15%、QPS 1 万」这类无出处指标。这些都已删除。企业落地应基于真实官方 Server 与可核实的工程实践,下文据此重写。
🧱 真实可用的官方 MCP Server
Anthropic 维护的参考实现 + 大量第三方官方实现可直接复用,常见包括:
| Server | 能力 | 典型用途 |
|---|---|---|
| filesystem | 受限目录的读/写/列目录 | 文档、代码库只读检索 |
| postgres / sqlite | 只读 SQL 查询、Schema 自省 | 结构化数据问答 |
| github | 仓库、Issue、PR、代码搜索 | 研发协作、代码审查 |
| slack | 频道消息读写 | 团队通知、ChatOps |
| git | 本地仓库操作 | 代码历史分析 |
| puppeteer / playwright | 浏览器自动化 | 网页抓取、E2E |
| memory | 知识图谱式记忆 | 跨会话记忆 |
宿主只需在配置中声明拉起命令即可,例如 Claude Desktop / Cursor 的 mcpServers 配置(stdio):
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/data/knowledge-base"]
},
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres", "postgresql://readonly@db:5432/app"]
}
}
}
关键:postgres Server 用只读账号,filesystem Server 用 Roots/路径白名单限制可访问目录——这就是「最小权限」的落地。
🏢 案例1:内部知识库 + 数据库问答(filesystem + postgres)
目标:让内部助手既能检索文档(Markdown/PDF 导出文本),又能基于业务库回答数据问题。
架构:宿主同时连接两个官方 Server,模型按问题类型选择工具/资源。
自研补充 Server(当官方 Server 不满足时,用官方 SDK 自己写原子工具,例如全文检索):
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({ name: "kb-search", version: "1.0.0" });
server.tool(
"search_docs",
"在企业知识库中做全文检索,返回最相关片段",
{ query: z.string(), topK: z.number().int().min(1).max(20).default(5) },
async ({ query, topK }) => {
const hits = await fullTextSearch(query, topK); // 你的检索实现(如 Elasticsearch)
return {
content: hits.map((h) => ({ type: "text", text: `# ${h.title}\n${h.snippet}` })),
};
}
);
await server.connect(new StdioServerTransport());
console.error("kb-search ready");
工程要点:检索 Server 保持原子(只负责「查」),是否要「先查文档再查库再汇总」这种多步流程,交由 Agent 层编排。
🛠️ 案例2:研发协作助手(github + slack)
目标:助手能读 PR、查 Issue、在评审后向 Slack 频道播报;写操作(评论 PR、发消息)需人工确认。
server-github:读 PR/Issue、代码搜索;写操作(评论、合并)标记为高危。server-slack:向频道发消息(高危,需 HITL)。
// 宿主侧:对高危工具强制人工确认(HITL)
const HIGH_RISK = new Set(["create_pull_request_review", "merge_pull_request", "slack_post_message"]);
async function callToolWithGuard(client, name, args) {
if (HIGH_RISK.has(name)) {
const ok = await askHumanApproval(`即将执行高危操作:${name}\n参数:${JSON.stringify(args)}`);
if (!ok) return { content: [{ type: "text", text: "已被用户取消" }], isError: true };
}
return client.callTool({ name, arguments: args });
}
🚪 企业落地核心:多租户 MCP 网关
企业里不会让每个用户各自连一堆 Server,而是引入 MCP 网关:统一鉴权、按租户/角色路由到不同 Server、限流、审计。网关对宿主暴露单一 Streamable HTTP 端点,对内连接后端各 Server。
网关关键职责:
- 鉴权:校验 OAuth 2.1 访问令牌,解析租户/角色/scope。
- 授权路由:按租户隔离可见的 Server 与工具子集(多租户最小权限)。
- 限流与配额:按租户限制 QPS 与 token 预算。
- 审计:对每次
tools/call记录主体、工具、参数摘要、结果状态。
// 网关:在转发 tools/call 前做鉴权 + 审计(示意,基于 Streamable HTTP)
app.post("/mcp", authenticateOAuth, async (req, res) => {
const { tenant, roles } = req.auth;
const body = req.body;
if (body.method === "tools/call") {
const tool = body.params?.name;
if (!isToolAllowed(tenant, roles, tool)) {
return res.status(403).json({
jsonrpc: "2.0", id: body.id,
error: { code: -32001, message: "tool not permitted for tenant" },
});
}
await audit.emit({
type: "mcp.tool.call",
tenant, subject: req.auth.sub, tool,
argsDigest: digest(body.params?.arguments),
ts: new Date().toISOString(),
});
}
return forwardToBackendServer(tenant, body, res); // 转发到对应后端 Server
});
🧾 工具调用审计与 SIEM 集成
合规场景(金融、医疗等)要求完整审计追踪。建议对每次工具调用产生结构化审计事件,并以标准格式投递到 SIEM(Splunk、Elastic SIEM、Microsoft Sentinel 等)。
审计事件字段建议:
| 字段 | 说明 |
|---|---|
subject / tenant | 调用主体与租户 |
tool | 工具名 |
argsDigest | 参数哈希/脱敏摘要(避免落地敏感原文) |
decision | allow / denied / require_approval |
result | success / error,及错误码 |
latencyMs | 耗时 |
traceId | 关联端到端链路 |
// 将审计事件以 CEF/JSON 投递到 SIEM(示意)
async function emitToSiem(event) {
await fetch(process.env.SIEM_HEC_URL, {
method: "POST",
headers: { Authorization: `Splunk ${process.env.SIEM_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({ event, sourcetype: "mcp:audit" }),
});
}
配合 MCP高级特性与最佳实践 中的 OpenTelemetry span,即可同时满足「可观测性」与「合规审计」两类需求。
📝 落地最佳实践清单
- 优先复用官方 Server,确需定制再用
@modelcontextprotocol/sdk写原子工具。 - 最小权限:数据库只读账号、文件路径白名单(Roots)、按租户裁剪工具集。
- 高危工具 HITL:写操作、删除、发消息一律人工确认。
- 远程统一走网关 + OAuth 2.1 + Streamable HTTP,不暴露后端 Server。
- 全量审计 + SIEM 集成,参数脱敏、关联 traceId。
- 供应链审查:第三方 Server 锁版本、审依赖,纳入发布清单。
- 编排上移到 Agent 层(LangGraph / OpenAI Agents SDK),MCP 保持原子、无状态、可复用。