Help us improve
Share bugs, ideas, or general feedback.
From apollo-skills
Guides authoring Apollo Federation subgraph schemas: entities with @key, shared types, computed fields, and composition troubleshooting.
npx claudepluginhub apollographql/skills --plugin apollo-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/apollo-skills:apollo-federationThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Apollo Federation enables composing multiple GraphQL APIs (subgraphs) into a unified supergraph.
Composes a unified GraphQL API from independently deployed subgraph services using Apollo Federation, with directives like @key, @shareable, @override, and @requires.
Designs GraphQL schemas with Apollo Federation, implements resolvers with DataLoader, and optimizes query performance. Invoke for schema design, federation directives, and real-time subscriptions.
Designs GraphQL schemas with Apollo Federation, implements resolvers using DataLoader, and optimizes query performance. Useful for schema-first design, real-time subscriptions, and query complexity analysis.
Share bugs, ideas, or general feedback.
Apollo Federation enables composing multiple GraphQL APIs (subgraphs) into a unified supergraph.
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.
| 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 |
Detailed documentation for specific topics:
type Product @key(fields: "id") {
id: ID!
name: String!
price: Int
}
# 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
}
type Product @key(fields: "id") {
id: ID!
size: Int @external
weight: Int @external
shippingEstimate: String @requires(fields: "size weight")
}
type Money @shareable {
amount: Int!
currency: String!
}
type Product @key(fields: "id", resolvable: false) {
id: ID!
}
@link directive@shareable without ensuring all subgraphs return identical values for that field@key with single ID field for simple entity identificationrover supergraph compose to validate composition locallyrover subgraph check to validate against production supergraph