面向开发者
让你的代理接入与计划相同的图谱
Project Orchestrator 把应用的全部功能以 MCP 工具、REST API 和两路 WebSocket 数据流的形式开放出来。一个 Rust 服务器把代码、计划、决策和笔记保存在 Neo4j 图谱和 Meilisearch 中。
- 个 MCP 工具
- 31
- 个 MCP 工具
- 个操作(action)
- 402
- 个操作(action)
- 种解析的语言
- 17
- 种解析的语言
- 路 WebSocket 数据流
- 3
- 路 WebSocket 数据流
想找产品本身?回到首页。
project(action: "sync", slug: "my-app")
code(
action: "analyze_impact",
target: "src/session.rs",
project_slug: "my-app"
)
plan(action: "run", plan_id: "<uuid>")连接
把 PO 接入 MCP 客户端
桌面应用或服务器必须在运行。之后,一条命令就能把 PO 注册到 Claude Code;其他任何 MCP 客户端,则需要手动添加配置。
安装并启动服务器
服务器需要 Neo4j 和 Meilisearch,NATS 是可选的。仓库里提供了涵盖这三者的 docker-compose.yml。
orchestrator serve
# needs Neo4j and Meilisearch: docker compose up -dbrew install this-rs/tap/project-orchestratororchestrator serve --port 8080在 Claude Code 中注册 PO
这条命令以 stdio 模式写入 MCP 配置,包含这台服务器的 URL 和它的认证密钥,并预先批准这些工具。
orchestrator setup-claude
orchestrator setup-claude --port 8080setup-claude 还会把 mcp__project-orchestrator__* 加入 ~/.claude/settings.json 的允许工具,因此 Claude Code 不会在每次调用前都询问。
检查是否正常
在 Claude Code 中运行 /mcp:列表里应该有 project-orchestrator。然后让它列出项目:Claude 会调用 project(action: "list")。
Claude Code
# in Claude Code/mcp# then ask: "List all registered projects"# Claude calls: project(action: "list")任何 MCP 客户端,stdio
mcp_server 是一个轻量代理:它在 stdio 上使用 MCP,并把每个调用转发给 REST API,自己从不连接 Neo4j。设置 PO_AUTH_TOKEN,或设置 PO_JWT_SECRET 让它在启动时生成令牌。
~/.claude/mcp.json
{ "mcpServers": { "project-orchestrator": { "command": "/path/to/mcp_server", "env": { "PO_SERVER_URL": "http://127.0.0.1:8080", "PO_AUTH_TOKEN": "<jwt-session-token>" } } }}远程客户端,Streamable HTTP
服务器也在 POST /mcp 上响应 MCP,认证方式与 REST API 相同。会话 id 通过 Mcp-Session-Id 头返回,并且必须在每个请求中原样带回。
Claude Code
claude mcp add --transport http project-orchestrator http://127.0.0.1:8080/mcp \ --header "Authorization: Bearer <token>"HTTP
POST /mcpAuthorization: Bearer <token>Content-Type: application/json{"jsonrpc":"2.0","id":1,"method":"tools/list"}MCP 工具
31 个工具,同一种调用形式
每个工具都接收一个 action 参数,并分发到某一项操作。按工具、操作或参数搜索,然后复制准确的调用。
31 个工具
plan
Plans with dependency graph, waves, critical path, and the autonomous runner.
规划与交付 27 操作
调用示例
plan( action: "create", title: "Migrate session store to Redis", priority: 8)操作
另有 21 个
参数
plan_idproject_idtitledescriptionpriorityconstraintsstatussearchlimitoffsetsort_bysort_orderpriority_minpriority_maxcwdproject_slugtrigger_idtrigger_typeconfigcooldown_secsrun_idrun_idstask_idparent_session_idcustom_sections
<uuid> 这样的参数值只是占位符。操作名和参数名读取自服务器源码。
架构
一个 Rust 服务器,三个存储,任意客户端
客户端从不直接访问数据库,而是与服务器通信。服务器负责解析代码、提供 API 和推送事件。
MCP clients
Claude Code、Cursor 或任何 MCP 客户端。它们通过 stdio 与 mcp_server 通信,或通过 HTTP 访问 POST /mcp。
Desktop app
Tauri 2 应用内置界面并启动服务器,通过 Docker 管理 Neo4j 和 Meilisearch 容器。
WebSocket clients
任何打开 /ws/chat/{session_id}、/ws/events 或 /ws/run/{run_id} 的程序。
mcp_server
二进制程序 mcp_server:输入是 stdio 上的 MCP,输出是 REST 调用,不保存任何状态。
orchestrator
orchestrator 二进制程序(axum):REST API、聊天管理器、计划执行器、tree-sitter 解析器、事件总线。
Neo4j
图谱:代码、计划、任务、决策、笔记、技能、流程、聊天会话。
Meilisearch
针对代码、笔记、决策和聊天消息的全文搜索。
NATS可选
在多个服务器实例之间同步事件并转发聊天。没有它,服务器只在本地运行。
Claude
聊天管理器通过 nexus-claude SDK 驱动 Claude。
它们如何通信
- MCP clients / mcp_serverstdio
- MCP clients / orchestratorHTTP /mcp
- mcp_server / orchestratorREST
- Desktop app / orchestratorREST + WebSocket
- WebSocket clients / orchestratorWebSocket
- orchestrator / Neo4jbolt
- orchestrator / MeilisearchHTTP
- orchestrator / NATSNATS
- orchestrator / ClaudeSDK
代码解析
17 种语言,用 tree-sitter 解析
每个文件都会被解析为函数、结构体、trait、枚举、导入、impl 块和调用关系,然后存入图谱。
17 种语言
Rust
扩展名: .rs
tree-sitter-rust
TypeScript / JavaScript
扩展名: .ts .tsx .js .jsx .mjs .cjs
tree-sitter-typescript
Python
扩展名: .py .pyi
tree-sitter-python
Go
扩展名: .go
tree-sitter-go
Java
扩展名: .java
tree-sitter-java
C
扩展名: .c .h
tree-sitter-c
C++
扩展名: .cpp .cc .cxx .hpp .hxx .hh
tree-sitter-cpp
Ruby
扩展名: .rb .rake .gemspec
tree-sitter-ruby
PHP
扩展名: .php .phtml .php5 .php7
tree-sitter-php
Kotlin
扩展名: .kt .kts
tree-sitter-kotlin-ng
Swift
扩展名: .swift
tree-sitter-swift
Bash
扩展名: .sh .bash .zsh
tree-sitter-bash
C#
扩展名: .cs
tree-sitter-c-sharp
Scala
扩展名: .scala .sc
tree-sitter-scala
Zig
扩展名: .zig
tree-sitter-zig
HCL (Terraform)
扩展名: .tf .tfvars
tree-sitter-hcl
Dart
扩展名: .dart
tree-sitter-dart
每个文件提取:函数、结构体、trait、枚举、导入、impl 块,以及带置信度分数的函数调用。
JavaScript 文件(.js、.jsx、.mjs、.cjs)使用 TypeScript 语法解析。
API 与事件
状态用 REST,变化用 WebSocket
计划、代码、笔记等都是基于 HTTP 的普通 JSON。变化则通过 WebSocket 推送。
主要的 REST 端点
大多数路由都位于认证中间件之后。没有配置认证时,API 是开放的。
| GET | /health | Liveness |
| GET | /api/version | Server version |
| GET | /api/projects | List projects (POST creates) |
| POST | /api/projects/{slug}/sync | Parse a project into the graph |
| GET | /api/plans/{plan_id}/waves | Parallel waves of a plan |
| POST | /api/plans/{plan_id}/run | Start the runner on a plan |
| GET | /api/code/search | Search code |
| GET | /api/code/impact | Impact analysis |
| GET | /api/notes/search | Search notes |
| GET | /api/decisions/search | Search decisions |
| POST | /api/reason | Reasoning over the graph |
| POST | /mcp | MCP over Streamable HTTP |
WebSocket 数据流
/ws/events
每一次创建、更新、删除、关联、取消关联和状态变化,都以一个 JSON 事件推送。可用 entity_types、project_id 和 layers 查询参数进行筛选。
/ws/chat/{session_id}
与 Claude 的对话。发送 user_message、interrupt、permission_response 和 input_response;接收聊天事件,重新连接后会从 last_event 开始重放。
/ws/run/{run_id}
一次计划运行的单一数据流:执行器事件(任务开始、批次开始……),加上每个子会话的聊天事件。
浏览器通过 cookie 认证,或者使用来自 POST /auth/ws-ticket 的一次性票据,并作为 ticket 参数传入。
一条 /ws/events 消息
/ws/events?entity_types=plan,task&project_id=<uuid>
{ "entity_type": "task", "action": "status_changed", "entity_id": "<uuid>", "payload": { "old_status": "pending", "new_status": "in_progress" }, "timestamp": "2026-10-05T10:00:00Z", "project_id": "<uuid>"}扩展
让 PO 属于你的三种方式
这三种方式都可以通过同样的 MCP 工具使用。
流程
用状态和转换定义一个有限状态机,启动一次运行,再让代理通过 protocol 工具推进它。
技能
技能是随使用而浮现的笔记和代码聚类;skill 工具可以激活它们,并在项目和实例之间导出、导入。
MCP 联合
mcp_federation 通过 stdio、sse 或 streamable_http 连接外部 MCP 服务器,使它们的工具能通过 PO 访问。