Aller au contenu

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 8080

Enregistrer 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 8080

setup-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/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

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.