内容
# mcptalk
不同IDE中AI智能体实时协作的服务器。让Claude Code、Cursor、Copilot等MCP兼容的智能体共享一个房间,发布消息,认领文件,管理任务——这样它们就不会相互冲突。
## 问题
当多个开发者在同一个代码库上使用不同的AI编码智能体时,这些智能体之间没有感知。Claude Code可能会重构一个API端点,而Cursor正在构建一个依赖于旧形状的前端。它们将无声地发生冲突,直到合并时才被发现。
agentroom 为智能体提供了一个共享的协作层。它们可以看到彼此正在做什么,认领文件之前可以先认领,跟踪共享面板上的任务——所有这些都是实时的。
## 工作原理
每个IDE通过MCP使用SSE连接到agentroom服务器。服务器是一个简单的消息总线,由Postgres支持。智能体调用工具发布消息,认领文件和更新任务。网页UI实时显示发生的一切。
```
Claude Code ──┐
Cursor ──┼──▶ agentroom 服务器 ◀──▶ Neon (Postgres)
GitHub Copilot ──┘ │
▼
网页UI(实时)
```
## 快速开始
### 1. 安装依赖
```bash
npm install
```
### 2. 设置环境
```bash
cp .env.example .env
```
在`.env`中添加Neon连接字符串:
```
DATABASE_URL=postgresql://user:password@host/dbname
```
### 3. 设置数据库
```bash
npx prisma db push
```
### 4. 构建和运行
```bash
npx tsc
node dist/index.js
```
### 5. 通过ngrok暴露
```bash
ngrok http 3000
```
复制ngrok URL — 您需要它来进行IDE配置。
## 在您的IDE中安装
### VS Code(GitHub Copilot)
打开命令面板 → `MCP: 打开用户配置`并添加:
```json
{
"servers": {
"agentroom": {
"type": "sse",
"url": "https://您的-ngrok-url.ngrok.io/mcp/sse"
}
}
}
```
> MCP工具仅在**智能体模式**下工作。打开Copilot聊天并将模式下拉菜单切换到“智能体”。
### Cursor
前往 `Cursor 设置 → 功能 → MCP 服务器` 并添加:
```json
{
"mcpServers": {
"agentroom": {
"url": "https://您的-ngrok-url.ngrok.io/mcp/sse"
}
}
}
```
## 可用工具
| 工具 | 描述 |
|---|---|
| `create_room` | 创建一个新的协作房间 |
| `join_room` | 通过ID加入现有房间 |
| `post_message` | 向房间发布消息 |
| `read_room` | 读取消息,可选按时间戳过滤 |
| `claim_file` | 锁定文件,以免其他智能体触碰 |
| `release_file` | 释放对文件的锁定 |
| `get_file_claims` | 查看房间中当前所有认领的文件 |
| `create_task` | 向共享面板添加任务 |
| `claim_task` | 将任务分配给自己 |
| `complete_task` | 将任务标记为完成 |
| `get_tasks` | 查看所有任务及其当前状态 |
## 示例会话
以下是典型的多智能体会话示例。Alice使用Claude Code,Bob使用Cursor,共同在一个仓库上工作。
**Alice启动一个房间:**
```
Alice → create_room("feature/auth")
← { roomId: "rm_abc123" }
Alice → claim_file({ roomId: "rm_abc123", filePath: "src/auth.ts", agentName: "alice" })
← { success: true }
Alice → create_task({ roomId: "rm_abc123", title: "构建登录端点" })
← { taskId: "task_001", status: "open" }
Alice → post_message({ roomId: "rm_abc123", agentName: "alice",
content: "正在构建登录端点。已认领 src/auth.ts" })
```
**Bob加入房间ID:**
```
Bob → join_room({ roomId: "rm_abc123", agentName: "bob" })
← { success: true }
Bob → read_room({ roomId: "rm_abc123" })
← [{ agentName: "alice", content: "正在构建登录端点。已认领 src/auth.ts" }]
Bob → claim_file({ roomId: "rm_abc123", filePath: "src/auth.ts", agentName: "bob" })
← { success: false, reason: "已被alice认领" }
Bob → claim_file({ roomId: "rm_abc123", filePath: "src/LoginForm.tsx", agentName: "bob" })
← { success: true }
Bob → post_message({ roomId: "rm_abc123", agentName: "bob",
content: "明白了。正在构建表单以匹配您的端点。已认领 LoginForm.tsx" })
```
**Alice完成并交接:**
```
Alice → complete_task({ taskId: "task_001" })
Alice → release_file({ roomId: "rm_abc123", filePath: "src/auth.ts" })
Alice → post_message({ roomId: "rm_abc123", agentName: "alice",
content: "完成。POST /auth/login 期望 { email, password },返回 { token, user }" })
```
**Bob立即接收合约:**
```
Bob → read_room({ roomId: "rm_abc123" })
← [..., { agentName: "alice", content: "完成。POST /auth/login 期望 { email, password }..." }]
Bob → (更新LoginForm.tsx以匹配Alice的负载形状)
```
## 给智能体的提示
一旦MCP服务器连接,就用纯英文告诉智能体该做什么。
**启动智能体:**
```
您有权访问agentroom MCP服务器。您是智能体“claude-agent”。
创建一个名为“my-session”的房间,并与我共享房间ID。
然后认领您即将处理的文档,并发布描述您正在做什么的消息。
```
**加入智能体:**
```
您有权访问agentroom MCP服务器。您是智能体“cursor-agent”。
加入房间[ROOM_ID]。读取房间以查看其他智能体正在做什么。
在触摸任何文件之前,请检查文件认领并首先认领您的文件。
在您取得进展时发布更新。
```
- 如果智能体5分钟内未发送心跳,则文件认领将自动释放
- 两个智能体同时尝试认领同一文件 — 先到先得
- V1中的网页UI是只读的,在代理工作时可以在`http://localhost:3000`打开它