graphql-schema-generator

ehtbanton's avatarfrom ehtbanton

Generate GraphQL schema definition files (SDL) with types, queries, mutations, subscriptions, and resolvers for API development. Triggers on "create GraphQL schema", "generate GraphQL types", "GraphQL API for", "SDL schema".

⭐0stars🔀0forks📁View on GitHub🕐Updated Dec 17, 2025

When & Why to Use This Skill

This Claude skill automates the creation of comprehensive GraphQL Schema Definition Language (SDL) files, significantly accelerating API development. It generates production-ready types, queries, mutations, and subscriptions while ensuring adherence to the GraphQL June 2018 specification and industry best practices like Relay-style pagination and consistent naming conventions.

Use Cases

  • Rapid API Prototyping: Quickly generate full-featured schemas for domains like Blog/CMS, E-commerce, or Task Management with complete CRUD operations.
  • Backend Architecture Design: Define complex data relationships, interfaces, and input types for robust and scalable system architectures.
  • Standardization & Best Practices: Ensure all team members follow consistent GraphQL standards, including proper nullability, enum usage, and scalar type definitions.
  • Real-time Feature Scaffolding: Automatically create subscription types and event-driven schemas for applications requiring live data updates.
namegraphql-schema-generator
descriptionGenerate GraphQL schema definition files (SDL) with types, queries, mutations, subscriptions, and resolvers for API development. Triggers on "create GraphQL schema", "generate GraphQL types", "GraphQL API for", "SDL schema".

GraphQL Schema Generator

Generate complete GraphQL Schema Definition Language (SDL) files with types, queries, mutations, and subscriptions.

Output Requirements

File Output: schema.graphql or schema.gql Format: GraphQL SDL (Schema Definition Language) Standards: GraphQL June 2018 or later spec

When Invoked

Immediately generate a complete, valid GraphQL schema. Include appropriate types, queries, mutations, and input types for the domain.

SDL Structure

# Type definitions
type TypeName {
  field: Type
}

# Input types for mutations
input InputTypeName {
  field: Type
}

# Queries (read operations)
type Query {
  resource: Type
}

# Mutations (write operations)
type Mutation {
  createResource(input: InputType): Type
}

# Subscriptions (real-time)
type Subscription {
  resourceUpdated: Type
}

Complete Templates

Blog/CMS Schema

# ===========================================
# Scalar Types
# ===========================================

scalar DateTime
scalar UUID

# ===========================================
# Enums
# ===========================================

enum PostStatus {
  DRAFT
  PUBLISHED
  ARCHIVED
}

enum SortOrder {
  ASC
  DESC
}

enum UserRole {
  ADMIN
  EDITOR
  AUTHOR
  READER
}

# ===========================================
# Interfaces
# ===========================================

interface Node {
  id: ID!
}

interface Timestamped {
  createdAt: DateTime!
  updatedAt: DateTime!
}

# ===========================================
# Types
# ===========================================

type User implements Node & Timestamped {
  id: ID!
  email: String!
  username: String!
  displayName: String
  avatar: String
  bio: String
  role: UserRole!
  posts(first: Int, after: String, status: PostStatus): PostConnection!
  comments(first: Int, after: String): CommentConnection!
  createdAt: DateTime!
  updatedAt: DateTime!
}

type Post implements Node & Timestamped {
  id: ID!
  title: String!
  slug: String!
  content: String!
  excerpt: String
  featuredImage: String
  status: PostStatus!
  author: User!
  categories: [Category!]!
  tags: [Tag!]!
  comments(first: Int, after: String): CommentConnection!
  commentCount: Int!
  viewCount: Int!
  publishedAt: DateTime
  createdAt: DateTime!
  updatedAt: DateTime!
}

type Comment implements Node & Timestamped {
  id: ID!
  content: String!
  author: User!
  post: Post!
  parent: Comment
  replies(first: Int, after: String): CommentConnection!
  createdAt: DateTime!
  updatedAt: DateTime!
}

type Category implements Node {
  id: ID!
  name: String!
  slug: String!
  description: String
  parent: Category
  children: [Category!]!
  posts(first: Int, after: String): PostConnection!
  postCount: Int!
}

type Tag implements Node {
  id: ID!
  name: String!
  slug: String!
  posts(first: Int, after: String): PostConnection!
  postCount: Int!
}

# ===========================================
# Connection Types (Relay-style Pagination)
# ===========================================

type PageInfo {
  hasNextPage: Boolean!
  hasPreviousPage: Boolean!
  startCursor: String
  endCursor: String
}

type PostConnection {
  edges: [PostEdge!]!
  pageInfo: PageInfo!
  totalCount: Int!
}

type PostEdge {
  node: Post!
  cursor: String!
}

type CommentConnection {
  edges: [CommentEdge!]!
  pageInfo: PageInfo!
  totalCount: Int!
}

type CommentEdge {
  node: Comment!
  cursor: String!
}

type UserConnection {
  edges: [UserEdge!]!
  pageInfo: PageInfo!
  totalCount: Int!
}

type UserEdge {
  node: User!
  cursor: String!
}

# ===========================================
# Input Types
# ===========================================

input CreatePostInput {
  title: String!
  content: String!
  excerpt: String
  featuredImage: String
  status: PostStatus = DRAFT
  categoryIds: [ID!]
  tagNames: [String!]
}

input UpdatePostInput {
  title: String
  content: String
  excerpt: String
  featuredImage: String
  status: PostStatus
  categoryIds: [ID!]
  tagNames: [String!]
}

input CreateCommentInput {
  postId: ID!
  parentId: ID
  content: String!
}

input UpdateCommentInput {
  content: String!
}

input CreateCategoryInput {
  name: String!
  description: String
  parentId: ID
}

input PostFilterInput {
  status: PostStatus
  authorId: ID
  categoryId: ID
  tagId: ID
  search: String
}

input PostOrderInput {
  field: PostOrderField!
  direction: SortOrder!
}

enum PostOrderField {
  CREATED_AT
  UPDATED_AT
  PUBLISHED_AT
  TITLE
  VIEW_COUNT
}

# ===========================================
# Queries
# ===========================================

type Query {
  # User queries
  me: User
  user(id: ID!): User
  userByUsername(username: String!): User
  users(
    first: Int
    after: String
    role: UserRole
  ): UserConnection!

  # Post queries
  post(id: ID!): Post
  postBySlug(slug: String!): Post
  posts(
    first: Int
    after: String
    filter: PostFilterInput
    orderBy: PostOrderInput
  ): PostConnection!

  # Search
  searchPosts(query: String!, first: Int, after: String): PostConnection!

  # Category queries
  category(id: ID!): Category
  categoryBySlug(slug: String!): Category
  categories(parentId: ID): [Category!]!

  # Tag queries
  tag(id: ID!): Tag
  tagBySlug(slug: String!): Tag
  tags(first: Int): [Tag!]!
  popularTags(limit: Int = 10): [Tag!]!

  # Comment queries
  comment(id: ID!): Comment
}

# ===========================================
# Mutations
# ===========================================

type Mutation {
  # Auth mutations
  login(email: String!, password: String!): AuthPayload!
  register(email: String!, username: String!, password: String!): AuthPayload!
  logout: Boolean!
  refreshToken(refreshToken: String!): AuthPayload!

  # User mutations
  updateProfile(
    displayName: String
    bio: String
    avatar: String
  ): User!
  changePassword(currentPassword: String!, newPassword: String!): Boolean!

  # Post mutations
  createPost(input: CreatePostInput!): Post!
  updatePost(id: ID!, input: UpdatePostInput!): Post!
  deletePost(id: ID!): Boolean!
  publishPost(id: ID!): Post!
  unpublishPost(id: ID!): Post!

  # Comment mutations
  createComment(input: CreateCommentInput!): Comment!
  updateComment(id: ID!, input: UpdateCommentInput!): Comment!
  deleteComment(id: ID!): Boolean!

  # Category mutations (admin only)
  createCategory(input: CreateCategoryInput!): Category!
  updateCategory(id: ID!, name: String, description: String): Category!
  deleteCategory(id: ID!): Boolean!

  # Tag mutations
  createTag(name: String!): Tag!
  deleteTag(id: ID!): Boolean!
}

# ===========================================
# Subscriptions
# ===========================================

type Subscription {
  postPublished: Post!
  commentAdded(postId: ID!): Comment!
  postUpdated(id: ID!): Post!
}

# ===========================================
# Payload Types
# ===========================================

type AuthPayload {
  accessToken: String!
  refreshToken: String!
  expiresIn: Int!
  user: User!
}

# ===========================================
# Directives
# ===========================================

directive @auth(requires: UserRole = READER) on FIELD_DEFINITION
directive @deprecated(reason: String) on FIELD_DEFINITION

E-commerce Schema

scalar DateTime
scalar Decimal
scalar JSON

enum OrderStatus {
  PENDING
  CONFIRMED
  PROCESSING
  SHIPPED
  DELIVERED
  CANCELLED
  REFUNDED
}

enum PaymentStatus {
  PENDING
  COMPLETED
  FAILED
  REFUNDED
}

type Product implements Node {
  id: ID!
  sku: String!
  name: String!
  slug: String!
  description: String
  price: Decimal!
  compareAtPrice: Decimal
  images: [ProductImage!]!
  category: Category
  variants: [ProductVariant!]!
  inventory: Int!
  isAvailable: Boolean!
  attributes: JSON
  createdAt: DateTime!
  updatedAt: DateTime!
}

type ProductVariant {
  id: ID!
  name: String!
  sku: String!
  price: Decimal!
  inventory: Int!
  attributes: JSON
}

type ProductImage {
  id: ID!
  url: String!
  altText: String
  isPrimary: Boolean!
}

type Cart {
  id: ID!
  items: [CartItem!]!
  subtotal: Decimal!
  tax: Decimal!
  shipping: Decimal!
  total: Decimal!
  itemCount: Int!
}

type CartItem {
  id: ID!
  product: Product!
  variant: ProductVariant
  quantity: Int!
  unitPrice: Decimal!
  total: Decimal!
}

type Order implements Node {
  id: ID!
  orderNumber: String!
  customer: Customer!
  items: [OrderItem!]!
  status: OrderStatus!
  paymentStatus: PaymentStatus!
  subtotal: Decimal!
  tax: Decimal!
  shipping: Decimal!
  discount: Decimal!
  total: Decimal!
  shippingAddress: Address!
  billingAddress: Address!
  notes: String
  createdAt: DateTime!
  updatedAt: DateTime!
}

input AddToCartInput {
  productId: ID!
  variantId: ID
  quantity: Int!
}

input CheckoutInput {
  shippingAddressId: ID!
  billingAddressId: ID
  paymentMethodId: ID!
  notes: String
}

type Query {
  # Products
  product(id: ID, slug: String): Product
  products(
    first: Int
    after: String
    categoryId: ID
    search: String
    minPrice: Decimal
    maxPrice: Decimal
  ): ProductConnection!

  # Cart
  cart: Cart

  # Orders
  order(id: ID!): Order
  orders(first: Int, after: String, status: OrderStatus): OrderConnection!
}

type Mutation {
  # Cart
  addToCart(input: AddToCartInput!): Cart!
  updateCartItem(itemId: ID!, quantity: Int!): Cart!
  removeFromCart(itemId: ID!): Cart!
  clearCart: Cart!

  # Checkout
  checkout(input: CheckoutInput!): Order!

  # Orders
  cancelOrder(id: ID!, reason: String): Order!
}

type Subscription {
  orderStatusChanged(orderId: ID!): Order!
}

Best Practices

Naming Conventions

  • Types: PascalCase (User, BlogPost)
  • Fields: camelCase (firstName, createdAt)
  • Enums: SCREAMING_SNAKE_CASE (PENDING, IN_PROGRESS)
  • Inputs: PascalCase with Input suffix (CreateUserInput)

Nullable vs Non-Null

# Non-null (required)
field: String!

# Nullable (optional)
field: String

# Non-null list of non-null items
field: [String!]!

# Nullable list of nullable items
field: [String]

Validation Checklist

Before outputting, verify:

  • All types referenced exist
  • Query type has at least one field
  • Input types use only scalar, enum, or other input types
  • No circular references in non-null fields
  • Pagination follows Relay spec (if used)
  • Naming conventions are consistent
  • Descriptions added for complex fields

Example Invocations

Prompt: "Create GraphQL schema for a task management app" Output: Complete schema.graphql with tasks, projects, users, assignments.

Prompt: "Generate GraphQL types for social media API" Output: Complete schema.graphql with users, posts, followers, likes, comments.

Prompt: "GraphQL schema for inventory management system" Output: Complete schema.graphql with products, warehouses, stock, transfers.