Icône de l'app Calíope

Calíope comme serveur MCP

Laissez un client IA de votre Mac interroger vos bases de données. Lecture seule, sur loopback, désactivé par défaut.

Sur macOS, Calíope peut faire office de serveur Model Context Protocol (MCP) : un client IA qui tourne sur le même Mac — Cursor, Claude Desktop, tout ce qui parle MCP — demande à Calíope de lister des bases de données, de décrire des tables et d’exécuter des requêtes en lecture seule sur les connexions que vous choisissez d’exposer. Cette page dit ce qu’est ce serveur, ce qu’un client peut faire à travers lui, ce qui doit être vrai avant qu’il ne réponde, et comment brancher un client. Le tableau des outils est généré depuis le code qui les sert.

Ce que c’est

Un serveur HTTP à l’intérieur de Calíope qui parle JSON-RPC 2.0, version de protocole 2025-06-18, annoncée dans l’en-tête MCP-Protocol-Version. Il n’écoute que sur 127.0.0.1 — sur ce Mac et nulle part ailleurs — sur le port 41500 sauf si vous le changez. Le port, c’est vous qui le choisissez ; l’adresse n’est pas configurable. Une seule route, POST /mcp, répond à initialize, ping, tools/list et tools/call ; un DELETE sur la même route met fin à la session.

Il n’existe que sur macOS, il est désactivé par défaut, et il ne répond que tant que Calíope est ouverte : fermez l’app et les outils cessent de répondre jusqu’à ce que vous la rouvriez. Si le port choisi est déjà pris par un autre programme, Calíope vous le dit et ne le démarre pas.

Ce que le client peut faire

Cinq outils, et rien d’autre. Le tableau ci-dessous est écrit par un script à partir du tableau que le serveur sert dans tools/list, et les descriptions sont celles que le client reçoit, mot pour mot — en anglais, quelle que soit la langue de cette page —, parce que ce texte est ce que le modèle en face lit pour décider quel outil appeler. Tous les paramètres sont des chaînes.

OutilParamètresDescription
list_connectionsConnections the user exposed to MCP. Returns id, name, engine, host.
list_databasesconnectionDatabases visible on a connection.
list_tablesconnection, databaseTables and views in a database.
describe_tableconnection, database, tableColumns, primary key, foreign keys and indexes of a table.
run_queryconnection, sqlRun ONE read-only SQL statement (SELECT/SHOW/EXPLAIN/DESCRIBE) on a connection. Rows are capped at 200.

Derrière l’outil qui exécute le SQL, il y a une porte en lecture seule, qui contrôle l’instruction avant qu’elle n’atteigne le serveur de base de données :

  • Une instruction par appel. Deux instructions, ou aucune, sont refusées.
  • Seulement des lectures : SELECT, SHOW, EXPLAIN ou DESCRIBE. Un INSERT, un UPDATE, un DROP, un WITH qui se termine par une écriture, ou une lecture qui écrit un fichier sur le serveur sont refusés.
  • Rien qui prenne des verrous. SELECT … FOR UPDATE et LOCK IN SHARE MODE lisent, certes, mais ils gardent des verrous jusqu’à la fin de la transaction, alors ils sont refusés aussi.
  • 200 lignes au plus. La réponse porte les colonnes, les lignes, le rowCount réel, et truncated: true quand le plafond a coupé quelque chose. Le plafond n’est pas configurable.
  • Les connexions MongoDB ne sont pas exposées. Elles ne sont pas proposées parmi les connexions que vous pouvez cocher, et les outils répondent qu’elles ne sont pas disponibles via MCP.

Tout ce qui s’exécute via MCP atterrit dans le journal des requêtes de Calíope, avec la connexion et le résultat, comme ce que vous tapez vous-même. Ce que la porte refuse n’atteint jamais le serveur et ne laisse aucune ligne.

Brancher un client

Activez l’interrupteur, cochez les connexions, appuyez sur Copier la configuration, collez dans son fichier le bloc dont votre client a besoin, et redémarrez le client. Le presse-papiers reçoit deux blocs avec votre port et votre clé réels déjà dedans — les deux mêmes que voici, avec <port> et <token> comme marqueurs.

Cursor lit un serveur HTTP directement. Son bloc va dans ~/.cursor/mcp.json :

// Cursor — ~/.cursor/mcp.json
{
  "mcpServers": {
    "caliope": {
      "url": "http://127.0.0.1:<port>/mcp",
      "headers": { "Authorization": "Bearer <token>" }
    }
  }
}

Claude Desktop ne parle que par entrée et sortie standard, pas HTTP, alors son bloc utilise mcp-remote comme pont — c’est ce que fait npx là. Il va dans ~/Library/Application Support/Claude/claude_desktop_config.json :

// Claude Desktop — claude_desktop_config.json
{
  "mcpServers": {
    "caliope": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "http://127.0.0.1:<port>/mcp",
               "--header", "Authorization:${AUTH}"],
      "env": { "AUTH": "Bearer <token>" }
    }
  }
}

Les clients lisent leur configuration au démarrage : une nouvelle clé ou un nouveau port, c’est recoller et redémarrer.

Pour aller plus loin

L’aide a trois rubriques là-dessus, et c’est le même texte que celui de l’app :

Et Comment Calíope est faite situe le serveur à côté du reste de l’architecture.