Conseils & astuces de configuration — CMA en tant que serveur MCP
Choses qui ne sont pas évidentes dans la doc et qui coûtent du temps en débogage.
Modèle mental
Claude Desktop est le frontend, CMA est le backend
Le Claude auquel tu écris dans Desktop est un relais. Il appelle send_message avec tes paroles, appelle wait_for_idle pour bloquer jusqu'à la fin de l'agent CMA, puis t'affiche la réponse. Le travail réel — tool use, exécution de code, éditions de repo — se passe dans la session CMA, pas dans Desktop.
Huit outils 1:1, une shim
list_agents, get_agent, create_session, send_message, interrupt, get_session, list_events, archive_session sont des wrappers d'endpoint directs. wait_for_idle est la seule rédaction : MCP est request/response et la completion CMA est SSE, donc quelque chose doit stream-to-idle à l'intérieur d'un appel tool.
session_id est le seul état, et Claude le détient
create_session le retourne ; Claude le transmet à chaque appel suivant. Le serveur MCP lui-même est sans état.
Deux transports, un ensemble d'outils
src/tools.ts enregistre les neuf outils. src/server.ts l'enveloppe en stdio (Claude Desktop le lance comme sous-processus) ; src/server-http.ts l'enveloppe en HTTP Streamable (claude.ai web le rejoint via le réseau). Choisis l'un ou l'autre.
Configuration — Claude Desktop (stdio, local)
- Environnement (une seule fois — les sessions ont besoin d'un
environment_id) :ant beta:environments create --name cma-mcp \ --config '{type: cloud, networking: {type: unrestricted}}' --transform id -r - Agents : ce serveur ne crée pas d'agents — il pilote ceux déjà dans ton workspace. Créez/mettez à jour via le CLI
antou la Console. .env.local:ANTHROPIC_API_KEY=sk-ant-... CLAUDE_ENVIRONMENT_ID=env_...- Enregistre avec Claude Desktop — ajoute à
~/Library/Application Support/Claude/claude_desktop_config.json(macOS) et redémarre Desktop :{ "mcpServers": { "cma": { "command": "bun", "args": ["run", "/absolute/path/to/managed_agents/cma-mcp/src/server.ts"], "env": { "ANTHROPIC_API_KEY": "sk-ant-...", "CLAUDE_ENVIRONMENT_ID": "env_..." } } } } - Test : dans un nouveau chat Desktop, demande « liste mes agents gérés, démarre une session avec le premier, et relaye ce message vers celui-ci : hello. »
Configuration — claude.ai web (HTTP Streamable, distant)
Mêmes outils, mais le serveur tourne sur une URL publique et claude.ai s'y connecte en tant que Connector personnalisé.
-
Token — génère-le et conserve-le ; quiconque possède ce token peut piloter tes agents :
export CMA_MCP_TOKEN=$(openssl rand -hex 32) -
Exécute localement d'abord (ngrok/cloudflared pour une URL publique pendant le test) :
bun run http # → :3000/mcp -
Déploie — le
Dockerfilecible Fly / Railway / Render ; définisANTHROPIC_API_KEY,CLAUDE_ENVIRONMENT_ID,CMA_MCP_TOKENcomme secrets. (Cloudflare Workers fonctionne aussi —WebStandardStreamableHTTPServerTransportest fetch-natif ; remplaceprocess.env→envetBun.serve→export default { fetch }.) -
claude.ai → Paramètres → Connectors → Ajouter un connector personnalisé :
Champ Valeur Nom CMAURL https://<ton-deploy>/mcpAuthentification Bearer token → ton CMA_MCP_TOKENOrgs Équipe / Entreprise : ajouter un connector par URL est généralement réservé aux admins org — les utilisateurs individuels voient un répertoire curé, pas un champ URL. Un admin ajoute l'URL + token une fois dans les paramètres org ; il apparaît ensuite dans la liste Connectors de chaque membre pour activation. (C'est la forme que tu veux pour déployer vers des utilisateurs non techniques de toute façon.)
-
Test : nouveau chat → active le connector
CMA→ même prompt qu'en haut.
Mode relais (instructions de Projet recommandées)
Sans orientation, le Desktop Claude essaiera de répondre lui-même plutôt que de relayer. Mets ceci dans les instructions personnalisées d'un Projet :
Tu es un frontend pour un backend Managed Agent atteint via les outils MCP
cma. Au premier tour utilisateur :list_agents(si nécessaire) →create_session→send_message(texte utilisateur littéralement)→wait_for_idle→ retourne lareplylittéralement. Aux tours suivants :send_message→wait_for_idle. Ne réponds pas à partir de tes propres connaissances ; ne reformule pas la réponse du backend. Siwait_for_idleretournestatus: "timeout", dis à l'utilisateur que c'est encore en cours et offre-toi à continuer d'attendre.
Pièges
stdio = Desktop seulement ; HTTP = l'internet
Le navigateur claude.ai ne peut pas lancer un processus local, donc stdio ne fonctionne qu'avec Claude Desktop / Claude Code. Le chemin HTTP te donne claude.ai web, mais maintenant l'URL est publique — le bearer token est la seule barrière devant ta clé ANTHROPIC_API_KEY et le quota CMA. Ne déploie pas sans, ne la journalise pas, fais-la tourner comme n'importe quelle clé API.
Longs tours vs timeout tool
wait_for_idle bloque. Si l'agent CMA tourne pendant des minutes (gros clone de repo, nombreux appels tool), le client MCP peut timeout l'appel tool. Atténuations : passe un timeout_sec plus petit et boucle (wait_for_idle retourne status: "timeout" + last_event_id ; appelle à nouveau), ou fais que Claude interroge get_session + list_events(after_id=...) à la place.
Facturation
Tout usage CMA facture la clé ANTHROPIC_API_KEY intégrée dans la config serveur — pas au compte de l'utilisateur Desktop. C'est le point (utilisateurs non techniques, pas de clés), mais dimensionne les limites du workspace de la clé en conséquence.
Délibérément non exposés
| Endpoint | Pourquoi pas |
|---|---|
agents.archive |
Permanent, pas d'annulation — un mauvais appel tool fout en l'air un agent prod |
agents.create / update |
La création appartient au CLI ant / Console, pas à un tour de chat |
sessions.delete, environments.* |
Ops infra destructives |
vaults.*, credentials.* |
Secrets |
sessions.resources.add |
Besoins tokens/IDs fichier que l'utilisateur chat n'aura pas |
Ajouter l'un d'eux, c'est quelques lignes dans src/cma.ts + src/server.ts si ton cas d'usage en a besoin.
Débogage
| Symptôme | Vérifier |
|---|---|
Desktop n'affiche pas d'outils cma |
Chemin config mauvais, ou bun pas sur PATH pour le processus Desktop (utilise un chemin absolu vers bun). Vérifie les logs MCP de Desktop. |
CLAUDE_ENVIRONMENT_ID is required |
Bloc env manquant de la config Desktop — les serveurs stdio ne lisent pas l'env de ton shell. |
wait_for_idle retourne une reply vide |
L'agent est passé idle sans émettre de texte (ex. seulement appels tool). list_events affiche le log complet. |
| Chaque tour démarre une nouvelle session | Claude ne fait pas passer session_id. Resserre les instructions du Projet. |
| Le Connector claude.ai affiche « couldn't connect » | URL mauvaise, serveur inatteignable, ou token invalide (vérifie les logs serveur pour 401). |
| Le serveur HTTP retourne 401 localement | CMA_MCP_TOKEN non exporté dans le shell où tu as lancé bun run http. |