Skip to main content

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​

PropertyValue
URLhttps://api.starcitizen-api.com/v2/mcp (same host as the REST API)
TransportStreamable HTTP, stateless (POST only, JSON responses)
Authenticationx-api-key header — the same key as the REST API
CapabilitiesTools only, all read-only
danger

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: "

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": "" } } } }


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: "

note

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.

AreaTools
Citizensget_user
Organizationssearch_organizations, get_organization, list_organization_members
Shipssearch_ships, get_ship, list_ship_chassis_variants, list_ship_manufacturers
Roadmapget_roadmap
Progress Trackerlist_progress_teams, get_progress_team, list_deliverables, get_deliverable
Starmapstarmap_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 & Telemetryget_funding_goals, get_telemetry, list_versions
Accountget_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" }
codeMeaning
400Invalid lookup (for example both id and name given)
404Resource not found on the RSI website
429Daily quota or per-minute rate limit reached
503RSI 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.

warning

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.