Le serveur MCP ank
Chaque verbe de la CLI comme un outil, pour un client qui n'a pas de shell. Une ligne suffit pour l'ajouter à Claude Code :
claude mcp add ank -- ank mcp --repo /path/to/your/repo
Ce qu'est ank mcp
ank mcp est un verbe de l'unique exécutable que pose chaque méthode d'installation. Pas de second fichier à récupérer : ce que la CLI dispatche est ce que le serveur sert, parce que c'est le même binaire.
Il parle JSON-RPC sur stdio, et c'est le client qui le lance. On ne le démarre donc pas, on le configure : une commande, ses arguments, et le dépôt pour lequel il parle.
Configurer un client
L'entrée est le même JSON dans les trois clients. Seul le fichier où elle va change.
{
"mcpServers": {
"ank": {
"command": "ank",
"args": ["mcp", "--repo", "/path/to/your/repo"]
}
}
}Où la mettre
- Claude Code
.mcp.jsonà la racine du dépôt, la forme qui voyage avec le tree et atteint tous ceux qui le clonent. Ou la ligneclaude mcp addci-dessus, qui écrit l'entrée pour vous.- Claude Desktop
claude_desktop_config.json, dans~/Library/Application Support/Claude/sur macOS et%APPDATA%\Claude\sur Windows.- Cursor
.cursor/mcp.jsonà côté du dépôt, ou~/.cursor/mcp.jsonpour tous les projets à la fois.
La commande est ank, et mcp son premier argument
Jusqu'à la 0.6.0, les releases installaient un second exécutable nommé ank-mcp. Plus aucune méthode ne le pose : une configuration qui le nomme encore obtient command not found. C'est la seule ligne à changer.
Toujours écrire --repo
Un client lance le serveur dans le répertoire où il se trouve, et sans --repo le serveur prend ce répertoire. L'échec n'est pas une erreur : c'est un processus qui parle tranquillement pour un corpus que personne n'a voulu, ou pour aucun. Un chemin sans .ank/ est refusé au démarrage, là où une personne le voit.
ank mcp --repo /tmp
error[1]: no .ank/ found from /tmp
-> ank init
Chaque verbe, un outil chacun
Les outils sont générés depuis la table même que le binaire dispatche et que décrit ank help --json. Pas un sous-ensemble choisi : les deux surfaces ne peuvent pas être en désaccord sur ce qui existe.
ank_contextank_claimank_showank_logank_doneank_releaseank_newank_reviewank_acceptank_readank_closeank_amendank_attestank_findank_statusank_graphank_scopeank_tuiank_mcpank_watchank_editank_checkank_migrateank_archiveank_configank_initank_skillsank_updateank_help
Nommés ank_<verb>
Un
contexttout court entrerait en collision avec tous les autres serveurs chargés par le client. Le résumé devient la description, les flags deviennent le schéma d'entrée, et les arguments positionnels arrivent dansarguments, un tableau de chaînes.La réponse de la CLI, code de sortie compris
Un appel renvoie le document que renvoie
--json, avecexitCodeà côté. Un refus est le refus de la CLI, indice compris, renvoyé comme résultat avecisError. Une erreur JSON-RPC signifie que la requête était fausse ;isErrorsignifie que le corpus a dit non.Aucun claim que la CLI ne prendrait pas
Chaque claim atterrit dans
refs/ank/claims/du dépôt concerné, sous le même compare-and-swap. Le serveur ne détient rien pour le compte d'un client et écrit en tant queank-mcp/<version>, sauf siANK_AGENTnomme une identité.
--> {"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"ank_show","arguments":{"arguments":["TASK-9999"]}}}
<-- {"jsonrpc":"2.0","id":2,"result":{"content":[{"type":"text","text":"error[2]: entity not found: TASK-9999\n -> ank find TASK-9999"}],"isError":true,"exitCode":2,"stderr":"error[2]: entity not found: TASK-9999\n -> ank find TASK-9999"}}
Plusieurs dépôts, un seul serveur
Chaque outil accepte un argument optionnel corpus : le commit racine que ank status --json affiche sous "corpus", jamais un chemin. Déclarez chaque dépôt une fois avec ank config --user corpora.<root> <path>, et la configuration du client ne change pas d'un caractère. Un serveur peut adresser plusieurs corpus ; il ne fusionne jamais leurs claims.
ank_accept est là comme tous les autres verbes, et refuse toujours en dehors de la branche par défaut. Ratifier une décision reste un acte humain.
MCP ou la CLI
Les deux atteignent les mêmes verbes et renvoient les mêmes documents. Choisissez selon ce que votre client sait faire.
Votre agent a un shell
Utilisez la CLI. npx skills add haksolot/ank donne à l'agent les skills qui lui apprennent la boucle, et il appelle ank comme n'importe quelle commande.
Votre client n'a pas de shell
Utilisez ank mcp. Le client voit les mêmes verbes sous forme d'outils, avec les refus et les codes de sortie écrits dans chaque description : il peut lire ce qu'un appel refusera avant de le faire.
Vous construisez quelque chose qui affiche un corpus ? Interrogez ank_status et ank_find. ank_context et ank_show renouvellent un claim, et ank_check élague les refs périmées, donc écrit.
Installer ank
Deux commandes. Linux, macOS et Windows, avec git 2.34 ou plus récent.
npm install -g @haksolot/ank
npx skills add haksolot/ank