人工智能基础设施
人工智能工具、MCP服务器、网关和平台服务的中央基础设施。
待办事项
- \[\]创建一个
ai-infrastructure技能(in~/AI/skills/或者在这个仓库中)记录所有服务、端口、启动命令和依赖关系,以便AI代理在设置机器或调试连接问题时知道哪些基础设施可用。
建筑
@startuml ai-infrastructure
!theme plain
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
skinparam defaultFontName Consolas
title AI Infrastructure Architecture
' === AI Clients ===
package "AI Clients" as clients #E3F2FD {
[Claude Code] as claude_code
[VS Code Copilot] as vscode
[Claude Desktop] as claude
[Cline / Other] as other
}
' === LLM Proxy (standalone, implicit default network) ===
package "Context Lens (implicit network)" as cl_stack #E0F7FA {
component "context-lens\n:4040 (reverse proxy)\n:4041 (web UI + ingest API)" as context_lens #80DEEA
component "mitmproxy\n:8080 (HTTPS forward proxy)" as mitmproxy #4DD0E1
}
' === Gateway Stacks (each has private default + ai-shared) ===
package "agentgateway stack (private + ai-shared)" as ag_stack #E8F5E9 {
component "agentgateway\n:3847 (MCP)\n:15001 (Admin UI)\n:15020 (Metrics)" as agentgateway #C8E6C9
component "nginx-proxy\n:3443 (HTTPS)\n:9223 (CDP proxy)" as ag_nginx #A5D6A7
component "stdio-proxy (included)\nseq-thinking, azure-devops" as ag_stdio #81C784
}
package "mcpx stack (private + ai-shared)" as mcpx_stack #E8F5E9 {
component "mcpx (Lunar.dev)\n:9000 (MCP)\n:5173 (Control Plane)" as mcpx #C8E6C9
component "nginx-ssl\n:9443 (HTTPS MCP)\n:5443 (HTTPS UI)\n:9222 (CDP)\n:61822 (Kapture WS)" as mcpx_nginx #A5D6A7
component "stdio-proxy (included)\nseq-thinking, kapture" as mcpx_stdio #81C784
component "lunar-proxy\n:8000 (rate limiting)\n(not actively routed)" as lunar #E0E0E0
}
' === Shared MCPs (ai-shared network) ===
package "Shared MCPs (ai-shared)" as shared_mcps #FFF3E0 {
[context7\n:7008] as context7 #FFCC80
[qdrant-mcp\n:7020] as qdrant_mcp #FFCC80
[memory\n:7040 (singleton)] as memory #FFCC80
[playwright\n:7007] as playwright #FFE0B2
[browser-use\n:7011] as browser_use #FFE0B2
[hass-mcp\n:7010] as hass_mcp #FFE0B2
}
' === Backing Services ===
package "Backing Services (ai-shared)" as backing #F3E5F5 {
[Qdrant\n:6333 (HTTP)\n:6334 (gRPC)] as qdrant #CE93D8
[Langfuse\n:3100 (UI)] as langfuse #CE93D8
[Watchtower\n(auto-update)] as watchtower #E1BEE7
}
' === Observability ===
package "Observability (ai-shared)" as observability #E1F5FE {
component "OTel Collector\n:4317/:4318 (internal)" as otel #81D4FA
component "Jaeger\n:16686 (UI)" as jaeger #4FC3F7
component "Prometheus\n:9090" as prometheus #29B6F6
component "Grafana\n:3000" as grafana #03A9F4
}
' === Connections ===
' Clients to Context Lens
claude_code --> context_lens : ANTHROPIC_BASE_URL\n:4040
vscode --> mitmproxy : HTTPS_PROXY\n:8080
mitmproxy --> context_lens : POST /api/ingest\n:4041
' Clients to Gateways
claude_code --> agentgateway : MCP :3847\nx-client-id
claude --> mcpx : MCP :9000
other --> ag_nginx : HTTPS :3443
' TLS proxies
ag_nginx --> agentgateway : reverse proxy
mcpx_nginx --> mcpx : reverse proxy
' Gateways to private stdio-proxies
agentgateway --> ag_stdio : private network
mcpx --> mcpx_stdio : private network
' Gateways to shared MCPs (via ai-shared)
agentgateway --> context7 : SSE (ai-shared)
agentgateway --> qdrant_mcp : SSE
agentgateway --> memory : SSE
mcpx --> context7 : SSE (ai-shared)
mcpx --> qdrant_mcp : SSE
mcpx --> memory : SSE
' Backing
qdrant_mcp --> qdrant : :6333
' Observability
agentgateway --> otel : OTLP traces
otel --> jaeger : traces
otel --> prometheus : span metrics
grafana --> prometheus : query
grafana --> jaeger : query
' Legend
legend right
|= Color |= Layer |
| | LLM Proxy (standalone) |
| | Gateway |
| | TLS Termination |
| | stdio-proxy (per-stack) |
| | Shared MCP (running) |
| | Shared MCP (available) |
| | Backing Service |
| | Observability |
| | Inactive |
endlegend
@enduml当前状态
组合堆叠
每个堆栈都是独立的 docker compose 单位。带有stdio代理的堆栈将其包含在共享模板中(mcps/stdio-proxy/)--每个都在专用网络上获得自己的实例,以避免DNS冲突。
代理网关 (gateways/agentgateway/)--Linux基金会MCP网关
| 服务 | 功能 | 主机端口 |
|---|---|---|
| agentgateway | 将MCP请求路由到10+个后端;CORS,无状态SSE模式 | :3847(MCP),:15001(管理UI),:15020(度量) |
| nginx代理 | 代理网关的TLS终止;反向代理 /mcp 和 /sse;从9223代理Chrome DevTools协议→ 主机:9222 | :3443(HTTPS MCP),:15443(HTTPS管理),:9223(CDP) |
| stdio代理 | 桥接stdio MCP:顺序思维,azure devops | (内部:7030) |
| mcp状态 | 每30秒轮询一次stdio代理/状态,记录每个mcp运行状况 | -- |
mcpx (mcps/mcpx/)--Lunar.dev MCP网关,带有工具组和每个客户端的访问控制
| 服务 | 功能 | 主机端口 |
|---|---|---|
| mcpx | 使用工具分组(核心、编码、浏览器、创意、家庭)和消费者身份验证多路复用MCP服务器 | :9000(MCP),:5173(控制平面UI),:9001(内部),:3100(指标,从3000重新映射) |
| nginx ssl | mcpx的TLS终止;代理 /mcp 和 /sse 日期:9443;服务于控制平面:5443;代理CDP:9222→ 主机:9222;代理Kapture WS:61822 | :9443(HTTPS MCP),:5443(HTTPS UI),:9222(CDP),:61822(Kapture WS) |
| stdio代理 | 桥接stdio MCP:顺序思维,kapture(配置因机器而异 $SERVERS_CONFIG) | (内部:7030) |
| mcp状态 | 每30秒轮询一次stdio代理/状态,记录每个mcp运行状况 | -- |
| lunar-proxy | 用于速率限制/可观察性的API网关(已定义但未主动路由通过) | :8000、:8040、:8081 |
上下文镜头 (platform/context-lens/)-LLM API流量拦截和上下文窗口分析
| 服务 | 功能 | 主机端口 |
|---|---|---|
| 上下文镜头 | 反向代理(:4040)使用以下命令拦截来自客户端的呼叫 ANTHROPIC_BASE_URL;web UI+摄入API(:4041)分析上下文组成、成本、浪费 | :4040(代理)、:4041(web UI)、:5175(Vite-dev,dev模式) |
| mitmproxy | HTTPS转发代理,用于无法设置自定义基本URL的客户端(Copilot、Codex);加载项POST捕获以异步获取API | :8080 |
矢量点 (mcps/qdrant-mcp/)——矢量数据库和语义搜索MCP
| 服务 | 功能 | 主机端口 |
|---|---|---|
| qdrant | 用于RAG嵌入的矢量数据库(工作笔记、代码、个人) | :6333(HTTP),:6334(gRPC) |
| qdrant-mcp | FastEmbed通过mcp协议支持语义搜索 | :7020 |
共享MCP(ai共享网络)
这些作为独立容器运行,两个网关都可以通过 ai-shared 网络。
| MCP | 端口 | 状态 | 工具 |
|---|---|---|---|
| 上下文7 | :7008 | ✅ 正在运行 | 2 |
| qdrant mcp | :7020 | ✅ 正在运行 | 6 |
| 内存(单例--由两个网关共享以防止写竞争) | :7040 | ✅ 正在运行 | 8 |
| 剧作家 | :7007 | ⬚ 可用 | 15+ |
| 浏览器使用 | :7011 | ⬚ 可用 | 10+ |
| 哈斯·麦克普 | :7010 | ⬚ 可用 | 5+ |
平台服务
| 服务 | 组成路径 | 状态 | 端口 |
|---|---|---|---|
| 守望台(基于标签的自动图像更新) | platform/watchtower/ | ✅ 正在运行 | -- |
| Langfuse(LLM可观察性、提示、评估) | platform/langfuse/ | ⬚ 可用 | :3100(UI),:3101(MCP身份验证代理) |
| 可观测性(普罗米修斯、格拉法纳、耶格、OTel收藏家) | platform/observability/ | ⬚ 可用 | :9090、:3000、:16686 |
网络体系结构
Docker网络
| 网络 | 类型 | 目的 | 服务 |
|---|---|---|---|
ai-shared | 外部 | 所有共享MCP、支持服务和可观察性的集线器网络 | 两个网关、所有独立MCP、qdrant、了望塔、langfuse(web/worker/proxy)、可观察性堆栈 |
agentgateway_default | 堆栈私有 | 从DNS冲突中隔离agentgateway的stdio代理 | agentgateway、nginx代理、stdio代理、mcp状态 |
mcpx_default | 堆栈私有 | 从DNS冲突中隔离mcpx的stdio代理 | mcpx、nginx ssl、stdio代理、mcp状态 |
context-lens_default | 隐式 | 上下文镜头+mitmproxy内部沟通 | 上下文镜头,mitmproxi |
langfuse-internal | 堆栈私有 | 隔离Langfuse存储(postgres、redis、clickhouse、minio) | Langfuse postgres,Langfuse redis,Langfuse-clickhouse,Langfuse-minio |
两个网关服务(agentgateway、mcpx)都加入 二 网络:它们的堆栈是私有的 default (访问自己的stdio代理)和 ai-shared (达到共享MCP)。这就是为什么stdio代理被包含为一个组合模板,而不是作为一个共享服务运行的原因——每个堆栈在自己的网络上都有自己的实例。
内部Docker流量(ai共享)
|从|到|港口|目的| | ---- | -- | ---- | ------- | |agentgateway/mcpx|context7_mcp|7008|库文档mcp| |agentgateway/mcpx|qdrant-mcp|7020|语义搜索mcp| |agentgateway/mcpx|memory_mcp|7040|知识图mcp(单例)| |agentgateway/mcpx|stdio代理(自有堆栈)|7030|stdio MCP(专用网络)| |qdrant-mcp|qdrant|6333|矢量数据库查询| |agentgateway |酒店收集器|4317|OTLP跟踪| |酒店收藏家|耶格尔| 14317 |微量出口| |otel收集器|(自己)|8889|跨度指标| |prometheus |代理网关|15020|指标抓取| |普罗米修斯|酒店收藏家|8889|跨度指标刮擦| |grafana|prometheus|9090|指标查询| |grafana | jaeger | 16686 |跟踪查询| |mitmproxy|context-tlens|4041|POST捕获以摄取API|
目录结构
ai-infrastructure/
├── clients/ # AI client configurations
│ ├── claude/ # Claude Desktop config
│ ├── cline/ # Cline config
│ └── copilot/ # VS Code Copilot config
├── gateways/ # MCP gateways
│ └── agentgateway/ # Linux Foundation MCP gateway
├── mcps/ # MCP servers
│ ├── browser-use/ # AI browser automation
│ ├── context7/ # Library documentation
│ ├── hass-mcp/ # Home Assistant
│ ├── kapture/ # Chrome extension MCP
│ ├── mcpx/ # MCPX gateway (alternative)
│ ├── memory/ # Memory/knowledge graph
│ ├── playwright/ # Playwright browser automation
│ ├── qdrant-mcp/ # Qdrant semantic search (mcp-proxy + mcp-server-qdrant)
│ ├── sequential-thinking/ # Chain of thought reasoning
│ └── stdio-proxy/ # stdio→SSE bridge
├── platform/ # Platform services
│ ├── context-lens/ # LLM context window inspector
│ ├── langfuse/ # LLM observability, prompts, evals
│ └── observability/ # Prometheus, Grafana, Jaeger
└── workflows/ # Custom workflow definitions组件
网关
| 网关 | 描述 | 状态 |
|---|---|---|
| 代理网关 | Linux基金会MCP网关——通往10+后端、无状态SSE、CORS、OTLP跟踪的路由 | ✅ 跑步 |
| mcpx | Lunar.dev MCP网关——工具分组,按消费者授权/RBAC,控制平面UI | ✅ 跑步 |
MCP服务器
独立的MCP在上作为自己的容器运行 ai-shared.stdio MCP在每堆栈stdio代理实例内运行。
| MCP | 类型 | 描述 | 状态 | 文档 |
|---|---|---|---|---|
| 上下文7 | 独立 | 库文档查找 | ✅ 跑步 | → |
| qdrant mcp | 独立 | 语义搜索(工作笔记、代码、个人) | ✅ 跑步 | → |
| 记忆 | 独立 | 知识图(两个网关共享的单例) | ✅ 跑步 | → |
| 顺序思维 | stdio | 思维链推理 | ✅ 跑步 | → |
| kapture | stdio | Chrome扩展桥 | ✅ 跑步 | → |
| stdio代理 | 模板 | stdio→SSE网桥(包含在网关堆栈中) | ✅ 跑步 | → |
| 剧作家 | 独立 | 浏览器自动化 | ⬚ 可用 | → |
| 浏览器使用 | 独立 | AI浏览器自动化 | ⬚ 可用 | → |
| 哈斯·麦克普 | 独立 | 家庭助理 | ⬚ 可用 | → |
平台服务
| 服务 | 描述 | 状态 | 文档 |
|---|---|---|---|
| 上下文镜头 | LLM API拦截代理+上下文窗口分析界面 | ✅ 跑步 | → |
| 守望塔 | 基于标签的自动图像更新(24小时轮询) | ✅ 跑步 | → |
| 可观测性 | 普罗米修斯、格拉法娜、耶格尔、OTel收藏家 | ⬚ 可用 | → |
| 浪焰 | LLM可观察性、提示、评估(包括postgres、redis、clickhouse、minio) | ⬚ 可用 | → |
客户
看 客户端/readme.md 用于配置。
快速开始
1.创建共享Docker网络
docker network create ai-shared备注:The ai-shared 网络是由定义它的第一个堆栈创建的。只有当您想以不同的顺序启动堆栈时,才需要执行此步骤。
2.启动mcpx网关
cd mcps/mcpx
cp .env.example .env # Edit: set MCP_CONFIG, optionally CUSTOM_CA_CERT
docker compose up -d3.启动代理网关
cd gateways/agentgateway
docker compose up -d4.启动Qdrant+语义搜索MCP
cd mcps/qdrant-mcp
docker compose up -d5.启动上下文镜头(LLM流量分析)
cd platform/context-lens
docker compose up -d然后设置 ANTHROPIC_BASE_URL=http://127.0.0.1:4040/claude 在您的shell配置文件或VS代码设置中。看 上下文镜头自述 对于每个客户端的设置。
6.启动可观测性堆栈(可选)
cd platform/observability
docker compose up -d7.启动Langfuse(可选)
cd platform/langfuse
docker compose up -d8.访问
| 服务 | URL |
|---|---|
| 代理网关MCP | http://localhost:3847/mcp |
| agentgateway管理用户界面 | http://localhost:15001/ui |
| mcpx MCP | http://localhost:9000/mcp |
| mcpx控制平面 | http://localhost:5173 |
| 上下文镜头 | http://localhost:4041 |
| 伯爵 | http://localhost:3000 (管理员/管理员) |
| 廊坊 | http://localhost:3100 (首次访问时创建帐户) |
9.配置您的AI客户端
看 客户/ 用于每个AI客户端的配置示例。
港口
代理网关堆栈
| 端口 | 服务 | 协议 | 注释 |
|---|---|---|---|
| 3847 | 代理网关 | HTTP | 主MCP端点 |
| 15001 | agentgateway | HTTP | 管理UI(游乐场和配置) |
| 15020 | 代理网关 | 普罗米修斯 | 度量端点 |
| 3443 | nginx代理 | HTTPS | TLS封装的MCP+SSE |
| 15443 | nginx代理 | HTTPS | TLS封装的管理UI |
| 9223 | nginx代理 | CDP | 反向代理→ 主机Chrome浏览器:9222 |
mcpx堆栈
| 端口 | 服务 | 协议 | 注释 |
|---|---|---|---|
| 9000 | mcpx | HTTP | MCP端点(SSE+流式HTTP) |
| 5173 | mcpx | HTTP | 控制平面仪表板 |
| 9001 | mcpx | HTTP | 内部网络服务器 |
| 3100 | mcpx | 普罗米修斯 | 指标(从3000重新映射) |
| 9443 | nginx ssl | HTTPS | TLS封装的MCP+SSE |
| 5443 | nginx ssl | HTTPS | TLS封装的控制平面 |
| 9222 | nginx ssl | CDP | 反向代理→ 主机Chrome浏览器:9222 |
| 61822 | nginx ssl | WebSocket | Kapture WS网桥 |
| 8000 | lunar-proxy | HTTP | API网关(未积极使用) |
| 8040 | 月球代理 | HTTP | 健康检查 |
| 8081 | 月球代理 | HTTP | 管理员 |
上下文镜头堆栈
| 端口 | 服务 | 协议 | 注释 |
|---|---|---|---|
| 4040 | 上下文镜头 | HTTP | 反向代理(客户端设置 ANTHROPIC_BASE_URL) |
| 4041 | context-tlens | HTTP | Web UI+摄取API |
| 5175 | 上下文镜头 | HTTP | Vite开发服务器(仅限开发模式,从5173重新映射) |
| 8080 | mitmproxy | HTTP | HTTPS转发代理(Copilot、Codex等) |
共享MCP和支持服务
| 端口 | 服务 | 协议 | 注释 |
|---|---|---|---|
| 7008 | context7 | HTTP/MCP | 库文档MCP |
| 7020 | qdrant-mcp | HTTP | 语义搜索mcp |
| 7040 | 内存 | HTTP | 知识图MCP(单例) |
| 6333 | Qdrant | HTTP | Vector DB REST API |
| 6334 | Qdrant | gRPC | 矢量数据库gRPC API |
可观察性和平台(运行时)
| 端口 | 服务 | 协议 | 注释 |
|---|---|---|---|
| 16686 | Jaeger | HTTP | 跟踪可视化用户界面 |
| 9090 | 普罗米修斯 | HTTP | 度量UI和API |
| 3000 | Grafana | HTTP | 仪表板(管理员/管理员) |
| 4317/4318 | OTel收集器 | gRPC/HTTP | 仅限内部(Docker网络) |
| 8889 | OTel收集器 | 普罗米修斯 | 跨度指标(内部) |
| 3100 | Langfuse | HTTP | LLM可观察性UI |
| 3101 | langfuse mcp代理 | HTTP | agentgateway的mcp认证代理 |
| 9190 | Langfuse MinIO | HTTP | S3兼容对象存储 |
可观测性
可观测性堆栈提供度量、跟踪和可视化:
| 组件 | 端口 | 用途 |
|---|---|---|
| agentgateway管理用户界面 | :15001 | 带游乐场的管理UI |
| 代理网关指标 | :15020 | Prometheus指标端点 |
| 普罗米修斯 | :9090 | 度量存储和查询 |
| 伯爵 | :3000 | 仪表板(管理员/管理员) |
| 耶格尔 | :16686 | 分布式跟踪 |
| 廊坊 | :3100 | LLM可观察性和提示 |
| OpenTetry收集器 | :4317/:4318(内部) | 跟踪处理和跨度度量 |
跟踪流量:
agentgateway → OTel Collector → Jaeger (traces)
→ Prometheus (span metrics)指标包括:
agentgateway_requests_total-按客户端、方法、状态列出的HTTP请求agentgateway_mcp_requests-MCP工具调用tool_calls_total-按服务器和工具名称调用工具list_calls_total-列出操作- 来自OTel Collector的跨度衍生指标(延迟直方图、呼叫计数)
待办事项
- \[\]修复langfuse提示MCP后端-langfuse堆栈(:3101)未运行的问题;当无法访问此上游时,agentgateway无法初始化。需要确保langfuse从网关开始或优雅地处理。
- \[\]修复黑曜石MCP后端-黑曜岩语义插件(:3001)未运行;与langfuse相同的问题。需要自动启动或使网关容忍缺少可选后端。
- \[\]使用agentgateway的原生TLS而不是nginx代理进行HTTPS终止评估
- \[\]使用CDP代理配置Playwright MCP(浏览器使用MCP连接到主机Chrome需要9223上的nginx代理)
- \[\]使用Watchtower标签(代理网关、剧作家、qdrant、可观察性堆栈)重新创建剩余的容器——添加标签以组成文件,但容器需要
docker compose up -d --force-recreate把它们捡起来 - \[x\] 为每个客户端跟踪添加客户端标识标头
- \[x\] 设置Jaeger进行分布式跟踪
- \[x\] 配置代理网关以向OpenTetry收集器发送跟踪
- \[x\] 创建Grafana仪表板以实现指标可视化
- \[x\] 建立Langfuse以实现LLM的可观察性和及时管理
工作流
叉子贡献:樱桃采摘阶段性变化
用于为上游开源项目(如Context Lens)做出贡献。维护本地 main 所有正在进行的修复都已应用,而每个修复都作为单独的上游PR存在于自己的分支上。
upstream/main ← PRs from your fork branches
↑
origin/main (your fork, tracks upstream)
↑
local main (staged cherry-picks from all active branches)
↑
┌───┴───┬──────────┬──────────┐
fix/a fix/b feat/c fix/d ← worktree branches, each = 1 PR密钥不变量:本地 main 从未提前承诺 origin/main.所有仅限本地的更改都以 上演但未确定 樱桃采摘。
开发 在工作台分支上(每个分支=一个PR):
git worktree add ../repo-fix-foo fix/foo
cd ../repo-fix-foo
# ... make changes, commit, push ...
git push origin fix/foo # open PR against upstream/main堆栈 本地主干道的变化:
git checkout main
git cherry-pick --no-commit origin/main..
# Repeat for each active branch — all fixes are now applied but uncommitted同步 与上游(链:上游→ 起源/主要→ 分支机构):
git stash push -m "staged cherry-picks"
git checkout main && git fetch --all
git rebase upstream/main
git push origin main # --force-with-lease if rebased
# Rebase active branches onto synced main
git rebase main fix/still-open-a
git push --force-with-lease origin fix/still-open-a
# Rebuild staged state from remaining open branches
git checkout main
git cherry-pick --no-commit origin/main..fix/still-open-a
git stash drop交换机 --克隆叉子,取,樱桃采摘打开的树枝:
git clone && cd repo
git remote add upstream
git fetch --all && git rebase upstream/main
git cherry-pick --no-commit origin/main..origin/fix/branch-a
git cherry-pick --no-commit origin/main..origin/fix/branch-b提示:
git branch --no-merged origin/main--列出仍需采摘的树枝git diff --cached --stat--查看您当前的樱桃采摘堆栈git restore --staged .--如果阶段状态变得混乱,则中止并重建
看 上下文镜头工作流程详细信息 用于项目特定的分支状态和机器恢复配方。
平台特定设置
- 视窗 --WSL仓库位置、跨文件系统陷阱、SSH密钥、Docker桌面细节
