arra-memory-lab
Arra Memory Lab
Ein eigenständiges, Single-User-Cloudflare-Lab zum Erlernen der Verträge hinter vertrauenswürdigem KI-Gedächtnis: maßgebliche Quellen, neu aufbaubare Embeddings, evidenzgestützte Beobachtungen, überprüfbares hybrides Abrufen, begrenzte Spuren und Vorschau-vor-Änderung-Operationen.
Die Bereitstellung erstellt einen Worker, richtet automatisch seine D1-Datenbank aus wrangler.jsonc ein und führt die enthaltenen Migrationen über das Bereitstellungsskript aus. Workers AI liefert 768-dimensionale @cf/google/embeddinggemma-300m-Embeddings.
Was hier demonstriert wird
Autoritätsebenen: Erinnerungen sind maßgeblich; Chunks/Embeddings und Beobachtungen sind abgeleitet.
Ehrliches Abrufen: Jede Suche meldet den angeforderten Modus, den effektiven Modus, die Degradation und die Rang-Herkunft.
Evidenz-Abstammung: Beobachtungen behalten Quell-Erinnerungs-IDs, Revisionen und Hashes.
Sichere Mutation: Vergessen und Neuaufbau sind zuerst als Trockenlauf; die Vergessen-Bestätigung ist an die exakte Vorschau-Snapshot gebunden, und bestätigte Neuaufbau-Arbeit ist begrenzt.
Datenminimierung: Die neuesten 100 Suchspuren enthalten operative Metadaten, niemals Abfrage- oder Erinnerungsinhalte.
Spur-verknüpftes Abrufen: Ein Abruf gibt eine
traceIdzurück, wenn die Spuren-Persistenz erfolgreich ist; Snapshot-Ergebnisse mit Rangfolge behalten nur Erinnerungs-ID, Rang/Score-Herkunft, Quellrevision und Quell-Hash.Explizite Ablösung:
supersedesMemoryIdwird einmalig beim Schreiben in einen unveränderlichen ID/Revision/Hash-Snapshot aufgelöst. Es wird kein zeitlicher Graph abgeleitet.Kleine Herkunft:
project,sourcePathundcreatedBysind strukturierte Felder; eine Oracle-Identität bleibt einoracle-<name>-Tag.retrospectiveundcheatsheetsind erstklassige Erinnerungsarten.
Der Spuren-queryHash ist ein Korrelations-Handle, keine Anonymisierung – insbesondere bei Abfragen mit geringer Entropie –, daher bleibt der Spurenzugriff geschützt, auch wenn rohe Abfrage- und Erinnerungsinhalte weggelassen werden.
Related MCP server: Ghostkeep
Release-Identität
package.json ist die einzige Quelle der Wahrheit für das Bangkok-CalVer des Labs:
YY.M.D-alpha.HMM, wobei HMM = Stunde × 100 + Minute in Asia/Bangkok.
Der Build injiziert nur diese Zeichenfolge in den öffentlichen Client; /api/info, MCP
initialize, das lab_info-Tool und die UI-Fußzeile melden denselben Wert.
npm run version:next # preview the next available Bangkok minute
npm run version:bump # update package.json + package-lock.json, no commit/tag
npm run version:check # fail if format or lock metadata driftDer Bump-Befehl lehnt Wiederverwendung in derselben Minute, Uhrzeit-Rollback, unbekannte Flags und
jedes CalVer ab, das nicht neuer als vorhandene arra-memory-lab-v*-Tags ist.
Dies ist bewusst kein Produktions-Identitäts- oder Mandanten-Design. Die private Web-API verwendet ein einziges Besitzer-Bearer-Geheimnis. Der entfernte MCP-Pfad verwendet OAuth 2.1, S256 PKCE, Dynamic Client Registration (DCR), ablaufende Zugriffstokens und Aktualisierungstokens, damit Claude.ai und andere Web-MCP-Clients eine Verbindung herstellen können, ohne die Besitzer-Passphrase zu speichern. Mandanten, Warteschlangen, ANN-Indizes und autonome Konsolidierung bleiben aufgeschoben.
Datenfluss und Datenschutzgrenze
Das Erstellen einer Erinnerung versucht nach erfolgreichem D1-Quellschreiben ein Best-Effort-Embedding.
Semantisches/hybrides Abrufen sendet den Abfragetext an Workers AI.
Ein bestätigter Neuaufbau sendet die ausgewählten Erinnerungstitel/Inhalts-Chunks an Workers AI und schreibt abgeleitete Vektoren in D1.
Stichwort-Abruf und Neuaufbau-Vorschauen rufen Workers AI nicht auf.
D1 speichert maßgeblichen Text plus abgeleiteten Chunk-Text/Vektoren; Suchspuren und Ergebnislinks speichern nur Hashes, IDs, Ränge, Scores und operative Metadaten.
Verwenden Sie synthetische oder nicht sensible Daten, es sei denn, Ihre Cloudflare-Kontorichtlinie und Ihr Bedrohungsmodell erlauben diese Verarbeitung ausdrücklich. In der lokalen Entwicklung greift die Workers-AI-Bindung weiterhin auf den entfernten Dienst zu und kann Nutzung verursachen.
Bereitstellen
Klicken Sie oben auf Deploy to Cloudflare und autorisieren Sie die Repository-Bereitstellung.
Das Cloudflare-Bereitstellungsformular fragt nach
LAB_ACCESS_TOKEN. Geben Sie einen langen zufälligen Wert an (z. B. einen mitopenssl rand -hex 32generierten); Cloudflare speichert ihn als geheime Bindung. Derselbe Wert entsperrt die Browser-API und genehmigt neue OAuth-Clients, aber OAuth-Clients erhalten ihn nie.Bereitstellen. Das Bereitstellungsskript des Repositorys wendet die D1-Migrationen automatisch an, bevor der Worker erstellt und veröffentlicht wird.
Öffnen Sie die Worker-URL. Geben Sie dasselbe Token einmal ein; der Browser speichert es nur in
sessionStorage, sodass das Schließen dieser Browsersitzung es löscht.
Wenn das Bereitstellungsformular oder der automatische Migrationsschritt manuelle Wiederherstellung benötigt, verwenden Sie das äquivalente CLI-Fallback:
printf '%s' 'replace-with-a-long-random-token' | npx wrangler secret put LAB_ACCESS_TOKEN
npx wrangler d1 migrations apply DB --remoteFür ein ausgechecktes Release bearbeiten Sie keine Platzhalter-IDs in wrangler.jsonc.
Das Release-Hilfsprogramm erstellt und testet zuerst, löst genau eine D1-Datenbank
namens arra-memory-lab und einen KV-Namespace namens arra-memory-lab-oauth auf,
schreibt deren IDs nur in eine temporäre Konfiguration mit Modus 0600, wendet Migrationen an
und stellt dann denselben unveränderlichen Build bereit:
npm run deploy:dry-run
npm run deployPrivate /api/*-Routen erfordern Authorization: Bearer $LAB_ACCESS_TOKEN. /mcp akzeptiert nur Zugriffstokens, die vom OAuth-Anbieter des Labs ausgestellt wurden; das Besitzer-Geheimnis selbst wird dort abgelehnt. OAuth-Erkennung, DCR, Token-Austausch und die Genehmigungs-UI befinden sich unter /.well-known/*, /oauth/* und /authorize. Nur GET /api/info ist öffentlicher Anwendungsinhalt. Wenn LAB_ACCESS_TOKEN fehlt, schlagen privater API-Zugriff und OAuth-Genehmigung fehl.
Die Zustimmungsantwort lässt absichtlich CSP form-action weg: eingebettete OAuth-
Browser, die von echten MCP-Hosts verwendet werden, blockierten die Übermittlung selbst mit einer
Exact-Origin-Allowlist. Das Formularziel ist ein festes relatives /authorize; base-uri 'none'
verhindert Base-Target-Umschreibung, jedes DCR-abgeleitete Feld ist HTML-escaped, und
der POST-Pfad parst PKCE/Scopes/Client-Zustand neu, bevor der OAuth-Anbieter
validiert und die Weiterleitung abschließt. Dies ist eine gemessene Kompatibilitäts-
grenze, keine allgemeine CSP-Empfehlung.
Warum D1 für die Ein-Klick-Bereitstellung?
D1 wird verwendet, weil der Bereitstellungsablauf von Cloudflare es automatisch bereitstellen und binden kann, wodurch dieses Lab wirklich nahe an einem Klick bleibt. Der Kompromiss ist bewusste Anbieterkopplung: Diese Version demonstriert keine portable Datenbankschicht oder Turso/libSQL-Bereitstellung. Das ist für ein fokussiertes Cloudflare-Lab akzeptabel, keine pauschale Produktionsempfehlung.
Lokale Entwicklung
Erfordert Node.js für Install/Build/Deploy, Bun für die Test-/Check-Skripte und ein Cloudflare-Konto für Workers AI. Wrangler warnt, weil die AI-Bindung entfernt bleibt, selbst wenn der Worker und D1 lokal ausgeführt werden.
cd labs/arra-memory-lab
npm install
cp .env.example .dev.vars
# Set LAB_ACCESS_TOKEN in .dev.vars
npx wrangler d1 migrations apply DB --local
npm run devQualitätsprüfungen:
npm run typecheck
npm test
npm run build
# or all three:
npm run checkDer postbuild-Hook entfernt .env*- und .dev.vars*-Dateien aus dist/. Dies ist Verteidigung in der Tiefe für lokale Artefakte; das Bereitstellungsmanifest von Wrangler lädt diese Entwicklungsdateien nicht hoch.
HTTP-Beispiele
export LAB_URL='https://arra-memory-lab.<account>.workers.dev'
export LAB_ACCESS_TOKEN='your-long-random-token'
export AUTH="Authorization: Bearer $LAB_ACCESS_TOKEN"
# Public capability disclosure
curl "$LAB_URL/api/info"
# Create an authoritative memory (indexing is best effort)
curl -X POST "$LAB_URL/api/memories" -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"title":"Prefer explicit authority","content":"Memories are sources; embeddings are projections.","kind":"retrospective","tags":["architecture"],"project":"github.com/soul-brews-studio/claude-ai-mcp-poc","sourcePath":"ψ/memory/retrospectives/example.md","createdBy":"rrr","oracleName":"neo","supersedesMemoryId":"OPTIONAL_EXISTING_MEMORY_ID"}'
# Hybrid recall exposes requested/effective modes and rank provenance
curl -X POST "$LAB_URL/api/search" -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"query":"Which data is authoritative?","mode":"hybrid","project":"github.com/soul-brews-studio/claude-ai-mcp-poc","limit":8}'
# Preview a forget and retain the returned expected* fields
curl -X POST "$LAB_URL/api/memories/MEMORY_ID/forget" -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"confirm":false}'
# Confirm only that exact preview. A changed source/impact returns 409 stale_preview.
curl -X POST "$LAB_URL/api/memories/MEMORY_ID/forget" -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"confirm":true,"expectedRevision":1,"expectedHash":"COPY_FROM_PREVIEW","expectedChunks":0,"expectedObservationCount":0}'
# Preview a bounded rebuild; confirmed work is capped at 10 memories / 256 chunks
curl -X POST "$LAB_URL/api/index/rebuild" -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"confirm":false}'MCP
Das Lab stellt zustandsloses Streamable HTTP MCP unter /mcp bereit. Ein Token mit beiden
beworbenen Scopes erhält diese Tools:
lab_info, remember, recall, observe, forget, rebuild_index, memory_stats, trace_list, trace_get.
lab_info ist für ein gültiges Token immer vorhanden. memory:read steuert
recall, memory_stats, trace_list und trace_get; memory:write steuert
remember, observe, forget und rebuild_index. Scope-Prüfungen verwenden den
entpackten Zugriffstoken-Scope bei jeder zustandslosen Anfrage, einschließlich Refresh-Token-
Herabstufung.
Die Implementierung pinnt @modelcontextprotocol/server@2.0.0 und verwendet den
Cloudflare-Agents-createMcpHandler-Wrapper. „SDK v2“ und „Protokollversion“
sind separate Achsen: Der Endpunkt bedient moderne 2026-07-28-Anfragen und behält
den initialize-Ablauf aus der 2025-Ära als zustandslosen Kompatibilitätskanal. Kein Kanal
erstellt eine Mcp-Session-Id; jede Anfrage erhält eine frische Serverinstanz.
Siehe docs/mcp-v2-stateless.md für die Beweismatrix.
MCP-Client verbinden oder neu laden
npm run mcp:connect -- codex "$LAB_URL/mcp" arra-memory-lab
# or Claude Code:
npm run mcp:connect -- claude "$LAB_URL/mcp" arra-memory-labDas Hilfsprogramm registriert die URL und startet den OAuth-Login des Clients. Erneutes Ausführen aktualisiert den Registrierungs-/Login-Pfad. Für Claude.ai öffnen Sie Settings → Connectors → Add custom connector, geben Sie nur https://…/mcp ein, klicken Sie auf Connect und geben Sie die Lab-Passphrase auf der Genehmigungsseite ein.
Bearer versus OAuth
Oberfläche | Anmeldedaten | Warum |
Browser und curl | statisches | schnellster Single-Owner-Lab-Pfad |
Claude.ai Remote-Connector | OAuth-Zugriffs-/Aktualisierungstokens | Claude.ai-Benutzerdefinierte-Connectors unterstützen authless oder OAuth, nicht einen vom Benutzer eingegebenen statischen Header |
Codex / Claude Code | OAuth-Login über Hilfsprogramm | keine langlebige Besitzer-Passphrase in der Client-Konfiguration |
Siehe docs/provenance-oauth-report.md für die gemessene Entscheidung und bereinigte Beweise.
Fehlerverträge
Maßgebliche Erinnerungsschreibvorgänge überleben Embedding-Fehler.
Hybrides Abrufen degradiert nur bei Embedding-Anbieter-Fehlern und meldet den Grund.
Explizites semantisches Abrufen gibt einen Fehler zurück, wenn semantische Inferenz nicht verfügbar ist.
Datenbank-/Vektorfehler werden nicht als KI-Fallback fehlbezeichnet.
Spuren-Schreibfehler verändern niemals ein erfolgreiches Abrufen oder maskieren dessen ursprünglichen Fehler.
Abgeschlossene Spur, Ergebnislinks mit Rangfolge und Aufbewahrungsbereinigung werden in einem D1-Batch versucht; Spuren-Persistenz bleibt relativ zum Abrufen ausfallsicher.
Das Vergessen einer Erinnerung löscht keine historischen Spuren-Ergebnis- oder Ablösungs-Snapshots; das Bereinigen einer Spur kaskadiert zu ihren Rangfolge-Links.
Neuaufbau überprüft Quellrevision/-Hash erneut, bevor abgeleitete Chunks ersetzt werden.
Vergessen-Bestätigung erfordert die Revision, den Hash, die Chunk-Anzahl und die Beobachtungsanzahl, die von seiner Vorschau zurückgegeben wurden; veraltete Bestätigung schlägt mit HTTP
409/stale_previewfehl.
Siehe CONTRACT.md für die aktuelle Laufzeitgrenze und DESIGN.md für das UI-System.
Primäre Plattformreferenzen
This server cannot be deployed
Maintenance
Related MCP Connectors
Cross-session memory for AI agents with a Source Receipt for every memory, over MCP.
- KogniteOAuthdev.kognite
Hosted agent memory: store, search, and recall facts across sessions from any MCP client.
Cross-vendor AI memory over MCP. One semantic store, readable and writeable from every MCP client.
Hosted MCP memory and agent control plane for durable conversations, jobs, and operations.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceProvides AI-assisted long-term memory storage and retrieval with exact-phrase and semantic hybrid search, enabling save, read, delete, and admin recovery via MCP tools.3MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to store, search, and resolve shared memories with full provenance, conflict detection, and an audit trail across MCP-compatible clients.-
- AlicenseNot gradedqualityBmaintenanceEnables LLM clients to manage hierarchical working, dialogue, and episodic memories with decay-aware consolidation, hybrid lexical/vector retrieval, knowledge-graph expansion, and semantic caching over MCP.7MIT
- AlicenseNot gradedqualityAmaintenanceEnables MCP hosts and applications to give AI agents governed persistent memory and bounded context with authorization, provenance, temporal/version control, lifecycle, audit, and optional provider-agnostic model execution.Apache 2.0