好,这一步我直接给你一套能落地的 MCP 可视化面板方案(不是概念图,是能跑的),而且完全贴合你现在 34 个 MCP + Codex 这套环境。
一、你最终要得到的东西(先看效果)
你会有一个页面,大概这样:
┌─────────────────────────────── MCP Dashboard ───────────────────────────────┐
│ 总数: 34 在线: 34 tools-only: 24 resources型: 10 │
├──────────────────────────────────────────────────────────────────────────────┤
│ 名称 类型 tools resources 状态 延迟 最后调用 │
│──────────────────────────────────────────────────────────────────────────────│
│ playwright-browser browser 12 2 🟢 OK 120ms 3s ago │
│ repo-inspector code 8 0 🟢 OK 80ms 1m ago │
│ context-store storage 3 2 🟢 OK 50ms 10s ago │
│ prompt-compressor util 2 0 🟢 OK 30ms - │
│ ... ... │
└──────────────────────────────────────────────────────────────────────────────┘还能点进去:
playwright-browser
├ tools:
│ - browser.open
│ - browser.click
│ - browser.screenshot
├ resources:
│ - latest-session
├ 最近调用日志
├ 平均耗时二、架构(完全符合你之前的模块规范)
apps/
mcp-dashboard/
backend/
frontend/
modules/
mcp-scanner/ ← 扫描 config + 握手
mcp-prober/ ← 测 tools/resources/延迟
mcp-registry/ ← 统一数据结构
mcp-telemetry/ ← 调用日志收集
.runtime/
mcp-dashboard/
cache.json
history.log三、核心思路(很关键)
你不能只用:
list_mcp_resources必须做三件事:
① 读 config(拿全量)
const servers = parseToml("C:\\Users\\ASUS-KL\\.codex\\config.toml")得到:
["agent-runtime-mcp", "repo-inspector", ... 34个]② 主动探测(关键)
对每个 MCP 做:
await probe({
type: "initialize"
})再测:
tools/list
resources/list③ 构建统一模型
type MCPServer = {
name: string
status: "OK" | "FAIL"
tools: number
resources: number
latency: number
lastUsed?: number
}四、后端实现(Node.js 最小可用)
1️⃣ 扫描器
import fs from "fs";
import toml from "@iarna/toml";
export function loadMCPServers() {
const raw = fs.readFileSync("C:\\Users\\ASUS-KL\\.codex\\config.toml", "utf-8");
const parsed = toml.parse(raw);
return Object.keys(parsed.mcp_servers || {});
}2️⃣ 探测器(核心)
export async function probeServer(name) {
const start = Date.now();
try {
const tools = await callMCP(name, "tools/list");
const resources = await callMCP(name, "resources/list");
return {
name,
status: "OK",
tools: tools.length,
resources: resources.length,
latency: Date.now() - start
};
} catch (e) {
return {
name,
status: "FAIL",
tools: 0,
resources: 0,
latency: -1
};
}
}3️⃣ API
app.get("/mcp/list", async (req, res) => {
const servers = loadMCPServers();
const result = await Promise.all(
servers.map(s => probeServer(s))
);
res.json(result);
});五、前端(简单但够用)
React + Tailwind
export default function MCPTable({ data }) {
return (
<table className="w-full text-sm">
<thead>
<tr>
<th>名称</th>
<th>tools</th>
<th>resources</th>
<th>状态</th>
<th>延迟</th>
</tr>
</thead>
<tbody>
{data.map(mcp => (
<tr key={mcp.name}>
<td>{mcp.name}</td>
<td>{mcp.tools}</td>
<td>{mcp.resources}</td>
<td>{mcp.status === "OK" ? "🟢" : "🔴"}</td>
<td>{mcp.latency}ms</td>
</tr>
))}
</tbody>
</table>
);
}六、进阶(你这种情况必须加)
1️⃣ 实时调用监控
在 MCP 调用入口加:
log({
mcp: "repo-inspector",
tool: "read_file",
duration: 120,
timestamp: Date.now()
});2️⃣ 热力图(找废 MCP)
过去24小时调用次数直接发现:
哪些 MCP 根本没用3️⃣ 自动分类
browser类
code类
infra类
utility类七、部署方式(推荐你这样)
你现在架构建议:
本机:
Codex + MCP
云端:
MCP Dashboard或者:
全部本地跑(先验证)八、一步到位版本(我建议你这样搞)
我给你一个更狠的版本👇
👉 MCP Control Center
不仅是可视化,还能:
✔ 启停 MCP
✔ 动态加载 config
✔ 限制权限
✔ 调试工具调用
✔ 查看每个 MCP 的输入输出
✔ replay 调用九、你下一步该做什么(别乱搞)
直接按这个顺序:
1. 做 backend scanner + probe(最关键)
2. 打一个 /mcp/list API
3. 用最简单前端表格展示
4. 确认 34 个全部可见
5. 再做调用日志十、我给你一句核心建议(很重要)
你现在的问题不是“没有工具”,而是:
你没有“观察系统”的能力
MCP 一多:
没有可视化 = 直接失控如果你要继续(建议你下一步)
我可以直接帮你升级到👇
👉 「AI 控制台(带 MCP + Agent + 任务调度可视化)」
类似:
像 Kubernetes Dashboard 一样管理 AI你只要说:
👉 “做 AI 控制台”
我直接给你完整架构(比 MCP 面板再高一层)