MemHeaven

Servidor de memoria MCP remoto autoalojado para ChatGPT y agentes de IA.

Documentación

MemHeaven logo

MemHeaven

MemHeaven es un servidor de memoria MCP remoto autoalojado para ChatGPT y otros agentes de IA en la nube.

Brinda a los clientes de IA alojados memoria a largo plazo buscable que tú posees, desplegada en Cloudflare. MemHeaven se inspira en el modelo de memoria a largo plazo de MemPalace mientras utiliza una forma de despliegue remoto para clientes alojados.

Despliega en una cuenta gratuita de Cloudflare. Sin VM, sin Docker, sin administración de bases de datos.

Se aplican los límites del plan gratuito; el uso intensivo puede requerir el uso de pago de Cloudflare.

Enlaces rápidos: Inicio rápido · Empezar desde cero · Configuración de ChatGPT · Compatibilidad de clientes · Modelo de seguridad · Evaluaciones de comportamiento

Qué problema resuelve

Los asistentes de IA son útiles en el momento, pero a menudo olvidan el contexto del proyecto entre chats, sesiones y herramientas.

Las funciones de memoria integradas pueden ayudar, pero normalmente son propiedad del proveedor y no son lo mismo que una capa de memoria inspeccionable y buscable que tú controles. Las herramientas de memoria local son poderosas también, pero los clientes alojados como ChatGPT y otros agentes remotos necesitan un servidor MCP remoto.

MemHeaven es para personas que quieren:

  • memoria buscable que posean
  • contexto almacenado inspeccionable y eliminable
  • continuidad para agentes de codificación y otros flujos de trabajo de IA entre sesiones
  • una forma de despliegue MCP remoto en lugar de una configuración solo para laptop

Cuándo encaja MemHeaven

Elige MemHeaven cuando un cliente alojado o un agente de IA necesite una capa de memoria buscable que persista fuera del chat actual:

  • ChatGPT necesita recuperar decisiones de proyecto, preferencias, notas u otro contexto duradero entre chats.
  • Un cliente MCP remoto no puede depender de un servicio de memoria que se ejecute solo en tu laptop.
  • Usuarios o flujos de trabajo separados necesitan acceso aislado por inquilino al contexto almacenado.
  • Quieres inspeccionar, buscar y eliminar los registros mantenidos por tu propio despliegue.

Memoria externa, no un reemplazo de la memoria de ChatGPT

MemHeaven no cambia la memoria integrada de ChatGPT. Es un servicio MCP separado protegido con OAuth que tu cliente puede llamar para obtener contexto almacenado en tu propio despliegue. No existe una instancia pública compartida de MemHeaven: tú operas el Worker, los enlaces de almacenamiento, la configuración OAuth y las claves de acceso en tu cuenta de Cloudflare.

Memoria a largo plazo de ChatGPT a través de MCP remoto

Si quieres que ChatGPT use una capa de memoria buscable entre chats sin poner esa memoria en un servicio de terceros compartido, despliega MemHeaven en tu propia cuenta de Cloudflare y conecta ChatGPT al endpoint /mcp de tu instancia. Esta memoria externa complementa la memoria integrada de ChatGPT: puedes inspeccionar, buscar y eliminar los registros almacenados por tu propio despliegue. Consulta la configuración de ChatGPT y el modelo de seguridad antes de conectar un cliente.

Por qué existe MemHeaven

  • Los asistentes de IA olvidan el contexto del proyecto entre chats y sesiones.
  • La memoria integrada es útil, pero normalmente es propiedad del proveedor y no es una capa de memoria exacta y buscable.
  • Las herramientas de memoria local son poderosas, pero los clientes alojados necesitan MCP remoto.
  • Los usuarios quieren memoria inspeccionable, buscable, eliminable y portátil.
  • Los agentes de codificación necesitan continuidad entre sesiones, editores y herramientas.

Una cuenta gratuita de Cloudflare es suficiente para uso personal

MemHeaven está diseñado para uso personal y uso de grupos pequeños de confianza en servicios administrados por Cloudflare.

  • Worker ejecuta el servidor HTTP.
  • D1 almacena metadatos relacionales e índices.
  • R2 almacena los cuerpos de cajones y diarios.
  • Vectorize potencia la búsqueda semántica vectorial.
  • Workers AI genera embeddings.

Eso significa:

  • sin VM
  • sin Docker
  • sin administración de bases de datos
  • sin proceso de servidor de larga duración

Se aplican los límites del plan gratuito. MemHeaven no promete uso gratuito ilimitado, tiempo de actividad empresarial o costo cero bajo cualquier carga de trabajo. Ten en cuenta también que algunos servicios subyacentes de Cloudflare, especialmente Vectorize, tienen sus propios planes y restricciones de uso, así que revisa los precios actuales de Cloudflare antes de un despliegue amplio.

Camino rápido más feliz

npm install
cp wrangler.toml.example wrangler.toml
npm run init -- --base-url https://memheaven.<your-workers-subdomain>.workers.dev
npm run secrets:generate

npx wrangler secret put JWT_SIGNING_SECRET
npx wrangler secret put TOKEN_ENCRYPTION_KEY
npx wrangler secret put AUTH_KEY_PEPPER

export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant personal --label "Personal"

npx wrangler deploy

Luego conecta tu cliente alojado a:

https://memheaven.<your-workers-subdomain>.workers.dev/mcp

Cuando se abra la página de autorización, pega el raw_key impreso.

Si prefieres la versión guiada, usa docs/GETTING_STARTED_FROM_ZERO.md.

Clientes compatibles / esperados

ClienteEstadoNotas
ChatGPTConfirmadoVerificado manualmente de extremo a extremo para la URL /mcp, el flujo de autorización OAuth y una llamada de herramienta mempalace_status
Conectores alojados de Claude.aiEsperadoLa devolución de llamada alojada exacta conocida está en la lista de permitidos, pero los documentos públicos no exponen la URL y aún se necesita verificación de extremo a extremo
Clientes MCP locales de IDE / CLIEsperadoYa se permiten las devoluciones de llamada OAuth de bucle local genéricas localhost / 127.0.0.1 / [::1]
VS Code / GitHub Copilot MCPEsperado para bucle local; OAuth alojado desconocidoLas devoluciones de llamada localhost genéricas están en la lista de permitidos; no hay devolución de llamada alojada exacta de vscode.dev previamente permitida
Grok / xAIEsperado con autenticación de portador/encabezadoTratar como integración Authorization: Bearer <OAuth access token> para /mcp, no como objetivo de lista de permitidos de devolución de llamada OAuth alojado
Perplexity / AbacusNo aplicable / DesconocidoNo hay contrato de devolución de llamada de cliente alojado confirmado en la lista de permitidos

Detalles completos: docs/CLIENT_COMPATIBILITY.md

Instrucción de memoria para agentes

Usa MemHeaven de forma conservadora para escrituras y proactiva para lecturas cuando el contexto previo importe. Las herramientas MCP devuelven su propia guía detallada, por lo que la instrucción para ChatGPT/agentes personalizados puede mantenerse corta.

Instrucción de copiar y pegar para agentes:

Use MemHeaven for cross-session memory. When prior context may matter,
start with mempalace_wake_context if available; otherwise call
mempalace_status and follow its returned guidance. Do not mix work,
personal, or project scopes. Save only durable facts, decisions, and
preferences as concise plain text.

Guía completa: docs/AGENT_MEMORY_PROTOCOL.md

Inspirado en MemPalace

MemHeaven se inspira en MemPalace, el proyecto de memoria IA local de código abierto que ayudó a mostrar cuán útil puede ser la memoria a largo plazo textual y buscable para los agentes de IA.

MemPalace presentó un fuerte argumento para mantener el contexto original y organizarlo en una estructura de memoria navegable. MemHeaven explora una forma de despliegue diferente: memoria MCP remota para clientes alojados y configuraciones compartidas de confianza.

Lo vemos como complementario al enfoque en el dispositivo de MemPalace, no como un reemplazo.

Cómo funciona a alto nivel

  • Un Worker de Cloudflare expone endpoints OAuth y el endpoint autenticado /mcp.
  • Los clientes de IA alojados se conectan a través de Streamable HTTP MCP.
  • D1 almacena metadatos, índices, hechos de KG, túneles, cuotas y filas de auditoría.
  • R2 almacena cuerpos completos textuales de cajones y diarios.
  • Workers AI genera embeddings.
  • Vectorize realiza búsqueda semántica sobre contenido de memoria fragmentado.
  • Las claves de acceso controlan la autorización y asignan usuarios a memoria con ámbito de inquilino.

Documentación

Qué se incluye

  • OAuth 2.1 + PKCE + registro dinámico de clientes para MCP remoto compatible con ChatGPT.
  • Página de consentimiento controlada por clave de acceso respaldada por artefactos de autenticación JWT sin estado.
  • Almacenamiento de cajones, diarios, grafo de conocimiento y túneles con ámbito de inquilino.
  • Servidor MCP HTTP Streamable que usa WebStandardStreamableHTTPServerTransport con arranque sin estado por solicitud.
  • Superficie de herramientas mempalace_* compatible con MemPalace, incluyendo herramientas adaptadas solo locales.
  • Búsqueda semántica segura para Workers usando embeddings de Workers AI + Vectorize + hidratación R2/D1.
  • Salvaguardas de cuota, registro de auditoría con redacción, scripts de humo y cobertura de pruebas local.
  • Evaluaciones sintéticas de comportamiento de memoria para recuperación, aislamiento de alcance, aislamiento de inquilinos y regresiones del ciclo de vida de KG.

Evaluaciones de comportamiento de memoria

Usa el arnés de evaluación local antes/después de cambios en recuperación, contexto de activación o comportamiento de KG:

npm run eval:local
npm run eval:baseline

La evaluación remota opcional se omite de forma segura a menos que se configuren variables de entorno:

npm run eval:remote

Ver docs/BENCHMARKS.md. Estas son autoevaluaciones de MemHeaven con escenarios sintéticos, no afirma comparativas MemHeaven vs MemPalace.

Cómo difiere de MemPalace original

  • Preserva nombres de herramientas, modelo de alas/habitaciones/cajones, Protocolo de Memoria, diario, KG y conceptos de túnel cuando es práctico.
  • No preserva el runtime de Python, internos de ChromaDB, sincronización del sistema de archivos ni el comportamiento del hook de escritorio local.
  • Almacena cuerpos textuales de cajones y diarios en R2; D1 y Vectorize son índices/metadatos, no fuente de verdad.
  • Usa códigos de autorización JWT de corta duración más tokens de acceso y actualización con protección de repetición duradera en lugar de sesiones OAuth del lado del servidor.

Rutas públicas

MétodoRutaPropósito
GET/Información del servicio y mapa de endpoints
GET/healthEstado de capacidades de enlace/configuración/cuota
GET/.well-known/oauth-authorization-serverMetadatos del servidor de autorización OAuth
GET/.well-known/oauth-protected-resourceMetadatos de recurso protegido
GET/.well-known/oauth-protected-resource/mcpMetadatos de recurso protegido MCP
POST/registerRegistro dinámico de clientes
GET / POST/authorizePágina de consentimiento y entrada de clave de acceso
POST/tokenIntercambio de código de autorización y token de actualización
GET / POST / DELETE/mcpEndpoint MCP HTTP Streamable autenticado

Herramientas

Las herramientas implementadas compatibles con MemPalace se agrupan por dominio a continuación. Cada herramienta se lista individualmente para que los índices de directorio puedan extraer su nombre y descripción.

Herramientas de lectura del palacio

  • mempalace_status — Diagnóstico y capacidades de backend para chats relevantes de memoria.
  • mempalace_wake_context — Inicia un chat relevante de memoria con contexto de inicio acotado y con privacidad.
  • mempalace_list_wings — Lista alas con ámbito de inquilino y conteos activos de cajones.
  • mempalace_list_rooms — Lista habitaciones con ámbito de inquilino y conteos activos de cajones para un ala o todas las alas.
  • mempalace_get_taxonomy — Devuelve la taxonomía actual de alas y habitaciones con ámbito de inquilino.
  • mempalace_get_aaak_spec — Devuelve orientación compacta para notas de memoria concisas y legibles.
  • mempalace_search — Busca cajones con ámbito de inquilino con recuperación híbrida semántica y léxica.
  • mempalace_check_duplicate — Comprueba duplicados exactos o semánticos antes de escribir memoria.
  • mempalace_get_drawer — Obtiene un cajón con ámbito de inquilino con contenido acotado y procedencia.
  • mempalace_list_drawers — Lista cajones activos con ámbito de inquilino con filtros opcionales de ala y habitación.

Herramientas de escritura del palacio

  • mempalace_add_drawer — Añade contenido duradero de cajón y lo indexa semánticamente.
  • mempalace_update_drawer — Actualiza un cajón y reindexa el contenido o metadatos cambiados.
  • mempalace_delete_drawer — Elimina suavemente un cajón con ámbito de inquilino y elimina sus entradas de índice semántico.

Herramientas de diario

  • mempalace_diary_write — Escribe una entrada de diario concisa y la indexa para búsqueda acotada.
  • mempalace_diary_read — Lee entradas de diario recientes con filtros opcionales de ala y habitación.
  • mempalace_diary_search — Busca entradas de diario para un agente explícito con filtros de alcance estrictos.
  • mempalace_diary_reindex — Rellena o actualiza las filas de índice semántico del diario para el inquilino.

Herramientas de grafo de conocimiento

  • mempalace_kg_query — Consulta hechos de grafo de conocimiento temporal con ámbito de inquilino.
  • mempalace_kg_check — Ejecuta comprobaciones de confiabilidad deterministas para conflictos activos de KG y hechos obsoletos.
  • mempalace_kg_add — Añade un hecho de grafo de conocimiento temporal con ámbito de inquilino.
  • mempalace_kg_invalidate — Invalida un hecho de grafo de conocimiento exacto con ámbito de inquilino.
  • mempalace_kg_timeline — Muestra la línea de tiempo reciente del grafo de conocimiento para una entidad o todos los hechos.
  • mempalace_kg_stats — Devuelve estadísticas del grafo de conocimiento con ámbito de inquilino.

Herramientas de navegación y grafo

  • mempalace_traverse — Recorre el grafo de salas compartidas del inquilino y los túneles explícitos.
  • mempalace_find_tunnels — Encuentra salas compartidas entre alas (cross-wing) con ámbito de inquilino que se comportan como túneles pasivos.
  • mempalace_graph_stats — Devuelve estadísticas del grafo, salas compartidas y túneles explícitos con ámbito de inquilino.
  • mempalace_create_tunnel — Crea un túnel explícito con ámbito de inquilino entre ubicaciones de ala y sala.
  • mempalace_list_tunnels — Lista los túneles explícitos con ámbito de inquilino, opcionalmente filtrados por ala de extremo.
  • mempalace_delete_tunnel — Elimina un túnel explícito con ámbito de inquilino por su ID.
  • mempalace_follow_tunnels — Sigue los túneles explícitos conectados a una ubicación de ala y sala.

Adaptaciones de despliegue

  • mempalace_hook_settings — Devuelve la política de guardado configurada para este despliegue.
  • mempalace_memories_filed_away — Devuelve el estado de archivo de escritura más reciente con ámbito de inquilino.
  • mempalace_reconnect — Devuelve la salud del enlace y del índice configurados.
  • mempalace_sync — Informa que la sincronización local con el sistema de archivos y git no es compatible en modo alojado.

Este MVP omite intencionadamente los alias genéricos search / fetch para evitar duplicar la superficie principal de MemPalace, a menos que la experiencia del conector demuestre que se necesitan más adelante.

Todas las herramientas MCP expuestas también publicitan metadatos estructurados outputSchema para que ChatGPT y otros clientes MCP puedan entender mejor los resultados exitosos de las herramientas de tools/list.

Prerrequisitos

  • Node.js 20+
  • npm 10+
  • Cuenta de Cloudflare con Workers, D1, R2, Vectorize y Workers AI habilitados
  • wrangler autenticado contra la cuenta de Cloudflare de destino

Inicio rápido

Este es el camino feliz más rápido para autoalojar MemHeaven.

  1. Instalar dependencias:

    npm install
    
  2. Elegir la URL base pública. Esta debe ser solo el origen; no incluyas /mcp.

    • Ejemplo de Workers.dev: https://memheaven.<your-workers-subdomain>.workers.dev
    • Ejemplo de dominio personalizado: https://memory.example.com

    Elige el origen público final que realmente planeas seguir usando. Cambiar el origen público más adelante cambia la identidad del emisor/cliente OAuth y forzará a clientes alojados como ChatGPT a reconectarse.

  3. Crear la configuración local de Wrangler:

    cp wrangler.toml.example wrangler.toml
    
  4. Crear los recursos de Cloudflare, parchear wrangler.toml y aplicar las migraciones remotas:

    npm run init -- --base-url https://memheaven.<your-workers-subdomain>.workers.dev
    
  5. Generar material de secreto válido:

    npm run secrets:generate
    
  6. Subir los secretos generados:

    npx wrangler secret put JWT_SIGNING_SECRET
    npx wrangler secret put TOKEN_ENCRYPTION_KEY
    npx wrangler secret put AUTH_KEY_PEPPER
    
  7. Generar tu primera clave de acceso y sincronizar ACCESS_KEYS_JSON:

    export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
    npm run keygen -- --tenant personal --label "Personal"
    
  8. Validar localmente y luego desplegar:

    npm run lint
    npm run typecheck
    npm test
    npm run build
    npx wrangler deploy --dry-run --outdir .tmp/wrangler-bundle
    npx wrangler deploy
    

Arrancar los recursos de Cloudflare

cp wrangler.toml.example wrangler.toml
npm run init -- --base-url https://memheaven.<your-workers-subdomain>.workers.dev

npm run init ahora:

  • verifica la autenticación de Wrangler
  • crea o reutiliza la base de datos D1, el bucket R2 y el índice Vectorize definidos en wrangler.toml local
  • crea los índices de metadatos Vectorize requeridos (tenant_id, wing, room, kind, agent_name, topic)
  • parchea el bloque [[d1_databases]] correspondiente en wrangler.toml con el database_id real de D1
  • parchea OAUTH_ISSUER, MCP_RESOURCE y MCP_AUDIENCE cuando se proporciona --base-url
  • aplica las migraciones remotas de D1 por defecto

wrangler.toml está intencionadamente en gitignore porque npm run init -- --base-url ... parchea valores de despliegue específicos de la cuenta. Confirma los cambios en wrangler.toml.example cuando los valores por defecto cambien.

Variantes útiles:

npm run init -- --dry-run
npm run init -- --skip-migrations
npm run init -- --base-url https://memory.example.com

Después del arranque, continúa con la configuración de secretos y claves de acceso que se indica a continuación. Si más adelante vinculas un dominio personalizado, vuelve a ejecutar npm run init -- --base-url https://memory.example.com o actualiza manualmente las tres variables de OAuth/MCP en wrangler.toml y vuelve a desplegar.

Configurar secretos

Genera secretos válidos:

npm run secrets:generate

Esto imprime JSON con valores válidos para:

  • JWT_SIGNING_SECRET
  • TOKEN_ENCRYPTION_KEY
  • AUTH_KEY_PEPPER

Guárdalos con Wrangler:

npx wrangler secret put JWT_SIGNING_SECRET
npx wrangler secret put TOKEN_ENCRYPTION_KEY
npx wrangler secret put AUTH_KEY_PEPPER

Genera una clave de acceso y mantén automáticamente el almacén de claves local en gitignore más el secreto ACCESS_KEYS_JSON de Cloudflare:

export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant personal --label "Personal"

Por defecto, este comando:

  • agrega el nuevo registro de clave con hash en .tmp/access-keys.json
  • sube el arreglo JSON completo combinado al secreto de Worker ACCESS_KEYS_JSON usando npx wrangler secret put
  • imprime la nueva clave en bruto una vez para que puedas pegarla en el formulario de consentimiento

Si solo quieres actualizar el archivo local en gitignore sin tocar Cloudflare todavía:

export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant personal --label "Personal" --no-sync

Si quieres un archivo local personalizado, debe permanecer bajo .tmp/:

export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant personal --label "Personal" --file .tmp/my-access-keys.json --no-sync

El archivo local solo almacena registros con hash, nunca claves en bruto. Guarda la clave en bruto impresa en un lugar seguro de inmediato porque no se escribe en el disco.

Rotación de claves

  1. Ejecuta npm run keygen -- --tenant <tenant> --label <label> para agregar un nuevo registro activo.
  2. Mueve los clientes a la nueva clave en bruto.
  3. Marca el registro antiguo como inactivo o elimínalo de .tmp/access-keys.json.
  4. Vuelve a subir el arreglo JSON completo con npx wrangler secret put ACCESS_KEYS_JSON si editaste el archivo manualmente.

Eliminar o desactivar una clave invalida los tokens de acceso/refresco existentes para esa clave en la próxima verificación de /mcp o de token de refresco.

Si rotas AUTH_KEY_PEPPER, cada clave de acceso en bruto existente se vuelve inválida porque los hashes se calculan desde raw_key + AUTH_KEY_PEPPER. Después de cambiar el pimiento, regenera todas las claves de acceso y sincroniza un ACCESS_KEYS_JSON fresco.

Aplicar migraciones de D1 manualmente (opcional)

npm run init ya aplica migraciones remotas por defecto. Si las omites durante el arranque o necesitas volver a ejecutarlas más tarde, Wrangler v4 configura los comandos de D1 en modo local por defecto, así que usa --remote explícitamente para la base de datos desplegada.

npx wrangler d1 migrations apply memheaven_memory --remote

Modelo de clave de acceso multiinquilino

  • Cada clave de acceso pertenece exactamente a un tenant_id.
  • tenant_id se deriva solo del token de portador verificado; las herramientas MCP nunca aceptan la selección de inquilino desde la entrada de la herramienta.
  • Cada ID de clave activa debe ser globalmente único entre todos los inquilinos.
  • Cada hash de clave debe ser único; no reutilices la misma clave en bruto para múltiples inquilinos.
  • Los ámbitos de token efectivos están limitados por el registro de clave activo actual, por lo que reducir los ámbitos de una clave también reduce los permisos de tokens de acceso/refresco futuros.
  • Las consultas a D1 incluyen tenant_id, las claves de R2 tienen el prefijo tenants/{tenant_id}/..., las consultas a Vectorize filtran por tenant_id, y los resultados de Vectorize se vuelven a verificar contra D1 antes de devolver el contenido.

Agregar otro inquilino:

export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant family-member --label "Family member"
npx wrangler deploy

La salida del nuevo comando imprime un raw_key diferente. Entrega esa clave solo a ese inquilino. Sus cajones, entradas de diario, hechos KG y túneles están aislados del inquilino personal.

Lista de verificación recomendada para el operador antes de compartir una segunda clave:

  1. Crea una nueva clave en bruto y un id único.
  2. Asigna exactamente un tenant_id.
  3. Mantén solo los ámbitos mínimos necesarios (memory.read, memory.write).
  4. Despliega y valida que el inquilino A y el inquilino B no puedan ver los cajones, entradas de diario, hechos KG o túneles del otro.

Validación local

npm run lint
npm run typecheck
npm test
npm run build
npx wrangler deploy --dry-run --outdir .tmp/wrangler-bundle

Notas:

  • npm run build emite los artefactos de compilación del Worker a .tmp/dist.
  • wrangler deploy --dry-run --outdir .tmp/wrangler-bundle valida el paquete de despliegue sin cambiar el estado de producción.

Despliegue

Antes de desplegar, asegúrate de que:

  • wrangler.toml exista localmente y npm run init -- --base-url <public-origin> lo haya parcheado con el ID de D1 correcto y las URLs de OAuth/MCP.
  • JWT_SIGNING_SECRET, TOKEN_ENCRYPTION_KEY, AUTH_KEY_PEPPER y ACCESS_KEYS_JSON estén configurados con npx wrangler secret put ....
  • La URL del conector que planeas ingresar en tu cliente sea exactamente <public-origin>/mcp.
npx wrangler deploy --dry-run --outdir .tmp/wrangler-bundle
npx wrangler deploy

Configuración de ChatGPT

  1. Agrega el conector usando https://memory.example.com/mcp o tu URL de workers.dev /mcp.
  2. ChatGPT realiza el descubrimiento OAuth y el registro dinámico de clientes automáticamente.
  3. En /authorize, ingresa un raw_key válido impreso por npm run keygen.
  4. Aprueba el conector.
  5. ChatGPT usará tokens de portador contra /mcp.
  6. Opcionalmente, agrega la breve instrucción de memoria de agente a las instrucciones personalizadas de ChatGPT para que sepa cuándo comenzar desde MemHeaven.

ChatGPT ha sido verificado manualmente de extremo a extremo para la URL /mcp de MemHeaven, el flujo de autorización OAuth y una llamada de herramienta mempalace_status. Esto confirma la ruta principal de cliente alojado sin afirmar que cada plan o espacio de trabajo de ChatGPT admita conectores MCP personalizados.

Las URI de redirección están restringidas intencionalmente a los contratos de callback documentados de ChatGPT y Claude, más flujos genéricos de loopback en localhost. Los hosts no OAuth solo pueden funcionar cuando pueden llamar a /mcp con Authorization: Bearer <token>.

Scripts de humo

Humo de descubrimiento OAuth:

npm run smoke:oauth -- --base https://your-domain.example

Humo MCP autenticado:

export MEMHEAVEN_BEARER_TOKEN='<bearer-token>'
npm run smoke:mcp -- --base https://your-domain.example

Ayudante de reindexación de metadatos vectoriales:

npm run reindex -- --base https://your-domain.example --dry-run
npm run reindex -- --base https://your-domain.example
npm run reindex -- --kind diary --base https://your-domain.example --dry-run
npm run reindex -- --kind all --base https://your-domain.example

Usa el ayudante de reindexación si creaste índices de metadatos Vectorize después de que los datos ya hubieran sido incrustados e insertados. Después de actualizar un despliegue existente a la búsqueda semántica de diario, ejecuta npm run init para asegurarte de que los índices de metadatos Vectorize agent_name y topic existan, luego ejecuta npm run reindex -- --kind diary --base https://your-domain.example para rellenar las entradas de diario existentes desde R2 hacia diary_chunks y Vectorize. Usa --kind all cuando tanto los vectores de cajón como de diario deban actualizarse.

Solución de problemas

  • 401 invalid_token en /mcp: token expirado, clave eliminada o token de portador faltante.
  • authorization failed / wrong key: asegúrate de que la clave en bruto se generó con el mismo AUTH_KEY_PEPPER que está desplegado como secreto del Worker, y que npm run keygen sincronizó el último ACCESS_KEYS_JSON.
  • 406 Not Acceptable en /mcp: el cliente debe enviar Accept: application/json, text/event-stream.
  • 503 de /health: un secreto o enlace requerido falta o es inválido.
  • Quota exceeded: espera el reinicio de UTC o aumenta los límites por inquilino configurados.
  • Problemas de búsqueda/índice después del despliegue de índices de metadatos: vuelve a ejecutar npm run init para asegurar los índices de metadatos, luego vuelve a ejecutar npm run reindex ...; usa --kind diary o --kind all cuando la búsqueda semántica de diario se agregó después de que ya existieran entradas de diario.
  • OAuth local en el navegador en http://127.0.0.1/localhost: la cookie CSRF /authorize es intencionadamente no segura en modo HTTP local para que el navegador pueda devolverla en el POST de consentimiento.
  • La búsqueda semántica inmediatamente posterior a la escritura puede devolver vacío brevemente mientras Vectorize termina de indexar; reintenta poco después si una entrada de cajón o diario recién agregada aún no es buscable.
  • wrangler whoami parece no autenticado en envoltorios/HOME personalizados: verifica npx wrangler whoami plano en tu shell normal antes de asumir que falta el inicio de sesión.

Prueba de humo de aislamiento de inquilinos

Después de agregar un segundo inquilino, valida el aislamiento manualmente:

  1. Conéctate a ChatGPT con la clave en bruto del inquilino A y agrega un cajón único.
  2. Conéctate en un perfil/sesión separado de ChatGPT con la clave en bruto del inquilino B.
  3. Confirma que el inquilino B no pueda encontrar la frase única del inquilino A con mempalace_search.
  4. Confirma que el inquilino B no pueda recuperar el drawer_id del inquilino A con mempalace_get_drawer.
  5. Repite para diario/KG/túneles si usas esas características.

El servicio no confía en la información del inquilino proporcionada por el cliente; el aislamiento proviene del token de portador verificado y de los filtros de inquilino en la capa de almacenamiento.

Limitaciones

  • Sin compatibilidad con ChromaDB o SQLite local.
  • Sin sincronización local con el sistema de archivos; mempalace_sync no es compatible intencionadamente en modo alojado.
  • Los códigos de autorización son de corta duración y de un solo uso.
  • Los tokens de refresco rotan con detección de reproducción. Eliminar o desactivar la clave de acceso subyacente aún invalida las comprobaciones futuras de tokens para esa clave.
  • Las incrustaciones usan @cf/baai/bge-small-en-v1.5, por lo que los cuerpos de cajón largos se dividen en fragmentos antes de indexar.
  • Las dimensiones de Vectorize están fijadas al índice configurado (384 para la configuración predeterminada del MVP).
  • El soporte de callbacks para clientes alojados se mantiene limitado y basado en contratos. Otros clientes pueden necesitar adiciones explícitas en la lista de permitidos de callbacks antes de funcionar de extremo a extremo.

Documentación relacionada

  • docs/GETTING_STARTED_FROM_ZERO.md
  • docs/CLIENT_COMPATIBILITY.md
  • docs/AGENT_MEMORY_PROTOCOL.md
  • docs/SECURITY.md
  • docs/PRODUCT_REQUIREMENTS.md
  • docs/IMPLEMENTATION_PLAN.md
  • docs/PROJECT_STATE.md
  • docs/DECISIONS.md

Licencia

MIT. Ver LICENSE.