diff --git a/hindsight-docs/blog/2026-03-04-mcp-agent-memory.md b/hindsight-docs/blog/2026-03-04-mcp-agent-memory.md new file mode 100644 index 00000000..ca877ba6 --- /dev/null +++ b/hindsight-docs/blog/2026-03-04-mcp-agent-memory.md @@ -0,0 +1,266 @@ +--- +title: "The Open-Source MCP Memory Server Your AI Agent Is Missing" +authors: [hindsight] +date: 2026-03-04 +tags: [mcp, memory, agents, docker, tutorial] +image: /img/blog/mcp-agent-memory.png +hide_table_of_contents: true +--- + +AI agents forget everything between sessions. Hindsight gives them persistent, structured memory via MCP. One Docker command to run the full stack locally. Connect any MCP-compatible client. Three core operations: `retain` (store), `recall` (search), `reflect` (reason) — plus mental models that auto-update as memories grow. + + + +--- + +## TL;DR + +- AI agents forget everything between sessions. Hindsight gives them persistent, structured memory via MCP. +- One Docker command to run the full stack locally. Connect any MCP-compatible client. +- Three core operations: `retain` (store), `recall` (search), `reflect` (reason). Plus mental models — living documents that auto-update as memories grow. +- Hindsight isn't a vector database. It extracts structured facts, resolves entities, builds a knowledge graph, and uses cross-encoder reranking to surface what actually matters. +- Open source: [github.com/vectorize-io/hindsight](https://github.com/vectorize-io/hindsight). + +--- + +## The Problem + +AI agents are stateless. Every session starts from zero. + +You tell your coding assistant your tech stack, your deployment preferences, your team's conventions. Next session — gone. You explain the same architecture decisions, re-establish the same context, re-state the same constraints. Every time. + +People work around this by pasting context into system prompts or maintaining notes they copy in manually. That works for a while, but it doesn't scale. It can't capture the kind of nuanced, evolving knowledge that accumulates over weeks of working with an agent — things like "this user prefers functional patterns," "their team uses PostgreSQL 16," or "they tried Redis caching last month and rolled it back." + +What you actually want is for your agent to build up memory over time. Store what matters, retrieve it when relevant, and learn from the accumulation. + +Hindsight is an open-source memory system designed for exactly this. It connects to any MCP-compatible agent and gives it persistent, structured long-term memory. + +--- + +## The Approach + +``` +Your MCP Client ──MCP (HTTP)──> Hindsight API +(Claude, Cursor, │ + VS Code, etc.) ├── Memory Engine (retain/recall/reflect) + ├── Fact Extraction + Entity Resolution + ├── Embeddings + Cross-Encoder Reranking + ├── Knowledge Graph Traversal + └── PostgreSQL + pgvector +``` + +Your agent connects to Hindsight over MCP (Model Context Protocol). MCP is an open standard — any client that speaks it can use Hindsight as a memory backend. + +When your agent stores a memory via `retain`, Hindsight doesn't just dump raw text into a vector database. It extracts structured facts, resolves entities ("Alice" and "my coworker Alice" are the same person), generates embeddings, and indexes everything for retrieval. + +When your agent needs context via `recall`, Hindsight runs four retrieval strategies in parallel — semantic search, BM25 keyword matching, entity graph traversal, and temporal filtering — then reranks results with a cross-encoder. What comes back is the most relevant subset of your memories, not a raw dump. + +This matters because naive RAG (embed text, cosine similarity, return top-k) breaks down when you have hundreds of memories spanning different topics and time periods. Hindsight's multi-strategy approach ensures that a question like "what did we decide about caching?" finds the right answer even when the memory uses different terminology. + +--- + +## Implementation + +### Step 1: Start Hindsight + +The quickest way to run Hindsight is with Docker. One command gives you the full stack — API server, embedded PostgreSQL, local embedding models, and MCP endpoints: + +```bash +docker run --rm -it --pull always -p 8888:8888 -p 9999:9999 \ + -e HINDSIGHT_API_LLM_API_KEY=YOUR_LLM_API_KEY \ + -v $HOME/.hindsight-docker:/home/hindsight/.pg0 \ + ghcr.io/vectorize-io/hindsight:latest +``` + +You'll need an LLM API key for Hindsight's internal processing (fact extraction, entity resolution, reflect). Hindsight supports multiple LLM providers — OpenAI, Anthropic, Gemini, Groq, or a local model via Ollama or LM Studio. Set the provider explicitly if you're not using OpenAI: + +```bash +docker run --rm -it --pull always -p 8888:8888 -p 9999:9999 \ + -e HINDSIGHT_API_LLM_PROVIDER=gemini \ + -e HINDSIGHT_API_LLM_API_KEY=YOUR_GEMINI_API_KEY \ + -e HINDSIGHT_API_LLM_MODEL=gemini-2.5-flash \ + -v $HOME/.hindsight-docker:/home/hindsight/.pg0 \ + ghcr.io/vectorize-io/hindsight:latest +``` + +The `-v` flag persists your data across container restarts. Without it, memories are lost when the container stops. Port 8888 is the API and MCP endpoint; port 9999 is an optional admin UI for browsing memories. + +Once running, the MCP endpoint is available at `http://localhost:8888/mcp/your_bank_id/` (replace `your_bank_id` with any name you like). + +**Or use Hindsight Cloud** — skip Docker entirely. [Sign up for a free account](https://ui.hindsight.vectorize.io/signup), grab your API key, and connect via MCP: + +```json +{ + "mcpServers": { + "hindsight": { + "type": "http", + "url": "https://api.hindsight.vectorize.io/mcp/your_bank_id/", + "headers": { + "Authorization": "Bearer YOUR_API_KEY" + } + } + } +} +``` + +Or with Claude Code: + +```bash +claude mcp add --transport http hindsight \ + https://api.hindsight.vectorize.io/mcp/your_bank_id/ \ + --header "Authorization: Bearer YOUR_API_KEY" +``` + +### Step 2: Connect Your MCP Client + +Hindsight works with any MCP-compatible client. Add the following JSON to your client's config file: + +```json +{ + "mcpServers": { + "hindsight": { + "type": "http", + "url": "http://localhost:8888/mcp/your_bank_id/" + } + } +} +``` + +Config file locations by client: + +| Client | Config File | +|--------|-------------| +| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows) | +| Cursor | `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global) | +| VS Code | `.vscode/mcp.json` — uses `"servers"` instead of `"mcpServers"` | +| Windsurf | `~/.codeium/windsurf/mcp_config.json` — uses `"serverUrl"` instead of `"url"` | + +**Claude Code** — use the CLI instead: + +```bash +claude mcp add --transport http hindsight http://localhost:8888/mcp/your_bank_id/ +``` + +Restart your client to pick up the changes. + +### Step 3: Verify It's Working + +Ask your agent: + +> "What memory tools do you have available?" + +It should list Hindsight's memory tools, including the three core operations (`retain`, `recall`, `reflect`), six mental model tools, and additional tools for browsing memories, managing documents, and bank administration. + +--- + +## The Memory Tools + +Once connected, your agent has access to three core operations and a set of mental model tools. + +**Retain** — Store a memory: + +Tell your agent something you want it to remember. It will call `retain` automatically based on the tool's built-in instructions, or you can be explicit: + +> "Remember that I prefer TypeScript over JavaScript for all new projects." + +Behind the scenes, Hindsight extracts structured facts, resolves entities, and indexes the memory for later retrieval. A single `retain` call on "Alice from engineering recommended we switch to Postgres 16 for the new JSONB features" produces: + +- A fact: "Alice recommended switching to Postgres 16 for JSONB features" +- Entity resolution: "Alice" linked to "Alice from engineering" +- Temporal indexing: when this was mentioned +- Embeddings: for semantic search later + +**Recall** — Search memories: + +Your agent will proactively recall relevant context when you ask questions. You can also prompt it directly: + +> "What do you know about my programming preferences?" + +Recall runs four retrieval strategies in parallel — semantic search, keyword matching (BM25), graph traversal, and temporal filtering — then reranks the results with a cross-encoder. This is what makes it work better than a simple vector search. + +**Reflect** — Synthesize insights: + +Reflect goes deeper than recall. Instead of returning raw facts, it reasons across your memories using an LLM: + +> "Based on what you know about me, what tech stack would you recommend for my next side project?" + +This is useful for questions that require connecting dots across multiple memories. + +**Mental Models** — Living documents: + +Mental models are summaries that automatically stay up to date as new memories are added. Think of them as pre-computed reflections that refresh themselves: + +> "Create a mental model called 'My Tech Stack' that tracks what languages, frameworks, and tools I use." + +You can list, retrieve, update, and delete mental models. They're useful for maintaining an always-current view of a topic without running a full `reflect` every time. + +--- + +## Memory Banks + +The URL path controls which memory bank you're using. In the examples above, `/mcp/your_bank_id/` scopes all operations to that bank. + +Banks are isolated stores — think of each one as a separate brain. You can run separate banks for different contexts: + +- `my-project` for a specific project +- `team-knowledge` for shared team information +- One bank per user in a multi-agent system + +Banks are created automatically on first use. To use a different bank, change the URL path: + +``` +http://localhost:8888/mcp/project-x/ +``` + +If you want your agent to manage multiple banks in a single session, connect to the multi-bank endpoint at `/mcp/` instead. This adds `bank_id` as a parameter to every tool and includes additional bank management tools like `list_banks`, `create_bank`, and `get_bank_stats`. + +--- + +## Pitfalls & Edge Cases + +### Memory processing is async + +When your agent calls `retain`, fact extraction and indexing happen in the background. If you store something and immediately try to recall it, it might not be there yet. Give it a few seconds for complex memories. + +### Token limits on recall + +By default, `recall` returns up to 4096 tokens of memory content. For banks with extensive history, some older or lower-relevance memories may be trimmed from the response. This is intentional — it keeps the context window manageable. + +### Mental model creation is async too + +When you create or refresh a mental model, the LLM-powered generation runs in the background. The initial call returns an `operation_id`. The content will be available shortly after — typically a few seconds, depending on how many memories need to be synthesized. + +### LLM key is for Hindsight, not your agent + +The `HINDSIGHT_API_LLM_API_KEY` is used by Hindsight internally for fact extraction, entity resolution, and reflect operations. It's separate from whatever LLM your agent uses. You can use a cheap, fast model here (Gemini Flash, Groq, etc.) — it doesn't need to be the same model powering your agent. + +--- + +## When Hindsight Works Well + +- You want structured memory, not just vector search over conversation logs +- You need memory that works across sessions, clients, and agents +- You want entity resolution, temporal awareness, and multi-strategy retrieval out of the box +- You're building agents that accumulate knowledge over time + +--- + +## Recap + +Hindsight gives any MCP-compatible agent persistent long-term memory. One Docker command to start, a few lines of JSON to connect. + +The key insight is that memory isn't just storage and retrieval. Hindsight extracts structured facts from raw input, links entities, tracks temporal data, and uses cross-encoder reranking to surface the most relevant memories. That's what separates it from stuffing conversation logs into a vector database. + +The MCP tools cover the full lifecycle: `retain` to store, `recall` to search with multi-strategy retrieval, `reflect` to synthesize insights, mental model tools for maintaining living documents that auto-update, and utility tools for browsing and managing memories, documents, and tags. + +> **Want managed hosting?** [Hindsight Cloud](https://ui.hindsight.vectorize.io) runs the full stack for you — no Docker, no infrastructure. Sign up, grab an API key, and connect over HTTPS. + +--- + +## Next Steps + +- **Build up your memory**: Start using your agent normally. Tell it your preferences, your project context, your decisions. It will retain what matters. +- **Explore mental models**: Create living documents that auto-update as your memory grows. Try: `"Create a mental model that summarizes my project architecture."` +- **Try multi-bank setups**: Run separate banks for different projects or agents. Connect to `/mcp/` for multi-bank mode. +- **Use the SDK directly**: Beyond MCP, Hindsight has [Python](https://pypi.org/project/hindsight-client/) and [TypeScript](https://www.npmjs.com/package/@vectorize-io/hindsight-client) SDKs for integrating memory into your own applications. +- **Check out the docs**: Full API reference, SDK guides, and more at [hindsight.vectorize.io](https://hindsight.vectorize.io). diff --git a/hindsight-docs/docusaurus.config.ts b/hindsight-docs/docusaurus.config.ts index 9daef52e..f5916ead 100644 --- a/hindsight-docs/docusaurus.config.ts +++ b/hindsight-docs/docusaurus.config.ts @@ -1,377 +1,386 @@ -import {themes as prismThemes} from 'prism-react-renderer'; -import type {Config} from '@docusaurus/types'; -import type * as Preset from '@docusaurus/preset-classic'; - -const umamiUrl = process.env.UMAMI_URL; -const umamiWebsiteId = process.env.UMAMI_WEBSITE_ID; - -// Announcement bar - supports HTML for links -// Set to empty string '' to hide the bar -const ANNOUNCEMENT_BAR = 'Hindsight is State-of-the-Art on Memory for AI Agents | Read the paper →'; - -const config: Config = { - title: 'Hindsight', - tagline: 'Hindsight: Agent Memory That Works Like Human Memory', - favicon: 'img/favicon.png', - - future: { - v4: true, - }, - - markdown: { - mermaid: true, - }, - - url: 'https://hindsight.vectorize.io', - baseUrl: '/', - - organizationName: 'vectorize-io', - projectName: 'hindsight', - trailingSlash: false, - - onBrokenLinks: 'throw', - - i18n: { - defaultLocale: 'en', - locales: ['en'], - }, - - headTags: [ - { - tagName: 'link', - attributes: { - rel: 'preconnect', - href: 'https://fonts.googleapis.com', - }, - }, - { - tagName: 'link', - attributes: { - rel: 'preconnect', - href: 'https://fonts.gstatic.com', - crossorigin: 'anonymous', - }, - }, - { - tagName: 'link', - attributes: { - rel: 'stylesheet', - href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600&family=Space+Grotesk:wght@500;600;700&display=swap', - media: 'print', - onload: "this.media='all'", - }, - }, - ], - - scripts: [ - ...(umamiUrl && umamiWebsiteId - ? [ - { - src: `${umamiUrl}/script.js`, - async: true, - defer: true, - 'data-website-id': umamiWebsiteId, - }, - ] - : []), - ], - - presets: [ - [ - 'classic', - { - docs: { - sidebarPath: './sidebars.ts', - routeBasePath: '/', - // Only show "next" version in development or when INCLUDE_CURRENT_VERSION=true - // In production, only show released versions from versions.json - onlyIncludeVersions: (() => { - const isDev = process.env.NODE_ENV === 'development' || process.env.INCLUDE_CURRENT_VERSION === 'true'; - try { - const versions = require('./versions.json') as string[]; - // In dev mode, explicitly include 'current' (Next) + all released versions - // In production, only show released versions - return isDev ? ['current', ...versions] : versions; - } catch { - return undefined; // No versions yet, show current - } - })(), - // Disable version badges on all versions - versions: (() => { - const config: Record = { - current: {badge: false}, - }; - try { - const versions = require('./versions.json') as string[]; - versions.forEach((v: string) => { - config[v] = {badge: false}; - }); - } catch { - // No versions yet - } - return config; - })(), - }, - blog: { - showReadingTime: true, - blogTitle: 'Hindsight Blog', - blogDescription: 'Updates, insights, and deep dives into agent memory', - postsPerPage: 10, - blogSidebarCount: 0, - }, - theme: { - customCss: './src/css/custom.css', - }, - } satisfies Preset.Options, - ], - [ - 'redocusaurus', - { - specs: [ - { - id: 'hindsight-api', - spec: 'static/openapi.json', - route: '/api-reference', - url: '/openapi.json', - }, - ], - theme: { - primaryColor: '#0074d9', - sidebar: { - backgroundColor: '#09090b', - }, - rightPanel: { - backgroundColor: '#18181b', - }, - typography: { - fontSize: '15px', - fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif", - headings: { - fontFamily: "'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif", - }, - code: { - fontFamily: "'JetBrains Mono', 'Fira Code', 'SF Mono', Monaco, Consolas, monospace", - fontSize: '13px', - }, - }, - }, - config: { - scrollYOffset: 60, - nativeScrollbars: true, - expandSingleSchemaField: true, - expandResponses: '200,201', - }, - }, - ], - ], - - themes: [ - '@docusaurus/theme-mermaid', - [ - '@easyops-cn/docusaurus-search-local', - { - hashed: true, - docsRouteBasePath: '/', - indexBlog: true, - blogRouteBasePath: '/blog', - highlightSearchTermsOnTargetPage: false, - }, - ], - ], - - themeConfig: { - ...(ANNOUNCEMENT_BAR && { - announcementBar: { - id: 'announcement', - content: ANNOUNCEMENT_BAR, - backgroundColor: '#0074d9', - textColor: '#ffffff', - isCloseable: false, - }, - }), - image: 'img/logo.png', - colorMode: { - defaultMode: 'dark', - respectPrefersColorScheme: true, - }, - navbar: { - logo: { - alt: 'Hindsight Logo', - src: 'img/logo.png', - style: { height: '32px' }, - }, - items: [ - { - type: 'doc', - docId: 'developer/installation', - position: 'left', - label: 'Developer', - className: 'navbar-item-developer', - }, - { - type: 'doc', - docId: 'sdks/python', - position: 'left', - label: 'SDKs', - className: 'navbar-item-sdks', - }, - { - to: '/faq', - position: 'left', - label: 'FAQ', - className: 'navbar-item-faq', - }, - { - to: '/changelog', - position: 'left', - label: 'Changelog', - className: 'navbar-item-changelog', - }, - { - type: 'dropdown', - label: 'Resources', - position: 'left', - className: 'navbar-item-resources', - items: [ - { - to: '/cookbook', - label: 'Cookbook', - }, - { - to: '/blog', - label: 'Blog', - }, - { - to: '/api-reference', - label: 'API Reference', - }, - { - href: 'https://join.slack.com/t/hindsight-space/shared_invite/zt-3nhbm4w29-LeSJ5Ixi6j8PdiYOCPlOgg', - label: 'Community', - }, - ], - }, - { - href: 'https://ui.hindsight.vectorize.io/signup', - position: 'right', - label: 'Cloud', - className: 'navbar-item-cloud', - }, - { - type: 'docsVersionDropdown', - position: 'right', - className: 'navbar-item-version', - }, - { - href: 'https://github.com/vectorize-io/hindsight', - position: 'right', - className: 'header-github-link', - 'aria-label': 'GitHub repository', - }, - ], - }, - footer: { - style: 'dark', - links: [ - { - title: 'Documentation', - items: [ - { - label: 'Introduction', - to: '/', - }, - { - label: 'Developer Guide', - to: '/developer/installation', - }, - { - label: 'SDKs', - to: '/sdks/python', - }, - { - label: 'API Reference', - to: '/api-reference/', - }, - ], - }, - { - title: 'Resources', - items: [ - { - label: 'Cookbook', - to: '/cookbook', - }, - { - label: 'Changelog', - to: '/changelog', - }, - { - label: 'Hindsight Cloud', - href: 'https://ui.hindsight.vectorize.io/signup', - }, - ], - }, - { - title: 'Community', - items: [ - { - label: 'GitHub', - href: 'https://github.com/vectorize-io/hindsight', - }, - { - label: 'Slack', - href: 'https://join.slack.com/t/hindsight-space/shared_invite/zt-3nhbm4w29-LeSJ5Ixi6j8PdiYOCPlOgg', - }, - ], - }, - ], - copyright: `Copyright © ${new Date().getFullYear()} Vectorize, Inc.`, - }, - prism: { - theme: prismThemes.github, - darkTheme: prismThemes.dracula, - additionalLanguages: ['bash', 'json', 'python', 'rust'], - }, - mermaid: { - theme: { - light: 'base', - dark: 'base', - }, - options: { - themeVariables: { - // Gradient start (#0074d9 blue) for nodes - primaryColor: '#0074d9', - primaryTextColor: '#ffffff', - primaryBorderColor: '#005db0', - // Gradient end (#009296 teal) for edges/clusters - secondaryColor: '#009296', - secondaryTextColor: '#ffffff', - secondaryBorderColor: '#007a7d', - // Tertiary - tertiaryColor: '#e6f7f8', - tertiaryTextColor: '#1e293b', - // Lines and edges - gradient end color - lineColor: '#009296', - // Text - textColor: '#1e293b', - // Node specific - gradient start - nodeBkg: '#0074d9', - nodeTextColor: '#ffffff', - nodeBorder: '#005db0', - // Main background - mainBkg: '#0074d9', - // Clusters/subgraphs - gradient end - clusterBkg: 'rgba(0, 146, 150, 0.08)', - clusterBorder: '#009296', - // Labels - edgeLabelBackground: 'transparent', - labelBackground: 'transparent', - // Font - Inter to match body text - fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif", - }, - }, - }, - } satisfies Preset.ThemeConfig, -}; - -export default config; +import {themes as prismThemes} from 'prism-react-renderer'; +import type {Config} from '@docusaurus/types'; +import type * as Preset from '@docusaurus/preset-classic'; + +const umamiUrl = process.env.UMAMI_URL; +const umamiWebsiteId = process.env.UMAMI_WEBSITE_ID; + +// Announcement bar - supports HTML for links +// Set to empty string '' to hide the bar +const ANNOUNCEMENT_BAR = 'Hindsight is State-of-the-Art on Memory for AI Agents | Read the paper →'; + +const config: Config = { + title: 'Hindsight', + tagline: 'Hindsight: Agent Memory That Works Like Human Memory', + favicon: 'img/favicon.png', + + future: { + v4: true, + }, + + markdown: { + mermaid: true, + }, + + url: 'https://hindsight.vectorize.io', + baseUrl: '/', + + organizationName: 'vectorize-io', + projectName: 'hindsight', + trailingSlash: false, + + onBrokenLinks: 'throw', + + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + headTags: [ + { + tagName: 'link', + attributes: { + rel: 'preconnect', + href: 'https://fonts.googleapis.com', + }, + }, + { + tagName: 'link', + attributes: { + rel: 'preconnect', + href: 'https://fonts.gstatic.com', + crossorigin: 'anonymous', + }, + }, + { + tagName: 'link', + attributes: { + rel: 'stylesheet', + href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600&family=Space+Grotesk:wght@500;600;700&display=swap', + media: 'print', + onload: "this.media='all'", + }, + }, + { + tagName: 'script', + attributes: {}, + innerHTML: `window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('config', 'AW-16635605869');`, + }, + ], + + scripts: [ + ...(umamiUrl && umamiWebsiteId + ? [ + { + src: `${umamiUrl}/script.js`, + async: true, + defer: true, + 'data-website-id': umamiWebsiteId, + }, + ] + : []), + { + src: 'https://www.googletagmanager.com/gtag/js?id=AW-16635605869', + async: true, + }, + ], + + presets: [ + [ + 'classic', + { + docs: { + sidebarPath: './sidebars.ts', + routeBasePath: '/', + // Only show "next" version in development or when INCLUDE_CURRENT_VERSION=true + // In production, only show released versions from versions.json + onlyIncludeVersions: (() => { + const isDev = process.env.NODE_ENV === 'development' || process.env.INCLUDE_CURRENT_VERSION === 'true'; + try { + const versions = require('./versions.json') as string[]; + // In dev mode, explicitly include 'current' (Next) + all released versions + // In production, only show released versions + return isDev ? ['current', ...versions] : versions; + } catch { + return undefined; // No versions yet, show current + } + })(), + // Disable version badges on all versions + versions: (() => { + const config: Record = { + current: {badge: false}, + }; + try { + const versions = require('./versions.json') as string[]; + versions.forEach((v: string) => { + config[v] = {badge: false}; + }); + } catch { + // No versions yet + } + return config; + })(), + }, + blog: { + showReadingTime: true, + blogTitle: 'Hindsight Blog', + blogDescription: 'Updates, insights, and deep dives into agent memory', + postsPerPage: 10, + blogSidebarCount: 0, + }, + theme: { + customCss: './src/css/custom.css', + }, + } satisfies Preset.Options, + ], + [ + 'redocusaurus', + { + specs: [ + { + id: 'hindsight-api', + spec: 'static/openapi.json', + route: '/api-reference', + url: '/openapi.json', + }, + ], + theme: { + primaryColor: '#0074d9', + sidebar: { + backgroundColor: '#09090b', + }, + rightPanel: { + backgroundColor: '#18181b', + }, + typography: { + fontSize: '15px', + fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif", + headings: { + fontFamily: "'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif", + }, + code: { + fontFamily: "'JetBrains Mono', 'Fira Code', 'SF Mono', Monaco, Consolas, monospace", + fontSize: '13px', + }, + }, + }, + config: { + scrollYOffset: 60, + nativeScrollbars: true, + expandSingleSchemaField: true, + expandResponses: '200,201', + }, + }, + ], + ], + + themes: [ + '@docusaurus/theme-mermaid', + [ + '@easyops-cn/docusaurus-search-local', + { + hashed: true, + docsRouteBasePath: '/', + indexBlog: true, + blogRouteBasePath: '/blog', + highlightSearchTermsOnTargetPage: false, + }, + ], + ], + + themeConfig: { + ...(ANNOUNCEMENT_BAR && { + announcementBar: { + id: 'announcement', + content: ANNOUNCEMENT_BAR, + backgroundColor: '#0074d9', + textColor: '#ffffff', + isCloseable: false, + }, + }), + image: 'img/logo.png', + colorMode: { + defaultMode: 'dark', + respectPrefersColorScheme: true, + }, + navbar: { + logo: { + alt: 'Hindsight Logo', + src: 'img/logo.png', + style: { height: '32px' }, + }, + items: [ + { + type: 'doc', + docId: 'developer/installation', + position: 'left', + label: 'Developer', + className: 'navbar-item-developer', + }, + { + type: 'doc', + docId: 'sdks/python', + position: 'left', + label: 'SDKs', + className: 'navbar-item-sdks', + }, + { + to: '/faq', + position: 'left', + label: 'FAQ', + className: 'navbar-item-faq', + }, + { + to: '/changelog', + position: 'left', + label: 'Changelog', + className: 'navbar-item-changelog', + }, + { + type: 'dropdown', + label: 'Resources', + position: 'left', + className: 'navbar-item-resources', + items: [ + { + to: '/cookbook', + label: 'Cookbook', + }, + { + to: '/blog', + label: 'Blog', + }, + { + to: '/api-reference', + label: 'API Reference', + }, + { + href: 'https://join.slack.com/t/hindsight-space/shared_invite/zt-3nhbm4w29-LeSJ5Ixi6j8PdiYOCPlOgg', + label: 'Community', + }, + ], + }, + { + href: 'https://ui.hindsight.vectorize.io/signup', + position: 'right', + label: 'Cloud', + className: 'navbar-item-cloud', + }, + { + type: 'docsVersionDropdown', + position: 'right', + className: 'navbar-item-version', + }, + { + href: 'https://github.com/vectorize-io/hindsight', + position: 'right', + className: 'header-github-link', + 'aria-label': 'GitHub repository', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Documentation', + items: [ + { + label: 'Introduction', + to: '/', + }, + { + label: 'Developer Guide', + to: '/developer/installation', + }, + { + label: 'SDKs', + to: '/sdks/python', + }, + { + label: 'API Reference', + to: '/api-reference/', + }, + ], + }, + { + title: 'Resources', + items: [ + { + label: 'Cookbook', + to: '/cookbook', + }, + { + label: 'Changelog', + to: '/changelog', + }, + { + label: 'Hindsight Cloud', + href: 'https://ui.hindsight.vectorize.io/signup', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'GitHub', + href: 'https://github.com/vectorize-io/hindsight', + }, + { + label: 'Slack', + href: 'https://join.slack.com/t/hindsight-space/shared_invite/zt-3nhbm4w29-LeSJ5Ixi6j8PdiYOCPlOgg', + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} Vectorize, Inc.`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + additionalLanguages: ['bash', 'json', 'python', 'rust'], + }, + mermaid: { + theme: { + light: 'base', + dark: 'base', + }, + options: { + themeVariables: { + // Gradient start (#0074d9 blue) for nodes + primaryColor: '#0074d9', + primaryTextColor: '#ffffff', + primaryBorderColor: '#005db0', + // Gradient end (#009296 teal) for edges/clusters + secondaryColor: '#009296', + secondaryTextColor: '#ffffff', + secondaryBorderColor: '#007a7d', + // Tertiary + tertiaryColor: '#e6f7f8', + tertiaryTextColor: '#1e293b', + // Lines and edges - gradient end color + lineColor: '#009296', + // Text + textColor: '#1e293b', + // Node specific - gradient start + nodeBkg: '#0074d9', + nodeTextColor: '#ffffff', + nodeBorder: '#005db0', + // Main background + mainBkg: '#0074d9', + // Clusters/subgraphs - gradient end + clusterBkg: 'rgba(0, 146, 150, 0.08)', + clusterBorder: '#009296', + // Labels + edgeLabelBackground: 'transparent', + labelBackground: 'transparent', + // Font - Inter to match body text + fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif", + }, + }, + }, + } satisfies Preset.ThemeConfig, +}; + +export default config; diff --git a/hindsight-docs/static/img/blog/mcp-agent-memory.png b/hindsight-docs/static/img/blog/mcp-agent-memory.png new file mode 100644 index 00000000..ae00fd06 Binary files /dev/null and b/hindsight-docs/static/img/blog/mcp-agent-memory.png differ