vael
Copilot instructions5 starsChanged 6 months agoMITView on GitHub
Guidance for AI coding assistants working on this codebase. This is not Vael's runtime persona — for that, see vael_system_prompt.txt. The full ESI OpenAPI spec is at docs/esi-swagger.json (fetched by script/esi-swagger.sh). When researching, planning, or implementing ESI-related features, consult this file for endpoint paths, parameters, response schemas, and required scopes. VAEL is a Python MCP (Model Context Protocol) server that exposes 48 tools backed by EVE Online's ESI API, the Fuzzwork SDE SQLite mirror, and zKillboard. It is consumed by…
- Reads credentials
Where files are headingNew Copilot instructions files have more rules about branches and pull requests, and fewer about code style.
Of the Copilot instructions files we read, the 2,349 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
The file
Show its rules and text
We split this copilot-instructions.md into the rules it gives an agent
13 rules. About 0 are common, 4 are distinctive, and 9 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Distinctive: line 8
When researching, planning, or implementing ESI-related features, consult this file for endpoint paths, parameters, response schemas, and …
- Very specific: line 32
Tool registration: every public capability is an @mcp.tool() in server.py that delegates to a domain module.
- Very specific: line 35
ESI access: always through ESIClient as an async context manager (async with ESIClient() as esi:).
- Very specific: line 44
Add a test in tests/test_all_tools.py.
- Very specific: line 45
Document it in docs/tools_reference.md.
- Very specific: line 49
Run python tests/test_all_tools.py — it hits live ESI, SDE, zKillboard, and Discord.
- Very specific: line 54
Never commit .env, tokens, or anything in data/.
- Very specific: line 56
All third-party API access must include the configured EVE_USER_AGENT per CCP's ESI rules.
- Distinctive: line 57
Do not add features that automate gameplay, inject into the EVE client, or violate CCP's EULA/ToS.
- Distinctive: line 61
Don't refactor unrelated code while making a targeted change.
- Distinctive: line 62
Don't add docstrings, type hints, or comments to code you didn't modify.
- Very specific: line 63
Don't introduce new dependencies without checking requirements.txt for an existing equivalent.
- Very specific: line 64
Don't hardcode character names, IDs, or pilot-specific config in source — that belongs in data/ or .env.
≈ “Common” is an estimate: at least 1 in 5 of the 3,779 Copilot instructions files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Copilot Instructions — VAEL Repository
Guidance for AI coding assistants working on this codebase. This is not Vael's runtime persona — for that, see vael_system_prompt.txt.
ESI API Reference
The full ESI OpenAPI spec is at docs/esi-swagger.json (fetched by script/esi-swagger.sh).
When researching, planning, or implementing ESI-related features, consult this file for
endpoint paths, parameters, response schemas, and required scopes.
What this repo is
VAEL is a Python MCP (Model Context Protocol) server that exposes 48 tools backed by EVE Online's ESI API, the Fuzzwork SDE SQLite mirror, and zKillboard. It is consumed by Claude Desktop, where a system prompt (vael_system_prompt.txt) turns the raw tools into the "Vael" persona. There are also two parallel processes: a tkinter game overlay (overlay.py) and a background notifier (notifier.py) that pushes Discord/overlay alerts.
Project layout
src/eve_agent/server.py— MCP server entrypoint registering all tools via@mcp.tool()src/eve_agent/tools/— domain modules:character.py,market.py,industry.py,skills.py,intel.pysrc/eve_agent/esi_client.py— async ESI HTTP client (rate limits, retries, caching). Always use this; never hit ESI directly.src/eve_agent/cache.py— SQLite cache that respects ESIExpiresheaderssrc/eve_agent/sde.py— read-only queries againstdata/sde.sqlitesrc/eve_agent/pilot_memory.py— JSON-backed cross-session memory atdata/pilot_memory.jsonsrc/eve_agent/event_engine.py+notifier.py+discord_alerts.py+overlay.py— the watch/alert pipelinesrc/eve_agent/auth.py— EVE SSO OAuth2 + PKCE, tokens encrypted via OS keyringtests/test_all_tools.py— single integration suite that hits live ESI; must pass before mergingdocs/— user-facing docs (scopes.md,configuration.md,tools_reference.md,pilot-profile.md)vael_system_prompt.txt— canonical Vael persona (pasted into Claude Desktop project)
Conventions
- Python 3.11+, async-first. All tool functions are
async def. - Tool registration: every public capability is an
@mcp.tool()inserver.pythat delegates to a domain module. Keep docstrings concrete — Claude reads them to decide when to call. - Generic wording in docstrings: refer to "the capsuleer" / "the pilot", not a specific character name. Character-specific data belongs in runtime memory or
docs/pilot-profile.md, never hardcoded. - Logging: the
@mcp.tool()wrapper inserver.pylogs each call aslog.info("tool: <name>(...)"). Domain modules intools/define a module logger (log = logging.getLogger(__name__)) for their own use but do not need to re-log the tool entry. - ESI access: always through
ESIClientas an async context manager (async with ESIClient() as esi:). Respect cache headers — don't bypasscache.py. Directhttpxusage is only acceptable for non-ESI endpoints (e.g. zKillboard inintel.py). - Errors: tools should return
{"error": "..."}dicts rather than raising, so the MCP layer surfaces them cleanly to Claude. Internal helpers (e.g._current_character_id()) may raise — the tool wrapper catches and formats. - Money/numbers: ISK is a float in raw ESI responses. Format with thousands separators in user-facing strings, keep raw values in API responses.
- No write scopes. This project is read-only by ESI policy. Do not add tools that mutate game state.
Adding a new tool
- Implement the async function in the appropriate
src/eve_agent/tools/<domain>.pymodule. - Register it in
server.pywith@mcp.tool()and a one-line docstring that tells Claude when to call it. - Add a test in
tests/test_all_tools.py. - Document it in
docs/tools_reference.md.
Testing
- Run
python tests/test_all_tools.py— it hits live ESI, SDE, zKillboard, and Discord. Requires.envconfigured and tokens authenticated viapython -m eve_agent.auth. - There is no mock layer; tests are integration-only by design.
Security & safety
- Never commit
.env, tokens, or anything indata/. data/tokens.json.encis encrypted via OS keyring; never log decrypted tokens.- All third-party API access must include the configured
EVE_USER_AGENTper CCP's ESI rules. - Do not add features that automate gameplay, inject into the EVE client, or violate CCP's EULA/ToS.
What not to do
- Don't refactor unrelated code while making a targeted change.
- Don't add docstrings, type hints, or comments to code you didn't modify.
- Don't introduce new dependencies without checking
requirements.txtfor an existing equivalent. - Don't hardcode character names, IDs, or pilot-specific config in source — that belongs in
data/or.env.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

