本地秘密MCP
注: 这是一个快速的想法草图,可能会生成到这个存储库中的实际实现中,也可能不会。这可能是一个更好系统的复制品。或者它可能不会!
问题
许多人工智能开发工具的用户,可能是安静但绝大多数的用户,更喜欢通过API使用云模型。
云模型会产生成本,但通常比可以在本地运行的模型(至少对临时终端用户来说)更可靠、更强大。
然而,云模型也有风险——用户数据通过API来回发送到服务器。
可以理解的是,许多人工智能和MCP用户对于将这些工具暴露在环境变量等秘密中保持沉默。许多工具默认支持安全态势,例如阻止模型访问以下文件 .env。这些都是合理的最佳做法。但错过了MCP协助完成秘密检索等任务的潜力,否则这些任务可能会简化工作流程。
______________________________________________________________________
理念:混合模型
秘密检索MCP不需要是具有强大或SOTA推理的大型语言模型。
它只需要是一个具有代理和工具调用功能的模型,可以快速可靠地执行与秘密存储交互等操作。
通过在Ollama上过滤 工具 我们可以找到几个尺寸适中的优秀候选者,它们可以在从嵌入式设备到工作站的所有设备上运行:
- 西北风-3:3B至14B
- Qwen 3-0.6B-235B
- 骆驼3.2(1B,3B)
等等
想象一下,对于一个用户不希望直接暴露给云模型的工具,有一个这样的实现。让我们以One Password为例来说明如何实现这个微服务堆栈:
- 本地模型在Ollama API后台运行
- 本地模型可以通过API或文件级集成访问机密库
示例工具调用
Claude Code充当编排器。
本地机密MCP支持两个主要工具:
- 秘密存储(保存新秘密)
- 秘密检索(提供新秘密)
由于云API携带/处理秘密,秘密存储抵消了大部分安全优势。
对于秘密检索:
- 对本地模型的工具调用:“用户需要在此存储库中填充他们的OpenAI密钥。这是路径{path}。我是一个沙盒代理,无法访问存储库中的环境变量存储。请从您有权访问的secrets存储中检索变量,并将其写入环境变量文件。报告完成。”
云模型将此任务委托给仅限本地的子代理。为了安全起见,可以限制本地代理的网络访问(即气隙)。
要点:
工作流的安全性取决于主模型是否遵守其沙盒。
秘密检索流程
flowchart TD
subgraph Cloud["Cloud Environment"]
A[User Request] --> B[Cloud Model / Orchestrator]
B --> C{Secret Needed?}
end
C -->|Yes| D[MCP Tool Call]
subgraph Local["Local Environment (Airgapped)"]
D --> E[Local Secrets MCP]
E --> F[Local LLM\ne.g. Mistral 3B / Qwen]
F --> G[Secrets Store\ne.g. 1Password / Vault]
G --> H[Retrieve Secret]
H --> I[Write to Target\ne.g. .env file]
I --> J[Report Completion]
end
J --> K[Acknowledge to Orchestrator]
K --> B
B --> L[Continue Task\nwithout seeing secret]
style Cloud fill:#ffe6e6,stroke:#cc0000
style Local fill:#e6ffe6,stroke:#00cc00______________________________________________________________________
秘密存储
一种更复杂但潜在可行的秘密存储架构:
- 秘密通过端到端加密存储在云保险库中。
- 本地模型保存解密密钥。
- 云模型只通过加密的秘密。
- 本地模型解密,然后本地存储。
- 云/互联网暴露模型仅作为直通,从不处理解密数据。
秘密存储流程
flowchart TD
subgraph User["User Input"]
A[User provides new secret\nto Cloud Model]
end
subgraph Cloud["Cloud Environment"]
A --> B[Cloud Model / Orchestrator]
B --> C[Encrypt Secret\nwith Public Key]
C --> D[Encrypted Payload]
end
D --> E[MCP Tool Call\nPassthrough Only]
subgraph Local["Local Environment (Airgapped)"]
E --> F[Local Secrets MCP]
F --> G[Local LLM]
G --> H[Decrypt with\nLocal Private Key]
H --> I[Secrets Store\ne.g. 1Password / Vault]
I --> J[Store Decrypted Secret]
J --> K[Report Completion]
end
K --> L[Acknowledge to Orchestrator]
L --> B
B --> M[Confirm Storage\nNo plaintext retained]
style User fill:#e6e6ff,stroke:#0000cc
style Cloud fill:#ffe6e6,stroke:#cc0000
style Local fill:#e6ffe6,stroke:#00cc00______________________________________________________________________
潜在改进和未决问题
- 身份验证握手:本地MCP如何验证工具调用是否来自授权的编排者?考虑共享密钥或基于证书的身份验证。
- 审核日志记录:本地代理应维护所有秘密访问的防篡改日志,以进行合规性/调试。
- 秘密轮换:可以扩展以支持由编排器触发的自动秘密轮换工作流。
- 回退行为:如果本地模型不可用,会发生什么?编排器应该优雅地失败还是将请求排队?
- 多秘密检索:用于初始化具有多个机密的新项目的批处理操作。
- 秘密命名约定:编排者如何引用秘密的标准化模式(例如。,
provider/service/key层次结构)。 - 密钥管理:对于存储流,密钥对是在哪里/如何生成的,公钥是如何分发到云客户端的?
- 速率限制:防止失控的工具调用耗尽秘密存储API限制。
______________________________________________________________________
TL;DR/总结
- 使用本地代理模型并连接到秘密存储。运行此程序,然后封装没有网络访问权限的环境。堆叠:Ollama+带工具的小型模型。
- 公开MCP工具定义,并将其与主代理可以访问的MCP管理器集成。这可以是直接的,也可以通过中介/代理/聚合器。然而,中介提供了另一个潜在的暴露面,需要考虑自身的安全因素。
- 离线模型的任务是秘密检索。
