Overview
Every page supports HTML, Markdown, and JSON. JSON twins match /api/v1.
Requests
curl https://eveindextools.com/types/587-rifter
curl https://eveindextools.com/types/587-rifter.md
curl https://eveindextools.com/types/587-rifter.json
curl -H 'Accept: text/markdown' https://eveindextools.com/types/587-rifter
curl https://eveindextools.com/api/v1/types/587
curl 'https://eveindextools.com/api/v1/types/34/prices?region=10000002'
curl 'https://eveindextools.com/api/v1/types/34/history?days=30'
curl -X POST https://eveindextools.com/api/v1/appraise -H 'content-type: application/json' -d '{"text":"Tritanium 1000"}'
curl -X POST https://eveindextools.com/api/v1/appraise -H 'content-type: application/json' -d '{"text":"Veldspar 100","reprocess":{"ore":5}}'
curl 'https://eveindextools.com/api/v1/industry?blueprint=691&runs=10&me=10&structure=raitaru'
curl 'https://eveindextools.com/api/v1/search?q=rifter'MCP
Connect an MCP client to https://eveindextools.com/mcp. It uses stateless Streamable HTTP, needs no key or login, and exposes the same JSON as the site.
Claude Code configuration
Save this as .mcp.json in a Claude Code project.
{
"mcpServers": {
"evesite": {
"type": "http",
"url": "https://eveindextools.com/mcp"
}
}
}Node client calls
This runnable Node example uses the pinned @modelcontextprotocol/client package.
import { Client, StreamableHTTPClientTransport } from "@modelcontextprotocol/client";
const client = new Client({ name: "evesite-example", version: "1.0.0" });
await client.connect(new StreamableHTTPClientTransport(new URL("https://eveindextools.com/mcp")));
await client.callTool({ name: "search", arguments: { q: "rifter" } });
await client.callTool({ name: "get_type", arguments: { type_id: 587 } });
await client.callTool({ name: "get_blueprint", arguments: { blueprint_id: 691 } });
await client.callTool({ name: "get_prices", arguments: { type_id: 34, region_id: 10000002 } });
await client.callTool({ name: "get_history", arguments: { type_id: 34, region_id: 10000002, days: 30 } });
await client.callTool({ name: "list_regions", arguments: {} });
await client.callTool({ name: "appraise", arguments: { text: "Tritanium 1000", region_id: 10000002, station_id: 60003760 } });
await client.callTool({ name: "appraise", arguments: { text: "Veldspar 100", reprocess: { ore: 5 } } });
await client.callTool({ name: "industry_cost", arguments: { blueprint: "691", runs: 10, me: 10, structure: "raitaru" } });
await client.close();Appraisal response
The response contains region, station, snapshot, lines, and totals. Each line contains input, type, quantity, sell, buy, sell_total, buy_total, volume_m3, and source.
Send an optional reprocess object to value the same list as minerals, and the response gains a reprocess section with aggregated materials, per-line verdicts, and both totals. Omit it and the response is byte for byte what it was before reprocessing existed. Settings default to a plain 50% NPC station with no skills.
Error bodies
{"error":"Not Found","status":404}
{"error":"Too Many Requests","status":429,"detail":"Rate limit exceeded"}Limits: 600 requests per minute per IP. A 429 response includes Retry-After.