模型上下文协议控制平面

LMCP是一个为模型上下文协议(MCP)服务器提供的治理层,通过集中注册、客户端访问控制和审计日志来管理多客户端与多服务器之间的交互。

  • by Janksuu
  • Python
  • 本地部署
  • 8 星标
  • 更新于
在 GitHub 查看 Janksuu/LMCP

使用说明

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.txt

2.配置注册表

复制示例并编辑:

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_all

3.验证您的配置

python -m lmcp --registry config/registry.yaml --validate-registry

4.启动LMCP

python -m lmcp --registry config/registry.yaml --serve-http

5.验证它是否正在运行

python -m lmcp --registry config/registry.yaml --status

6.连接您的客户端

将您的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.<id>.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/ui

UI有两种模式:

  • 只读 (默认):显示守护进程状态和实时事件。无需配置。
  • 管理:启用权限矩阵、客户端/服务器编辑器和注册表 编辑。需要 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.0
  • jsonschema >= 4.20.0

对于使用 npx:

  • Node.js 20+

看 文件/要求.md 了解完整的设置细节。


文档


关于

LMCP是由 昆西·佩里 作为...的一部分 数字合成工作室 生态系统——人工智能工作流程的工具。


许可证

麻省理工学院——见 许可证