The MCP Control Plane for Agentic Coding
Vision将MCP服务器从配置噩梦转变为受监督的、代理可访问的控制平面。一个守护进程。一个配置。完全的代理自主权,完全由操作员监督。
问题
如今,使用带有AI编码代理的MCP服务器意味着:
- 分散配置 --每个项目都有自己的MCP设置,在机器之间复制
- 手动流程管理 --服务器静默崩溃,需要手动重新启动
- 无能见度 --哪些工具正在运行?失败的是什么?没有中心位置可供查看
- 静态工具 --代理人无法适应自己的能力;人类必须编辑配置
- 交通混乱 --没有代理层,stdio服务器无法在客户端之间共享
解决方案
Vision是一个Go原生守护进程,它提供:
| 能力 | 它意味着什么 |
|---|---|
| 集中式注册表 | 一个YAML文件(~/.config/vision/servers.yaml)定义所有MCP服务器 |
| 过程监督 | Erlang风格的监督,具有自动重启和指数回退功能 |
| 流式HTTP代理 | 每个会话的子进程隔离——每个客户端在专用端口上都有自己的MCP进程 |
| 自动重生 | 如果下游子流程被捕获或崩溃,下一个工具调用将透明地生成一个新的子流程 |
| 代理自我管理 | AI代理可以通过管理MCP API添加、删除和重新启动服务器 |
| 热重新加载 | 在不重新启动编码会话的情况下更新配置 |
为什么是视觉?
Vision将任何MCP兼容代理变成 带护栏的高级代理系统:
You: "Research best practices for React Server Components"
Agent: [Calls vision_list — no documentation server available]
Agent: [Calls vision_search("documentation") — finds context7]
Agent: [Calls vision_add("context7", start=true)]
Agent: [Now has Context7 available — proceeds with research]没有人为干预。不编辑配置文件。代理适应它需要的东西。
但你保持控制:
- 所有服务器都在您的中央配置中定义
- 管理员API仅公开您在目录中预先批准的服务器
- 每个过程都受到监督和记录
- 一
vision daemon status显示所有内容
比较
| 功能 | 愿景 | MCP网关 | 直接配置 |
|---|---|---|---|
| 代理自我管理 | 是 | 否 | 否 |
| 过程监督 | 是(Erlang风格) | 不同 | 否 |
| 自动重启 | 是 | 变化 | 否 |
| 热重新加载 | 是 | 否 | 否 |
| 中央配置 | 是 | 是 | 否(每个项目) |
| 流式HTTP代理 | 是 | 一些 | 否 |
| 每会话隔离 | 是 | 否 | 否 |
| 管理MCP API | 是 | 否 | 不适用 |
| 单二进制 | 是 | 变化 | 不适用 |
快速开始
# Install Vision
curl -fsSL https://raw.githubusercontent.com/Sharper-Flow/Vision-MCP-Manager/trunk/scripts/install.sh | bash
# Start the daemon (with example servers)
vision daemon start -d
# Generate client configuration
vision init --global您的AI代理现在可以连接到Vision管理的服务器 http://localhost:627X/mcp.
安装
单线安装(推荐)
curl -fsSL https://raw.githubusercontent.com/Sharper-Flow/Vision-MCP-Manager/trunk/scripts/install.sh | bash安装程序下载最新的二进制文件,并将其放入 /usr/local/bin,并创建配置目录。 当它安装systemd单元时,它还会捕获您当前的 PATH 因此,shell管理的MCP二进制文件(例如 pyenv, nvm,或 uvx 工具)在systemd下仍然可以生成。
选项:
--systemd--安装并启用systemd用户服务--client--为特定客户端自动配置
源自
git clone https://github.com/Sharper-Flow/Vision-MCP-Manager.git
cd Vision-MCP-Manager
make build
sudo cp bin/vision /usr/local/bin/要求: 转到1.24+
作为服务运行
要始终运行,请安装systemd用户服务:
mkdir -p ~/.config/systemd/user
cp scripts/vision-user.service ~/.config/systemd/user/vision.service
systemctl --user daemon-reload
systemctl --user enable --now vision如果您的MCP命令位于默认systemd路径之外,请使用重新安装 scripts/install.sh 或添加匹配项 PATH 到 ~/.config/systemd/user/vision.service 在启动守护进程之前。
配置
服务器注册表
Vision在 ~/.config/vision/servers.yaml:
servers:
# Context7 - Library documentation lookup
context7:
port: 6276
command: context7-mcp
args: []
env:
CONTEXT7_API_KEY: "${CONTEXT7_API_KEY}"
autostart: true
session_timeout: 30m # How long idle sessions live (default: 5m)
# Kagi - Web search and summarization
kagi:
port: 6279
command: uvx
args: ["--python", "3.12", "kagimcp"]
env:
KAGI_API_KEY: "${KAGI_API_KEY}"
autostart: true
# Time - Timezone utilities
time:
port: 6282
command: uvx
args: ["mcp-server-time", "--local-timezone=America/New_York"]
autostart: true会话生命周期: 空闲会话在以下时间被收获 session_timeout (默认5m)。如果在会话结束后收到工具调用,Vision会自动重新生成一个新的子流程,不会向代理返回任何错误。可用性配置文件: 集 availability_profile: networked 用于由上游web/API提供商支持的服务器。Vision应用了更强的超时、重试、断路器、缓存和飞行中限制默认值,同时默认情况下仍保持每个会话的下游隔离。插槽组: 对于需要每个会话隔离并发进程的服务器(例如Playwright浏览器自动化),声明slot_groups泳池在servers.yaml.Vision将池扩展到单个虚拟端口后面的相同插槽中,并将每个会话透明地路由到负载最小的健康插槽——代理连接到一个端点,永远看不到底层进程。看 配置参考 查看完整的模式和示例。
API密钥和秘密
将API密钥存储在 ~/.config/vision/.env 并通过以下方式引用它们 ${VAR} 在 servers.yaml:
# ~/.config/vision/.env (0600 permissions)
CONTEXT7_API_KEY=your-context7-key
KAGI_API_KEY=your-kagi-key# ~/.config/vision/servers.yaml
env:
CONTEXT7_API_KEY: "${CONTEXT7_API_KEY}"视觉负荷 .env 在解析配置之前,所以 ${VAR} 无论守护进程是如何启动的(前台、后台、systemd),扩展都能正常工作。这 .env 文件应具有 0600 权限,因为它包含秘密。
重要提示: 更换后.env,对于已经运行的下游子流程,重新加载并不总是足够的。新生成的程序将使用更新的值,但长期运行的MCP服务器进程可能会保留旧环境,直到它们重新启动。在旋转API密钥或令牌后,更喜欢完整的vision daemon restart流量(vision daemon stop→vision daemon start)或者在验证更改之前重新启动受影响的服务器/会话。
对于生产商拥有的远程MCP,如Vercel的Grep,更喜欢直接在客户端配置官方远程端点,而不是将其包装在本地子流程中。如果您有意让Vision代理远程MCP,请使用 transport: http 随着 url: 在 servers.yaml.
客户端集成
通过Streamable HTTP将任何兼容MCP的客户端连接到Vision管理的服务器:
{
"mcp": {
"vision": {
"type": "remote",
"url": "http://localhost:6275/mcp",
"enabled": true
},
"context7": {
"type": "remote",
"url": "http://localhost:6276/mcp",
"enabled": true
},
"kagi": {
"type": "remote",
"url": "http://localhost:6279/mcp",
"enabled": true
}
}
}或自动生成:
vision init --global外部配置
愿景 ~/.config/vision/servers.yaml 可以用外部配置工具编写,也可以手工编辑。
外部作家合同:
servers.yaml是 权威的 重新加载时。Vision不会与之前的状态合并——文件中的内容就是运行的内容。- 使用原子写入(写入同一目录中的临时文件,然后重命名)。
- 根据记录的模式进行验证(
internal/config/schema.go)在写作之前。 - 保留未知但保留的字段(例如。
source,description,retry.*,circuit_breaker.*)在从更高级别的源重新渲染时进行往返。 - 管理员HTTP界面位于
http://127.0.0.1:6275公开稳定的集成端点:GET /version(能力合同),GET /health(聚合状态),GET /v1/servers(按服务器状态),以及GET /v1/servers/{name}(单服务器详细信息)。 - 检查
GET /version为了api.*在调用端点之前设置功能标志——这使得外部工具可以在不固定Vision版本的情况下进行功能检测。
代理自我管理
Vision的杀手级功能: 代理可以管理自己的工具.
管理MCP服务器(端口6275)将这些工具暴露给您的AI代理:
| 工具 | 它做什么 |
|---|---|
vision_list | 显示所有状态为(运行/停止/错误)的服务器 |
vision_add | 从目录中配置并启动新服务器 |
vision_remove | 停止并删除服务器 |
vision_search | 按名称或功能查找服务器 |
vision_status | 守护进程运行状况、正常运行时间、内存使用情况 |
vision_guidance | 获取使用哪种工具的建议 |
工作流程示例:
- 代理需要网络搜索功能
- 呼叫
vision_search("web search")→ findskagi - 呼叫
vision_add("kagi", start=true)→ 服务器启动 - 代理现在可以进行网络搜索
- 你在里面看到了
vision_list--全能见度
建筑
┌─────────────────────────────────────────────────────────────────┐
│ AI Agents │
│ (OpenCode, Claude Code, Cursor, etc.) │
└───────────────────────────────┬─────────────────────────────────┘
│ HTTP POST/GET/DELETE /mcp
▼
┌─────────────────────────────────────────────────────────────────┐
│ Vision Daemon │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Admin MCP Server (:6275) │ │
│ │ vision_list vision_add vision_status vision_search │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Streamable HTTP Proxy Layer │ │
│ │ │ │
│ │ :6276/mcp ──[session A]──> subprocess A (stdio) │ │
│ │ ──[session B]──> subprocess B (stdio) │ │
│ │ │ │
│ │ :6284/mcp ──[session C]──> subprocess C (stdio) │ │
│ │ │ │
│ │ :6282/mcp ──[session D]──> subprocess D (stdio) ... │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Process Supervisor (Erlang-style) │ │
│ │ Automatic restarts · Exponential backoff · Graceful │ │
│ │ teardown: stdin close → SIGTERM → SIGKILL │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘关键部件:
- 管理MCP服务器 --让代理在没有人为干预的情况下管理自己的工具
- 流式HTTP代理 --每个客户端会话都会生成一个独立的子流程;工具是动态发现和透明代理的。如果一个子进程被捕获(空闲超时)或崩溃,代理会在下一个请求时自动重新扫描它
- 工艺主管 --用途 缝合线 用于带回退功能的自动重启
- 安全中间件 --承载身份验证、源地址分配、速率限制、体大小上限和会话准入控制
通过可见性建立信任
高级机构并不意味着黑匣子。愿景为您带来:
- 集中配置 --确切了解可用的工具(
~/.config/vision/servers.yaml) - 过程监督 --每台服务器都受到监控;碰撞触发自动重启
- 单个守护进程 --检查状态的一个地方:
vision daemon status - 专用端口 --为了安全和调试,每台服务器都隔离在自己的端口上
- 热重载 --在不中断活动会话的情况下更新配置:
vision daemon reload
CLI参考
守护进程
vision daemon start # Start in foreground
vision daemon start -d # Start daemonized
vision daemon stop # Graceful shutdown
vision daemon status # Health, uptime, memory
vision daemon reload # Hot-reload config (SIGHUP)服务器
vision server list # Show all servers
vision server add --command [--args ]
vision server remove
vision server start
vision server stop 配置
vision init # Project-local config
vision init --global # Global config
vision init --client opencode # Target specific client format
vision init --servers time,context7 # Specific servers only故障排除
| 症状 | 解决方案 |
|---|---|
| 服务器没有响应 | vision daemon status --检查守护进程是否正在运行 |
| 服务器持续崩溃 | 检查日志: journalctl --user -u vision -f |
| 配置更改未应用 | 运行 vision daemon reload |
| 端口已在使用中 | 检查是否存在冲突: lsof -i :6276 |
| “下游会话不可用” | 会话在空闲超时后被捕获。Vision在下次通话时自动应答。如果持续,增加 session_timeout 在 servers.yaml |
文档
路线图
- \[x\] 会话生命周期和安全事件的结构化审计日志记录
- \[x\] 每会话准入控制(最大并发会话数、空闲超时、TTL)
- \[x\] 在空闲收割或崩溃时自动进行下游再生
- \[\]使用情况分析仪表板
- \[\]多机同步
许可证
MIT许可证——见 许可证 了解详情。
______________________________________________________________________
Built with Go. Designed for agentic coding.
