Symbol der App Calíope

Calíope als MCP-Server

Lass einen KI-Client auf deinem Mac deine Datenbanken abfragen. Nur lesend, auf Loopback, ab Werk aus.

Auf macOS kann Calíope als Model-Context-Protocol-Server (MCP) arbeiten: Ein KI-Client, der auf demselben Mac läuft — Cursor, Claude Desktop, alles, was MCP spricht —, bittet Calíope, Datenbanken aufzulisten, Tabellen zu beschreiben und nur lesende Abfragen gegen die Verbindungen auszuführen, die du freigibst. Diese Seite sagt, was dieser Server ist, was ein Client darüber tun kann, was gelten muss, bevor er antwortet, und wie man einen Client anbindet. Die Werkzeugtabelle wird aus dem Code erzeugt, der sie ausliefert.

Was es ist

Ein HTTP-Server in Calíope, der JSON-RPC 2.0 spricht, Protokollversion 2025-06-18, angekündigt im Header MCP-Protocol-Version. Er lauscht nur auf 127.0.0.1 — auf diesem Mac und nirgends sonst — auf Port 41500, sofern du ihn nicht änderst. Den Port wählst du; die Adresse ist nicht konfigurierbar. Eine einzelne Route, POST /mcp, beantwortet initialize, ping, tools/list und tools/call; ein DELETE auf derselben Route beendet die Sitzung.

Es gibt ihn nur auf macOS, er ist ab Werk aus, und er antwortet nur, solange Calíope offen ist: Schließt du die App, hören die Werkzeuge auf zu antworten, bis du sie wieder öffnest. Ist der gewählte Port schon von einem anderen Programm belegt, sagt Calíope es dir und startet ihn nicht.

Was der Client tun kann

Fünf Werkzeuge, und sonst nichts. Die Tabelle unten schreibt ein Skript aus dem Array, das der Server in tools/list ausliefert, und die Beschreibungen sind die, die der Client bekommt, wörtlich — auf Englisch, in welcher Sprache diese Seite auch ist —, denn dieser Text ist das, was das Modell auf der anderen Seite liest, um zu entscheiden, welches Werkzeug es aufruft. Jeder Parameter ist eine Zeichenkette.

WerkzeugParameterBeschreibung
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.

Hinter dem Werkzeug, das SQL ausführt, steht ein Nur-Lese-Gate, das die Anweisung prüft, bevor sie den Datenbankserver erreicht:

  • Eine Anweisung pro Aufruf. Zwei Anweisungen, oder keine, werden abgelehnt.
  • Nur Lesen: SELECT, SHOW, EXPLAIN oder DESCRIBE. Ein INSERT, ein UPDATE, ein DROP, ein WITH, das in einem Schreiben endet, oder ein Lesen, das eine Datei auf dem Server schreibt, werden abgelehnt.
  • Nichts, was Sperren nimmt. SELECT … FOR UPDATE und LOCK IN SHARE MODE lesen zwar, halten aber Sperren bis zum Ende der Transaktion, also werden sie ebenfalls abgelehnt.
  • Höchstens 200 Zeilen. Die Antwort trägt die Spalten, die Zeilen, den echten rowCount und truncated: true, wenn die Obergrenze etwas abgeschnitten hat. Die Obergrenze ist nicht konfigurierbar.
  • MongoDB-Verbindungen werden nicht freigegeben. Sie werden unter den Verbindungen, die du anhaken kannst, nicht angeboten, und die Werkzeuge antworten, dass sie über MCP nicht verfügbar sind.

Alles, was über MCP läuft, landet im Abfrageprotokoll von Calíope, mit Verbindung und Ergebnis, genau wie das, was du selbst tippst. Was das Gate ablehnt, erreicht den Server nie und hinterlässt keine Zeile.

Einen Client anbinden

Schalter einschalten, Verbindungen anhaken, Konfiguration kopieren drücken, den Block, den dein Client braucht, in seine Datei einfügen und den Client neu starten. In die Zwischenablage kommen zwei Blöcke mit deinem echten Port und Schlüssel schon drin — dieselben zwei wie hier, mit <port> und <token> als Platzhaltern.

Cursor liest einen HTTP-Server direkt. Sein Block kommt in ~/.cursor/mcp.json:

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

Claude Desktop spricht nur über Standardein- und -ausgabe, nicht HTTP, deshalb nutzt sein Block mcp-remote als Brücke — das ist es, was npx dort tut. Er kommt in ~/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>" }
    }
  }
}

Clients lesen ihre Konfiguration beim Start, also heißt ein neuer Schlüssel oder ein neuer Port: erneut einfügen und neu starten.

Mehr dazu

Die Hilfe hat drei Themen dazu, und es ist derselbe Text, den die App zeigt:

Und So ist Calíope gebaut stellt den Server neben den Rest der Architektur.