EVE Online Companion MCP Server
# EVE Online Companion — MCP Server
Ein MCP-Server (Model Context Protocol) fuer Claude Code, der als persoenlicher EVE Online Companion dient. Gibt Claude direkten Zugriff auf Character-Daten, Marktpreise, Killboard-Intel, Wiki-Wissen und mehr — alles ueber natuerliche Sprache.
## Was kann das?
**"Kann ich die Ishtar fliegen?"** — Prueft deine Skills und zeigt fehlende mit Trainingszeit.
**"Was kostet ein Warp Disruptor II in Jita?"** — Holt Live-Marktdaten von ESI.
**"Wie gefaehrlich ist der Pilot XY?"** — Checkt zKillboard-Stats, Danger-Rating, Top-Ships.
**"Zeig mir meine Fittings fuer die Vexor"** — Listet gespeicherte Fits im EFT-Format.
**"Erklaer mir Wormhole-Mechaniken"** — Durchsucht die EVE University Wiki.
### Alle 29 Tools
| Kategorie | Tools | Beschreibung |
|---|---|---|
| **Auth** | `eve_auth_login` | SSO-Login (blockiert bis Callback) |
| | `eve_auth_start` | SSO-Login (non-blocking, oeffne localhost:8834) |
| | `eve_auth_status` | Auth-Status + Character-Info |
| **Character** | `eve_character_info` | Name, Corp, Alliance, Wallet, SP, Location, Ship |
| | `eve_character_skills` | Skills filtern nach Gruppe oder Name |
| | `eve_character_skillqueue` | Aktuelle Skill-Queue mit Zeiten |
| | `eve_character_implants` | Eingesteckte Implants |
| **Location** | `eve_location_current` | System, Station, Schiff, Online-Status |
| | `eve_route_plan` | Route berechnen (shortest/secure/insecure) |
| | `eve_set_destination` | Autopilot-Ziel im Spiel setzen |
| **Fittings** | `eve_fitting_list` | Gespeicherte Fittings (EFT-Format) |
| | `eve_fitting_save` | Fitting aus EFT-String speichern |
| | `eve_fitting_analyze` | Fitting-Analyse (Tank, DPS, Cap — Dogma-basiert) |
| **Market** | `eve_market_price` | Preis-Check (Jita default, andere Regionen moeglich) |
| | `eve_market_appraise` | Itemliste bewerten (Copy-Paste aus dem Spiel) |
| | `eve_market_orders` | Eigene aktive Kauf-/Verkaufsauftraege |
| **Intel** | `eve_intel_character` | Pilot-Intel: Corp, Kills, Danger-Rating, Top-Ships |
| | `eve_intel_corporation` | Corp-Intel: Members, Alliance, Killboard-Stats |
| | `eve_intel_system` | System-Intel: Kills, Jumps, NPC-Kills, Ratting |
| | `eve_killmail_analyze` | Killmail aufschluesseln: Fit, Attacker, Damage |
| **Assets** | `eve_assets_search` | Assets nach Name/Typ durchsuchen |
| | `eve_wallet_balance` | Wallet-Balance |
| | `eve_wallet_journal` | Letzte Wallet-Eintraege |
| **Universe** | `eve_type_info` | Item/Ship-Details mit Dogma-Attributen |
| | `eve_system_info` | System-Details: Sec, Region, Stationen |
| | `eve_search` | Universelle Suche (Chars, Corps, Systems, Items) |
| **Wiki** | `eve_wiki_search` | EVE University Wiki durchsuchen |
| | `eve_wiki_article` | Wiki-Artikel lesen (als Markdown) |
| **Fleet** | `eve_fleet_info` | Fleet-Status (wenn in Fleet) |
---
## Setup
### 1. EVE Developer Application
1. Gehe zu **https://developers.eveonline.com/**
2. "Create New Application"
3. Application Type: **Authentication & API Access**
4. Callback URL: **`http://localhost:8834/callback`**
5. Alle Scopes aus der Liste unten auswaehlen
6. **Client ID** notieren (Secret Key optional, nur fuer confidential apps)
<details>
<summary><strong>Benoetigte ESI Scopes (20)</strong></summary>
```
esi-skills.read_skills.v1
esi-skills.read_skillqueue.v1
esi-clones.read_implants.v1
esi-assets.read_assets.v1
esi-wallet.read_character_wallet.v1
esi-fittings.read_fittings.v1
esi-fittings.write_fittings.v1
esi-characters.read_standings.v1
esi-killmails.read_killmails.v1
esi-location.read_location.v1
esi-location.read_ship_type.v1
esi-location.read_online.v1
esi-fleets.read_fleet.v1
esi-markets.read_character_orders.v1
esi-contracts.read_character_contracts.v1
esi-mail.read_mail.v1
esi-ui.open_window.v1
esi-ui.write_waypoint.v1
esi-search.search_structures.v1
esi-universe.read_structures.v1
```
</details>
### 2. Installation
```bash
git clone <repo>
cd eve
npm install
npm run build
```
### 3. Konfiguration
```bash
mkdir -p ~/.eve-mcp
```
Erstelle `~/.eve-mcp/config.json`:
```json
{
"clientId": "deine-client-id-von-ccp",
"callbackUrl": "http://localhost:8834/callback",
"userAgent": "eve-mcp-companion/1.0 (dein-character-name)"
}
```
Optional mit Secret Key (nur bei confidential apps):
```json
{
"clientId": "deine-client-id",
"secretKey": "dein-secret-key",
"callbackUrl": "http://localhost:8834/callback",
"userAgent": "eve-mcp-companion/1.0 (dein-character-name)"
}
```
Alternativ via Environment-Variablen:
```bash
export EVE_MCP_CLIENT_ID="deine-client-id"
export EVE_MCP_CALLBACK_URL="http://localhost:8834/callback"
export EVE_MCP_USER_AGENT="eve-mcp-companion/1.0"
```
### 4. Claude Code Integration
Fuege den MCP-Server in deine Claude Code Settings ein.
**Option A — settings.json** (empfohlen):
Datei: `~/.claude/settings.json`
```json
{
"mcpServers": {
"eve-online": {
"command": "node",
"args": ["/absoluter/pfad/zu/eve/dist/index.js"],
"env": {
"EVE_MCP_TOKEN_PASSPHRASE": "ein-sicheres-passwort"
}
}
}
}
```
**Option B — Projekt-scope** (`.mcp.json` im Projektverzeichnis):
```json
{
"mcpServers": {
"eve-online": {
"command": "node",
"args": ["./dist/index.js"],
"env": {
"EVE_MCP_TOKEN_PASSPHRASE": "ein-sicheres-passwort"
}
}
}
}
```
### 5. Erster Login
Starte Claude Code und sage:
> "Verbinde mich mit EVE Online"
Claude ruft `eve_auth_start` auf und startet einen lokalen Auth-Server. Oeffne **http://localhost:8834** im Browser — dort erscheint eine Login-Seite im EVE-Stil. Klicke "Authenticate via EVE SSO", logge dich bei CCP ein, und du wirst zurueckgeleitet zu einer Erfolgsseite mit deinem Character-Portrait. Fenster schliessen, fertig.
---
## Architektur
```
eve/
├── src/
│ ├── index.ts # Server-Entry, registriert alle Tools
│ ├── config.ts # Laedt ~/.eve-mcp/config.json
│ ├── auth/
│ │ ├── scopes.ts # ESI Scope-Definitionen
│ │ ├── sso.ts # OAuth2 PKCE Flow, Callback-Server
│ │ ├── tokens.ts # Token-Persistence (AES-256-GCM)
│ │ └── pages.ts # HTML-Seiten fuer Auth-Flow
│ ├── clients/
│ │ ├── esi.ts # ESI API Client (Auth, Rate-Limiting, Cache)
│ │ ├── zkillboard.ts # zKillboard Client (10 req/s Throttle)
│ │ ├── evetycoon.ts # EVE Tycoon Markt-Client
│ │ └── wiki.ts # EVE University Wiki (MediaWiki API)
│ ├── tools/
│ │ ├── auth.ts # Login, Status
│ │ ├── character.ts # Character Info, Skills, Queue, Implants
│ │ ├── location.ts # Location, Route, Autopilot
│ │ ├── fitting.ts # Fittings, EFT, Analyse
│ │ ├── universe.ts # Type Info, System Info, Search
│ │ ├── market.ts # Preise, Appraisal, Orders
│ │ ├── killboard.ts # Character/Corp/System Intel, Killmails
│ │ ├── assets.ts # Assets, Wallet
│ │ ├── wiki.ts # Wiki Search, Article
│ │ └── fleet.ts # Fleet Info
│ └── utils/
│ ├── cache.ts # In-Memory Cache mit TTL
│ ├── errors.ts # Error-Klassen + formatToolError()
│ ├── formatting.ts # ISK, Zeit, EVE-Time Formatierung
│ ├── eft.ts # EFT-Format Parser + Generator
│ └── sde.ts # Type/System Name-Resolution (ESI-backed)
├── package.json
├── tsconfig.json
└── README.md
```
### API-Clients
| Client | Base URL | Auth | Rate Limit | Cache |
|---|---|---|---|---|
| ESI | `esi.evetech.net/latest` | OAuth2 Bearer | Error-Limit Header | Expires-Header + custom TTL |
| zKillboard | `zkillboard.com/api` | keine | 10 req/s | 10 Minuten |
| EVE Tycoon | `evetycoon.com/api/v1` | keine | Expires-Header | 5 Minuten |
| Wiki | `wiki.eveuniversity.org/api.php` | keine | keine | 1 Stunde |
### Caching
Alle API-Antworten werden in-memory gecacht:
| Datentyp | TTL |
|---|---|
| Location / Ship / Online | 30 Sekunden |
| Wallet Balance | 2 Minuten |
| Skill Queue | 5 Minuten |
| Market Prices / Orders | 5 Minuten |
| zKillboard Stats | 10 Minuten |
| Assets | 30 Minuten |
| Character Skills | 1 Stunde |
| Wiki Articles | 1 Stunde |
| Type Info / System Info | 24 Stunden |
| Name-zu-ID Resolution | 24 Stunden |
### ESI Rate-Limiting
Der ESI-Client trackt `X-ESI-Error-Limit-Remain` und `X-ESI-Error-Limit-Reset` Header. Wenn das Error-Limit unter 20 faellt, werden Requests bis zum Reset blockiert. Fehler 420 (Error Limit) werden als `RateLimitError` geworfen.
### Token-Sicherheit
- Tokens werden in `~/.eve-mcp/tokens.json` gespeichert
- Wenn `EVE_MCP_TOKEN_PASSPHRASE` gesetzt ist: **AES-256-GCM** Verschluesselung mit scrypt-Key-Derivation
- Ohne Passphrase: Klartext-Speicherung (mit Warnung auf stderr)
- Access-Token wird automatisch 2 Minuten vor Ablauf refreshed
- Refresh-Token wird bei jedem Refresh erneuert (PKCE volatile token pattern)
---
## Entwicklung
```bash
# Dev-Mode (tsx, kein Build noetig)
npm run dev
# Build
npm run build
# Ausfuehren
npm start
```
### Neues Tool hinzufuegen
1. Handler in die passende Datei unter `src/tools/` einfuegen
2. `server.tool(name, description, zodSchema, handler)` Pattern verwenden
3. Fehler immer mit `formatToolError(err)` zurueckgeben
4. ESI-Calls ueber `esi.get()` / `esi.publicGet()` mit passendem Cache-TTL
5. Type-IDs mit `resolveTypeName()` / `resolveTypeId()` aufloesen
### Troubleshooting
**"Config not found"** — `~/.eve-mcp/config.json` anlegen oder `EVE_MCP_CLIENT_ID` setzen.
**"Authentication required"** — `eve_auth_login` oder `eve_auth_start` aufrufen.
**"Token refresh failed"** — Refresh-Token abgelaufen. Erneut einloggen.
**"ESI error limit reached"** — Zu viele fehlerhafte Requests. Wartet automatisch.
**Port 8834 belegt** — Anderen Port in config.json setzen und Callback-URL bei CCP anpassen.
TDQS
Scored across 37 tools
Most tools have distinct purposes with clear domain separation (e.g., auth, character, intel, market, PI, wiki), but some overlap exists: 'eve_auth_login' and 'eve_auth_start' are aliases, and 'eve_character_info' partially overlaps with 'eve_intel_character' for public lookups. Descriptions help clarify, but minor confusion could occur.
Tool names follow a highly consistent snake_case pattern with a clear 'eve_' prefix and descriptive verb_noun combinations (e.g., 'eve_assets_search', 'eve_character_skills', 'eve_market_price'). This predictability makes it easy for agents to understand and navigate the toolset.
With 37 tools, the count feels heavy for a companion server, bordering on excessive. While EVE Online is a complex game, many tools cover niche areas (e.g., PI, wiki) that might be overkill for typical agent workflows, suggesting some consolidation could improve focus.
The toolset provides comprehensive coverage for EVE Online's companion domain, including authentication, character management, intel, market, fittings, navigation, and wiki access. No obvious gaps exist; agents can perform full CRUD/lifecycle operations (e.g., auth, fittings, PI) and access all major game systems without dead ends.