Use when designing GraphQL schemas, implementing Apollo Federation, or building real-time subscriptions. Invoke for schema design, resolvers with DataLoader, query optimization, federation directives.
git clone https://github.com/Jeffallan/claude-skills.git--- name: graphql-architect description: Use when designing GraphQL schemas, implementing Apollo Federation, or building real-time subscriptions. Invoke for schema design, resolvers with DataLoader, query optimization, federation directives. license: MIT metadata: author: https://github.com/Jeffallan version: "1.1.0" domain: api-architecture triggers: GraphQL, Apollo Federation, GraphQL schema, API graph, GraphQL subscriptions, Apollo Server, schema design, GraphQL resolvers, DataLoader role: architect scope: design output-format: schema related-skills: api-designer, microservices-architect, database-optimizer --- # GraphQL Architect Senior GraphQL architect specializing in schema design and distributed graph architectures with deep expertise in Apollo Federation 2.5+, GraphQL subscriptions, and performance optimization. ## Core Workflow 1. **Domain Modeling** - Map business domains to GraphQL type system 2. **Design Schema** - Create types, interfaces, unions with federation directives 3. **Validate Schema** - Run schema composition check; confirm all `@key` entities resolve correctly - _If composition fails:_ review entity `@key` directives, check for missing or mismatched type definitions across subgraphs, resolve any `@external` field inconsistencies, then re-run composition 4. **Implement Resolvers** - Write efficient resolvers with DataLoader patterns 5. **Secure** - Add query complexity limits, depth limiting, field-level auth; validate complexity thresholds before deployment - _If complexity threshold is exceeded:_ identify the highest-cost fields, add pagination limits, restructure nested queries, or raise the threshold with documented justification 6. **Optimize** - Performance tune with caching, persisted queries, monitoring ## Reference Guide Load detailed guidance based on context: | Topic | Reference | Load When | |-------|-----------|-----------| | Schema Design | `references/schema-design.md` | Types, interfaces, unions, enums, input types | | Resolvers | `references/resolvers.md` | Resolver patterns, context, DataLoader, N+1 | | Federation | `references/federation.md` | Apollo Federation, subgraphs, entities, directives | | Subscriptions | `references/subscriptions.md` | Real-time updates, WebSocket, pub/sub patterns | | Security | `references/security.md` | Query depth, complexity analysis, authentication | | REST Migration | `references/migration-from-rest.md` | Migrating REST APIs to GraphQL | ## Constraints ### MUST DO - Use schema-first design approach - Implement proper nullable field patterns - Use DataLoader for batching and caching - Add query complexity analysis - Document all types and fields - Follow GraphQL naming conventions (camelCase) - Use federation directives correctly - Provide example queries for all operations ### MUST NOT DO - Create N+1 query problems - Skip query depth limiting - Expose internal implementation details - Use REST patterns in GraphQL - Return null for non-nullable fields - Skip error handling in resolvers - Hardcode authorization logic - Ignore schema validation ## Code Examples ### Federation Schema (SDL) ```graphql # products subgraph type Product @key(fields: "id") { id: ID! name: String! price: Float! inStock: Boolean! } # reviews subgraph — extends Product from products subgraph type Product @key(fields: "id") { id: ID! @external reviews: [Review!]! } type Review { id: ID! rating: Int! body: String author: User! @shareable } type User @shareable { id: ID! username: String! } ``` ### Resolver with DataLoader (N+1 Prevention) ```js // context setup — one DataLoader instance per request const context = ({ req }) => ({ loaders: { user: new DataLoader(async (userIds) => { const users = await db.users.findMany({ where: { id: { in: userIds } } }); // return results in same order as input keys return userIds.map((id) => users.find((u) => u.id === id) ?? null); }), }, }); // resolver — batches all user lookups in a single query const resolvers = { Review: { author: (review, _args, { loaders }) => loaders.user.load(review.authorId), }, }; ``` ### Query Complexity Validation ```js import { createComplexityRule } from 'graphql-query-complexity'; const server = new ApolloServer({ schema, validationRules: [ createComplexityRule({ maximumComplexity: 1000, onComplete: (complexity) => console.log('Query complexity:', complexity), }), ], }); ``` ## Output Templates When implementing GraphQL features, provide: 1. Schema definition (SDL with types and directives) 2. Resolver implementation (with DataLoader patterns) 3. Query/mutation/subscription examples 4. Brief explanation of design decisions ## Knowledge Reference Apollo Server, Apollo Federation 2.5+, GraphQL SDL, DataLoader, GraphQL Subscriptions, WebSocket, Redis pub/sub, schema composition, query complexity, persisted queries, schema stitching, type generation [Documentation](https://jeffallan.github.io/claude-skills/skills/api-architecture/graphql-architect/)
[{"step":"Define your domain and requirements. Replace [DOMAIN] and [SPECIFIC REQUIREMENTS] in the prompt with your actual use case (e.g., 'a hospital management system with patient records and appointment scheduling').","tip":"Be specific about performance needs like pagination, caching, or federation. For example, 'Support cursor-based pagination for the patient list query' or 'Add @key directives for Apollo Federation to enable microservice composition.'"},{"step":"Generate the schema using the prompt. Copy the output and paste it into your GraphQL server code (e.g., Apollo Server, Hasura, or AWS AppSync).","tip":"Use tools like GraphQL Playground or Apollo Studio to test the schema immediately. Validate the schema with `graphql validate` if you're using a CLI."},{"step":"Implement resolvers with DataLoader for batching and caching. Replace the example resolvers with your actual data sources (e.g., databases, REST APIs, or other GraphQL services).","tip":"For Apollo Federation, use `@apollo/federation` and `@key` directives to define entity relationships across microservices. Test federation locally using `rover dev` from Apollo."},{"step":"Add authentication and authorization. Use directives like `@auth` (custom) or `@authenticated` (built-in) to protect sensitive queries/mutations. Configure your auth middleware (e.g., JWT, OAuth).","tip":"For fine-grained control, use libraries like `graphql-shield` or `graphql-auth-directive` to define permission rules per field."},{"step":"Optimize performance. Add directives like `@cacheControl` for caching, `@deprecated` for fields, and `@connection` for relay-style pagination. Test with realistic data loads.","tip":"Use Apollo's `graphql-tools` to mock your schema and test queries before implementing resolvers. Monitor query complexity with tools like `graphql-depth-limit`."}]
No install command available. Check the GitHub repository for manual installation instructions.
git clone https://github.com/Jeffallan/claude-skills/tree/main/skills/graphql-architectCopy the install command above and run it in your terminal.
Launch Claude Code, Cursor, or your preferred AI coding agent.
Use the prompt template or examples below to test the skill.
Adapt the skill to your specific use case and workflow.
Design a GraphQL schema for [DOMAIN: e.g., an e-commerce platform, a social network, or a SaaS application]. Include types, queries, mutations, and subscriptions tailored to [SPECIFIC REQUIREMENTS: e.g., user authentication, product catalog, real-time notifications]. Ensure the schema supports [PERFORMANCE NEEDS: e.g., pagination, caching, or federation]. Add comments to explain complex relationships or directives. Provide example queries for each operation type.
```graphql
# GraphQL Schema for a Task Management SaaS Application
# Supports user authentication, task assignments, and real-time updates
scalar DateTime
type User {
id: ID!
username: String!
email: String!
tasks: [Task!]! @auth(requires: USER)
createdAt: DateTime!
}
type Task {
id: ID!
title: String!
description: String
status: TaskStatus!
assignee: User
createdAt: DateTime!
updatedAt: DateTime!
}
enum TaskStatus {
TODO
IN_PROGRESS
DONE
}
type Query {
getUser(id: ID!): User @auth(requires: USER)
listTasks(status: TaskStatus, assigneeId: ID): [Task!]! @auth(requires: USER)
getTask(id: ID!): Task @auth(requires: USER)
}
type Mutation {
createTask(title: String!, description: String, assigneeId: ID): Task! @auth(requires: USER)
updateTask(id: ID!, status: TaskStatus, title: String, description: String): Task! @auth(requires: USER)
assignTask(taskId: ID!, assigneeId: ID!): Task! @auth(requires: USER)
}
type Subscription {
taskUpdated: Task! @auth(requires: USER)
taskAssigned(userId: ID!): Task! @auth(requires: USER)
}
# Federation Directives for Apollo Federation
# @key(fields: "id")
# @extends
# @external
```
### Example Queries:
```graphql
# Fetch a user and their tasks
query GetUserWithTasks {
getUser(id: "user-123") {
id
username
tasks {
id
title
status
}
}
}
# Create a new task
mutation CreateTask {
createTask(title: "Implement GraphQL schema", description: "Design and document the GraphQL schema for the new SaaS app", assigneeId: "user-456") {
id
title
status
}
}
# Subscribe to task updates
subscription OnTaskUpdated {
taskUpdated {
id
title
status
assignee {
username
}
}
}
```
### Resolver Implementation (Node.js/Apollo):
```javascript
const { ApolloServer, gql } = require('apollo-server');
const { buildFederatedSchema } = require('@apollo/federation');
const typeDefs = gql`...`; // Paste the schema above here
const resolvers = {
Query: {
getUser: async (_, { id }, { dataSources }) => {
return dataSources.users.getUser(id);
},
listTasks: async (_, { status, assigneeId }, { dataSources }) => {
return dataSources.tasks.listTasks(status, assigneeId);
},
},
Mutation: {
createTask: async (_, { title, description, assigneeId }, { dataSources }) => {
return dataSources.tasks.createTask(title, description, assigneeId);
},
},
Subscription: {
taskUpdated: {
subscribe: (_, __, { pubsub }) => pubsub.asyncIterator(['TASK_UPDATED']),
},
},
};
const server = new ApolloServer({
schema: buildFederatedSchema([{ typeDefs, resolvers }]),
context: ({ req }) => ({ user: req.user }), // Auth middleware
});
```skills-collection
Take a free 3-minute scan and get personalized AI skill recommendations.
Take free scan