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

use-graphql-api

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

정보

이 스킬은 개발자가 명령줄에서 GraphQL API와 상호작용할 수 있게 하여, 스키마를 검사하고 쿼리/뮤테이션을 구성하며 `gh api graphql`이나 `curl` 같은 도구를 사용해 실행할 수 있도록 합니다. 특히 GitHub 작업(Discussions, Issues, Projects) 자동화나 GraphQL 엔드포인트를 CLI 워크플로우에 통합하는 데 유용합니다. 주요 기능으로는 `jq`를 이용한 응답 파싱과 쿼리 간 ID 파이핑을 통한 작업 연계가 포함됩니다.

빠른 설치

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 交互——通过内省发现 Schema、构造查询和变更操作、 使用 gh api graphql 或 curl 执行、用 jq 解析响应,并通过 ID 管道链接操作。 适用于通过 GraphQL 自动化 GitHub Discussions、Issues 或 Projects、从脚本 集成任意 GraphQL 端点,或构建需要结构化 API 数据的 CLI 工作流。 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 locale: zh-CN source_locale: en source_commit: 6f65f316 translator: claude-opus-4-6 translation_date: 2026-03-16

使用 GraphQL API

从命令行发现、构造、执行并链接 GraphQL 操作。

适用场景

  • 通过 GraphQL 端点(GitHub、Hasura、Apollo 等)查询或修改数据
  • 自动化需要 GraphQL 的 GitHub 操作(Discussions、Projects v2)
  • 构建从 GraphQL API 获取结构化数据的 Shell 脚本
  • 链接多个 GraphQL 调用,将前一个调用的输出传入下一个

输入

  • 必需:GraphQL 端点 URL 或服务名称(如 github
  • 必需:操作意图(读取或写入的数据内容)
  • 可选:认证令牌或方式(默认:GitHub 使用 gh CLI 认证)
  • 可选:输出格式偏好(原始 JSON、jq 过滤、变量赋值)

步骤

第 1 步:发现 Schema

确定可用的类型、字段、查询和变更。

针对 GitHub:

# List available query fields
gh api graphql -f query='{ __schema { queryType { fields { name description } } } }' \
  | jq '.data.__schema.queryType.fields[] | {name, description}'

# List available mutation fields
gh api graphql -f query='{ __schema { mutationType { fields { name description } } } }' \
  | jq '.data.__schema.mutationType.fields[] | {name, description}'

# Inspect a specific type
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}'

针对通用端点:

# Full introspection query via 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 输出列出可用类型、字段或变更。Schema 响应确认端点可达且认证令牌有效。

失败处理:

  • 401 Unauthorized — 验证令牌;GitHub 请运行 gh auth status
  • Cannot query field — 端点可能禁用内省;改查其文档
  • 连接被拒绝 — 验证端点 URL 和网络访问

第 2 步:确定操作类型

确定任务需要查询(读取)、变更(写入)还是订阅(流)。

意图操作示例
获取数据query获取仓库详情、列出 discussions
创建/更新/删除mutation创建 discussion、添加评论
实时更新subscription监听新 issue(CLI 中少见)

针对 GitHub 特定操作,查阅 GitHub GraphQL API 文档

# Quick check: does the mutation exist?
gh api graphql -f query='{ __schema { mutationType { fields { name } } } }' \
  | jq '.data.__schema.mutationType.fields[].name' | grep -i "discussion"

预期结果: 明确识别需要查询还是变更,以及确切的操作名称(如 createDiscussionrepository)。

失败处理:

  • 找不到操作 — 用更广泛的词语搜索或检查 API 版本
  • 不确定是查询还是变更 — 如果操作改变状态,则为变更

第 3 步:构造操作

用字段、参数和变量构建 GraphQL 查询或变更。

查询示例——获取仓库的 discussion 分类:

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 Discussion:

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. 对分页连接使用带 nodesfirst: N
  4. 在每个对象选择中添加 id——链接时需要用到

预期结果: 语法正确的 GraphQL 操作,包含适当的变量、字段选择和分页参数。

失败处理:

  • 语法错误 — 检查括号匹配和尾随逗号(GraphQL 不允许尾随逗号)
  • 类型不匹配 — 根据 Schema 验证变量类型(如 ID! vs String!
  • 缺少必填字段 — 根据 Schema 添加必需的输入字段

第 4 步:通过 CLI 执行

运行操作并捕获响应。

GitHub——使用 gh api graphql

# Simple query
gh api graphql -f query='{ viewer { login } }'

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

# With jq post-processing
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}'
  )"

预期结果: JSON 响应包含带请求字段的 data 键,或操作失败时包含 errors 数组。

失败处理:

  • 响应中有 errors 数组 — 阅读消息;常见原因是权限不足、ID 无效或触发速率限制
  • data 为空 — 查询未匹配任何记录;验证输入值
  • HTTP 403 — 令牌缺少所需权限范围;GitHub 请检查 gh auth status 并用 gh auth refresh -s scope 添加权限

第 5 步:解析响应

从 JSON 响应中提取所需数据。

# Extract a single value
gh api graphql -f query='{ viewer { login } }' --jq '.data.viewer.login'

# Extract from a list
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)"'

# Assign to a variable for later use
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')

预期结果: 提取出干净的值,可直接显示或赋值给 Shell 变量。

失败处理:

  • jq 返回 null — 字段路径错误;先将原始 JSON 传给 jq . 检查结构
  • 期望单个值但返回多个 — 添加 select() 过滤器或 | first
  • Unicode 问题 — 为 jq 添加 -r 以获取原始字符串输出

第 6 步:链接操作

将一个操作的输出用作下一个操作的输入。

# Step A: Get the repository 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')

# Step B: Get the discussion category 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')

# Step C: Create the discussion using both IDs
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. 内省查询返回 Schema 数据(第 1 步成功)
  2. 构造的查询语法正确(无 GraphQL 解析器错误)
  3. 响应包含 data 键且无 errors
  4. 提取的值类型正确(ID 为非空字符串,计数为数字)
  5. 链接操作端到端完成(变更使用前序查询中的 ID)

常见问题

问题预防措施
忘记在必需变量类型上加 !始终检查 Schema 中的可为空性;大多数输入字段是非空的(!
在 GraphQL 中使用 REST IDGraphQL 使用不透明节点 ID;通过 GraphQL 获取,而非 REST
不分页大结果集使用带 pageInfo { hasNextPage endCursor }first/after
硬编码 ID 而不查询ID 在不同环境中不同;始终动态查询
忽略 errors 数组即使 data 存在也要检查错误——部分错误是可能的
Shell 中嵌套 JSON 的引号问题使用 gh--jq 标志或单独通过 jq 管道处理

相关技能

GitHub 저장소

pjt222/agent-almanac
경로: i18n/zh-CN/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 에이전트 배포 또는 에이전트 워크플로우 오케스트레이션을 요청받았을 때 사용하세요.

스킬 보기