Content
# Engram
> Native Swift MCP helper + macOS App: Consolidates 14 default-enabled sources + 3 archived default-off sources of AI programming assistant history, enabling cross-tool context sharing, keyword search, and project migration.
In Codex, after working for a while and switching to Claude Code, the AI doesn't require you to manually explain what you've done previously - it can directly query `get_context` to retrieve your history.
**Current product state (2026-07-06):** Shipped runtime is the native Swift macOS app + bundled Swift MCP helper. The active MCP surface has 27 tools, search is keyword-only in the Swift product path, and session ingestion defaults to 14 active sources plus 3 archived default-off sources. `docs/TODO.md` and `docs/roadmap.md` have no open engineering/product items; low-priority verification and cleanup follow-ups live in `docs/followups.md`. Latest CI-verified main: `24cc4562` (Tests + CodeQL success after PR #113).
```
┌─────────┐ ┌───────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐
│ Codex │ │Claude Code│ │Gemini CLI│ │ Cursor │ │ Cline …│
│ sessions│ │ projects │ │ tmp │ │ vscdb │ │ tasks │
└────┬────┘ └─────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬────┘
└────────────┴──────┬─────┴─────────────┴────────────┘
▼
┌──────────────────────┐
│ engram │
│ Swift MCP + App UI │
│ ~/.engram/ │
│ index.sqlite │
└──────────┬───────────┘
┌────┴────┐
▼ ▼
MCP Tools macOS App
(AI invocation) (desktop UI)
```
## Table of Contents
- [Tool List](#tool-list)
- [Adapter and Display Consistency](#adapter-and-display-consistency)
- [Quick Start](#quick-start)
- [Register as MCP Server](#register-as-mcp-server)
- [macOS App](#macos-app)
- [MCP Tools Reference](#mcp-tools-reference)
- [Search Status](#search-status)
- [Project Aliases](#project-aliases)
- [Configuration](#configuration)
- [Adding New Adapters](#adding-new-adapters)
- [Data Storage and Privacy](#data-storage-and-privacy)
- [Development](#development)
## Tool List
| Tool | Log Path | Status |
|------|---------|------|
| [Codex CLI](https://github.com/openai/codex) | `~/.codex/sessions/` | ✅ Full Support |
| [Claude Code](https://claude.ai/code) | `~/.claude/projects/` | ✅ Full Support |
| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `~/.gemini/tmp/` | ✅ Full Support |
| [Antigravity](https://idx.google.com) | CLI brain `~/.gemini/antigravity-cli/brain/` + legacy cache when present | ✅ Full Support |
| [Windsurf](https://codeium.com/windsurf) | `~/.engram/cache/windsurf` cache only; live gRPC sync is disabled | ⚠️ cache-only |
| [Cursor](https://cursor.sh) | `~/Library/Application Support/Cursor/…/state.vscdb` | ✅ Full Support |
| [VS Code Copilot](https://code.visualstudio.com) | `~/Library/Application Support/Code/…/chatSessions/` | ✅ Full Support |
| [GitHub Copilot](https://github.com/features/copilot) | `~/.copilot/session-state/<uuid>/events.jsonl` | ✅ Full Support |
| [iflow](https://iflow.ai) | `~/.iflow/projects/` | Archived, default-off, can be enabled in Sources > Archived |
| [Qwen Code](https://qwen.ai) | `~/.qwen/projects/` | ✅ Full Support |
| Qoder | `~/.qoder/projects/` | ✅ Full Support |
| [OpenCode](https://opencode.ai) | `~/.local/share/opencode/opencode.db` | ✅ Full Support |
| [Kimi](https://kimi.moonshot.cn) | `~/.kimi/sessions/` | ✅ Full Support |
| [MiniMax](https://minimax.chat) | Claude Code-derived sessions under `~/.claude/projects/` | ✅ Full Support |
| [Lobster AI](https://lobster.ai) | Claude Code-derived sessions under `~/.claude/projects/` | Archived, default-off, can be enabled in Sources > Archived |
| Command Code | `~/.commandcode/projects/` | ✅ Full Support |
| [Cline](https://github.com/cline/cline) | `~/.cline/data/tasks/` | Archived, default-off, can be enabled in Sources > Archived |
## Adapter and Display Consistency
Engram's product parsing path on Swift: `macos/Shared/EngramCore/Adapters/Sources/` is responsible for reading each tool's raw logs, and `macos/EngramCoreWrite/Indexing/` is responsible for writing to the index library. TypeScript adapters are retained as dev/reference/fixture tooling for generating and verifying fixture parity.
Session details only display `user` / `assistant` messages as visible text; tool/event/system-like data is used for indexing, tool statistics, or diagnostics, but not mixed into regular conversation bubbles as text. Pagination offset is advanced based on the adapter's original consumption position to avoid hidden messages causing visible message omission or duplicate pages.
Antigravity CLI, Command Code, and Qoder are key coverage sources. Antigravity CLI uses the CLI transcript under `~/.gemini/antigravity-cli/brain/` and is compatible with the old gRPC cache; Qoder covers top-level sessions and nested `subagents/` parent-child relationships; Command Code covers `tool-calls` `input` / `args` form. Pre-release parser/parity smoke tests:
```bash
npm run check:adapter-parity-fixtures
npm test -- tests/adapters
xcodebuild test -project macos/Engram.xcodeproj -scheme EngramCoreTests -destination 'platform=macOS' -only-testing:EngramCoreTests/AdapterParityTests/testSwiftAdaptersMatchNodeParityGoldensForAllProviders
xcodebuild test -project macos/Engram.xcodeproj -scheme Engram -destination 'platform=macOS' -only-testing:EngramTests/MessageParserTests
```
The current fixture/parity gate covers 15 independent product adapters: Antigravity CLI, Claude Code, Cline, Codex CLI, Command Code, GitHub Copilot, Cursor, Gemini CLI, iflow, Kimi, OpenCode, Qoder, Qwen Code, VS Code Copilot, and Windsurf. Cline and iflow parsers/fixtures are retained but default to archived sources and require manual enablement in Sources > Archived; MiniMax is kept default-enabled. MiniMax and Lobster AI use Claude Code-derived sources and walk through the Claude Code parser but write to the index as independent sources; Lobster AI also retains parsers/fixtures and defaults to archived and closed. Swift/Node regression testing covers this derived classification. Swift App, Swift MCP, and Swift Service exports only display non-empty `user` / `assistant` visible text; tool/system/event-like lines are reserved for indexing, tool statistics, and diagnostics, not mixed into regular conversation bubbles. Provider parser parity is constrained by `tests/fixtures/adapter-parity/**`; Swift/MCP/export visible message consistency is covered by Swift service/core testing. If the same session is parsed or displayed differently on both ends, add corresponding fixtures first, then modify adapters or visible message filtering logic.
The most recent complete provider/parser ship record is in [`docs/verification/provider-parser-parity-2026-05-20.md`](docs/verification/provider-parser-parity-2026-05-20.md), which includes two rounds of Polycli review and final verification commands.
## Quick Start
**Prerequisites:** `Engram.app` is installed, or the macOS App is built from source.
```bash
# Build from source
git clone https://github.com/bbingz/engram
cd engram
macos/scripts/build-release.sh --local-only
# 2. Install to /Applications
macos/scripts/deploy-local.sh macos/build/EngramExport/Engram.app
# If there is no Developer ID certificate, --local-only generates
# macos/build/EngramExport/Engram-local-only.app, which can only be installed locally and not distributed/notarized.
# 3. Restart AI tools and call in conversation:
# get_context cwd=/your/project/path
```
When `Engram.app` is launched for the first time, `EngramService` automatically scans all session files and establishes an index (stored in `~/.engram/index.sqlite`). Incremental updates are then made through file listening, eliminating the need for manual maintenance.
## Register as MCP Server
### Claude Code
```bash
claude mcp add --scope user engram /Applications/Engram.app/Contents/Helpers/EngramMCP
```
Or manually edit `~/.claude/settings.json`:
```json
{
"mcpServers": {
"engram": {
"command": "/Applications/Engram.app/Contents/Helpers/EngramMCP",
"args": []
}
}
}
```
### Codex
Codex holds an MCP stdio subprocess during session startup. To avoid replacing `/Applications/Engram.app` during release, which affects already-open Codex sessions, create a stable shim first:
```bash
mkdir -p ~/.engram/bin
cat > ~/.engram/bin/engram-mcp <<'EOF'
#!/bin/sh
set -eu
HELPER="/Applications/Engram.app/Contents/Helpers/EngramMCP"
if [ ! -x "$HELPER" ]; then
echo "Engram MCP helper is not executable at $HELPER" >&2
exit 127
fi
exec "$HELPER" "$@"
EOF
chmod 755 ~/.engram/bin/engram-mcp
```
Edit `~/.codex/config.toml`:
```toml
[mcp_servers.engram]
command = "/Users/<you>/.engram/bin/engram-mcp"
args = []
```
### Other MCP-supported Clients
Any client supporting MCP stdio transport can be used. Add the following to the corresponding MCP configuration:
```json
{
"command": "/Applications/Engram.app/Contents/Helpers/EngramMCP",
"args": []
}
```
## macOS App
Engram's product UI is a native macOS App. When `Engram.app` is launched, it manages `EngramService` and reads the index library through Swift/GRDB.
The sidebar organizes pages into four partitions and supports `⌘K` command panel for quick navigation between pages/operations:
- **OVERVIEW**
- **Today**: Default entry dashboard, aggregating Continue, Follow-ups, Changed Repos, Service State, for resuming work and closing tasks
- **Search**: SQLite FTS5 trigram keyword search, supporting Chinese/English, UUID direct search, and result highlighting; project/source/time and other low-level filtering are in Advanced filters
- **MONITOR**
- **Sessions**: Filter by source/project/time, multi-select filtering, pagination; Claude Code → Codex/Gemini and other dispatched sub-sessions are automatically grouped under the parent session and can be expanded for viewing
- **Favorites / Timeline / Activity**: Favorite list, timeline, activity view by day/tool
- **Hygiene**: Index health check, listing empty sessions, pending parent-child suggestions, orphan sessions, and other processable items
- **Observability**: Log stream / error panel / performance / tracing / system health and other development diagnostics, defaulting to Settings → General → Show Developer Tools switch (not displayed in the sidebar for regular users)
- **WORKSPACE**
- **Projects**: Project rename / move / archive / undo, following Swift service single-writer pipeline
- **Sources / Repos / Work Graph**: Source status, Git repository workload, cross-session work graph
- **CONFIG**
- **Agents / Memory**: Sub-agent and memory entry configuration overview
Other capabilities throughout:
- **Session Details**: Full conversation content, Markdown rendering, favorites, export, and a toolbar with Handoff / Replay / Resume
- **Value Hinting**: Indexing calculates `quality_score`, and lists/search results use high/medium/low value bands for quick judgment
- **Usage and Cost**: Source/project/day/week usage statistics, model cost, tool calls, file activity, and cost insights suggestions
- **Today's Parent Session Badge**: Menu bar icon displays the number of top-level parent sessions for today, not the total number of sub-tasks
The historical TypeScript Web/API entry has been removed; the current macOS product path provides functionality through Swift App, Swift Service, and Swift MCP. TypeScript search code is retained only as tooling/reference and does not represent the current enabled semantic search in Swift App/MCP.
## MCP Tools Reference
Engram's Swift MCP runtime currently exposes 27 tools, covering scenarios such as context acquisition, search, memory management, statistical analysis, session organization, and project migration:
| Tool | Description |
|------|-------------|
| `get_context` | 🔑 **Core Tool** — Automatically extracts the historical context of the current project, called when starting a new task |
| `search` | FTS keyword search; old clients sending `semantic`/`hybrid` will degrade to keyword and return a warning |
| `list_sessions` | Lists historical sessions, supporting filtering by source/project/time |
| `get_session` | Reads a single session's complete conversation, supporting pagination |
| `save_insight` | Saves important knowledge fragments, persisting across sessions |
| `delete_insight` | Deletes saved insights |
| `get_memory` | Retrieves saved memories and knowledge |
| `project_timeline` | Views a project's operation timeline across tools |
| `stats` | Usage statistics (grouped by source/project/day/week) |
| `get_costs` | Token usage and cost statistics |
| `tool_analytics` | Analyzes the call frequency of each tool (Read/Edit/Bash, etc.) |
| `file_activity` | Most frequently edited/read files in a project |
| `handoff` | Generates a project handover brief |
| `export` | Exports a session as Markdown/JSON |
| `generate_summary` | AI-generated session summary |
| `link_sessions` | Creates soft links to session files in the project directory |
| `manage_project_alias` | Manages project aliases (maintaining associations after directory moves) |
| `live_sessions` | Returns an explicit `unavailable` result in MCP mode; scans for locally active sessions via App/service IPC paths |
| `get_insights` | Provides cost optimization suggestions |
| `hide_session` | Hides or restores a specified session |
| `project_move` | Moves a project directory while keeping AI session history accessible |
| `project_archive` | Archives a project to the `_archive/` directory |
| `project_undo` | Rolls back a committed project move |
| `project_move_batch` | Batch-executes project moves/archives |
| `project_list_migrations` | Views project move migration records |
| `project_recover` | Diagnoses failed or stuck migrations |
| `project_review` | Scans for residual references in migrated old paths |
**Quick Examples:**
```json
// Get project context
{ "cwd": "/Users/me/my-project", "task": "Refactor authentication module" }
// Search history
{ "query": "JWT authentication", "mode": "keyword" }
// Save knowledge
{ "content": "Project uses Hono as the HTTP framework", "wing": "engram" }
```
> See the complete parameter documentation in [MCP Tools Reference](docs/mcp-tools.md).
---
## Search Status
The current Swift product path uses SQLite FTS5 trigram keyword search. MCP, App service read paths, and session details display share the same Swift index library and visible message rules.
- **keyword**: Already online. Covers user messages, assistant replies, summaries, and indexed text; supports Chinese, English, code snippets, function names, and UUID direct lookup.
- **semantic / hybrid**: Swift service currently has no embedding provider and no sqlite-vec KNN query link. Old clients sending `semantic`, `hybrid`, or `both` are compatibly received but actually degrade to keyword and return a warning.
- **insights memory**: `save_insight` / `get_memory` currently use FTS/recent fallback; embedding fields are reserved in the schema but are not yet product-ready for semantic retrieval.
Search covers: user messages + assistant replies + session summaries + part of adapter-normalized tool/diagnostic text.
Search also supports **directly pasting a session UUID** for precise lookup without keywords or semantic matching.
### Embedding Configuration Status
`~/.engram/settings.json` may still contain embedding fields from old TypeScript/reference tooling:
| Field | Current Status |
|------|----------------|
| `ollamaUrl` / `ollamaModel` / `embeddingDimension` | Compatibly reserved; Swift service does not enable semantic search due to this |
| `aiApiKey` / `titleApiKey` | Used for user-triggered AI summary / title generation; does not represent Swift semantic search being enabled |
| `session_embeddings` / `vec_sessions` | Schema/backfill compatible table; may be cleared and rebuilt when FTS version or vector version changes |
## Project Aliases
When you move a project directory (e.g., from `~/Code/wechat-decrypt` to `~/Code/wechat-decrypt-bing`), the AI assistant cannot find historical sessions under the old path. Project aliases allow you to declare two project names as the same project, and all queries automatically expand.
### Add an Alias
**Via MCP Tool (in AI conversation):**
```json
{ "name": "manage_project_alias", "arguments": { "action": "add", "old_project": "wechat-decrypt", "new_project": "wechat-decrypt-bing" } }
```
Historical TypeScript Web/API entry has been deleted; the current product path prioritizes using Swift MCP tools. macOS App does not yet provide a Project Aliases management UI.
After adding, calling `get_context`, `search`, `list_sessions`, etc., under any path will show sessions for both project names. Aliases are bidirectional—querying either name will find the other.
### Manage Aliases
```json
// List all aliases
{ "action": "list" }
// Remove an alias
{ "action": "remove", "old_project": "wechat-decrypt", "new_project": "wechat-decrypt-bing" }
```
> **Note:** Project aliases solve query issues at the Engram level. Each AI tool's `/resume` and similar functions still depend on the original path, which is beyond Engram's control.
## Remote Session Offloading (Optional, Disabled by Default)
Optional feature: offload **regenerable index products** (sessions_fts content + summary, AES-GCM encrypted) of cold/archived sessions to **your self-hosted server** to reclaim local disk space; original transcript files are never moved; offloaded sessions retain a keyword shadow and can still be searched, with transparent refilling when opened. Disabled by default; needs to be explicitly enabled and configured in `~/.engram/settings.json`.
```json
{
"remoteOffloadEnabled": false,
"remoteOffloadBackend": "http",
"remoteOffloadServerURL": "https://100.x.x.x:8443",
"remoteOffloadColdAgeDays": 365
}
```
> Note: Offloading runs in a background helper process, subject to macOS local network privacy restrictions—`remoteOffloadServerURL` must use **Tailscale IP / tailnet name**, not a local network IP. Deployment and maintenance are detailed in [`docs/remote-offload.md`](docs/remote-offload.md), and privacy instructions are in [`docs/PRIVACY.md`](docs/PRIVACY.md).
## Configuration
Configuration file path: `~/.engram/settings.json`
```json
{
"aiProtocol": "openai",
"aiApiKey": "@keychain",
"aiModel": "gpt-4o-mini",
"titleProvider": "ollama",
"titleModel": "qwen2.5:3b"
}
```
| Field | Type | Default Value | Description |
|------|------|---------------|-------------|
| `aiProtocol` | string | `"openai"` | AI summary protocol; currently, Swift service supports OpenAI-compatible chat completions |
| `aiApiKey` | string | — | AI summary API Key; primarily exists in macOS Keychain, may appear as `@keychain` in JSON |
| `aiModel` | string | `"gpt-4o-mini"` | AI summary model |
| `titleProvider` | string | `"ollama"` | Title generation provider: `ollama`, `openai`, or `custom` |
| `titleApiKey` | string | — | Title generation API Key; used by non-Ollama providers, primarily exists in macOS Keychain |
| `titleModel` | string | `"qwen2.5:3b"` | Title generation model |
| `ollamaUrl` | string | `"http://localhost:11434"` | Old embedding compatibly reserved field; not used by Swift service |
| `ollamaModel` | string | `"nomic-embed-text"` | Old embedding compatibly reserved field; not used by Swift service |
| `embeddingDimension` | number | `768` | Old embedding compatibly reserved field; not used by Swift service |
Old peer-sync settings keys (`syncNodeName`, `syncEnabled`, `syncIntervalMinutes`, `syncPeers`) may still exist in old configurations; Swift service compatibly reserves but does not read, enable, or trigger peer sync.
## Adding a New Adapter
Product adapters are primarily implemented in Swift; TypeScript adapters are reserved as dev/reference/fixture material.
**Swift Product Path:**
- Adapters: `macos/Shared/EngramCore/Adapters/Sources/`
- Indexing and backfill: `macos/EngramCoreWrite/Indexing/`
- Service commands: `macos/EngramService/Core/`
- MCP routing: `macos/EngramMCP/Core/MCPToolRegistry.swift`
TypeScript reference interface (`src/adapters/types.ts`):
```typescript
interface SessionAdapter {
readonly name: SourceName // Tool identifier
detect(): Promise<boolean> // Detect if the tool is installed
listSessionFiles(): AsyncGenerator<string> // Enumerate all session file paths
parseSessionInfo(filePath: string): Promise<SessionInfo | null> // Parse file metadata
streamMessages(filePath: string, opts?: StreamMessagesOptions): AsyncGenerator<Message> // Stream messages
}
```
**Steps:**
1. Implement product behavior in Swift adapter/indexer/backfill paths
2. Supplement Swift fixture/parity tests
3. Only synchronize `src/adapters/**` if retained TypeScript fixture tooling is needed
4. Write corresponding Swift/TypeScript regression tests based on existing tests
**Implementation Reference:** Swift adapters are product implementations; `src/adapters/codex.ts` can still serve as historical/reference material.
## Data Storage and Privacy
- **Index Library Location:** `~/.engram/index.sqlite`, storing metadata (session ID, time, path, summary), FTS full-text search index, and compatibly reserved embedding tables
- **Original Files:** Complete message content is always read from the original log files of AI tools, without additional copying
- **Privacy Desensitization:** Exports and web previews use built-in sensitive content desensitization; the index library establishes FTS based on original local logs and does not support user-configured index time regular replacements
- **Data Does Not Leave the Device:** `EngramService`, `EngramMCP`, and macOS App run locally, not sending data to any remote service (unless you explicitly configure and use a remote AI summary/title provider)
### Restoring user data
`EngramService` periodically writes small user-data backups to
`~/.engram/backups/user-data-<UTC yyyyMMdd-HHmmss>.sqlite`. These are not whole
database snapshots and they are not project-directory file backups. They contain
only user-authored Engram rows: `insights`, manual/hidden/named session columns,
`session_local_state` without `local_readable_path`, `project_aliases`, and
`migration_log`, plus favorites and manually curated related-session links.
To restore after rebuilding `~/.engram/index.sqlite`, first let Engram re-index
the original AI-tool session files so `sessions.id` rows exist again. Then quit
Engram and run a manual SQLite restore using the backup file:
```sql
ATTACH DATABASE '/Users/<you>/.engram/backups/user-data-YYYYMMDD-HHMMSS.sqlite' AS backup;
INSERT OR IGNORE INTO insights(
id, content, wing, room, source_session_id, importance, has_embedding,
created_at, insight_type, superseded_by, last_accessed_at, access_count
)
SELECT id, content, wing, room, source_session_id, importance, has_embedding,
created_at, insight_type, superseded_by, last_accessed_at, access_count
FROM backup.insights;
UPDATE sessions
SET parent_session_id = COALESCE(
(SELECT parent_session_id FROM backup.sessions b WHERE b.id = sessions.id AND b.link_source = 'manual'),
parent_session_id
),
link_source = COALESCE(
(SELECT link_source FROM backup.sessions b WHERE b.id = sessions.id AND b.link_source = 'manual'),
link_source
),
hidden_at = COALESCE((SELECT hidden_at FROM backup.sessions b WHERE b.id = sessions.id), hidden_at),
custom_name = COALESCE((SELECT custom_name FROM backup.sessions b WHERE b.id = sessions.id), custom_name)
WHERE id IN (SELECT id FROM backup.sessions);
INSERT OR IGNORE INTO session_local_state(session_id, hidden_at, custom_name)
SELECT session_id, hidden_at, custom_name FROM backup.session_local_state;
UPDATE session_local_state
SET hidden_at = COALESCE((SELECT hidden_at FROM backup.session_local_state b WHERE b.session_id = session_local_state.session_id), hidden_at),
custom_name = COALESCE((SELECT custom_name FROM backup.session_local_state b WHERE b.session_id = session_local_state.session_id), custom_name)
WHERE session_id IN (SELECT session_id FROM backup.session_local_state);
INSERT OR IGNORE INTO project_aliases(alias, canonical, created_at)
SELECT alias, canonical, created_at FROM backup.project_aliases;
INSERT OR IGNORE INTO migration_log(
id, old_path, new_path, old_basename, new_basename, state, files_patched,
occurrences, sessions_updated, alias_created, cc_dir_renamed, started_at,
finished_at, dry_run, rolled_back_of, audit_note, archived, actor, detail, error
)
SELECT id, old_path, new_path, old_basename, new_basename, state, files_patched,
occurrences, sessions_updated, alias_created, cc_dir_renamed, started_at,
finished_at, dry_run, rolled_back_of, audit_note, archived, actor, detail, error
FROM backup.migration_log;
CREATE TABLE IF NOT EXISTS favorites (
session_id TEXT PRIMARY KEY,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
INSERT OR IGNORE INTO favorites(session_id, created_at)
SELECT session_id, created_at FROM backup.favorites;
CREATE TABLE IF NOT EXISTS session_relations (
a_id TEXT NOT NULL,
b_id TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
PRIMARY KEY (a_id, b_id)
);
INSERT OR IGNORE INTO session_relations(a_id, b_id, created_at)
SELECT a_id, b_id, created_at FROM backup.session_relations;
DETACH DATABASE backup;
```
Do not restore derived tables such as `insights_fts`, `insight_embeddings`,
`session_tools`, analytics tables, `session_local_state.local_readable_path`, or
legacy `memory_insights`; FTS, embedding state, and local readable paths are
regenerated from the source rows when maintenance runs.
## Development
```bash
npm test # Run tests
npm run test:watch # Watch mode
npm run test:coverage # Coverage report
npm run build # Compile TypeScript dev/reference tooling -> dist/
npm run check:adapter-parity-fixtures # Check provider parser parity fixtures
```
macOS App (Menu Bar):
```bash
cd macos
xcodegen generate # Generate Xcode project from project.yml
open Engram.xcodeproj # Build and run in Xcode
```
## License
MIT
MCP Config
Below is the configuration for this MCP Server. You can copy it directly to Cursor or other MCP clients.
mcp.json
Connection Info
You Might Also Like
No recommendations available