Skip to main content
Glama
apettey

eve-esi-mcp

by apettey

eve-esi-mcp

An MCP server for EVE Online's ESI API that's built for AI assistants rather than just wrapping endpoints.

  • Handles auth. EVE SSO (OAuth2 + PKCE, no client secret needed) with a local callback, refresh-token rotation and JWT verification.

  • Supports several characters. Log in as many characters as you like, pick an active one, or pass character: "Name" to any tool. Tools also compare characters (skill_check).

  • Answers in one call. Each tool resolves names and combines several ESI requests, so the model rarely has to chain lookups. For example, fitting_get returns module names per slot, charges, CPU/PG/calibration usage, ship stats and bonuses, attributes for every module, a skill check with training time, and the fit as EFT and DNA.

  • Uses local static data. The official CCP Static Data Export is downloaded once and indexed into SQLite, so fuzzy item search, attributes, skills, blueprints, systems and stations need no ESI calls. It checks for a new SDE daily.

  • Follows CCP's rules. It sends X-Compatibility-Date and a descriptive User-Agent, honours ETag and Expires caching, fetches X-Pages pages in parallel, and backs off on 420 and 429 responses.

Tools

Area

Tools

Characters

characters_list, character_login, character_select, character_logout

Character data

character_overview (location, ship, wallet, SP and training, alpha/omega, clones, implants, fatigue, LP), character_skills, skill_check

Assets

assets (summary / search / ships), ship_fitting (EFT of a real ship; defaults to the one being flown)

Fittings

fittings_list, fitting_get, fitting_analyze (any EFT), fitting_save, fitting_delete

Items & universe

search_items, item_info, lookup, system_info (includes wormhole class, effect and statics), wormhole_type (K162, H296, ...), route_plan, server_status

Market & money

market_prices, appraise, market_orders (with undercut detection), wallet, contracts

Industry

industry (jobs and blueprints), planets (PI extractor timers, storage)

Comms

mail_list, mail_read, mail_send, notifications, killmails (fits of losses as EFT)

Enemy doctrines

doctrine_from_killmails (zKillboard URLs, filters or killmail ids), doctrine_from_battle_report (both sides of a fight), as bundles for eve-fit's save_doctrine

Game client

ui_action (set destination, add waypoint, open market or info windows)

Anything else

esi_request (any ESI route; handles auth and paging, and adds *_name fields next to IDs)

Example: fitting_get

{
  "name": "Brawler",
  "ship": { "name": "Rifter", "stats": { "CPU Output": "130 tf", "Turret Hardpoints": "3 hardpoints", ... },
            "bonuses": { "Minmatar Frigate (per level)": ["7.5% bonus to Small Projectile Turret rate of fire", ...] } },
  "slots": { "high": [{ "slot": "high:0", "module": "200mm AutoCannon II", "charge": "Republic Fleet EMP S" }, ...],
             "low":  [..., { "slot": "low:3", "module": "(empty)" }] },
  "resources": { "cpu": { "used": "116 tf", "available": "130 tf", "percent": 89.2 }, "turret_hardpoints": "3/3", ... },
  "stats": { "pilot": "custom skills", "skills_used": "My Pilot's trained skills (active levels) with 3 active implant(s).",   // with eve-fit only
             "offense": { "dps": 142.3, "volley": 213.5, ... }, "defense": { "ehp": 4120, "resists_percent": { ... } },
             "capacitor": { "stable": false, "lasts_s": 95 }, "navigation": { "max_speed_m_s": 3240.5, "align_time_s": 4.69 },
             "fitting": { "cpu_tf": { "used": 135.8, "total": 162.5, "percent": 83.5 }, ... } },
  "modules": [{ "name": "Stasis Webifier II", "required_skills": [{ "skill": "Propulsion Jamming", "level": 4, "met": true }],
                "attributes": { "EW - Webbing": { "Maximum Velocity Bonus": "-60%" }, "Turrets": { "Optimal Range": "10,000 m" } } }],
  "skill_check": { "character": "My Pilot", "can_use": false, "missing": [{ "skill": "Small Projectile Turret", "required_level": 5, "trained_level": 4, "training_time": "4d 2h" }] },
  "eft": "[Rifter, Brawler]\nDamage Control II\n...",
  "dna": "587:2889;3:..."
}

The EFT text is also returned as a separate text block, so it can be copied straight into the game ("Import from Clipboard") or into a fitting engine such as Pyfa.

Accurate fit stats with eve-fit

resources uses static data only, so skills, rigs and module bonuses aren't applied, and many working fits look over budget there. For engine-accurate numbers, fitting_get, ship_fitting and fitting_analyze can use eve-fit-mcp, a fitting engine built on Pyfa. When eve-fit is configured, each fit also gets a stats section with these values:

  • offense: DPS and volley (weapons and drones), range and tracking of the main weapon, missile explosion radius and velocity, and a per-weapon-group breakdown

  • defense: EHP per layer and against each single damage type, resists, sustained and burst tank

  • capacitor: stability, or how long it lasts

  • navigation: speed, align time, signature and warp speed, plus the same values with the prop module off when they differ

  • targeting: lock range, scan resolution and sensor strength

  • fitting: CPU/PG/calibration/drone/cargo usage after skills, plus slot and hardpoint usage

  • any fitting issues and missing skills

eve-esi-mcp starts eve-fit as a child MCP server the first time a fitting tool needs it, then reuses it. Each fit is a single stateless evaluate_fit call (contract eve-fit/evaluate_fit@1). If a character with the skills scope is involved, its active skill levels are sent with the call, along with its active implants if the token has esi-clones.read_implants.v1 and the fit lists no implants of its own. So the stats reflect what that character can actually fly. With no character, the stats use All 5. The pilot and skills_used fields say which skills were used. If eve-fit isn't configured, is too old to have evaluate_fit, or fails, stats is left out and a short stats_note explains why. The rest of the output is unaffected.

In-game saved fittings keep ammo in cargo, and ships in assets often have empty guns, so on its own the engine would report 0 weapon DPS for most real fits. To avoid that, every turret and launcher without a charge is loaded, for the engine's calculation only, with a compatible charge from the fit's cargo. A charge is compatible when its charge group matches and, for turrets, its size matches. The largest stack wins. For ship_fitting, the ship's real cargo hold is used even with include_cargo: false. stats.assumed_charges lists what was loaded (e.g. 200mm AutoCannon II x3: Republic Fleet EMP S (from cargo)), and stats.unloaded_weapons lists weapons with nothing compatible in cargo. The displayed slots, EFT and DNA still show the fit exactly as it is. Pass load_cargo_ammo: false to turn this off.

To enable it, set EVE_FIT_DIR to an eve-fit-mcp checkout (commit 03e5b41 or newer) that has a .venv, or set EVE_FIT_COMMAND/EVE_FIT_ARGS to launch it some other way. A checkout named eve-fit-mcp next to this package is detected automatically. The very first start builds eve-fit's game data and item index, which takes about 30 s. Later starts take a few seconds, and each fit then takes milliseconds. eve-esi-mcp keeps the only ESI tokens; eve-fit's own ESI login isn't used.

Enemy doctrines from killmails

doctrine_from_killmails and doctrine_from_battle_report turn public killmails into doctrine bundles: the hulls a group flies, the unique pilots seen in each, one EFT per loss and the weapons seen on their kills. The model passes a bundle unchanged to eve-fit's save_doctrine(**bundle), then uses analyze_doctrine, fleet_battle or counter_fit there. The shape is a contract shared with eve-fit-mcp (its docs/INTEGRATION.md, "Doctrine bundle"). Fields are only ever added, and each addition is agreed with eve-fit first.

{
  "name": "Fraternity. comp",
  "description": "From 40 zKillboard killmails, ... Pilots counted: Fraternity. ...",
  "source": { "type": "zkillboard", "url": "https://zkillboard.com/alliance/99003581/", "kill_ids": [139468949, ...], "fetched_at": "2026-10-27T11:04:40Z" },
  "ships": [
    { "ship": "Harbinger", "label": "Harbinger", "count": 4, "efts": ["[Harbinger, km 139468923]\n...", ...], "pilots_seen": 4 },
    { "ship": "Caracal Navy Issue", "label": "Caracal Navy Issue", "count": 7, "efts": [], "pilots_seen": 7,
      "weapons_seen": ["Caldari Navy Scourge Light Missile", "Inferno Rage Heavy Assault Missile"] }
  ]
}
  • count is the number of unique pilots in that hull, victims and attackers. Capsules, NPCs and structures are left out.

  • Each EFT shows a loss as it was flown: fitted modules with their loaded charges (command burst charges included), drones up to the hull's bandwidth and five in space, and fighters in tubes. Cargo, implants, the rest of the drone bay and anything past the hull's racks are dropped, because eve-fit rejects fits that don't fit the hull. A hull seen only among attackers has efts: [], which eve-fit keeps as a bare-hull placeholder.

  • doctrine_from_killmails takes zKillboard list URLs (/alliance/<id>/, /corporation/<id>/losses/, /ship/<id>/, ...), filters (alliance, corporation, character, ship, side, past_hours up to 7 days) or killmail id+hash pairs. The killmails themselves are read from ESI. It counts the pilots of the entity in the URL or filter, or of members_of. With neither (a ship or system feed, or a list of kills), it counts the victims' alliances or corporations.

  • doctrine_from_battle_report takes a zKillboard related URL (zkillboard.com/related/<system>/<YYYYMMDDHH00>/), a br.evetools.org/related/... URL, or system + time. It returns {"sides": [bundle_A, bundle_B]}, using zKillboard's split of the pilots into sides. It reads up to fits_per_hull losses (default 5) per hull and side. zKillboard has no batch lookup for killmail hashes, so each loss it reads costs one zKillboard request.

  • zKillboard is called with the same User-Agent as ESI, through a short in-memory cache, with at most three requests at a time.

Wormhole rollers

A fit counts as a roller when its name or description mentions rolling, it has a Higgs Anchor rig, or it carries more than one prop module. fitting_get, ship_fitting and fitting_analyze then add a rolling section. It gives the hull mass and the jump mass cold (no prop running) and hot with each prop module, since prop modules add mass only while they run. Plates and Higgs Anchors are included. It also gives roller advice:

  • Fit the biggest microwarpdrive. It adds the most mass and is the fastest way back to the hole.

  • Back it up with an afterburner of the same size. A warp scrambler shuts the MWD off, but the afterburner still runs and adds the same mass, so you can still jump hot and crush the hole.

  • A smaller prop module (e.g. a 500MN MWD on a capital) adds about a tenth of the mass and is flagged as probably not worth the slot.

The masses come from static data, so check them in game or in Pyfa before relying on exact numbers.

Related MCP server: EVE ESI LLM Bridge

Setup

1. Register an EVE application

  1. Go to https://developers.eveonline.com/applications and create an application.

  2. Set the Callback URL to http://localhost:8642/callback.

  3. Under Scopes, add the scopes you want to allow. The default standard preset needs the scopes in src/auth/scopes.ts. Enable more if you plan to log in with the full preset (which adds corporation scopes).

  4. Copy the Client ID. You don't need the secret, because the server uses PKCE.

2. Install

git clone https://github.com/apettey/eve-esi-mcp.git
cd eve-esi-mcp
npm install
npm run build

Requires Node.js 22.13 or later (it uses the built-in node:sqlite).

3. Add it to your MCP client

Claude Code:

claude mcp add eve-esi -e EVE_CLIENT_ID=your_client_id -e EVE_CONTACT=you@example.com -- node /path/to/eve-esi-mcp/dist/index.js

Claude Desktop (claude_desktop_config.json) or any other stdio MCP client:

{
  "mcpServers": {
    "eve-esi": {
      "command": "node",
      "args": ["/path/to/eve-esi-mcp/dist/index.js"],
      "env": {
        "EVE_CLIENT_ID": "your_client_id",
        "EVE_CONTACT": "you@example.com"
      }
    }
  }
}

On first start the server downloads and indexes the static data (about 100 MB, usually under a minute). Public tools such as item search and market prices work without logging in.

4. Log in a character

Ask your assistant to "log in my EVE character". It calls character_login, which opens the EVE login page in your browser. Repeat this for each character. You can also log in from a terminal:

node dist/index.js login            # standard scopes
node dist/index.js login full       # include corporation scopes
node dist/index.js characters       # list stored characters

Configuration

Variable

Default

Purpose

EVE_CLIENT_ID

—

Client ID of your EVE application (required for login)

EVE_CLIENT_SECRET

—

Optional; set it to use the confidential-client flow instead of PKCE

EVE_CALLBACK_URL

http://localhost:8642/callback

Must match the application's callback URL

EVE_ESI_MCP_HOME

~/.eve-esi-mcp

Data directory (characters, SDE index, name cache)

EVE_CONTACT

—

Email or Discord handle added to the User-Agent, as CCP asks

EVE_SCOPES

standard preset

Default scopes for character_login

EVE_OPEN_BROWSER

true

Set to false to only return the login URL

EVE_FIT_DIR

sibling ../eve-fit-mcp if present

eve-fit-mcp checkout. Launched as .venv Python -m eve_fit_mcp.server for accurate stats

EVE_FIT_COMMAND

—

Command that starts eve-fit over stdio. Overrides EVE_FIT_DIR. Set it to off to disable the integration

EVE_FIT_ARGS

—

Arguments for EVE_FIT_COMMAND, separated by spaces or given as a JSON array

EVE_FIT_CWD

—

Working directory for EVE_FIT_COMMAND

Data and security

  • Refresh tokens are stored in characters.json in the data directory, with owner-only file permissions where the OS supports them. Anyone who can read that file can access the characters' data within the granted scopes. Use character_logout to revoke a token.

  • fitting_save, fitting_delete, mail_send, ui_action, route_plan with set_destination, and non-GET esi_request calls change things in your account or game client. The tool descriptions tell the model to confirm with you first.

  • Wormhole class, system effects with their modifiers, and wormhole type attributes (destination, mass, lifetime) come from the SDE. The SDE doesn't list statics, so these come from WormholeSystems (data/static/wormhole_systems.json, MIT licence, © 2026 WormholeSystems), vendored in src/sde/wormhole-statics.ts. Run node scripts/update-wormhole-statics.mjs to refresh it.

  • Fitting resource numbers in resources come from static data, so skills, rigs and module bonuses aren't applied. For exact stats, configure eve-fit (see above).

  • The doctrine tools read public data only (zKillboard's API and public ESI killmails). No character or token is involved.

  • With eve-fit enabled, a character's skill levels and implant type ids are sent to the local eve-fit process for each fit. Nothing is stored there, and no tokens are shared.

Development

npm run build    # compile TypeScript to dist/
npm test         # builds, then runs unit and tool tests (SDE-backed tests run when an SDE index exists)
node scripts/smoke.mjs '[["system_info",{"system":"Jita"}]]'   # call tools on the built server over stdio
node dist/index.js sde-update   # force a static data refresh

When working on this repo with Claude Code, CLAUDE.md and the project skills in .claude/skills/ describe how tools should be designed (adding-eve-tools), unit-tested (testing-eve-esi) and safely tested against a live character (live-testing-eve-esi).

The server targets ESI compatibility date 2026-08-18 (COMPATIBILITY_DATE in src/config.ts). Check /meta/changelog before you bump it.

License

MIT. EVE Online and all related materials are the intellectual property of CCP hf.

Available Tools

35 tools
appraiseAppraise a list of itemsA
Read-only

Values free-form item text at a market (default Jita 4-4): EFT fits, in-game inventory/cargo copy-paste (tab separated), 'Item x10', '10 Item' lines. Returns per-item buy/sell unit and totals, volume, and unrecognized lines.

NameRequiredDescriptionDefault
textYesThe item list or EFT fit.
locationNoMarket location (default 'jita').

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a read-only, open-world operation. The description adds useful behavioral detail by explaining that it returns per-item buy/sell unit prices, totals, volume, and unrecognized lines, which goes beyond the safety annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with no wasted wording. The core action and default market are front-loaded, followed by accepted input formats and return contents.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, read-only, no-output-schema tool, the description covers the input formats, default market, and return shape. With annotations covering safety and schema covering parameters, no critical agent-facing information appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters. The description still adds meaning by clarifying accepted free-form text formats and by naming the default location as Jita 4-4 beyond the schema's shorter 'jita' default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb, "Values," and clearly identifies the resource as free-form item text, with concrete examples of accepted formats and a default market. An agent can distinguish this list-appraisal tool from general lookup or market-price tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it by listing supported inputs such as EFT fits and inventory/cargo paste, but it does not explicitly state when to prefer it over siblings like market_prices or item_info, nor does it name exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assetsSearch and summarise assetsA
Read-only

A character's assets with names and locations resolved (stations, structures, containers, ships). Modes: 'summary' (per location: item count, estimated value, ships there), 'search' (find items by name/category, with location and container path, plus totals per item), 'ships' (every assembled ship with its name and location). Values use CCP's universe average price. ESI caches assets for up to an hour.

NameRequiredDescriptionDefault
modeNoDefault: 'search' if a query/category is given, else 'summary'.
limitNoMax rows (default 100).
queryNoItem name to find (substring, case-insensitive; e.g. 'Gila', 'Hammerhead II', 'plex').
categoryNoOnly this category (e.g. Ship, Module, Charge, Drone, Blueprint, Material, Planetary Commodities).
locationNoOnly assets whose station/structure/system/region contains this text.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a read-only, open-world operation. The description adds useful behavioral context beyond annotations: names and locations are resolved, values use CCP's universe average price, and ESI asset data may be cached for up to an hour.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it identifies the resource, then mode behavior, then pricing and caching caveats. Every sentence contributes directly to correct invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description still explains the return shape per mode: per-location counts and values for summary, location and container path plus totals for search, and named/located ships for ships. It also covers data freshness and valuation source, leaving no major gap for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description still adds value by explaining what each mode returns and how search/summary/ships differ, exceeding the baseline for fully documented schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource (a character's assets) and concrete modes (summary, search, ships), making the tool's role clear. It does not explicitly distinguish itself from sibling tools such as search_items or appraise, so it falls short of the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The mode descriptions give clear context for selecting summary, search, or ships, and the schema adds the default-mode rule. It does not state when not to use this tool or name sibling alternatives, so it is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

character_loginAuthorize an EVE characterA

Starts EVE SSO login. Opens the user's browser (and returns the URL) so they can pick a character and approve scopes; waits for completion up to wait_seconds. Use again to add more characters or to re-authorize with more scopes. Scope presets: 'standard' (default: personal data read + fittings/mail/waypoint write), 'readonly', 'full' (adds corporation scopes).

NameRequiredDescriptionDefault
scopesNoPreset name or explicit list of ESI scopes.
wait_secondsNoHow long to wait for the user to finish (default 120).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare openWorldHint, so the description carries most of the burden and does well: it discloses the side effect of opening a browser, that a URL is returned, and that the call blocks up to wait_seconds. It does not say what happens on timeout (error vs. pending), which is the one meaningful behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, front-loaded with the action and mechanism before the repeat-use note and preset details. Every sentence carries information not present in the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly notes that the URL is returned as part of the result, and covers blocking behavior and preset semantics. The only missing piece is failure/timeout outcomes for a call that can legitimately not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but the description genuinely adds meaning the schema lacks: it explains what each preset contains ('standard' = personal read plus fittings/mail/waypoint write, 'full' adds corporation scopes) and restates the wait_seconds default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Starts EVE SSO login', and immediately describes the mechanism (opens browser, returns URL, waits). It is unmistakably distinct from siblings like character_select, character_logout, and characters_list, and even calls out the repeat-use case (adding characters, re-authorizing).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use again to add more characters or to re-authorize with more scopes' gives clear context for repeat invocation, and the scope presets imply when to pick 'full'. It stops short of explicit routing (e.g. 'call characters_list first to see already-authorized characters'), so no when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

character_logoutRemove a characterA
Destructive

Revokes the SSO refresh token for a character and removes it from this server. Only do this when the user asks.

NameRequiredDescriptionDefault
characterYesCharacter name or id

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond destructiveHint=true, the description discloses exactly what is destroyed: the SSO refresh token is revoked and the character entry is removed from this server. That is the key operational consequence an agent needs. It doesn't mention re-authentication requirements or irreversibility, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the destructive effect stated first and the usage constraint second. Nothing could be removed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool with a destructiveHint annotation and no output schema, the description covers effect, scope, and usage gate. Minor gaps (whether the user must re-authenticate, whether it is reversible) are not blocking for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter with 100% schema description coverage ('Character name or id'), so the schema already carries the semantics. The description adds no additional detail about accepted formats or name-vs-id resolution, which is the expected baseline when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource pair ('revokes the SSO refresh token... removes it from this server') for a named entity, which is clearly the inverse of character_login. It does not explicitly name a sibling, so it stops short of a 5, but an agent can distinguish it easily.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Only do this when the user asks' gives an explicit gating condition that prevents unsolicited logouts. It does not name alternatives (e.g. character_select to switch characters without removal), so it is clear context but not full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

character_overviewCharacter overviewA
Read-only

One-call snapshot of a character: corp/alliance, security status, online state, current system/station, active ship, wallet, SP and what's training, clones and implants (with clone-jump availability), jump fatigue and loyalty points. Sections the character has no scope for are reported under 'unavailable' rather than failing.

NameRequiredDescriptionDefault
sectionsNoLimit to these sections (default all).
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, and the description adds genuinely non-obvious behavior: sections without scope are reported under 'unavailable' rather than failing, and clone-jump availability is included. That partial-failure contract is the key operational trait an agent needs, though permission/auth requirements are not spelled out.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the 'one-call snapshot' framing, then a dense but purposeful enumeration, closing with the failure-mode caveat. No filler sentences, though the long field list is a single breathless clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the return-value burden itself and does so by enumerating every section and the 'unavailable' bucket. Combined with 100% schema coverage on the two inputs, an agent has everything needed to invoke and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented. The description still adds value by mapping the section enum members to concrete content (e.g. 'fatigue' = jump fatigue, 'skills' = SP and what's training), clarifying what each section selection actually returns.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('One-call snapshot of a character') and then enumerates the exact contents: corp/alliance, security status, online state, system/station, ship, wallet, SP, clones/implants, fatigue, loyalty points. This is unmistakably distinguishable from narrow siblings like character_skills or wallet.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'One-call snapshot' plus the default-all-sections behavior makes clear this is the aggregate read to use when you want breadth in a single call, with the 'sections' param for narrowing. It stops short of explicitly naming alternatives (character_skills, wallet) that an agent could call instead for a single concern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

character_selectSelect active characterA
Idempotent

Makes a logged-in character the default for all character tools. Accepts a name (or unique part of it) or id.

NameRequiredDescriptionDefault
characterYesCharacter name or id

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare idempotentHint=true; the description adds real value by disclosing the global side effect (affects all character tools) and repeat-call safety is implied by idempotency. It omits behavior on lookup failure, ambiguous partial-name matches, and whether selection persists across sessions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the effect and followed by accepted input forms; nothing is redundant or padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, non-destructive context-setting tool with no output schema, this covers purpose, input forms, and blast radius. Only failure modes (unknown or ambiguous character) are left undiscussed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but the description adds meaning beyond the schema's 'Character name or id' by stating that a unique *part* of the name is accepted — a fuzzy-match rule an agent could not infer from the schema. The 'unique' qualifier also hints at ambiguity resolution.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (makes default) and resource scope ('all character tools'), which distinguishes it from character_login and character_logout by describing the effect rather than an auth action. It never explicitly says 'do this after login instead of character_login', so sibling differentiation is implied rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Makes a logged-in character the default' implies a prerequisite (must be logged in) and an ordering (use before other character tools), which is useful context. However, it gives no explicit when-not guidance and never names character_login or characters_list as alternatives for discovering or authenticating a character.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

character_skillsCharacter skills and queueA
Read-only

A character's skills grouped by skill group (names and levels, not ids), attributes, and the training queue with finish times. Use 'filter' to look at specific skills or groups (e.g. 'Gunnery', 'drone', 'Caldari').

NameRequiredDescriptionDefault
filterNoOnly skills whose name or group contains this text.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
include_queueNoInclude the skill queue (default true).

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds useful details beyond them: skill results are keyed by name/group rather than ids, and the queue includes finish times. It does not address failure modes such as an unknown character name or a missing ESI scope, so this is incremental value, not rich behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with what is returned and followed by the one parameter worth explaining. Nothing is repeated from the schema and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing returns, and it does so concisely (grouping, names/levels, attributes, queue finish times) for a three-parameter read-only tool. A note on empty-result behavior or missing-scope errors would round it out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns an extra point by providing concrete example filter values that clarify substring matching across both skill name and group ('drone' matches a group, 'Gunnery' a skill). It does not restate the character or include_queue parameters, but the schema already handles those.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete resource (skill groups, attributes, training queue) and specifies the shape of the return ('names and levels, not ids'), which lets an agent distinguish it from most siblings. It does not explicitly differentiate itself from skill_check, which is the closest alternative, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit positive guidance for the filter parameter with real examples ('Gunnery', 'drone', 'Caldari') and states the queue default, which implies when to use it. It offers no when-not conditions and never mentions skill_check as the alternative for a single-skill query, so usage is implied rather than fully scoped.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

characters_listList logged-in charactersA
Read-only

Lists every EVE character authorized with this server, which one is active (used by default by all character tools), their corporation/alliance and granted scopes. Call this first when the user refers to a character by name.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds genuinely new context: there is a notion of an 'active' character that silently applies to every other character tool, which is important behavioral knowledge an agent cannot get from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence with zero filler; the action comes first and the ordering advice ('call this first') is placed at the end where it is memorable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema, the description carries the burden of explaining return contents, which it does by listing active character, corporation/alliance, and scopes. It does not describe result structure or ordering, a minor remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; there is nothing for the schema or description to clarify further.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (lists) and resource (EVE characters authorized with this server) and enumerates the returned fields: active character, corporation/alliance, granted scopes. An agent can distinguish it from siblings like character_select or character_overview without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Call this first when the user refers to a character by name" gives a clear trigger condition, and the note that the active character is used by default by all character tools clarifies downstream behavior. It stops short of naming explicit alternatives or when-not cases, so it is strong but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

contractsCharacter contractsB
Read-only

A character's contracts (issued to/by them) with names for issuer/assignee/acceptor, start/end locations, prices, courier details and the items in each item-exchange/auction contract.

NameRequiredDescriptionDefault
typeNo
limitNoMax contracts (default 50).
statusNoactive = outstanding/in progress (default).
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
include_itemsNoFetch item lists (default true, up to 25 contracts).

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag readOnlyHint and openWorldHint. The description adds useful content-level detail (names for issuer/assignee/acceptor, locations, prices, courier details, items), but doesn't cover pagination, the include_items 25-contract cap, or result size behavior. It adds value beyond annotations without fully characterizing the response.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense but efficient sentence that front-loads the resource and enumerates the returned fields without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the return-content burden and does list the key contract fields. Missing details like default status=active and item-fetch cap are covered by the schema, but behavioral bounds on results are not described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so the schema already documents type, status, limit, character, and include_items. The description's mention of items in item-exchange/auction contracts lightly ties to include_items, but adds no syntax or default semantics beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: retrieves a character's contracts (issued to/by them). The parenthetical clarifies scope (issued to or by), and it enumerates the concrete data fields returned. It doesn't distinguish from siblings, though there is no direct contracts alternative here.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus alternatives, no prerequisites, no exclusions. The schema mentions the default active character and characters_list/character_select, but the description itself gives no usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

esi_requestRaw ESI requestA

Escape hatch for any ESI route not covered by a dedicated tool (see https://developers.eveonline.com/api-explorer). Paths may use {character_id}, {corporation_id} and {alliance_id}, filled from the selected character. Authentication, compatibility date, caching and pagination are handled; id fields in the response get *_name siblings. Non-GET methods change game state: confirm with the user first.

NameRequiredDescriptionDefault
bodyNoJSON body for POST/PUT.
pathYese.g. /characters/{character_id}/standings or /corporations/{corporation_id}/structures
queryNo
methodNo
all_pagesNoFetch every X-Pages page (default true for GET).
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
authenticatedNoSend the character's token (default: when the path contains a placeholder or /characters|corporations|fleets/).
resolve_namesNoAdd *_name fields for ids (default true).

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide only openWorldHint=true, so the description must carry nearly the full burden, and it does: it discloses that auth, compatibility date, caching and pagination are handled automatically, that id fields gain *_name siblings, and that non-GET methods mutate game state. It stops short of covering failure modes an agent would want here — ESI error-limit/backoff behavior, HTTP error surfacing, or what happens on a 404 route — which keeps it off a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each carrying distinct information (scope, placeholder substitution, handled plumbing, mutation warning), with the core purpose front-loaded and the safety warning last where it is most likely to be read before acting. Dense but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter, nested-object, open-world proxy tool with no output schema, the description covers the cross-cutting behaviors an agent cannot infer (auth injection, pagination, name enrichment, placeholder resolution, mutation risk). Nothing essential for a correct first call is left to guesswork.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so most params are self-documented, but the description still adds real meaning the schema cannot: the {character_id}/{corporation_id}/{alliance_id} placeholders are auto-filled from the selected character, and authentication/pagination/name-resolution are applied automatically rather than per-call. It does not state the default for `method`, leaving the GET-vs-omitted behavior implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific capability — an arbitrary ESI route proxy — and explicitly frames it as an escape hatch for routes 'not covered by a dedicated tool,' which cleanly separates it from the many domain-specific siblings (assets, wallet, mail_list, etc.). An agent can decide between esi_request and any specialized tool without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states exactly when to reach for this tool (uncovered ESI routes), points to the authoritative route catalog via URL, and gives a hard guardrail for the risky case: 'Non-GET methods change game state: confirm with the user first.' That is explicit when-to-use plus an explicit caution, which is the ceiling for this dimension.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fitting_analyzeAnalyze an EFT fitA
Read-only

Parses any EFT text (from the user, Pyfa, zKillboard, ...) and returns the same rich breakdown as fitting_get: resolved names, resource usage, ship stats/bonuses, module attributes, skill check against a character and DNA, plus engine stats (EHP, DPS, cap, speed, real CPU/PG) when eve-fit is configured. Does not save anything.

NameRequiredDescriptionDefault
eftYesEFT text starting with [Ship, Name].
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
attributesNoPer-module attribute detail: none, summary (default; fitting-relevant categories) or full.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-world behavior are covered. The description adds useful behavioral context: engine stats only appear when eve-fit is configured, and the tool does not persist anything.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and return shape, then moves to the non-saving caveat. Despite being a single dense sentence, every clause adds useful scope or output information without redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter analysis tool with full schema coverage and annotations, the description is complete enough: it explains input sources, the returned breakdown, the character/skill aspect, the eve-fit dependency, and the fact that nothing is saved. No output schema exists, and the description still summarizes the return value effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are already fully documented in the schema. The description does not add parameter-specific syntax or usage details beyond what the schema provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: it parses any EFT text and returns a rich fitting breakdown. It distinguishes itself from fitting_get by accepting arbitrary EFT input from sources like Pyfa or zKillboard, and from fitting_save by explicitly stating it does not save anything.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly establishes the context for use: when the caller has EFT text from a user, Pyfa, zKillboard, etc., and wants the same breakdown as fitting_get without saving. It does not explicitly name fitting_get as the alternative for saved fittings or list exclusions, so it stops short of a full when/when-not routing guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fitting_deleteDelete a saved fittingA
Destructive

Deletes one saved in-game fitting by id or exact name. Only do this when the user explicitly asks.

NameRequiredDescriptionDefault
fittingYesFitting id or exact name.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, so the safety profile is known. The description adds useful context beyond that: deletion targets exactly one fitting, accepts an id or exact name, and is gated on an explicit user request. It stops short of stating irreversibility or behavior on ambiguous names.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the primary action and identifier scope front-loaded, followed by the explicit-request guard. No wasted wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple destructive delete with full schema coverage and destructiveHint annotation, the description provides the essential purpose and usage guard. It does not explicitly mention irreversibility or error behavior, but those are minor gaps given the annotations and low complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both the fitting and character parameters. The description echoes 'by id or exact name' but adds no new meaning beyond the schema, which establishes the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: "Deletes one saved in-game fitting by id or exact name." This clearly distinguishes it from sibling tools like fitting_save, fitting_get, and fitting_analyze without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit usage condition: "Only do this when the user explicitly asks." That is strong when-to-use guidance, but it does not mention alternatives or when-not scenarios beyond that single restriction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fitting_getGet saved fitting(s) in fullA
Read-only

Full detail for saved fittings, by id, name or ship: modules per slot by name, loaded charges, drones/cargo, CPU/PG/calibration usage vs ship output, hardpoints, ship stats and bonuses, attributes of every module, a skill check against the character (missing skills + training time), plus EFT (ready for in-game import or Pyfa) and DNA.

NameRequiredDescriptionDefault
fittingsYesFitting ids, names (substring) or ship names.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
attributesNoPer-module attribute detail: none, summary (default; fitting-relevant categories) or full.
check_skillsNoCheck skills of the character (default true).

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds real behavioral context beyond that: the tool performs a skill check against a character (with missing skills and training time) and emits EFT/DNA exports, which tells the agent this call has character-dependent, import-ready side effects worth understanding before invoking.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the tool's purpose before the return-content list, so the reader can stop early. The content enumeration is long but each item is a distinct output category, so little is wasted; the only cost is that the sentence becomes a run-on dump.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly carries the burden of describing the return payload in detail — modules, charges, CPU/PG usage, skill check, EFT, DNA. Missing only edge behavior such as unresolvable fitting names or what happens when skill check data is unavailable for the given character.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — all four parameters, including the enum for attributes and the default for check_skills, are documented in the schema. The description echoes 'by id, name or ship' but adds no syntax, format, or matching-behavior detail beyond what the schema already states (including substring matching and max 10 items).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (saved fittings) and scope ('Full detail'), and enumerates exactly which sub-objects are returned. It implicitly contrasts with fittings_list via 'full detail', but never names the sibling or explicitly delineates this from fitting_analyze/ship_fitting, so an agent must infer the routing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'by id, name or ship' clause tells the agent what inputs are accepted, which is genuine usage guidance. However there is no explicit when-to-use, no when-not-to-use, and no pointer to fittings_list as the way to discover ids or to fitting_analyze for other purposes — usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fitting_saveSave a fitting in-gameA

Saves an EFT fit to the character's in-game saved fittings (requires esi-fittings.write_fittings.v1). Names are resolved from static data. ESI cannot store charges per slot, so loaded charges are dropped (with a warning) unless they are also in the cargo section. Returns the new fitting_id. Confirm with the user before saving.

NameRequiredDescriptionDefault
eftYesEFT text starting with [Ship, Name].
nameNoOverride the fitting name (max 50 chars).
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
descriptionNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations supply only openWorldHint, so the description carries the disclosure burden and does it well. It reveals the required auth scope, a genuine data-loss behavior ('ESI cannot store charges per slot, so loaded charges are dropped (with a warning) unless they are also in the cargo section'), and the return value ('Returns the new fitting_id').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short sentences, front-loaded with the action and scope, then the data-loss caveat, then the return value, then the confirmation prompt. No sentence is padding; each carries a distinct fact the agent needs before calling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema and only a sparse annotation set, the description covers auth, mutation effect, a silent-data-loss edge case, the returned fitting_id, and a user-confirmation requirement. Nothing essential to calling this four-parameter write tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so most parameters are already documented. The description still adds semantic value the schema does not: that names inside the EFT text are 'resolved from static data' and that charge handling inside the `eft` blob has a caveat. It adds meaning rather than repeating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Saves an EFT fit to the character's in-game saved fittings.' It distinguishes itself from read-side siblings like fitting_get, fitting_list, and ship_fitting by being explicitly a persistence operation, and even names the exact ESI scope it maps to.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states a clear prerequisite and behavioral gate: 'requires esi-fittings.write_fittings.v1' and 'Confirm with the user before saving.' It doesn't explicitly contrast itself with fitting_delete or say when not to use it, but the write intent and the confirmation requirement give an agent enough to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fittings_listList saved fittingsA
Read-only

Lists a character's saved in-game fittings with ship names and module counts. Filter by fit name or ship. Set include_eft to get every fit as EFT text in the same call.

NameRequiredDescriptionDefault
filterNoSubstring of fitting name or ship type/group (e.g. 'Gila', 'PvE', 'frigate').
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
include_eftNoInclude EFT text for each fit (default false).

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds a mild efficiency hint ('in the same call') that avoids N+1 EFT fetches, but says nothing about pagination, result limits, or what happens with a large fitting library.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action and return shape. No filler, though the EFT sentence could be slightly tighter since the schema already states the default.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with no output schema, the description adequately conveys what comes back (ship names, module counts, optional EFT text) and that no parameters are required. Only pagination/volume behavior is left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are fully documented structurally. The description reinforces the filter behavior (name or ship) and the EFT toggle's batching benefit, but adds no syntax or format detail beyond the schema — baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb+resource ('Lists a character's saved in-game fittings') with a concrete description of returned content (ship names and module counts). It does not explicitly distinguish itself from the sibling fitting_get, but the list-vs-single framing is implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides usage hints for its parameters ('Filter by fit name or ship', toggle include_eft), but never states when to prefer this over fitting_get or fitting_analyze, nor any prerequisites such as needing an active character.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

industryIndustry jobs and blueprintsB
Read-only

A character's industry jobs (activity, blueprint, product, runs, facility, time left) and/or blueprints (BPO/BPC, ME/TE, runs, location). Filter blueprints by name.

NameRequiredDescriptionDefault
limitNoMax blueprints (default 100).
includeNoDefault both.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
blueprint_filterNoOnly blueprints whose name contains this text.
include_completed_jobsNoInclude delivered/cancelled jobs (default false).

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context by enumerating the returned fields, but omits behavior an agent would want: that delivered/cancelled jobs are excluded by default and that the call falls back to the active character.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence with no filler, and the primary payload (what the tool returns) is front-loaded. It is a noun phrase rather than a verb-led statement, which slightly weakens scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Five optional parameters, all schema-documented, and the description lists the fields returned in place of an output schema, so an agent can call it correctly. Only minor gaps remain: default-exclusion of completed jobs and the active-character fallback are not surfaced in prose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters (limit, include, character, blueprint_filter, include_completed_jobs) are already documented in the schema. The description only restates the blueprint name filter, adding no syntax or semantics beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names the resource (industry jobs / blueprints) and enumerates the fields each covers (activity, blueprint, product, runs, facility, time left; BPO/BPC, ME/TE, runs, location), so an agent knows exactly what data comes back. No other sibling deals with industry, so differentiation is implicit rather than stated, and there is no leading verb ('List/Get').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit statement of when to call this versus alternatives, and no prerequisites (e.g. that a character must be selected or that this requires the character to have industry jobs). A fragment ('Filter blueprints by name') is the only usage hint.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

item_infoItem detailsA
Read-only

Everything about one or more items in one call: category/group, meta level, volume, description, formatted attributes (grouped, with units), required skills (checked against the character if logged in, with training time for gaps), ship bonuses, variants (T1/T2/faction/...), manufacturing blueprint materials, and optionally Jita prices.

NameRequiredDescriptionDefault
itemsYesItem names (fuzzy) or type ids.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
attributesNoAttribute detail (default summary).
include_marketNoInclude Jita 4-4 order book summary and 30d history.
include_descriptionNoInclude the item description (default true).

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds behavioral context the annotations can't: skills are checked against the logged-in character with training time for gaps, and prices are optional/external. It does not disclose the cost of a batch call, caching, or how fuzzy name resolution behaves on a miss.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that leads with the core promise ('Everything about one or more items in one call') then enumerates the returned facets. The long comma list is dense but every element is a distinct capability an agent would want; nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of explaining return contents, and it does so thoroughly across eight facets including the character-dependent skill check. What remains missing is modest: how fuzzy matching failures surface and whether batching more than 10 is possible, but the essential contract is conveyed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema, making 3 the baseline. The description adds only light reinforcement by naming 'formatted attributes', required skills, variants and 'optionally Jita prices', which maps loosely to attributes, character and include_market without adding syntax or defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete resource (items, singular or plural, by name or type id) and enumerates the specific payload it returns: category/group, meta level, volume, attributes, skills, variants, blueprint materials, market data. An agent can tell this is a deep single-item detail lookup rather than a search. It doesn't explicitly contrast with siblings like search_items or lookup, which keeps it from a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the enumerated payload rather than stated: an agent infers this is the tool for full item detail. There is no explicit when-to-use/when-not guidance, no note that search_items should be used first to resolve fuzzy names, and no mention of the 10-item cap as a batching constraint (that lives only in the schema).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

killmailsRecent kills and lossesA
Read-only

A character's recent killmails with victim/attacker names, ships, system and security, and zKillboard links. For losses (or any kill with include_fit) the victim's fit is rebuilt as EFT with dropped/destroyed items.

NameRequiredDescriptionDefault
limitNoDefault 10.
filterNo
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
include_fitNoInclude EFT of the victim's ship for every killmail (losses always include it).

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only and open-world behavior, so the description's job is to add context — and it does, disclosing that loss killmails (or any with include_fit) trigger EFT fit reconstruction with dropped/destroyed items, which is a non-obvious side effect. It omits pagination/recency-window behavior and any ESI rate-limit caveats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with zero filler, leading with the primary return payload and following with the conditional fit behavior. Nothing to cut.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly carries the burden of describing returned fields and the EFT payload shape. What remains thin is the filter/limit semantics, but for a read-only list tool the description is sufficient to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the baseline is 3. The description mostly restates the schema's own include_fit wording ('losses always include it') rather than clarifying the filter enum semantics or what 'recent' means for limit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (recent killmails) and enumerates the returned fields (victim/attacker names, ships, system/security, zKillboard links), so the agent knows exactly what it gets. There is no sibling killmail tool to differentiate from, but the two-sentence scope is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the parenthetical 'For losses (or any kill with include_fit)' hints at how to obtain fits, and the schema's filter enum implies kill/loss selection. It never says when to prefer this tool or what happens if no character is supplied beyond the schema's default note.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookupResolve names and idsB
Read-only

Resolves names or ids of characters, corporations, alliances, factions, systems, regions, constellations, stations and items to their counterpart, with public details (corp/alliance of a character, ticker/members of a corp, security of a system, ...).

NameRequiredDescriptionDefault
idsNoIds to resolve.
namesNoExact names (case-insensitive) to resolve.
detailsNoFetch public details for characters/corporations/alliances (default true).

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuine value by enumerating the kind of public details returned (corp/alliance of a character, ticker/members of a corp, security of a system), but says nothing about batching behavior, partial results, or failure when a name doesn't resolve.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the verb and scope first, then the entity list, then the detail payload. The long enumeration is justified because it defines the tool's domain, though the trailing '...' examples are slightly loose for a formal spec.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing the return shape; it sketches the detail fields but does not say how results are keyed (by id vs name) or how unmatched inputs are surfaced. Sufficient to attempt a call, insufficient to interpret the response confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% – ids, names, and details are all documented in the schema, including the 'default true' semantics of details. The description only loosely gestures at the details flag ('with public details') and adds nothing about the maxItems caps or exact-name matching beyond what the schema states. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb ('Resolves') plus an explicit enumeration of the resource classes (characters, corporations, alliances, factions, systems, regions, constellations, stations, items) and states that it maps a name or id to its counterpart. This is clearly distinguishable from siblings like search_items or system_info, though it never names an alternative directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The bidirectional mapping (name→id / id→name) implies the usage scenario, but there is no explicit when-to-use guidance, no statement of when to prefer item_info / system_info instead, and no mention of batch limits or prerequisites. Adequate inference only.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mail_listList EVE mailA
Read-only

Recent EVE mail headers with sender/recipient names, labels and read state. Use mail_read for bodies.

NameRequiredDescriptionDefault
labelNoOnly mails with this label name (e.g. 'Inbox', 'Sent', 'Corp', 'Alliance').
limitNoDefault 25.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
unread_onlyNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint and openWorldHint already declared, the description adds genuine value: it discloses that only headers are returned (not bodies) and enumerates the header fields (sender/recipient names, labels, read state). It omits pagination behavior and the default-25 cap, which are left to the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, with the return-content scoping front-loaded and the alternative named afterward. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly carries the return-value burden by naming the header fields returned. Pagination and the limit default are left implicit, a minor gap for a read-only listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, just under the threshold where the schema alone suffices. The description adds no parameter guidance and does nothing to compensate for the undocumented unread_only flag, though label/limit/character are well described in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific resource (EVE mail) and scope (headers, recent) plus what each header contains, and explicitly routes body retrieval to mail_read. An agent can distinguish it from mail_read and mail_send without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use mail_read for bodies' names the alternative and the condition selecting it. No explicit when-not-to-use beyond that, but the header-vs-body split covers the main decision point.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mail_readRead EVE mailA
Read-only

Full text of one or more mails (HTML converted to plain text) with sender and recipient names.

NameRequiredDescriptionDefault
mail_idsYes
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description usefully adds that HTML is converted to plain text and that sender/recipient names accompany the body, but says nothing about the 10-mail batch ceiling, partial failures on invalid ids, or whether inaccessible mails are omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence that front-loads the return payload and the HTML-to-text behavior. Nothing is padded, though a fragment rather than a verb-led statement makes it slightly less directive than it could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read with no output schema, the description covers what comes back (full body, sender, recipients). The main gap is the batch-size limit and the exact response shape per mail, but the annotations and simple schema mean little else is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: the character parameter is documented but mail_ids is bare. The phrase 'one or more mails' hints at the array/batch nature, yet the description does not disclose the max of 10 ids or that ids should come from mail_list, so it only marginally compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the specific resource (mails) and scope (full text, one or more, with sender/recipient names), which clearly distinguishes it from the listing sibling mail_list and the write sibling mail_send. It never uses an explicit verb like 'retrieve', but the intent is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: fetching full bodies by mail id after using mail_list. The description names no alternative tool and gives no explicit when-to-use or when-not-to-use condition, leaving the agent to infer the mail_list → mail_read workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mail_sendSend EVE mailA

Sends an in-game EVE mail from the character. Recipients are names of characters, corporations, alliances or the character's mailing lists. This sends a real message: always confirm recipients, subject and body with the user first.

NameRequiredDescriptionDefault
toYesRecipient names.
bodyYesPlain text; newlines are preserved.
subjectYes
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say openWorldHint=true and destructiveHint=false, so the description adds the crucial nuance that this dispatches a real, externally-visible message to other players and must be user-confirmed. It stops short of saying whether a sent mail can be recalled or what happens on an invalid recipient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with zero padding; the core action comes first and the safety caution is front-loaded as a closing imperative rather than buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a real-world-effect tool with no output schema and no annotations covering irreversibility, the description covers the essential behavioral risk and recipient semantics. It omits failure modes (invalid recipient, rate limiting) but is sufficient to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, and the description compensates on the weakest field by explaining that recipients are character, corporation, alliance, or mailing-list names rather than raw IDs. The `character` parameter is left to the schema, which already documents its default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Sends an in-game EVE mail from the character') and immediately disambiguates the recipient field semantics, distinguishing it clearly from read-side siblings like mail_list and mail_read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition for use: 'always confirm recipients, subject and body with the user first.' It does not name alternatives, but the send-vs-read/list distinction is unambiguous from the purpose statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

market_ordersCharacter market ordersA
Read-only

A character's open market orders with item and location names, remaining volume, expiry and escrow — and whether each order is currently the best price at its station or has been undercut/outbid (and by how much). Optionally recent order history.

NameRequiredDescriptionDefault
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
include_historyNoAlso list recently closed orders (default false).
check_competitionNoCompare against the live order book (default true; one ESI call per item type).

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only, open-world safety profile, and the description adds real context beyond them: the best-price/undercut comparison and the magnitude of the gap, plus escrow being reported. It stops short of stating cost/latency of the competition check other than what the schema notes, but the added behavioral detail is substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that leads with the primary payload and appends the optional history mode, with no filler. Slightly dense with em-dash clauses, but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description enumerates the returned fields precisely (names, remaining volume, expiry, escrow, competition status) and flags the optional history. Combined with fully-documented parameters and safety annotations, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented in structured form, establishing the baseline of 3. The description hints at what include_history and check_competition do ('recent order history', 'best price... or undercut') but adds no formatting or defaults beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (a character's open market orders) and enumerates the payload — item/location names, remaining volume, expiry, escrow — plus derived undercut/outbid status. An agent can distinguish this from market_prices (price lookups) and assets (owned stock) from the content alone, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the content description — you'd call this to see your own open sell/buy orders. The optional history and competition modes are mentioned, but there is no explicit 'use this instead of X when Y' routing against market_prices, wallet, or assets, and no stated prerequisites beyond the schema's pointer to character_select.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

market_pricesMarket pricesA
Read-only

Best buy/sell, spread, order counts and volumes for up to 20 items at a market (default Jita 4-4; also amarr, dodixie, rens, hek, any region/system/station name, or a structure id), with optional 7/30-day regional history and order book depth.

NameRequiredDescriptionDefault
depthNoNumber of order book levels per side to include (default 0).
itemsYesItem names (fuzzy) or type ids.
historyNoInclude regional 7d/30d price & volume averages (default true).
locationNoMarket location (default 'jita').

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true and openWorldHint=true already tell the agent this is a safe external read, so the description's job is lighter. It adds the default location and the history/depth defaults, but says nothing about rate limits, data freshness, or failure behavior for unknown item names or structures.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that leads with the returned data and then the configuration options. The parenthetical location list is long but informative; nothing is redundant enough to cut.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the return fields (best buy/sell, spread, order counts, volumes, optional history and depth) and covers the 20-item cap and defaults. Only minor gaps remain, e.g. item-name fuzzy matching nuance and behavior for invalid locations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description still earns extra credit for 'location' by explaining it accepts not just city names but 'any region/system/station name, or a structure id' — meaning the schema's terse 'Market location' string does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (market prices) and enumerates exactly what is returned: best buy/sell, spread, order counts, volumes. An agent can tell it apart from wallet/market_orders in practice, but the description never names a sibling or explicitly excludes anything, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied by the defaults and location options ('default Jita 4-4', history default true), but there is no explicit when-to-use/when-not guidance and no pointer to alternatives such as market_orders or appraise for related pricing work.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

notificationsCharacter notificationsA
Read-only

Recent in-game notifications (structure attacks, war declarations, kill reports, sov, corp applications, ...) with the YAML payload parsed and ids resolved to names. Filter by type substring (e.g. 'Structure', 'War', 'Kill').

NameRequiredDescriptionDefault
limitNoDefault 30.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
type_filterNoOnly notification types containing this text.
unread_onlyNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuine value by noting the YAML payload is parsed and ids are resolved to names, and 'Recent' implies ordering, but it says nothing about pagination behavior past the limit cap or how unread_only interacts with the result set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero padding, with the resource definition and its payload-processing behavior front-loaded and the filtering hint placed last. Every sentence carries information an agent would not get from the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully characterizes the return shape as parsed YAML with resolved names, which is the key unknown for this tool. It does not describe the ordering guarantee or what the unread state looks like in results, leaving a small gap for a feed-style tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, which sets a baseline of 3. The description adds useful semantics for type_filter by giving concrete substring examples ('Structure', 'War', 'Kill'), but the undocumented unread_only flag and the limit/character defaults are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names the resource precisely (recent in-game notifications) and enumerates the concrete content types it returns (structure attacks, war declarations, kill reports, sov, corp applications), which lets an agent distinguish it from mail_list and killmails. It stops short of explicitly contrasting itself with those adjacent tools, so it is clear but not maximally differentiating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through the type_filter guidance ('Filter by type substring (e.g. Structure, War, Kill)'), which shows how to narrow results. However, there is no statement of when to prefer this tool over killmails or mail_list, nor any exclusion or prerequisite guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

planetsPlanetary industry coloniesA
Read-only

A character's PI colonies with planet names and types, extractor products and expiry times (soonest first), factory schematics, and storage contents. ESI only updates PI data when the colony is viewed in game.

NameRequiredDescriptionDefault
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
include_storageNoInclude storage/launchpad contents (default true).

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover read-only and open-world behavior, and the description adds a valuable freshness caveat: ESI only updates PI data when the colony is viewed in game. It also notes that extractor expiry times are ordered soonest first, which helps interpretation. It does not cover auth requirements or rate limits, but annotations already establish the safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences front-load the returned data and then add the important freshness caveat. There is no redundant or filler text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description effectively serves as a return-value summary by enumerating colony names, types, extractor products, expiry ordering, schematics, and storage. Combined with the fully documented input schema and annotations, it gives an agent enough information to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are fully documented in the schema. The description only implies the `character` parameter and storage contents without adding format details or defaults beyond what the schema already provides. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource as a character's PI colonies and enumerates the returned contents (planet names/types, extractors, expiry times, schematics, storage). It is specific, but it does not explicitly distinguish this tool from the broader sibling `industry` tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It does not state when to use this tool instead of alternatives such as `industry` or `assets`, nor does it provide when-not-to-use guidance. The ESI update caveat is useful context, but it is not usage routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

route_planPlan a routeA

Plans a stargate route and returns every system with security and region, a security breakdown, and recent kills along the way. Origin defaults to the character's current system. Optionally sets the in-game autopilot destination.

NameRequiredDescriptionDefault
toYesDestination system (name or id).
fromNoOrigin system; defaults to the character's current location.
avoidNoSystems to avoid.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
preferenceNoRoute preference (default shortest).
set_destinationNoAlso set the in-game autopilot destination (needs esi-ui.write_waypoint.v1).

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only openWorldHint=true in annotations, the description carries most of the behavioral disclosure. It usefully reveals that the tool returns route systems with security and kill data and that it can optionally mutate the in-game autopilot destination, though it does not discuss permissions or side-effect reversibility beyond the schema's scope note.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three tight sentences with the core purpose and return data front-loaded, followed by default behavior and the optional autopilot side effect. No sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, but the description summarizes the return contents well enough for an agent to understand what comes back. Parameter semantics are covered by the schema, and the optional autopilot side effect is disclosed, though usage guidance remains thin.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are already documented in the input schema. The description adds only that origin defaults to the character's current system and that set_destination is optional, which is useful but largely duplicative of the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Plans a stargate route,' and details the returned data including systems, security, region, breakdown, and recent kills. It is clear what the tool does, but it does not explicitly differentiate itself from nearby siblings such as ui_action for waypoint setting.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit when-to-use guidance, prerequisites, or alternatives. It mentions origin defaults and optional autopilot setting, but these are operational details rather than guidance on selecting this tool over another.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_itemsSearch items by nameA
Read-only

Fuzzy search over every published EVE item (ships, modules, ammo, materials, skills, ...) using the local static data. Accepts several queries at once and common shorthand (mwd, dc, lse, scram, web, ...). Blueprints/SKINs are hidden unless asked for. Use item_info for full details on a match.

NameRequiredDescriptionDefault
groupNoFilter by group name, e.g. 'Frigate', 'Shield Extender', 'Hybrid Charge'.
limitNoMax matches per query (default 8).
queriesYesOne query or a list of queries.
categoryNoFilter by category name, e.g. Ship, Module, Charge, Drone, Skill, Implant, Material.
meta_groupNoFilter by meta group: 'Tech I', 'Tech II', 'Faction', 'Deadspace', 'Officer', 'Storyline', 'Tech III'.
with_pricesNoAdd Jita 4-4 best buy/sell for each match (extra ESI calls).

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavior: fuzzy matching semantics, acceptance of common shorthand (mwd, scram, web), and the default hiding of Blueprints/SKINs — none of which appear in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four compact sentences, each carrying distinct information: scope, multi-query/shorthand support, hidden item classes, and the sibling handoff. No filler and the core purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description could briefly note the shape of results (per-query match lists bounded by limit). Still, combined with full schema coverage and explicit sibling handoff, an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (group, category, meta_group, limit, with_prices, queries) is already documented. The description only reinforces that multiple queries and shorthand are accepted; it adds no filter semantics beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Fuzzy search over every published EVE item', with concrete examples (ships, modules, ammo). It immediately distinguishes itself from item_info by scope, so an agent knows this finds matches while item_info details them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to item_info for 'full details on a match' and notes Blueprints/SKINs are hidden unless asked. Usage is clear, though it doesn't spell out when NOT to use it (e.g., exact-ID lookup) or which sibling handles market/appraisal needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

server_statusTranquility statusA
Read-only

EVE server status (players online, version, start time) and the SDE/static data build this server is using.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds useful return-content detail about server and SDE build data, but does not discuss freshness, rate limits, authentication, or response format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence that lists the key returned values without filler. Every phrase contributes to identifying the resource and its contents.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only status tool with no output schema, the description covers the main returned data fields and is largely sufficient. It could be slightly stronger by mentioning response structure or data freshness, but no critical invocation detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

This tool has zero input parameters, so there is no parameter semantics for the description to clarify. The baseline score of 4 applies because the schema is effectively complete with an empty object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource, EVE server status, and enumerates what it returns: players online, version, start time, and SDE build. It does not explicitly distinguish this from related siblings such as system_info, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains what the tool returns but gives no guidance on when to use it versus alternatives like system_info or esi_request. There are no exclusions, prerequisites, or context cues for selecting this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ship_fittingFit of an actual shipA
Read-only

Reads how a real ship in the character's assets is fitted (default: the ship they are flying) and returns the same rich output as fitting_get: named modules/charges per slot, drones, cargo, resources, attributes, skill check, EFT and DNA. Note ESI caches assets for up to an hour, so very recent refits may not show yet.

NameRequiredDescriptionDefault
shipNo'current' (default), a ship item_id, or a ship type/custom name.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
attributesNoPer-module attribute detail: none, summary (default; fitting-relevant categories) or full.
include_cargoNoInclude cargo/other holds (default true).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/openWorldHint annotations, the description discloses a real behavioral trait agents must know: ESI caches assets for up to an hour so recent refits may be stale. It also enumerates what the payload contains. It does not discuss auth requirements or failure modes, which keeps it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both front-loaded: the first gives purpose, scope and output shape, the second gives the ESI cache caveat. No filler and nothing buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the return-value burden and does so by listing the concrete payload sections (modules/charges, drones, cargo, resources, attributes, skill check, EFT, DNA). Combined with the caching caveat, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented in structured fields, including the 'current' default and the attributes enum. The description adds only the in-line restatement of the own-ship default, no extra syntax or format meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Reads how a real ship ... is fitted'), defines the default target (the ship they are flying), and explicitly contrasts itself with fitting_get by saying the output mirrors that tool but is sourced from actual assets. An agent can distinguish it from fittings_list/fitting_get without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It conveys clear context: use this when you want the real, undocked fitted state of a ship the character owns, with a documented default of 'current'. It stops short of a full routing rule (it never says 'for saved fits use fitting_get instead'), so the alternative is implied by the shared-output note rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

skill_checkCan the character use this?A
Read-only

Checks whether a character can use items (ships, modules, ammo, drones) or a whole EFT fit. Includes all prerequisite skills, missing levels, SP needed and estimated training time (from the character's attributes), and a training order. Can compare several characters at once.

NameRequiredDescriptionDefault
eftNoAn EFT fit to check as a whole.
itemsNoItem names or ids.
charactersNoCharacters to compare (default: the active character).

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no output schema, the description carries the burden of explaining results and does so well: prerequisite skills, missing levels, SP required, estimated training time derived from character attributes, and a training order. Annotations already cover the read-only and open-world nature, so remaining value is in the output content, which is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core check and followed by the result contents. No filler; slightly dense but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all three parameters and the return content in the absence of an output schema. One minor gap: with zero required parameters, it does not say what happens if neither eft nor items is supplied, nor what takes precedence if both are.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents eft, items, and characters. The description only restates the shapes (items or a whole fit, compare several characters) without adding format, limit, or precedence details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (checks) and resource (items or an EFT fit) and enumerates the item categories covered (ships, modules, ammo, drones). It is clearly distinct from character_skills in spirit, but the description never names or contrasts a sibling, so sibling differentiation is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: use it to validate items or a whole fit, and to compare several characters in one call. There are no explicit when-not conditions or named alternatives, but the intended usage is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

system_infoSolar system detailsA
Read-only

Details for a solar system: security, constellation/region, NPC stations, gate neighbours with security, sovereignty, ship/pod/NPC kills and jumps in the last hour, and jump distance to the major trade hubs. Use 'current' for the character's location. For wormhole (J-space) systems: class, system effect with its modifiers, and static wormholes with destination, mass and lifetime.

NameRequiredDescriptionDefault
systemYesSystem name or id, or 'current' for the character's current system.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the description only needs to add domain context — and it does, notably the data-freshness window (kills and jumps "in the last hour") and the K-space vs J-space response split. It omits what happens for an unknown system name or whether the lookup is cached/live.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the resource and its payload, then branching to the J-space case. The field enumeration is dense but each clause maps to a real returned field, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must outline the return shape, and it does so for both normal and wormhole systems. It is slightly thin on edge cases (invalid/ambiguous system names, the role of the optional character param), but broadly sufficient to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear field descriptions and one required param, so the baseline of 3 applies. The description's note about 'current' merely repeats the schema's own wording for `system` and adds nothing about the `character` parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names the resource (a solar system) and enumerates the exact data returned: security, constellation/region, NPC stations, gate neighbours, sovereignty, activity stats, trade-hub distances, plus a distinct J-space branch. Nothing in the sibling list (lookup, route_plan, killmails, wormhole_type) returns this bundle, so an agent can separate it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only routing guidance is "Use 'current' for the character's location", which is a parameter hint rather than a when-to-use rule. It never says when to prefer this over lookup, route_plan or killmails, so usage is implied by the content list rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ui_actionControl the EVE clientA

Acts on the running EVE client of the character (must be logged in to the game): set autopilot destination or add a waypoint (system, NPC station or structure), open the market window for an item, or open the show-info window for an item/character/corporation/alliance.

NameRequiredDescriptionDefault
actionYes
targetYesSystem/station name or id, structure id, item name, or entity name/id.
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only openWorldHint in annotations, the description adds useful behavioral context: it acts on a running client, requires an in-game login, and performs side-effecting UI actions such as setting autopilot or opening windows. It does not cover failure modes, reversibility, or rate limits, but it meaningfully supplements the sparse annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler. Each clause corresponds to a supported action, so the length is justified by the need to enumerate the action set.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a UI-control tool with no output schema and minimal annotations, the description covers the key prerequisites and action semantics an agent needs to invoke it. It leaves some gaps around result behavior and failure handling, but those are secondary for selecting and calling the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description maps action values to target types, for example waypoint targets as system/NPC station/structure and open_info targets as item/character/corporation/alliance. This adds semantic meaning beyond the schema's generic target description. It does not explain the optional character parameter, but the schema already documents that default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it acts on the running EVE client. It enumerates the four supported UI actions, making the tool's purpose clear. It does not explicitly distinguish itself from siblings such as route_plan or item_info, but its UI-control nature is distinctive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an important prerequisite: the character must be logged in to the game. It lists the action choices, which implies usage contexts. However, it does not explicitly say when to prefer this over alternatives like route_plan for routing or lookup/item_info for data retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

walletWallet, journal and transactionsB
Read-only

A character's ISK balance, income/expense breakdown by type over recent days, latest journal entries (with party names) and latest market transactions (item, quantity, price, location, counterparty).

NameRequiredDescriptionDefault
daysNoWindow for the income/expense summary (default 30; ESI keeps 30 days).
characterNoCharacter name or id to act as. Defaults to the active character (see characters_list / character_select).
journal_limitNoJournal entries to list (default 20).
transactions_limitNoMarket transactions to list (default 20).

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds useful substance by naming the returned fields (party names, item/quantity/price/location/counterparty), but says nothing about defaults, the 30-day ESI retention limit, empty-result behavior, or volume of data returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the headline output (ISK balance) and then the sub-sections. Dense parenthetical field lists are efficient rather than wasteful, though the single long sentence is at the edge of readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so reasonably by enumerating the four result sections and key fields. Combined with the fully documented schema and read-only annotation, an agent has enough to call it correctly; only defaults/retention nuance is left to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each parameter is well documented in-schema, so baseline is 3. The description only implicitly links 'recent days' to the days parameter and lists journal/transaction sections; it adds no syntax or constraint detail beyond the schema, and never mentions the character parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete resource (ISK balance, income/expense breakdown, journal entries, market transactions) with specific content enumerated. It is clearly distinguishable from most siblings, but makes no attempt to differentiate from adjacent tools such as market_orders, assets, or contracts, which also touch financial/inventory data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never states when to call this versus alternatives like market_orders or contracts, nor any prerequisites (e.g., character selection, ESI scope or auth). Usage is only inferable from the list of returned data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wormhole_typeWormhole type lookupA
Read-only

Looks up wormhole types by their signature code (e.g. K162, H296, D845): destination class, max mass per jump, total mass, mass regeneration, lifetime, and the classes of systems that have it as a static.

NameRequiredDescriptionDefault
codesYesWormhole codes, e.g. ['H296', 'K162'].

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description goes further by disclosing the return payload (destination class, max/total mass, regeneration, lifetime, static classes), which matters because there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence: verb and input first, then the returned field list. Every clause carries information and nothing is repeated from structured fields verbatim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one simple read-only parameter and no output schema, the description supplies the missing return-value detail, which is the main completeness risk here. It stops short of noting behavior for unknown codes or the 20-item cap, but the schema handles the cap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the sole parameter's schema entry already includes an example array. The description restates example codes but adds no format rules, case sensitivity, or batch behavior beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (looks up) plus resource (wormhole types) and the exact key (signature code) with concrete examples K162, H296, D845. It also enumerates the payload, so an agent knows precisely what comes back and that no sibling tool offers this data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the description — call it when you have a wormhole signature code — but there is no explicit when-to-use/when-not statement or named alternative. In this toolset there is no direct competitor, so the gap is minor but real.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 35 tool updatesv0.1.0
    • First observedappraise
    • First observedassets
    • First observedcharacter_login
    • First observedcharacter_logout
    • First observedcharacter_overview
    • First observedcharacter_select
    • First observedcharacter_skills
    • First observedcharacters_list
    • First observedcontracts
    • First observedesi_request
    • First observedfitting_analyze
    • First observedfitting_delete
    • First observedfitting_get
    • First observedfitting_save
    • First observedfittings_list
    • First observedindustry
    • First observeditem_info
    • First observedkillmails
    • First observedlookup
    • First observedmail_list
    • First observedmail_read
    • First observedmail_send
    • First observedmarket_orders
    • First observedmarket_prices
    • First observednotifications
    • First observedplanets
    • First observedroute_plan
    • First observedsearch_items
    • First observedserver_status
    • First observedship_fitting
    • First observedskill_check
    • First observedsystem_info
    • First observedui_action
    • First observedwallet
    • First observedwormhole_type

TDQS

A3.6/5.0

Scored across 35 tools

Disambiguation4/5

Most tools target clearly distinct resources/actions (mail_list vs mail_read vs mail_send, market_prices vs market_orders vs appraise). The main overlap is the fitting trio (fitting_get, ship_fitting, fitting_analyze), which return near-identical rich output and are separated only by input source; character_overview also aggregates data from wallet, skills, and assets. Descriptions do enough to steer selection, but the fitting trio is a real source of confusion.

Naming Consistency3/5

All names are snake_case, but conventions are mixed: bare nouns (assets, wallet, contracts, industry, planets), noun_verb (characters_list, mail_list), verb_noun (search_items, route_plan, fitting_save), and noun_noun (item_info, market_prices). Prefixes like character_, fitting_, mail_, market_ help group tools but are not applied uniformly. Readable, but not a predictable pattern.

Tool Count3/5

35 tools is heavy for any single server, and an agent must scan a large surface to find the right call. However, the EVE ESI domain genuinely spans many independent resources (characters, fittings, market, mail, industry, PI, contracts, killmails, static data, navigation), so most tools earn their place. It sits at the upper bound rather than being gratuitously bloated.

Completeness4/5

Coverage is broad and lifecycle-aware: fittings support list/get/analyze/save/delete, mail supports list/read/send, and assets, contracts, industry, planets, notifications, killmails, wallet, and market are all covered. Minor gaps remain—no fitting update for an existing fit, and no market order create/cancel or contract actions—but esi_request serves as a general escape hatch. Agents can complete nearly all typical workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that integrates EVE Online's ESI API with AI assistants to enable natural language interaction with character data, market information, and assets. It provides 22 tools for managing skills, wallet balances, ship fittings, and more directly through AI-powered clients.
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that connects EVE Online's ESI API to LLM clients, enabling reading private and public EVE data, resolving names and IDs, and optionally executing a small allowlist of write actions.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to search EVE Online items, validate ship fits against fitting limits, compute combat stats like DPS and EHP, and retrieve Jita market prices.
    4
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to discover and invoke read-only EVE Online ESI API endpoints, retrieve public and character data with automatic OAuth, and turn that context into practical adventure plans.
    3
    31 npm
    2
    AGPL 3.0