mcpField
G
graphql-operations

graphql-operations

github.com/apollographql開発1213.6k 回インストール1 日前に更新
リポジトリ

graphql-operations について

クライアント開発者向けの GraphQL オペレーション作成ガイドです。プロジェクトのスキーマに基づくクエリ、ミューテーション、サブスクリプションの記述方法を扱います。

主な機能

  1. 01最初にプロジェクトのスキーマを確認
  2. 02名前付きオペレーションと変数の使用
  3. 03必要なフィールドだけを取得
  4. 04フラグメントによる選択の再利用

活用シーン

  1. 01プロジェクト定義に沿ったクエリ作成
  2. 02動的な値の変数化
  3. 03重複するフィールド選択の削減
  4. 04コンポーネントに沿ったフラグメント整理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/apollographql/skills --skill graphql-operations

インストール後、Claude Code で/graphql-operationsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
fragments.md
mutations.md
queries.md
tooling.md
variables.md

詳細

GraphQL オペレーションガイド

このガイドでは、クライアント開発者向けに、GraphQL オペレーション(クエリ、ミューテーション、サブスクリプション)を記述する際のベストプラクティスを説明します。適切に記述されたオペレーションは、効率的で、型安全で、保守しやすいものです。

スキーマを起点にする

このガイドの例ではなく、プロジェクトのスキーマに基づいてすべてのオペレーションを記述してください。

  1. 何かを書く前にスキーマを見つけてください。codegen.ts、graphql.config.*、または apollo.config.* の schema エントリーを確認し、次に *.graphql SDL ファイルを探してください。
  2. スキーマで定義されているフィールド、引数、列挙値のみを使用してください。このガイドの updatedAt や orderBy: { field: CREATED_AT, direction: DESC } などのフィールド名は例示です。
  3. オペレーションは、クライアントの既存のオペレーションと同じ場所にドキュメントとして保存してください。ユーザーがスキーマの変更を求めない限り、サーバーのスキーマは変更しないでください。

オペレーションの基本

クエリの構造
query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
    email
  }
}
ミューテーションの構造
mutation CreatePost($input: CreatePostInput!) {
  createPost(input: $input) {
    id
    title
    createdAt
  }
}
サブスクリプションの構造
subscription OnMessageReceived($channelId: ID!) {
  messageReceived(channelId: $channelId) {
    id
    content
    sender {
      id
      name
    }
  }
}

クイックリファレンス

オペレーションの命名
パターン例
クエリGetUser、ListPosts、SearchProducts
ミューテーションCreateUser、UpdatePost、DeleteComment
サブスクリプションOnMessageReceived、OnUserStatusChanged
変数の構文
# Required variable
query GetUser($id: ID!) { ... }

# Optional variable with default
query ListPosts($first: Int = 20) { ... }

# Multiple variables
query SearchPosts($query: String!, $status: PostStatus, $first: Int = 10) { ... }
フラグメントの構文
# Define fragment
fragment UserBasicInfo on User {
  id
  name
  avatarUrl
}

# Use fragment
query GetUser($id: ID!) {
  user(id: $id) {
    ...UserBasicInfo
    email
  }
}
ディレクティブ
query GetUser($id: ID!, $includeEmail: Boolean!) {
  user(id: $id) {
    id
    name
    email @include(if: $includeEmail)
  }
}

query GetPosts($skipDrafts: Boolean!) {
  posts {
    id
    title
    draft @skip(if: $skipDrafts)
  }
}

重要な原則

1. 必要なものだけをリクエストする
# Good: Specific fields
query GetUserName($id: ID!) {
  user(id: $id) {
    id
    name
  }
}

# Avoid: Over-fetching
query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
    email
    bio
    posts {
      id
      title
      content
      comments {
        id
      }
    }
    followers {
      id
      name
    }
    # ... many unused fields
  }
}
2. すべてのオペレーションに名前を付ける
# Good: Named operation
query GetUserPosts($userId: ID!) {
  user(id: $userId) {
    posts {
      id
      title
    }
  }
}

# Avoid: Anonymous operation
query {
  user(id: "123") {
    posts {
      id
      title
    }
  }
}
3. インライン値ではなく変数を使用する
# Good: Variables
query GetUser($id: ID!) {
  user(id: $id) {
    id
    name
  }
}

# Avoid: Hardcoded values
query {
  user(id: "123") {
    id
    name
  }
}
4. フラグメントをコンポーネントと同じ場所に配置する
// UserAvatar.tsx
export const USER_AVATAR_FRAGMENT = gql`
  fragment UserAvatar on User {
    id
    name
    avatarUrl
  }
`;

function UserAvatar({ user }) {
  return <img src={user.avatarUrl} alt={user.name} />;
}

参考ファイル

各トピックの詳細なドキュメント:

基本ルール

  • 必ず、まずプロジェクトのスキーマを読み、定義されているフィールド、引数、列挙値のみを使用してください
  • 必ずオペレーションに名前を付けてください(名前のないクエリやミューテーションは禁止です)
  • 動的な値には必ず変数を使用してください
  • 必要なフィールドのみを必ずリクエストしてください
  • キャッシュ可能な型には必ず id フィールドを含めてください
  • オペレーション内に値をハードコードしないでください
  • ファイル間でフィールド選択を重複させないでください
  • 再利用可能なフィールド選択にはフラグメントを使用してください
  • フラグメントはコンポーネントと同じ場所に配置することを推奨します
  • 目的を反映した説明的なオペレーション名を使用してください
  • 条件付きフィールドには @include/@skip を使用してください

コメント