Skip to content
Development
Skill

/apollo-federation

Guide for authoring Apollo Federation subgraph schemas. Use this skill when: (1) creating new subgraph schemas for a federated supergraph, (2) defining or modifying entities with @key, (3) sharing types/fields across subgraphs with @shareable, (4) working with federation

From plugin
apollo-skills
12915 skills1 MCP

Claude Code

$ npx -y skills add apollographql/skills --skill apollo-federation --agent claude-code

SKILL.md

apollo-federation.SKILL.md
name: apollo-federation
description: >
  Guide for authoring Apollo Federation subgraph schemas. Use this skill when:
  (1) creating new subgraph schemas for a federated supergraph,
  (2) defining or modifying entities with @key,
  (3) sharing types/fields across subgraphs with @shareable,
  (4) working with federation directives (@external, @requires, @provides, @override, @inaccessible),
  (5) troubleshooting composition errors,
  (6) any task involving federation schema design patterns.
license: MIT
compatibility: Works with any Federation 2.x compatible subgraph library (Apollo Server, GraphQL Yoga, etc.)
metadata:
  author: apollographql
  version: "1.0.2"
allowed-tools: Bash(rover:*) Read Write Edit Glob Grep

Apollo Federation Schema Authoring

Apollo Federation enables composing multiple GraphQL APIs (subgraphs) into a unified supergraph.

Federation 2 Schema Setup

Every Federation 2 subgraph must opt-in via `@link`:

extend schema
  @link(url: "https://specs.apollo.dev/federation/v2.12",
        import: ["@key", "@shareable", "@external", "@requires", "@provides"])

Import only the directives your subgraph uses. The version shown (`v2.12`) is illustrative — check the [Federation changelog](https://www.apollographql.com/docs/graphos/schema-design/federated-schemas/reference/versions) for currently supported versions before copying it verbatim.

> A subgraph's `@link` version is a floor, not the composition version — see > [Federation versions](references/composition.md#federation-versions-floor-vs-composition) > for the full explanation.

Core Directives Quick Reference

| Directive | Purpose | Example | |-----------|---------|---------| | `@key` | Define entity with unique key | `type Product @key(fields: "id")` | | `@shareable` | Allow multiple subgraphs to resolve field | `type Position @shareable { x: Int! }` | | `@external` | Reference field from another subgraph | `weight: Int @external` | | `@requires` | Computed field depending on external fields | `shippingCost: Int @requires(fields: "weight")` | | `@provides` | Conditionally resolve external field | `@provides(fields: "name")` | | `@override` | Migrate field to this subgraph | `@override(from: "Products")` | | `@inaccessible` | Hide from API schema | `internalId: ID! @inaccessible` | | `@interfaceObject` | Add fields to entity interface | `type Media @interfaceObject` |

Reference Files

Detailed documentation for specific topics:

  • [Directives](references/directives.md) - All federation directives with syntax, examples, and rules
  • [Schema Patterns](references/schema-patterns.md) - Multi-subgraph patterns and recipes
  • [Composition](references/composition.md) - Composition rules, error codes, and debugging

Key Patterns

Entity Definition

type Product @key(fields: "id") {
  id: ID!
  name: String!
  price: Int
}

Entity Contributions Across Subgraphs

# Products subgraph
type Product @key(fields: "id") {
  id: ID!
  name: String!
  price: Int
}

# Reviews subgraph
type Product @key(fields: "id") {
  id: ID!
  reviews: [Review!]!
  averageRating: Float
}

Computed Fields with @requires

type Product @key(fields: "id") {
  id: ID!
  size: Int @external
  weight: Int @external
  shippingEstimate: String @requires(fields: "size weight")
}

Value Types with @shareable

type Money @shareable {
  amount: Int!
  currency: String!
}

Entity Stub (Reference Without Contributing)

type Product @key(fields: "id", resolvable: false) {
  id: ID!
}

Ground Rules

  • ALWAYS use Federation 2.x syntax with `@link` directive
  • ALWAYS import only the directives your subgraph uses
  • NEVER use `@shareable` without ensuring all subgraphs return identical values for that field
  • PREFER `@key` with single ID field for simple entity identification
  • USE `rover supergraph compose` to validate composition locally
  • USE `rover subgraph check` to validate against production supergraph
Read more
@apollographql
Ships withapollo-skills

A collection of skills for AI coding agents working with Apollo GraphQL tools and technologies. Apollo Skills follow the Agent Skills format and are available on skills.sh.

12915 skills1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
129
Star history of apollographql/skills on GitHub, a chart by star-history.com

Other skills on apollo-skills.

apollo-ios

apollo-ios

Guide for building Apple-platform applications with Apollo iOS, the strongly-typed GraphQL client for Swift. Use this skill when:…

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about apollo-federation.

Which coding agents can use apollo-federation?
apollo-federation installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.