# MCP server

> Connect ExtraOrbital to Claude, ChatGPT, Cursor or any MCP client, remotely with OAuth or locally over stdio.

ExtraOrbital is an MCP server two ways. Pick by where the agent runs:

| Where the agent runs | Use | Signs in with |
| --- | --- | --- |
| On your machine (Claude Code, Codex, Cursor, Windsurf, Gemini CLI, VS Code…) | `npx -y extraorbital mcp` over stdio | This machine's identity, like the CLI: nothing to sign in to |
| In a chat app (Claude, ChatGPT, Le Chat, Perplexity, Grok…) | `https://extraorbital.dev/mcp` | OAuth: you sign in once and choose what it may do |
| Your own code or CI | `https://extraorbital.dev/mcp` | An `eo_live_` [API key](/docs/api) as a bearer token |

## Tools

The tools are the same capabilities the [Agent Auth protocol](/docs/api) and the REST API expose,
from one implementation:

| Tool | What it does |
| --- | --- |
| `list_services` | What can be provisioned, its options, allowances and prices |
| `whoami` · `list_teams` · `list_projects` | Who you are, your teams, their projects and spend |
| `create_project` | A project inside a team |
| `provision_resource` | A database, cache, bucket, queue, index or key. Idempotent: the same service and slug return the same resource |
| `list_resources` · `get_resource` · `verify_resource` | What exists, its metadata and spend, and whether it still answers |
| `read_credentials` | A resource's environment variables |
| `deprovision_resource` | Remove a resource |
| `read_ledger` · `summarize_ledger` | Charges, grouped any way you like |
| `search` · `fetch` | These docs, from inside the conversation |

The local server adds two that need your project folder:

| Tool | What it does |
| --- | --- |
| `provision_project` | What [`provision`](/docs/cli#extraorbital-provision) does: scan the folder, provision what is missing, write `.env`. Credential values go to the file, never into the conversation |
| `generate_secret` | What `add SESSION_SECRET` does: a secret generated offline, written to `.env` |

Every tool is annotated (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`), so a
client can run read-only ones without asking and confirm the rest.

## Local: coding agents

```bash
claude mcp add --transport stdio extraorbital -- npx -y extraorbital mcp
```

```bash
codex mcp add extraorbital -- npx -y extraorbital mcp
```

```json title=".cursor/mcp.json, Windsurf, Gemini CLI"
{
  "mcpServers": {
    "extraorbital": { "command": "npx", "args": ["-y", "extraorbital", "mcp"] }
  }
}
```

VS Code's `.vscode/mcp.json` names the key `servers` rather than `mcpServers`. A machine that has
never run ExtraOrbital registers itself on first use and works in a sandbox of its own until a
human [links it](/docs/quickstart#when-a-human-is-needed).

## Remote: chat apps

Add `https://extraorbital.dev/mcp` as a custom connector. The app sends you to sign in, then to a
consent screen where you can untick provisioning or credentials; reading is always granted.

| App | Where |
| --- | --- |
| Claude, Claude Desktop | Settings → Connectors → Add custom connector (Team and Enterprise: an owner adds it under Organization settings → Connectors) |
| Claude Code (remote) | `claude mcp add --transport http extraorbital https://extraorbital.dev/mcp`, then `/mcp` to sign in |
| ChatGPT | Developer mode, then add a custom MCP server. Write tools need a plan that allows them; elsewhere ChatGPT uses `search` and `fetch` |
| Codex (remote) | `codex mcp add extraorbital --url https://extraorbital.dev/mcp`, then `codex mcp login extraorbital` |
| Le Chat (Mistral) | Connectors → Add connector → Custom MCP connector |
| Perplexity | Settings → Connectors → Custom connector → Remote |
| Grok | grok.com/connectors → New connector → Custom |
| Manus | Settings → Integrations → Custom MCP servers, with an API key as a bearer header |
| OpenAI, xAI and Z.ai APIs | The `mcp` tool type with `server_url` `https://extraorbital.dev/mcp` and an `eo_live_` key as the authorization |

Menus move; if one has, look for "custom connector" or "MCP server" in the app's settings.

### With a key instead of OAuth

Any client that can set a header can skip sign-in:

```bash
claude mcp add --transport http extraorbital https://extraorbital.dev/mcp \
  --header "Authorization: Bearer $EXTRAORBITAL_API_KEY"
```

A key scoped to one team or project limits the connection to it.

## How sign-in works

For client authors: an unauthenticated request gets `401` with
`WWW-Authenticate: Bearer resource_metadata="https://extraorbital.dev/.well-known/oauth-protected-resource/mcp"`.
From there:

- Protected resource metadata (RFC 9728) names the authorization server and the scopes
  `eo:read`, `eo:provision` and `eo:credentials`.
- Authorization server metadata (RFC 8414) is at
  `/.well-known/oauth-authorization-server/api/auth`.
- Clients register with a [Client ID Metadata Document](https://datatracker.ietf.org/doc/draft-ietf-oauth-client-id-metadata-document/)
  or dynamically (RFC 7591); PKCE `S256` is required.
- Tokens are issued for the `https://extraorbital.dev/mcp` resource only (RFC 8707), and every other
  endpoint refuses them. Loopback redirects match any port.

## Listed in

The server is described for the [MCP Registry](https://registry.modelcontextprotocol.io) as
`dev.extraorbital/extraorbital`, with both the remote and the npm package.

## Next

- [Agent skills](/docs/skills) — teach an agent to reach for ExtraOrbital on its own
- [Quickstart](/docs/quickstart) — the same thing from a terminal

---

More for agents: [Sitemap](https://extraorbital.dev/sitemap.md) · [llms.txt](https://extraorbital.dev/llms.txt) · [agents.md](https://extraorbital.dev/agents.md)
