exo
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@exosearch redis rate limiting"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
exo
Your exocortex. CLI + MCP server for personal knowledge management.
AI coding sessions close and the experience disappears. ChatGPT threads pile up with nowhere to go. Notes accumulate but never get flagged as stale. exo solves all three.
Ingest ChatGPT exports, PDFs, images, and markdown files. Let LLMs compile raw sessions and conversations into structured knowledge pages. Search everything with hybrid FTS5 + vector search and LLM query expansion. Wire it into Claude Code or Cursor as an MCP server so your AI tools can read and write your brain directly.
Table of Contents
Related MCP server: code-context
Install
bun install -g @guqings/exoRequires Bun 1.x.
Quick start
# Initialize your brain (default: ~/.exo/brain.db)
exo init
# Configure AI provider (OpenAI-compatible)
exo config set embed.api_key sk-...
exo config set embed.base_url https://api.openai.com/v1
exo config set compile.api_key sk-...
# Capture a quick note (no LLM, instant)
exo capture "Redis rate limiting: token bucket at 100 req/s per user"
# Or write a full page
echo '---
title: Redis Rate Limiting
type: concept
tags: [redis, backend]
---
Token bucket at 100 req/s per user. Use INCR + EXPIRE for sliding window.
' | exo put concepts/redis-rate-limiting
# Keyword search
exo search "redis rate limit"
# Hybrid search with AI query expansion (requires embed config)
exo query "how to prevent API abuse"
# Read a page
exo get concepts/redis-rate-limiting
# Open the local Web UI
exo ui
# Wire up to Claude Code / Cursor (one-time)
exo setup-mcpData flow
flowchart TD
subgraph Sources["Data Sources"]
A[Markdown files / dirs]
B[Quick notes / text]
C["Claude Code / Copilot / Codex session logs"]
D[ChatGPT export JSON]
E["Mixed directory (MD + PDF + images)"]
F[PDF / image / audio / DOCX]
end
subgraph Ingest["Ingestion"]
I1["exo import / exo sync"]
I2["exo capture"]
I3["exo harvest"]
I4["exo digest / exo import-chatgpt"]
I5["exo ingest"]
I6["exo attach / exo describe"]
end
subgraph Store["Brain β brain.db"]
INBOX["π₯ inbox (staging area)"]
CONCEPT["π§ concept / learning / project (knowledge pages)"]
FILES["π files (binary attachments)"]
end
subgraph Pipeline["AI Pipeline"]
COMPILE["exo compile (LLM: create / update / discard)"]
end
subgraph Out["Access"]
SEARCH["exo search / query"]
UI["exo ui (web browser)"]
MCP["exo serve (MCP / Claude Code)"]
EXPORT["exo export"]
end
A --> I1 --> CONCEPT
B --> I2 --> INBOX
C --> I3 --> INBOX
D --> I4 --> INBOX
E --> I5 --> INBOX
F --> I6 --> FILES --> CONCEPT
INBOX --> COMPILE --> CONCEPT
CONCEPT --> SEARCH
CONCEPT --> UI
CONCEPT --> MCP
CONCEPT --> EXPORT
style INBOX fill:#fef3c7,stroke:#d97706
style CONCEPT fill:#d1fae5,stroke:#059669
style COMPILE fill:#ede9fe,stroke:#7c3aedKey insight:
importandsyncwrite directly to knowledge pages (no LLM needed).capture,harvest,digest, andingestland in the inbox staging area first. Runexo compileto let the LLM distill inbox items into your knowledge graph β it merges related items, creates new concept pages, and discards noise.
Commands
Core
Command | Description |
| Create |
| Read a page as markdown |
| Write or update a page (stdin or |
| Delete a page |
| List pages ( |
| Brain statistics (page counts, DB size) |
| Brain health metrics |
| View and set configuration |
Search
Command | Description |
| FTS5 keyword search ( |
| Hybrid search: FTS5 + vector RRF + LLM query expansion |
Web UI
Command | Description |
| Start the local web UI ( |
AI Ingestion Pipeline
Command | Description |
| Instantly capture a note to the inbox (no LLM, <100ms) |
| View the inbox queue (items waiting to be compiled) |
| Run LLM pipeline: inbox items β structured knowledge pages |
| Harvest learnings from Claude Code / Copilot / Codex session logs |
| Ingest a mixed directory into inbox ( |
| Import conversations from a ChatGPT export JSON |
| Import a full ChatGPT export directory (conversations + images) |
Files & Multimodal
Command | Description |
| Attach a file to a page (PDF, image, DOCX, audio, video) |
| Detach a file from a page |
| List all files attached to your brain |
| Extract and embed content from files via AI (images, PDFs, DOCX, audio) |
Embeddings & Sync
Command | Description |
| Generate vector embeddings for pages ( |
| Sync a directory of markdown files into the brain |
| Import a markdown file or directory |
| Export pages to markdown files |
Knowledge Graph
Command | Description |
| Create a cross-reference between two pages |
| Remove a cross-reference |
| Show pages linking to a slug |
| Add a tag |
| Remove a tag |
| List all tags, or tags for a specific page |
| Traverse the knowledge graph from a slug |
| View or add timeline entries for a page |
| Manage page versions (snapshot, list, revert) |
Maintenance
Command | Description |
| Check for stale, orphaned, and low-confidence pages |
| Run health checks on the database and configuration |
| Check for a newer version on npm |
MCP / Agent
Command | Description |
| Start the MCP stdio server |
| Auto-configure MCP in Claude Code and Cursor |
| Invoke any MCP tool directly from the CLI |
| Print all MCP tool definitions as JSON |
Configuration
exo reads ~/.exo/config.toml. Use exo config to view and exo config set <key> <value> to edit.
[db]
path = "~/.exo/brain.db"
[embed]
base_url = "https://api.openai.com/v1"
api_key = "sk-..."
model = "text-embedding-3-large"
[compile]
base_url = "https://api.openai.com/v1"
api_key = "sk-..."
model = "gpt-4o"
[vision]
base_url = "https://api.openai.com/v1"
api_key = "sk-..."
model = "gpt-4o"
[ui]
port = 7499Any OpenAI-compatible provider works (Vercel AI Gateway, Azure OpenAI, Ollama, etc.).
DB path resolution
Priority order:
--db <path>flag (per-command override)EXO_DBenvironment variabledb.pathin~/.exo/config.tomlDefault:
~/.exo/brain.db
# Per-command
exo query "rate limiting" --db ~/work/brain.db
# Shell session
export EXO_DB=~/work/brain.dbPage format
Pages use YAML frontmatter. A --- separator (with blank lines around it) splits compiled knowledge from timeline entries.
---
title: Redis Rate Limiting
type: concept
confidence: 9
valid_until: 2027-01-01
tags: [redis, backend, rate-limiting]
sources: [https://redis.io/docs/manual/patterns/]
---
# Redis Rate Limiting
Token bucket at 100 req/s per user. Use INCR + EXPIRE for sliding window.
Lua scripts ensure atomicity across INCR + EXPIRE.
---
## Timeline
- **2024-03-15**: Deployed to production. Token bucket chosen over leaky bucket.
- **2024-06-01**: Switched to sliding window after P99 spike analysis.Slug prefixes and page types
Prefix | Type |
| concept |
| learning |
| person |
| project |
| source |
Frontmatter fields
Field | Type | Description |
| string | Page title (required) |
| string | Page type (inferred from slug prefix if absent) |
| 0β10 | How sure you are this is still accurate |
| YYYY-MM-DD | Flag as stale after this date |
| string[] | Arbitrary labels |
| string[] | URLs or references |
Hybrid search
exo query combines three signals via Reciprocal Rank Fusion (RRF):
FTS5 keyword search β exact term matching, supports Chinese via LIKE fallback
Vector search β cosine similarity on
text-embedding-3-largeembeddings (requiresexo embed)LLM query expansion β rewrites your query into synonyms and related terms before searching
# Full hybrid (requires embeddings)
exo query "how to prevent API abuse"
# Keyword only (no API calls, instant)
exo search "redis rate limit"
# Disable query expansion (faster, exact terms)
exo query "redis INCR EXPIRE" --no-expandRun exo embed --all after ingesting new content to keep vector search current.
AI ingestion
Capture β Compile pipeline
# 1. Capture anything instantly (no LLM, goes to inbox)
exo capture "Bun 1.2 ships native S3 client"
echo "Long note from stdin" | exo capture --title "My Note"
# 2. Check inbox
exo inbox
# 3. Compile inbox β structured knowledge pages (uses LLM)
exo compile
exo compile --yes # skip confirmationsHarvest from AI session logs
# Harvest Claude Code sessions (default)
exo harvest
# Harvest from all supported tools
exo harvest --source all
# Preview without writing
exo harvest --dry-runSupported sources: Claude Code, GitHub Copilot CLI, Codex.
Import ChatGPT conversations
# Export from ChatGPT settings β import
exo digest conversations.json
# Full export directory (conversations + images)
exo import-chatgpt ~/Downloads/chatgpt-export/Attach files
# Attach and describe an image (calls vision API)
exo attach concepts/my-page screenshot.png --describe
# Attach a PDF (auto-extracts and indexes text per page)
exo attach concepts/my-page paper.pdf
# Attach audio with transcription (calls Whisper API)
exo attach concepts/my-page meeting.mp3 --transcribe
# Process all unprocessed attached files
exo describe --allMCP server
exo exposes a Model Context Protocol server so Claude Code and Cursor can read and write your brain directly.
exo setup-mcp # auto-writes ~/.claude/mcp.json and ~/.cursor/mcp.jsonTo configure manually in ~/.claude/mcp.json:
{
"mcpServers": {
"exo": {
"command": "exo",
"args": ["serve"]
}
}
}Available MCP tools: brain_search, brain_query, brain_get, brain_put, brain_list, brain_link, brain_stats, brain_lint_summary, brain_capture, brain_timeline.
Lint
exo lint surfaces three classes of issues:
Stale β
valid_untilis in the pastLow confidence β
confidence <= 3Orphaned β no links in or out, no tags
exo lint # all issues
exo lint --json # machine-readable outputDevelopment
git clone https://github.com/guqing/exo
cd exo
bun install
bun run dev # run from source: bun src/cli.ts
bun run ui:dev -- --db ~/path/to/brain.db
# API on 7499, Vite UI on 5173, /api proxied automatically
bun test ./src/tests/ # run test suite
bun run build # compile to single binary β bin/exoLicense
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/guqing/exo'
If you have feedback or need assistance with the MCP directory API, please join our Discord server