Skip to main content
Glama
README.md
# eve-mcp

MCP-server voor **EVE** (klembord- en transcriptiegeschiedenis op de Mac), uitgebreid met drie
tools voor [RoxyBot](https://github.com/netvistamedia/roxybot), de spraakgestuurde Android-launcher.
In RoxyBot heet deze bron "BioBASE".

De server roept de `eve`-CLI aan en geeft de JSON terug. Alle data blijft op de Mac.

## Tools

| Tool | Doet |
|---|---|
| `eve_search`, `eve_recent`, `eve_get`, `eve_activity`, `eve_app_stats`, `eve_categories`, `eve_categorize`, `eve_restore`, `eve_get_selection`, `eve_ingest_recording`, `eve_export_clip`, `eve_live_talk` | De bestaande EVE-tools (ongewijzigd) |
| `contacts_resolve` | naam → `{contact: {naam, nummer}}` of `{contact: null}` |
| `profile_get` | sleutel (`thuis`, `werk`) → `{sleutel, waarde}` |
| `log_append` | `{type, doel, ts, status, inhoud?}` → `{ack: true}` |

RoxyBot vertaalt `memory_query` naar `eve_search`. Via de relay mag de bot alleen
`contacts_resolve`, `profile_get` en `memory_query` gebruiken; `log_append` roept alleen de telefoon
zelf aan. De telefoon dwingt dat af.

## Vereisten

- macOS met de EVE-app en de `eve`-CLI (standaard `/opt/homebrew/bin/eve`)
- Node.js 20 of nieuwer
- Voor RoxyBot: [Tailscale](https://tailscale.com) op de Mac en op de telefoon

## Installeren

```bash
git clone https://github.com/netvistamedia/eve-mcp.git
cd eve-mcp
npm install
npm test          # compileert (tsc) en draait de tests; raakt geen draaiende dienst
```

> `npm run build` voert na het compileren `launchctl kickstart … ai.eve.mcp` uit. Gebruik
> `npx tsc` of `npm test` als je alleen wilt bouwen.

### Als MCP-server voor Claude Code (stdio)

Wijs de bestaande `eve`-server in je Claude-config naar deze build:

```json
"eve": {
  "command": "/opt/homebrew/bin/node",
  "args": ["/pad/naar/eve-mcp/dist/index.js"],
  "env": { "EVE_BIN": "/opt/homebrew/bin/eve" }
}
```

Of kopieer `dist/` over een bestaande installatie, bijvoorbeeld `~/.claude/eve-mcp/dist`.

## RoxyBot-gegevens

De drie RoxyBot-tools lezen en schrijven in `~/Library/Application Support/eve/roxybot/`
(of `EVE_ROXYBOT_DIR`). Maak de twee JSON-bestanden zelf aan:

```json
// contacts.json
[{ "naam": "Sarah de Vries", "nummer": "+31612345678", "aliassen": ["Sarah"] }]
```

```json
// profile.json
{ "thuis": "Keizersgracht 1, Amsterdam", "werk": "Stationsplein 2, Utrecht" }
```

`log_append` schrijft regels naar `log.jsonl` in dezelfde map (alleen leesbaar voor jou).
Past een naam bij meer dan één contact, dan geeft `contacts_resolve` `null`: liever niets dan
de verkeerde persoon bellen.

## HTTP-modus voor RoxyBot (via Tailscale)

RoxyBot bereikt EVE via Streamable HTTP op je Tailscale-adres, met een bearer-token. Zonder
`EVE_MCP_TOKEN` weigert de HTTP-modus te starten.

### Eenmalig proberen

```bash
export EVE_BIN=/opt/homebrew/bin/eve
export EVE_MCP_HOST=$(tailscale ip -4)     # 100.x.y.z — alleen het tailnet
export EVE_MCP_PORT=8787
export EVE_MCP_TOKEN=$(openssl rand -hex 32)
node dist/index.js
# eve-mcp: Streamable HTTP on http://100.x.y.z:8787/mcp
```

### Blijvend via launchd

Maak `~/Library/LaunchAgents/ai.eve.mcp.plist` (vul paden, adres en token in):

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>ai.eve.mcp</string>
  <key>ProgramArguments</key>
  <array>
    <string>/opt/homebrew/bin/node</string>
    <string>/pad/naar/eve-mcp/dist/index.js</string>
  </array>
  <key>EnvironmentVariables</key>
  <dict>
    <key>EVE_BIN</key><string>/opt/homebrew/bin/eve</string>
    <key>EVE_MCP_HOST</key><string>100.x.y.z</string>
    <key>EVE_MCP_PORT</key><string>8787</string>
    <key>EVE_MCP_TOKEN</key><string>JOUW-TOKEN</string>
  </dict>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><true/>
  <key>StandardErrorPath</key><string>/tmp/eve-mcp.log</string>
</dict>
</plist>
```

```bash
chmod 600 ~/Library/LaunchAgents/ai.eve.mcp.plist        # het token staat erin
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/ai.eve.mcp.plist
launchctl kickstart -k gui/$(id -u)/ai.eve.mcp             # herstarten na een nieuwe build
```

Claude Code start zijn eigen stdio-exemplaar en heeft deze dienst niet nodig.

### Koppelen met RoxyBot

Met dezelfde variabelen als hierboven:

```bash
EVE_MCP_HOST=… EVE_MCP_PORT=… EVE_MCP_TOKEN=… npm run roxybot-qr
```

Dit toont een QR-code (`roxybot-eve://<host>:<poort>?token=<token>&v=1`). Scan hem in RoxyBot
via instellingen → BioBASE (EVE) → QR-code scannen, of vul host, poort en token daar handmatig
in. Het script accepteert alleen Tailscale-adressen.

## Beveiliging

- De HTTP-modus luistert alleen op het opgegeven adres; gebruik je Tailscale-IP, niet `0.0.0.0`.
- Het token geeft toegang tot je EVE-geschiedenis: bewaar het niet in gedeelde bestanden en laat
  de QR-code niet open in beeld staan.
- RoxyBot bewaart het token versleuteld in Android Keystore en praat alleen met Tailscale-adressen.

## Licentie

MIT — zie [LICENSE](LICENSE).

TDQS

A3.8/5.0

Scored across 15 tools

Disambiguation4/5

Most tools target clearly distinct resources or actions: search vs recent vs get vs selection vs export are separable, and the RoxyBot helpers (contacts_resolve, log_append) and profile_get stand apart. The main overlap is eve_activity vs eve_app_stats, which both produce aggregate counts and differ only in grouping scope; the descriptions help but an agent could pick the wrong one for 'how much did I copy from Safari'.

Naming Consistency4/5

Consistent snake_case throughout, with domain prefixes (eve_, profile_, log_, contacts_) applied predictably to their respective areas. Minor deviation: some eve_ tools are verb-led (eve_search, eve_get, eve_restore, eve_categorize) while others are noun-led (eve_activity, eve_categories, eve_app_stats), so the action isn't always the second token, but the set stays readable.

Tool Count4/5

15 tools covers a genuinely broad surface — clipboard/dictation history, recordings, export, categories, live voice conversation, and phone-side logging/contacts. It sits at the top of the comfortable range but each tool maps to a distinct operation with no obviously redundant entries.

Completeness3/5

Read and organize workflows are well covered (search, recent, get, stats, categories, categorize, restore, export, live talk). Notable gaps: no category create/delete or rename, no way to write profile values (profile_get is read-only), and no entry delete — only restore of soft-deletes — leaving dead ends for common lifecycle operations.

Maintenance

ActivityMaintained
ResponsivenessNo issues