跳到正文

面向开发者

让你的代理接入与计划相同的图谱

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 8080

setup-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/healthLiveness
GET/api/versionServer version
GET/api/projectsList projects (POST creates)
POST/api/projects/{slug}/syncParse a project into the graph
GET/api/plans/{plan_id}/wavesParallel waves of a plan
POST/api/plans/{plan_id}/runStart the runner on a plan
GET/api/code/searchSearch code
GET/api/code/impactImpact analysis
GET/api/notes/searchSearch notes
GET/api/decisions/searchSearch decisions
POST/api/reasonReasoning over the graph
POST/mcpMCP 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 访问。