{"name":"dev.gnosem/gnosem","title":"Gnosem","description":"Cross-vendor AI memory over MCP. One semantic store, readable and writeable from every MCP client.","version":"1.0.0","websiteUrl":"https://gnosem.dev","repository":{"url":"https://github.com/gnosem/gnosem","source":"github"},"remotes":[{"type":"streamable-http","url":"https://gnosem.dev/mcp"}],"auth":{"type":"bearer","tokenAcquisitionUrl":"https://gnosem.dev/signup"},"tools":[{"name":"memory_write","description":"Save a fact, preference, decision, or note to the user's cross-model memory. Any MCP client can read this back later. Include written_by (e.g. 'claude-code', 'gpt-5', 'kimi-k2') for provenance and session_id to group related writes. Long content (>400 chars) is automatically compressed on write to a structured-facts form optimized for LLM reading — the raw text is preserved. Pass no_optimize:true to skip. Writes are deduped by default: (1) SHA-256 of trim(content) short-circuits byte-identical writes with { id, exact_duplicate:true } for free (no embed call); (2) failing that, semantic dedup returns { id, deduped:true, matched_score } when cosine ≥ 0.85. Pass force:true to bypass both, or use memory_supersede to explicitly correct a prior memory.","inputSchema":{"type":"object","properties":{"content":{"type":"string","description":"The fact or note to remember. Plain text, max 8000 characters."},"tags":{"type":"array","items":{"type":"string"},"description":"Optional short labels for filtering (e.g. ['preference','stack'])."},"written_by":{"type":"string","description":"Identifier of the model / client writing this (e.g. 'claude-code', 'gpt-5', 'kimi-k2', 'manual')."},"session_id":{"type":"string","description":"Opaque identifier grouping related writes from the same conversation."},"no_optimize":{"type":"boolean","description":"Skip AI compression of long content. Default false."},"force":{"type":"boolean","description":"Bypass semantic dedup and write anyway. Default false."}},"required":["content"]}},{"name":"memory_search","description":"Search the user's memories. Default mode is 'hybrid': blends semantic (cosine over Vectorize) and keyword (BM25 over SQLite FTS5) hits via Reciprocal Rank Fusion (k=60). Semantic catches paraphrases; keyword catches exact-string hits (IDs, dates, code snippets). Pass mode:'semantic' or mode:'keyword' to run just one. Content defaults to the LLM-optimized (compressed) form when available (raw:true to invert). Excludes forgotten + superseded. Optional filters narrow after retrieval: tags (AND), written_by, session_id, and/or since/until (ms epoch).","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Search query. Interpreted as natural language for semantic mode and as FTS5-safe text for keyword mode."},"k":{"type":"integer","description":"Max results (1–50). Default 10."},"mode":{"type":"string","enum":["semantic","keyword","hybrid"],"description":"Retrieval mode. Default 'hybrid'."},"raw":{"type":"boolean","description":"Return original prose instead of the compressed form. Default false."},"tags":{"type":"array","items":{"type":"string"},"description":"Only return memories containing ALL of these tags (AND semantics)."},"written_by":{"type":"string","description":"Only return memories with an exact written_by match (e.g. 'claude-code')."},"session_id":{"type":"string","description":"Only return memories with an exact session_id match."},"since":{"type":"integer","description":"Only return memories created at or after this ms-epoch timestamp."},"until":{"type":"integer","description":"Only return memories created strictly before this ms-epoch timestamp."}},"required":["query"]}},{"name":"memory_list","description":"List the user's most recent memories in reverse chronological order. Use for browsing or catching up on what the user's other model sessions have written recently. Same content/content_raw shape as memory_search. Optional filters (tags, written_by, session_id, since, until) narrow the listing at the SQL level.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","description":"Max rows to return (1–200). Default 50."},"cursor":{"type":"integer","description":"Pagination cursor from a previous call's `cursor` field (ms epoch); returns rows older than this timestamp."},"raw":{"type":"boolean","description":"Return original prose instead of the compressed form. Default false."},"tags":{"type":"array","items":{"type":"string"},"description":"Only return memories containing ALL of these tags (AND semantics)."},"written_by":{"type":"string","description":"Only return memories with an exact written_by match."},"session_id":{"type":"string","description":"Only return memories with an exact session_id match."},"since":{"type":"integer","description":"Only return memories created at or after this ms-epoch timestamp."},"until":{"type":"integer","description":"Only return memories created strictly before this ms-epoch timestamp."}}}},{"name":"memory_forget","description":"Soft-delete a memory by id. The row is retained for audit but excluded from search/list and removed from the vector index.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"UUID of the memory to forget."}},"required":["id"]}},{"name":"memory_supersede","description":"Replace a stale memory with a corrected one. The old row is marked superseded and excluded from future reads; the new row becomes the current version. Use for corrections; use memory_forget for pure deletions.","inputSchema":{"type":"object","properties":{"old_id":{"type":"string","description":"UUID of the memory to replace."},"new_content":{"type":"string","description":"New content that supersedes the old memory."},"tags":{"type":"array","items":{"type":"string"}},"written_by":{"type":"string"},"session_id":{"type":"string"}},"required":["old_id","new_content"]}},{"name":"memory_write_bulk","description":"Write up to 50 memories in a single call. Each entry runs the same path as memory_write (semantic dedup by default; pass force:true per-entry to skip). Embeddings + optimizations run in parallel; D1 inserts are batched. Returns { results: [...] } with one entry per input in the same order — each is { id, created_at, optimized? } on success, { id, created_at, deduped, matched_score } on dedup, or { error } on failure. Free-tier limits apply to the sum: if adding N would exceed 200, the first (200 - existing) succeed and the rest return an error.","inputSchema":{"type":"object","properties":{"memories":{"type":"array","description":"Array of memory-write entries (1–50).","minItems":1,"maxItems":50,"items":{"type":"object","properties":{"content":{"type":"string","description":"The fact or note to remember. Plain text, max 8000 characters."},"tags":{"type":"array","items":{"type":"string"}},"written_by":{"type":"string"},"session_id":{"type":"string"},"no_optimize":{"type":"boolean","description":"Skip AI compression of long content. Default false."},"force":{"type":"boolean","description":"Bypass semantic dedup for this entry. Default false."}},"required":["content"]}}},"required":["memories"]}}]}