Stringwork
An MCP server for orchestrating AI coding agents. One driver (e.g. Cursor) directs multiple workers (Claude Code, Codex, Gemini CLI) through shared tasks, messaging, plans, and progress monitoring — all from a single Go binary.
安装
curl -fsSL https://raw.githubusercontent.com/jaakkos/stringwork/main/scripts/install.sh | sh支持macOS(arm64、amd64)和Linux(amd64、arm64)。通过 --version v0.1.0 对于特定的发布或 --dir /usr/local/bin 更改安装位置。
或者从源代码构建:
go build -o mcp-stringwork ./cmd/mcp-server运作原理
Stringwork使用 司机/工人 型号:
Driver (Cursor)
|
|-- creates tasks, monitors progress, cancels stuck workers
|
+-- Worker 1 (Claude Code) -- claims tasks, reports progress, sends findings
+-- Worker 2 (Codex) -- claims tasks, reports progress, sends findings
+-- Worker 3 (Gemini CLI) -- claims tasks, reports progress, sends findings
+-- Worker N (any agent) -- ...- 这 驾驶员 创建任务(使用
assigned_to='any'用于自动分配),通过以下方式监控员工worker_status,并取消卡住的代理cancel_agent. - 工人 当有待处理的工作时,服务器会自动生成。它们会声明任务,每2-3分钟报告一次进度,并通过消息将结果传达回来。
- 所有代理通过单个SQLite文件共享状态(
~/.config/stringwork/state.sqlite).
服务器仅提供协调工具。每个代理都使用自己的本地功能进行文件编辑、搜索、git和终端。
特性
- 驾驶员/工人协调 --一个驱动程序,N个具有自动生成、SLA监控和取消功能的工作人员
- 任务管理 --创建、分配、跟踪和自动通知任务生命周期事件
- 消息传递 --具有紧急性的代理间消息,在每次工具调用时附带通知
- 共享规划 --包含项目、验收标准和进度跟踪的协作计划
- 进度监控 --强制性心跳和进度报告;升级警报(3分钟警告,5分钟严重,10分钟自动恢复)
- 会话继续 --工作人员通过心跳报告CLI会话ID;重新启动的工作人员会自动恢复之前的CLI对话上下文
- 文件锁 --防止跨代理同时进行编辑
- Web仪表板 --任务、工作人员、消息和计划的实时视图(启动时记录的URL)
- 自动响应 --服务器在代理有未读消息时生成代理,不需要外部守护进程
- Git工作树隔离 --可选的每个工作人员签出,以防止文件冲突
- 动态工作空间 --在运行时通过以下方式切换项目
set_presence workspace='...' - 自定义代理 --通过以下方式将任何MCP客户端注册为参与者
register_agent - 宪法 --为每个worker添加分层、文件支持的提示;支持每用户规则、团队配置文件和
git-支持的共享规则包(请参见 docs/CONSTITUTION.md)
快速开始
1.配置光标
添加 .cursor/mcp.json 在您的项目中:
{
"mcpServers": {
"stringwork": {
"command": "mcp-stringwork",
"env": { "MCP_CONFIG": "/path/to/config.yaml" }
}
}
}游标通过stdio将服务器作为子进程生成。启用守护程序模式(推荐)后,第一个Cursor窗口将启动一个后台守护程序,后续窗口将自动共享它。
2.创建配置文件
复制 mcp/config.yaml 并可定制。最小示例:
workspace_root: "/path/to/your/project"
enabled_tools: ["*"]
# Daemon mode: multiple Cursor windows share one server.
daemon:
enabled: true
# Fixed port for a stable dashboard URL. Use 0 for auto-assign.
http_port: 8943
orchestration:
driver: cursor
workers:
- type: claude-code
instances: 1
command: ["claude", "-p", "You are claude-code. Steps: 1) set_presence 2) read_messages 3) list_tasks 4) Do the work 5) report_progress 6) send_message with findings.", "--dangerously-skip-permissions"]
timeout_seconds: 6003.开始工作
打开游标——服务器自动启动。创建任务时,工人会被生成:
# Driver (Cursor) creates a task
create_task title='Add auth middleware' assigned_to='any' created_by='cursor'
# Server spawns a worker, which claims and works on it
# Driver monitors via:
worker_status守护程序模式(推荐)
启用守护进程模式,以便多个Cursor窗口共享单个服务器进程:
daemon:
enabled: true
grace_period_seconds: 10第一个Cursor窗口启动后台守护进程。后续窗口作为轻量级代理连接到它。Workers、notifier和看门狗只运行一次,没有重复。HTTP端口和仪表板URL在重新连接时保持稳定。当最后一个窗口关闭时,守护进程会等待宽限期,然后关闭。
使用 --standalone 绕过守护进程模式。
多个游标窗口(无守护进程)
如果没有守护进程模式,每个Cursor窗口都会生成自己的服务器。随着 http_port: 0 (默认),每个端口都有一个自动分配的端口,这样它们就不会冲突。所有实例共享相同的SQLite状态文件,因此任务和消息在所有窗口中都是可见的。
配置
编排
orchestration:
driver: cursor # which agent is the driver
assignment_strategy: least_loaded # or capability_match
heartbeat_interval_seconds: 30
worker_timeout_seconds: 120
worktrees:
enabled: false # git worktree isolation per worker
workers:
- type: claude-code
instances: 2 # run up to 2 Claude Code workers
command: ["claude", "-p", "...", "--dangerously-skip-permissions"]
cooldown_seconds: 30
timeout_seconds: 600
max_retries: 2
env:
GH_TOKEN: "${GH_TOKEN}" # ${VAR} expands from server env
SSH_AUTH_SOCK: "${SSH_AUTH_SOCK}"
# inherit_env: ["HOME", "PATH", "GH_*", "SSH_*"] # restrict inherited env
- type: codex
instances: 1
command: ["codex", "exec", "--sandbox", "danger-full-access", "--skip-git-repo-check", "..."]
- type: gemini
instances: 1
command: ["gemini", "--yolo", "--prompt", "..."]
env:
GOOGLE_API_KEY: "${GOOGLE_API_KEY}"看 mcp/config.yaml 对于一个完全注释的示例。
可用工具(23)
会话
| 工具 | 说明 |
|---|---|
get_session_context | 完整的会话上下文(消息、任务、状态、计划) |
set_presence | 更新状态和工作空间;动态更改服务器的项目上下文 |
append_session_note | 添加共享笔记或决定 |
沟通
| 工具 | 说明 |
|---|---|
send_message | 向代理发送消息(可选标题、紧急程度) |
read_messages | 读取消息并将其标记为已读 |
任务
| 工具 | 说明 |
|---|---|
create_task | 使用可选的工作上下文(相关文件、背景、约束)创建任务 |
list_tasks | 使用筛选器列出任务 |
update_task | 更新状态、分配、优先级;完成时自动通知 |
规划
| 工具 | 说明 |
|---|---|
create_plan | 创建共享计划 |
get_plan | 查看平面图;省略ID以列出所有 |
update_plan | 添加或更新具有验收标准的计划项 |
工作流程
| 工具 | 说明 |
|---|---|
handoff | 移交工作,包括总结和下一步行动 |
claim_next | 声明下一个任务(dry_run查看) |
request_review | 向代理请求代码审查 |
编排(司机/工人)
| 工具 | 说明 |
|---|---|
worker_status | 工作人员实时视图:进度、SLA状态、流程活动 |
heartbeat | 每60-90秒发出一次信号,显示进度信息。包含 session_id 在重新启动时首次呼叫会话恢复 |
report_progress | 结构化进度:描述、完成百分比、预计到达时间 |
cancel_agent | 取消工人的任务,发送STOP信号,终止进程 |
get_work_context | 获取任务上下文(文件、背景、约束、注释) |
update_work_context | 将共享笔记添加到任务的工作上下文中 |
基础设施
| 工具 | 说明 |
|---|---|
lock_file | 锁定、解锁、检查或列出文件锁 |
register_agent | 注册自定义代理以进行协作 |
list_agents | 列出所有可用的代理(内置和注册) |
克劳德代码挂钩
克劳德代码 CLAUDE.md 指令被包裹在“可能相关也可能不相关”的框架中,削弱了合规性。绕过此限制的架线船吊钩:
./scripts/install-claude-hooks.sh # install hooks
./scripts/uninstall-claude-hooks.sh # clean removal挂钩安装在用户级别(~/.claude/settings.json)所以他们在所有项目中工作。它们将进度报告规则作为干净的系统提醒消息注入——没有免责声明,在上下文压缩后仍然有效。脚本有一个保护,在非Stringwork项目中什么也不做。
看 Claude代码配置 了解详情。
命令行界面
mcp-stringwork # start server (auto-detects daemon/proxy/standalone)
mcp-stringwork --daemon # force daemon mode
mcp-stringwork --standalone # force standalone mode (no daemon)
mcp-stringwork --version # print version
mcp-stringwork status claude-code # check unread/pending counts for an agent
mcp-stringwork constitution init # scaffold the per-user constitution dir
mcp-stringwork constitution show # preview the resolved constitution preamble
mcp-stringwork constitution sync # pull every configured 'git' constitution source
mcp-stringwork constitution doctor # validate every configured constitution source运营
当员工池卡住时(僵尸员工、过时的存在行、膨胀 AgentInstance 计数),使用 admin 子命令而不是编辑 state.sqlite 用手。它们直接在SQLite存储上运行,因此可以工作 守护进程是否正在运行。
# Inspect pool: total/active/offline counts, oldest stale rows, in-flight tasks.
mcp-stringwork admin pool-status
# Garbage-collect both presence and instance rows using policy defaults.
mcp-stringwork admin prune
# Preview what `admin prune` would remove without writing.
mcp-stringwork admin prune --dry-run
# Just presence rows, with an explicit retention window.
mcp-stringwork admin prune --presence --older-than 3d
# Aggressively clean up task-bound worker rows (e.g. after a server crash
# left zombies behind) without touching the static pool.
mcp-stringwork admin prune --instances --task-bound-older-than 1h作为看门狗的一部分,相同的修剪在守护进程内持续运行 环路;CLI存在,因此您不需要它运行来从错误中恢复 国家。违约来自 config.yaml (presence_retention_days, instance_retention_days, task_bound_instance_retention_hours).
仪表板操作
web仪表板上提供了相同的管理操作 (http://localhost:/)所以,当一个 工人行为不端。每个POST都是JSON;CORS是允许的,所以你也可以 直接从 curl/fetch.
| 方法 | 路径 | 目的 |
|---|---|---|
POST | /api/cancel-agent | 取消卡住的工人。主体: {agent, cancelled_by, reason}。如果满足以下条件,则返回合成恢复消息 cancel_agent 发射了一个。 |
POST | /api/prune | 包装材料 admin prune.车身: {presence?, instances?, older_than?, task_bound_older_than?, dry_run?}默认为模拟运行;翻转 dry_run:false 承诺。 |
GET | /api/pool-status | 有效载荷与 mcp-stringwork admin pool-status 呈现为JSON格式。 |
POST | /api/send-message | 驾驶员专用逃生舱。主体: {from, to, content} — from 必须等于配置的驱动程序,以防止UI端工作程序模拟。 |
仪表板以每个工人的身份显示这些信息 Cancel… 菜单,a Prune… 模态在 工具栏,自动轮询 Pool status 面板,以及a Send Message 形成 信息卡。
项目结构
.
├── cmd/mcp-server/ # Server entrypoint, daemon, proxy, CLI
├── internal/
│ ├── domain/ # Core entities (Message, Task, Plan, AgentInstance, ...)
│ ├── app/ # Application services (CollabService, WorkerManager, Watchdog, Orchestrator)
│ ├── repository/sqlite/ # State persistence (SQLite)
│ ├── policy/ # Workspace validation, config, safety policy
│ ├── dashboard/ # Web dashboard (HTML + REST API)
│ ├── worktree/ # Git worktree manager for worker isolation
│ └── tools/collab/ # 23 MCP tool handlers
├── chrome-extension/ # Chrome extension for toolbar monitoring (alpha)
├── cursor-plugin/ # Cursor IDE plugin (rules, skills, agents, commands, hooks)
├── mcp/ # Configuration files
├── scripts/ # Install, dev-install, hook install/uninstall scripts
├── docs/ # Documentation
├── .github/workflows/ # CI and release automation
├── AGENTS.md # Cursor agent instructions
└── CLAUDE.md # Claude Code agent instructions光标插件
架线作业船a 光标插件 为驱动程序角色提供工作流规则、技能、代理和命令。插件结构位于 游标插件/ 并准备好 市场提交 到时候。
从Git安装
- 安装二进制文件 (必填):
curl -fsSL https://raw.githubusercontent.com/jaakkos/stringwork/main/scripts/install.sh | sh- 添加MCP服务器 到游标--单击深度链接或手动添加:
或添加到您的项目 .cursor/mcp.json:
{
"mcpServers": {
"stringwork": {
"command": "mcp-stringwork"
}
}
}- 安装插件 (规则、技能、代理、命令)——全球适用于所有项目:
git clone https://github.com/jaakkos/stringwork.git /tmp/stringwork
/tmp/stringwork/scripts/install-cursor-plugin.sh要卸载,请执行以下操作: ./scripts/uninstall-cursor-plugin.sh
对于项目范围的安装而不是全局安装,请将插件目录复制到您的项目中:
cp -r /tmp/stringwork/.cursor-plugin /tmp/stringwork/cursor-plugin your-project/- 配置编排 (可选——适用于产卵工蚁):
mkdir -p ~/.config/stringwork
cp /tmp/stringwork/mcp/config.yaml ~/.config/stringwork/config.yaml
# Edit workers section, then start with: MCP_CONFIG=~/.config/stringwork/config.yaml插件提供了什么
| 组件 | 描述 |
|---|---|
| MCP服务器 | 自动配置 mcp-stringwork 连接 |
| 规则 (4) | 驾驶员工作流程、进度报告、停止信号、工人沟通 |
| 技能 (4) | 设置指南、代码审查、任务创建、worker配置 |
| 代理 (2) | 结对编程驱动程序、代码审查协调员 |
| 命令 (1) | /pair-respond 用于处理工作人员消息 |
| 钩子 (1) | 会话启动时的二进制存在检查 |
该插件纯粹是可添加的,它不会修改任何现有的项目文件。
Chrome扩展程序(alpha)
一个浏览器扩展,将Stringwork监控带到您的工具栏上——查看工作状态、任务进度,并在不切换到仪表板的情况下接收桌面通知。
它的作用:
- 徽章计数器 工具栏图标上显示需要注意的项目(被阻止的任务、脱机工作人员、SLA违规、未读消息)
- 弹出式仪表板 具有实时工作人员状态、带进度条的活动任务和最近的消息——打开时每5秒轮询一次
- 桌面提醒 当工作人员脱机时,任务会被阻止,超出SLA,或进度停滞
- 快捷操作 --重启workers(确认后)并跳转到完整的仪表板
架构: 该扩展基于Manifest V3构建,具有一个轮询的服务工作器 /api/state.所有API访问都集中在服务工作者中;弹出窗口使用 chrome.runtime.connect 对于实时状态推送(在端口打开时,服务工作者在每次轮询时推送一个新的快照),并回退到一个快照 chrome.runtime.sendMessage 电话(getState, restartWorkers, openDashboard, settingsUpdated)对于其他一切。国家坚持 chrome.storage.local 以在MV3服务工作者终止后存活。后台轮询使用 chrome.alarms (最少1分钟);以5秒为间隔的主动轮询仅在弹出窗口打开时运行。
破坏性操作(取消worker、修剪状态、作为驱动程序发送消息)存在于 网络仪表盘,而不是扩展名——请参阅 仪表板操作。该扩展故意是一个被动监视器。
安装(解压缩,开发人员模式):
- 在配置中设置一个固定的HTTP端口(必需--重新启动时自动分配的端口会更改):
# ~/.config/stringwork/config.yaml
http_port: 8943- 在Chrome中加载扩展程序:
- 导航至 chrome://extensions/ - 启用 开发者模式 (在右上角切换) - 点击 加载未打包的 并选择 chrome-extension/ 此仓库中的目录
- 单击工具栏中的Stringwork图标。如果需要,在扩展选项中配置服务器URL(默认值:
http://localhost:8943).
注: 这是阿尔法软件。该扩展程序功能正常,但尚未发布到Chrome网上应用商店。在拉取代码更改后,从以下位置重新加载扩展 chrome://extensions/ 把它们捡起来。