agentmemory-mcp-gateway
agentmemory-mcp-gateway
Puerta de enlace OAuth 2.1 de un solo usuario que expone un pequeño conjunto de herramientas MCP de AgentMemory a clientes remotos.
Los clientes MCP se autentican en este servicio. Este servicio se autentica en AgentMemory. El secreto del backend de AgentMemory nunca sale de la puerta de enlace.
Qué hace
Implementa MCP remoto sobre Streamable HTTP en
/mcpActúa como servidor de autorización OAuth y recurso protegido
Permite que exactamente una persona inicializada previamente inicie sesión y otorgue consentimiento
Reenvía el tráfico permitido de
tools/listytools/calla la API REST de AgentMemorySe cierra en caso de fallo cuando AgentMemory no está disponible
Clientes previstos: ChatGPT, Notion Custom Agents, Codex cloud y otros clientes MCP remotos conformes a los estándares.
Forma de la URL pública:
https://memory-mcp.example.com/mcpRelated MCP server: Remote MCP Server
Arquitectura
MCP client
-> HTTPS gateway (this service)
-> private AgentMemory REST APILímites de confianza:
Los clientes MCP solo ven el origen público HTTPS, los metadatos OAuth y los esquemas/resultados de las herramientas permitidas.
AgentMemory permanece en la red privada de Railway. Los clientes nunca reciben
AGENTMEMORY_URLniAGENTMEMORY_SECRET.Las cabeceras
Authorizationentrantes se usan únicamente para validar el token de acceso del cliente. La puerta de enlace siempre construye una nueva cabeceraAuthorization: Bearer ${AGENTMEMORY_SECRET}para las llamadas upstream.SQLite almacena exclusivamente autenticación y estado OAuth. No es una base de datos de memoria.
Este es un servicio de Railway independiente de AgentMemory. Ejecute exactamente una réplica.
Por qué REST en lugar de @agentmemory/mcp
@agentmemory/mcp puede recurrir a una base de datos de memoria local cuando el upstream no está disponible. Eso es inaceptable para un gateway personal remoto.
Este servicio llama exclusivamente a:
GET /agentmemory/mcp/toolsPOST /agentmemory/mcp/callcon{ "name": string, "arguments": object }
Si AgentMemory está caído, malformado o agota el tiempo de espera, el gateway devuelve un error MCP seguro. No crea, abre ni escribe en otro almacén de memoria.
Por qué existe SQLite
SQLite en DATABASE_PATH (por defecto /data/oauth.sqlite) contiene:
el usuario único y su hash de contraseña
sesiones y consentimientos
registros de clientes OAuth
códigos de autorización
estado de tokens de acceso/refresco y revocación
claves de firma / JWKS
Nunca almacena observaciones ni embeddings de AgentMemory.
El limitador de tarifa en memoria también está limitado a una sola réplica. No escale este servicio horizontalmente.
Modelo estricto de un solo usuario
Solo correo electrónico y contraseña
Sin GitHub, inicio de sesión social, enlaces mágicos, invitaciones ni recuperación de contraseña
Sin registro público y sin API de gestión de usuarios
El registro de clientes (CIMD / DCR) no es registro de personas
Solo el ID persistente del usuario inicializado puede iniciar sesión, aprobar el consentimiento o recibir tokens MCP utilizables
El arranque en producción falla si la tabla de usuarios no contiene exactamente una fila
Los errores de autenticación son genéricos. No revelan si un correo existe.
Entorno
Variable | Requerido | Propósito |
| sí | Origen público canónico. Sin ruta, consulta, fragmento ni credenciales. HTTPS salvo en loopback. |
| sí | Secreto de firma/cifrado de Better Auth, 32+ caracteres |
| sí | Ruta del archivo SQLite, p. ej. |
| sí | Origen privado de AgentMemory |
| sí | Bearer del backend para AgentMemory, 32+ caracteres |
| no | Por defecto |
| no | Puerto de escucha. Railway lo establece. Por defecto |
| solo en la inicialización | Correo electrónico del administrador |
| solo en la inicialización | Contraseña fuerte generada, 20+ caracteres |
PUBLIC_URL es el único emisor y el origen de /mcp. El identificados del recurso protegido es ${PUBLIC_URL}/mcp.
Copie .env.example. Contiene únicamente marcadores de posición.
Desarrollo local
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 devComprobaciones útiles:
npm run format
npm run lint
npm run typecheck
npm test
npm run buildInicialización segura y única del administrador
railway run solo inyecta variables en un comando local. No puede escribir en el volumen de Railway. Realice la inicialización dentro del contenedor desplegado después de que /data esté montado.
Local
npm run seed-admin
# remove ADMIN_PASSWORD from .envImagen de producción / Railway
La imagen incluye dist/seed-admin.js y arranca con node dist/start.js.
Genere una contraseña aleatoria larga en 1Password. No la guarde en git, SQLite, Docker o registros.
Establezca
ADMIN_EMAILyADMIN_PASSWORDtemporalmente (20+caracteres) en el servicio.Implemente o reinicie para que el contenedor se ejecute con
/datamontado.Con esas variables establecidas,
node dist/start.jsejecutanode dist/seed-admin.jsen el mismo proceso, imprime el ID persistente del usuario y sale con0sin abrir el puerto HTTP.Elimine
ADMIN_PASSWORDyADMIN_EMAILy reinicie. El proceso sirve entonces HTTP.Si ambas variables siguen establecidas después de que el usuario exista, el arranque registra que deben eliminarse y sale con
0para que Railway no entre en bucle de fallos.Si solo se establece una de
ADMIN_EMAILoADMIN_PASSWORD, el arranque falla de forma segura y no sirve HTTP.
Equivalente manual dentro del contenedor una vez que el volumen existe:
railway ssh -- node dist/seed-admin.jsNo use railway run npm run seed-admin para inicializar entornos de producción. Ese comando se ejecuta en su máquina.
El proceso HTTP de producción no se iniciará hasta que exista ese usuario único y las variables de inicialización hayan desaparecido.
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-gatewayEl entrypoint arranca como root, verifica que DATABASE_PATH sea una ruta absoluta dentro de /data (o RAILWAY_VOLUME_MOUNT_PATH), hace chown solo de ese directorio y de los archivos SQLite/WAL/SHM, y luego cambia a UID/GID 10001 antes de que se ejecute node. Nunca hace chown recursivo de / ni de otros directorios principales. Montere un volumen persistente en /data.
Railway
Cree un servicio nuevo desde este repositorio. No lo despliegue sobre el servicio AgentMemory.
Use el Dockerfile /
railway.jsonen la raíz del repositorio.Adjunte un volumen persistente montado en
/data. Railway monta los volúmenes como root y reemplaza el directorio/datade la imagen.Establezca
RAILWAY_RUN_UID=0para que el entrypoint pueda hacerchownde/datay luego cambie a UID10001. Dejar el proceso como root es una solución media; esta imagen no mantiene root después del arranque.Configure el número de réplicas en 1. Un único volumen SQLite no se puede compartir de forma segura.
Establezca las variables de entorno anteriores. Use la URL privada de AgentMemory, por ejemplo
http://<agentmemory-service>.railway.internal:3111.Añada el dominio personalizado público y establezca
PUBLIC_URLa ese origen exactohttps://.Inicialice al administrador una vez con el método en el contenedor descrito arriba y luego elimine las variables temporales de la contraseña.
Confirme que
GET /healthzdevuelve{"ok":true}.
No exponga AgentMemory en esta secuencia de pasos. La puerta de enlace es el único endpoint MCP público.
Conexión con ChatGPT
Despliegue con un origen HTTPS estable y
/mcp.En ChatGPT, agregue una URL de MCP remoto / conector:
https://<su-dominio>/mcp.Prefiera CIMD si ChatGPT lo ofrece. DCR queda habilitado como respaldo.
Complete las pantallas alojadas de inicio de sesión y consentimiento como el usuario inicializado.
Confirme que aparecen
memory_recall,memory_smart_searchymemory_save.
ChatGPT detecta automáticamente /.well-known/oauth-protected-resource y los metadatos del servidor de autorización.
Conexión con Notion Custom Agents
Habilite servidores MCP personalizados en el área de trabajo de Notion si es necesario.
Agregue la URL de un servidor MCP personalizado:
https://<tu-dominio>/mcp.Notion usa OAuth y normalmente DCR, salvo que se haya pre-Registrado un cliente.
Inicie sesión como el usuario inicializado y apruebe el consentimiento.
Active solo las herramientas que ese agente debe usar.
Verificación básica de extremo a extremo
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":{}}'La llamada a /mcp debe devolver 401 con un desafío WWW-Authenticate que apunte a los metadatos del recurso protegido. Después de un inicio de sesión real de cliente, tools/list debe mostrar únicamente las herramientas permitidas.
Revocación de clientes y tokens
SQLite es la fuente de verdad para los clientes OAuth, los tokens de refresco y los consentimientos.
Elimine o rote
BETTER_AUTH_SECRETsolo si pretende invalidar el material de firma y volver a inicializar con cuidado.Quitar una fila de la tabla
oauthClient, los tokens relacionados y los registros de consentimiento revoca al cliente completo.Reemplazar el archivo SQLite cierra la sesión de todos los clientes.
No hay API de administración. Use una sesión de sqlite3 puntual contra el volumen si necesita revocar un cliente concreto.
Copia de seguridad y recuperación
Copie /data/oauth.sqlite junto con los archivos -wal y -shm mientras el servicio esté detenido, o use sqlite3 .backup. Si un volumen se pierde, todos los clientes OAuth deben reconectarse y el administrador debe volver a inicializarse. Esta copia de seguridad es estado de autenticación, no de AgentMemory.
Limitaciones conocidas
Solo hay una réplica. Los límites de tasa están en memoria.
No hay recuperación de contraseña. Si se olvida, restaure SQLite desde una copia de seguridad o elimine la tabla de usuarios e inicialícelo de nuevo.
No hay panel de control ni soporte para varios usuarios.
El controlador MCP mantiene el soporte del protocolo del SDK oficial previo (
2025) en modo sin estado para que ChatGPT y Notion no sean rechazados. La incursión de OAuth se adapta a las API MCP actuales de Better Auth, incluidos CIMD y DCR explícito.La autenticación de cliente mTLS anunciada por ChatGPT se termina en el borde HTTPS, no se verifica dentro del proceso.
Agentes en la nube
Cursor Cloud usa .cursor/environment.json:
Dockerfile — Ubuntu 24.04, Node 24 (nvm), npm y agentfiles
[Instalar] — actualiza agentfiles y ejecuta
npm cicuando existepackage-lock.json
El desarrollo local usa la misma versión de Node a través de .nvmrc para la imagen de la nube; el runtime del gateway se adapta a 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