Pour les développeurs
Branche tes agents sur le même graphe que tes plans
Project Orchestrator expose tout ce que fait l’app sous forme d’outils MCP, d’une API REST et de deux flux WebSocket. Un serveur Rust garde le code, les plans, les décisions et les notes dans un graphe Neo4j et dans Meilisearch.
- outils MCP
- 31
- outils MCP
- actions au total
- 402
- actions au total
- langages analysés
- 17
- langages analysés
- flux WebSocket
- 3
- flux WebSocket
Tu cherches le produit lui-même ? Retourne à la page d’accueil.
project(action: "sync", slug: "my-app")
code(
action: "analyze_impact",
target: "src/session.rs",
project_slug: "my-app"
)
plan(action: "run", plan_id: "<uuid>")Connexion
Branche PO sur un client MCP
L’app de bureau ou le serveur doit tourner. Ensuite, une commande enregistre PO dans Claude Code, ou tu ajoutes l’entrée à la main pour tout autre client MCP.
Installer et démarrer le serveur
Le serveur a besoin de Neo4j et de Meilisearch. NATS est optionnel. Le dépôt fournit un docker-compose.yml pour les trois.
orchestrator serve
# needs Neo4j and Meilisearch: docker compose up -dbrew install this-rs/tap/project-orchestratororchestrator serve --port 8080Enregistrer PO dans Claude Code
Cette commande écrit l’entrée MCP en mode stdio, avec l’URL de ce serveur et son secret d’authentification, et pré-approuve les outils.
orchestrator setup-claude
orchestrator setup-claude --port 8080setup-claude ajoute aussi mcp__project-orchestrator__* aux outils autorisés de ~/.claude/settings.json, pour que Claude Code ne demande pas confirmation à chaque appel.
Vérifier que ça marche
Dans Claude Code, lance /mcp : project-orchestrator doit apparaître dans la liste. Demande ensuite la liste des projets : Claude appelle project(action: "list").
Claude Code
# in Claude Code/mcp# then ask: "List all registered projects"# Claude calls: project(action: "list")Tout client MCP, en stdio
mcp_server est un proxy léger : il parle MCP sur stdio et transmet chaque appel à l’API REST. Il ne se connecte jamais lui-même à Neo4j. Définis PO_AUTH_TOKEN, ou PO_JWT_SECRET pour qu’il génère un jeton au démarrage.
~/.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>" } } }}Clients distants, Streamable HTTP
Le serveur répond aussi en MCP sur POST /mcp, derrière la même authentification que l’API REST. Un identifiant de session est renvoyé dans l’en-tête Mcp-Session-Id et doit être renvoyé à chaque requête.
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"}Outils MCP
31 outils, une seule forme d’appel
Chaque outil prend un paramètre action et l’aiguille vers une opération. Cherche par outil, action ou paramètre, puis copie l’appel exact.
31 outils
plan
Plans with dependency graph, waves, critical path, and the autonomous runner.
Planification et livraison 27 actions
Exemple d’appel
plan( action: "create", title: "Migrate session store to Redis", priority: 8)Actions
+21 autres
Paramètres
plan_idproject_idtitledescriptionpriorityconstraintsstatussearchlimitoffsetsort_bysort_orderpriority_minpriority_maxcwdproject_slugtrigger_idtrigger_typeconfigcooldown_secsrun_idrun_idstask_idparent_session_idcustom_sections
Les valeurs d’arguments comme <uuid> sont des espaces réservés. Les noms d’actions et de paramètres sont lus dans le code source du serveur.
Architecture
Un serveur Rust, trois stockages, n’importe quel client
Les clients ne touchent jamais aux bases de données. Ils parlent au serveur, qui analyse le code, sert l’API et diffuse les événements.
MCP clients
Claude Code, Cursor ou tout client MCP. Ils parlent MCP à mcp_server en stdio, ou à POST /mcp en HTTP.
Desktop app
L’app Tauri 2 embarque l’interface et démarre le serveur. Elle gère les conteneurs Neo4j et Meilisearch via Docker.
WebSocket clients
Tout ce qui ouvre /ws/chat/{session_id}, /ws/events ou /ws/run/{run_id}.
mcp_server
Binaire mcp_server : MCP sur stdio en entrée, appels REST en sortie. Ne garde aucun état.
orchestrator
Le binaire orchestrator (axum). API REST, gestionnaire de chat, exécuteur de plans, parseur tree-sitter, bus d’événements.
Neo4j
Le graphe : code, plans, tâches, décisions, notes, skills, protocoles, sessions de chat.
Meilisearch
Recherche plein texte sur le code, les notes, les décisions et les messages de chat.
NATSoptionnel
Synchronise les événements et relaie le chat entre plusieurs instances du serveur. Sans lui, le serveur fonctionne en local uniquement.
Claude
Le gestionnaire de chat pilote Claude via le SDK nexus-claude.
Comment ils communiquent
- 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
Analyse du code
17 langages, analysés avec tree-sitter
Chaque fichier est analysé en fonctions, structs, traits, enums, imports, blocs impl et arêtes d’appel, puis stocké dans le graphe.
17 langages
Rust
Extensions: .rs
tree-sitter-rust
TypeScript / JavaScript
Extensions: .ts .tsx .js .jsx .mjs .cjs
tree-sitter-typescript
Python
Extensions: .py .pyi
tree-sitter-python
Go
Extensions: .go
tree-sitter-go
Java
Extensions: .java
tree-sitter-java
C
Extensions: .c .h
tree-sitter-c
C++
Extensions: .cpp .cc .cxx .hpp .hxx .hh
tree-sitter-cpp
Ruby
Extensions: .rb .rake .gemspec
tree-sitter-ruby
PHP
Extensions: .php .phtml .php5 .php7
tree-sitter-php
Kotlin
Extensions: .kt .kts
tree-sitter-kotlin-ng
Swift
Extensions: .swift
tree-sitter-swift
Bash
Extensions: .sh .bash .zsh
tree-sitter-bash
C#
Extensions: .cs
tree-sitter-c-sharp
Scala
Extensions: .scala .sc
tree-sitter-scala
Zig
Extensions: .zig
tree-sitter-zig
HCL (Terraform)
Extensions: .tf .tfvars
tree-sitter-hcl
Dart
Extensions: .dart
tree-sitter-dart
Par fichier : fonctions, structs, traits, enums, imports, blocs impl, appels de fonctions avec un score de confiance.
Les fichiers JavaScript (.js, .jsx, .mjs, .cjs) sont lus avec la grammaire TypeScript.
API et événements
REST pour l’état, WebSocket pour les changements
Plans, code, notes et le reste passent en JSON simple sur HTTP. Les changements sont poussés sur des WebSocket.
Principaux endpoints REST
La plupart des routes sont derrière le middleware d’authentification. Quand aucune section d’authentification n’est configurée, l’API est ouverte.
| 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 |
Flux WebSocket
/ws/events
Chaque création, mise à jour, suppression, liaison, déliaison et changement de statut, sous forme d’un événement JSON. Filtre avec les paramètres de requête entity_types, project_id et layers.
/ws/chat/{session_id}
Conversation avec Claude. Envoie user_message, interrupt, permission_response et input_response ; reçois les événements de chat, rejoués depuis last_event après une reconnexion.
/ws/run/{run_id}
Un seul flux pour l’exécution d’un plan : les événements de l’exécuteur (tâche démarrée, vague démarrée...) plus les événements de chat de chaque session enfant.
Les navigateurs s’authentifient avec un cookie, ou avec un ticket à usage unique obtenu via POST /auth/ws-ticket et passé dans le paramètre ticket.
Un message /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>"}Étendre
Trois façons de faire de PO ton outil
Les trois sont accessibles par les mêmes outils MCP.
Protocoles
Définis une machine à états finis avec ses états et ses transitions, lance une exécution, et laisse les agents la faire avancer avec l’outil protocol.
Skills
Les skills sont des groupes de notes et de code qui émergent à l’usage ; l’outil skill les active, les exporte et les importe entre projets et instances.
Fédération MCP
mcp_federation connecte des serveurs MCP externes en stdio, sse ou streamable_http, pour que leurs outils soient accessibles via PO.