代理的架构:构建、保护和扩展您自己的 MCP 生态系统

发布: (2025年12月11日 GMT+8 04:44)
8 min read
原文: Dev.to

Source: Dev.to

你的代理是敞开的门吗?MCP 安全的现实

一旦你将 MCP 服务器部署到公共 URL——即使只是用于内部测试——就会暴露一个可以代表你执行操作的端点。如果该服务器连接到你的 Gmail 或 CRM,泄漏的 URL 让任何人都能读取你的邮件或列出你的潜在客户。安全不是一个特性,而是基础。

双层认证策略

要保护基于 n8n 的 MCP 服务器,不能依赖“安全靠隐藏”。必须使用严格的 Header 认证。

服务器端锁定

在 n8n 中,配置 MCP 客户端的认证。不要使用默认的 “None”。切换为 Header Auth,并定义一个 header(通常遵循标准 API 约定)和一个 value(你的高熵密码或令牌)。

客户端握手

复杂性通常出现在客户端配置(例如 Claude Desktop)中。你的 config.json 文件决定了存储如何与服务器通信。添加认证参数时常见的陷阱是 JSON 语法错误。结构必须精确:

{
  "mcpServers": {
    "n8n": {
      "command": "npx",
      "args": [
        "-y",
        "...",
        "--header",
        "Authorization=Bearer YOUR_SECURE_TOKEN"
      ]
    }
  }
}

洞察

如果在团队内部共享访问,绝不要把凭证硬编码到共享仓库中。使用环境变量或安全金库。旋转凭证时,记得像 Claude Desktop 这样的客户端需要完整重启才能握手新的 Header。

“一切”接口:打通 SaaS 孤岛

为什么要重新发明轮子,Zapier 等平台已经提供了 6,000+ 的集成?把其他自动化平台当作你的 MCP 服务器的子处理器。

SSE 端点桥接

在 n8n 服务器内部集成 Zapier MCP 客户端工具,就可以创建代理的菊花链:

LLM/Client → n8n Server → Zapier via Server‑Sent Events (SSE)

这使得自然语言指令如 “在下午 5 点给我的狗安排一次会议” 或 “给 X 起草一封邮件” 成为可能。

上下文困境

一个主要的失效模式是时间幻觉。如果让 LLM “安排今天的会议”,模型的训练数据截止时间(例如 2023)与现实冲突——它不知道“今天”是何时。

解决方案

在系统提示中注入动态上下文:

Date and Time: {{ $now }}

将当前时间戳硬编码进去,使所有下游工具共享同一时间现实,防止代理在几年前的日期上安排会议。

360 度知识:RAG 流水线

没有记忆的代理不过是个计算器。要构建高级助理,需要自动更新的检索增强生成(RAG)。下面是一条使用向量数据库(Pinecone)将静态文件转化为活跃知识的流水线。

导入工作流

目标: 零接触知识管理。把 PDF 放入 Google Drive 文件夹即可触发向量更新。

触发器

Google Drive 节点监控特定文件夹(例如 “Tesla Earnings”)的 File Created 事件。

下载

使用文件 ID 下载二进制数据。

解析器与拆分器

  • 二进制数据: 对原始 PDF 使用默认数据加载器并设置相应文件类型。
  • Markdown/JSON: 对预处理数据(如通过 LlamaParse 获得更好表格识别)时,将 n8n 数据加载器从 “Binary” 切换到 “JSON”。这是常见的失败点。

切块

对于财报或密集技术文档,Recursive Character Text Splitter 效果良好。
典型设置:块大小约 800‑1000 token,重叠 50 token。

Upsert 与命名空间策略

将向量写入 Pinecone 的特定 Namespace不要把所有嵌入都倾倒到同一个索引;使用 finance_q3prompting_guideshr_policy 等命名空间。这样可防止上下文泄漏,避免 LLM 将不相关领域混在一起。

检索连接

在 MCP 服务器端,添加 Pinecone Vector Store 工具,配置为 Retrieve Document 模式,并映射到相应的命名空间。

高级洞察

通过基于 API 的聊天触发器(例如 n8n 原生 chat 节点)访问时,LLM 本身没有持久化。需要在工作流中链入 Memory Node(Window Buffer 或 Simple Memory),否则机器人在握手后立即忘记用户的名字。如果通过 Claude Desktop 使用 MCP,客户端会自行管理对话历史,服务器端的记忆节点就显得多余。

通用适配器:集成缺失的 API

n8n 提供了大量预构建节点,但仅依赖它们会受限。任何 API 只要包装得当,都可以成为 MCP 工具。

HTTP 请求模式

当不存在原生节点(例如天气或特定搜索)时,使用 HTTP Request 节点。

案例研究:天气 API(GET)

提供实时天气感知:

  • Endpoint: http://api.weatherapi.com/v1/current.json
  • Auth: 按供应商文档将 API key 作为查询参数或 Header 传递。
  • 动态参数: 将城市查询 (q) 留空或映射为 LLM 从用户提示中填充的动态输入。

案例研究:Tavily Search(POST)

某些 API 需要复杂的 JSON 请求体。手动重建这些请求极易出错。

cURL 小技巧

在 API 文档中找到 cURL 示例。在 n8n 中使用 Import cURL;粘贴代码后 n8n 会自动填充方法、Header 和请求体结构。将静态值替换为由 AI 管理的动态表达式,便可把静态脚本调用转化为智能工具。

超越原生:社区节点革命

n8n 的原生 MCP 集成相当强大,但有一个关键限制:它难以动态列出并执行来自外部标准 MCP 服务器(例如 GitHub 托管的 Airbnb 服务器)的工具,除非手动为每个工具定义。

列表/执行范式

n8n‑nodes‑mcp 社区节点为工具管理添加了元层。

  • MCP List Tool: 连接外部 MCP 服务器,返回所有可用能力的 JSON 架构,让 LLM 知道:“这是我能做的全部。”
  • MCP Execute Tool: 当 LLM 决定执行操作时,调用此工具,进而将请求转发给相应的外部服务。

这种动态方式消除了预先定义每个单独能力的需求,实现了跨异构 API 的真正可扩展代理。

Back to Blog

相关文章

阅读更多 »