About rover
Rover is Apollo's CLI for managing GraphOS schemas and developing supergraphs locally. It serves GraphQL developers and teams with commands for schema exploration, composition, validation, and publishing; it can also enable an MCP server through rover dev.
Key features
- 01Fetch, publish, and check schemas
- 02Compose supergraphs locally
- 03Describe and search schemas
- 04Develop locally with rover dev
- 05Manage connectors and contract variants
- 06Generate and publish persisted queries
Use cases
- 01Checking schema changes in CI/CD
- 02Exploring GraphOS schemas for agent workflows
- 03Composing and testing supergraphs locally
- 04Publishing subgraph schemas to GraphOS
MCP support
Rover is a CLI rather than an MCP server. The rover dev command can start with an MCP server enabled.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ apollographql/ skills --skill roverAfter installing, type/roverin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
references/additional-commands.mdclient.mdconfiguration.mdconnectors.mdcontracts.mddev.mdgraphs.mdinit.mdpersisted-queries.mdschema.mdsubgraphs.mdsupergraphs.mdDetails
From the project READMEApollo Rover CLI Guide
Rover is the official CLI for Apollo GraphOS. It helps you manage schemas, run composition locally, publish to GraphOS, and develop supergraphs on your local machine.
Quick Start
Step 1: Install
# macOS/Linux
curl -sSL https://rover.apollo.dev/nix/latest | sh
# npm (cross-platform)
npm install -g @apollo/rover
# Windows PowerShell
iwr 'https://rover.apollo.dev/win/latest' | iex
Step 2: Authenticate
# OAuth login via browser (recommended for local dev)
rover auth login
# Or interactive API key entry
rover config auth
# Or set environment variable (recommended for CI/CD)
export APOLLO_KEY=your-api-key
Step 3: Verify Installation
rover --version
rover auth whoami # OAuth identity
rover config whoami # API key identity
Step 4: Initialize a Project (optional)
# Create a new federated graph project
rover init
# Create a project with MCP server
rover init --mcp
Explore a Graph's Schema (start here for schema questions)
To answer "what's in this graph?", find a field, or write a query against a GraphOS graph, fetch the API schema and pipe it into rover schema — this keeps the SDL out of your context and returns only what you need:
# What can I query? (compact overview)
rover graph fetch <graph@variant> | rover schema describe -
# Find a field by concept/keyword (returns the path from a root operation)
rover graph fetch <graph@variant> | rover schema search - "<keyword>"
# Zoom into one type or field
rover graph fetch <graph@variant> | rover schema describe - --coord <Type.field> --depth 1
Three rules that keep this correct:
- Use
rover graph fetch(the API schema) — notrover supergraph fetch(that returns composition SDL with federation internals likejoin__/link__). - Pipe it in — never run
rover graph fetchalone and read the raw SDL (a large schema floods your context; that's exactly whatrover schemaavoids). - The
schemacommands read piped SDL, not a graph ref —rover schema describe <graph@variant>fails; you must fetch first and pipe.
Full reference, ranking rules, and the save-once pattern: Schema Exploration and references/schema.md.
Core Commands Overview
| Command | Description | Use Case |
|---|---|---|
rover init | Initialize a new federated graph project | New project setup, MCP server setup |
rover subgraph publish | Publish subgraph schema to GraphOS | CI/CD, schema updates |
rover subgraph check | Validate schema changes | PR checks, pre-deploy |
rover subgraph fetch | Download subgraph schema | Local development |
rover supergraph compose | Compose supergraph locally | Local testing |
rover dev | Local supergraph development | Development workflow |
rover graph publish | Publish monograph schema | Non-federated graphs |
rover schema describe | Explore a schema by coordinate; takes SDL via stdin/file, not a graph ref — pipe from rover graph fetch | Agent schema discovery |
rover schema search | Search a schema by keyword; takes SDL via stdin/file, not a graph ref — pipe from rover graph fetch | Agent schema discovery |
rover connector | Work with Apollo Connectors (run, test, list) | Connector development |
rover contract | Manage contract variants (describe, preview, publish) | API surface filtering |
rover persisted-queries | Generate and publish persisted query manifests (alias: pq) | Security, performance |
rover client check | Validate client operations against a graph schema | Client-side CI |
rover auth login | Authenticate via OAuth browser flow | Local dev auth |
rover api-key | Create, list, delete, rename, rotate API keys | Key management |
rover readme | Fetch or publish graph variant READMEs | Graph documentation |
rover template | List and use project templates | Scaffolding |
Graph Reference Format
Most commands require a graph reference in the format:
<GRAPH_ID>@<VARIANT>
Examples:
my-graph@productionmy-graph@stagingmy-graph@current(default variant)
Set as environment variable:
export APOLLO_GRAPH_REF=my-graph@production
Subgraph Workflow
Publishing a Subgraph
# From schema file
rover subgraph publish my-graph@production \
--name products \
--schema ./schema.graphql \
--routing-url https://products.example.com/graphql
# From running server (introspection)
rover subgraph publish my-graph@production \
--name products \
--schema <(rover subgraph introspect http://localhost:4001/graphql) \
--routing-url https://products.example.com/graphql
Checking Schema Changes
# Check against production traffic
rover subgraph check my-graph@production \
--name products \
--schema ./schema.graphql
Fetching Schema
# Fetch from GraphOS
rover subgraph fetch my-graph@production --name products
# Introspect running server
rover subgraph introspect http://localhost:4001/graphql
Supergraph Composition
Local Composition
Create supergraph.yaml:
federation_version: =2.9.0
subgraphs:
products:
routing_url: http://localhost:4001/graphql
schema:
file: ./products/schema.graphql
reviews:
routing_url: http://localhost:4002/graphql
schema:
subgraph_url: http://localhost:4002/graphql
federation_version here is the composition version — it only needs to be ≥
each subgraph's @link floor, so subgraphs pinned to a lower version compose
fine. If a subgraph server throws UNKNOWN_FEDERATION_LINK_VERSION at startup,
that's a client-library lag, not a composition problem. See the apollo-federation
skill's Federation versions.
Compose:
rover supergraph compose --config supergraph.yaml > supergraph.graphql
Fetch Composed Supergraph
rover supergraph fetch my-graph@production
This returns the supergraph SDL (federation directives +
join__/link__internals) — use it for composition/router work. To explore what you can query or write an operation, userover graph fetch(the API schema) instead — see Explore a Graph's Schema.
Local Development with rover dev
Start a local Router with automatic schema composition:
# Start with supergraph config
rover dev --supergraph-config supergraph.yaml
# Start with GraphOS variant as base
rover dev --graph-ref my-graph@staging --supergraph-config local.yaml
With MCP Integration
# Start with MCP server enabled
rover dev --supergraph-config supergraph.yaml --mcp
Schema Exploration (for Agents)
rover schema describe and rover schema search let an agent explore a schema without loading the full SDL into context — that is the entire point of these commands.
⚠️ Never read the raw SDL into context. Running
rover graph fetch <ref>(orrover graph introspect <url>) on its own prints the entire schema — hundreds to tens of thousands of lines — straight into your context, which defeats the purpose of these commands. Always pipe fetch output intorover schema describe/search: the SDL flows through stdin and only the compact overview/results reach you. (Fetching to a file is fine when the user actually wants the SDL.)These commands also take SDL on stdin or a file, NOT a graph ref — you can't pass
graph@variantto them. Fetch first, then pipe:❌ rover schema describe my-graph@current # error: looks for a file named that ❌ rover graph fetch my-graph@current # dumps the full SDL into your context ✅ rover graph fetch my-graph@current | rover schema describe -
To explore a graph in GraphOS, fetch its schema and pipe it in. Use rover graph fetch (the API schema) for "what can I query?" exploration — it omits federation internals. Reach for rover supergraph fetch only when you need composition details (join__/link__ types, subgraph structure):
# Overview of a GraphOS graph
rover graph fetch my-graph@current | rover schema describe -
# Find fields by keyword (results include paths from root operations)
rover graph fetch my-graph@current | rover schema search - "playback"
# Zoom into a coordinate, expanding referenced types one level
rover graph fetch my-graph@current | rover schema describe - --coord <Type.field> --depth 1
Coordinate forms: --coord accepts a type (User), a field (User.posts), a field argument (Type.field(arg:)), or a directive (@deprecated) — omit it for the overview.
search vs describe: reach for rover schema search first when matching a concept or keyword and you don't yet know the field name — it finds nested fields and shows the path from a root operation. The describe overview lists only root fields, so search is how you locate fields buried deeper. Use describe for the overview or once you know the type/field coordinate.
This enables a closed-loop workflow — search → describe → write a query — with no MCP server setup. See Schema Exploration for the full command reference, ranking rules, and the save-once pattern for large schemas.
Running the generated operation: Rover does not execute queries — it only manages and inspects schemas. To actually run a generated query you need the graph's endpoint:
- Single-subgraph graph:
rover subgraph list <graph@variant>prints the Routing Url — send the query there withcurl. - Multi-subgraph / federated: the client endpoint is the router URL (find it in GraphOS Studio), not the per-subgraph routing URLs.
- Don't try to discover the endpoint via the GraphOS Platform API — Rover keeps the API key in its profile/keychain, not
$APOLLO_KEY, so ad-hoc API calls will come back unauthenticated.
Reference Files
Detailed documentation for specific topics:
- Init -
rover initproject initialization and MCP server setup - Subgraphs - fetch, publish, check, lint, introspect, delete
- Graphs - monograph commands (non-federated)
- Supergraphs - compose, fetch, config format
- Dev - rover dev for local development
- Schema Exploration - describe, search, agent schema discovery workflows
- Connectors -
rover connectorrun, test, list, analyze, generate - Contracts - contract variant describe, preview, publish
- Persisted Queries - generate and publish persisted query manifests
- Client Operations - validate client operations, extract GraphQL documents
- Configuration - install, auth, env vars, profiles, OAuth login
- Additional Commands - template, readme, api-key, plugin, license, graph-artifact, completion, explain, docs
Common Patterns
CI/CD Pipeline
# 1. Check schema changes
rover subgraph check $APOLLO_GRAPH_REF \
--name $SUBGRAPH_NAME \
--schema ./schema.graphql
# 2. If check passes, publish
rover subgraph publish $APOLLO_GRAPH_REF \
--name $SUBGRAPH_NAME \
--schema ./schema.graphql \
--routing-url $ROUTING_URL
Schema Linting
# Lint against GraphOS rules
rover subgraph lint --name products ./schema.graphql
# Lint monograph
rover graph lint my-graph@production ./schema.graphql
Output Formats
# JSON output for scripting
rover subgraph fetch my-graph@production --name products --format json
# Plain output (default)
rover subgraph fetch my-graph@production --name products --format plain
Ground Rules
- ALWAYS authenticate before using GraphOS commands (
rover auth login,rover config auth, orAPOLLO_KEY) - ALWAYS use the correct graph reference format:
graph@variant - PREFER
rover subgraph checkbeforerover subgraph publishin CI/CD - USE
rover devfor local supergraph development instead of running Router manually - USE
rover initto scaffold new graph projects instead of manual setup - NEVER commit
APOLLO_KEYorAPOLLO_CLIENT_SECRETto version control; use environment variables - USE
--format jsonwhen parsing output programmatically - SPECIFY
federation_versionexplicitly in supergraph.yaml for reproducibility - USE
rover subgraph introspectto extract schemas from running services - USE
rover schema search/rover schema describe(piped from afetch) to explore large schemas instead of loading the full SDL into context - NEVER fetch a full schema into context just to explore it — pipe
rover graph fetch/introspectintorover schema describe/search(a barefetchis only for when the user wants the SDL file itself) - USE
rover client checkto validate client operations before deploying client changes - USE
rover persisted-queries publishto register operations for persisted query enforcement