agentmemory-mcp-gateway
agentmemory-mcp-gateway
Einzelbenutzer-OAuth-2.1-Gateway, das einen kleinen Satz AgentMemory-MCP-Tools für entfernte Clients bereitstellt.
MCP-Clients authentifizieren sich bei diesem Dienst. Dieser Dienst authentifiziert sich bei AgentMemory. Das AgentMemory-Backend-Geheimnis verlässt das Gateway nie.
Funktionen
Spricht Remote-MCP über Streamable HTTP unter
/mcpFungiert als OAuth-Autorisierungsserver und geschützte Ressource
Erlaubt genau einem vorab eingerichteten Benutzer, sich anzumelden und eine Einwilligung zu erteilen
Leitet freigegebenen
tools/list- undtools/call-Verkehr per Allowlist an die AgentMemory-REST-API weiterSchlägt bei nicht verfügbarem AgentMemory (fail closed) sicher fehl
Vorgesehene Clients: ChatGPT, Notion Custom Agents, Codex Cloud und andere standardkonforme Remote-MCP-Clients.
Form der öffentlichen URL:
https://memory-mcp.example.com/mcpRelated MCP server: Remote MCP Server
Architektur
MCP client
-> HTTPS gateway (this service)
-> private AgentMemory REST APIVertrauensgrenzen:
MCP-Clients sehen nur die öffentliche HTTPS-Origin, die OAuth-Metadaten und die freigegebenen Tool-Schemas/-Ergebnisse.
AgentMemory bleibt im privaten Railway-Netzwerk. Clients erhalten niemals
AGENTMEMORY_URLoderAGENTMEMORY_SECRET.Eingehende
Authorization-Header werden nur zur Validierung des Client-Zugriffstokens verwendet. Das Gateway erstellt für Upstream-Aufrufe immer einen neuenAuthorization: Bearer ${AGENTMEMORY_SECRET}-Header.SQLite speichert nur Authentifizierungs- und OAuth-Zustand. Es ist keine Speicherdatenbank.
Dies ist ein von AgentMemory getrennte Railway-Dienst. Betreiben Sie genau eine Replica (Replikat).
Warum REST anstelle von @agentmemory/mcp
@agentmemory/mcp kann auf eine lokale Speicherdatenbank zurückgreifen, wenn das entfernte System nicht erreichbar ist. Das ist für ein entferntes persönliches Gateway nicht akzeptabel.
Dieser Dienst ruft nur Folgendes auf:
GET /agentmemory/mcp/toolsPOST /agentmemory/mcp/callmit{ "name": string, "arguments": object }
Wenn AgentMemory nicht verfügbar ist, fehlerhaft antwortet oder einen Timeout aufweist, gibt das Gateway einen sicheren MCP-Fehler zurück. Es erstellt, öffnet oder schreibt keine anderen Speicherdatenbank.
Warum SQLite existiert
SQLite unter DATABASE_PATH (Standard /data/oauth.sqlite) enthält Folgendes:
den einzelnen Benutzer und -Hash (Benutzerkennwort)
Sitzungen und Einwilligungen
OAuth-Client-Registrierungen
Autorisierungscodes
Zugriffs-/Aktualisierungs-Token und Entzugszustand
Signaturschlüssel / JWKS
Es speichert niemals AgentMemory-Beobachtungen oder -Embeddings.
Auch der In-Memory-Tarifbegrenzer ist nur für eine einzelne Instanz konzipiert. Skalieren Sie diesen Dienst nicht horizontal.
Strenges Einzelbenutzer-Modell
Nur E-Mail/Passwort
Kein GitHub, Social-Login, Magic-Links, Einladungen und keine Passwortwiederherstellung
Keine öffentliche Registrierung und keine Benutzerverwaltungs-API
Client-Registrierung (CIMD / DCR) ist keine menschliche Registrierung
Nur die dauerhafte ID des zuvor eingerichteten Benutzers kann sich anmelden, Einwilligungen erteilen oder nutzbare MCP-Tokens erhalten
Der Produktionsstart schlägt fehl, wenn die Benutzer- kinds existieren
Authentifizierungsfehler sind generisch. Sie geben nicht preis, ob eine E-Mail-Adresse existiert.
Umgebung
Variable | Erforderlich | Zweck |
| ja | Kanonische öffentliche Origin. Kein Pfad, keine Query, kein Fragment und keine Zugangsdaten. HTTPS außer Loopback. |
| ja | Signatur-/Verschlüsselungsgeheimnis von Better Auth, 32+ Zeichen. |
Speicherpfad | Dateipfad. | |
| ja | Signatur-/Verschlüsselungsgeheimnis von Better Auth, 32+ Zeichen |
| ja | SQLite-Dateipfad, z.B. |
| ja | Private AgentMemory-Origin |
| ja | Backend-Bearer für AgentMemory, 32 char kons Z. |
| nein | Standard |
| nein | Liste-Port. Railway setzt diesen. Standard |
| nur beim Seeding | Administrator-E-Mail |
| nur beim Seeding | Starkes generiertes Passwort, 20+ Zeichen |
PUBLIC_URL ist die einzige Aussteller und die Origin für /mcp. Die Ressourcen-ID der geschützten Ressource ist ${PUBLIC_URL}/mcp.
Kopieren Sie .env.example. Es enthält nur Platzhalter.
Lokale Entwicklung
nvm install
cp .env.example .env
# fill local loopback values, for example PUBLIC_URL=http://127.0.0.1:8080
npm install
npm run seed-admin
# remove ADMIN_PASSWORD from .env
npm run devNützliche Prüfungen:
npm run format
npm run lint
npm run typecheck
npm test
npm run buildSicheres einmaliges Administrator-Seeding
railway run injiziert Variablen nur in einen lokalen Befehl. Es kann nichts in dasRailway-Volume schreiben. Führen Sie das Seeding in dem bereitgestellten Container (deployed Container) durch, nachdem /data gemountet ist.
Lokal
npm run seed-admin
# remove ADMIN_PASSWORD from .envProduktionsimage / Docker
Das Image enthält dist/seed-admin.js undstartet mit node dist/start.js.
Generieren Sie ein langes Zufallspasswort in 1Password. Speichern Sie es nicht in Git, SQLite, im Docker-Image oder in Logs.
zusätzlichen
ADMIN_EMAILundADMIN_PASSWORD(20+ Zeichen) für den Dienst.Erstellen Sie bereits Bereitstellung oder starten Sie neu, sodass der Container mit gemountetem
/dataläuft.Mit diesen gesetzten Variablen führt
node dist/start.jsnode dist/seed-admin.jsprozessintern aus, gibt die dauerhafte Benutzer-ID aus und wird mit0beendet, ohne denHTTP-Port zu öffnen.Entfernen Sie
ADMIN_PASSWORDundADMIN_EMAILund starten Sie dann neu. Anschließend bedient der Prozess HTTP.Wenn beide Variablen nach bestehenden Benutzer weiterhin sind, protokolliert der Start, dass sie entfernt werden müssen, und beendet mit
0, damit Railway nicht Absturz-Loop gerät.Wenn nur eine von
ADMIN_EMAILoderADMIN_PASSWORDgesetzt ist, schlägt der Start fehl und wart nie HTTP.
Manuelles Äquivalent im Container, nachdem das Volume unter:
railway ssh -- node dist/seed-admin.jsVerwenden Sie railway run npm run seed-admin für das Produktions-Seeding. Dieses/in diesem CI läuft auf Ihrem Rechner.
Der Produktions-HTTP-Prozess startet erst, wenn dieser eine Benutzer existiert und die Seed-Variablen entfernt sind.
Docker
docker build -t agentmemory-mcp-gateway .
docker run --rm -p 8080:8080 \
-e PUBLIC_URL=http://127.0.0.1:8080 \
-e BETTER_AUTH_SECRET=... \
-e DATABASE_PATH=/data/oauth.sqlite \
-e AGENTMEMORY_URL=http://127.0.0.1:3111 \
-e AGENTMEMORY_SECRET=... \
-v gateway-data:/data \
agentmemory-mcp-gatewayDer Entrypoint startet als Shell, prüft, ob DATABASE_PATH eine absolute Datei unter /data oder RAILWAY_VOLUME_MOUNT_PATH ist, führt chown nur für dieses Verzeichnis sowie für die SQLite/WAL/SHM-Dateien aus und wechselt dann vor der Ausführung von node zu UID/GID 10001. Er Ruft niemals rekursives chown für / oder andere übergeordnete Verzeichnisse auf. Binden Sie ein persistentes Volume unter /data ein.
Railway
Erstellen Sie einen neuen Dienst aus diesem Repository. Den Sie Dienst nicht auf dem AgentMemory-Dienst bereitgestellt (deploy).
Verwenden Sie die Dockerfile/
railway.jsonim Repo-Root.Binden Sie persistentes Volume unter
/dataein. Railway mounted als Superuser und ersetzt das Imageverzeichnis/data.Setzen Sie
RAILWAY_RUN_UID=0, damit der Entrypoint/kädigchownausführen kann, und wechseln Sie dann zuUID10001. Den Prozess als Root zu lassen ist eine Kompromiss; dieses Image behält Root nach dem Start nicht.Setzen Sie die Replikas auf 1. Ein einzelnes SQLite-Volume kann nicht sicher geteilt werden.
Setzen Sie die oben genannten Umgebungsvariablen. Verwenden Sie die private URL storageMemory, z.B.
https://URLMemory.service.railway.internal:3111.Binden Sie die Bundesoftware Custom Domain an und setzen Sie
PUBLIC_URLauf genau diesehttps://-Origin.Sep Sie den Administrator einmal mit dem oben beschriebenen In-Container-Pfad und löschen Sie dann die temporären Passwortvariablen.
Bestätigen Sie, dass
GET /healthz{"ok":true}zurückgibt.
Setzen Sie AgentMemory für diesen Ablauf nicht in das öffentliche Internet. Das Gateway ist die einzige öffentliche MCP-Endpunkt.
ChatGPT anbinden
Stuntehen Sie mit stabiler HTTPS-Origin und
/mcp.Fügen Sie in ChatGPT eine Remote-/Connector-URL hinzu:
https://<your-domain>/mcp.Bevorzugen Sie CIMD, wenn ChatGPT diese bietet. DCR bleibt als Fallback aktiviert.
Schließen Sie die gehostetenI- und Einwilligungsseite als den angelegten Benutzer ab.
Bestätigen Sie, dass
memory_recall,memory_smart_searchundmemory_saveerscheinen.
ChatGPT ermittelt /.well-known/oauth-supplied-resource und die Metadaten des Autorisierungsservers automatisch.
Notion Custom Agents anbinden
Aktivieren Sie bei Bedarf CG benutzerdefinierte MCP-Server im Hub.
Fügen Sie eine benutzerdefinierte Server-URL hinzu:
https://<your-domain>/mcp.Notion verwendet OAuth und in der Regel DCR, es sei denn ist ein Client vorab registriert.
Melden Sie sich als das/einen Benutzer an und stimmen Sie denEinwilligung zu.
Aktivieren Sie nur die Tools, die dieser Agentone verwenden soll.
Einfache End-zu-Ende-Überprüfung
curl -sS https://<your-domain>/healthz
curl -sS https://<your-domain>/.well-known/oauth-authorization-server
curl -sS https://<your-domain>/.well-known/oauth-protected-resource
curl -sS -D- https://<your-domain>/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'Der /mcp-Aufruf muss 401 mit einer WWW-Authenticate-Challenge zurückgeben, die auf die Metadaten der zum Ressourcen zeigt. Nach einem echten Client-Login sollte tools/list nur die freigegebenen Tools anzeigen.
Clients und Tokens widerrufen
SQLite ist die Quelle der Wahrheit mit OAuth-Clients, Refresh-Tokens und Einwilligungen.
Löschen oder drehen Sie
BETTER_AUTH_SECRETnur, wenn Sie das Signaturmaterial aktivieren und sorgfältig neu seeden möchten.Das Entfernen einer
oauthClient-Zeile, zugehöriger Tokens und Einwillig/Datensätze wird diese Client widerrufen.Das Ersetzen der SQLite-Datei meldet alle Clients ab.
Es gibt keine Admin-API. Verwenden Sie eine einmalige sqlite3-Sitzung gegen das Volume, wenn Sie einen bestimmten Client widerrufen müssen.
Sichern kurz und Wiederherstellen
Kopieren Sie /data/oauth.sqlite und die -wal/-shm-Dateien gemeinsam, während der Dienst gestoppt ist, oder verwenden Sie sqlite3 .backup. Ein verlorenes Volume bedeutet, dass sich alle OAuth-Clients und neue Verbindung aufbauen müssen und der Administrator neu geseedet werden muss. Diese Sicherung ist Authentifizierungszustand, kein AgentMemory.
Bekannte Einschränkungen
Nur eine Replica. Rate-Limits sind im Speicher (im Speicher).
Keine Passwort-Zurücksetzung. Wenn das Kennwort verloren geht, SQLite aus Sicherung wiederhergestellt oder die Benutzertabelle wird gelöscht und der Administrator neu geseedet.
Kein Dashboard und keine Mehrbenutzerunterstützung.
Der MCP-Handler behält den alten (
2025)-Legacy-Protokoll des offiziellen SDKs im zustandslosen Modus bei, sodass ChatGPT und Notion nicht abgewiesen werden. Der OAuth-Stack folgt den aktuellen Better-Auth-MCP-APIs, einschließlich CIMD plus explizitem DCR.Die von ChatGPT angebundene mTLS-Client-Authentifizierung wird am HTTPS-Endpunkt beendet und nicht in diesem Prozess überprüft.
Cloud-Agenten
Cursor 要用 .cursor/environment.json:
Dockerfile — Ubuntu 24.04, Node 24 (nvm), npm und agentfiles
install — aktualisiert agentfiles und führt
npm ciaus, wennpackage-lock.jsonliegt
Die lokale Entwicklung verwendet über .nvmrc dieselbe Node-Version für das Cloud-Image. Die Gateway-Laufzeit selbst zielt auf Node 22.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables remote access to the MemPalace MCP server via HTTP, supporting bearer token authentication and concurrent clients while exposing all mempalace tools.
- FlicenseNot gradedqualityDmaintenanceEnables running MCP tools remotely on Cloudflare Workers with OAuth login. Supports tool calls like math operations through MCP clients.
- FlicenseNot gradedqualityDmaintenanceRemote MCP server with built-in OAuth authentication via Cloudflare Access, enabling secure tool invocation after user sign-in.
- FlicenseNot gradedqualityCmaintenanceEnables running MCP tools remotely on Cloudflare Workers with OAuth authentication, allowing clients like Claude to call tools via SSE.
Related MCP Connectors
StremAI MCP: shared memory for AI coding agents. Connected agents can recall. OAuth + local stdio.
Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/martindzejky/agentmemory-mcp-gateway'
If you have feedback or need assistance with the MCP directory API, please join our Discord server