synapse-mcp
MCP server for the Synapse ecosystem that exposes the Synapse Memory API, Browser Proxy, and SSH Proxy as MCP tools, enabling multi-tenant, stateful interactions via stdio or HTTP/SSE.
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:latest
MCP-Client verbinden (Streamable HTTP, empfohlen):
URL: https://synapse-mcp.schaefer.zone/mcp
Headers: Authorization: Bearer <YOUR_MIND_KEY>
Accept: application/json, text/event-stream
Option 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 dev
Fü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 · michael@schaefer.zone
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.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。