Serveur MCP

Catnip fournit un serveur MCP (Model Context Protocol) qui expose le pipeline du langage -- parsing, inspection, évaluation, debugging -- via un protocole structuré consommable par des agents.

Le serveur est implémenté en Rust pur (catnip_mcp/), utilise PurePipeline (pas de runtime Python) et communique via stdio. SDK : rmcp.

Intégration agent

Le MCP permet à un agent de :

  • parser du code à plusieurs niveaux, du tree-sitter brut (niveau 0) jusqu'à l'IR exécutable post-analyse sémantique (niveau 2) ;
  • inspecter les représentations internes : AST, IR, opcodes, variables en scope ;
  • piloter une session de debug avec breakpoints, stepping (into/over/out) et inspection de l'état ;
  • évaluer des expressions dans le contexte courant d'une pause.

Tous les échanges passent par des appels MCP structurés (JSON in, JSON out), sans état implicite côté agent. Le serveur spawne un thread VM par session de debug et communique via canaux mpsc -- l'agent n'a pas à gérer de concurrence.

Installation

{
  "mcpServers": {
    "catnip": {
      "command": "/path/to/catnip/.venv/bin/catnip-mcp"
    }
  }
}

Build : make install-bins ou cargo build --release -p catnip_mcp.

Tools

parse_catnip

Parse du code Catnip et retourne la représentation structurée.

Paramètre Type Défaut Description
code string requis Code source Catnip
level integer (0-2) 1 Niveau de parsing

Niveaux de parsing :

  • 0 : Parse tree brut (sortie texte tree-sitter)
  • 1 : IR après transformation (JSON structuré)
  • 2 : IR exécutable après analyse sémantique (JSON structuré)
{"ir": ["…"], "level": 1}
{"parse_tree": "…", "level": 0}

eval_catnip

Evalue du code et retourne le résultat.

Paramètre Type Défaut Description
code string requis Code source
context object {} Variables initiales (JSON, supporte nesting)
{"result_repr": "42", "result_type": "int", "result_json": 42}

check_syntax

Valide la syntaxe sans exécuter.

Paramètre Type Défaut Description
code string requis Code source
{"valid": true, "message": "Syntax is valid"}
{"valid": false, "error": "…"}

format_code

Formate du code avec style configurable.

Paramètre Type Défaut Description
code string requis Code source
indent_size integer 4 Taille d'indentation
line_length integer 120 Longueur max de ligne
{"formatted_code": "…"}

Tools de debug

Le debugger MCP fonctionne en sessions. L'agent ouvre une session, reçoit un session_id, puis pilote l'exécution via ce handle.

Flux typique

debug_start(code, breakpoints=[5, 12])
  → status: "paused", line: 5, locals: {…}

debug_inspect(session_id)
  → locals: {x: "42", items: "[1, 2, 3]"}

debug_step(session_id, mode="over")
  → status: "paused", line: 6, locals: {…}

debug_eval(session_id, expr="x + 1")
  → result: "43"

debug_continue(session_id)
  → status: "paused", line: 12, locals: {…}

debug_continue(session_id)
  → status: "finished", result: "done"

debug_start

Démarre une session de debug. Retourne l'état à la première pause ou à la fin de l'exécution.

Paramètre Type Défaut Description
code string requis Code source
breakpoints array[int] [] Lignes de breakpoint (1-indexed)

debug_continue

Continue l'exécution jusqu'au prochain breakpoint ou la fin.

Paramètre Type Défaut Description
session_id string requis ID de session

debug_step

Avance d'un pas dans l'exécution.

Paramètre Type Défaut Description
session_id string requis ID de session
mode "into" | "over" | "out" "into" Mode de stepping

debug_inspect

Inspecte les variables locales au point de pause courant. N'avance pas l'exécution.

Paramètre Type Défaut Description
session_id string requis ID de session

debug_eval

Evalue une expression dans le scope de la pause courante. L'évaluation se fait dans un contexte isolé : les effets de bord ne se propagent pas à la session.

Paramètre Type Défaut Description
session_id string requis ID de session
expr string requis Expression à évaluer

debug_breakpoint

Ajoute ou retire un breakpoint pendant l'exécution.

Paramètre Type Défaut Description
session_id string requis ID de session
line integer requis Numéro de ligne (1-indexed)
action "add" | "remove" "add" Action

Réponses debug

Toutes les commandes qui avancent l'exécution (debug_start, debug_continue, debug_step) retournent un payload uniforme :

Pause :

{"session_id": "dbg-1", "status": "paused", "line": 5, "col": 0, "locals": {"x": "42"}, "snippet": "x = x + 1"}

Fin :

{"session_id": "dbg-1", "status": "finished", "result": "done"}

Erreur :

{"session_id": "dbg-1", "status": "error", "error": "NameError: 'y' is not defined"}

Timeout (10s sans événement) :

{"session_id": "dbg-1", "status": "timeout"}
La session est nettoyée automatiquement à la fin de l'exécution ou en cas d'erreur. Un timeout ne détruit pas la session
l'agent peut réessayer.

Ressources

Les ressources exposent de la documentation et des exemples en lecture seule.

URI Type Description
catnip://examples/{topic} JSON Exemples par thème (basics, functions, broadcast, cfg, …)
catnip://codex/{category}/{module} text Exemples d'intégration Python (web, data-analytics, …)
catnip://docs/{section} JSON Liste des topics disponibles dans une section
catnip://docs/{section}/{topic} markdown Page de documentation (sections : lang, tuto, user)

La documentation est servie directement depuis les fichiers docs/. Ce serveur ne génère rien, il transmet. Un proxy sans opinion