MemHeaven
Servidor de memória MCP remoto auto-hospedado para ChatGPT e agentes de IA.
Documentação

MemHeaven
MemHeaven é um servidor de memória MCP remoto auto-hospedado para ChatGPT e outros agentes de IA em nuvem.
Ele oferece aos clientes de IA hospedados memória de longo prazo pesquisável que você controla, implantada no Cloudflare. MemHeaven é inspirado no modelo de memória de longo prazo do MemPalace, usando um formato de implantação remota para clientes hospedados.
Implante em uma conta gratuita do Cloudflare. Sem VM, sem Docker, sem administração de banco de dados.
Os limites do plano gratuito se aplicam; uso intenso pode exigir cobrança paga do Cloudflare.
Links rápidos: Quickstart · Começando do zero · Configuração do ChatGPT · Compatibilidade de clientes · Modelo de segurança · Avaliações de comportamento
Qual problema ele resolve
Assistentes de IA são úteis no momento, mas frequentemente esquecem o contexto do projeto entre chats, sessões e ferramentas.
Recursos de memória integrados podem ajudar, mas geralmente pertencem ao provedor e não são a mesma coisa que uma camada de memória inspecionável e pesquisável que você controla. Ferramentas de memória local-first também são poderosas, mas clientes hospedados como ChatGPT e outros agentes remotos precisam de um servidor MCP remoto.
MemHeaven é para pessoas que desejam:
- memória pesquisável que pertence a elas
- contexto armazenado inspecionável e deletável
- continuidade para agentes de codificação e outros fluxos de trabalho de IA entre sessões
- um formato de implantação MCP remoto em vez de uma configuração apenas no laptop
Quando o MemHeaven se encaixa
Escolha MemHeaven quando um cliente hospedado ou agente de IA precisar de uma camada de memória pesquisável que persista fora do chat atual:
- O ChatGPT precisa recuperar decisões de projeto, preferências, notas ou outro contexto durável entre chats.
- Um cliente MCP remoto não pode depender de um serviço de memória rodando apenas no seu laptop.
- Usuários ou fluxos de trabalho separados precisam de acesso com escopo de locatário ao contexto armazenado.
- Você quer inspecionar, pesquisar e excluir os registros mantidos pela sua própria implantação.
Memória externa, não um substituto para a memória do ChatGPT
MemHeaven não altera a memória integrada do ChatGPT. É um serviço MCP separado protegido por OAuth que seu cliente pode chamar para obter contexto armazenado na sua própria implantação. Não há instância pública compartilhada do MemHeaven: você opera o Worker, os bindings de armazenamento, a configuração OAuth e as chaves de acesso na sua conta Cloudflare.
Memória de longo prazo do ChatGPT via MCP remoto
Se você quer que o ChatGPT use uma camada de memória pesquisável entre chats sem colocar essa memória em um serviço de terceiros compartilhado, implante MemHeaven na sua própria conta Cloudflare e conecte o ChatGPT ao endpoint /mcp da sua instância. Essa memória externa complementa a memória integrada do ChatGPT: você pode inspecionar, pesquisar e excluir os registros armazenados pela sua própria implantação. Consulte a configuração do ChatGPT e o modelo de segurança antes de conectar um cliente.
Por que o MemHeaven existe
- Assistentes de IA esquecem o contexto do projeto entre chats e sessões.
- A memória integrada é útil, mas geralmente pertence ao provedor e não é uma camada de memória exata e pesquisável.
- Ferramentas de memória local-first são poderosas, mas clientes hospedados precisam de MCP remoto.
- Usuários querem memória inspecionável, pesquisável, deletável e portátil.
- Agentes de codificação precisam de continuidade entre sessões, editores e ferramentas.
Conta gratuita do Cloudflare é suficiente para uso pessoal
MemHeaven é projetado para uso pessoal e pequenos grupos confiáveis em serviços gerenciados pelo Cloudflare.
- Worker executa o servidor HTTP.
- D1 armazena metadados relacionais e índices.
- R2 armazena os corpos de gavetas e diários.
- Vectorize alimenta a busca semântica vetorial.
- Workers AI gera embeddings.
Isso significa:
- sem VM
- sem Docker
- sem administração de banco de dados
- sem processo de servidor de longa execução
Os limites do plano gratuito se aplicam. MemHeaven não promete uso gratuito ilimitado, uptime empresarial ou custo zero sob qualquer carga de trabalho. Observe também que alguns serviços subjacentes do Cloudflare, especialmente Vectorize, têm seus próprios planos e restrições de uso, então revise os preços atuais do Cloudflare antes de uma implantação ampla.
Caminho feliz mais rápido
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
Depois conecte seu cliente hospedado a:
https://memheaven.<your-workers-subdomain>.workers.dev/mcp
Quando a página de autorização abrir, cole o raw_key impresso.
Se você quiser a versão com mais orientação, use docs/GETTING_STARTED_FROM_ZERO.md.
Clientes suportados / esperados
| Cliente | Status | Notas |
|---|---|---|
| ChatGPT | Confirmado | Verificado manualmente de ponta a ponta para a URL /mcp, fluxo de autorização OAuth e uma chamada de ferramenta mempalace_status |
| Conectores hospedados do Claude.ai | Esperado | O callback hospedado exato conhecido está na allowlist, mas a documentação pública não expõe a URL e a verificação de ponta a ponta ainda é necessária |
| Clientes MCP locais de IDE / CLI | Esperado | Callbacks OAuth de loopback genéricos localhost / 127.0.0.1 / [::1] já são permitidos |
| VS Code / GitHub Copilot MCP | Esperado para loopback local; OAuth hospedado desconhecido | Callbacks localhost genéricos estão na allowlist; nenhum callback hospedado exato vscode.dev está pré-autorizado atualmente |
| Grok / xAI | Esperado com autenticação bearer/header | Trate como uma integração Authorization: Bearer <OAuth access token> para /mcp, não como um alvo de allowlist de callback OAuth hospedado |
| Perplexity / Abacus | Não aplicável / Desconhecido | Nenhum contrato de callback de cliente hospedado confirmado está na allowlist |
Detalhes completos: docs/CLIENT_COMPATIBILITY.md
Instrução de memória para agentes
Use MemHeaven de forma conservadora para gravações e proativamente para leituras quando o contexto anterior for importante. As ferramentas MCP retornam suas próprias orientações detalhadas, então a instrução para ChatGPT/agentes personalizados pode ser curta.
Instrução copiável 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.
Guia completo: docs/AGENT_MEMORY_PROTOCOL.md
Inspirado no MemPalace
MemHeaven é inspirado no MemPalace, o projeto de memória de IA local-first de código aberto que ajudou a mostrar como a memória de longo prazo verbatim e pesquisável pode ser útil para agentes de IA.
MemPalace fez um forte argumento para manter o contexto original e organizá-lo em uma estrutura de memória navegável. MemHeaven explora um formato de implantação diferente: memória MCP remota para clientes hospedados e configurações compartilhadas confiáveis.
Vemos isso como complementar à abordagem no-dispositivo do MemPalace, não um substituto.
Como funciona em alto nível
- Um Cloudflare Worker expõe endpoints OAuth e o endpoint
/mcpautenticado. - Clientes de IA hospedados se conectam via Streamable HTTP MCP.
- D1 armazena metadados, índices, fatos KG, túneis, cotas e linhas de auditoria.
- R2 armazena corpos verbatim completos de gavetas e diários.
- Workers AI gera embeddings.
- Vectorize realiza busca semântica sobre conteúdo de memória em chunks.
- Chaves de acesso controlam a autorização e mapeiam usuários para memória com escopo de locatário.
Documentação
docs/GETTING_STARTED_FROM_ZERO.mddocs/CLIENT_COMPATIBILITY.mddocs/AGENT_MEMORY_PROTOCOL.mddocs/SECURITY.md
O que está incluído
- OAuth 2.1 + PKCE + registro dinâmico de clientes para MCP remoto compatível com ChatGPT.
- Página de consentimento protegida por chave de acesso com artefatos de autenticação JWT sem estado.
- Armazenamento de gavetas, diários, grafo de conhecimento e túneis com escopo de locatário.
- Servidor MCP Streamable HTTP usando
WebStandardStreamableHTTPServerTransportcom bootstrap sem estado por requisição. - Superfície de ferramentas
mempalace_*compatível com MemPalace, incluindo ferramentas locais adaptadas. - Busca semântica segura para Worker usando embeddings Workers AI + Vectorize + hidratação R2/D1.
- Salvaguardas de cota, registro de auditoria com dados redigidos, scripts de smoke e cobertura de testes locais.
- Avaliações de comportamento de memória sintéticas para recuperação, isolamento de escopo, isolamento de locatário e regressões de ciclo de vida KG.
Avaliações de comportamento de memória
Use o harness de avaliação local antes/depois de mudanças de recuperação, contexto de wake ou comportamento KG:
npm run eval:local
npm run eval:baseline
O smoke/avaliação remoto opcional é ignorado com segurança, a menos que seja configurado com variáveis de ambiente:
npm run eval:remote
Veja docs/BENCHMARKS.md. Estas são autoavaliações do MemHeaven com fixtures sintéticas, não alegações de benchmark MemHeaven-vs-MemPalace.
Como isso difere do MemPalace upstream
- Preserva nomes de ferramentas, modelo de wings/rooms/drawers, Memory Protocol, diário, KG e conceitos de túneis onde for prático.
- Não preserva o runtime Python, internals do ChromaDB, sincronização de sistema de arquivos ou comportamento de hook de desktop local.
- Armazena corpos verbatim de gavetas e diários no R2; D1 e Vectorize são índices/metadados, não fonte de verdade.
- Usa códigos de autorização JWT de curta duração mais tokens de acesso e refresh com proteção durável contra replay em vez de sessões OAuth no servidor.
Rotas públicas
| Método | Caminho | Propósito |
|---|---|---|
| GET | / | Informações do serviço e mapa de endpoints |
| GET | /health | Status de capacidade de binding/config/cota |
| GET | /.well-known/oauth-authorization-server | Metadados do servidor de autorização OAuth |
| GET | /.well-known/oauth-protected-resource | Metadados de recurso protegido |
| GET | /.well-known/oauth-protected-resource/mcp | Metadados de recurso protegido MCP |
| POST | /register | Registro dinâmico de clientes |
| GET / POST | /authorize | Página de consentimento e entrada de chave de acesso |
| POST | /token | Troca de código de autorização e token de refresh |
| GET / POST / DELETE | /mcp | Endpoint MCP Streamable HTTP autenticado |
Ferramentas
As ferramentas compatíveis com MemPalace implementadas estão agrupadas por domínio abaixo. Cada ferramenta é listada individualmente para que índices de diretório possam extrair seu nome e descrição.
Ferramentas de leitura do Palace
mempalace_status— Diagnóstico e capacidades de backend para chats relevantes à memória.mempalace_wake_context— Iniciar um chat relevante à memória com contexto de inicialização limitado e com privacidade protegida.mempalace_list_wings— Listar wings com escopo de locatário e contagens ativas de gavetas.mempalace_list_rooms— Listar rooms com escopo de locatário e contagens ativas de gavetas para uma wing ou todas.mempalace_get_taxonomy— Retornar a taxonomia atual de wing e room com escopo de locatário.mempalace_get_aaak_spec— Retornar orientação compacta para notas de memória concisas e legíveis.mempalace_search— Pesquisar gavetas com escopo de locatário com recuperação híbrida semântica e lexical.mempalace_check_duplicate— Verificar duplicatas exatas ou semânticas antes de gravar memória.mempalace_get_drawer— Buscar uma gaveta com escopo de locatário com conteúdo limitado e proveniência.mempalace_list_drawers— Listar gavetas ativas com escopo de locatário com filtros opcionais de wing e room.
Ferramentas de gravação do Palace
mempalace_add_drawer— Adicionar conteúdo durável de gaveta e indexá-lo semanticamente.mempalace_update_drawer— Atualizar uma gaveta e reindexar conteúdo ou metadados alterados.mempalace_delete_drawer— Exclusão suave de uma gaveta com escopo de locatário e remoção de suas entradas de índice semântico.
Ferramentas de diário
mempalace_diary_write— Gravar uma entrada de diário concisa e indexá-la para busca com escopo.mempalace_diary_read— Ler entradas recentes de diário com filtros opcionais de wing e room.mempalace_diary_search— Pesquisar entradas de diário para um agente explícito com filtros de escopo rígidos.mempalace_diary_reindex— Preencher ou atualizar linhas de índice semântico do diário para o locatário.
Ferramentas de grafo de conhecimento
mempalace_kg_query— Consultar fatos temporais do grafo de conhecimento com escopo de locatário.mempalace_kg_check— Executar verificações determinísticas de confiabilidade para conflitos KG ativos e fatos desatualizados.mempalace_kg_add— Adicionar um fato temporal do grafo de conhecimento com escopo de locatário.mempalace_kg_invalidate— Invalidar um fato exato do grafo de conhecimento com escopo de locatário.mempalace_kg_timeline— Mostrar a linha do tempo recente do grafo de conhecimento para uma entidade ou todos os fatos.mempalace_kg_stats— Retornar estatísticas do grafo de conhecimento com escopo de locatário.
Ferramentas de navegação e grafo
mempalace_traverse— Percorrer o grafo de salas compartilhadas do tenant e túneis explícitos.mempalace_find_tunnels— Encontrar salas compartilhadas entre alas com escopo de tenant que se comportam como túneis passivos.mempalace_graph_stats— Retornar estatísticas de grafo, salas compartilhadas e túneis explícitos com escopo de tenant.mempalace_create_tunnel— Criar um túnel explícito com escopo de tenant entre locais de ala e sala.mempalace_list_tunnels— Listar túneis explícitos com escopo de tenant, opcionalmente filtrados pela ala de endpoint.mempalace_delete_tunnel— Excluir um túnel explícito com escopo de tenant por ID.mempalace_follow_tunnels— Seguir túneis explícitos conectados a um local de ala e sala.
Adaptações de implantação
mempalace_hook_settings— Retornar a política de salvamento configurada para esta implantação.mempalace_memories_filed_away— Retornar o status mais recente de arquivamento de gravação com escopo de tenant.mempalace_reconnect— Retornar a saúde configurada de binding e índice.mempalace_sync— Relatar que a sincronização local de sistema de arquivos e git não é suportada no modo hospedado.
Este MVP omite intencionalmente aliases genéricos search / fetch para evitar duplicar a superfície primária do MemPalace, a menos que a experiência do conector prove que eles são necessários posteriormente.
Todas as ferramentas MCP expostas também anunciam metadados estruturados outputSchema para que o ChatGPT e outros clientes MCP possam entender melhor os resultados bem-sucedidos de ferramentas do tools/list.
Pré-requisitos
- Node.js 20+
- npm 10+
- Conta Cloudflare com Workers, D1, R2, Vectorize e Workers AI habilitados
wranglerautenticado contra a conta Cloudflare de destino
Início rápido
Este é o caminho feliz mais rápido para auto-hospedar o MemHeaven.
-
Instale as dependências:
npm install -
Escolha a URL base pública. Deve ser apenas a origem; não inclua
/mcp.- Exemplo Workers.dev:
https://memheaven.<your-workers-subdomain>.workers.dev - Exemplo de domínio personalizado:
https://memory.example.com
Escolha a origem pública final que você realmente planeja continuar usando. Alterar a origem pública posteriormente altera a identidade do emissor/cliente OAuth e forçará clientes hospedados como o ChatGPT a reconectar.
- Exemplo Workers.dev:
-
Crie a configuração local do Wrangler:
cp wrangler.toml.example wrangler.toml -
Crie recursos Cloudflare, aplique patch em
wrangler.tomle aplique migrações remotas:npm run init -- --base-url https://memheaven.<your-workers-subdomain>.workers.dev -
Gere material de segredo válido:
npm run secrets:generate -
Envie os segredos gerados:
npx wrangler secret put JWT_SIGNING_SECRET npx wrangler secret put TOKEN_ENCRYPTION_KEY npx wrangler secret put AUTH_KEY_PEPPER -
Gere sua primeira chave de acesso e sincronize
ACCESS_KEYS_JSON:export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>' npm run keygen -- --tenant personal --label "Personal" -
Valide localmente e depois implante:
npm run lint npm run typecheck npm test npm run build npx wrangler deploy --dry-run --outdir .tmp/wrangler-bundle npx wrangler deploy
Inicializar recursos Cloudflare
cp wrangler.toml.example wrangler.toml
npm run init -- --base-url https://memheaven.<your-workers-subdomain>.workers.dev
npm run init agora:
- verifica a autenticação do Wrangler
- cria ou reutiliza o banco de dados D1, o bucket R2 e o índice Vectorize definidos em
wrangler.tomllocal - cria os índices de metadados Vectorize necessários (
tenant_id,wing,room,kind,agent_name,topic) - aplica patch no bloco
[[d1_databases]]correspondente emwrangler.tomlcom odatabase_idD1 real - aplica patch em
OAUTH_ISSUER,MCP_RESOURCEeMCP_AUDIENCEquando--base-urlé fornecido - aplica migrações remotas D1 por padrão
wrangler.toml é intencionalmente ignorado pelo git porque npm run init -- --base-url ... aplica patch em valores de implantação específicos da conta. Confirme alterações em wrangler.toml.example quando os padrões mudarem.
Variantes úteis:
npm run init -- --dry-run
npm run init -- --skip-migrations
npm run init -- --base-url https://memory.example.com
Após a inicialização, continue com a configuração de segredos e chave de acesso abaixo. Se você vincular um domínio personalizado posteriormente, execute novamente npm run init -- --base-url https://memory.example.com ou atualize manualmente as três variáveis OAuth/MCP em wrangler.toml e reimplante.
Configurar segredos
Gere segredos válidos:
npm run secrets:generate
Isso imprime JSON com valores válidos para:
JWT_SIGNING_SECRETTOKEN_ENCRYPTION_KEYAUTH_KEY_PEPPER
Armazene-os com o Wrangler:
npx wrangler secret put JWT_SIGNING_SECRET
npx wrangler secret put TOKEN_ENCRYPTION_KEY
npx wrangler secret put AUTH_KEY_PEPPER
Gere uma chave de acesso e mantenha automaticamente o armazenamento de chaves local ignorado pelo git, além do segredo ACCESS_KEYS_JSON do Cloudflare:
export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant personal --label "Personal"
Por padrão, este comando:
- anexa o novo registro de chave com hash em
.tmp/access-keys.json - envia o array JSON completo mesclado para o segredo do Worker
ACCESS_KEYS_JSONusandonpx wrangler secret put - imprime a nova chave bruta uma vez para que você possa colá-la no formulário de consentimento
Se você quiser apenas atualizar o arquivo local ignorado pelo git sem tocar no Cloudflare ainda:
export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant personal --label "Personal" --no-sync
Se você quiser um arquivo local personalizado, ele deve permanecer sob .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
O arquivo local armazena apenas registros com hash, nunca chaves brutas. Salve a chave bruta impressa em um local seguro imediatamente, pois ela não é gravada em disco.
Rotação de chaves
- Execute
npm run keygen -- --tenant <tenant> --label <label>para anexar um novo registro ativo. - Mova os clientes para a nova chave bruta.
- Marque o registro antigo como inativo ou remova-o de
.tmp/access-keys.json. - Reenvie o array JSON completo com
npx wrangler secret put ACCESS_KEYS_JSONse você editou o arquivo manualmente.
Remover ou desativar uma chave invalida tokens de acesso/atualização existentes para essa chave na próxima verificação de /mcp ou de token de atualização.
Se você rotacionar AUTH_KEY_PEPPER, toda chave de acesso bruta existente se torna inválida porque os hashes são calculados a partir de raw_key + AUTH_KEY_PEPPER. Após alterar o pepper, regenere todas as chaves de acesso e sincronize um novo ACCESS_KEYS_JSON.
Aplicar migrações D1 manualmente (opcional)
npm run init já aplica migrações remotas por padrão. Se você pular durante a inicialização ou precisar executá-las novamente posteriormente, o Wrangler v4 padroniza comandos D1 para o modo local, então use --remote explicitamente para o banco de dados implantado.
npx wrangler d1 migrations apply memheaven_memory --remote
Modelo de chave de acesso multi-tenant
- Cada chave de acesso pertence a exatamente um
tenant_id. tenant_idé derivado apenas do token de portador verificado; ferramentas MCP nunca aceitam seleção de tenant a partir da entrada da ferramenta.- Cada id de chave ativa deve ser globalmente único entre todos os tenants.
- Cada hash de chave deve ser único; não reutilize a mesma chave bruta para vários tenants.
- Escopos de token efetivos são limitados pelo registro de chave ativo atual, então restringir os escopos de uma chave também restringe permissões futuras de token de acesso/atualização.
- Consultas D1 incluem
tenant_id, chaves R2 são prefixadas comtenants/{tenant_id}/..., consultas Vectorize filtram portenant_ide resultados Vectorize são reverificados contra D1 antes que o conteúdo seja retornado.
Adicione outro tenant:
export AUTH_KEY_PEPPER='<same AUTH_KEY_PEPPER value>'
npm run keygen -- --tenant family-member --label "Family member"
npx wrangler deploy
A saída do novo comando imprime um raw_key diferente. Dê essa chave apenas para esse tenant. As gavetas, entradas de diário, fatos KG e túneis deles são isolados do tenant personal.
Checklist recomendado para o operador antes de compartilhar uma segunda chave:
- Crie uma nova chave bruta e um
idúnico. - Atribua exatamente um
tenant_id. - Mantenha apenas os escopos mínimos necessários (
memory.read,memory.write). - Implante e valide que o tenant A e o tenant B não podem ver as gavetas, entradas de diário, fatos KG ou túneis um do outro.
Validação local
npm run lint
npm run typecheck
npm test
npm run build
npx wrangler deploy --dry-run --outdir .tmp/wrangler-bundle
Notas:
npm run buildemite artefatos de build do Worker para.tmp/dist.wrangler deploy --dry-run --outdir .tmp/wrangler-bundlevalida o pacote de implantação sem alterar o estado de produção.
Implantar
Antes de implantar, certifique-se de que:
wrangler.tomlexiste localmente enpm run init -- --base-url <public-origin>aplicou patch com o id D1 correto e URLs OAuth/MCP.JWT_SIGNING_SECRET,TOKEN_ENCRYPTION_KEY,AUTH_KEY_PEPPEReACCESS_KEYS_JSONestão definidos comnpx wrangler secret put ....- A URL do conector que você planeja inserir no seu cliente é exatamente
<public-origin>/mcp.
npx wrangler deploy --dry-run --outdir .tmp/wrangler-bundle
npx wrangler deploy
Configuração do ChatGPT
- Adicione o conector usando
https://memory.example.com/mcpou sua URL/mcpdo workers.dev. - O ChatGPT realiza descoberta OAuth e registro dinâmico de cliente automaticamente.
- Em
/authorize, insira umraw_keyválido impresso pornpm run keygen. - Aprove o conector.
- O ChatGPT usará tokens de portador contra
/mcp. - Opcionalmente, adicione a breve instrução de memória do agente às instruções personalizadas do ChatGPT para que ele saiba quando começar a partir do MemHeaven.
O ChatGPT foi verificado manualmente de ponta a ponta para a URL /mcp do MemHeaven, o fluxo de autorização OAuth e uma chamada de ferramenta mempalace_status. Isso confirma o caminho principal de cliente hospedado sem afirmar que todo plano ou workspace do ChatGPT suporta conectores MCP personalizados.
URIs de redirecionamento são intencionalmente restritas a contratos de callback documentados do ChatGPT e Claude, além de fluxos genéricos de loopback localhost. Hosts não-OAuth só podem funcionar quando podem chamar /mcp com Authorization: Bearer <token>.
Scripts de fumaça
Fumaça de descoberta OAuth:
npm run smoke:oauth -- --base https://your-domain.example
Fumaça MCP autenticada:
export MEMHEAVEN_BEARER_TOKEN='<bearer-token>'
npm run smoke:mcp -- --base https://your-domain.example
Auxiliar de reindexação de metadados de vetor:
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
Use o auxiliar de reindexação se você criou índices de metadados Vectorize depois que os dados já foram incorporados e inseridos. Após atualizar uma implantação existente para pesquisa semântica de diário, execute npm run init para garantir que os índices de metadados Vectorize agent_name e topic existam, depois execute npm run reindex -- --kind diary --base https://your-domain.example para preencher entradas de diário existentes do R2 em diary_chunks e Vectorize. Use --kind all quando tanto vetores de gaveta quanto de diário devem ser atualizados.
Solução de problemas
401 invalid_tokenem/mcp: token expirado, chave removida ou token de portador ausente.authorization failed/wrong key: certifique-se de que a chave bruta foi gerada com o mesmoAUTH_KEY_PEPPERque está implantado como segredo do Worker e quenpm run keygensincronizou oACCESS_KEYS_JSONmais recente.406 Not Acceptableem/mcp: o cliente deve enviarAccept: application/json, text/event-stream.503de/health: um segredo ou binding obrigatório está ausente ou inválido.Quota exceeded: aguarde o reset UTC ou aumente os limites por tenant configurados.- Problemas de busca/índice após a implantação de índices de metadados: execute novamente
npm run initpara garantir índices de metadados, depois execute novamentenpm run reindex ...; use--kind diaryou--kind allquando a pesquisa semântica de diário foi adicionada depois que entradas de diário já existiam. - OAuth de navegador local em
http://127.0.0.1/localhost: o cookie CSRF/authorizeé intencionalmente não-Secure no modo HTTP local para que o navegador possa retorná-lo no POST de consentimento. - A pesquisa semântica imediatamente após a gravação pode retornar vazia brevemente enquanto o Vectorize termina a indexação; tente novamente em breve se uma gaveta ou entrada de diário recém-adicionada ainda não estiver pesquisável.
wrangler whoamiparece não autenticado sob wrappers/HOMEpersonalizado: verifiquenpx wrangler whoamisimples no seu shell normal antes de assumir que o login está ausente.
Teste de fumaça de isolamento de tenant
Após adicionar um segundo tenant, valide o isolamento manualmente:
- Conecte-se ao ChatGPT com a chave bruta do tenant A e adicione uma gaveta única.
- Conecte-se em um perfil/sessão separada do ChatGPT com a chave bruta do tenant B.
- Confirme que o tenant B não pode encontrar a frase única do tenant A com
mempalace_search. - Confirme que o tenant B não pode buscar o
drawer_iddo tenant A commempalace_get_drawer. - Repita para diário/KG/túneis se você usar esses recursos.
O serviço não confia em informações de tenant fornecidas pelo cliente; o isolamento vem do token de portador verificado e dos filtros de tenant na camada de armazenamento.
Limitações
- Sem compatibilidade com ChromaDB ou SQLite local.
- Sem sincronização de sistema de arquivos local;
mempalace_syncé intencionalmente não suportado no modo hospedado. - Códigos de autorização são de curta duração e uso único.
- Tokens de atualização rotacionam com detecção de replay. Remover ou desativar a chave de acesso subjacente ainda invalida verificações futuras de token para essa chave.
- Embeddings usam
@cf/baai/bge-small-en-v1.5, então corpos de gaveta longos são divididos em partes antes da indexação. - Dimensões do Vectorize são bloqueadas no índice configurado (
384para a configuração padrão do MVP). - O suporte a callback de cliente hospedado permanece estreito e orientado por contrato. Outros clientes podem precisar de adições explícitas à lista de permissões de callback antes de funcionarem de ponta a ponta.
Documentos relacionados
docs/GETTING_STARTED_FROM_ZERO.mddocs/CLIENT_COMPATIBILITY.mddocs/AGENT_MEMORY_PROTOCOL.mddocs/SECURITY.mddocs/PRODUCT_REQUIREMENTS.mddocs/IMPLEMENTATION_PLAN.mddocs/PROJECT_STATE.mddocs/DECISIONS.md
Licença
MIT. Veja LICENSE.