LMCP

本地MCP控制平面 --模型上下文协议服务器的治理层。
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ VS Code │ │ Codex │ │Claude Desktop│
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└───────────────────┼───────────────────┘
│ token + client_id
▼
┌─────────────┐
│ LMCP │
│ ───────── │
│ Registry │
│ Auth/Policy│
│ Audit Log │
└──────┬──────┘
│ authorized only
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Ollama MCP │ │ ComfyUI MCP │ │Playwright MCP│
│ (stdio) │ │ (HTTP) │ │ (Docker) │
└─────────────┘ └─────────────┘ └─────────────┘______________________________________________________________________
问题
在多个MCP工具服务器上运行多个AI客户端会产生碎片问题:
- VS Code、Codex和Claude Desktop都有自己的配置格式和发现机制
- 每个新客户端都意味着在不同的配置文件中重新注册每个服务器
- 无共享策略:在一个地方授予客户端访问权限不会影响其他任何内容
- 无审计跟踪:没有记录哪个客户调用了哪个工具,或者是否允许使用该工具
自然的反应是将每个客户端直接连接到每个服务器。这一直有效,直到令牌更改、服务器移动或客户端积累了它不应该拥有的访问权限。
LMCP做什么
LMCP提供了一个所有MCP客户端都连接到的单一本地端点。注册表定义了存在的服务器。每个客户端的分配列表定义了每个客户端可以访问的内容。每个访问决定(允许或拒绝)都会写入仅可追加的审计日志。
这不是路由流量的代理。它是一个治理层,决定是否应该路由流量,并记录它做出的每一个决定。
______________________________________________________________________
设计不变量
这些是LMCP不会放弃的财产:
- 默认情况下进行环回绑定 --LMCP结合到
127.0.0.1远程访问需要明确的配置和深思熟虑的选择加入。 - 明确注册 --没有什么是自动发现的。如果服务器不在注册表中,则LMCP不知道它的存在。
- 每客户分配列表 --客户端只能访问它们被明确授权的服务器。在授予访问权限之前,新客户端没有访问权限。
- 仅附加审核日志 --每个身份验证和授权决定都是一次性的,永远不会被修改或删除。
- 政策作为访问,而非意图 --LMCP决定 *是否* 发生工具调用。它永远不会决定 *为什么*,或者下一步该做什么。
看 建筑.md 这些决定背后的基本原理。
______________________________________________________________________
快速开始
1.安装依赖项
cd LMCP
pip install -r requirements.txt2.配置注册表
复制示例并编辑:
cp config/registry.example.yaml config/registry.yaml添加服务器并设置客户端令牌:
clients:
vscode:
token: "your-secure-token-here"
allow_servers: ["ollama-mcp", "comfyui-mcp"]
servers:
ollama-mcp:
transport: stdio
command: npx
args: ["-y", "ollama-mcp-server"]
env:
OLLAMA_HOST: "http://127.0.0.1:11434"
timeouts:
initialize_s: 30
tools_list_s: 30
tools_call_s: 300
retry_on_timeout: 1
retry_backoff_s: 1.5
tool_policy:
mode: allow_all3.验证您的配置
python -m lmcp --registry config/registry.yaml --validate-registry4.启动LMCP
python -m lmcp --registry config/registry.yaml --serve-http5.验证它是否正在运行
python -m lmcp --registry config/registry.yaml --status6.连接您的客户端
将您的MCP客户端指向:
http://127.0.0.1:7345/mcp?client_id=vscode&token=your-secure-token-here______________________________________________________________________
配置
注册表格式
LMCP使用单个YAML注册表文件。所有配置都存在于这里:守护进程设置、每个注册的客户端和每个注册的服务器。
lmcp:
host: 127.0.0.1
port: 7345
audit_log: logs/audit.log
loopback_only: true
clients:
vscode:
token: "your-token"
allow_servers: ["ollama-mcp"]
servers:
ollama-mcp:
transport: stdio
command: npx
args: ["-y", "ollama-mcp-server"]
env:
OLLAMA_HOST: "http://127.0.0.1:11434"
tool_policy:
mode: allow_all看 config/registry.example.yaml 对于具有多种服务器类型的完整示例。
服务器传输
| 传输 | 配置字段 | 用例 |
|---|---|---|
stdio | command, args, env | 本地MCP服务器作为子进程启动 |
http | url, headers | HTTP/SSE MCP服务器已在运行 |
超时和重试
每个服务器都可以覆盖LMCP超时行为:
servers:
comfyui-mcp:
transport: http
url: "http://127.0.0.1:9000/mcp"
timeouts:
tools_list_s: 20
tools_call_s: 600
retry_on_timeout: 1
retry_backoff_s: 2| 关键字 | 含义 | 默认值(stdio) | 默认值(http) |
|---|---|---|---|
initialize_s | MCP超时 initialize | 90 | 未使用 |
tools_list_s | 超时 tools/list | 90 | 60 |
tools_call_s | 超时 tools/call | 180 | 300 |
retry_on_timeout | 超时后重试 | 0 | 0 |
retry_backoff_s | 重试之间等待 | 1 | 1 |
重试行为是故意保守的:
- 检索适用于
initialize和tools/list. tools/call是 不 自动重试以避免重复的副作用。
速率限制
使用内存中的令牌桶对每个客户端请求进行可选限制:
lmcp:
rate_limit_rpm: 60 # Global default (requests per minute)
clients:
vscode:
token: "..."
allow_servers: [...]
rate_limit_rpm: 120 # Per-client override| 设置 | 范围 | 效果 |
|---|---|---|
lmcp.rate_limit_rpm | 全局 | 未设置自己的客户端的默认限制 |
clients..rate_limit_rpm | 每个客户端 | 覆盖此客户端的全局默认值 |
- 每个客户端优先于全局。
- 如果两者都没有设置,则客户端是无限的。
- 超过限制将返回MCP错误
-32009(rate_limited). - 速率受限的请求记录在审核日志中。
- 状态在内存中,并在守护进程重新启动时重置。
工具政策
每个服务器控制客户端可以调用哪些工具。双方均被强制执行 tools/list (返回的集合已被过滤) tools/call (拒绝工具 返回MCP错误-32011 tool_denied).
| 模式 | 行为 |
|---|---|
allow_all | 除中列出的工具外,所有工具均可访问 deny_tools |
deny_all | 没有可访问的工具(服务器已注册但已关闭) |
allow_list | 仅限中列出的工具 allow_tools 可访问 |
例子:
servers:
github-mcp:
transport: stdio
command: npx
args: ["-y", "github-mcp-server"]
tool_policy:
mode: allow_list
allow_tools:
- search_repositories
- get_file_contents
deny_tools: []______________________________________________________________________
行动
状态和检查
# Human-readable status summary
python -m lmcp --registry config/registry.yaml --status
# Machine-readable status (JSON)
python -m lmcp --registry config/registry.yaml --status-json状态输出包括已注册的客户端及其允许的服务器、已注册的服务器和传输类型、每台服务器的超时设置以及最新的审核日志条目。
Web管理UI
当守护进程运行时,可以在以下位置使用管理界面:
http://127.0.0.1:7345/uiUI有两种模式:
- 只读 (默认):显示守护进程状态和实时事件。无需配置。
- 管理:启用权限矩阵、客户端/服务器编辑器和注册表
编辑。需要 management_token 在注册表配置中。
要启用管理模式,请在注册表中添加管理令牌:
lmcp:
host: 127.0.0.1
port: 7345
management_token: "your-management-secret"启动时,守护进程会提示您在浏览器中打开UI。
看 docs/web_ui.md 对于完整的UI规范和 文档/管理\_ api.md API合同。
现场活动(SSE)
通过服务器发送事件订阅实时守护进程事件:
GET http://127.0.0.1:7345/events事件发生时会流式传输:客户端身份验证、服务器授权、, 速率限制、配置更改。可选过滤器: ?event_type=client_auth.
web UI会自动订阅此内容。外部消费者可以使用 任何SSE客户端(JS中的EventSource、curl等)。
______________________________________________________________________
HTTP API
端点
| 端点 | 方法 | 描述 |
|---|---|---|
/health | GET | 健康检查 |
/status | GET | 守护进程状态(JSON,版本化合约) |
/ui | GET | Web管理用户界面 |
/events | GET | 实时事件流(SSE) |
/describe | GET | 后台程序配置 |
/auth-check | GET | 验证客户端凭据 |
/server-check | GET | 验证服务器访问权限 |
/registry/view | GET | 注册表配置(标记已编辑,管理身份验证) |
/registry/validate | POST | 验证配置补丁(管理身份验证) |
/registry/apply | POST | 应用配置补丁(管理身份验证) |
/mcp | POST | MCP协议桥 |
MCP协议支持
这 /mcp 端点接受标准MCP JSON-RPC。身份验证是通过查询参数或标头进行的。
查询参数: ?client_id=vscode&token=your-token
标题: X-Lmcp-Client-Id: vscode 和 X-Lmcp-Token: your-token
支持的方法:
initialize--协议握手tools/list--跨允许的服务器聚合工具发现tools/call--代理工具执行与策略执行
示例:列表工具
curl -X POST "http://127.0.0.1:7345/mcp?client_id=vscode&token=your-token" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'或者使用标题:
curl -X POST http://127.0.0.1:7345/mcp \
-H "Content-Type: application/json" \
-H "X-Lmcp-Client-Id: vscode" \
-H "X-Lmcp-Token: your-token" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'______________________________________________________________________
完整CLI参考
# Start HTTP server
python -m lmcp --registry config/registry.yaml --serve-http
# Human-readable status summary
python -m lmcp --registry config/registry.yaml --status
# Machine-readable status (JSON)
python -m lmcp --registry config/registry.yaml --status-json
# Validate registry configuration
python -m lmcp --registry config/registry.yaml --validate-registry
# Print parsed configuration
python -m lmcp --registry config/registry.yaml --print-config
# Run self-test (auth + policy checks)
python -m lmcp --registry config/registry.yaml --self-test
# Test stdio server connection
python -m lmcp --registry config/registry.yaml --stdio-test ollama-mcp
# Test HTTP server connection
python -m lmcp --registry config/registry.yaml --http-test comfyui-mcp______________________________________________________________________
VS代码集成
将LMCP添加为VS Code工作区中的MCP服务器:
.vscode/mcp.json
{
"servers": {
"lmcp": {
"type": "http",
"url": "http://127.0.0.1:7345/mcp?client_id=vscode&token=YOUR_TOKEN"
}
}
}在VS代码代理模式下,LMCP注册表中的所有服务器都可以通过单个LMCP端点访问。访问权限由 allow_servers 列表为 vscode 客户。
______________________________________________________________________
安全
LMCP的设计使安全行为成为默认行为。代码库已经 通过正式审查(2026年4月),在v3.0.2和v3.1.1中进行了后续强化。
保护措施
- 仅限环回 --绑定到
127.0.0.1除非另有明确配置 - 令牌身份验证 --每个客户端都需要一个有效的令牌;无匿名访问
- 恒定时间令牌比较 —
hmac.compare_digest防止定时攻击 - 服务器分配列表 --客户端仅访问其明确授权的服务器
- 执行工具政策 --每台服务器
tool_policy过滤器tools/list并拒绝被拒绝的来电tools/call(MCP错误-32011 tool_denied) - 审核日志记录 --记录每个身份验证、授权和工具策略决策
- 探头速率限制 —
/auth-check和/server-check以10转/分的速度节流,以防止暴力 - 请求大小限制 --POST主体大小限制为1 MB
- 苏格兰和南方能源公司用户上限 --最多50个并发
/events连接 - XSS预防 --所有用户控制的值均已转义;没有内联JS处理程序
- 管理认证 --注册表编辑需要单独的管理令牌(仅标题,默认禁用)
- 尽量减少公开披露 --公共端点不公开客户端ID、服务器命令或文件路径
/registry/view编辑秘密 --客户端令牌显示为token_status;服务器env和headers值显示为set/empty(键可见,值不可见)
LMCP不做什么
- 默认情况下没有远程网络访问
- 无自动服务器发现或注册
- 无代理编排或规划
- 没有持久内存或交叉请求状态
- 无意图推断
LMCP是访问控制基础设施。它不是一个AI系统。
看 安全.md 了解完整的安全模型、可接受的风险和审计历史。
______________________________________________________________________
需求
- Python 3.10+
pyyaml >= 6.0jsonschema >= 4.20.0
对于使用 npx:
- Node.js 20+
看 文件/要求.md 了解完整的设置细节。
______________________________________________________________________
文档
- 建筑.md --设计决策、不变量和威胁模型
- 安全.md --安全模型、审计历史和可接受风险
- 更改日志.md --版本历史
- docs/status_api.md -/status API合同(已版本)
- 文档/管理\_ api.md -管理API合同(查看/验证/应用)
- docs/web_ui.md --Web UI规范
- 文件/要求.md --依赖关系和设置
- docs/testing.md --验证程序
______________________________________________________________________
关于
LMCP是由 昆西·佩里 作为...的一部分 数字合成工作室 生态系统——人工智能工作流程的工具。
______________________________________________________________________
许可证
麻省理工学院——见 许可证
