BirdEye
A local-first mission control for AI agent harnesses, providing a unified MCP gateway for shared memory, task queue, and encrypted secrets across multiple agents.
README
<div align="center">
π¦ BirdEye
One hub, every bird. Local-first mission control for all your AI agent harnesses β Claude Code, Claude Desktop, Codex, opencode, OpenClaw, Zcode, Gemini CLI, Cursor, Continue.
<img src="docs/screenshots/memory-graph.png" alt="BirdEye memory graph" width="900" />
</div>
The problem
If you use more than one AI agent harness, you know this pain:
- Every harness is an island. Each has its own sessions, memories, MCP servers, plugins, skills, and routines. Nothing is shared.
- Memory doesn't travel. What Claude Code learned about you yesterday, Codex re-asks today. Import tools β where they exist β are per-harness and incompatible.
- Credentials multiply. Giving agents access to GitHub means configuring auth in every single harness. N harnesses = N copies of every token.
- Zero visibility. Which harness can touch what? How many tokens has each burned? Nobody can tell you.
- No shared work. You can't assign a task from one place and have different harnesses pick it up.
What BirdEye does
BirdEye is a daemon on 127.0.0.1 + an interactive dashboard + one MCP gateway that every harness joins. Free, MIT, no cloud, no telemetry β your data never leaves your machine.
| Pillar | What you get |
|---|---|
| πΊοΈ Unified inventory | Read-only adapters scan all 9 harnesses' on-disk state into one normalized model: sessions, memories, skills, plugins, MCP servers, agents, credential key names, usage. |
| π§ Collective memory | Every harness's native memory imported, deduped, and rendered as an interactive memory graph. Two-way: birdeye memory sync-back writes a shared memory pack into each harness's context file (CLAUDE.md, GEMINI.md, AGENTS.mdβ¦) inside safe marker blocks. |
| π MCP gateway + vault | One MCP server every harness registers with a single line. Any agent in any harness gets memory_search / memory_save, a shared task queue, and vault_get β secrets stored once, AES-256-GCM encrypted. |
| π― Missions | A shared task board. Write a briefing once, dispatch to any harness with a headless CLI (claude -p, codex exec, opencode run, gemini -p) and watch output stream live. |
<div align="center"> <img src="docs/screenshots/aviary.png" alt="Aviary β fleet overview" width="900" /> </div>
Quick start
Requires Node β₯ 23.6 (BirdEye runs TypeScript natively β no build step for the daemon).
git clone https://github.com/zanni098/BirdEye.git
cd BirdEye
npm install
npm run build # builds the dashboard (one-time, ~1s)
npm run demo # β http://127.0.0.1:4477 with rich demo data
# or scan YOUR machine:
npm run up
Then wire your harnesses into the hub:
node packages/cli/bin/birdeye.ts scan # inventory every harness
node packages/cli/bin/birdeye.ts register claude-code # add the BirdEye MCP gateway (with backup)
node packages/cli/bin/birdeye.ts register codex # ...same one-liner for each harness
node packages/cli/bin/birdeye.ts vault set GITHUB_TOKEN ghp_yourtoken
node packages/cli/bin/birdeye.ts memory sync-back # push shared memory into every context file
The dashboard
Seven views, live over WebSocket:
- Aviary β fleet overview: one card per harness with health, counts, warnings, dispatch capability.
- Memory Graph β the shared brain, drawn: memories colored by source harness, tags, auto-extracted entities,
[[links]]. Drag, zoom, filter, click any node for full detail. - Missions β task board with live dispatch streaming.
- Sessions β cross-harness session timeline with filters.
- Arsenal β skills / plugins / MCP matrix: see instantly that
githubMCP is configured 4 separate times. - Access β which harness holds which credential keys (names only), with duplication flagged β plus the encrypted vault.
- Usage β tokens and cost per harness. Honest: harnesses that don't log usage show unknown, never invented numbers.
<div align="center"> <img src="docs/screenshots/missions.png" alt="Missions β dispatch board" width="440" /> <img src="docs/screenshots/access.png" alt="Access β credential matrix and vault" width="440" /> </div>
Harness support
| Harness | Sessions | Memories | Skills | Plugins | MCP | Usage | Dispatch |
|---|---|---|---|---|---|---|---|
| Claude Code | β | β | β | β | β | β | β‘ claude -p |
| Claude Desktop | β | β | β | β | β | β | manual |
| Codex | β | β | β | β | β | β | β‘ codex exec |
| opencode | β | β | β | β | β | β | β‘ opencode run |
| OpenClaw | β | β | β | β | β | β | manual |
| Zcode | β | β | β | β | β | β | manual |
| Gemini CLI | β | β | β | β | β | β | β‘ gemini -p |
| Cursor | β | β | β | β | β | β | manual |
| Continue | β | β | β | β | β | β | manual |
β full Β· β best-effort Β· β the harness doesn't expose it on disk
The MCP gateway
birdeye register <harness> adds one entry to that harness's MCP config (original backed up first). After that, any agent in any harness can call:
| Tool | Does |
|---|---|
memory_search {query} |
search the unified, deduped memory of all harnesses |
memory_save {title, body, tags?} |
save a memory every other harness can recall |
task_list / task_claim / task_update |
the shared work queue |
vault_get {key} |
fetch a secret stored once in the encrypted vault |
Security model
- The daemon binds
127.0.0.1only. No telemetry, no outbound calls. - Adapters are read-only; scanning never touches your harness files.
- Credential values are never read from harness configs β key names only. The dashboard never displays secret values;
vault_getflows only over local stdio MCP. - Vault: AES-256-GCM, scrypt-derived key (
BIRDEYE_VAULT_PASSPHRASE, or a machine-derived default). - The only writers β
register,sync-env,memory sync-backβ are explicit commands that create timestamped backups and, for context files, only ever touch the<!-- BIRDEYE:START/END -->block.
How it runs
TypeScript monorepo, zero native dependencies, no compile step for the daemon (Node's native type-stripping). Vite builds the dashboard once.
packages/core types Β· JSON store Β· dedup Β· memory graph Β· marker sync Β· vault
packages/adapters 9 harness scanners + registry (failure-isolated)
packages/server Hono daemon: REST + WebSocket + dispatcher + demo mode
packages/mcp the MCP gateway (stdio) + per-harness registration snippets
packages/cli birdeye up Β· scan Β· register Β· vault Β· sync-env Β· memory Β· dispatch
apps/dashboard React + d3-force dashboard
npm test β 62 tests across every package, fixture-driven.
Honest limits (v1)
- Usage stats depend on what each harness logs locally β rich for Claude Code/Codex, honest unknown elsewhere.
- Cursor/Continue chat data lives in app-internal storage; those adapters are shallower.
- Dispatch needs the harness CLI on your PATH.
- Cross-harness collaboration is via shared memory + shared task queue; automatic result-chaining between harnesses is on the roadmap.
Roadmap
- [ ] Result-chaining: harness A's output feeds harness B's next task
- [ ] Embedding-based memory similarity edges (currently: links, tags, entities)
- [ ] More adapters β Aider, Windsurf, Clineβ¦ (add one β it's ~100 lines)
- [ ]
npx birdeyeas a published npm package
Contributing
Adapters are the sweet spot β one focused file + a fixture + a test. See CONTRIBUTING.md.
MIT Β© BirdEye contributors
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.