synapse-mcp-api
v1.4.3
Published
MCP Server for Synapse — exposes all Synapse Memory API features as Model Context Protocol tools. Multi-tenant, supports stdio + HTTP/SSE + WebSocket transports.
Maintainers
Readme
synapse-mcp – MCP-Server für Synapse
Model Context Protocol (MCP) Server für das Synapse-Ökosystem – exponiert die Synapse Memory API, den Browser-Proxy und den SSH-Proxy als MCP-Tools. Mehrmandantenfähig, unterstützt stdio- und HTTP/SSE-Transporte (WebSocket: experimentell, nicht produktivtauglich). Funktioniert mit Claude Desktop, Cline, Cursor, Continue und jedem MCP-kompatiblen Client.
Aktuelle Version: 1.4.2 – 124 Tools in 15 Kategorien (120 kanonisch + 4 deprecated Aliasse). 100 % API-Coverage aller Schaefer-Services-HTTP- Endpunkte.
Übersicht
synapse-mcp ist die Brücke zwischen MCP-kompatiblen KI-Clients (Claude Desktop, Cline, Cursor etc.) und der Synapse-Memory-API. Statt dass jeder Client die HTTP-Endpunkte von Synapse direkt ansteuert, kapselt dieser Server alle Endpunkte als MCP-Tools und bietet zusätzlich AutoSync-Push- Benachrichtigungen für aktive Sessions. Der Server ist bewusst schlank gehalten: Er enthält keine eigene Persistenz, sondern leitet alle Aufrufe an die konfigurierten Upstream-Services (Synapse, Browser-Proxy, SSH-Proxy) weiter. Dadurch bleibt er zustandslos und einfach zu betreiben.
Quick Start
Voraussetzung: Mind Key besorgen
Ein Mind Key ist das Auth-Token – jeder MCP-Tool-Aufruf benötigt ihn.
- Registrieren an der Synapse-Instanz (Default: https://synapse.schaefer.zone)
- Mind anlegen im Web-UI – das liefert den Mind Key
- Mind Key kopieren – wird im nächsten Schritt gebraucht
Option 1: zentraler HTTP/SSE-Service (mehrmandantenfähig, empfohlen)
Einmal deployen, alle Nutzer verwenden ihn mit ihrem eigenen Mind Key:
docker service create \
--name synapse-mcp \
--network synapse-net \
--publish 13100:13100 \
--env SYNAPSE_URL=http://memory-api:12800 \
--env SYNAPSE_PUBLIC_URL=https://synapse.schaefer.zone \
--env BROWSER_PROXY_URL=http://browser-proxy:13000 \
--env SSH_PROXY_URL=http://ssh-proxy:12900 \
--env MCP_TRANSPORT=http \
registry.gitlab.com/schaefer-services/synapse-mcp:latestMCP-Client verbinden (Streamable HTTP, empfohlen):
URL: https://synapse-mcp.schaefer.zone/mcp
Headers: Authorization: Bearer <YOUR_MIND_KEY>
Accept: application/json, text/event-streamOption 2: lokaler stdio-Modus (Single-User)
Als Subprocess des MCP-Cients laufen. Jeder Container = ein Mind.
Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"synapse": {
"command": "npx",
"args": ["-y", "synapse-mcp"],
"env": {
"SYNAPSE_URL": "https://synapse.schaefer.zone",
"SYNAPSE_MIND_KEY": "<YOUR_MIND_KEY>",
"MCP_TRANSPORT": "stdio"
}
}
}
}Cline (VS Code):
{
"mcpServers": {
"synapse": {
"command": "docker",
"args": ["run", "--rm", "-i",
"-e", "SYNAPSE_URL=https://synapse.schaefer.zone",
"-e", "SYNAPSE_MIND_KEY=<YOUR_MIND_KEY>",
"-e", "MCP_TRANSPORT=stdio",
"registry.gitlab.com/schaefer-services/synapse-mcp:latest"]
}
}
}Setup verifizieren
- Konnektivität prüfen – das Tool
synapse_healthaufrufen. Es spricht Synapses/health-Endpunkt an und liefert Memory-Stats, DB-Status und Version. Schlägt es mit „Cannot reach Synapse" fehl, istSYNAPSE_URLfalsch oder Synapse ist offline. - Erste Erinnerung speichern –
memory_store { content: "..." }aufrufen. Sollte das Memory-Objekt mit ID zurückgeben. - Recall –
memory_recallaufrufen. Sollte die gerade gespeicherte Erinnerung zurückliefern.
| Fehlermeldung | Ursache | Lösung |
|---|---|---|
| Cannot reach Synapse at <url> | SYNAPSE_URL falsch oder Synapse down | URL prüfen, Synapse-Erreichbarkeit verifizieren |
| Authentication failed | Mind Key ungültig/fehlend | Mind Key aus Synapse-Web-UI kopieren, SYNAPSE_MIND_KEY bzw. Authorization: Bearer-Header setzen |
| Too many concurrent sessions | Mehr als 10 Sessions mit gleichem Mind Key | Ungenutzte Sessions schließen (DELETE /mcp) oder 30 min warten |
| Rate limit exceeded | Mehr als 60 Requests/min | Slow down, AutoSync-Polling-Frequenz reduzieren |
| SYNAPSE_MIND_KEY appears to be a placeholder | Beispiel-Config wörtlich kopiert | <YOUR_MIND_KEY> durch echten Key ersetzen |
Tools (124 gesamt: 120 kanonisch + 4 deprecated, 15 Kategorien)
Memory (24)
memory_recall, memory_list, memory_store, memory_store_get,
memory_search, memory_semantic_search, memory_update, memory_delete,
memory_bulk_delete, memory_stats, memory_unverified,
memory_contradictions, memory_audit, memory_related, memory_by_tag,
memory_diff, memory_expiring, memory_health, memory_sync,
memory_embed_batch, memory_embed_batch_status, memory_verify (JWT),
memory_unverify (JWT), memory_export.
Chat (10)
chat_poll, chat_reply, chat_reply_with_file, chat_status,
chat_history (JWT), chat_unread (JWT), chat_send (JWT),
chat_upload (JWT), chat_file_get, chat_files_list (JWT).
Scheduler (8)
cron_list, cron_create, cron_delete, cron_toggle, var_list,
var_get, var_set, var_delete.
Tasks (6)
task_list, task_get, task_create, task_update, task_complete,
task_delete.
Scripts (5)
script_list, script_get, script_info, script_store,
script_delete.
Computers (12)
User-facing (Mind Key): computer_list, computer_get,
computer_install_code, computer_screenshot, computer_command_queue,
computer_command_status, computer_commands_list, computer_disable,
computer_delete. Agent-facing (computer_token): computer_register,
computer_me_poll, computer_me_command_result.
Push (4, nur JWT)
push_vapid_public_key, push_subscribe, push_unsubscribe, push_test.
User/Mind-Verwaltung (6)
user_register, user_login, user_logout, user_minds_list (JWT),
user_mind_create (JWT), user_mind_delete (JWT).
Webhooks (6)
webhook_create, webhook_list, webhook_get, webhook_update,
webhook_delete, webhook_test.
Visualization (4)
memory_compact, memory_graph, memory_tags, memory_timeline.
Sharing (5, nur JWT, neu in v1.3.0)
mind_share_create, mind_share_list, mind_share_update,
mind_share_delete, minds_shared_list. ACL-Level: read, write,
admin.
Utility (7)
server_time, math_calc, random_value, auth_status,
synapse_health, synapse_endpoints, synapse_openapi.
Documentation (1, neu in v1.4.2)
documentation_query — durchsucht die Synapse-Dokumentation und ruft Artikel ab.
Browser-Proxy (11, neu in v1.2.0)
browser_health, browser_new, browser_navigate, browser_dom,
browser_screenshot, browser_sessions, browser_close,
browser_search, browser_fetch, browser_git_urls, browser_git_all.
Diese Tools proxyn auf den browser-proxy-api-Service
(Browserless + Redis) und stellen LLM-kontrollierte Chrome-Sessions
bereit. Jeder Mind Key bekommt einen isolierten Tab-Store
(Mehrmandantenfähigkeit). Tabs schließen nach 24 Stunden Inaktivität
automatisch.
Typischer Workflow: browser_new { url: "..." } → tab_id, dann
browser_dom { tab_id }, browser_screenshot { tab_id, format: "jpeg" },
abschließend browser_close { tab_id }. Für Code-Reviews ganzer Repos
eignet sich browser_git_all { url: "...", ext: ".ts,.js" }, das das
komplette Repo als konkatenierten Text zurückliefert.
SSH-Proxy (11, neu in v1.2.0)
ssh_health, ssh_new, ssh_connect, ssh_exec, ssh_exec_poll,
ssh_output, ssh_sessions, ssh_close, ssh_target_register,
ssh_target_list, ssh_target_delete. Diese Tools proxyn auf den
ssh-proxy-api-Service
und bieten persistente SSH-Sessions für LLM-Agenten, ohne dass ein lokaler
SSH-Client installiert sein muss.
Zwei Verbindungsmodi: Direct (Credentials im Request) oder
Pre-registered target (sicherer, keine Credentials im Request).
Kommandos sind asynchron – ssh_exec liefert sofort eine exec_id
zurück, dann muss ssh_exec_poll aufgerufen werden, um das Ergebnis
abzuholen. Sessions sind Single-Tasking (409 „session_busy" bedeutet,
dass ein voriges Kommando noch läuft) und schließen nach 30 Minuten
Inaktivität automatisch. Niemals ssh_exec für interaktive
Kommandos (vim, top, sudo mit Passwort-Prompt) verwenden.
AutoSync (Push-Benachrichtigungen)
Der MCP-Server benachrichtigt Clients proaktiv über Änderungen via des
Transport-Mechanismus des Clients. Es ist keine Client-Subscription
notwendig – Benachrichtigungen erfolgen automatisch für jede aktive
Session. Unterstützte Event-Typen sind memory.created,
memory.updated, memory.deleted, task.created, task.updated,
task.completed, chat.message_received und chat.message_sent.
Phase A (Polling): Der Server pollt Synapse alle 5 Sekunden pro
Session und emittiert Notifications, wenn Änderungen erkannt werden.
Das ist der Default und aktuell aktive Mechanismus. Phase B
(Webhook): Synapse kann Events via HTTP-Webhook an den MCP-Server
pushen für Near-Realtime-Notifications (<100 ms Latenz). Diese Variante
ist implementiert, aber noch nicht in den Main-Server-Startup
eingehängt (siehe docs/adr/0004-autosync-poll-vs-webhook.md).
Umgebungsvariablen
| Variable | Default | Beschreibung |
|---|---|---|
| MCP_TRANSPORT | http | stdio oder http (WebSocket in src/server-ws.ts vorhanden, aber nicht produktiv) |
| SYNAPSE_URL | https://synapse.schaefer.zone | Synapse-API-Basis-URL (in Swarm-Deployments intern) |
| SYNAPSE_PUBLIC_URL | https://synapse.schaefer.zone | Öffentliche Synapse-URL für Onboarding-Anzeige |
| SYNAPSE_MIND_KEY | – | Mind Key (Pflicht im stdio-Modus) |
| SYNAPSE_JWT | – | JWT für Mensch-only-Tools (optional) |
| BROWSER_PROXY_URL | http://browser-proxy:13000 | Browser-Proxy-API-URL |
| SSH_PROXY_URL | http://ssh-proxy:12900 | SSH-Proxy-API-URL |
| PORT | 13100 | HTTP/SSE-Listen-Port |
| LOG_LEVEL | info | debug, info, warn, error |
| ALLOWED_ORIGINS | * | Kommaseparierte CORS-Origins |
| NODE_ENV | production | development für pretty-Logs |
| MAX_SESSIONS_PER_MIND_KEY | 10 (hardcoded) | Max gleichzeitige Sessions pro Mind Key |
| WEBHOOK_PORT | 13101 | Webhook-Listen-Port (Phase B AutoSync) |
| WEBHOOK_HOST | synapse-mcp | Hostname für Webhook-URLs (Docker-DNS) |
| WEBHOOK_SECRET | – | Secret zum Signieren von Webhook-Payloads |
Architektur
┌─────────────────────────────────────────────────────────────┐
│ MCP-Client (Claude Desktop, Cline, Cursor, custom App) │
│ Auth: Authorization: Bearer <MIND_KEY> │
└─────────────────────┬───────────────────────────────────────┘
│
▼
https://synapse-mcp.schaefer.zone
│
▼
┌─────────────────────────────────────────────────────────────┐
│ synapse-mcp (dieser Server) │
│ - 124 MCP-Tools in 15 Kategorien (120 + 4 deprecated) │
│ - Mehrmandantenfähig: reicht Mind Key an Upstream weiter │
│ - Transporte: HTTP/SSE (prod), WebSocket (exp.), stdio │
│ - AutoSync-Push-Notifications (Poll oder Webhook) │
└─────┬───────────────┬───────────────────────┬──────────────┘
│ │ │
▼ ▼ ▼
┌───────────┐ ┌──────────────┐ ┌─────────────────────────┐
│ Synapse │ │ Browser-Proxy│ │ SSH-Proxy │
│ :12800 │ │ :13000 │ │ :12900 │
│ 97 Tools │ │ 11 browser_* │ │ 11 ssh_* tools │
└───────────┘ └──────────────┘ └─────────────────────────┘Architektur-Entscheidungen sind in vier ADRs dokumentiert
(docs/adr/0001-multi-tenant-architecture.md,
0002-transport-strategy-stdio-http-ws.md,
0003-auth-strategy-mind-key-per-request.md,
0004-autosync-poll-vs-webhook.md).
CI/CD
Die Pipeline in .gitlab-ci.yml inkludiert die Templates
schaeferms/ci-templates/templates/master.yml und
templates/deploy-swarm.yml und durchläuft die Stages lint, test,
build, publish und deploy. Der test:unit-Job läuft im Image
node:22-slim, führt npm ci, npm run typecheck und
npm run test:coverage aus und lädt das Cobertura-Coverage-XML als
Artifact hoch. Coverage-Ziel ist >80 % für neue Module.
Der publish:npm-Job läuft nur auf main, prüft, ob NPM_TOKEN
gesetzt und kein Platzhalter ist, und führt npm publish --access public
aus. Ist NPM_TOKEN nicht gesetzt, bricht der Job sauber mit einer
Hinweismeldung ab (kein Pipeline-Fehler). Der deploy:swarm-Job
verwendet das Template templates/deploy-swarm.yml und aktualisiert den
Service schaefer_synapse-mcp über SSH mit docker service update
--detach. Die Health-URL ist http://localhost:13100/health, die
Wartezeit 30 Sekunden. Wöchentliche Pipelines (Montag 09:00 UTC) fangen
Dependency-Breakage früh ab.
Deployment
Das Produktivsystem läuft als Docker-Swarm-Service schaefer_synapse-mcp
auf dem schaefer-Swarm (vps1/vps3). Der Service ist öffentlich unter
https://synapse-mcp.schaefer.zone erreichbar und verbindet sich intern
über das synapse-net-Docker-Netzwerk mit den Upstream-Services
(memory-api:12800, browser-proxy:13000, ssh-proxy:12900). Vor dem
Start prüft der Healthcheck im Dockerfile beide Endpunkte: den lokalen
MCP-Server unter http://localhost:13100/health und den Upstream-Synapse
unter SYNAPSE_URL/health. Schlägt einer der beiden fehl, markiert
Docker den Container als unhealthy und startet ihn neu.
Der entrypoint.sh-Mechanismus zieht bei jedem Container-Start den
origin/main und baut bei Änderungen an src/, tsconfig.json oder
package.json intern neu. Das erlaubt Hotfix-Deployments ohne neues
Docker-Image, sollte aber nur in Notfällen genutzt werden. Für ein
neues Produktivdeployment muss das Image aus der GitLab-Container-Registry
gezogen werden
(docker service update --image registry.gitlab.com/schaefer-services/synapse-mcp:latest schaefer_synapse-mcp),
anschließend verifiziert der Healthcheck innerhalb von 30 Sekunden die
Erreichbarkeit. Für Rollbacks kann auf einen früheren Image-Tag
zurückgegangen werden.
Entwicklung
git clone https://gitlab.com/schaefer-services/synapse-mcp.git
cd synapse-mcp
npm install
npm run build
npm run test:coverage
npm run typecheck
# Dev-Modus (HTTP/SSE)
SYNAPSE_URL=https://synapse.schaefer.zone \
SYNAPSE_MIND_KEY=<your-key> \
MCP_TRANSPORT=http \
npm run devFür Tests der browser_*- und ssh_*-Tools können die Proxy-URLs auf
lokale Instanzen oder auf den Produktivservice zeigen. Anschließend in
einem MCP-Client (z. B. Cline) http://localhost:13100/mcp anbinden und
browser_health bzw. ssh_health testen. Der npm run dev-Befehl
nutzt tsx watch für Hot-Reload; Änderungen an src/*.ts werden
sofort übernommen. Vor jedem Commit sollten npm run typecheck &&
npm run test:coverage lokal durchlaufen werden, weil die CI identisch
vorgeht.
Qualitätssicherung
Dieses Projekt folgt strikten Qualitätsstandards: Tests (>80 % Coverage
für neue Module), ADRs (Architectural Decision Records unter docs/adr/),
CHANGELOG (jede Änderung dokumentiert), Code Review (Self-Review-Checkliste
vor Merge), Definition of Done (Code + Tests + Doku + CHANGELOG +
verifiziert). Der Default-Branch main ist geschützt; direkte Pushes
sind nicht erlaubt, alle Änderungen laufen über Merge Requests.
Verwandte Services
Dieser MCP-Server integriert drei Sibling-Services aus der schaefer-services-Gruppe:
| Service | Repo | Port | Zweck | |---------|------|------|-------| | Synapse | synapse | 12800 | Memory API, Chat, Tasks, Scripts, Webhooks, Scheduler | | Browser-Proxy | browser-proxy-api | 13000 | LLM-kontrolliertes Chrome (Browserless + Redis) | | SSH-Proxy | ssh-proxy-api | 12900 | Persistente SSH-Sessions, pre-registrierte Targets |
Alle drei Services werden zusammen im schaefer-Docker-Swarm-Stack auf
vps1/vps3 ausgerollt.
Lizenz
MIT – siehe LICENSE.
Autor
Michael Schäfer · Schäfer Services · [email protected]
Dokumentation
Die weiterführende Doku liegt in documentation/ und richtet sich an
unterschiedliche Leser:innen: architecture.md dokumentiert die Schichten
(Entry, Transport, Session, Tool, Client), die Mehrmandantenfähigkeit und
die Auth-Strategie; deployment.md behandelt die Produktivumgebung,
Docker-Konfiguration, Erstinitalisierung und das Rollback; development.md
erklärt das Setup, die NPM-Skripte, die Testsuite, die Tool-Entwicklung und
den Merge-Request-Workflow. Ergänzend liegen in docs/adr/ vier
Architecture Decision Records (Multi-Tenant, Transport-Strategie,
Auth-Strategie, AutoSync-Poll-vs-Webhook), die Designentscheidungen
nachvollziehbar machen. Beispiel-Konfigurationen für Claude Desktop und
Cline liegen unter examples/.
| Datei | Inhalt |
|---|---|
| documentation/architecture.md | Schichten, Multi-Tenancy, Auth, AutoSync |
| documentation/deployment.md | Produktivsetup, Docker, CI/CD, Rollback |
| documentation/development.md | Setup, NPM-Skripte, Tests, Tool-Entwicklung |
| docs/adr/0001-multi-tenant-architecture.md | ADR: Multi-Tenant mit Mind Key als Tenant-ID |
| docs/adr/0002-transport-strategy-stdio-http-ws.md | ADR: stdio + HTTP produktiv, WS experimentell |
| docs/adr/0003-auth-strategy-mind-key-per-request.md | ADR: Mind Key pro Request, JWT optional |
| docs/adr/0004-autosync-poll-vs-webhook.md | ADR: Polling statt Webhook für AutoSync |
| examples/ | Beispiel-Konfigurationen für Claude Desktop, Cline, VS Code |
Roadmap
Die weitere Entwicklung konzentriert sich auf vier Stränge: (1) Aktivierung
des WebSocket-Transports in src/index.ts, der aktuell in server-ws.ts
implementiert, aber nicht eingehängt ist – das wird Realtime-Anwendungen
wie Live-Browser-Steuerung und SSH-Session-Pipelining ermöglichen; (2) Ausbau
der AutoSync-Webhook-Variante, die aktuell nur polling-basiert ist, sodass
Synapse den MCP-Server bei Memory-Änderungen aktiv benachrichtigt statt ihn
pollen zu lassen; (3) Erweiterung des Tool-Profilsystems in
src/tools/profiles.ts um benutzerdefinierte Profile, die über eine
Konfigurationsdatei geladen werden; (4) Stabilisierung der SSRF-Prävention
in tests/ssrf.test.ts, die aktuell im grünen Bereich ist, aber bei
neuen Tool-Implementierungen immer wieder randständig wird. Konkrete
Releases werden in CHANGELOG.md nachverfolgt.
