MCP HubMCP Hub
스킬 목록으로 돌아가기

use-graphql-api

pjt222
업데이트됨 2 days ago
2 조회
17
2
17
GitHub에서 보기
개발api

정보

이 스킬은 GraphQL API와의 명령줄 상호작용을 가능하게 하며, 스키마 탐색, 쿼리/뮤테이션 구성, `gh api graphql`이나 `curl` 같은 도구를 통한 실행, 그리고 `jq`를 이용한 응답 파싱을 처리합니다. ID를 파이핑하여 작업을 연결하는 것을 지원하며, GitHub 리소스(토론, 이슈, 프로젝트) 자동화나 GraphQL 엔드포인트를 CLI 워크플로우에 통합하는 데 이상적입니다. 스크립트나 자동화 프로세스에서 구조화된 API 데이터가 필요할 때 사용하세요.

빠른 설치

Claude Code

추천
기본
npx skills add pjt222/agent-almanac -a claude-code
플러그인 명령대체
/plugin add https://github.com/pjt222/agent-almanac
Git 클론대체
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/use-graphql-api

Claude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요

문서


name: use-graphql-api description: > コマンドラインからGraphQL APIを操作します。イントロスペクションによるスキーマの 発見、クエリとミューテーションの構築、gh api graphqlまたはcurlでの実行、 jqによるレスポンスの解析、IDをパイプで連鎖させた操作の連結を扱います。 GraphQL経由でGitHub Discussions、Issues、Projectsを自動化するとき、 スクリプトから任意のGraphQLエンドポイントと統合するとき、または構造化された APIデータを必要とするCLIワークフローを構築するときに使用します。 locale: ja source_locale: en source_commit: 6f65f316 translator: claude-opus-4-6 translation_date: 2026-03-16 license: MIT allowed-tools: Read Write Edit Bash Grep Glob WebFetch metadata: author: Philipp Thoss version: "1.0" domain: web-dev complexity: intermediate language: multi tags: graphql, api, github, query, mutation, introspection

GraphQL APIの使用

コマンドラインからGraphQLオペレーションを発見・構築・実行・連鎖させます。

使用タイミング

  • GraphQLエンドポイント(GitHub、Hasura、Apolloなど)経由でデータを照会・更新するとき
  • GraphQLを必要とするGitHubオペレーション(Discussions、Projects v2)を自動化するとき
  • GraphQL APIから構造化データを取得するシェルスクリプトを構築するとき
  • 1つのオペレーションの出力を次のオペレーションへの入力として使う複数のGraphQL呼び出しを連鎖させるとき

入力

  • 必須: GraphQLエンドポイントURLまたはサービス名(例:github
  • 必須: オペレーションの意図(読み取りまたは書き込みするデータ)
  • オプション: 認証トークンまたは方式(デフォルト:GitHubにはgh CLI認証)
  • オプション: 出力フォーマットの選択(生JSON、jqフィルター済み、変数代入)

手順

ステップ1: スキーマの発見

利用可能な型、フィールド、クエリ、ミューテーションを確認します。

GitHubの場合:

# 利用可能なクエリフィールドの一覧表示
gh api graphql -f query='{ __schema { queryType { fields { name description } } } }' \
  | jq '.data.__schema.queryType.fields[] | {name, description}'

# 利用可能なミューテーションフィールドの一覧表示
gh api graphql -f query='{ __schema { mutationType { fields { name description } } } }' \
  | jq '.data.__schema.mutationType.fields[] | {name, description}'

# 特定の型を調べる
gh api graphql -f query='{
  __type(name: "Repository") {
    fields { name type { name kind ofType { name } } }
  }
}' | jq '.data.__type.fields[] | {name, type: .type.name // .type.ofType.name}'

汎用エンドポイントの場合:

# curlによる完全なイントロスペクションクエリ
curl -s -X POST https://api.example.com/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"query":"{ __schema { types { name kind fields { name } } } }"}' \
  | jq '.data.__schema.types[] | select(.kind == "OBJECT") | {name, fields: [.fields[].name]}'

期待結果: 利用可能な型、フィールド、またはミューテーションを一覧表示するJSON出力。スキーマレスポンスがエンドポイントに到達可能で認証トークンが有効であることを確認します。

失敗時:

  • 401 Unauthorized — トークンを確認してください。GitHubの場合はgh auth statusを実行
  • Cannot query field — エンドポイントがイントロスペクションを無効にしている可能性があります。代わりにドキュメントを参照してください
  • 接続拒否 — エンドポイントURLとネットワークアクセスを確認してください

ステップ2: オペレーションタイプの特定

タスクにクエリ(読み取り)、ミューテーション(書き込み)、またはサブスクリプション(ストリーム)が必要かどうかを判断します。

意図オペレーション
データ取得queryリポジトリ詳細の取得、ディスカッションの一覧
作成/更新/削除mutationディスカッションの作成、コメントの追加
リアルタイム更新subscription新しいissueを監視(CLIでは稀)

GitHub固有のオペレーションについては、GitHub GraphQL API docsを参照してください。

# クイックチェック:ミューテーションは存在するか?
gh api graphql -f query='{ __schema { mutationType { fields { name } } } }' \
  | jq '.data.__schema.mutationType.fields[].name' | grep -i "discussion"

期待結果: クエリとミューテーションのどちらが必要かが明確になり、正確なオペレーション名(例:createDiscussionrepository)が特定されます。

失敗時:

  • オペレーションが見つからない — より広い用語で検索するか、APIバージョンを確認してください
  • クエリとミューテーションの区別が不明 — アクションが状態を変更する場合はミューテーションです

ステップ3: オペレーションの構築

フィールド、引数、変数を使ってGraphQLクエリまたはミューテーションを構築します。

クエリの例 — リポジトリのディスカッションカテゴリを取得:

gh api graphql -f query='
  query($owner: String!, $repo: String!) {
    repository(owner: $owner, name: $repo) {
      discussionCategories(first: 10) {
        nodes { id name }
      }
    }
  }
' -f owner="OWNER" -f repo="REPO" | jq '.data.repository.discussionCategories.nodes'

ミューテーションの例 — GitHubディスカッションの作成:

gh api graphql -f query='
  mutation($repoId: ID!, $categoryId: ID!, $title: String!, $body: String!) {
    createDiscussion(input: {
      repositoryId: $repoId,
      categoryId: $categoryId,
      title: $title,
      body: $body
    }) {
      discussion { url number }
    }
  }
' -f repoId="$REPO_ID" -f categoryId="$CAT_ID" \
  -f title="My Discussion" -f body="Discussion body here"

主要な構築ルール:

  1. 再利用性のために、インライン値ではなく常に変数($var: Type!)を使用する
  2. レスポンスサイズを最小化するために必要なフィールドのみリクエストする
  3. ページネーション付きコネクションにはfirst: Nnodesを使用する
  4. すべてのオブジェクト選択にidを追加する — 連鎖に必要になる

期待結果: 適切な変数、フィールド選択、ページネーションパラメータを持つ構文的に有効なGraphQLオペレーション。

失敗時:

  • 構文エラー — ブラケットの対応とトレーリングカンマを確認してください(GraphQLにはトレーリングカンマがない)
  • 型の不一致 — スキーマに対して変数の型を確認してください(例:ID!String!
  • 必須フィールドの欠落 — スキーマに従って必須入力フィールドを追加してください

ステップ4: CLIによる実行

オペレーションを実行してレスポンスをキャプチャします。

GitHub — gh api graphqlの使用:

# 単純なクエリ
gh api graphql -f query='{ viewer { login } }'

# 変数を使用
gh api graphql \
  -f query='query($owner: String!, $repo: String!) {
    repository(owner: $owner, name: $repo) { id name }
  }' \
  -f owner="octocat" -f repo="Hello-World"

# jqによる後処理
REPO_ID=$(gh api graphql \
  -f query='query($owner: String!, $repo: String!) {
    repository(owner: $owner, name: $repo) { id }
  }' \
  -f owner="OWNER" -f repo="REPO" \
  --jq '.data.repository.id')

汎用エンドポイント — curlの使用:

curl -s -X POST "$GRAPHQL_ENDPOINT" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d "$(jq -n \
    --arg query 'query { users { id name } }' \
    '{query: $query}'
  )"

期待結果: リクエストされたフィールドを含むdataキーを持つJSONレスポンス。オペレーションが失敗した場合はerrors配列。

失敗時:

  • レスポンスにerrors配列 — メッセージを読んでください。よくある原因:権限の欠落、無効なID、レート制限
  • 空のdata — クエリがレコードと一致しなかった。入力値を確認してください
  • HTTP 403 — トークンに必要なスコープがない。GitHubの場合はgh auth statusを確認し、gh auth refresh -s scopeでスコープを追加してください

ステップ5: レスポンスの解析

JSONレスポンスから必要なデータを抽出します。

# 単一の値を抽出
gh api graphql -f query='{ viewer { login } }' --jq '.data.viewer.login'

# リストから抽出
gh api graphql -f query='
  query($owner: String!, $repo: String!) {
    repository(owner: $owner, name: $repo) {
      issues(first: 5, states: OPEN) {
        nodes { number title }
      }
    }
  }
' -f owner="OWNER" -f repo="REPO" \
  --jq '.data.repository.issues.nodes[] | "\(.number): \(.title)"'

# 後で使用するために変数に代入
CATEGORY_ID=$(gh api graphql -f query='
  query($owner: String!, $repo: String!) {
    repository(owner: $owner, name: $repo) {
      discussionCategories(first: 20) {
        nodes { id name }
      }
    }
  }
' -f owner="OWNER" -f repo="REPO" \
  --jq '.data.repository.discussionCategories.nodes[] | select(.name == "Show and Tell") | .id')

期待結果: 表示またはシェル変数への代入に対応したクリーンで抽出された値。

失敗時:

  • jqがnullを返す — フィールドパスが間違っています。まず生のJSONをjq .にパイプして構造を確認してください
  • 1つを期待しているときに複数の値 — select()フィルターまたは| firstを追加してください
  • Unicode問題 — 生の文字列出力のために-rフラグをjqに追加してください

ステップ6: オペレーションの連鎖

1つのオペレーションの出力を次のオペレーションへの入力として使用します。

# ステップA: リポジトリIDの取得
REPO_ID=$(gh api graphql \
  -f query='query($owner: String!, $repo: String!) {
    repository(owner: $owner, name: $repo) { id }
  }' \
  -f owner="$OWNER" -f repo="$REPO" \
  --jq '.data.repository.id')

# ステップB: ディスカッションカテゴリIDの取得
CAT_ID=$(gh api graphql \
  -f query='query($owner: String!, $repo: String!) {
    repository(owner: $owner, name: $repo) {
      discussionCategories(first: 20) {
        nodes { id name }
      }
    }
  }' \
  -f owner="$OWNER" -f repo="$REPO" \
  --jq '.data.repository.discussionCategories.nodes[]
    | select(.name == "Show and Tell") | .id')

# ステップC: 両方のIDを使ってディスカッションを作成
RESULT=$(gh api graphql \
  -f query='mutation($repoId: ID!, $catId: ID!, $title: String!, $body: String!) {
    createDiscussion(input: {
      repositoryId: $repoId,
      categoryId: $catId,
      title: $title,
      body: $body
    }) {
      discussion { url number }
    }
  }' \
  -f repoId="$REPO_ID" -f catId="$CAT_ID" \
  -f title="$TITLE" -f body="$BODY" \
  --jq '.data.createDiscussion.discussion')

echo "Created: $(echo "$RESULT" | jq -r '.url')"

パターン: IDフィールドを前のクエリで常に抽出し、後続のミューテーションにID!変数として渡せるようにしてください。

期待結果: 各呼び出しが成功し、IDがオペレーション間で正しく流れる複数ステップのワークフロー。

失敗時:

  • 変数が空 — 前のステップがサイレントに失敗した。set -eを追加して各中間値を確認してください
  • IDフォーマットが間違い — GitHubのノードIDは不透明な文字列(例:R_kgDO...)です。手動で構築しないでください
  • レート制限 — 呼び出し間にsleep 1を追加するか、エイリアスを使ってクエリをバッチ処理してください

バリデーション

  1. イントロスペクションクエリがスキーマデータを返す(ステップ1が成功)
  2. 構築されたクエリが構文的に有効(GraphQLパーサーエラーなし)
  3. レスポンスにerrorsなしでdataキーが含まれる
  4. 抽出された値が期待される型と一致する(IDは空でない文字列、カウントは数値)
  5. 連鎖されたオペレーションがエンドツーエンドで完了する(ミューテーションが前のクエリのIDを使用)

よくある落とし穴

落とし穴防止策
必須変数型に!を付け忘れるnullability についてスキーマを常に確認してください。ほとんどの入力フィールドはnon-null(!)です
GraphQLでREST IDを使用するGraphQLは不透明なノードIDを使用します。RESTではなくGraphQL経由で取得してください
大きな結果セットのページネーションを省略するfirst/afterpageInfo { hasNextPage endCursor }を使用してください
クエリせずにIDをハードコードするIDは環境によって異なります。常に動的にクエリしてください
errors配列を無視するdataが存在してもエラーを確認してください — 部分的なエラーが起きる可能性があります
ネストされたJSONのシェルクォーティング問題gh--jqフラグを使用するか、jqに別途パイプしてください

関連スキル

GitHub 저장소

pjt222/agent-almanac
경로: i18n/ja/skills/use-graphql-api
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

연관 스킬

qmd

개발

qmd는 BM25, 벡터 임베딩, 재순위화를 결합한 하이브리드 검색을 통해 로컬 파일을 색인화하고 검색할 수 있는 로컬 검색 및 색인화 CLI 도구입니다. 명령줄 사용과 Claude 통합을 위한 MCP(Model Context Protocol) 모드를 모두 지원합니다. 이 도구는 임베딩에 Ollama를 사용하고 색인을 로컬에 저장하여 터미널에서 직접 문서나 코드베이스를 검색하는 데 이상적입니다.

스킬 보기

subagent-driven-development

개발

이 스킬은 각 독립적인 작업마다 새로운 하위 에이전트를 배치하고 작업 사이에 코드 리뷰를 진행하여 구현 계획을 실행합니다. 이 리뷰 프로세스를 통해 품질 게이트를 유지하면서 빠른 반복 작업을 가능하게 합니다. 동일한 세션 내에서 대부분 독립적인 작업을 진행할 때 내장된 품질 검증과 함께 지속적인 진행을 보장하기 위해 사용하세요.

스킬 보기

mcporter

개발

mcporter 스킬은 개발자가 Claude에서 직접 Model Context Protocol(MCP) 서버를 관리하고 호출할 수 있도록 합니다. 이 스킬은 사용 가능한 서버를 나열하고, 인수를 사용해 해당 서버의 도구를 호출하며, 인증 및 데몬 생명주기를 처리하는 명령어를 제공합니다. 개발 워크플로우에서 MCP 서버 기능을 통합하고 테스트할 때 이 스킬을 사용하세요.

스킬 보기

adk-deployment-specialist

개발

이 스킬은 A2A 프로토콜을 사용하여 Vertex AI ADK 에이전트를 배포하고 오케스트레이션하며, AgentCard 검색, 작업 제출, 코드 실행 샌드박스 및 메모리 뱅크와 같은 지원 도구를 관리합니다. Python, Java 또는 Go 언어로 순차, 병렬 또는 루프 오케스트레이션 패턴을 갖춘 다중 에이전트 시스템 구축을 가능하게 합니다. Google Cloud에서 ADK 에이전트 배포 또는 에이전트 워크플로우 오케스트레이션을 요청받았을 때 사용하세요.

스킬 보기