⏳ This skill is pending AI review.

Scores will appear once the review pipeline completes.

version unknown

eve-esi

@burnshall-ui⭐ 5 stars

Discord webhook URL for sending alerts and reports. Only needed if Discord notifications are configured.

—/10

// RATINGS

⭐GitHub Stars
⭐ 5 on GitHubGitHub ↗

New / niche

🟢ProSkills Score
—
📍

Not yet listed on ClawHub or SkillsMP

// README

EVE ESI Skill for OpenClaw

Ask your agent what New Eden is up to — wallet, skills, industry, and what your planets are doing while you are docked somewhere else entirely.

An OpenClaw skill for the EVE Online ESI API (EVE Swagger Interface). Read-only by default, no pip dependencies, tokens stay on your machine.

Contents


What it does

AuthenticationEVE SSO OAuth2 with PKCE, no client secret. Tokens auto-refresh and rotate.
Multi-characterUnlimited characters under named keys — main, alt1, whatever you call them.
Planetary InteractionExtractor timers, storage fill, factory routing, and a parsed "needs attention" verdict per planet.
MarketGlobal adjusted/average prices, plus live Jita buy/sell for a single type.
Threat assessmentSystem scoring from ESI kills and jumps combined with zKillboard PVP data.
Route planningRoutes annotated with a per-system threat level.
ESI queriesGeneric helper with pagination, rate-limit handling and error recovery.
Dashboard configA validated JSON Schema vocabulary for alerts, reports and price tracking. Defines them; does not run them.

Install

cd ~/.openclaw/workspace/skills
git clone https://github.com/burnshall-ui/openclaw-eve-skill eve-esi

Python 3.10+, standard library only for everything in this repo.

Authenticate

Before you start, register an application at developers.eveonline.com:

  1. Callback URL: http://localhost:8080/callback. The portal accepts the http scheme only for the host localhost — 127.0.0.1 is refused on save.
  2. Enable the scopes you may want under Enabled Scopes. A scope profile can only ask for what the application already has enabled, so enabling a scope here does not grant it — it just makes it available to request. Planetary Interaction needs esi-planets.manage_planets.v1; to keep --scope-profile full usable later, enable all 17 listed under Scope profiles.
  3. Note the Client ID (with PKCE there is no client secret to keep)

Then authenticate once per character:

# On a remote server, tunnel the callback port to your browser first:
ssh -L 8080:127.0.0.1:8080 user@your-server -N

python3 scripts/auth_flow.py --client-id <YOUR_CLIENT_ID> --char-name main
# Open the printed URL and log in with your EVE account

Choose how much access to grant. Scopes are granted once and stay granted until you revoke them, so the default asks for the narrow set:

ProfileScopesGrants access to
basic7Skills, skill queue, clones, implants, location, ship, online status
pi (default)8basic plus Planetary Interaction
industry11basic plus assets, industry jobs, market orders, contracts
full17Everything, including wallet balance, ISK history and mail
python3 scripts/auth_flow.py --list-scope-profiles          # exact scopes per profile
python3 scripts/auth_flow.py --client-id <ID> --scope-profile full
python3 scripts/auth_flow.py --client-id <ID> --scopes "esi-skills.read_skills.v1"

The flow prints what it is about to request before opening the browser, and EVE SSO shows you the same list on its consent screen. Nothing is granted until you approve it there.

Tokens land in ~/.openclaw/eve-tokens.json (chmod 600) and rotate on every use. Repeat with a different --char-name for each alt:

python3 scripts/auth_flow.py --client-id <CLIENT_ID> --char-name alt1
python3 scripts/get_token.py --list      # who is authenticated?

Quick start

--char <name> resolves and refreshes the token in-process, so it never touches a command line, your shell history, or a log file. Prefer it over passing --token.

SKILL=~/.openclaw/workspace/skills/eve-esi
CHAR_ID=<your_character_id>

# Wallet balance
python3 $SKILL/scripts/esi_query.py --char main \
  --endpoint "/characters/$CHAR_ID/wallet/" --pretty

# Skill queue
python3 $SKILL/scripts/esi_query.py --char main \
  --endpoint "/characters/$CHAR_ID/skillqueue/" --pretty

# Every asset you own, following pagination
python3 $SKILL/scripts/esi_query.py --char main \
  --endpoint "/characters/$CHAR_ID/assets/" --pages --pretty

# Planets, and what needs attention on them
python3 $SKILL/scripts/esi_query.py --action pi_planets --char main --character-id $CHAR_ID --pretty
python3 $SKILL/scripts/esi_query.py --action pi_status  --char main --character-id $CHAR_ID --pretty

# Market — public data, no authentication needed
python3 $SKILL/scripts/esi_query.py --action jita_price --type-id 2393 --pretty
python3 $SKILL/scripts/esi_query.py --action market_price_bulk --pretty

Planetary Interaction

High-level actions that turn raw ESI output into something you can act on.

# All planets for a character
python3 $SKILL/scripts/esi_query.py --action pi_planets \
  --char main --character-id $CHAR_ID --pretty

# Extractor timers, storage fill, attention flags
python3 $SKILL/scripts/esi_query.py --action pi_status \
  --char main --character-id $CHAR_ID --pretty

# One planet in detail
python3 $SKILL/scripts/esi_query.py --action pi_planet_detail \
  --char main --character-id $CHAR_ID --planet-id <PLANET_ID> --pretty

pi_status returns per planet:

FieldDescription
planet_nameResolved planet name (e.g. "Ikoskio VII")
extractorsProduct, expiry time, hours remaining, status
storage_fill_pctEstimated launchpad/storage fill
factoriesInput/output product routing
needs_attentiontrue when an extractor runs dry in < 6 h or storage exceeds 80 %
action_requiredPlain-language description of what to do

A limit worth knowing up front: ESI exposes PI as read-only. This skill will tell you that an extractor expires in four hours and that your launchpad is nearly full — it cannot restart the extractor, reroute a product, or touch the layout. That part still happens in the client.

Market prices

# Adjusted and average prices for every type in the game
python3 $SKILL/scripts/esi_query.py --action market_price_bulk --pretty

# Live Jita book for one type (9832 = Coolant)
python3 $SKILL/scripts/esi_query.py --action jita_price --type-id 9832 --pretty

jita_price reports lowest sell, highest buy, the spread and order counts for The Forge.

Threat assessment and route planning

Intended for deciding whether that low-sec PI run is worth it right now.

python3 $SKILL/scripts/esi_query.py --action system_kills --system-ids 30002537 --pretty
python3 $SKILL/scripts/esi_query.py --action system_jumps --system-ids 30002537 --pretty
python3 $SKILL/scripts/esi_query.py --action system_info  --system-id 30002537 --pretty

python3 $SKILL/scripts/esi_query.py --action route_plan \
  --origin 30000142 --destination 30002537 --route-flag secure --pretty

python3 $SKILL/scripts/esi_query.py --action character_location \
  --char main --character-id $CHAR_ID --pretty

python3 $SKILL/scripts/esi_query.py --action fw_systems --pretty
python3 $SKILL/scripts/esi_query.py --action incursions --pretty

Threat levels

LevelScoreRead as
low0–15Normal operations
medium15–40Quick in, quick out
high40–80Scout or cloak only
critical80+Do not enter

Data sources — all public, none require authentication:

| S

// HOW IT'S BUILT

KEY FILES

SKILL.mdREADME.md

// REPO STATS

5 stars