关于 Tower
Tower 是一个 MCP 服务,用于协调不同机器和账户上共同处理一个仓库的编码 Agent。Agent 可声明编辑意图以检测冲突、委派任务、互发消息,并在共享看板跟踪工作。
主要功能
- 01按文件和符号声明编辑意图
- 02语义检测重复工作
- 03跨 Agent 委派任务与消息沟通
- 04共享看板展示声明、任务和消息
- 05后台 Worker 执行委派的编码任务
- 06用于提交检查的 Git hooks
适用场景
- 01避免多个 Agent 编辑同一符号
- 02将仓库任务委派给队友的 Agent
- 03在开始工作前发现研究内容重叠
- 04跟踪团队 Agent 活动与任务回复
MCP 相关
Tower 向 MCP 客户端提供协调工具,包括意图声明、消息和任务委派。它支持 Stdio 或 HTTP,并可协调不同厂商的 Agent。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
20收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| repo | string | 是 | |
| files | array | 否 | |
| force | boolean | 否 | |
| reads | array | 否 | |
| branch | string | 是 | |
| repoId | string | 否 | |
| agentId | string | 是 | |
| purpose | string | 否 | |
| symbols | array | 否 | |
| projectId | string | 否 | |
| etaMinutes | integer | 否 |
详细介绍
Tower 🗼
让团队的 AI 编码 Agent 实现多人协作。
npm 上的 tower-mcp · 网站 · 文档 — 设置:npx -y tower-mcp setup
每一款出色的工作工具都走向了多人协作——Docs 击败了 Word,Figma 击败了 Photoshop。AI 仍是人人独自使用的工具:一个提示词、一个输入框、一个人。
Tower 是一个 MCP 服务,可将团队的编码 Agent——Claude Code、Cursor、Codex,它们运行在不同的机器和不同的账户上——变成 同一代码仓库中的一支团队。你的 Agent 可以将任务委派给队友的 Agent;对方的 Agent 用_自己的_令牌完成工作、提交代码,并返回提交哈希——任务、回复和提交哈希都会显示在 整个团队都能看到的共享看板上,而不再散落于成千上万条私人对话中。而且,由于每个人都会在编辑前声明意图, 不会有两个 Agent 在同一段代码上重复消耗令牌——冲突会在敲下第一个 字符前就被拦截,而不是等到合并时才发现。
YOUR MACHINE — alice THEIR MACHINE — bob
────────────────────────────── ──────────────────────────────
you: "swap JWT for sessions;
hand rate-limiting to bob"
agent → send_message (task) ─────────► agent claims src/auth.ts
→ "unreadMessages: 1" → fetch_messages
(or: tower work accepted it, running claude…)
→ does the task, their machine/tokens
→ commits (hook completes the claim)
[DONE] bob → alice: ◄───────── → send_message (task_update)
"rate limit 30/min, merged in ab12f3"

状态:**v0.12.1——项目尚处早期,正在公开开发。**以下所有功能目前都已端到端可用, 并通过 CI 强制执行的 80% 覆盖率门槛。已发布内容和后续计划: CHANGELOG.md · 设计文档:MVP-SPEC.md。
为什么需要 Tower
每家厂商都会为你的 Agent 提供工具和记忆;却没有人让你的 Agent 与队友的 Agent 连接起来。两个人、十个 Agent、一个代码库——Agent 之间看不到彼此, 无法交接工作,还会在同一文件上发生冲突,除了合并冲突之外什么也留不下。Tower 是缺失的协作层:一座所有 Agent 都能交流的共享塔楼。 它位于 git 之上,使用 MCP,但不会取代两者。它从设计上就与模型无关——只有当_其他厂商的_ Agent 也在其中时,协作才有意义。
你需要了解的六个词
| 词语 | 在这里的含义 |
|---|---|
| MCP | Agent 调用外部工具的标准方式。Claude Code、Cursor 和 Codex 都支持它,因此 Tower 无需插件即可与它们配合使用 |
| 声明 | Agent 在编辑前说 “我即将编辑这些文件/函数”。这是核心操作 |
| 符号 | 有名称的函数、类或方法 — 因此,两个 Agent 在同一个文件中编辑_不同_函数时,不会被视为发生冲突 |
| 硬 / 软 | hard = 相同符号 → 声明会被拒绝,并告知你可以改为处理什么(force 可覆盖)。soft = 同一文件中的不同符号,或另一个分支 → 系统会告知你,但你仍可继续 |
| 看板 | 显示每个 Agent 的有效声明、任务和消息的网页 |
| 工作进程 | tower work — 在一台机器上运行的守护进程,可接收委派的任务并以无头模式运行编码 Agent |
声明会自行过期(15 分钟 TTL,并通过心跳刷新),因此崩溃的 Agent 永远不会锁定文件 — 而且在线 Agent 的声明会自动延长,因此不会在任务进行中失效。
一个仓库意味着一个协作空间。 Tower 根据仓库的 root
commit sha 对声明进行标识,所有克隆、分叉和镜像都共享此标识。因此,分叉仓库及其上游仓库可以相互协作,而
[email protected]:acme/app.git 和
https://github.com/Acme/App 指向同一个地方,而不是两个互不关联的群组。
30 秒快速体验
需要 Node 22.13+(它使用内置的 node:sqlite,因此无需编译)。
无需安装任何东西,也不会向磁盘写入任何内容:
npx -y tower-mcp demo
这会打开一个浏览器标签页,显示实时看板,其中预置了一个真实的硬冲突和一个已完成的委派任务:
Tower demo is live → http://localhost:52410/board#token=demo
What you're seeing: alice and bob both claimed AuthService.verify — a HARD
collision caught before either wrote a line. Below it: a delegated task with
bob's reply + commit, a broadcast still waiting, and a pinned team rule.
Ctrl+C stops the demo (nothing was written to disk).
没成功?npx -y tower-mcp doctor 会检查 Node、git、你的运行器和服务端,并准确指出缺少什么。
更喜欢仅使用终端的演示?(需要克隆仓库)
npm run demo # after: git clone … && npm install
⛔ COLLISION — AuthService.verify
Agent "cursor-bob" is mid-change (started 2s ago, ETA ~6m, purpose: replace JWT).
Options:
[w] wait — no need to retry: Tower messages you when their claim ends
[d] dependent — run: tower next-task (a module that's safe to start now)
[b] branch — build on their WIP instead of racing them
[f] force — re-run guard with --force; you own the merge risk
setup 写入的内容——全部都在你的仓库中,不会写入全局位置,也不会发起任何你未配置的网络调用:
| 路径 | 内容 |
|---|---|
.mcp.json | tower 服务条目(与现有服务合并) |
CLAUDE.md | 追加先声明规则(如果文件不存在则创建) |
AGENTS.md | 追加相同规则——仅当文件已存在时 |
.tower/ | 本地 SQLite 状态(声明、消息、任务)。可安全删除 |
.gitignore | 追加 .tower/,以免提交本地数据库 |
.git/hooks/pre-commit, post-commit | 仅在使用 --hooks 时 |
npx -y tower-mcp setup
重新加载编辑器——完成。添加 --keep-going 后,写入的规则会指示 Agent 绕开冲突,而不是停下来询问你(参见无人等待)。要加入团队服务端?
npx -y tower-mcp setup --url https://tower-xxxx.onrender.com/mcp --token <team-secret> --hooks
setup 的操作 / 手动配置
setup 会将 tower 条目写入 .mcp.json(与现有服务合并),将先声明 + 检查收件箱规则追加到 CLAUDE.md(以及存在时的 AGENTS.md),并在使用 --hooks 时安装 git 提交前/后保护钩子。手动配置方法:
// Claude Code — .mcp.json
{
"mcpServers": {
"tower": { "command": "npx", "args": ["-y", "tower-mcp", "serve"] },
},
}
npx -y tower-mcp init # writes .tower/policy.yaml + prints MCP setup
npx -y tower-mcp serve # MCP over stdio (or: serve --http --port 4319 --token <secret>)
从源代码安装(贡献者)
git clone https://github.com/Rohanxmalik/Tower && cd Tower
npm install && npm run build
node packages/cli/dist/index.js serve
然后将以下内容添加到 Agent 的规则文件中:
“编辑任何文件之前,请调用
claim_intent,并提供你要修改的文件和符号。 如果返回hard冲突,请停下来询问用户;响应中的alternatives会说明此时可以安全处理哪些内容。”
完整安装说明 → docs/quickstart.md。
跨机器委派工作(核心循环)
两个人、两台机器、两个账户——同一个仓库。这就是 Tower 的用途:
- 委派——告诉你的 Agent:“把限流工作交给 bob”(也可以根据你的规则由它自行决定);它会调用
send_message,并设置kind: "task"。也可以在任意终端中手动操作:tower send(按提示选择对象并描述任务;身份和仓库信息来自 git)。 - 接手——下次 bob 的 Agent 使用 Tower 时(调用任意一次
claim_intent),响应会显示unreadMessages: 1;规则文件会指示它调用fetch_messages并采取行动。消息以收件箱方式送达——MCP 没有推送通道——因此这是异步的,类似 Slack,而不是打电话。**也可以让它始终在线:**在 bob 的机器上运行tower work后,任务会自动接手——工作进程接受任务,并在后台运行本地 Agent,无需编辑器。 - **完成工作——在对方的机器上,使用对方的账户。**Bob 的 Agent 会认领文件(避免其他人和它冲突),并使用 bob 的令牌和 git 身份编写代码。API 密钥绝不会跨机器传输。
- 提交并完成闭环——提交时,git 的 post-commit 钩子会使用 sha 完成认领;Agent 会回复
send_message { kind: "task_update", replyTo: <task> }:“/login 的限流设为每分钟 30 次,已合并到 ab12f3。” 你的 Agent 下次连接时就会看到消息——整个交流过程也会始终显示在看板的 COMMS 面板中。通过tower work,结果会以分支 + PR的形式送达:工作进程在tower/task-<id>上提交、更改推送并创建 PR,task_update中会包含 sha 和 PR 链接。
始终在线的委派:npx -y tower-mcp work 可将任意机器变成任务工作进程——它会轮询已委派的任务,向你确认(或使用 --auto 无人值守运行),在后台驱动 claude -p / codex exec,并为结果创建 PR。完整指南和安全模型 → docs/worker.md。
工作进程需要三项条件(运行 npx -y tower-mcp doctor 可检查全部条件):干净的 git 工作树——存在未提交更改时它会拒绝运行,因此绝不会将你的工作混入任务提交;PATH 中有 claude 或 codex;如果需要创建拉取请求,还需要经过身份验证的 gh(没有它仍会推送分支)。
明确说明信任模型:收到的任务是队友的 Agent 将要执行的代码——应将共享的 TOWER_TOKEN 视为拥有推送权限;对于超出范围的任务,Agent 应向其使用者确认(SECURITY.md)。
用手机操作
看板是遥控器,而不只是仪表板。在手机上打开 https://<your-tower>/board:
- 发送框——用一句话委派任务。从在线工作进程下拉列表中选择接收者(绿色 = 在线,将立即运行;离线 = 将排队等待)。该机器上的
tower work守护进程会接收任务、运行 Agent 并创建 PR。 - 批准 / 拒绝——使用
--approve remote运行工作进程,它会暂存每个任务,而不再通过终端询问。手机上会显示 “cursor-dana 想要运行:添加一个 /health 端点”,并提供两个按钮。点击“批准”,你的笔记本电脑就会开始工作。 - 地图视图——命令流树:谁指挥谁、每项任务及其回复,以及实时在线状态圆点。点击任意 Agent 即可向其下达指令。(docs/map.png)
- 一键身份验证——打开
/board#token=<token>,即可连接,无需输入。
与其他功能使用相同的 TOWER_TOKEN——任何能打开看板的人都能驱动你的工作进程,因此应像拥有推送权限一样谨慎分享。详情 → docs/worker.md。
在重复工作发生前及时发现
代价高昂的失败通常不是合并冲突,而是两个 Agent 做了相同的工作。它们选择了不同的文件名,git 顺利合并了双方的修改,而你却为同一份交付成果付了两次钱。文件级检查无法发现这种情况;等到任一 Agent 开始修改文件时,令牌已经花出去了。
因此,在开始任何研究之前,Agent 会先说明自己打算做什么:
propose_intent "write a blog post about prompt injection"
⚠️ claude-bob is already on this (2m ago):
"AI agent security / prompt injection"
→ stand down, or pick something else
匹配依据是含义,而不是路径——即使一个 Agent 打算写入
prompt-injection-agent-security.mdx,另一个打算写入
ai-agent-security-prompt-injection.mdx,也能触发。完全在本地运行:不调用模型,不用嵌入,也不发起网络请求。
及时发现你依赖的接口已经变更
一条声明是否新鲜,取决于产生它时读取的信息。
比较两个 Agent 将要写入的内容,可以发现它们正在编辑同一个函数。但这无法发现更常见的失败:alice 在 auth.ts 中修改了 AuthService.verify,而十分钟前读过旧签名的 bob 在 payments.ts 中编写了调用代码。文件不同、符号不同——没有任何重叠,系统却告知双方可以继续,直到 CI 才让 bob 发现问题。
因此,声明还会记录它所基于的内容:
claim_intent files: ["src/payments.ts"] symbols: ["charge"]
[HARD] AuthService.verify moved under you — alice changed the declaration you read
was: verify(token: string)
now: verify(token: string, opts: Opts)
有两个细节让这个功能值得启用:
它展示的是差异,而不是警告。 告诉 Agent“你的上下文可能已过时,请重新读取文件”,会让它消耗整整一个模块的上下文,只为发现一个参数发生了变化。用两行差异就能替代这些内容,Agent 无需重新打开文件,就能修补调用处。
只有调用方确实可能出错时才会触发。 指纹只涵盖_声明_,绝不包括函数体——因此,重写实现、重命名局部变量、添加注释或运行 prettier 都不会触发。添加参数或更改返回类型则一定会触发。
你无需声明自己读取了什么:PostToolUse 钩子会监视 Read 并代你记录,同时保存你查看时每个声明的签名。如果你先声明了任务,之后又有内容发生变化,heartbeat 会在你的 Agent 每 60 秒都会调用的请求中告知你。
需要坦诚说明其局限:签名不变时,行为变化无法被发现;正是这种取舍让误报率接近于零。请参阅 docs/protocol.md。
没人等待
过去,拒绝就意味着停止:stand_down,并附上一条要求 Agent 询问你的规则。
一次冲突就会让 Agent 停下来,直到有人类注意到。自 0.12.0 起,冲突变成了
绕行:
拒绝会说明哪些操作仍然安全。 它会携带 alternatives,说明哪些内容应当避开,
并提供一行建议:
(claim REFUSED — another agent holds this. Re-run with --force to override.)
What to do instead:
Held by bob (~10 min). Don't wait: work on anything outside the 2 symbols in
`avoid`. Tower will message you when it frees up — no need to retry.
Avoid for now: AuthService.verify() (src/auth.ts), charge() (src/payments.ts)
其中有 charge,因为 Tower 推断出了它:之前有一条声明在读取 verify 后写入了
charge,因此 charge 依赖于它。无需编写依赖关系映射——它来自 Agent 实际读取的内容。
没人轮询。 Bob 的声明一完成、被释放或过期,遭到拒绝的 Agent 就会收到
tower 发来的消息,告知它是什么内容腾出了空间。
当阻止操作的是 PreToolUse hook 或 git pre-commit guard 时也是如此 (自 0.12.1 起):受阻的 Agent 会看到替代方案,并在声明释放时收到消息。
在你读取时获知,而不是在你编辑时。 打开某人正在修改的文件,
PostToolUse hook 会立即通知你的 Agent——在它基于即将变动的代码规划任何事情之前。
依赖工作并行推进——以契约为先。 如果 Alice 正在更改签名, 她会说明它将变成什么:
claim_intent symbols: [{ symbol: "AuthService.verify",
declares: "verify(token: string, opts: Opts): boolean" }]
编写调用方的 Bob 会拿到这份契约——而不只是收到 verify 即将变动的警告——
于是可以立即据此编写代码,而不必等待 Alice 提交更改。Alice 完成后,Tower 会检查实际提交的内容,并告知 Bob 是否与她声明的一致——因此,如果计划有变,他会从 Tower 而不是 CI 那里得知。
让 Agent 自行继续工作。 tower setup --keep-going 会写入一条规则:
发生冲突时,在 avoid 之外继续工作,只有在没有安全的剩余选项时才询问人类。
默认规则仍然要求停止并询问——等待某个人是更谨慎的选择,也仍是默认设置。
实际发生的冲突
$ tower stats
2 collision(s) recorded
by kind
write_write 1 (50%) two agents on the same symbol
write_read 1 (50%) a contract moved under a reader
这里只统计数量——不包含文件名、符号名或代码,也不会有任何内容离开你的机器。 这个功能之所以存在,是因为 Tower 花了四个版本检测冲突,却把每次冲突都忘得一干二净, 因此没人能说清楚实际发生的是哪类冲突。
20 个工具
| 工具 | 用途 |
|---|---|
claim_intent | 一次调用即可登记意图并获取冲突(主要工具) |
check_collision | 试运行冲突检查,不会持久化声明 |
heartbeat | 保持声明有效(否则会自动过期) |
complete_claim / release_claim | 提交 / 放弃时释放声明;并告知等待中的 Agent 该声明已释放 |
list_claims | 查看实时声明状态 |
log_decision / get_decisions | 共享架构决策记忆 |
next_task | 基于规则的排序器:找出现在可以安全开始的模块 |
send_message / fetch_messages | Agent 通道:Agent 之间的异步消息和任务委派 |
pending | 只读统计未读消息和等待你处理的未完成任务(提醒) |
accept_task / complete_task / list_tasks | 任务生命周期:由第一个接受的 Agent 获得任务,结果附带 sha/PR |
request_approval / resolve_approval | 人工审批关卡:暂挂任务,并通过看板 / 手机批准 |
heartbeat_worker | 实时在线状态 — 工作进程宣布已上线并准备好执行任务 |
propose_intent | **开始研究前:**说明计划要做什么;发现重复工作 |
record_reads | 记录刚刚读取的内容 — 以及当前正在修改这些内容的人(由钩子调用) |
协议约定 → docs/protocol.md。
工作原理
MCP clients (Claude Code / Cursor / Codex)
│ stdio · HTTP/SSE
▼
Tower server ── collision engine (tree-sitter) · agent inbox · sequencer · SQLite · /board UI
▲
tower CLI: demo · doctor · init · setup · serve · status · stats · watch · complete · claim · guard · next-task · send · inbox · nudge · work · version
- **基于语义,而非文本:**符号来自 tree-sitter AST(TS/JS/Python),因此即使位于不同的 diff 区块,
AuthService.verify也会产生冲突。 - **与模型无关:**这是一个 MCP 服务 — 目前所有主流 Agent 均可使用。
强制执行(不要依赖 Agent 记得)
Agent 选择 发起的工具调用并非安全保障。Tower 有 三层强制执行机制 — 请叠加使用:
- MCP 工具 + 规则文件 — 每个 Agent(Claude、Cursor、Codex)都会在编辑前声明。
tower setup会为你写入此文件。 - Claude Code hooks — 冲突的
Edit/Write/MultiEdit会被直接 阻止。⚠️ 目前需要克隆 Tower — hook 脚本不在 npm 包中;它们从克隆目录运行,并导入其中构建好的 CLI:
这会配置五个 hook:SessionStart 注册会话,UserPromptSubmit 提醒你有待处理的任务或消息,PreToolUse 阻止硬冲突编辑(退出码为 2),PostToolUse 在编辑后保持你的在线状态,并在npm install && npm run build npx tower-mcp init --hooks # writes .claude/settings.json, then reload Claude CodeRead时记录你读取的内容;如果有人正在修改这些内容,还会发出警告;SessionEnd 释放你的声明。升级现有安装时使用同一条命令 —git pull && npm install && npm run build && npx tower-mcp init --hooks— 它会将 Tower 自身的条目更新为当前版本,且绝不会更改你自己的 hooks。重新运行不会造成任何变化。 - 通用 git pre-commit 防护 — 适用于 任何 编辑器或 Agent;如果队友的 Agent 持有冲突声明,就会拒绝提交:
cp examples/git-hooks/pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit
hook 的精准度:它会定位每处编辑,并声明其所在的函数,因此同一文件中不同函数里的两个 Agent 不会互相阻止。Write、新文件,或声明之间的编辑(导入、顶层代码)会退回到整个文件 — 多声明是安全的,少声明则不安全。完整的适用范围和限制 → docs/enforcement.md。
实时看板
每个启用 serve --http 的 Tower 都会在 /board 提供实时看板(每 2 秒刷新一次):每个 Agent 的有效声明、以红色标记的冲突、每项声明已持续的时间 — 以及 COMMS 面板,实时显示每条消息和委派的任务。将它放在编辑器旁边,即可查看谁在处理什么、哪些任务正在进行,以及 Agent 之间的所有消息(截图见本 README 顶部)。
需要明确的是:看板显示的是声明、任务和消息 — 并非 Agent 会话的实时记录。你看到的是每个 Agent 声明自己正在处理的内容以及它汇报的结果,而不是它的按键操作。
从终端使用 Agent 通道 — 只需运行 send;它会询问其余信息(你的身份和仓库会从 git 获取):
$ npx -y tower-mcp send
To (agent id, or * for everyone): bob
Message: add rate limiting to /login
Is this a task for them? [y/N]: y
📨 Sent task c78094d1 → bob
$ npx -y tower-mcp inbox # your messages (identity inferred from git)
(脚本/Agent 则传入标志:send --to bob --body "..." --task — 提示只会在真实终端中出现。)
GitHub Action:PR 冲突报告
无需服务器 — 一个工作流文件就能对触及与其他未关闭 PR 相同文件的任何 PR 发表评论(并标记重叠的行);如果你运行了托管版 Tower,还会显示 Agent 的实时声明:
- uses: Rohanxmalik/Tower/[email protected]
像这样固定发行版标签;也可以使用 @main,但它会跟踪最新开发版本。设置说明 + 截图 → docs/action.md。
团队模式(整个团队,使用不同设备)
让所有人的 Agent——Claude、Cursor、Codex——都连接到同一个 Tower。当两个人的 Agent 要访问同一个文件时,第二个 Agent 会在消耗一个 token 之前收到提示,而不是等到 合并时才发现。团队可根据情况选择以下两种配置:
- 同一办公室/同一 WiFi(或住在一起): 无需部署或建立隧道——用一台笔记本电脑托管
(
serve --http --host 0.0.0.0),其他人连接它的192.168.x.x地址。只需 2 分钟。 - 远程办公/网络不同: 在线托管一个 Tower,获得永久 HTTPS URL。
大约 5 分钟即可将自己的 Tower 部署到线上(提供免费方案),无需建立隧道:
也可以使用 Docker 自行管理:
TOWER_TOKEN=your-secret docker compose up -d # http://<host>:4319/mcp
每位开发者的 .mcp.json 都使用 "type": "http", "url": ".../mcp"——现在,你的 Claude 会告诉
联合创始人的 Codex:“在提交 abc123 之前不要动 auth。”完整配置指南,适合初学者——
同 WiFi 模式、Render 逐步操作说明,以及各编辑器的配置 →
docs/team.md。
🚀 不想自己托管? 面向团队的托管式常驻协调服务 Tower Cloud 即将推出。加入候补名单。
信任、数据,以及如何移除
- 不收集遥测数据。 除了你配置的网络调用,Tower 不会发起其他网络调用。看板 页面不会加载任何外部资源——没有 CDN、字体或分析工具。
- 你的数据保留在仓库中。 声明、消息、任务和决策都存储在
.tower/tower.db中——这是一个普通的 SQLite 文件。删除该目录即可彻底移除数据。 - API 密钥不会在设备间传递。 Worker 会调用该设备上已经安装的
claude/codex。 Tower 永远不会接触供应商凭据。 TOWER_TOKEN是共享密钥——请像对待推送权限一样谨慎保管。 持有它的任何人都可以 向团队中的 Worker 分派任务。请参阅 SECURITY.md。- Tower 出错时绝不会阻止你工作。 所有钩子都采用_开放式失败_:如果 Tower 无法访问 或钩子出错,你仍可继续编辑和提交。
- 移除方法: 删除
.tower/,从.mcp.json中移除tower条目;如果使用--hooks安装了钩子,还要删除.git/hooks/pre-commit和.git/hooks/post-commit。如果 运行过init --hooks,还要从.claude/settings.json中移除 Tower 的node hooks/…条目。
Monorepo 目录结构
packages/shared protocol types + zod schemas (source of truth)
packages/server collision engine, sequencer, SQLite store, MCP server, transports
packages/cli the `tower` command
hooks/ the five Claude Code hooks (SessionStart … SessionEnd; PreToolUse blocks)
action/ GitHub Action — PR collision reports
extensions/ tower-anywhere — claim-before-you-edit for non-code work (docs, briefs)
examples/ two-agents-demo, git-hooks (pre-commit guard, post-commit release)
docs/ quickstart, protocol, worker, enforcement, team, action
Dockerfile hosted team server
开发
npm install
npm test # vitest, 80% coverage gate
npm run build # tsc -b
路线图
- 每个 Agent 独立的身份与身份验证(当前:团队共用一个令牌)——Tower Cloud 的基础
- 支持更多用于符号提取的语言语法(Go、Rust、Java——欢迎贡献)
- 预测式冲突检测(基于合并历史的 ML)——未来的竞争优势
- 自动解决/协调 Agent
- 跨仓库/组织级意图图谱 + API 合约变更检测
- 企业功能:策略引擎、SSO、审计台账
贡献与社区
欢迎提交 PR——请参阅 CONTRIBUTING.md(TDD、小型 PR,内含适合初次贡献者的建议)。 安全问题报告 → SECURITY.md。变更记录 → CHANGELOG.md。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。