AI Assistants (MCP)
The Unofficial Star Citizen API exposes a remote Model Context Protocol (MCP) server, so AI assistants such as Claude, Cursor and VS Code Copilot can look up citizens, organizations, ships, the roadmap or the starmap directly. The same API key, quota and rate limits as the REST API apply.
Endpoint
| Property | Value |
|---|---|
| URL | https://api.starcitizen-api.com/v2/mcp (same host as the REST API) |
| Transport | Streamable HTTP, stateless (POST only, JSON responses) |
| Authentication | x-api-key header — the same key as the REST API |
| Capabilities | Tools only, all read-only |
The API key belongs in the MCP client configuration only.
Configuration files containing the key must not be committed to a repository or shared. A leaked key can be deleted, together with its account, from the profile page.
Claude Code
Register the server once from a terminal:
claude mcp add --transport http unofficial-star-citizen-api https://api.starcitizen-api.com/v2/mcp --header "x-api-key: YOUR_API_KEY"
claude mcp list then shows the unofficial-star-citizen-api server as connected.
VS Code Or Cursor
Add the server to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project):
{
"mcpServers": {
"unofficial-star-citizen-api": {
"url": "https://api.starcitizen-api.com/v2/mcp",
"headers": { "x-api-key": "YOUR_API_KEY" }
}
}
}
Other Clients
Any MCP client that supports the Streamable HTTP transport and custom headers works with the same two settings: the /v2/mcp URL and the x-api-key header. Clients limited to stdio can go through a bridge such as mcp-remote:
npx mcp-remote https://api.starcitizen-api.com/v2/mcp --header "x-api-key: YOUR_API_KEY"
Connectors that only offer OAuth are not supported yet.
The server authenticates with the x-api-key header only; MCP OAuth authorization is not implemented.
Available Tools
Every tool is read-only and maps to an existing v2 endpoint. Lookup tools that accept id, name or code expect exactly one of them.
| Area | Tools |
|---|---|
| Citizens | get_user |
| Organizations | search_organizations, get_organization, list_organization_members |
| Ships | search_ships, get_ship, list_ship_chassis_variants, list_ship_manufacturers |
| Roadmap | get_roadmap |
| Progress Tracker | list_progress_teams, get_progress_team, list_deliverables, get_deliverable |
| Starmap | starmap_search, list_star_systems, get_star_system, get_star_system_details, list_celestial_objects, get_celestial_object, list_affiliations, get_affiliation, list_species, get_species, list_tunnels, get_tunnel, find_route |
| Funding & Telemetry | get_funding_goals, get_telemetry, list_versions |
| Account | get_my_account — daily limit and remaining requests, never the key itself |
Large lists (search_ships, list_deliverables, list_celestial_objects, list_tunnels, list_star_systems, list_progress_teams, list_versions) are paginated with limit (default 25, max 200) and offset, and return items, total and hasMore.
Results and Errors
A successful tool call returns the same data as the matching REST endpoint, together with its freshness metadata:
{
"data": { "sid": "PROTECTORA", "name": "...", ... },
"updatedAt": "2026-11-06T15:30:02.373Z",
"expiresAt": "2026-11-09T15:30:02.373Z",
"source": "cache"
}
The response is trimmed for readability. source is cache or live, as described in Data Freshness & Caching.
Failures are returned as tool errors (isError: true) carrying the HTTP status that the REST API would have used, so the assistant can explain them:
{ "code": 404, "message": "Ship 99999 not found" }
code | Meaning |
|---|---|
400 | Invalid lookup (for example both id and name given) |
404 | Resource not found on the RSI website |
429 | Daily quota or per-minute rate limit reached |
503 | RSI website temporarily unavailable |
A missing or invalid key is rejected before any tool runs, with a plain 401 HTTP response.
Quota
Tool calls follow the smart cache and quota rules of the REST API: cached reads are free, and per-minute rate limits apply to every call.
refresh: true costs quota.
Every tool accepts an optional refresh argument that forces a live scrape and consumes daily requests, exactly like ?refresh=true. Assistants are instructed to leave it unset unless fresher data is required; get_my_account reports the requests remaining today.
For the full quota model, see Rate Limits & Quota.