基于MCP协议构建Claude Code多会话路由系统:Oh My Team架构解析
1. 项目概述从“一机一用”到“一机多用”的AI开发工作流革命如果你和我一样把Claude Code当作主力开发工具那你肯定也体验过它那个“实验性频道系统”带来的又爱又恨的感觉。爱的是这个想法本身太棒了——把Claude直接“塞进”你的手机聊天软件里让你能随时随地跟你的AI开发伙伴对话就像在Telegram或Slack里一个同事那么简单。这简直是远程办公和移动开发的梦想场景。但恨的是它的实现目前还相当“骨感”一个聊天机器人Bot只能绑定一个终端会话。你关掉终端会话就没了你想同时处理前端和后端两个项目对不起你得去创建两个独立的Bot。没有会话管理没有路由更没有持久化。这就像给你一辆顶级跑车却只配了一把钥匙而且每次熄火都得重新配。在过去几个月里我深度依赖Claude Code进行开发但经常被这种“一对一”的僵化模式困扰。我可能同时在维护三到五个项目灵感可能在任何时候、任何地点比如沙发上、咖啡馆里迸发。我需要的是一个能从手机端统一管理所有项目会话的“控制中心”而不是为每个项目都单独准备一个聊天窗口。于是我决定不再等待官方更新自己动手在Claude Code现有的频道协议之上构建了一个名为Oh My Team的路由层。它的核心目标很简单一个Bot管理无限个独立的Claude Code会话并且让这些会话像服务一样在后台持久运行。2. 核心痛点与设计哲学为什么简单的“转发”不够在深入技术细节之前我们得先搞清楚Claude Code现有频道系统的局限性到底在哪以及为什么一个单纯的“消息转发器”解决不了问题。这决定了Oh My Team的整体架构设计。2.1 剖析Claude Code频道协议的“单会话”限制Claude Code的频道功能本质上是通过模型上下文协议Model Context Protocol, MCP建立的一个双向通信管道。你的聊天平台如Telegram Bot实现一个MCP服务器Claude Code客户端连接上来两者就能交换消息、工具调用和权限请求。问题在于这个连接是独占且状态绑定的。会话与进程强绑定一个Claude Code进程即一个终端窗口里运行的那个会话在启动时会连接到配置好的一个MCP服务器地址。这个连接一旦建立就固定了。你无法通知这个Claude进程“嘿现在请处理另一个聊天线程里的问题。”缺乏会话标识协议本身没有设计“会话ID”或“线程ID”的概念。所有从同一个MCP服务器来的消息都会被Claude视为同一个会话的延续。这意味着如果你简单地让一个Bot把不同聊天线程的消息都转发给同一个Claude实例所有对话历史会混杂在一起导致上下文污染Claude会彻底混乱。生命周期同步终端关闭 - Claude进程退出 - MCP连接断开。没有持久化机制无法实现“关闭电脑会话仍在云端运行打开手机无缝接续”。所以解决方案不能只是一个“智能路由器”它必须是一个会话工厂和生命周期管理器。我们需要为每一个独立的对话线程无论是Telegram的论坛主题还是Slack的线程动态创建并维护一个独立的Claude Code会话实例。2.2 Oh My Team的三大设计支柱基于以上分析Oh My Team确立了三个核心设计目标这构成了项目的三大支柱会话路由与隔离核心是一个轻量级路由器作为所有流量的总入口。它的任务是根据消息来源的“线程ID”将其精准路由到对应的、独立的Claude会话桥接器Bridge上。确保项目A的代码上下文绝不会泄露到项目B的对话中。会话持久化与托管利用tmux或screen这类终端复用器让每个Claude会话运行在一个独立的、可分离的虚拟终端中。这样即使你关闭了本地SSH连接或笔记本电脑会话仍在服务器后台稳定运行。你需要一个中心化的“枢纽”来管理这些tmux会话的启动、停止、列表和重连。多智能体协同工作流单一智能体负责从需求分析、研究、编码到自查的全流程就像让一个人同时担任产品经理、架构师、开发、测试和运维其效率和客观性都有局限。Oh My Team内置了12种专业化智能体角色定义。你可以通过一个指令让多个智能体在同一个项目的不同tmux窗格中并行工作各司其职相互校验。这个设计的关键在于“关注点分离”。路由器只管转发枢纽Hub只管管理而真正干活的每个项目会话都是完全独立的。这样做带来了一个巨大的优势零额外令牌成本。因为管理指令和项目对话走的是完全不同的路径你的项目对话消息不会被重复发送到一个庞大的“总控”上下文中从而避免了令牌的浪费。3. 系统架构深度解析从消息到代码的旅程让我们拆开Oh My Team的引擎盖看看一条从手机发出的消息是如何最终变成Claude在终端里执行的代码的。整个架构遵循了“简单、清晰、可扩展”的原则。3.1 核心组件交互图整个系统的数据流可以用以下路径清晰表示[你的手机] - [Telegram/Slack 平台] - [平台适配器] - [路由器 (Router)] - [特定会话的桥接器 (Bridge)] - [Claude Code 进程] ^ | | v ----------------------- [权限确认循环] ------------------------- [权限请求] --------------------3.2 组件职责详解3.2.1 路由器流量调度中心路由器是整个系统的大脑它是一个用TypeScript编写、运行在Bun上的HTTP服务器默认监听8800端口。它的核心职责是维护一个会话注册表这是一个内存中的映射表记录了thread_id(或topic_id): 聊天平台中唯一标识一个对话线程的ID。bridge_url: 对应于此线程的桥接器服务器的本地地址例如http://localhost:8801。session_metadata: 会话的元信息如项目路径、创建时间、状态等。当平台适配器收到一条新消息时它会提取出thread_id并将其连同消息内容一起POST到路由器的/message端点。路由器查表找到对应的bridge_url然后将消息转发过去。如果找不到比如是一个全新的线程路由器会返回一个标准响应提示用户需要先通过枢纽创建会话。这种设计的巧妙之处在于路由器本身不处理任何业务逻辑也不存储任何项目对话历史。它只是一个无状态的转发器这使得它非常轻量且稳定。3.2.2 平台适配器连接外部世界的桥梁平台适配器是系统与外部聊天平台通信的抽象层。我定义了一个约150行的ChannelAdapter接口任何实现了该接口的模块都能让Oh My Team支持新的平台。目前已经实现了两个Telegram适配器利用Telegram Bot API的“论坛主题”功能。每个论坛主题被视为一个独立的会话线程主题ID自然成为thread_id。普通群组也可以通过消息线程来模拟。Slack适配器使用Slack的Socket Mode实现实时通信。每个频道Channel下的消息线程Thread被视为独立会话。添加新平台如Discord理论上只需新建一个适配器文件实现start(),stop(),sendMessage()等几个关键方法即可体现了良好的扩展性。3.2.3 桥接器协议翻译官这是最关键的组件之一。每个活跃的Claude Code会话都对应一个独立的桥接器进程。它是一个标准的MCP服务器实现了Claude Code频道协议所期望的所有端点如/messages,/tools/call。它的工作流程是启动时动态生成一个未占用的本地端口如8801并启动HTTP服务。向路由器注册自己告知路由器“所有发往thread_idabc的消息请送到http://localhost:8801。”等待Claude Code客户端连接。你需要在启动项目会话时将Claude Code的频道配置指向这个本地地址。当收到路由器转发的用户消息时它通过MCP协议转发给已连接的Claude Code客户端。当收到Claude Code返回的响应或工具调用请求时它再通过适配器原路发送回对应的聊天线程。每个桥接器都是独立的这意味着每个Claude Code进程都有自己完全隔离的上下文、对话历史和工具调用状态。3.2.4 枢纽会话命令行管理界面枢纽本身也是一个特殊的Claude Code会话它运行着一个名为“Hub”的智能体。这个会话连接到一个固定的、用于管理的聊天线程例如Telegram论坛的“General”主题或Slack频道的根消息。它的作用类似于一个“命令行控制台”。你在这个管理线程里输入诸如start ~/projects/my-app的指令。Hub智能体接收到后实际上是在其运行的终端里执行相应的omt hubCLI命令。这些命令会在后台创建一个新的tmux会话。在该tmux会话中启动一个新的Claude Code进程并为其创建一个新的桥接器配置好连接。将这个新桥接器注册到路由器。反馈“会话my-app已启动”的消息给你。通过这种方式管理逻辑被完美地封装在了Claude Code内部你无需记忆复杂的CLI命令直接用自然语言管理即可体验非常统一。3.3 权限处理的巧思异步安全门Claude Code的一个重要安全特性是在执行潜在风险操作如写入文件、运行Shell命令前会向用户请求权限。在终端里这会弹出一个交互式提示。但在异步的聊天频道中这成了一个挑战。Oh My Team的解决方案既优雅又安全当Claude Code通过桥接器请求权限时例如“想要运行命令rm -rf /”桥接器会捕获这个请求。桥接器生成一个唯一的请求ID如abc123并将请求内容格式化后通过平台适配器发送到对应的项目聊天线程而不是管理线程。消息看起来像这样[权限请求] Claude 想要执行 操作运行 Bash 命令 命令npm install express 请回复yes abc123 以允许或 no abc123 以拒绝。你在手机上的项目聊天线程里直接回复yes abc123。平台适配器收到回复路由器将其路由到正确的桥接器。桥接器验证ID后将许可结果传回Claude CodeClaude Code继续执行。这个过程保证了权限确认与操作请求发生在同一个对话上下文中避免了混淆也符合安全审计的要求。4. 从零开始部署与实战操作指南理论说得再多不如动手搭一个。以下是我推荐的部署和日常使用流程基于一台云服务器Ubuntu 22.04和Telegram平台。4.1 基础环境准备与核心安装首先确保你的服务器有Node.js环境推荐18然后安装Bun一个更快的JavaScript运行时和Oh My Team。# 1. 安装Bun curl -fsSL https://bun.sh/install | bash source ~/.bashrc # 或 ~/.zshrc重载shell配置 # 2. 通过Bun全局安装Oh My Team bun install -g oh-my-team # 3. 验证安装 omt --version注意虽然Oh My Team也可以通过npm安装 (npm i -g oh-my-team)但我强烈推荐使用Bun。Bun的启动速度和运行效率在处理大量HTTP路由和并发桥接器时优势明显能带来更流畅的体验。4.2 初始化配置与Telegram Bot设置接下来进行初始化配置这是一个交互式向导过程。# 4. 运行初始化向导 omt hub init向导会询问几个关键问题通信平台选择telegram。Telegram Bot Token这是关键。你需要先通过 BotFather 创建一个新的Telegram Bot。创建成功后BotFather会给你一个长字符串格式类似1234567890:ABCdefGhIJKlmNoPQRsTUVwxyZ。将它粘贴到这里。Telegram 群组/论坛ID你需要一个Telegram群组并务必开启“论坛主题”功能在群组设置中。然后将你的Bot添加到这个群组并授予管理员权限。获取群组ID的简单方法是在群组里发一条消息然后访问https://api.telegram.org/botYOUR_BOT_TOKEN/getUpdates在返回的JSON中找到chat.id字段通常是一个负数。将这个数字填入。服务器公网IP和端口路由器需要被Telegram服务器回调所以如果你的服务器在防火墙或NAT后需要确保8800端口或你自定义的端口能被公网访问。向导会尝试自动检测但最好手动确认。初始化完成后会在~/.config/oh-my-team目录下生成配置文件config.json。4.3 启动系统与创建第一个项目会话配置好后就可以启动整个系统了。# 5. 启动枢纽和路由器 omt hub start这个命令会做三件事启动路由器在8800端口。启动Telegram适配器并设置Webhook。在一个新的tmux会话中启动枢纽Claude Code进程。现在打开你的Telegram群组你应该能看到Bot已经在线。在默认的“General”主题或你设置的根话题里尝试发送start ~/projects/my-awesome-api几秒钟后Bot会回复“Session ‘my-awesome-api’ started successfully.”。同时它会自动创建一个新的论坛主题主题名就是my-awesome-api。这个新主题就是你与这个特定项目Claude会话的专属聊天室。4.4 连接Claude Code客户端到桥接器这是最后一步也是最容易出错的一步。我们需要让本地的Claude Code客户端连接到刚刚为项目创建的桥接器。在服务器上查看刚创建会话的桥接器信息omt hub list输出会显示所有运行中的会话及其对应的本地桥接URL例如http://localhost:8802。在你的本地开发机上配置Claude Code。编辑Claude Code的频道配置文件位置通常在~/.config/claude-code/channels.json或通过App的Settings设置。添加一个新的频道配置{ name: My Awesome API (Remote), url: http://你的服务器IP:8802, // 注意是服务器IP和具体端口 type: custom }重要提示这里填的是服务器的公网IP和桥接器的具体端口不是路由器的8800端口。每个会话的桥接器端口都不同。保存配置在Claude Code客户端中选择这个新的频道。如果一切顺利连接状态会显示为已连接。现在奇迹发生了。你可以在Telegram的my-awesome-api主题里直接聊天“帮我写一个Express.js的health check端点”。这条消息会经过路由器-桥接器-到达你本地或服务器上运行的Claude Code客户端Claude处理后的回复和代码会原路返回到这个Telegram主题里。而你本地的Claude Code终端界面也会同步显示这一切。4.5 多智能体团队协作实战Oh My Team的另一个杀手锏是内置的多智能体工作流。假设你正在my-awesome-api项目中需要实现一个复杂的OAuth 2.0授权流程。在项目的Telegram主题中你不再只是和单一的Claude对话而是可以召唤一个专家团队/oh-my-team:team 设计并实现基于OAuth 2.0和RBAC的用户认证授权模块发送这条指令后Oh My Team会做以下事情在当前项目的tmux会话中自动创建多个窗格。在每个窗格中启动一个独立的Claude Code进程但每个进程都被赋予了一个特定的“角色”和系统提示词。你可能会看到窗格1 (Explorer)正在搜索和总结现有的OAuth 2.0最佳实践、安全陷阱。窗格2 (Librarian)在检查项目现有的代码库寻找与认证相关的配置和模式。窗格3 (Hephaestus-1)正在主攻核心认证逻辑的代码实现。窗格4 (Hephaestus-2)同步为实现的代码编写单元测试和集成测试。窗格5 (Reviewer)实时审查其他窗格产出的设计文档和代码提出改进意见。所有智能体的输出都会汇总到你当前的Telegram主题中。你可以像项目经理一样在手机上阅读他们的“工作报告”和讨论并给出下一步指令。最常用的指令可能是/oh-my-team:review-work它会启动一个由5个独立审查员组成的专项小组从目标验证、质量保证、代码质量、安全性、上下文挖掘五个维度对现有代码进行交叉审计只有当所有5个审查员都通过时才算审查完成。这极大地减少了单一智能体“自查盲区”带来的错误。5. 高级配置、故障排查与经验分享任何系统在实际使用中都会遇到问题。以下是我在长期使用和开发中积累的一些关键技巧和常见问题的解决方案。5.1 网络与安全配置要点使用反向代理和HTTPS将路由器端口8800暴露在公网存在安全风险。最佳实践是使用Nginx或Caddy作为反向代理配置HTTPS并设置严格的防火墙规则如只允许Telegram/Slack的IP段访问。这不仅能加密通信还能隐藏后端端口。# Nginx 示例配置片段 server { listen 443 ssl; server_name your-domain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { proxy_pass http://localhost:8800; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; # 重要验证Telegram/Slack的Webhook来源IP # allow from Telegram IP ranges; # deny all; } }管理令牌安全Bot Token是最高权限密钥。切勿提交到版本控制系统。使用环境变量或安全的密钥管理服务来存储。omt hub init向导支持从环境变量读取如TELEGRAM_BOT_TOKEN。5.2 性能优化与资源管理桥接器端口管理默认情况下桥接器端口从8801开始递增。如果同时运行大量会话注意端口范围。可以通过配置修改起始端口和范围。会话资源限制每个Claude Code会话都会消耗内存和CPU。对于长期运行的后台会话可以考虑使用systemd或supervisor来管理omt hub进程并设置资源限制和自动重启。更简单的方法是在服务器上使用tmux运行omt hub start然后detach它就会在后台稳定运行。日志与监控Oh My Team的日志默认输出到控制台。对于生产使用建议重定向到文件并使用tail -f或journalctl进行监控。关键的日志模块是router和bridge关注连接错误和消息转发失败。5.3 常见问题排查速查表问题现象可能原因排查步骤Bot在Telegram无响应1.omt hub start未运行。2. Webhook设置失败或端口被阻。3. 服务器防火墙/安全组未开放8800端口。1. 运行omt hub status检查进程。2. 查看路由器日志tail -f ~/.local/state/oh-my-team/logs/router.log。3. 在服务器上curl http://localhost:8800/health 再从外网curl http://公网IP:8800/health。Claude Code客户端连接失败1. 桥接器URL配置错误IP或端口。2. 服务器防火墙未放行桥接器端口。3. 桥接器进程已崩溃。1. 用omt hub list确认准确的桥接器URL。2. 在服务器上curl该桥接器URL的/health端点。3. 检查对应会话的桥接器日志。权限请求未弹出/不生效1. 消息未路由到正确的桥接器。2. 权限请求ID不匹配或超时。1. 确认你是在项目主题而非General主题内回复权限请求。2. 检查桥接器日志看是否收到并转发了权限回复。权限请求默认超时时间为2分钟。tmux会话意外退出1. Claude Code进程自身崩溃。2. 服务器资源不足内存OOM。1. 检查tmux会话内的Claude Code错误信息omt hub attach session-name。2. 检查系统日志/var/log/syslog或dmesg查看OOM记录。考虑为会话设置内存限制。多智能体指令无效1. 未在已激活的项目会话主题内使用。2. Hub智能体未正确加载多智能体技能定义。1. 确保指令发送在由start命令创建的主题内。2. 重启枢纽会话在General主题发送restart hub或运行omt hub restart。5.4 个人实战心得与进阶技巧为不同项目类型预设提示词Oh My Team的会话启动命令可以接受额外的环境变量或参数。我创建了一个简单的包装脚本根据项目类型如node,python,go自动注入不同的Claude Code系统提示词让新会话一开始就具备特定的上下文和角色。# 示例~/bin/start-project #!/bin/bash PROJECT_PATH$1 PROJECT_TYPE$2 case $PROJECT_TYPE in node) export CLAUDE_CODE_SYSTEM_PROMPTYou are a senior Node.js backend engineer... ;; python) export CLAUDE_CODE_SYSTEM_PROMPTYou are a Python data science expert... ;; *) export CLAUDE_CODE_SYSTEM_PROMPTYou are a helpful programming assistant... ;; esac omt hub add $PROJECT_PATH然后在Telegram里发送start ~/projects/data-pipeline python即可。利用tmux进行高级调试omt hub attach name让你能直接跳进会话的tmux。在这里你可以直接与Claude Code的终端交互这对于调试复杂的工具调用失败或查看原始输出非常有用。快捷键CtrlB, D可以退出而不终止会话。会话状态持久化与备份虽然Claude Code的对话历史本身不持久但你可以通过定期保存tmux会话的脚本来实现某种程度的“快照”。或者更根本的方法是将重要的对话结论和生成的代码块通过Hub智能体自动提交到项目的Git仓库中实现工作进度的固化。令牌成本控制这是使用任何AI辅助工具都需要关注的。Oh My Team的架构优势在于隔离。但要注意每个独立的智能体在多智能体模式下都会消耗自己的令牌。对于不需要持续深度思考的看守性任务可以考虑使用更低成本的模型如果Claude Code未来支持模型切换或者设定更简洁的审查提示词。构建和使用Oh My Team的过程让我深刻体会到好的工具不是要替代原有工作流而是无缝地增强它。Claude Code的频道协议本身设计得很扎实限制主要在于产品层面的“一对一”假设。通过一个轻量级的路由和会话管理层我们就能突破这个限制释放出移动端、多任务、持久化协同的潜力。而将多智能体工作流与终端管理相结合更是打开了一扇新的大门——它不再是简单的问答而是组织起一个随时待命的、专业化的虚拟团队。