Skip to main content
Glama

MCP 2.0 GitHub CLI Server

A Python MCP server for the gh CLI. It uses the official MCP Python SDK 2.x, runs gh asynchronously without a terminal, and returns structured results from direct JSON output or a post-write readback.

Version 0.9.0 exposes 64 public MCP tools: 43 read-only and 21 write. The 0.9.0 release splits the former generic gh_submit_pr_review into three action-specific formal pull-request review writes — gh_approve_pr, gh_request_pr_changes, and gh_comment_pr_review — and adds the read-only gh_get_pr_review_eligibility preflight. Each review write submits exactly one review through the server-configured reviewer principal, verifies the exact head and authenticated reviewer identity immediately before the review POST, and readbacks immutable review-ID state. Issue #80 additionally adds gh_patch_files, a focused exact-context text-patch write that materializes all edits against immutable original blob snapshots before creating Git objects and then reuses the canonical content-commit CAS/readback state machine. Issue #82 adds the read-only gh_list_repository_tree structural discovery primitive, pinned to one exact commit SHA with bounded completeness evidence and safe root/nested directory traversal. Issue #83 adds gh_get_pr_review_thread, an exact-head bounded detail read for one opaque review-thread node ID, including ownership proof, ordered comment provenance, independent comment/body truncation evidence, and complete-body digests. The 0.8.0 release retired the weaker generic workflow-dispatch, release-creation, and label-upsert writes, removed obsolete write-compatibility infrastructure, and registered every public write exactly once through the canonical host-facing schema facade. Historical 0.7.0/0.7.1, 0.8.0, and 0.8.1 release records remain available under docs/ but do not define the current runtime inventory.

Tools

Read-only (43)

  • gh_server_info: report the deployed MCP server and tool-schema version without contacting GitHub or starting a subprocess.

  • gh_info: gh CLI version, authentication status, and active account.

  • gh_get_api_rate_status: report GitHub-provided primary rate-limit observations separately from locally governed blocking/pacing state, with bounded anti-polling reuse.

  • gh_search_repos: search GitHub repositories with qualifiers.

  • gh_search_issues: search issues and pull requests with qualifiers.

  • gh_search_code: search source code with qualifiers.

  • gh_list_issues: list issues in a repository with filters.

  • gh_get_issue: get details of a specific issue or pull request, including its body.

  • gh_list_prs: list pull requests in a repository.

  • gh_get_pr: get a bounded, fully typed pull-request snapshot and exact base/head commit SHAs through one explicit noninteractive GET.

  • gh_get_pr_diff: read a bounded diff or patch pinned to the PR's exact base and head SHAs, with truncation metadata and a SHA-256 fingerprint.

  • gh_list_pr_files: list one bounded page of changed files and patch fragments.

  • gh_list_pr_commits: list one bounded page of commits in a pull request.

  • gh_list_pr_reviews: list one bounded page of formal reviews for an exact PR head, preserving pagination and exact-head evidence.

  • gh_get_pr_review_state: aggregate exact-head review/request/thread evidence without treating truncated evidence as complete.

  • gh_get_pr_review_thread: resolve one exact opaque thread ID from that aggregate workflow, prove repository/PR ownership at the expected PR head, and return bounded ordered comments with provenance plus independent connection/body completeness metadata and complete-body SHA-256 digests.

  • gh_get_pr_review_eligibility: read-only exact-head preflight reporting the PR author, ordinary GitHub identity, configured reviewer identity, and whether an independent APPROVED review or ordinary COMMENTED review is currently eligible.

  • gh_get_merge_requirements: aggregate effective merge requirements/readiness for an exact expected PR head and fail closed when policy or identity evidence is incomplete.

  • gh_get_repo: get details of a specific repository.

  • gh_list_repos: list repositories for a user or organization.

  • gh_list_releases: list releases in a repository.

  • gh_get_release: get details of a specific release.

  • gh_list_workflows: list GitHub Actions workflows in a repository.

  • gh_get_workflow: get details of a specific workflow.

  • gh_list_runs: list recent GitHub Actions workflow runs.

  • gh_get_run: get details of a specific workflow run.

  • gh_list_run_artifacts: list one bounded page of artifact metadata for an exact workflow run, with optional exact-name filtering and run attempt/head identity.

  • gh_get_artifact: get one exact artifact's metadata, including digest, expiry, associated workflow run, and workflow head SHA.

  • gh_list_artifact_files: inspect one exact unexpired artifact ZIP and list a bounded page of normalized regular-file metadata without extracting the archive.

  • gh_read_artifact_file: read one exact normalized artifact path as bounded UTF-8 text/JSON evidence with complete-file digest and truncation metadata.

  • gh_watch_run: poll a workflow run until completion or a caller-supplied timeout.

  • gh_get_pr_checks: return bounded CI check summaries pinned to an exact PR revision.

  • gh_list_run_jobs: list one bounded page of jobs and steps for an exact run attempt.

  • gh_get_failed_run_logs: return bounded failed-step logs for an exact run attempt.

  • gh_get_job_logs: return bounded full log evidence for one exact job and explicit run attempt, with literal tail/marker selectors and complete-source SHA-256.

  • gh_get_run_logs: return bounded full log evidence for one exact run attempt, with literal tail/marker selectors and complete-source SHA-256.

  • gh_list_labels: list labels in a repository.

  • gh_list_milestones: list milestones in a repository.

  • gh_get_file_contents: read a complete file at an exact branch, tag, or commit ref.

  • gh_list_repository_tree: list immediate or recursive structural entries for a repository root or nested directory at one exact commit SHA, with exact tree/object identity and explicit truncation/completeness metadata but no file content.

  • gh_get_ref: resolve one exact branch or tag Git ref, preserving direct object identity and returning the peeled commit SHA for annotated tags.

  • gh_get_commit: read one exact 40-character Git commit SHA with its immutable tree, ordered parents, author/committer, message, and GitHub verification evidence.

  • gh_compare_commits: compare two exact commit SHAs with explicit merge-base, ahead/behind status, independently bounded commit/file evidence, and digests.

Write (21)

  • gh_create_issue: create a new issue (write, disabled by default).

  • gh_create_pr: create a new pull request (write, disabled by default).

  • gh_create_repo: create a new repository only for an exact configured prospective OWNER/REPO target (write, disabled by default).

  • gh_create_release_exact: create a release against one exact target commit with fail-closed absence preconditions and authoritative readback (write, disabled by default).

  • gh_run_workflow_exact: dispatch one exact numeric workflow ID or canonical workflow path only when the requested ref resolves to the expected exact SHA, with post-dispatch evidence bound to the resolved numeric workflow/run identities (write, disabled by default).

  • gh_edit_issue: edit an existing issue (write, disabled by default).

  • gh_set_issue_state: change issue state only from the caller-declared expected state and verify the resulting state by readback (write, disabled by default).

  • gh_create_label: create a new label (write, disabled by default).

  • gh_edit_label: edit an existing label (write, disabled by default).

  • gh_create_milestone: create a new milestone (write, disabled by default).

  • gh_create_comment: create a comment on an issue or PR (write, disabled by default).

  • gh_create_branch: create an issue development branch from a branch-name base (additive write, disabled by default).

  • gh_create_branch_from_sha: create a branch at one exact 40-character commit SHA without moving an existing ref (additive write, disabled by default).

  • gh_edit_pr: edit an existing pull request (write, disabled by default).

  • gh_set_pr_draft_state: change PR draft state only for the expected exact head and expected current draft state, with authoritative readback (write, disabled by default).

  • gh_approve_pr: submit exactly one formal APPROVED review for an exact PR head through the server-configured independent reviewer principal, verifying exact head and authenticated reviewer login before the POST (additive write, disabled by default).

  • gh_request_pr_changes: submit exactly one formal CHANGES_REQUESTED review for an exact PR head through the configured reviewer principal with an exact expected reviewer login compare-only precondition (additive write, disabled by default).

  • gh_comment_pr_review: submit exactly one formal COMMENTED review through the ordinary authenticated principal for an exact PR head as the explicit same-author fallback; COMMENTED is never reported as APPROVED (additive write, disabled by default).

  • gh_merge_pr: merge an exact reviewed PR head with an explicit strategy (destructive write, separately disabled by default).

  • gh_commit_files: atomically create or replace files in one branch commit (destructive write, separately disabled by default).

  • gh_patch_files: apply bounded exact-context UTF-8 text edits to existing files in one branch commit, preserving supported file modes and reusing the content-commit exact-CAS and authoritative readback contract (destructive write, separately disabled by default).

Historical 0.7.1 additionally exposed the weaker generic gh_run_workflow, gh_create_release, and gh_upsert_label writes. They are retired in 0.8.0 rather than preserved as aliases. gh_run_workflow_exact and gh_create_release_exact are the sole public primitives for their mutation classes, while label callers choose explicit gh_create_label or gh_edit_label semantics. Do not restore retired tools or reinterpret historical 0.7.x inventory records as current runtime authority.

Related MCP server: GitHub CLI MCP Server

0.9.0 architecture and evidence contract

src/mcp_gh_server/server.py is the composition root; public read implementations live in cohesive domain modules under src/mcp_gh_server/tools/, while the 21 public writes are registered exactly once from src/mcp_gh_server/current_write_tool_schema.py. That facade keeps the non-review writes and delegates the three formal review writes to src/mcp_gh_server/pr_review_tool_schema.py. gh_commit_files and gh_patch_files share src/mcp_gh_server/content_commit_service.py as the sole materialized-content object/CAS/readback state machine. GitHub request execution is centralized through the shared GitHubRequestGovernor rather than duplicated in individual tools.

Writes remain default-off. Exact-state tools preserve expected state/SHA preconditions where applicable, perform one mutation attempt, and require authoritative readback before reporting verified success. Ambiguous or partial writes are not blindly retried. Canonical metadata-aware write paths rely on structured GitHubRequestError ambiguity metadata produced by GhClient; bare RuntimeError message text is not upgraded into an invented transport classification.

Evidence reads remain explicitly bounded. Callers must preserve truncation/completeness metadata, byte counts, digests, and warnings rather than presenting partial artifact, log, or comparison evidence as complete.

The conservative read surface includes exact-state evidence such as gh_get_merge_requirements, gh_compare_commits, artifact-content inspection, and gh_get_api_rate_status. These tools fail closed or report incomplete evidence when identity, policy, or bounded-source completeness cannot be established. See the focused documents under docs/ for each contract.

0.9.0 intentionally does not expose arbitrary public gh <args...>, arbitrary public gh api, a generic shell/subprocess MCP tool, administrator bypasses, automatic mutation replay, artifact/log deletion, or branch-protection/ruleset mutation. See docs/release_gate_0_9_0.md for the current release acceptance mapping.

Install

cp .env.example .env
$EDITOR .env
uv sync --dev

GITHUB_TOKEN is required and can be supplied either in the process environment or the located .env file. To use an env file outside the launch directory, set:

export MCP_GH_ENV_FILE=/absolute/path/to/.env

Start the MCP Inspector:

uv run mcp dev src/mcp_gh_server/server.py

Run as a local stdio MCP server:

uv run mcp-gh

The default transport is stdio. For local Streamable HTTP:

MCP_GH_TRANSPORT=streamable-http uv run mcp-gh
# endpoint: http://127.0.0.1:8766/mcp

Alternative ASGI launch:

uv run uvicorn mcp_gh_server.asgi:app --host 127.0.0.1 --port 8766

Client configuration

VS Code / compatible local stdio host

Use an absolute project path. The host should launch the locked project environment. Run uv sync --dev first so the project has a generated uv.lock before using --frozen:

{
  "servers": {
    "gh-local": {
      "type": "stdio",
      "command": "/absolute/path/to/uv",
      "args": [
        "run",
        "--directory",
        "/absolute/path/to/gh_mcp",
        "--frozen",
        "mcp-gh"
      ],
      "env": {
        "MCP_GH_ENV_FILE": "/absolute/path/to/gh_mcp/.env"
      }
    }
  }
}

For Qwen Code or another host using the common mcpServers shape, keep the same command/args and place the entry under mcpServers.

ChatGPT plan and gateway limitations

The action surface is version 0.9.0, but availability in ChatGPT depends on the account plan and integration surface:

  • OpenAI currently limits full custom MCP apps, including write/modify actions, to Business and Enterprise/Edu workspaces.

  • A ChatGPT Plus user may be able to install or discover a custom plugin, but the plugin's MCP gateway is a separate, more limited integration. This project does not assume that gateway supports arbitrary custom MCP tools or write actions.

  • Seeing gh_get_file_contents, gh_commit_files, or gh_patch_files in a discovery response proves only that the server advertised the tools. It does not prove that the Plus plugin gateway will route the invocation to the server.

The Business/Enterprise Action control, action-refresh, and workspace-publish instructions do not apply to a Plus account. If the Plus gateway reports that the plugin or gh_CLI namespace has been disabled, there may be no user-accessible action setting that can re-enable the tool in that conversation.

Tentative Plus schema-refresh procedure

Limited testing indicates that the Plus custom-plugin gateway may retain a cached tool schema after the backend changes. Deleting and reinstalling the custom plugin appears to force rediscovery of the revised tools and may be necessary when tool names, parameters, annotations, or result schemas change:

  1. Increment the project, package, and MCP server version whenever a deployed revision changes tool names, schemas, annotations, or routing behavior.

  2. Deploy the revised backend and restart the MCP server.

  3. Delete the existing custom plugin from ChatGPT Plus.

  4. Reinstall the plugin so the gateway scans the backend's current tool definitions.

  5. In a new conversation, call gh_server_info and confirm both server_version and tool_schema_version match the expected deployment.

  6. Only then test the revised GitHub tools.

This procedure is based on observed behavior rather than a documented compatibility guarantee. A backend restart alone may leave the Plus gateway using stale tool definitions, while deletion and reinstallation may still fail if the gateway does not support a particular tool or capability.

gh_server_info is intentionally the smallest and safest possible verification call. It takes no model-controlled arguments, performs no external I/O, starts no subprocess, triggers no elicitation or approval flow, and returns only bounded local metadata. gh_info is not a substitute: it reports the installed GitHub CLI version, not the deployed MCP server version.

See OpenAI's current MCP app availability and plugin availability.

At INFO, repository-content tools log content-free reachability markers using their own tool names, including gh_get_file_contents, gh_list_repository_tree, gh_commit_files, and gh_patch_files.

The focused PR snapshot/review reads emit the same marker using their own tool name.

The version probe emits the equivalent marker with tool=gh_server_info.

gh_get_pr Plus gateway contract

Version 0.5.1 replaces the former gh_get_pr contract that could be discovered but was not safe for a strict execution gateway. The old definition had no explicit tool title, did not declare idempotence, accepted unconstrained repository identifiers, and advertised ambiguous structured-output fragments: label items had an empty JSON schema and comments had no JSON type. A host can catalog such a tool while rejecting it later when it constructs or validates the executable route.

The revised operation preserves the mixed read/write server and changes only the offending read contract and common read annotation accuracy:

  • the title and description explicitly identify a read-only, noninteractive snapshot;

  • readOnlyHint=true, destructiveHint=false, and idempotentHint=true are explicit;

  • owner, repository, and positive PR-number constraints are present in the input schema;

  • every output field is typed, including labels: string[], nonnegative integer comments, and required 40-character base/head SHAs;

  • the implementation performs exactly one gh api ... -X GET request and exposes no approval, elicitation, comment, review, merge, or generic-command path;

  • the reachability marker is logged before repository validation or client execution:

MCP tool invocation reached server: tool=gh_get_pr

After deploying the current release, delete and reinstall the Plus custom plugin and verify gh_server_info reports both versions as 0.9.0. An immediate namespace-disabled response with no gh_get_pr marker still proves rejection occurred in the host before the revised server operation. It does not indicate GitHub authentication, repository, PR, or readback failure and must not be retried as though a GitHub write partially ran.

If ChatGPT reports that the app or namespace is disabled and this marker is absent, the call was rejected by ChatGPT's plugin gateway before reaching the MCP server. Restarting gh, changing the GitHub token, or changing this server's command implementation cannot repair that host-side state. On Plus, full validation should therefore use a standard MCP client such as the local stdio or Streamable HTTP configurations above; passing those checks does not establish compatibility with ChatGPT's limited custom-plugin gateway.

Read-only pull-request review without checkout

The server deliberately does not expose a generic command executor or a standalone checkout operation. A checkout performed by this backend would exist on the MCP server's filesystem, not in ChatGPT's local environment, and a path alone would not provide a safe review workspace. The focused review tools instead operate through noninteractive GitHub reads and return bounded structured results:

  1. Call gh_get_pr and record its exact base_sha and head_sha.

  2. Call gh_get_pr_diff for a unified diff or email-style patch. The server resolves the PR's object IDs and reads the comparison by those immutable SHAs.

  3. Check truncated, bytes_returned, total_bytes, and sha256. A truncated result is not a complete diff and must not be described as one.

  4. Page through gh_list_pr_files and gh_list_pr_commits as needed. The server rechecks the SHA pair after each numbered-PR page and rejects the result if the snapshot changed during the read. GitHub may omit or truncate an individual file's patch, and the server also bounds patch fragments and commit messages. Use gh_list_repository_tree when structural path discovery is needed, then use gh_get_file_contents at the same returned SHA for complete file inspection.

  5. If the PR changes during review, restart from the new exact SHA pair rather than combining observations from different snapshots.

gh_get_pr_diff returns at most MCP_GH_MAX_PR_DIFF_BYTES UTF-8 bytes. A caller may request a smaller limit, but cannot raise the deployment cap above 1,000,000 bytes:

MCP_GH_MAX_PR_DIFF_BYTES=500000
MCP_GH_MAX_PR_FILE_PATCH_BYTES=8000
MCP_GH_MAX_PR_COMMIT_MESSAGE_BYTES=4000

This workflow is valid for source-level, read-only review. It does not check out a worktree, inspect generated or untracked files, install dependencies, build code, or run tests. A validation record should state that boundary explicitly, for example:

Reviewed the pull request using GitHub metadata, diff data, and repository file contents pinned to the recorded base and head SHAs. No local checkout, build, or test execution was performed.

If acceptance requires execution, use a separate isolated repository runner with a managed workspace, bounded commands, cancellation, cleanup, and exact-head-SHA validation. The read-only MCP tools are not a substitute for that environment.

Formal pull-request review and merge

gh_create_comment creates an issue-style conversation comment; it does not submit a GitHub pull-request review and cannot produce the formal APPROVED, CHANGES_REQUESTED, or COMMENTED review states. Use the action-specific review writes — gh_approve_pr, gh_request_pr_changes, or gh_comment_pr_review — when a formal disposition is required.

The safe completion sequence is:

  1. Read and review the PR using gh_get_pr, gh_get_pr_diff, file pages, commit pages, and exact-ref file reads. Record the returned head_sha.

  2. Optionally run the read-only gh_get_pr_review_eligibility preflight with that SHA to see which formal review states are currently eligible.

  3. Call the action-specific write for that SHA: gh_approve_pr (optional body) or gh_request_pr_changes (mandatory body) through the server-configured reviewer principal with expected_reviewer_login, or gh_comment_pr_review (mandatory body) through the ordinary principal.

  4. Confirm the structured result's state, commit_sha, and review_id. The tool submits the review with GitHub's commit_id field and rejects a stale head before writing.

  5. If merge is separately authorized, call gh_merge_pr with the same exact head SHA and an explicit merge, squash, or rebase strategy.

  6. Treat the PR as merged only when the result reports merged: true. A successful command may instead report a merge queue or unmet requirements; formal review submission by itself never merges or closes the PR.

Both operations are focused tools with bounded text fields. They start no nested MCP elicitation, inherit no stdin, and return structured readback. Review request bodies are transferred through a temporary JSON input file; merge bodies are supplied on controlled stdin. If a write succeeds but readback fails, the response is marked as partial success and instructs the caller not to retry automatically.

Before an approve or request_changes write, the server compares the server-configured reviewer login against the PR author. GitHub documents that PR authors cannot approve their own pull requests, so an exact match is rejected before the POST with an explicit no review was attempted error. gh_comment_pr_review remains available to the author. GitHub's public review documentation does not explicitly state the equivalent author rule for request_changes, so the server does not invent one: GitHub remains authoritative.

When GitHub rejects any review write, including HTTP 422 validation failures, the client now preserves a bounded, sanitized JSON error summary containing GitHub's message, errors, documentation_url, and status. Request values and arbitrary response fields are excluded. A failed POST remains a direct tool error—there is no readback and no partial-success result because GitHub did not create a review. Do not retry it automatically; correct the reported validation or use comment when the authenticated account is the PR author.

gh_merge_pr deliberately exposes no administrator bypass, branch deletion, or automatic-merge switch. It passes GitHub CLI's --match-head-commit guard so a force-push or new commit cannot silently change the authorized merge target. GitHub permissions and branch protection still apply, and an author generally cannot approve their own pull request.

Read-only CI diagnosis

Use the focused CI tools instead of inferring a failure from run metadata:

  1. Call gh_get_pr and record the exact PR head_sha.

  2. Call gh_get_pr_checks. Its result includes the same base/head SHA pair and categorized pass, fail, pending, skipping, or cancel checks. Failed and pending checks are returned as data even though gh pr checks uses nonzero status codes for those states.

  3. Use the check link or gh_list_runs to identify the positive integer run ID.

  4. Call gh_list_run_jobs, optionally with an exact attempt number, to retrieve one page of jobs and their step status/conclusion metadata.

  5. For failed-step-only evidence, call gh_get_failed_run_logs for the same attempt. For successful or complete job/run evidence, call gh_get_job_logs or gh_get_run_logs with an explicit attempt and inspect the returned exact identity.

  6. Before claiming log evidence is complete, inspect truncated, bytes_returned, total_bytes, warning, and sha256. Tail and marker selectors intentionally produce incomplete evidence relative to the complete retrieved source log.

All five diagnostic tools are explicitly read-only, idempotent, and open-world. They expose no watch, rerun, cancel, delete, dispatch, browser, generic-command, approval, or elicitation option. Repository identifiers, PR/run/job IDs, attempts, pages, and output sizes are schema constrained. Every gh subprocess remains asynchronous and noninteractive with detached stdin.

gh_get_pr_checks reads and verifies the PR SHA pair around the checks request so a force-push cannot silently mix revisions. Jobs and logs first resolve a concrete run attempt and head SHA, operate on that exact attempt, and verify immutable identity again before returning. Job pages contain at most 100 jobs. Failed logs are bounded by both the request and their deployment setting; general job/run logs use a separate bounded-evidence cap:

MCP_GH_MAX_FAILED_RUN_LOG_BYTES=500000
MCP_GH_MAX_ACTION_LOG_BYTES=500000

Both deployment settings are capped at 1,000,000 UTF-8 bytes. Empty log output is valid. Authentication, retention expiry, missing logs, or malformed output are returned as ordinary tool errors; the namespace remains available for subsequent reads. gh_get_job_logs and gh_get_run_logs use only literal tail/marker selectors; no regex or generic shell filtering is exposed. See docs/gh_action_logs.md for the complete selection, byte-accounting, and digest contract.

Write-command policy

Write execution is off by default:

MCP_GH_ALLOW_WRITE_COMMANDS=false

To enable writes:

MCP_GH_ALLOW_WRITE_COMMANDS=true

Write tools do not initiate nested MCP elicitation. A compatible MCP host is responsible for presenting any user-facing action approval. The ChatGPT Plus custom-plugin gateway may reject write tools instead of offering approval. The server independently enforces the write-enable flag, optional repository policy, and high-risk operation switches before starting gh.

Limit enabled writes to explicit repositories or owners:

MCP_GH_ALLOWED_REPOSITORIES=fvanevski/project-a,fvanevski/project-b
MCP_GH_ALLOWED_OWNERS=fvanevski

When either allowlist is non-empty, a target is accepted if its exact owner/repo or its owner is listed. Fine-grained GitHub token permissions remain the primary GitHub-side authorization boundary.

Repository creation and workflow dispatch have an additional exact target policy. The corresponding allowlist must be non-empty when the fine gate is enabled; a target mismatch fails before the mutation request. Repository creation targets are prospective canonical repository identities and therefore do not require an owner-wide allowlist:

# Exact repositories that may be created. Prospective repositories may be listed in
# MCP_GH_ALLOWED_REPOSITORIES as exact owner/repo entries without granting owner-wide writes.
MCP_GH_ALLOWED_REPO_CREATION_TARGETS=fvanevski/new-project

# Exact workflow targets. WORKFLOW is either a positive numeric ID or an exact,
# case-sensitive canonical workflow path.
MCP_GH_ALLOWED_WORKFLOW_DISPATCH_TARGETS=fvanevski/project-a@12345678,fvanevski/project-b@.github/workflows/Release.yml

For a workflow path, the public write schema accepts only canonical .github/workflows/<file>.yml or .yaml values. The server first applies the local repository/fine-gate/target policy to the caller-supplied selector. If the selector is a path, it then performs a read-only workflow lookup, requires GitHub to return that same path with exact case, and converts it to GitHub's positive numeric workflow ID. Duplicate detection, exact-ref checks, dispatch, reservation state, and authoritative run readback continue to use that numeric identity. A path mismatch or resolution failure is fail-closed and never authorizes a different workflow.

Repository creation, release creation, workflow dispatch, repository-content commits, and PR merging require separate opt-in because they can have broader effects:

MCP_GH_ALLOW_REPO_CREATION=true
MCP_GH_ALLOW_RELEASE_CREATION=true
MCP_GH_ALLOW_WORKFLOW_DISPATCH=true
MCP_GH_ALLOW_CONTENT_COMMITS=true
MCP_GH_ALLOW_PR_MERGE=true

Enable only the operations the deployment actually needs; all five default to false. The exact repository-creation and workflow-dispatch target lists also default to empty, so those two operations remain denied even if their fine gate is accidentally enabled without a target policy.

Exact-SHA branch creation

The two branch tools intentionally have different contracts:

  • gh_create_branch delegates to gh issue develop. Its optional base is an existing branch name, because GitHub CLI resolves that field as a branch. The tool rejects a 40-character commit SHA before starting gh and directs the caller to the exact-SHA primitive.

  • gh_create_branch_from_sha accepts no issue number or moving base name. It requires an exact 40-character base_sha, verifies that exact commit in the target repository, and creates only refs/heads/<name> through GitHub's Git refs API.

Use gh_create_branch_from_sha whenever the base is an immutable reviewed commit. The operation is additive: it never force-updates, moves, overwrites, or deletes an existing ref. If GitHub rejects or interrupts the create response, the tool reads the requested branch. A branch already at the requested SHA is returned as a safe no-write result; a branch at any other SHA is an error and remains unchanged. An unexpected successful response produces an explicit partial-success warning telling the caller to read the branch and not retry automatically.

Both tools use the ordinary server write gate, repository/owner allowlists, and the branch_create operation policy. Their schemas contain canonical repository bounds, positive issue-number constraints where applicable, bounded branch names, and an exact SHA pattern. They are classified as additive external writes and contain no generic command input, nested MCP elicitation, interactive stdin, force option, ref update, or issue-content mutation. Host approval remains the only interactive approval layer.

Repository content writes

gh_commit_files accepts complete UTF-8 file contents, validates repository-relative paths, and creates all supplied files in one Git tree and one commit. It conditionally advances the named branch only if it still points to expected_head_sha; the update uses GitHub's atomic updateRefs mutation with beforeOid and never forces a ref. The operation does not support file deletion.

gh_patch_files is the narrow existing-file edit primitive. Every requested old_text must occur exactly once in the target file's immutable original blob snapshot. All edits for a file are resolved against that same original snapshot, so later edits cannot match text introduced by earlier edits; overlapping source spans fail closed. The tool rejects missing or non-unique context, stale or moved branch heads, symlinks and unsupported Git modes, binary/NUL content, and non-UTF-8 targets before creating content Git objects. It cannot create, delete, or rename files and preserves supported regular/executable modes. After all patch files have been materialized, it rechecks the branch head and delegates the one-commit/one-CAS mutation and bounded exact-ref reconciliation to the same canonical content_commit_service.py path used by gh_commit_files.

Bound both content-write request families with:

MCP_GH_MAX_COMMIT_FILES=100
MCP_GH_MAX_FILE_BYTES=1000000
MCP_GH_MAX_COMMIT_BYTES=5000000

If the final ref-update response is interrupted, the content-write service reads the branch before reporting the outcome. An indeterminate result explicitly requires a fresh read and must not be retried automatically. See docs/gh_patch_files.md for the focused patch-write contract and regressions.

Operational limits

  • Search tools use GitHub's gh search subcommands with --json output.

  • Search tools obtain count evidence from one matching bounded Search REST read. Structurally valid incomplete_results=true evidence or a later count below already-returned items does not discard those items: total_count is reconciled to at least the returned-item count and truncated=true. Malformed count evidence still fails closed. See docs/search-read-contract.md.

  • gh_list_issues(labels=...) passes its comma-separated filter through the supported singular gh issue list --label option; it never emits the unsupported --labels spelling.

  • Results are bounded by MCP_GH_DEFAULT_MAX_RESULTS (default: 30) and capped at MCP_GH_HARD_MAX_RESULTS (default: 100).

  • All output is JSON-safe: Decimal → string, bytesbase64: prefix, datetimes → ISO 8601, infinities → string.

  • Logs are sent to stderr so stdio protocol output is not corrupted.

  • Every gh process is noninteractive, receives either closed or explicitly supplied stdin, and runs with prompting, pagers, Git credential prompts, spinners, color, and update notices disabled.

  • User-authored bodies and notes are supplied through stdin rather than command arguments. Debug command logs redact titles and other free-form values.

  • Commands run asynchronously, are terminated with their process group on timeout or cancellation, and default to MCP_GH_COMMAND_TIMEOUT_SECONDS=30.

  • Write results distinguish write completion from structured readback. A partial-success warning explicitly instructs callers to verify before retrying.

  • Streamable HTTP binds to 127.0.0.1 by default and uses MCP's localhost DNS-rebinding protection.

  • MCP_GH_LOG_LEVEL (default: INFO) controls logging verbosity; set to DEBUG for detailed command logs.

Validation

Pyrefly is the sole Python static type-check authority for CI/review and release decisions. requirements-typecheck.txt pins the checker independently from the runtime/dev lock, and [tool.pyrefly] in pyproject.toml defines project scope. Mypy may remain installed for historical developer use but is not a validation substitute.

uv run pytest tests/test_release_gate_0_9_0.py
uv run ruff check .
uv run ruff format --check .
uv run --with-requirements requirements-typecheck.txt pyrefly check
uv run pytest
git diff --check

For PR review, changed Python tests must also be passed explicitly to the changed-scope pyrefly check <paths...> invocation even though the no-argument project scope excludes the historical test corpus.

The 0.9.0 release passes only when package/server/tool-schema/lock versions, the exact 64/43/21 executable inventory, schema snapshots, canonical registration invariants, compatibility-path absence, focused negative/fail-closed regressions, static checks, and the full test suite agree on the same exact candidate SHA. Any source change invalidates affected validation and requires rerunning it.

Historical 0.7.0, 0.7.1, 0.8.0, and 0.8.1 release mappings remain under docs/; current release authority is docs/release_gate_0_9_0.md and tests/test_release_gate_0_9_0.py.

Known boundaries

  • The server runs gh as a subprocess, including allowlisted REST and GraphQL calls inside focused tools; it does not expose a generic command or API executor. Rate limits, authentication, and permission scoping are governed by the gh CLI and the token in GITHUB_TOKEN.

  • gh_patch_files is deliberately text-only and existing-file-only; create/delete/rename, binary edits, symlink edits, and mode changes remain outside that public primitive.

  • Commands like gh release create that require file uploads or complex multi-step flows are intentionally out of scope — they would need a dedicated maintenance tool.

  • The gh CLI must be installed and available on PATH.

Available Tools

61 tools
gh_approve_prApprove pull request at exact headA

Additive write: submit exactly one formal GitHub APPROVED review for the supplied exact pull-request head through the server-configured independent reviewer principal. Before the review POST the server verifies repository write policy, current head, expected reviewer login, authenticated reviewer login, and reviewer != PR author. The caller cannot select credentials. The write is attempted once and immutable review-ID readback verifies APPROVED state, actor, head, and body. It never comments as a fallback, merges, dismisses reviews, or retries an ambiguous mutation automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoOptional Markdown body for the APPROVED review.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
numberYesPull request number to approve.
expected_head_shaYesExact pull-request head SHA that was independently reviewed.
expected_reviewer_loginYesExact reviewer actor login expected from the server-configured reviewer principal. This is a compare-only precondition and never selects credentials.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
bodyYes
stateYes
actionNo
authorNo
numberYes
messageYes
warningNo
review_idYes
commit_shaYes
request_idNo
submitted_atNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even with annotations present, the description adds substantial behavioral context: it is additive, caller cannot select credentials, the server verifies multiple preconditions, the write is attempted once, and an immutable review-ID readback verifies APPROVED state, actor, head, and body. It also explicitly rules out fallback comments, merges, dismissals, and ambiguous retries.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence adds necessary behavioral or safety information. It is front-loaded with the core action and then systematically covers preconditions, credential handling, verification, and non-behaviors without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write operation with moderate complexity, the description covers purpose, preconditions, side effects, failure semantics, actor constraints, and verification. With an output schema available and rich annotations, no significant contextual gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% parameter coverage with clear descriptions, so the baseline applies. The description reinforces the meaning of expected_head_sha and expected_reviewer_login, but it does not add significant parameter-specific meaning beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: submit exactly one formal GitHub APPROVED review at a supplied exact pull-request head. It is clearly distinguished from sibling tools by explicitly saying it never comments as a fallback, merges, or dismisses reviews.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes its use case clear by emphasizing approval at an exact head and requiring an expected reviewer login. It also implicitly excludes fallback behaviors such as commenting or merging, but it does not explicitly name alternative tools like gh_request_pr_changes or gh_comment_pr_review.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_comment_pr_reviewComment on pull request as formal review at exact headA

Additive write: submit exactly one formal GitHub COMMENTED review through the ordinary authenticated GitHub principal for the supplied exact PR head. This is the explicit same-author fallback for recording an external or Central disposition; COMMENTED is never reported as GitHub APPROVED. The write is attempted once and immutable review-ID readback verifies actor, state, head, and body. It cannot select reviewer credentials, approve, merge, or retry an ambiguous mutation automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesNon-empty Markdown review body. This may record an external/Central positive disposition, but GitHub state remains COMMENTED, never APPROVED.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
numberYesPull request number on which to record a formal comment review.
expected_head_shaYesExact pull-request head SHA to which the COMMENTED review is bound.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
bodyYes
stateYes
actionNo
authorNo
numberYes
messageYes
warningNo
review_idYes
commit_shaYes
request_idNo
submitted_atNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false), the description adds critical behavioral details: 'Additive write' confirms non-destructiveness, 'attempted once' clarifies no internal retry, and 'immutable review-ID readback verifies actor, state, head, and body' discloses the verification mechanism. It also states limitations such as inability to approve or merge. This provides substantial transparency beyond the minimal annotation signals.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the core action. Every sentence adds value: the first defines what it does, the second specifies the use case and state limitation, the third details behavioral guarantees and exclusions. No redundant phrasing or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (write operation with verification and constraints) and the presence of an output schema, the description covers all essential aspects: the operation, the one-time attempt, verification, and explicit non-capabilities. It is complete enough for an agent to select and invoke correctly without needing additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are already well-documented. The description reinforces the binding to 'exact PR head' and mentions that body is verified in readback, but adds no new parameter-level meaning beyond what the schema already provides. Baseline 3 is appropriate when the schema carries full semantic weight.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'submit exactly one formal GitHub COMMENTED review' for the 'supplied exact PR head'. It distinguishes itself from siblings by explicitly noting it 'cannot approve' and that 'COMMENTED is never reported as GitHub APPROVED', which differentiates it from gh_approve_pr and gh_request_pr_changes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: 'explicit same-author fallback for recording an external or Central disposition'. It also states exclusions: 'cannot select reviewer credentials, approve, merge, or retry an ambiguous mutation automatically', which implies when not to use. However, it does not explicitly name alternative tools, relying on sibling context for such inferences.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_commit_filesCommit repository files atomicallyA
Destructive

Destructive write: create or replace bounded UTF-8 file contents in one Git commit and conditionally advance exactly one existing branch only when its head matches expected_head_sha. Ordinary write authorization and the content-commit fine gate are required. The branch advance uses one exact compare-and-swap attempt followed by authoritative ref readback; it cannot delete files, force-update the ref, or blindly retry an ambiguous update.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesGitHub repository name without the owner prefix.
filesYesComplete UTF-8 file replacements for the atomic commit.
ownerYesGitHub repository owner or organization login.
branchYesExisting branch to advance conditionally.
commit_messageYesGit commit message.
expected_head_shaYesExact branch head SHA required before the write.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
branchYes
messageYes
warningNo
tree_shaNo
commit_shaNo
request_idNo
ref_updatedNo
files_committedNo
write_completedYes
observed_head_shaNo
previous_head_shaYes
readback_attemptsNo
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations (destructiveHint=true) by detailing the compare-and-swap mechanism, the inability to delete files or force-update, and the single retry policy. It also clarifies authorization requirements and the 'content-commit fine gate', providing rich behavioral context not available in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the 'Destructive write' warning, and no wasted words. Every clause adds meaningful constraint or behavior, making it highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive write tool with an output schema and strong annotations, this description covers essential behavioral aspects: atomicity, conditional branch advance, auth requirements, and limitations (no delete, no force-update, no ambiguous retries). It is complete enough for an agent to invoke safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with descriptive text for every parameter. The description adds no new parameter-specific semantics; it only restates the conditional advance using expected_head_sha, which is already in the schema. Given high schema coverage, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('create or replace'), resource ('repository files'), and precise behavior ('in one Git commit and conditionally advance exactly one existing branch only when its head matches expected_head_sha'). It clearly distinguishes from sibling write tools like gh_create_branch or gh_merge_pr by emphasizing atomicity and conditional branch advance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage via its destructive-write warning and conditional advance, but it does not explicitly state when to use this tool versus alternatives (e.g., creating a PR, creating a branch). No exclusions or alternative tool names are mentioned, so guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_compare_commitsCompare exact Git commitsA
Read-onlyIdempotent

Read-only: compare two exact 40-character commit SHAs without branch or tag resolution. Returns explicit merge-base/status evidence plus independently bounded commit and changed-file metadata with completeness and SHA-256 fingerprints.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
base_shaYesExact 40-character hexadecimal base commit SHA.
head_shaYesExact 40-character hexadecimal head commit SHA.
max_filesNoMaximum changed-file metadata records to return. Defaults to the server result limit; the implementation retains a strict bound below GitHub's 300-file upstream saturation point so incompleteness is never ambiguous.
max_commitsNoMaximum commit records to return. Defaults to the server result limit and cannot exceed GitHub's 100-commit comparison page limit.

Output Schema

ParametersJSON Schema
NameRequiredDescription
filesYes
sha256Yes
statusNo
commitsYes
warningNo
ahead_byNo
base_shaYes
head_shaYes
behind_byNo
truncatedYes
base_foundYes
head_foundYes
total_commitsNo
files_evidenceYes
merge_base_shaNo
commits_evidenceYes
evidence_completeYes
comparison_availableYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds substantial behavioral context: it explains the output includes 'explicit merge-base/status evidence,' 'independently bounded commit and changed-file metadata with completeness and SHA-256 fingerprints,' and mentions the '40-character' constraint. These details go well beyond the annotations, revealing the tool's thoroughness and data integrity guarantees.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences, front-loaded with 'Read-only' and immediately states the core action. Every phrase adds value — no repetition or filler. It efficiently conveys scope, constraints, and output characteristics without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool complexity (6 params, output schema present, rich annotations), the description is sufficiently complete. It covers the action, constraints, and output nature, and the output schema handles return-value specifics. No gaps are apparent; the description complements the structured data effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% — all six parameters have descriptions. The description does not add meaning beyond the schema; it mentions the exact-SHA constraint (already in schema patterns) and 'independently bounded' metadata (reflected in max_files and max_commits descriptions). Since the schema fully documents parameters, the description provides no additional parameter-level insight, matching the baseline for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'compare[s] two exact 40-character commit SHAs without branch or tag resolution' — a specific verb and resource. It distinguishes from sibling tools like gh_get_commit (single commit) and gh_get_pr_diff (PR-based) by emphasizing exact SHAs and the explicit merge-base/status evidence it returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for exact commit comparison and explicitly notes 'without branch or tag resolution,' which hints at when to use it over branch-based comparisons. However, it does not explicitly contrast with alternatives or state when not to use it, so guidance is only inferred rather than articulated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_create_branchCreate issue development branchA

Additive write: create exactly one branch linked to the specified issue after ordinary write authorization. The requested or default branch-name base is resolved to an exact commit and rechecked immediately before one mutation. Authoritative bounded readback verifies the exact issue association, branch ref, and target SHA. Full commit SHAs in base are rejected; use gh_create_branch_from_sha for a caller-supplied immutable base. The operation never moves or deletes refs and never blindly retries an ambiguous mutation.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoExisting branch-name base resolved to an exact commit immediately before creation; full commit SHAs are rejected.
nameYesNew development branch name.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
issue_numberYesPositive issue number to link to the new development branch.

Output Schema

ParametersJSON Schema
NameRequiredDescription
refYes
nameYes
createdYes
messageYes
warningNo
base_shaYes
request_idNo
write_completedYes
linked_branch_idNo
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral detail beyond the annotations: it is additive, never moves or deletes refs, performs an authoritative bounded readback, and never blindly retries an ambiguous mutation. This complements the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, safety model, verification behavior, and the key alternative are all covered in four sentences with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write operation with concurrency and safety considerations, the description covers purpose, authorization, base resolution, verification, and exclusions. The presence of an output schema means return-value details are not required in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics for the base parameter by explaining that branch-name bases are resolved to an exact commit and full SHAs are rejected, and it clarifies the issue linkage requirement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Additive write: create exactly one branch linked to the specified issue,' which names a specific verb, resource, and scope. It also explicitly distinguishes itself from the sibling gh_create_branch_from_sha by rejecting full commit SHAs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: it is for creating a branch linked to an issue after ordinary write authorization. It also explicitly names the alternative tool for caller-supplied immutable bases: 'use gh_create_branch_from_sha for a caller-supplied immutable base.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_create_branch_from_shaCreate branch from exact commitA

Additive write: create exactly one new branch at an exact 40-character commit SHA after ordinary write authorization. A branch already at the requested SHA is a safe no-write result; a conflicting existing branch is left unchanged. One mutation attempt is followed by authoritative exact-ref readback; the operation never force-updates, moves, overwrites, deletes, or blindly retries an ambiguous ref creation.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew branch name.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
base_shaYesExact commit SHA at which to create the new branch.

Output Schema

ParametersJSON Schema
NameRequiredDescription
refYes
nameYes
createdYes
messageYes
warningNo
base_shaYes
request_idNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and destructiveHint=false, but the description adds critical behavioral details: it is additive, never force-updates or overwrites, handles pre-existing branch cases safely (no-write if same SHA, leaves conflicts unchanged), and performs an exact-ref readback after mutation. This significantly extends beyond the annotations, revealing side effects and safety guarantees.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, information-dense sentence that front-loads the key purpose and then enumerates safety behaviors. Every clause adds essential context without waste. It is concise yet comprehensive, achieving high value per word.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has moderate complexity (4 parameters, 100% schema coverage, output schema exists) and the description covers the key mutation semantics, edge cases, and verification behavior. It does not explain the return value format, but the output schema likely covers that. It could mention permission requirements, but the 'ordinary write authorization' hint is present. Generally complete for the complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% coverage with clear descriptions for each parameter (e.g., 'New branch name', 'GitHub repository name without owner prefix', 'Exact commit SHA'). The description itself does not add new parameter details beyond the schema, but the schema already provides sufficient meaning. Baseline 3 is appropriate as the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the specific verb 'create' and the resource ('exactly one new branch at an exact 40-character commit SHA'), which distinguishes it from the sibling tool 'gh_create_branch' likely used for branches at other refs. It precisely defines the operation scope and behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies the tool is for creating branches at a specific commit SHA, and the sibling 'gh_create_branch' suggests a general branch creation tool. It explains behavior when branch already exists or conflicts, but does not explicitly say 'use this when you need to create a branch at a specific SHA' or contrast with alternatives. Adequate context but no explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_create_commentCreate issue or pull request commentA

Additive write: post exactly one bounded Markdown conversation comment on the specified issue or pull request after ordinary write authorization. The mutation is attempted once through the issue-comments REST endpoint, and authoritative readback of the returned immutable comment ID verifies repository and issue identity plus the requested body. It is not a formal pull-request review and cannot merge.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesMarkdown comment body.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
issue_numberYesIssue or pull request number to comment on.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
messageYes
warningNo
comment_idNo
request_idNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by disclosing that this is an 'additive write' (non-destructive), attempted once through a specific endpoint, and that it readback verifies via the immutable comment ID. It also communicates the lack of merge/review capability. This adds meaningful behavioral context without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured paragraph that front-loads the primary purpose and uses each sentence to add value: action, mechanics, verification, and exclusion. There is no wasted text or repetition of schema annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides enough context for an agent to decide when and how to invoke the tool: it identifies the endpoint, notes the write authorization requirement, explains readback verification, and disambiguates from review/merge operations. It could mention expected side effects or rate limits, but given the output schema and annotations, the description is largely complete for this simple mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description does not add parameter-specific details beyond what the schema already provides; it mentions 'body' and 'Markdown comment' but the schema already describes these. It does not compensate for any coverage gaps since there are none.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Additive write' and uses a specific verb 'post' to state it creates a comment on a specified issue or pull request. It clearly defines the resource (issue/PR), the content (bounded Markdown comment), and the mechanism (issue-comments REST endpoint). It also distinguishes itself from siblings by stating 'It is not a formal pull-request review and cannot merge.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on when to use this tool (to comment on an issue or PR) and explicitly excludes the review/merge capability, guiding an agent away from using it for those purposes. It doesn't explicitly name alternative tools, but the exclusion is enough to differentiate it from related siblings like gh_comment_pr_review or gh_merge_pr.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_create_issueCreate issueA

Additive write: create exactly one issue in the target repository. The ordinary write gate and repository policy must allow the target. Optional labels and assignees are bounded; one mutation attempt is followed by authoritative semantic readback when stable identity is available. The tool never retries an ambiguous mutation automatically and does not edit, close, comment on, or delete an existing issue.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoOptional Markdown issue body.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
titleYesIssue title.
labelsNoOptional labels to apply.
assigneesNoOptional GitHub user logins or the @me selector to assign.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
titleYes
numberYes
messageYes
warningNo
request_idNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond annotations by explaining that it performs an authoritative readback when stable identity is available and that it never retries ambiguous mutations. It also explicitly states it does not edit, close, comment, or delete existing issues, providing full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and structured, with each sentence carrying relevant information about the operation, gates, readback, retry behavior, and scope. No unnecessary fluff is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides complete context about the mutation's behavior, including the readback confirmation, retry policy, and explicit scope limitations. Given that an output schema exists, the lack of return value details is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema descriptions are comprehensive for all parameters, covering owner, repo, title, body, labels, and assignees with constraints. The tool description does not add further parameter-specific meaning, so it stays at the baseline given high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates exactly one issue in a target repository, which is a specific verb-resource pair. It also specifies 'additive write', distinguishing it from edit or delete operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions the requirement of write gate and repository policy, indicating when it's allowed, but it does not explicitly contrast with alternative tools like edit or state change. However, the 'additive write' phrasing implies usage for creation, which is fairly explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_create_labelCreate labelA

Additive write: create exactly one new repository label after ordinary write authorization. Name, color, and description are explicitly bounded; one mutation attempt is followed by authoritative semantic readback. The operation never overwrites an existing label or retries an ambiguous create automatically, and it does not edit issues or delete labels.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew label name.
repoYesGitHub repository name without the owner prefix.
colorYesSix-character hexadecimal label color.
ownerYesGitHub repository owner or organization login.
descriptionNoOptional label description.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
nameYes
colorNo
messageYes
warningNo
request_idNo
descriptionNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that one mutation attempt is followed by authoritative semantic readback, that it never overwrites or retries ambiguous creates, and that it does not edit issues or delete labels. This adds significant behavioral context regarding auth, scope, and post-action verification.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences front-load the core purpose and then concisely add critical behavioral details. Every sentence earns its place; there is no fluff or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool, the description covers auth, non-idempotency, exact scope, post-write readback, and what it avoids. With a full schema and output schema present, the description is complete enough for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with each parameter described. The description adds that name, color, and description are 'explicitly bounded,' which reinforces but does not extend the schema constraints. It does not add new parameter-specific semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('create exactly one new repository label') and clearly distinguishes from siblings by stating it does not edit issues or delete labels. The scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: it is additive, creates one label, and never overwrites an existing label, implying that editing should be done elsewhere. It also notes ordinary write authorization as a prerequisite. It does not explicitly name alternative tools, but the exclusions help an agent decide when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_create_milestoneCreate milestoneA

Additive write: create exactly one repository milestone with bounded title, description, due date, and explicit open/closed state after ordinary write authorization. One mutation attempt is followed by authoritative readback of the stable milestone number and requested fields; ambiguous creation is never retried automatically. It does not assign issues to the milestone or edit existing milestones.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
stateNoInitial milestone state.open
titleYesMilestone title.
due_onNoOptional ISO-8601 milestone due date/time.
descriptionNoOptional milestone description.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
titleYes
numberYes
messageYes
warningNo
request_idNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds valuable behavioral details beyond annotations: it is additive, performs readback of the created milestone, avoids automatic retries on ambiguity, and does not affect issues or existing milestones. This aligns with annotations (non-read-only, non-idempotent, non-destructive) with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the primary action and followed by important clarifications. It is slightly verbose but each sentence conveys essential information without excessive padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations and schema descriptions, the description provides sufficient additional context about operational behavior (readback, no retries, no assignment) to fully understand the tool's scope and edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description mentions title, description, due date, and state, which cover most parameters, but does not explicitly address owner and repo (though these are standard). Bounds are referenced but not specified beyond schema constraints, adding some value without redundancy.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates exactly one repository milestone with specific fields (title, description, due date, state). It also distinguishes from siblings by noting it does not assign issues or edit existing milestones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives implicit usage context ('after ordinary write authorization', 'never retried automatically') and clarifies it does not edit or assign, but does not explicitly name alternative tools or provide a clear 'use this instead of X' directive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_create_prCreate pull requestA

Additive write: create exactly one pull request from the specified bounded head and base selectors after ordinary write authorization. Optional labels, assignees, and review requests are bounded and read back when created. It does not approve, merge, or change another pull request.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseYesBase branch name.
bodyYesMarkdown pull request body.
headYesHead branch or owner:branch selector.
repoYesGitHub repository name without the owner prefix.
draftNo
ownerYesGitHub repository owner or organization login.
titleYesPull request title.
labelsNoOptional labels to apply.
assigneesNoOptional GitHub user logins or the @me selector to assign.
review_usersNoOptional GitHub user logins to request for review.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
titleYes
numberYes
messageYes
warningNo
request_idNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false (write op), destructiveHint=false (non-destructive), and openWorldHint=true. The description adds important behavioral context: it is additive (creates exactly one PR), checks authorization, bounds optional inputs (labels, assignees, review requests), and reads them back when created. It also clarifies it does not approve, merge, or change other PRs, which goes beyond the annotations. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, two sentences, front-loaded with the main purpose and then additional context. It is efficient with no wasted words. Could structure the positive/negative statements slightly more explicitly, but it is well-sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (10 params, mostly described in schema, and an output schema exists), the description covers the essential addition of behavioral boundaries (exactly one PR, bounded inputs, exclusion of other mutations). Since output schema exists, return values need no elaboration. The only minor gap is lack of usage prerequisites (e.g., need for auth, base branch existence), but that is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 90%, so most parameters already have descriptions. The tool description adds a little by mentioning 'bounded head and base selectors' and that optional labels/assignees/review requests are bounded and read back, but it does not add new meaning beyond the schema's existing parameter descriptions. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('create exactly one pull request from the specified bounded head and base selectors') and clearly distinguishes it from sibling tools by specifying it does not approve, merge, or change another pull request. This differentiates it from gh_merge_pr, gh_approve_pr, gh_set_pr_draft_state, and gh_edit_pr.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: when creating a PR, and explicitly states what it does not do (approve, merge, change another PR). However, it does not mention alternatives or any context for when to prefer this over other creation/edit tools. It provides no explicit when-not guidance or conditions like required permissions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_create_release_exactCreate release at exact targetA

Additive write: create one GitHub release using an exact 40-character target commit SHA after ordinary write authorization and the separate release-creation fine gate. The tool verifies target identity, optionally requires the tag and every release state including drafts to be absent, performs exactly one governed creation request, and verifies release, tag commit, and explicit latest state. It never retries an ambiguous release mutation automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoOptional Markdown release notes.
nameNoOptional release display name.
repoYesGitHub repository name without the owner prefix.
draftNo
ownerYesGitHub repository owner or organization login.
tag_nameYesExact Git tag name to create.
prereleaseNo
make_latestYesExplicit latest-release policy for the created release.
expected_tag_absentNo
expected_target_shaYesExact target commit SHA for the release tag.
expected_release_absentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
warningNo
is_draftNo
tag_nameYes
is_latestNo
release_idNo
request_idNo
make_latestYes
release_urlNo
release_nameNo
is_prereleaseNo
tag_commit_shaNo
write_completedYes
readback_completedYes
expected_target_shaYes
resolved_target_shaYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description thoroughly discloses behavioral traits: it is an additive write (not destructive), it verifies target identity, optionally requires absence of tag and releases, performs exactly one governed creation request, verifies release/tag commit/latest state, and never retries ambiguous mutations. This goes beyond the annotations (which already indicate non-read-only, non-idempotent, non-destructive) by explaining the verification and single-attempt behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the core action, and every sentence adds value. It uses three sentences to cover purpose, conditions, and behavioral guarantees without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (11 parameters, multiple verification steps, conditional behavior), the description covers the essential context: what it does, how it handles state (absence checks), single-request guarantee, and verification steps. An output schema exists, but it's not shown here; the description is complete for selecting and invoking correctly. It could include error cases, but the verification steps imply common failure modes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description explains key parameters implicitly: 'exact 40-character target commit SHA' maps to expected_target_sha, 'optionally requires the tag and every release state including drafts to be absent' covers expected_tag_absent and expected_release_absent, and 'explicit latest state' maps to make_latest. However, some parameters like draft, prerelease, body, and name are only defined in the schema, not in the description. Given 64% schema coverage, the description adds meaningful context for the central parameters but not all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'create one GitHub release using an exact 40-character target commit SHA' with specific verification and safeguards. It distinguishes from siblings by the 'exact' target and the explicit verification steps, setting it apart from generic release creation tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: when an exact target commit SHA is required and release/tag absence must be ensured. It doesn't explicitly state alternatives or when-not-to-use, but the 'exact' qualifier and verification details provide clear context. It could be improved by naming an alternative for flexible releases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_create_repoCreate repositoryA

Additive write: create exactly one repository at the canonical OWNER/REPO target after ordinary write policy, exact prospective-repository target policy, and the separate repository-creation fine gate allow it. The mutation is attempted once, then exact authoritative readback verifies repository identity, visibility, description, and initialization when GitHub exposes that evidence. It never retries an ambiguous creation and cannot delete, rename, transfer, or otherwise administer an existing repository.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
privateNo
auto_initNo
descriptionNoOptional repository description.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
repoYes
ownerYes
warningNo
is_privateNo
request_idNo
descriptionNo
initializedNo
name_with_ownerNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations already indicating non-read-only and non-destructive behavior, the description significantly enriches understanding with specific behavioral details: single attempt, authoritative readback verification, no retry on ambiguous creation, and explicit prohibition on delete/rename/transfer. This exceeds annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two dense sentences that efficiently convey purpose, constraints, and verification behavior. It is front-loaded and every clause adds meaning, though the policy language is somewhat convoluted and could be simplified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and annotations, the description covers the essential behavioral context well: additivity, idempotency constraints, readback verification, and non-administrative scope. It does not detail exact prerequisites or error conditions, but the mention of policies/gates provides sufficient context for a write tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 60%, covering owner, repo, and description, while private and auto_init lack descriptions. The tool description indirectly references these fields through readback verification (visibility, description, initialization) but does not explain parameters directly. This meets the baseline for high schema coverage without full compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'create exactly one repository' with a canonical OWNER/REPO target, making the purpose unmistakable. It also distinguishes this from sibling create tools (e.g., gh_create_issue, gh_create_pr, gh_create_release_exact) by focusing on repository creation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context about write policies and gates but does not explicitly state when to use this tool versus alternatives. It implies usage for repository creation but lacks clear exclusions or comparisons with sibling tools, such as when to prefer gh_get_repo for read-only checks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_edit_issueEdit issue metadataA
Destructive

Destructive write: edit metadata on exactly one existing issue after ordinary write authorization. The request may change title, body, labels, assignees, or milestone; one mutation attempt is followed by authoritative semantic readback of the requested fields. Ambiguous mutations are never retried automatically. It does not close or reopen the issue, post comments, delete the issue, or bypass repository policy.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoReplacement Markdown issue body.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
titleNoReplacement issue title.
numberYesIssue number to edit.
milestoneNoMilestone number to set.
labels_addNoLabels to add.
assignees_addNoAssignee logins or the @me selector to add.
labels_removeNoLabels to remove.
assignees_removeNoAssignee logins or the @me selector to remove.
remove_milestoneNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
stateYes
titleYes
numberYes
messageYes
warningNo
request_idNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds significant context: it is a destructive write requiring ordinary authorization, performs a single mutation attempt with semantic readback, never auto-retries ambiguous mutations, and does not circumvent repository policy. This goes well beyond the annotation flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with 'Destructive write', no redundant phrases, and every sentence adds distinct information. The structure is efficient and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter mutation tool, the description covers authorization, scope (one issue), readback verification, retry policy, and exclusions. Output schema covers return values, so omitting them here is appropriate. The description is complete for a complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 91%, so the baseline is 3. The description briefly lists mutable field categories but does not clarify per-parameter semantics such as null handling or interaction between add/remove arrays. This adds little beyond the schema's own parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool edits metadata on exactly one existing issue and enumerates the mutable fields (title, body, labels, assignees, milestone). It distinguishes itself from siblings by explicitly listing what it does not do (close/reopen, post comments, delete), removing ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides when-to-use context ('exactly one existing issue', 'ordinary write authorization') and when-not-to-use exclusions (does not close/reopen, post comments, delete, bypass policy). However, it does not explicitly name alternative tools for these excluded actions, stopping short of full alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_edit_labelEdit labelA
Destructive

Destructive write: edit exactly one existing label's name, color, or description after ordinary write authorization. One mutation attempt is followed by authoritative semantic readback of the resulting label; an ambiguous edit is never retried automatically. It does not delete labels or mutate issue content.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesExisting label name.
repoYesGitHub repository name without the owner prefix.
colorNoReplacement six-character hexadecimal label color.
ownerYesGitHub repository owner or organization login.
new_nameNoReplacement label name.
descriptionNoReplacement label description.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
nameYes
colorNo
messageYes
warningNo
request_idNo
descriptionNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description adds valuable behavioral details: the tool performs an authoritative semantic readback after mutation and never automatically retries ambiguous edits. It also clarifies scope (no deletion, no issue content mutation), going well beyond the annotations and providing critical safety information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the critical 'Destructive write' warning, and every phrase adds value. It efficiently covers the purpose, behavior, and scope without extraneous wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the key aspects: mutation, readback, no-retry, scope, and authorization requirements. With an output schema present, return values are handled externally. Minor gap: it does not mention consequences of partial parameter updates or rate limits, but these are not essential for this tool's completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are already documented. The description mentions the editable fields (name, color, description) but does not add new meaning about parameter interactions, constraints, or defaults beyond what the schema provides. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool edits exactly one existing label's name, color, or description, which is a specific verb+resource+scope. It also differentiates from siblings by explicitly noting it does not delete labels or mutate issue content, distinguishing it from label deletion and issue editing tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (edit an existing label) and clarifies it does not delete labels, but it does not explicitly name alternative tools like gh_create_label. It provides context that this is for edits only and requires write authorization, but lacks explicit 'use instead of' guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_edit_prEdit pull request metadataA
Destructive

Destructive write: edit metadata on exactly one pull request after ordinary write authorization. The request may change title, body, labels, assignees, or base and uses authoritative readback for requested fields. Draft-state transition, formal review, merge, branch deletion, and direct head rewrite are separate or unavailable.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoReplacement base branch name.
bodyNoReplacement Markdown pull request body.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
titleNoReplacement pull request title.
numberYesPull request number to edit.
labels_addNoLabels to add.
assignees_addNoAssignee logins or the @me selector to add.
labels_removeNoLabels to remove.
assignees_removeNoAssignee logins or the @me selector to remove.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
titleYes
numberYes
messageYes
warningNo
request_idNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint=true and readOnlyHint=false; description adds unique context like 'uses authoritative readback' and exclusions. While 'destructive write' repeats annotation, the authorization and readback details provide extra behavioral insight.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, densely packed with scope, exclusions, and auth context. Slightly verbose with terms like 'authoritative readback' but no wasted words; front-loaded with 'Destructive write' to warn.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given high schema coverage and existing annotations, the description adequately covers scope, exclusions, and behavioral expectations. It doesn't discuss response format, but output schema exists, so not needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions on all 10 parameters. The description adds no parameter-specific details beyond listing which fields are editable, so baseline 3 applies – no extra value but no contradiction.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb+resource: 'edit metadata on exactly one pull request' with explicit fields (title, body, labels, assignees, base). Distinguishes from siblings like gh_create_pr, gh_merge_pr, gh_set_pr_draft_state by excluding those operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States 'after ordinary write authorization' and delineates what is not covered (draft-state, review, merge, branch deletion, head rewrite), implicitly guiding selection. Doesn't name specific sibling tools but context from sibling list suffices.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_api_rate_statusGet GitHub API rate statusA
Read-onlyIdempotent

Read-only diagnostic: perform or reuse a locally paced governed GET /rate_limit observation and return GitHub-provided primary rate-limit evidence separately from local request-governor blocking and write-pacing state. Repeated calls inside the configured diagnostic refresh interval are served from a local cache and do not create additional GitHub requests.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
githubYes
governorYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the caching behavior and that it separates GitHub primary rate-limit evidence from local request-governor state, adding useful context beyond the annotations. However, the phrasing 'locally paced governed' is awkward and could be clearer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is reasonably concise and well-structured with two sentences, but the phrase 'locally paced governed' is verbose and confusing, slightly detracting from overall clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides enough context for a simple diagnostic tool, including its purpose, caching, and output separation. It does not mention error cases, but given the tool's simplicity and no parameters, this is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so there is nothing to explain. The description does not need to add parameter details, and the schema fully covers this aspect.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool is a read-only diagnostic for fetching GitHub API rate limit status, and it distinguishes itself from sibling tools by focusing specifically on rate limits and local request-governor state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains its caching behavior and that it does not create additional GitHub requests, but it does not explicitly state when to use this tool versus alternatives. The usage is implied but not directly contrasted with other tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_artifactGet workflow artifact metadataA
Read-onlyIdempotent

Read-only: return metadata for one exact GitHub Actions artifact identifier, including digest, expiry, and workflow-run/head identity. The artifact archive is never downloaded and GitHub is never modified.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
artifact_idYesExact workflow artifact identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
digestNo
expiredYes
created_atYes
expires_atYes
size_in_bytesYes
workflow_run_idYes
workflow_head_shaYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations already declare read-only and non-destructive behavior, the description adds that the artifact archive is never downloaded and that GitHub is never modified. This extra detail clarifies what side effects do not occur, providing behavior beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with front-loaded information: the verb and resource appear first, followed by key details and a safety note. Every phrase adds value; there is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple metadata retrieval tool with complete schema coverage and an output schema, the description is adequate. It explains the tool's purpose, scope, and safety, and does not need to elaborate on return values because the output schema exists. It could mention prerequisites (e.g., authentication) but annotations and context cover the core.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with clear descriptions for owner, repo, and artifact_id. The description adds no new parameter-specific information beyond identifying artifact_id as the exact identifier, which the schema already conveys. The baseline of 3 is appropriate since the schema handles parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns metadata for a single GitHub Actions artifact, specifying the fields (digest, expiry, workflow-run/head identity). It also notes it is read-only and does not download the archive, which distinguishes it from sibling tools like gh_read_artifact_file and gh_list_run_artifacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for metadata retrieval without downloading, contrasting with tools that download artifact files. It does not explicitly name alternative tools or provide when-not-to-use criteria, but the context is clear enough for an agent to infer appropriate scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_commitGet exact Git commitA
Read-onlyIdempotent

Read-only: return immutable identity and commit-object evidence for one exact 40-character commit SHA. The result includes the tree SHA, every parent SHA, author, committer, message, and GitHub's verification/signature metadata without reinterpreting or upgrading that verification state.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
commit_shaYesExact 40-character hexadecimal Git commit SHA.

Output Schema

ParametersJSON Schema
NameRequiredDescription
foundYes
authorNo
messageNo
parentsNo
tree_shaNo
committerNo
commit_shaYes
verificationNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds the nuance that it returns verification/signature metadata 'without reinterpreting or upgrading that verification state,' which is a behavioral disclosure beyond annotations. This adds context about what the tool does not modify. The score reflects good transparency beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with 'Read-only:' and then the core purpose. Every sentence contributes value: defining the scope (exact SHA), what is returned, and the verification-state behavior. There is no redundancy or unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with full schema coverage, safe annotations, and an output schema (which handles return values), the description is complete. It specifies the exact input constraint (40-character SHA), the output components (tree, parents, author, etc.), and the verification behavior. No critical information is missing given the tool's simplicity and existing structured metadata.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage: each parameter (owner, repo, commit_sha) has a clear description. The description adds minimal new parameter semantics—it reiterates the exact SHA requirement and mentions the commit is immutable, but the schema already states this. Since schema coverage is high, a baseline of 3 is appropriate, and the description doesn't meaningfully extend parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'return immutable identity and commit-object evidence for one exact 40-character commit SHA.' It specifies the resource (a commit by exact SHA) and what information is retrieved (tree SHA, parents, author, committer, message, verification metadata). This distinguishes it from sibling tools like gh_list_pr_commits (list) and gh_compare_commits (compare).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: it's for retrieving a single commit by its exact 40-character SHA. While it doesn't explicitly mention alternatives or exclusions, the phrase 'exact 40-character commit SHA' makes it clear this is for a precise, single-commit lookup, not for lists or comparisons. The context is unambiguous, but there is no explicit 'when-not' guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_failed_run_logsRead failed workflow logsA
Read-onlyIdempotent

Read-only: return bounded failed-step log text for one exact GitHub Actions run attempt, with truncation metadata and a SHA-256 fingerprint. This never reruns, cancels, deletes, or dispatches a workflow and never requests input.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
run_idYesPositive workflow run identifier.
attemptNoExact run attempt; omit for the latest attempt.
max_bytesNoMaximum UTF-8 bytes returned, capped by MCP_GH_MAX_FAILED_RUN_LOG_BYTES.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
run_idYes
sha256Yes
statusYes
attemptYes
contentYes
head_shaYes
truncatedYes
conclusionNo
total_bytesYes
bytes_returnedYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explicitly states the tool never reruns, cancels, deletes, or dispatches workflows and never requests input, which goes beyond the annotations. It also discloses bounded output with truncation metadata and fingerprinting, providing meaningful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the read-only nature and core function, with no wasted words. Every clause adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With full schema coverage, meaningful annotations, and an output schema, the description sufficiently completes the picture. It conveys safety, scope, boundedness, and return characteristics without redundancy.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all 5 parameters with full coverage, so the description adds little parameter-specific detail. The mention of 'bounded' and 'exact run attempt' aligns with the max_bytes and attempt parameters but does not explain them beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('return') and resource ('bounded failed-step log text for one exact GitHub Actions run attempt'), clearly distinguishing it from siblings like gh_get_run_logs and gh_get_job_logs. It also includes distinctive scope details such as truncation metadata and SHA-256 fingerprint.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies its use case: retrieving bounded failed-step log text from a specific run attempt. It does not explicitly name alternatives or state when not to use it, but the context is clear enough that an agent can infer appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_file_contentsRead repository fileA
Read-onlyIdempotent

Read-only: fetch the complete contents and blob metadata for one repository file at a branch, tag, or commit ref. This tool never modifies GitHub.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesBranch, tag, or full commit SHA to read without modifying it.
pathYesRepository-relative path of the file to read.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.

Output Schema

ParametersJSON Schema
NameRequiredDescription
refYes
shaYes
pathYes
sizeYes
contentYes
encodingYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds 'complete contents and blob metadata', clarifying the exact data scope, and reinforces safety ('never modifies GitHub'). This adds context beyond the annotations without being redundant.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The most critical information ('Read-only', 'one repository file', 'never modifies GitHub') is front-loaded. Every word serves a purpose, and the structure is scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-file read tool with an output schema and full parameter coverage, the description is complete. It covers the operation, target scope, and safety profile without unnecessary detail. No gaps in context are apparent given the simple use case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3 applies. The description clarifies that 'branch, tag, or commit ref' are valid for the ref parameter, aligning with but not exceeding the schema's parameter descriptions. No additional semantic value beyond the schema is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb 'fetch' + resource 'complete contents and blob metadata for one repository file' + scope 'at a branch, tag, or commit ref'. This clearly differentiates from sibling tools like gh_get_commit or gh_get_repo, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates read-only usage ('Read-only', 'never modifies GitHub') but does not explicitly state when to prefer this tool over alternatives or mention exclusions. Usage is implied through the description but no direct comparison or when-not-to-use is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_issueB
Read-onlyIdempotent

Get details of a specific issue or pull request, including its body.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
bodyNo
stateYes
titleYes
authorNo
labelsNo
numberYes
closedAtNo
commentsNo
createdAtNo
updatedAtNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description does not disclose any behavioral traits beyond the annotations (readOnlyHint, idempotentHint). Since annotations already cover read-only and side-effect-free behavior, the description adds no extra context but does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that conveys the essential purpose without extraneous detail. It is perfectly sized for quick comprehension.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description omits any contextual details such as edge cases, required permissions, or relationships between parameters. While an output schema exists (so return values are not required), the lack of additional context limits the agent's ability to handle unusual scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has three parameters (owner, repo, number) with no descriptions. The description does not explain any of them, leaving the agent to infer their meanings. This is inadequate for correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (get details) and the target (a specific issue or pull request), with emphasis on 'specific' and inclusion of 'body'. This unambiguously conveys the tool's primary function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like gh_get_pr or gh_list_issues. It lacks context about scenarios, prerequisites, or distinguishing use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_job_logsGet exact workflow job logsA
Read-onlyIdempotent

Read-only: stream bounded plaintext log evidence for one exact GitHub Actions job and explicit run attempt. The server verifies exact attempt membership before and after retrieval and never downloads a workflow-run log archive. Supports a UTF-8 byte cap, a literal tail selection, or inclusive literal start/end markers; it exposes no regex, shell, rerun, cancel, delete, or dispatch operation. sha256 fingerprints the complete normalized plaintext source before selection.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
job_idYesPositive workflow job identifier.
attemptYesExact workflow run attempt.
max_bytesNoMaximum returned UTF-8 bytes, capped by server policy.
end_markerNoInclusive literal end marker at or after the selected start.
tail_bytesNoReturn only the final bounded UTF-8 bytes of the source log.
start_markerNoInclusive literal start marker; never treated as a regex.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
textYes
job_idYes
run_idYes
sha256Yes
statusYes
attemptYes
warningNo
head_shaYes
truncatedYes
conclusionNo
total_bytesYes
bytes_returnedYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description is fully transparent: it declares read-only behavior, idempotency (implied by 'read-only' and confirmed by annotations), non-destructive nature, and the fact that it never downloads an archive. It also mentions fingerprinting (sha256) and verification steps, giving insight into internal operations. This aligns perfectly with the annotations (readOnly, idempotent, non-destructive).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet information-dense, covering purpose, constraints, supported options, and exclusions in a compact paragraph. Each sentence adds value (e.g., 'never downloads a workflow-run log archive' clarifies side effects, 'sha256 fingerprints' adds transparency). No superfluous words or redundant details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the extensive sibling tools list, this description clearly distinguishes gh_get_job_logs from related tools like gh_get_run_logs or gh_get_failed_run_logs by emphasizing exact job and attempt, read-only streaming, and no archive download. The presence of an output schema and the tool's focused scope make the description complete for selecting this tool appropriately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 8 parameters have detailed descriptions in the schema (100% coverage), and the tool description adds semantic context for key parameters: start_marker is explicitly 'never treated as a regex', tail_bytes returns 'final bounded UTF-8 bytes', max_bytes is 'capped by server policy', and attempt is 'exact'. This enriches the schema and clarifies parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is extremely specific: it clearly states this tool retrieves logs for a single exact GitHub Actions job and explicit attempt, is read-only, and supports bounded streaming with options like byte caps and markers. It also lists what operations it does not expose (regex, shell, rerun, cancel, delete, dispatch), leaving no ambiguity about its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: it is read-only, streams bounded plaintext logs, never downloads a workflow-run archive, and verifies attempt membership before and after retrieval. It also clarifies that start/end markers are literal, not regex, and that max_bytes is capped by server policy, which helps the agent use it correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_merge_requirementsGet exact-head pull request merge requirementsA
Read-onlyIdempotent

Read-only: aggregate effective branch/ruleset merge policy, current required checks, exact-head review/thread state, base freshness, mergeability, and allowed merge methods for one expected pull-request head. Missing policy visibility or head movement is reported as incomplete evidence and never interpreted as no requirement.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
numberYesPositive pull request number.
expected_head_shaYesExact pull-request head SHA whose merge requirements are requested.

Output Schema

ParametersJSON Schema
NameRequiredDescription
numberYes
warningNo
base_refYes
base_shaYes
mergeableNo
up_to_dateNo
merge_stateNo
review_decisionNo
current_head_shaYes
evidence_sourcesNo
expected_head_shaYes
required_approvalsNo
exact_head_evidenceYes
up_to_date_requiredNo
allowed_merge_methodsNo
head_matches_expectedYes
required_status_checksNo
current_required_checksNo
current_valid_approvalsNo
checks_evidence_completeYes
policy_evidence_completeYes
review_evidence_completeYes
unresolved_review_threadsNo
code_owner_review_requiredNo
last_push_approval_requiredNo
current_valid_approval_countNo
up_to_date_evidence_completeYes
review_requirements_satisfiedNo
allowed_merge_methods_completeYes
conversation_resolution_requiredNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description doesn't need to repeat that. It adds valuable context beyond annotations: 'Missing policy visibility or head movement is reported as incomplete evidence and never interpreted as no requirement.' This clarifies how the tool handles uncertain data, which is not obvious from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense sentence that efficiently enumerates the aggregated components without redundancy. It front-loads the 'Read-only' nature and then lists all policy aspects. Every word earns its place, making it concise yet comprehensive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (aggregating six different aspects) and the existence of an output schema (which likely defines the full response structure), the description covers the key inputs and outputs adequately. It also includes the critical caveat about incomplete evidence handling, making it sufficiently complete for an agent to understand what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% as all parameters have descriptions. The tool description doesn't add additional parameter semantics beyond what the schema already provides. It mentions 'expected pull-request head' but that's a restatement of expected_head_sha's description. The description adds no extra nuance to parameters, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does with specific verbs and resources: 'aggregate effective branch/ruleset merge policy, current required checks, exact-head review/thread state, base freshness, mergeability, and allowed merge methods'. It distinguishes itself from sibling tools like gh_get_pr_checks or gh_get_pr by focusing on a comprehensive merge requirements aggregation for an exact head SHA.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it ('for one expected pull-request head') and includes a critical behavioral caveat about missing policy visibility, which helps the agent decide based on incomplete evidence. However, it doesn't explicitly name alternative tools or state 'use this instead of X', though the sibling context makes the distinction clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_prGet pull request snapshotA
Read-onlyIdempotent

Read-only: return bounded metadata and exact base/head commit SHAs for one GitHub pull request. Performs one noninteractive GET request and cannot create comments, submit reviews, merge the pull request, request approval, or modify GitHub state.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
numberYesPositive pull request number.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
bodyNo
stateYes
titleYes
authorNo
labelsNo
numberYes
isDraftNo
closedAtNo
commentsNo
additionsNo
createdAtNo
deletionsNo
updatedAtNo
baseRefOidYes
headRefOidYes
baseRefNameNo
headRefNameNo
changedFilesNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, but the description adds concrete context: 'one noninteractive GET request' and a clear list of prohibited actions. This goes beyond annotations, addressing what the agent can safely expect. No contradiction found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose. No filler, every word contributes. First sentence states the core functionality, second clarifies boundaries. Highly concise and structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only GET with 3 parameters and an output schema, the description fully covers the behavior. It includes all necessary constraints and emphasizes read-only nature. Given the output schema exists, no return format explanation is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with clear descriptions for each parameter. The description adds no new detail about parameters beyond confirming the PR number reference. Baseline of 3 is appropriate since schema handles the semantics fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: returns bounded metadata and exact base/head commit SHAs for a single pull request. The verb 'return' with specific resources ('metadata', 'SHAs') distinguishes it from siblings like gh_get_pr_diff or gh_get_pr_reviews, which focus on other aspects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for read-only snapshot retrieval and explicitly lists what the tool cannot do (create comments, submit reviews, merge, request approval, modify state). It does not name alternative tools for specific needs (e.g., diff, reviews), but the exclusions provide guidance on when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_pr_checksGet pull request checksA
Read-onlyIdempotent

Read-only: return a bounded structured summary of CI checks for one exact pull-request head revision. This performs no watching, log download, workflow dispatch, approval, or GitHub write.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
numberYesPositive pull request number.
max_checksNoMaximum checks returned, capped by server result policy.
required_onlyNoReturn only checks required by branch protection.

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksYes
numberYes
base_shaYes
head_shaYes
truncatedYes
total_countYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the bar is lower. The description adds value by specifying exclusions (no watching, log download, workflow dispatch, approval, or GitHub write) and emphasizing the 'bounded' and 'structured' nature of the result, which goes beyond the raw annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise, front-loaded sentences deliver the core purpose immediately ('Read-only: return...') and then enumerate exclusions without redundancy. Every word earns its place, matching the efficiency of the top-tier example.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only getter with a rich output schema and complete annotations, the description sufficiently covers the necessary context. It clarifies the exact scope (one PR head revision) and the absence of side effects. A minor gap is the lack of detail about return value structure, but the presence of an output schema mitigates this.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (all parameters have meaningful schema descriptions), so the baseline is 3. The description does not add parameter-specific information beyond what the schema already provides, such as the fact that 'number' is a positive PR number or that max_checks is capped.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('return') and resource ('bounded structured summary of CI checks for one exact pull-request head revision'), precisely conveying the tool's function. It also differentiates from siblings by explicitly listing what it does not do (watching, log download, workflow dispatch, approval), which is useful for disambiguation in the large sibling set.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: for a read-only, scoped summary of CI checks, and explicitly states what it does not perform (no watching, logs, dispatch, approval, writes), which covers when-not-to-use. However, it does not name any specific alternative tool, unlike the high-scoring example that mentions 'use search_calls_extensive instead.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_pr_diffRead pull request diffA
Read-onlyIdempotent

Read-only: return a bounded unified diff or patch for the exact immutable base and head commit SHAs currently identified by a pull request. The result reports truncation, byte counts, and a SHA-256 fingerprint. This tool never checks out code, runs tests, requests approval, or modifies GitHub.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesGitHub repository name.
ownerYesGitHub repository owner.
formatNoUnified diff or email-style patch output.diff
numberYesPull request number.
max_bytesNoMaximum UTF-8 bytes returned, capped by MCP_GH_MAX_PR_DIFF_BYTES. Omit to use the server cap.

Output Schema

ParametersJSON Schema
NameRequiredDescription
formatYes
numberYes
sha256Yes
contentYes
base_shaYes
head_shaYes
truncatedYes
total_bytesYes
bytes_returnedYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, but the description adds significant transparency beyond that by stating it never checks out code, runs tests, requests approval, or modifies GitHub. It also discloses that the result reports truncation and byte counts, and includes a SHA-256 fingerprint, which is useful behavioral detail not captured in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no redundancy. The first sentence front-loads the core function and output characteristics; the second immediately clarifies the read-only nature and non-modification stance. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the moderate complexity (5 parameters, mostly simple), the description explains what the tool returns (bounded diff, truncation info, byte counts, fingerprint), its read-only nature, and its safety guarantees. An output schema exists, so return details are covered. The description is sufficient for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema covers all parameters with descriptions (100% coverage), so the baseline is 3. The description adds minimal parameter-specific nuance (e.g., 'bounded' hints at max_bytes behavior), but it does not elaborate on formats or defaults beyond what the schema already states, so it neither compensates nor degrades.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool returns a bounded unified diff or patch for the exact base and head commit SHAs of a PR, distinguishing it from siblings that list PR metadata, files, or commits. It also specifies that it is read-only and never modifies state, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context by describing exactly what it returns and explicitly listing actions it never performs (checkout, tests, approval, modifications), which helps agents avoid misuse. However, it does not explicitly name alternative tools for cases where a read-only diff is not suitable, so it lacks explicit when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_pr_review_eligibilityGet pull request review eligibilityA
Read-onlyIdempotent

Read-only exact-head preflight: report the pull-request author, ordinary GitHub identity, configured reviewer identity, and whether an independent APPROVED review or ordinary COMMENTED review is currently eligible. This advisory call performs no review write and never mints a reviewer installation token.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
numberYesPositive pull request number.
expected_head_shaYesExact pull-request head SHA whose review eligibility is requested.

Output Schema

ParametersJSON Schema
NameRequiredDescription
numberYes
reasonYes
warningNo
reviewer_kindNo
ordinary_loginNo
reviewer_loginNo
pr_author_loginNo
current_head_shaYes
approval_eligibleYes
expected_head_shaYes
head_matches_expectedYes
comment_review_availableYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and destructiveHint false, but the description adds valuable behavioral context: 'performs no review write and never mints a reviewer installation token.' It also specifies the 'exact-head' constraint and 'advisory' nature, going beyond what annotations convey about token and side-effect behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, with the key phrase 'Read-only exact-head preflight' front-loaded. Every clause adds either functional output details or explicit non-behavior, with no filler or redundant repetition of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity and the presence of an output schema, the description sufficiently covers the return entities (author, identities, eligibility flags) and the key constraints (read-only, no token minting, exact SHA). It explains what to expect and what not to expect, making it complete without needing to detail output schemas or pagination.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description reinforces the importance of expected_head_sha via 'exact-head preflight', but this does not add new parameter-level meaning beyond what the schema already states. Hence, the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb "report" with a clear resource: pull-request review eligibility. It enumerates the exact outputs (author, ordinary GitHub identity, configured reviewer identity, eligibility of APPROVED/COMMENTED reviews), distinguishing it from sibling tools like gh_get_pr_review_state or gh_approve_pr by emphasizing it is a read-only preflight that performs no writes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly frames this as a "preflight" advisory call, implying it should be used before attempting a review write. It does not explicitly name alternative tools (e.g., 'use gh_approve_pr to approve'), but the read-only advisory nature provides strong contextual guidance, so it misses the highest bar only for lacking explicit exclusions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_pr_review_stateGet exact-head pull request review stateA
Read-onlyIdempotent

Read-only: aggregate bounded review, requested-reviewer, and unresolved-thread evidence only for an exact expected PR head. Head mismatch or partial evidence prevents a definitive satisfied result.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
numberYesPositive pull request number.
expected_head_shaYesExact pull-request head SHA whose review state is requested.

Output Schema

ParametersJSON Schema
NameRequiredDescription
numberYes
warningNo
base_shaYes
requested_teamsNo
review_decisionNo
stale_approvalsNo
current_head_shaYes
reviews_evidenceNo
expected_head_shaYes
exact_head_evidenceYes
requested_reviewersNo
requirements_reasonYes
current_head_commentsNo
head_matches_expectedYes
stale_change_requestsNo
current_head_approvalsNo
requirements_satisfiedNo
review_threads_evidenceNo
unresolved_review_threadsNo
current_head_change_requestsNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds valuable context beyond annotations: 'Head mismatch or partial evidence prevents a definitive satisfied result' and 'bounded evidence', clarifying the tool's limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with 'Read-only', efficient and structured. Every word earns its place without repetition or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return details are covered there. The description covers the key behavioral nuance (exact head, partial evidence, definitive result) well enough for a tool of moderate complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions cover all four parameters (100% coverage), and the description's 'expected PR head' aligns with expected_head_sha but adds no extra meaning. Baseline 3 is appropriate given full schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'aggregate' and specific resource: review, requested-reviewer, and unresolved-thread evidence. The qualifier 'only for an exact expected PR head' distinguishes it from generic PR review listing tools like gh_get_pr_reviews or gh_get_pr.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clarifies that this is for 'an exact expected PR head' and warns that head mismatch or partial evidence invalidates a definitive result, implying when it's appropriate to use. It does not explicitly name alternative tools, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_refGet exact Git referenceA
Read-onlyIdempotent

Read-only: resolve one exact branch or tag reference path such as heads/main or tags/v1.0.0. This tool never performs matching-reference or prefix discovery. Annotated tag objects retain their tag-object identity and are peeled through bounded exact tag-object reads to a commit when applicable.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesOne exact Git ref path relative to refs/, formatted as heads/<branch> or tags/<tag>. Do not pass refs/, a bare branch/tag name, or a matching prefix.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.

Output Schema

ParametersJSON Schema
NameRequiredDescription
refYes
foundYes
object_shaNo
object_urlNo
object_typeNo
peeled_commit_shaNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already classify the tool as read-only, idempotent, open-world, and non-destructive; the description adds meaningful behavioral detail beyond those hints by constraining the operation to exact references and explaining annotated tag handling ('peeled through bounded exact tag-object reads'). No contradiction with annotations is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, starts with 'Read-only:', and front-loads the core behavior and concrete examples. The annotated-tag sentence is technical but earns its place by disclosing non-obvious behavior; there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich parameter documentation and existing output schema, the description provides sufficient context for exact reference resolution: what qualifies, what is excluded, and how annotated tags are handled. It could name a direct alternative for non-exact discovery, but the explicit exclusions already cover the main decision boundary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema already documents owner, repo, and ref, including the ref pattern and anti-patterns such as refs/, bare names, and matching prefixes. The top-level description reinforces valid forms but does not meaningfully deepen parameter semantics beyond what the schema already provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb ('resolve') and identifies the resource ('exact branch or tag reference path') with concrete examples. It explicitly rules out matching-reference or prefix discovery, distinguishing this exact lookup from any fuzzy sibling. The title alone is somewhat generic, but the description is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the tool is for one exact branch or tag reference and explicitly negates alternative behavior ('never performs matching-reference or prefix discovery'), making it evident that fuzzy or prefixed lookups belong elsewhere. It does not name a specific sibling tool for non-exact discovery, so it stops short of fully explicit alternative selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_releaseA
Read-onlyIdempotent

Get details of a specific release.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYes
repoYes
ownerYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
nameNo
isDraftNo
tagNameYes
createdAtNo
publishedAtNo
isPrereleaseNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, covering the safety profile. The description does not contradict these annotations but also adds no additional behavioral context beyond what the name and annotations already provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no unnecessary words. It covers the essential purpose without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, with rich annotations and an output schema. The description adequately states the purpose but lacks explicit usage guidance and parameter explanations, making it minimally viable but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for explaining parameters. It only says 'a specific release', which hints that 'tag' identifies the release but does not clarify the roles of 'owner' and 'repo'. The parameter names are self-explanatory, but the description adds minimal value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Get details of a specific release' uses a specific verb ('get'), names the resource ('release'), and distinguishes it from sibling tools like gh_list_releases and gh_create_release_exact by emphasizing specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'a specific release' implies this tool is for retrieving a single release by tag, contrasting with listing tools. However, no explicit alternatives or exclusions are mentioned, leaving usage guidance to be inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_repoB
Read-onlyIdempotent

Get details of a specific repository.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
nameYes
ownerYes
isForkYes
pushedAtNo
createdAtNo
forkCountNo
isPrivateYes
descriptionNo
licenseInfoNo
nameWithOwnerYes
stargazerCountNo
primaryLanguageNo
defaultBranchRefNo

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so safety is covered. However, the description adds no behavioral context beyond what annotations provide, such as error cases, authorization requirements, or output scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler or redundancy. It is maximally concise while conveying the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, has an output schema, and annotations provide safety context, making the brief description adequate for basic use. However, the complete lack of parameter explanation and usage guidance leaves some gaps, though not critical for this straightforward operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not mention or elaborate on the owner and repo parameters. The agent receives no parameter semantics beyond the parameter names themselves, which is inadequate given low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Get details of a specific repository' uses a specific verb and resource, clearly indicating a single-repository read operation. It distinguishes itself from sibling tools like gh_list_repos by emphasizing 'specific' rather than listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No description is given for when to use this tool versus alternatives, and no exclusions or context are provided. The agent is left to infer from the tool name and siblings list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_runA
Read-onlyIdempotent

Get details of a specific GitHub Actions workflow run.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
nameNo
pathNo
eventNo
statusNo
headShaNo
createdAtNo
startedAtNo
updatedAtNo
conclusionNo
databaseIdYes
headBranchNo
displayTitleNo
workflowNameNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior. The description is consistent with these annotations but adds no extra context about side effects, auth, or rate limits, so it meets the baseline for annotated tools.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence with no unnecessary words. It is appropriately sized for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a simple get operation. The annotations cover behavioral aspects, and the description implies the return value (details of the run). No additional context is needed for basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no parameter descriptions, but the names (repo, owner, run_id) are self-explanatory. The description does not add any further meaning to the parameters, so it does not exceed the baseline for self-explanatory names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'GitHub Actions workflow run', specifying it's for a specific run. It distinguishes from sibling tools like gh_list_runs (which lists runs) and gh_get_workflow (which gets workflow details).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide when-to-use guidance or contrast with alternatives. It is a simple functional statement without explicit usage conditions, similar to the mid example which scored 2.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_run_logsGet exact workflow run logsA
Read-onlyIdempotent

Read-only: stream bounded log evidence for one exact GitHub Actions workflow run attempt by enumerating that attempt's jobs and reading their plaintext job-log endpoints in stable job-ID order. The run-log ZIP endpoint is never used. The attempt is mandatory and is never silently replaced by the latest attempt. Supports a UTF-8 byte cap, a literal tail selection, or inclusive literal start/end markers; it exposes no regex, shell, rerun, cancel, delete, or dispatch operation. sha256 fingerprints the complete normalized aggregate before selection.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
run_idYesPositive workflow run identifier.
attemptYesExact workflow run attempt.
max_bytesNoMaximum returned UTF-8 bytes, capped by server policy.
end_markerNoInclusive literal end marker at or after the selected start.
tail_bytesNoReturn only the final bounded UTF-8 bytes of the source log.
start_markerNoInclusive literal start marker; never treated as a regex.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
textYes
run_idYes
sha256Yes
statusYes
attemptYes
warningNo
head_shaYes
truncatedYes
conclusionNo
total_bytesYes
bytes_returnedYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive. The description adds substantial behavioral detail: stable job-ID order, never uses ZIP endpoint, supports byte cap/tail/markers, sha256 fingerprinting, and explicitly excludes mutation/dispatch operations. This goes well beyond annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a dense single paragraph that front-loads the core purpose ('Read-only: stream bounded log evidence...') and every sentence adds value (method, exclusions, selection modes, fingerprinting). No wasted words—exemplary conciseness for a complex tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists and annotations cover safety, the description provides complete context: it explains the enumeration method, stable ordering, selection bounds (byte cap/tail/markers), and explicitly lists unsupported operations. It is sufficient for an agent to understand scope and behavior without ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 8 parameters with descriptions (100% coverage). Description adds minimal extra parameter meaning, though it confirms markers are literal and mentions 'UTF-8 byte cap' aligning with max_bytes. Since schema already does the heavy lifting, a baseline 3 is appropriate; description doesn't significantly extend parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool 'streams bounded log evidence for one exact GitHub Actions workflow run attempt' by enumerating jobs and reading plaintext job-log endpoints. It explicitly differentiates from alternatives by noting the attempt is mandatory and never replaced, and it excludes operations like rerun/cancel/delete, distinguishing it from gh_get_failed_run_logs and gh_get_job_logs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context: read-only, exact attempt, bounded output, and explicitly states what it does not do (no regex, shell, rerun, etc.). It clarifies the attempt is never silently replaced. However, it does not explicitly name alternative tools for different scenarios, leaving the agent to infer from sibling names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_get_workflowA
Read-onlyIdempotent

Get details of a specific GitHub Actions workflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
workflow_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
pathYes
stateYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond what annotations provide—it simply states the operation without any additional details (e.g., return format, authentication requirements, or error conditions). It does not contradict annotations, but it also fails to add value beyond them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no redundant words. It is front-loaded with the primary action and resource. There is no fluff or unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a simple purpose (get details by ID) and an output schema is present, so return format is covered. The description is adequate for an agent to understand the tool's role. However, it could be slightly more complete by noting that workflow_id can be either an internal ID or a file name (as per GitHub API), which is a meaningful nuance. Still, given the simplicity and existing structured data, the description is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does not mention any parameters or explain how owner, repo, and workflow_id are used. While the parameter names are self-explanatory, the description adds no additional meaning, leaving the agent to infer from the schema alone. This is insufficient given the low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Get details of a specific GitHub Actions workflow.' It uses a specific verb (get) and resource (details of a specific workflow), and the word 'specific' distinguishes it from siblings like gh_list_workflows and gh_get_run (which gets run details).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when you have a specific workflow ID and need its details, as opposed to listing workflows. However, it does not explicitly mention alternatives or exclusions, such as 'use gh_list_workflows to list all workflows.' It provides clear context but no explicit guidance on when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_infoA
Read-onlyIdempotent

Return gh CLI version, authentication status, and active account.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety. The description adds the specific outputs returned but does not disclose extra behaviors like authentication requirements or rate limits. It adds some value but not rich context, consistent with the lower bar set by comprehensive annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that precisely conveys the tool's purpose with zero waste. It earns its place entirely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and an output schema present, the description covers the essential scope completely. It does not need to explain return formats since the output schema handles that. For a zero-parameter info tool, this is fully adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so schema coverage is trivially 100%. The description does not need to explain parameters, and per the rubric, zero parameters warrant a baseline of 4. There is nothing more to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it returns three specific pieces of information: gh CLI version, authentication status, and active account. This specific verb+resource combination distinguishes it from sibling tools that focus on repositories, issues, PRs, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly say when to use this tool versus alternatives, but its zero-parameter nature and focus on the gh CLI environment make it obviously for checking setup. Siblings are all domain-specific, so there is no real overlap, but explicit exclusion is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_artifact_filesList workflow artifact filesA
Read-onlyIdempotent

Read-only: inspect one exact, unexpired GitHub Actions artifact ZIP and return one bounded page of normalized regular-file paths and sizes. The archive is downloaded only into temporary server state, never extracted, and is rejected for traversal, absolute paths, duplicate/conflicting paths, symbolic links, special entries, encryption, or configured hard-limit violations. GitHub is never modified.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoOne-based file page.
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
per_pageNoFile paths per page, capped by server policy.
artifact_idYesExact workflow artifact identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
filesYes
warningNo
has_moreYes
per_pageYes
truncatedYes
artifact_idYes
total_countYes
archive_bytesYes
artifact_nameYes
archive_sha256Yes
artifact_digestNo
workflow_run_idYes
workflow_head_shaYes
artifact_expires_atYes
artifact_size_in_bytesYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description thoroughly discloses behavioral traits beyond the annotations: it downloads to temporary server state, never extracts, and rejects traversal, absolute paths, duplicates, symlinks, etc. This adds substantial safety context that the annotations (readOnlyHint, idempotentHint, destructiveHint) do not cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense paragraph that front-loads the core purpose and then efficiently lists safety constraints. Every sentence adds value without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and comprehensive parameter descriptions, the description fully covers the tool's behavior, including pagination, return of normalized paths and sizes, and the read-only nature. It is complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter has a meaningful schema description (e.g., artifact_id as 'Exact workflow artifact identifier'). The tool description itself does not add extra parameter semantics beyond what the schema already provides, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to inspect a specific GitHub Actions artifact ZIP and return a bounded page of normalized file paths and sizes. It explicitly differentiates itself from siblings like gh_get_artifact and gh_read_artifact_file by focusing on listing file metadata without extraction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by specifying it is for reading artifact contents and never modifies GitHub. It does not explicitly name alternatives or state when not to use it, but the bounded page and read-only nature make it clear this is for listing file information. The sibling context provides additional cues.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_issuesA
Read-onlyIdempotent

List issues in a repository.

state: open, closed, or all (default: all). labels: comma-separated label filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
stateNoall
labelsNo
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
queryYes
truncatedYes
total_countNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds minimal behavior context by noting state filtering and comma-separated label filtering, but does not discuss pagination behavior, rate limits, or other side effects beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short and front-loaded with the core purpose. Every sentence adds parameter-relevant value, and there is no filler or unnecessary repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema and strong annotations, the description does not need to explain return values or safety. However, it lacks an explicit mention of pagination/per_page semantics and does not help distinguish this list operation from the multiple related list/search siblings, making the setup marginally adequate for a moderately parameterized tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Since schema description coverage is 0%, the description compensates for some parameters by explaining state allowed values and label format. However, per_page is left undocumented, and owner/repo are only implicitly obvious from the schema titles; overall the description only adds meaningful semantics for two of five parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'List issues in a repository', which is a specific action with a clear resource and repository scope. This immediately distinguishes it from sibling tools like gh_get_issue (single issue) and gh_search_issues (searching across repos).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to choose this tool versus alternatives such as gh_search_issues or gh_get_issue. The description simply lists the tool's function and a couple of filter parameters without explaining the best-fit use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_labelsA
Read-onlyIdempotent

List labels in a repository.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
queryYes
truncatedYes
total_countNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already provide a clear behavioral profile: read-only, idempotent, open-world, and non-destructive. The description adds no extra behavioral detail beyond that, but it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short, focused sentence. It is front-loaded with the action and target, contains no redundancy, and wastes no words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list operation, the description is largely sufficient, especially with annotations and an output schema available. The main remaining gap is explaining per_page and how pagination behaves, but this is a minor omission for such a straightforward tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no descriptive coverage for parameters, so the description carries the burden of explaining parameter meaning. It mentions 'repository' broadly, helping for owner/repo, but it leaves per_page completely unexplained and adds little beyond the parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies a concrete verb and resource: 'List labels in a repository.' This clearly identifies the operation and distinguishes it from other sibling tools like gh_create_label and gh_edit_label, as well as from list operations for issues or milestones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: call this tool when the agent needs to list labels for a repository. However, there is no explicit guidance on when not to use it, and alternative or complementary tools are not mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_milestonesA
Read-onlyIdempotent

List milestones in a repository via the GitHub API.

state: open, closed, or all (default: all).

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
stateNoall
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
queryYes
truncatedYes
total_countNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds no extra behavioral context beyond the state parameter, which is more parameter semantics than behavior. It does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficient—two sentences with no redundancy. It front-loads the core purpose and adds the parameter clarification. It could be slightly more informative without bloat, but it's appropriately sized for the information it contains.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description is adequate but not exhaustive. With an output schema present, return value explanation is unnecessary. However, the lack of pagination behavior and any notes on typical usage patterns makes it feel incomplete for a 4-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains only the 'state' parameter (open/closed/all with default), but omits 'owner', 'repo', and 'per_page'. While owner/repo are self-explanatory, 'per_page' (pagination control) is not described, leaving a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List'), the resource ('milestones'), and the scope ('in a repository'). It effectively distinguishes from sibling tools like gh_list_issues or gh_list_labels by naming the specific resource type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides the basic purpose but offers no explicit guidance on when to use this tool versus alternatives (e.g., gh_create_milestone). It does not mention exclusions or contrasting conditions, leaving usage context mostly implied by the tool name and sibling set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_pr_commitsList pull request commitsA
Read-onlyIdempotent

Read-only: return one bounded page of commits in a pull request, together with its exact base and head SHAs. This tool never checks out code or modifies GitHub.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoOne-based result page.
repoYesGitHub repository name.
ownerYesGitHub repository owner.
numberYesPull request number.
per_pageNoResults per page, capped by server policy.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
numberYes
commitsYes
base_shaYes
has_moreYes
head_shaYes
per_pageYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable context beyond annotations by explicitly stating it never checks out code or modifies GitHub, and clarifies the bounded-page behavior with base/head SHA inclusion. No contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences, front-loaded with the primary purpose and key constraints. Every sentence adds value, and there is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with an output schema, the description adequately covers purpose, safety, and pagination. It could optionally mention ordering (e.g., chronological) but that is a minor gap, and the output schema likely provides return structure details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with each parameter (owner, repo, number, page, per_page) having a clear description. The tool description adds no additional parameter-level context, so it earns the baseline score of 3 without needing to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns one bounded page of commits for a pull request, along with base and head SHAs. This specific verb-resource combination distinguishes it from sibling tools like gh_get_commit (single commit) and gh_compare_commits (comparison).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description communicates that the tool is read-only and returns a bounded page, which implies usage for safely inspecting PR commits without side effects. However, it does not explicitly name alternatives or specify when to use this vs. other listing tools like gh_list_pr_files or gh_get_pr_diff, so guidance is merely implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_pr_filesList pull request filesA
Read-onlyIdempotent

Read-only: return one bounded page of files changed by a pull request, together with its exact base and head SHAs. A file patch may be absent or truncated by GitHub; use gh_get_pr_diff for the bounded unified diff. This tool never modifies GitHub.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoOne-based result page.
repoYesGitHub repository name.
ownerYesGitHub repository owner.
numberYesPull request number.
per_pageNoResults per page, capped by server policy.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
filesYes
numberYes
base_shaYes
has_moreYes
head_shaYes
per_pageYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint/idempotentHint/destructiveHint, but the description adds valuable behavioral context: the page is bounded, patches may be absent/truncated by GitHub, and it never modifies GitHub. This goes beyond the annotations and helps set expectations for response completeness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with 'Read-only' and the core function, then a caveat and pointer to the diff tool. Every sentence earns its place with zero redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and 100% schema parameter coverage, the description provides essential behavioral nuances (pagination bounds, patch truncation, exact SHAs) and a clear sibling alternative. It is fully sufficient for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with descriptions for all parameters, so the baseline is 3. The description reinforces pagination ('bounded page') and page semantics but does not add detailed parameter-level meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a bounded page of files changed by a pull request, with exact base/head SHAs. It distinguishes itself from gh_get_pr_diff by explicitly naming that sibling for the unified diff, and the read-only nature is front-loaded.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to use this tool vs. gh_get_pr_diff: if you need the bounded unified diff, use gh_get_pr_diff. This is clear alternative guidance and excludes the diff use case, making the tool's specific role unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_pr_reviewsList pull request reviewsA
Read-onlyIdempotent

Read-only: return one bounded page of typed pull-request reviews with exact commit provenance and explicit pagination completeness for an unchanged PR head snapshot.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoOne-based review page.
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
numberYesPositive pull request number.
per_pageNoReviews per page, capped by server policy.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
numberYes
reviewsYes
warningNo
base_shaYes
has_moreYes
head_shaYes
per_pageYes
truncatedYes
returned_countYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, idempotentHint), the description adds valuable context about bounded pages, exact commit provenance, pagination completeness, and the unchanged PR head snapshot. This provides significant additional behavioral insight beyond what annotations already convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, information-dense sentence that front-loads 'Read-only' and packs in all key behaviors without redundancy. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (5 parameters, output schema available), the description covers core behavior, pagination semantics, and snapshot consistency. It is complete without needing to explain return values, which the output schema handles.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so the baseline is 3. The description itself does not elaborate on parameters, but the schema already documents each field adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a bounded page of typed pull-request reviews with specific attributes like commit provenance and pagination completeness. It uses specific verbs and resource, effectively distinguishing it from sibling PR-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for retrieving PR review data in a read-only manner, but it does not explicitly mention alternatives or when not to use this tool. No exclusions or comparisons to sibling tools are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_prsB
Read-onlyIdempotent

List pull requests in a repository.

state: open, closed, or all (default: open).

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
stateNoopen
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
queryYes
truncatedYes
total_countNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds the state parameter values and default, which is mild contextual value, but it doesn't mention pagination, ordering, or repository access requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely brief and front-loaded, only two short sentences. It avoids wordiness, though the state line is a fragment. Still, every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema and annotations present, the description doesn't need to detail returns. Missing per_page behavior and pagination guidance, plus the lack of sibling differentiation, leave some gaps but the tool is simple enough to be adequately described at a minimum level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no descriptions at all (0% coverage), so the description's note on state values ('open, closed, or all') adds some meaning. However, owner/repo and per_page are not explained, and their semantics are only inferred from titles and types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'List pull requests in a repository,' which is a specific verb and resource. While it doesn't explicitly distinguish itself from sibling tools like gh_list_issues or gh_get_pr, the resource and action are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives such as gh_get_pr for a single PR, or gh_list_issues for issues. The description provides no exclusions or context beyond the basic action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_releasesA
Read-onlyIdempotent

List releases in a repository.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
queryYes
truncatedYes
total_countNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description is consistent with these (no contradiction). However, it adds no extra behavioral context beyond what the annotations provide, such as pagination behavior or output limits, so it doesn't go above the baseline for a consistent read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence of six words, with no fluff. Every word earns its place, making it highly efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list operation with an output schema and comprehensive annotations, the description is mostly complete. The only minor gap is the lack of mention of pagination (especially relevant given the 'per_page' parameter), but this is not critical for basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the tool description does not explain any parameters. While 'owner' and 'repo' are self-explanatory and 'per_page' is a common pagination parameter, the description adds no value beyond the schema, failing to compensate for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'List releases in a repository' uses a specific verb ('list') and resource ('releases in a repository'), clearly distinguishing it from sibling tools like 'gh_get_release' (singular). The phrasing is unambiguous and directly conveys the tool's function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through the verb 'list' but provides no explicit guidance on when to use this over alternatives, such as 'gh_get_release' for a single release or mention of pagination considerations. The use case is inferred from the tool name and context, not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_reposC
Read-onlyIdempotent

List repositories for a user or organization.

type: all, owner, member, public, private, fork.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoupdated
typeNoall
per_pageNo
usernameNo
directionNodesc

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
queryYes
truncatedYes
total_countNo

TDQS

C2.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint: true, idempotentHint: true, so safety is covered. The description adds no additional behavioral context beyond that, but does not contradict anything. It doesn't reveal much about pagination or response structure, but the project's schema and output schema likely cover some. Given annotations, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the main purpose. However, it could be more structured by explicitly listing parameters or giving a sentence about usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 parameters and 0% schema description coverage, the description is too thin. It does not clarify the meaning of each parameter, nor does it indicate the capabilities like filtering or sorting. Output schema exists but not described, leaving the agent to guess specifics. Needs more detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, meaning the description provides the only semantic info for parameters. The description lists 'type: all, owner, member, public, private, fork.' but does not explain 'sort', 'direction', 'per_page', or 'username' beyond what their names imply. That is insufficient to guide correct use, especially with no enums or descriptions in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the purpose ('List repositories for a user or organization') but does not distinguish from the sibling tools like gh_search_repos or gh_get_repo. The type list is a hint but not sufficient to differentiate clearly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or alternatives are given. It implies listing repos for a user/org, but doesn't mention when this is preferred over gh_search_repos or gh_get_repo. Context is minimal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_run_artifactsList workflow run artifactsA
Read-onlyIdempotent

Read-only: return one bounded page of immutable GitHub Actions artifact metadata for an exact workflow run. Optional name filtering is exact; archives are never downloaded and GitHub is never modified.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoExact artifact name; GitHub must return only literal matches.
pageNoOne-based artifact page.
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
run_idYesExact workflow run identifier.
per_pageNoArtifacts per page, capped by server policy.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
run_idYes
attemptYes
warningNo
has_moreYes
head_shaYes
per_pageYes
artifactsYes
truncatedYes
total_countYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark read-only/idempotent; description reinforces with 'never downloaded' and 'never modified' and clarifies pagination bounds ('one bounded page'). This adds confidence-context for agent planning.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences, front-loaded with 'Read-only', zero filler. Every clause adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only listing with full schema and strong annotations, this description is complete. It covers side effects, pagination, and matching semantics; output schema handles return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema covers all six parameters with descriptions; description offers minimal extra parameter-level detail beyond 'bounded page' and reiteration of exactness. The schema does the heavy lifting, so a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly specifies verb ('read-only return'), resource ('immutable GitHub Actions artifact metadata'), and scope ('for an exact workflow run', 'one bounded page'). Distinguishes from artifact file download and other list tools by emphasizing no download and no modification.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context that this is a safe read operation and that name filtering is exact, but never names alternatives among the many sibling tools. An explicit pointer to e.g. gh_list_artifact_files for files or gh_get_artifact for download would earn a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_run_jobsList workflow run jobsA
Read-onlyIdempotent

Read-only: return one bounded page of jobs and step metadata for an exact GitHub Actions run attempt. This downloads no logs, performs no watching or workflow dispatch, and never modifies GitHub.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoOne-based result page.
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
run_idYesPositive workflow run identifier.
attemptNoExact run attempt; omit for the latest attempt.
per_pageNoJobs per page, capped by server policy.

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobsYes
pageYes
run_idYes
attemptYes
has_moreYes
head_shaYes
per_pageYes
total_countYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds valuable context beyond annotations: 'one bounded page' (pagination behavior), 'exact run attempt' (scope of attempt), and explicit exclusions (logs, watching, dispatch). This enriches the agent's understanding of side effects and limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with 'Read-only,' immediately convey the tool's safety and scope. Every clause adds information without redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paginated list tool with annotations covering safety and an output schema present, the description sufficiently covers key behaviors (bounded page, no logs, exact attempt, non-mutating). It does not need to explain return values because an output schema exists, and it gives the agent enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema covers all parameters with detailed descriptions (e.g., 'Exact run attempt; omit for the latest attempt'), yielding 100% schema coverage. The description does not add parameter-specific meaning beyond what the schema already states, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'return one bounded page of jobs and step metadata' for a specific GitHub Actions run attempt. It identifies the resource (jobs/metadata) and scope (exact attempt), and distinguishes it from siblings like gh_list_runs, gh_watch_run, and gh_get_logs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear when-not guidance: it 'downloads no logs, performs no watching or workflow dispatch, and never modifies GitHub.' This implicitly tells the agent to use alternative tools for those concerns, but it does not explicitly name those alternatives (e.g., gh_get_run_logs, gh_watch_run), so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_runsA
Read-onlyIdempotent

List one authoritative, bounded page of GitHub Actions workflow runs.

Existing branch, status, and per_page callers remain supported. Exact workflow, head-SHA, event, actor, creation-range, and check-suite filters are sent to GitHub's workflow-runs REST route rather than applied locally.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoOne-based result page.
repoYes
actorNo
eventNo
ownerYes
branchNo
statusNo
head_shaNoExact 40-character workflow-run head commit SHA.
per_pageNo
created_toNoInclusive timezone-aware ISO 8601 creation upper bound.
workflow_idNoExact workflow identifier to scope the authoritative route.
created_fromNoInclusive timezone-aware ISO 8601 creation lower bound.
check_suite_idNoExact check-suite identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pageYes
itemsYes
queryYes
warningNo
has_moreYes
per_pageYes
truncatedYes
total_countYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, idempotent, and non-destructive traits. The description adds valuable context about pagination ('bounded page'), backward compatibility, and that filters are applied server-side, which affects result accuracy and performance. This goes beyond the annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences deliver the core purpose and key behavioral notes without fluff. Every clause serves a purpose, and the information is front-loaded. This is exemplary conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's 13 parameters and available output schema, the description covers pagination ('bounded page'), filter behavior (server-side), and backward compatibility, which are critical for correct usage. Minor gaps remain (e.g., default ordering, potential errors), but the provided output schema and annotations fill in much of the remaining context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 46%, and the description does not compensate by elaborating on parameter formats or relationships beyond naming 'exact workflow, head-SHA, event, actor, creation-range, and check-suite filters.' Since half the parameters lack schema descriptions and the description adds minimal parameter-specific insight, it falls short of compensating for the low coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists 'one authoritative, bounded page of GitHub Actions workflow runs,' using a specific verb and resource. It distinguishes itself from siblings by emphasizing server-side filtering and backward compatibility, making its purpose immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context—filters are sent to GitHub's REST route rather than applied locally—which guides when to use this tool (when server-side filtering is desired). However, it does not explicitly name alternative tools or state when NOT to use it, so it lacks direct exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_list_workflowsA
Read-onlyIdempotent

List GitHub Actions workflows in a repository.

state: active, all, disabled, disabled_inactivity, disabled_fork.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
stateNoactive
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
queryYes
truncatedYes
total_countNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as read-only, idempotent, non-destructive, and open-world. The description adds the allowed state filter values, but no further behavioral context such as pagination behavior or response shape is disclosed. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with a clear main sentence followed by a helpful list of state values. Every part adds value, and there is no redundant or filler text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple list operation, rich annotations, and presence of an output schema, the description is largely adequate. It includes the key state filtering options, though it could briefly mention pagination via 'per_page' or clarify that only workflows, not runs, are listed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden. It adds useful semantics by listing valid values for the 'state' parameter, but provides no detail for 'owner', 'repo', or 'per_page' beyond their names and defaults. The parameters are relatively self-explanatory, but coverage is incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List') and the resource ('GitHub Actions workflows in a repository'). It distinguishes this tool from siblings like gh_get_workflow (specific workflow) and gh_list_runs (workflow runs).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool through its 'List GitHub Actions workflows' phrasing, but it does not explicitly mention when to choose this over alternatives or provide exclusions. No alternative tools are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_merge_prMerge pull request at exact headA
Destructive

Destructive write: merge exactly one pull request using the explicit merge strategy only while its head matches expected_head_sha. Ordinary write authorization and the separate PR-merge fine gate are required. The tool cannot use administrator bypass, delete the branch, force a changed revision, or blindly retry an ambiguous merge.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoOptional merge commit body.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
methodYesRepository-supported merge strategy.
numberYesPull request number to merge.
subjectNoOptional merge commit subject.
expected_head_shaYesExact pull-request head SHA authorized for merge.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
stateYes
mergedYes
methodYes
numberYes
messageYes
warningNo
head_shaYes
merged_atNo
request_idNo
merge_queuedNo
write_completedYes
merge_commit_shaNo
auto_merge_enabledNo
merge_state_statusNo
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though annotations already flag destructiveHint and readOnlyHint, the description adds significant context: 'Destructive write' frames the mutating scope, 'Ordinary write authorization and the separate PR-merge fine gate are required' reveals the fine-grained auth prerequisite, and the head-SHA match discloses the concurrency-safety condition. The explicit list of non-behaviors (no admin bypass, no branch deletion, no forced revision, no blind retry) prevents dangerous assumptions. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, each carrying distinct weight: sentence one declares action + conditions, sentence two covers authorization, sentence three enumerates explicit exclusions. It front-loads the critical signal ('Destructive write'), uses a parallel structure for the negatives ('cannot... , delete... , force... , or blindly retry'), and contains zero filler words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-stakes destructive write operation with output schema present, the description is complete: it covers the safety condition (head SHA), the authorization model (write + fine gate), and what the tool explicitly will not do (bypass, force, retry). The schema and output schema cover parameters and return shape, so the description focuses exactly where the risk lies — the happy-path and refusal semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers 100% of parameters with descriptions, setting baseline at 3. The description adds modest value by priming expected_head_sha and method as the central safety and strategy controls — helping the agent understand which parameters matter for authorization vs. layout. However, it never names individual parameters like body, subject, owner, or repo, so the marginal semantic contribution over the schema is limited.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'merge exactly one pull request using the explicit merge strategy only,' combining a specific verb, resource, and the key safety mechanism (head SHA match). It unambiguously differentiates this from all 61 siblings — none of which perform merges — and the constraint 'while its head matches expected_head_sha' captures the tool's unique scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear operational context: it names the required authorization level ('ordinary write authorization'), the special 'PR-merge fine gate,' and lists what the tool cannot do ('cannot use administrator bypass, delete the branch, force a changed revision, or blindly retry'). This effectively communicates when the tool will refuse work, giving the agent strong decision signals. It stops short of naming explicit alternative sibling tools, though the negative-capability list implies when to seek alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_read_artifact_fileRead workflow artifact text fileA
Read-onlyIdempotent

Read-only: retrieve one exact normalized regular-file path from one exact, unexpired GitHub Actions artifact. Only valid UTF-8 text/JSON is returned. Returned content is bounded by max_bytes and the server hard cap, while sha256 fingerprints the complete validated file. The ZIP is temporary and never extracted; GitHub is never modified.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesExact normalized artifact file path using forward slashes.
repoYesCanonical GitHub repository name without path separators.
ownerYesCanonical GitHub repository owner.
max_bytesNoMaximum returned UTF-8 bytes, capped by the server file hard limit.
artifact_idYesExact workflow artifact identifier.

Output Schema

ParametersJSON Schema
NameRequiredDescription
pathYes
sha256Yes
contentYes
warningNo
encodingNo
truncatedYes
artifact_idYes
total_bytesYes
archive_bytesYes
artifact_nameYes
archive_sha256Yes
bytes_returnedYes
artifact_digestNo
workflow_run_idYes
workflow_head_shaYes
artifact_expires_atYes
artifact_size_in_bytesYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and destructiveHint annotations, the description adds meaningful behavioral details: only valid UTF-8 text/JSON is returned, content is bounded by max_bytes and a server cap, sha256 fingerprints the complete file, the ZIP is temporary and never extracted, and GitHub is never modified. This enriches the annotation context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, compact sentence that front-loads the read-only nature and then packs essential constraints (exact path, unexpired artifact, UTF-8, boundaries, hashing, ZIP handling) without redundancy. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description does not need to explain return values. It covers constraints, safety, and behavior thoroughly for a read-only tool. With 100% schema coverage and rich annotations, the description is fully adequate and leaves no major gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All parameters have schema descriptions providing clarity (100% coverage), so the description does not need to add parameter-specific semantics. The description mentions max_bytes and sha256 but these are implied by the schema; the description adds no new parameter-level detail, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves one exact normalized file path from one exact, unexpired GitHub Actions artifact. It uses the specific verb 'retrieve' and distinguishes this from sibling tools like listing or getting artifact metadata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description specifies 'one exact' path and 'unexpired' artifact, making it clear this is for precise reads, not listings. However, it does not explicitly name alternatives (e.g., gh_list_artifact_files) or state when not to use it, so it falls short of a perfect 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_request_pr_changesRequest pull request changes at exact headA

Additive write: submit exactly one formal GitHub CHANGES_REQUESTED review for the supplied exact pull-request head through the server-configured reviewer principal. The exact expected reviewer login is a compare-only precondition and cannot select credentials. The review POST is attempted once and immutable review-ID readback verifies state, actor, head, and body. It cannot approve, merge, dismiss reviews, or replay an ambiguous mutation.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesNon-empty Markdown body explaining the requested changes.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
numberYesPull request number on which to request changes.
expected_head_shaYesExact pull-request head SHA that was independently reviewed.
expected_reviewer_loginYesExact reviewer actor login expected from the server-configured reviewer principal. This is a compare-only precondition and never selects credentials.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
bodyYes
stateYes
actionNo
authorNo
numberYes
messageYes
warningNo
review_idYes
commit_shaYes
request_idNo
submitted_atNo
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the operation is an 'additive write' and mentions preconditions like 'compare-only' and 'immutable readback', which aligns with the annotations (readOnlyHint=false, destructiveHint=false). It could elaborate on potential side effects, but the core write nature is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is excessively verbose and repetitive, using phrases like 'exact' and 'compare-only precondition' multiple times. This redundancy impedes quick comprehension and violates conciseness, despite being structurally presented as a single cohesive paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main action and exclusions but lacks details about return values or error handling. While an output schema exists (so return explanation isn't mandatory), the description could benefit from clarifying expected outcomes or failure modes. It's adequate but not comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All six parameters have detailed descriptions that add meaningful context beyond their names, such as 'expected_reviewer_login' being tied to a 'server-configured reviewer principal'. This enriches the schema's baseline coverage, justifying a score above the default 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it submits a formal GitHub CHANGES_REQUESTED review, which distinguishes it from sibling tools like approve or comment. The phrase 'exactly one' adds specificity, but the verbose wording could be simplified without losing meaning.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides exclusions (cannot approve, merge, dismiss) but does not give positive guidance on when to prefer this tool over alternatives. It lacks explicit scenarios or conditions for use, relying on implicit inference from the exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_run_workflow_exactDispatch workflow at exact refA
Destructive

Destructive write: after ordinary write authorization, exact workflow-target policy, and the separate workflow-dispatch fine gate, dispatch exactly one positive workflow ID only when GitHub immediately re-verifies the caller's exact canonical workflow path and active state. The tool also verifies the exact branch/tag ref against expected_ref_sha, rejects same-name branch/tag ambiguity and an existing workflow_dispatch run for the workflow/head, accepts only a bounded typed input object, requests return_run_details, and binds authoritative readback to the exact returned run ID. It never redispatches automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesExact ref path relative to refs/, as heads/<branch> or tags/<tag>.
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
inputsNoOptional workflow_dispatch input object with at most 25 string entries and at most 65,535 aggregate key/value characters.
workflow_idYesExact positive GitHub workflow ID to dispatch.
expected_ref_shaYesExact commit SHA the ref must resolve to before dispatch.
expected_workflow_pathYesExact canonical case-sensitive workflow path that the numeric workflow ID must identify immediately before dispatch.

Output Schema

ParametersJSON Schema
NameRequiredDescription
refYes
run_idNo
run_urlNo
warningNo
run_eventNo
request_idNo
run_statusNo
workflow_idYes
run_head_shaNo
write_completedYes
expected_ref_shaYes
resolved_ref_shaYes
matching_run_countNo
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already say destructive and non-readonly, but the description goes much further: it discloses active-state verification, expected_ref_sha binding, branch/tag ambiguity rejection, existing-run rejection, bounded input enforcement, request of return_run_details, and no automatic re-dispatch. This is substantial extra behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description front-loads the critical 'Destructive write' warning and wastes no words on filler. However, it is a dense run-on sentence with repeated policy terminology, so slightly more structured formatting could improve scannability without sacrificing the important safety caveats.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and safety-sensitive nature, the description is exceptionally thorough: it covers the exact authorization context, validation checks, duplicate-run rejection, input bounds, and idempotency behavior. Since an output schema exists, the description does not need to enumerate return fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema fully documents each parameter, the description adds meaningful relational constraints: expected_workflow_path must match workflow_id, expected_ref_sha must match ref, inputs must be bounded, and duplicate runs are rejected. This clarifies why the mandatory parameters exist together and how the tool's guarantees are achieved.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the concrete action: 'dispatch exactly one positive workflow ID' at a verified ref, with the word 'exact' repeated throughout to make the tool's specialty unmistakable. It also distinguishes this mutating dispatch tool from the many read-only workflow inspection siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this dangerous action is allowed: after authorization gates, exact-path verification, ref SHA matching, and duplicate-run rejection. It does not explicitly name alternatives or exclusions, but the sibling list contains no other workflow-dispatch tool, so the usage context is reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_search_codeA
Read-onlyIdempotent

Search GitHub source code.

Supports all GitHub code search qualifiers (e.g. 'func name:main language:python').

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
queryYes
truncatedYes
total_countNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey read-only and idempotent behavior. The description adds nothing about expected behavior, errors, or side effects. It is not contradictory, but it does not enhance beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no redundant phrasing. The example is useful without being verbose, and the structure is clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main purpose but lacks details on 'per_page' and does not mention authentication or rate limits. Given the schema richness (only two params), it is incomplete but not severely lacking.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has two parameters (query and per_page) with no descriptions. The description explains 'query' via example but omits any explanation for 'per_page', including its purpose or default value. Thus it only partially covers parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Search GitHub source code' and provides an example with qualifiers, which specifies the resource (code) and action (search). It distinguishes from sibling tools like gh_search_repos and gh_search_issues by explicit reference to 'source code'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates the tool is for code search and mentions qualifiers, but it does not explicitly contrast with other search tools (e.g., repo or issue search). It lacks guidance on when to prefer this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_search_issuesA
Read-onlyIdempotent

Search GitHub issues and pull requests.

Supports all GitHub search qualifiers (e.g. 'is:open label:bug author:user'). Use 'is:pr' for pull requests only, 'is:issue' for issues only.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoupdated
orderNodesc
queryYes
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
queryYes
truncatedYes
total_countNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds that it supports all GitHub search qualifiers, which is useful but not deeply behavioral. It does not mention pagination, rate limits, or result format, but with strong annotations, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose, and includes a concrete example of qualifiers. Every sentence earns its place with no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (4 params, 1 required) and the presence of an output schema, the description is mostly complete. It covers the key usage pattern (search qualifiers) and distinguishes issues vs PRs. It could mention pagination or result limits, but the output schema likely covers return structure, so a 4 is fair.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains the 'query' parameter implicitly by mentioning qualifiers, but does not explain 'sort', 'order', or 'per_page' beyond their schema defaults. The description adds some value for 'query' but leaves the other parameters to schema defaults, which is a gap given 0% coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches GitHub issues and pull requests, with a specific verb ('Search') and resource ('GitHub issues and pull requests'). It distinguishes from siblings like gh_list_issues (which likely lists without search qualifiers) and gh_search_repos/gh_search_code by focusing on issues/PRs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: it supports all GitHub search qualifiers and explicitly mentions 'is:pr' and 'is:issue' for filtering. However, it does not explicitly state when to use this tool versus alternatives like gh_list_issues or gh_search_repos, though the qualifier examples imply the distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_search_reposA
Read-onlyIdempotent

Search GitHub repositories.

Supports all GitHub search qualifiers (e.g. 'language:python stars:>1000'). Use 'is:fork' to exclude forks, 'archived:false' to exclude archived repos.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNostars
orderNodesc
queryYes
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
queryYes
truncatedYes
total_countNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds context about search capabilities without contradicting these annotations, which is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of only two sentences, yet conveys the purpose and key usage examples without unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main purpose and usage sufficiently for a search tool. It does not detail pagination or output format, but these are not critical given the presence of an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description does not explain any of the input parameters beyond giving query examples. It omits clarification for sort, order, and per_page, leaving their meanings to be inferred from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches GitHub repositories, which is a specific and unambiguous action. It distinguishes from sibling tools like gh_get_repo or gh_list_repos by using the verb 'search'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit guidance on using GitHub search qualifiers with examples, and even gives specific tips for excluding forks and archived repos. This is clear when-to-use information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_server_infoGet MCP server versionA
Read-onlyIdempotent

Read-only local diagnostic: return this MCP server's deployed version, tool-schema version, transport, tool count, and write-policy status. This tool does not call GitHub, spawn a subprocess, request approval, or modify any state.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
transportYes
tool_countYes
server_nameNo
server_versionYes
pr_merge_enabledYes
tool_schema_versionYes
repo_creation_enabledYes
write_commands_enabledYes
content_commits_enabledYes
release_creation_enabledYes
workflow_dispatch_enabledYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the readOnlyHint and idempotentHint annotations by explicitly disclosing that it does not call GitHub, spawn a subprocess, request approval, or modify state. This gives the agent strong safety guarantees for a local read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two compact sentences: the first states exactly what the tool returns, the second states what it avoids doing. Every clause earns its place and nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter local diagnostic tool with a useful output schema and strong annotations, this description is complete. It fully conveys purpose, scope, and non-behavior with no ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so there are no parameter details for the description to expand on. The 0-parameter baseline of 4 applies; no additional parameter explanation is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb, 'return,' and identifies the resource as 'this MCP server,' then lists the exact data fields returned: deployed version, tool-schema version, transport, tool count, and write-policy status. It also explicitly labels the tool as a 'local diagnostic' that does not call GitHub, distinguishing it from the GitHub-focused gh_* siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: this is a local server diagnostic, not a GitHub API operation. It does not explicitly name an alternative sibling tool or provide when-not-to-use phrasing, but the statement 'This tool does not call GitHub' strongly implies when this tool is inappropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_set_issue_stateSet issue state with exact preconditionA
Destructive

Destructive write: close or reopen exactly one issue only when its current state matches expected_state. Pull requests are rejected. Closing requires completed, not_planned, or duplicate; reopening requires reopened. The mutation is attempted once, comments remain a separate tool, and authoritative readback verifies the final state and reason.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
numberYesIssue number to transition.
new_stateYesRequested state after the transition.
state_reasonYesReason compatible with the requested issue state.
expected_stateYesExact current issue state required before mutation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
numberYes
warningNo
closed_atNo
new_stateNo
request_idNo
reopened_atNoGitHub updated_at timestamp associated with a verified reopen transition. A confirmed mutation response is preferred; authoritative readback is the fallback because GitHub issue objects expose no dedicated reopened_at field.
state_reasonNo
previous_stateYes
write_completedYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

While annotations already mark destructiveHint=true and readOnlyHint=false, the description adds crucial details: 'exactly one issue' (scope), 'only when current state matches' (precondition), 'Pull requests are rejected' (limitation), 'mutation is attempted once' (retry behavior), and 'authoritative readback verifies the final state' (post-action verification). These exceed annotation coverage and provide behavioral expectations not captured elsewhere.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, each adding distinct information: action+precondition, PR exclusion, reason logic, and post-verification. No filler or repetition. The opening phrase 'Destructive write' immediately signals risk, and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 6 required params and conditional logic, but the description covers the core behavioral contract: state transition, precondition, reason constraints, single attempt, readback verification, and separation from comments. An output schema exists, so return format needn't be described. Rate limits and auth are likely common across tools and not necessary. This is complete for its complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for all parameters, so baseline is 3. The description adds value by mapping state_reason to new_state (closing requires completed/not_planned/duplicate; reopening requires reopened), which the schema only vaguely states as 'compatible'. It also clarifies that number refers to exactly one issue. This supplemental logic improves parameter understanding beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'close or reopen exactly one issue' with a specific precondition (expected_state match). It distinguishes from sibling tools like gh_edit_issue (which edits fields) and gh_create_issue by focusing on state transitions. The phrase 'Pull requests are rejected' further differentiates from PR manipulation tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use only when the issue's current state matches expected_state, and explicitly excludes PRs and comments ('comments remain a separate tool'). It doesn't explicitly name alternatives but implies when to use this over generic edit tools. The precondition and reason restrictions provide strong usage boundaries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_set_pr_draft_stateSet pull request draft state at exact headA
Destructive

Destructive write: transition exactly one pull request between draft and ready-for-review only when its current head SHA and draft state match the supplied preconditions. The operation changes no unrelated pull-request metadata, is attempted once, and authoritative readback verifies both unchanged head identity and the requested draft state.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYesGitHub repository name without the owner prefix.
ownerYesGitHub repository owner or organization login.
numberYesPull request number to transition.
new_is_draftYesRequested draft state after mutation.
expected_head_shaYesExact current pull-request head SHA required before mutation.
expected_is_draftYesExact current draft state required before mutation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
numberYes
warningNo
request_idNo
write_completedYes
current_head_shaNo
current_is_draftNo
previous_head_shaYes
previous_is_draftYes
readback_completedYes
precondition_checkedYes
state_matches_requestedYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it as destructive and non-idempotent, but the description adds critical context: it changes no unrelated metadata, is attempted once, and reads back authoritatively to verify head identity and draft state. This goes beyond the annotation flags and provides a clear safety contract.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences with no filler. The opening 'Destructive write' immediately sets expectations, and every clause adds meaning about scope, preconditions, and verification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity—conditional mutation with 6 required parameters and a destructive action—the description covers the essential aspects: what it does, under what conditions, what it doesn't touch, and how it verifies success. The existence of an output schema means return-value details are not needed in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% parameter coverage, so the baseline is 3. The description adds semantic value by framing expected_head_sha and expected_is_draft as 'preconditions' and new_is_draft as the 'requested state', clarifying how the parameters interact in the mutation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action: 'transition exactly one pull request between draft and ready-for-review' with explicit conditions. It differentiates from siblings like gh_edit_pr by emphasizing the exact-head precondition and the targeted scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when a conditional, precise draft-state transition is needed with preconditions on head SHA and current draft state. It doesn't explicitly name alternatives or exclusions, but the context is clear enough for a capable agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gh_watch_runA
Read-onlyIdempotent

Poll a GitHub Actions workflow run until completion or timeout.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
run_idYes
intervalNo
exit_statusNo
timeout_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
run_idYes
statusNo
messageYes
conclusionNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnly, idempotent) are present and consistent. The description adds context about the polling behavior and the timeout, which is not covered by annotations, enhancing transparency about what the tool does.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that clearly conveys the core functionality without unnecessary detail. It is well-structured and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the basic behavior but omits details about the return value or what happens on timeout vs. completion. Given the tool's simplicity, this is acceptable but not complete; a mention of the returned run status would improve it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only parameter names without descriptions, and the description does not explain any parameters. Since schema coverage is low, the description should compensate, but it does not define 'interval', 'exit_status', or 'timeout_seconds' meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Poll a GitHub Actions workflow run until completion or timeout.' It is specific and distinguishes from sibling tools like gh_get_run by indicating it waits for completion rather than fetching a single snapshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when waiting for a run to finish, but does not explicitly state when to use it over alternatives. It lacks guidance on when not to use it, such as when a simple status check suffices.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 48 tool updatesv0.8.1
    • Addedgh_approve_pr
    • Addedgh_comment_pr_review
    • Addedgh_commit_files
    • Addedgh_compare_commits
    • Changedgh_create_branch27 fields changed
      • changedInput schema / properties / base / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 1024,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / base / description
        Added value: +"Existing branch-name base resolved to an exact commit immediately before creation; full commit SHAs are rejected."
      • addedInput schema / properties / issue_number / description
        Added value: +"Positive issue number to link to the new development branch."
      • addedInput schema / properties / issue_number / minimum
        Added value: +1
      • addedInput schema / properties / name / description
        Added value: +"New development branch name."
      • addedInput schema / properties / name / maxLength
        Added value: +1024
      • addedInput schema / properties / name / minLength
        Added value: +1
      • addedInput schema / properties / owner / description
        Added value: +"GitHub repository owner or organization login."
      • addedInput schema / properties / owner / maxLength
        Added value: +39
      • addedInput schema / properties / owner / minLength
        Added value: +1
      • addedInput schema / properties / owner / pattern
        Added value: +"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$"
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repository name without the owner prefix."
      • addedInput schema / properties / repo / maxLength
        Added value: +100
      • addedInput schema / properties / repo / minLength
        Added value: +1
      • addedInput schema / properties / repo / pattern
        Added value: +"^[A-Za-z0-9_.-]{1,100}$"
      • changedOutput schema / description
        Previous value: -"Result of creating a branch."New value: +"Result of creating and linking one issue development branch."
      • addedOutput schema / properties / base_sha
        Added value: +{
        +  "pattern": "^[0-9a-f]{40}$",
        +  "title": "Base Sha",
        +  "type": "string"
        +}
      • addedOutput schema / properties / created
        Added value: +{
        +  "title": "Created",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / linked_branch_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Linked Branch Id"
        +}
      • addedOutput schema / properties / precondition_checked
        Added value: +{
        +  "title": "Precondition Checked",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / readback_completed
        Added value: +{
        +  "title": "Readback Completed",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / ref
        Added value: +{
        +  "title": "Ref",
        +  "type": "string"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / state_matches_requested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "State Matches Requested"
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warning"
        +}
      • addedOutput schema / properties / write_completed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Write Completed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "name",
        -  "message"
        -]New value: +[
        +  "precondition_checked",
        +  "write_completed",
        +  "readback_completed",
        +  "state_matches_requested",
        +  "name",
        +  "ref",
        +  "base_sha",
        +  "created",
        +  "message"
        +]
    • Addedgh_create_branch_from_sha
    • Changedgh_create_comment21 fields changed
      • addedInput schema / properties / body / description
        Added value: +"Markdown comment body."
      • addedInput schema / properties / body / maxLength
        Added value: +65536
      • addedInput schema / properties / issue_number / description
        Added value: +"Issue or pull request number to comment on."
      • addedInput schema / properties / issue_number / minimum
        Added value: +1
      • addedInput schema / properties / owner / description
        Added value: +"GitHub repository owner or organization login."
      • addedInput schema / properties / owner / maxLength
        Added value: +39
      • addedInput schema / properties / owner / minLength
        Added value: +1
      • addedInput schema / properties / owner / pattern
        Added value: +"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$"
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repository name without the owner prefix."
      • addedInput schema / properties / repo / maxLength
        Added value: +100
      • addedInput schema / properties / repo / minLength
        Added value: +1
      • addedInput schema / properties / repo / pattern
        Added value: +"^[A-Za-z0-9_.-]{1,100}$"
      • changedOutput schema / description
        Previous value: -"Result of creating a comment."New value: +"Authoritative result of creating an issue or pull-request comment."
      • addedOutput schema / properties / comment_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Comment Id"
        +}
      • addedOutput schema / properties / precondition_checked
        Added value: +{
        +  "title": "Precondition Checked",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / readback_completed
        Added value: +{
        +  "title": "Readback Completed",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / state_matches_requested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "State Matches Requested"
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warning"
        +}
      • addedOutput schema / properties / write_completed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Write Completed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "url",
        -  "message"
        -]New value: +[
        +  "precondition_checked",
        +  "write_completed",
        +  "readback_completed",
        +  "state_matches_requested",
        +  "url",
        +  "message"
        +]
    • Changedgh_create_issue27 fields changed
      • changedInput schema / properties / assignees / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 39,
        +      "minLength": 1,
        +      "pattern": "^(?:@me|[A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))$",
        +      "type": "string"
        +    },
        +    "maxItems": 10,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / assignees / description
        Added value: +"Optional GitHub user logins or the @me selector to assign."
      • changedInput schema / properties / body / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 65536,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / body / description
        Added value: +"Optional Markdown issue body."
      • changedInput schema / properties / labels / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 100,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "maxItems": 100,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / labels / description
        Added value: +"Optional labels to apply."
      • addedInput schema / properties / owner / description
        Added value: +"GitHub repository owner or organization login."
      • addedInput schema / properties / owner / maxLength
        Added value: +39
      • addedInput schema / properties / owner / minLength
        Added value: +1
      • addedInput schema / properties / owner / pattern
        Added value: +"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$"
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repository name without the owner prefix."
      • addedInput schema / properties / repo / maxLength
        Added value: +100
      • addedInput schema / properties / repo / minLength
        Added value: +1
      • addedInput schema / properties / repo / pattern
        Added value: +"^[A-Za-z0-9_.-]{1,100}$"
      • addedInput schema / properties / title / description
        Added value: +"Issue title."
      • addedInput schema / properties / title / maxLength
        Added value: +256
      • addedInput schema / properties / title / minLength
        Added value: +1
      • changedOutput schema / description
        Previous value: -"Result of creating an issue."New value: +"Authoritative outcome of one issue creation attempt."
      • addedOutput schema / properties / number / minimum
        Added value: +0
      • addedOutput schema / properties / precondition_checked
        Added value: +{
        +  "title": "Precondition Checked",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / readback_completed
        Added value: +{
        +  "title": "Readback Completed",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / state_matches_requested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "State Matches Requested"
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warning"
        +}
      • addedOutput schema / properties / write_completed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Write Completed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "number",
        -  "title",
        -  "url",
        -  "message"
        -]New value: +[
        +  "precondition_checked",
        +  "write_completed",
        +  "readback_completed",
        +  "state_matches_requested",
        +  "number",
        +  "title",
        +  "url",
        +  "message"
        +]
      • changedOutput schema / title
        Previous value: -"IssueCreate"New value: +"IssueCreateResult"
    • Changedgh_create_label25 fields changed
      • addedInput schema / properties / color / description
        Added value: +"Six-character hexadecimal label color."
      • addedInput schema / properties / color / pattern
        Added value: +"^[0-9A-Fa-f]{6}$"
      • changedInput schema / properties / description / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 65536,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / description / description
        Added value: +"Optional label description."
      • removedInput schema / properties / force
        Removed value: -{
        -  "default": false,
        -  "title": "Force",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / name / description
        Added value: +"New label name."
      • addedInput schema / properties / name / maxLength
        Added value: +100
      • addedInput schema / properties / name / minLength
        Added value: +1
      • addedInput schema / properties / owner / description
        Added value: +"GitHub repository owner or organization login."
      • addedInput schema / properties / owner / maxLength
        Added value: +39
      • addedInput schema / properties / owner / minLength
        Added value: +1
      • addedInput schema / properties / owner / pattern
        Added value: +"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$"
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repository name without the owner prefix."
      • addedInput schema / properties / repo / maxLength
        Added value: +100
      • addedInput schema / properties / repo / minLength
        Added value: +1
      • addedInput schema / properties / repo / pattern
        Added value: +"^[A-Za-z0-9_.-]{1,100}$"
      • changedOutput schema / description
        Previous value: -"Result of creating a label."New value: +"Authoritative outcome of one label creation attempt."
      • addedOutput schema / properties / precondition_checked
        Added value: +{
        +  "title": "Precondition Checked",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / readback_completed
        Added value: +{
        +  "title": "Readback Completed",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / state_matches_requested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "State Matches Requested"
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warning"
        +}
      • addedOutput schema / properties / write_completed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Write Completed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "name",
        -  "url",
        -  "message"
        -]New value: +[
        +  "precondition_checked",
        +  "write_completed",
        +  "readback_completed",
        +  "state_matches_requested",
        +  "name",
        +  "url",
        +  "message"
        +]
      • changedOutput schema / title
        Previous value: -"LabelCreate"New value: +"LabelCreateResult"
    • Changedgh_create_milestone27 fields changed
      • changedInput schema / properties / description / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 65536,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / description / description
        Added value: +"Optional milestone description."
      • changedInput schema / properties / due_on / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 64,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / due_on / description
        Added value: +"Optional ISO-8601 milestone due date/time."
      • addedInput schema / properties / owner / description
        Added value: +"GitHub repository owner or organization login."
      • addedInput schema / properties / owner / maxLength
        Added value: +39
      • addedInput schema / properties / owner / minLength
        Added value: +1
      • addedInput schema / properties / owner / pattern
        Added value: +"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$"
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repository name without the owner prefix."
      • addedInput schema / properties / repo / maxLength
        Added value: +100
      • addedInput schema / properties / repo / minLength
        Added value: +1
      • addedInput schema / properties / repo / pattern
        Added value: +"^[A-Za-z0-9_.-]{1,100}$"
      • addedInput schema / properties / state / description
        Added value: +"Initial milestone state."
      • addedInput schema / properties / state / enum
        Added value: +[
        +  "open",
        +  "closed"
        +]
      • addedInput schema / properties / title / description
        Added value: +"Milestone title."
      • addedInput schema / properties / title / maxLength
        Added value: +256
      • addedInput schema / properties / title / minLength
        Added value: +1
      • changedOutput schema / description
        Previous value: -"Result of creating a milestone."New value: +"Authoritative outcome of one milestone creation attempt."
      • addedOutput schema / properties / number / minimum
        Added value: +0
      • addedOutput schema / properties / precondition_checked
        Added value: +{
        +  "title": "Precondition Checked",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / readback_completed
        Added value: +{
        +  "title": "Readback Completed",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / state_matches_requested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "State Matches Requested"
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warning"
        +}
      • addedOutput schema / properties / write_completed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Write Completed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "number",
        -  "title",
        -  "url",
        -  "message"
        -]New value: +[
        +  "precondition_checked",
        +  "write_completed",
        +  "readback_completed",
        +  "state_matches_requested",
        +  "number",
        +  "title",
        +  "url",
        +  "message"
        +]
      • changedOutput schema / title
        Previous value: -"MilestoneCreate"New value: +"MilestoneCreateResult"
    • Changedgh_create_pr33 fields changed
      • changedInput schema / properties / assignees / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 39,
        +      "minLength": 1,
        +      "pattern": "^(?:@me|[A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))$",
        +      "type": "string"
        +    },
        +    "maxItems": 10,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / assignees / description
        Added value: +"Optional GitHub user logins or the @me selector to assign."
      • addedInput schema / properties / base / description
        Added value: +"Base branch name."
      • addedInput schema / properties / base / maxLength
        Added value: +1024
      • addedInput schema / properties / base / minLength
        Added value: +1
      • addedInput schema / properties / body / description
        Added value: +"Markdown pull request body."
      • addedInput schema / properties / body / maxLength
        Added value: +65536
      • addedInput schema / properties / head / description
        Added value: +"Head branch or owner:branch selector."
      • addedInput schema / properties / head / maxLength
        Added value: +1024
      • addedInput schema / properties / head / minLength
        Added value: +1
      • changedInput schema / properties / labels / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 100,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "maxItems": 100,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / labels / description
        Added value: +"Optional labels to apply."
      • addedInput schema / properties / owner / description
        Added value: +"GitHub repository owner or organization login."
      • addedInput schema / properties / owner / maxLength
        Added value: +39
      • addedInput schema / properties / owner / minLength
        Added value: +1
      • addedInput schema / properties / owner / pattern
        Added value: +"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$"
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repository name without the owner prefix."
      • addedInput schema / properties / repo / maxLength
        Added value: +100
      • addedInput schema / properties / repo / minLength
        Added value: +1
      • addedInput schema / properties / repo / pattern
        Added value: +"^[A-Za-z0-9_.-]{1,100}$"
      • changedInput schema / properties / review_users / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 39,
        +      "minLength": 1,
        +      "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$",
        +      "type": "string"
        +    },
        +    "maxItems": 100,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / review_users / description
        Added value: +"Optional GitHub user logins to request for review."
      • addedInput schema / properties / title / description
        Added value: +"Pull request title."
      • addedInput schema / properties / title / maxLength
        Added value: +256
      • addedInput schema / properties / title / minLength
        Added value: +1
      • changedOutput schema / description
        Previous value: -"Result of creating a pull request."New value: +"Authoritative outcome of one pull-request creation attempt."
      • addedOutput schema / properties / precondition_checked
        Added value: +{
        +  "title": "Precondition Checked",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / readback_completed
        Added value: +{
        +  "title": "Readback Completed",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / state_matches_requested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "State Matches Requested"
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warning"
        +}
      • addedOutput schema / properties / write_completed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Write Completed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "number",
        -  "title",
        -  "url",
        -  "message"
        -]New value: +[
        +  "precondition_checked",
        +  "write_completed",
        +  "readback_completed",
        +  "state_matches_requested",
        +  "number",
        +  "title",
        +  "url",
        +  "message"
        +]
    • Removedgh_create_release
    • Addedgh_create_release_exact
    • Changedgh_create_repo26 fields changed
      • changedInput schema / properties / description / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 65536,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / description / description
        Added value: +"Optional repository description."
      • removedInput schema / properties / name
        Removed value: -{
        -  "title": "Name",
        -  "type": "string"
        -}
      • addedInput schema / properties / owner
        Added value: +{
        +  "description": "GitHub repository owner or organization login.",
        +  "maxLength": 39,
        +  "minLength": 1,
        +  "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$",
        +  "title": "Owner",
        +  "type": "string"
        +}
      • addedInput schema / properties / repo
        Added value: +{
        +  "description": "GitHub repository name without the owner prefix.",
        +  "maxLength": 100,
        +  "minLength": 1,
        +  "pattern": "^[A-Za-z0-9_.-]{1,100}$",
        +  "title": "Repo",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "name"
        -]New value: +[
        +  "owner",
        +  "repo"
        +]
      • changedOutput schema / description
        Previous value: -"Result of creating a repository."New value: +"Authoritative outcome of one exact-target repository creation attempt."
      • addedOutput schema / properties / description
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Description"
        +}
      • addedOutput schema / properties / initialized
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Initialized"
        +}
      • addedOutput schema / properties / is_private
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Is Private"
        +}
      • removedOutput schema / properties / message
        Removed value: -{
        -  "title": "Message",
        -  "type": "string"
        -}
      • removedOutput schema / properties / name
        Removed value: -{
        -  "title": "Name",
        -  "type": "string"
        -}
      • addedOutput schema / properties / name_with_owner
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Name With Owner"
        +}
      • addedOutput schema / properties / owner
        Added value: +{
        +  "maxLength": 39,
        +  "minLength": 1,
        +  "title": "Owner",
        +  "type": "string"
        +}
      • addedOutput schema / properties / precondition_checked
        Added value: +{
        +  "title": "Precondition Checked",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / readback_completed
        Added value: +{
        +  "title": "Readback Completed",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / repo
        Added value: +{
        +  "maxLength": 100,
        +  "minLength": 1,
        +  "title": "Repo",
        +  "type": "string"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / state_matches_requested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "State Matches Requested"
        +}
      • addedOutput schema / properties / url / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / url / default
        Added value: +null
      • removedOutput schema / properties / url / type
        Removed value: -"string"
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warning"
        +}
      • addedOutput schema / properties / write_completed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Write Completed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "name",
        -  "url",
        -  "message"
        -]New value: +[
        +  "precondition_checked",
        +  "write_completed",
        +  "readback_completed",
        +  "state_matches_requested",
        +  "owner",
        +  "repo"
        +]
      • changedOutput schema / title
        Previous value: -"RepoCreate"New value: +"RepositoryCreateResult"
    • Changedgh_edit_issue34 fields changed
      • changedInput schema / properties / assignees_add / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 39,
        +      "minLength": 1,
        +      "pattern": "^(?:@me|[A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))$",
        +      "type": "string"
        +    },
        +    "maxItems": 10,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / assignees_add / description
        Added value: +"Assignee logins or the @me selector to add."
      • changedInput schema / properties / assignees_remove / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 39,
        +      "minLength": 1,
        +      "pattern": "^(?:@me|[A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))$",
        +      "type": "string"
        +    },
        +    "maxItems": 10,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / assignees_remove / description
        Added value: +"Assignee logins or the @me selector to remove."
      • changedInput schema / properties / body / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 65536,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / body / description
        Added value: +"Replacement Markdown issue body."
      • changedInput schema / properties / labels_add / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 100,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "maxItems": 100,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / labels_add / description
        Added value: +"Labels to add."
      • changedInput schema / properties / labels_remove / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 100,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "maxItems": 100,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / labels_remove / description
        Added value: +"Labels to remove."
      • changedInput schema / properties / milestone / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Positive GitHub object number.",
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / milestone / description
        Added value: +"Milestone number to set."
      • addedInput schema / properties / number / description
        Added value: +"Issue number to edit."
      • addedInput schema / properties / number / minimum
        Added value: +1
      • addedInput schema / properties / owner / description
        Added value: +"GitHub repository owner or organization login."
      • addedInput schema / properties / owner / maxLength
        Added value: +39
      • addedInput schema / properties / owner / minLength
        Added value: +1
      • addedInput schema / properties / owner / pattern
        Added value: +"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$"
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repository name without the owner prefix."
      • addedInput schema / properties / repo / maxLength
        Added value: +100
      • addedInput schema / properties / repo / minLength
        Added value: +1
      • addedInput schema / properties / repo / pattern
        Added value: +"^[A-Za-z0-9_.-]{1,100}$"
      • changedInput schema / properties / title / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 256,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / title / description
        Added value: +"Replacement issue title."
      • changedOutput schema / description
        Previous value: -"Result of editing an issue."New value: +"Authoritative outcome of one issue metadata edit attempt."
      • addedOutput schema / properties / number / minimum
        Added value: +1
      • addedOutput schema / properties / precondition_checked
        Added value: +{
        +  "title": "Precondition Checked",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / readback_completed
        Added value: +{
        +  "title": "Readback Completed",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / state_matches_requested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "State Matches Requested"
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warning"
        +}
      • addedOutput schema / properties / write_completed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Write Completed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "number",
        -  "title",
        -  "state",
        -  "url",
        -  "message"
        -]New value: +[
        +  "precondition_checked",
        +  "write_completed",
        +  "readback_completed",
        +  "state_matches_requested",
        +  "number",
        +  "title",
        +  "state",
        +  "url",
        +  "message"
        +]
      • changedOutput schema / title
        Previous value: -"IssueEdit"New value: +"IssueEditResult"
    • Changedgh_edit_label26 fields changed
      • changedInput schema / properties / color / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "pattern": "^[0-9A-Fa-f]{6}$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / color / description
        Added value: +"Replacement six-character hexadecimal label color."
      • changedInput schema / properties / description / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 65536,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / description / description
        Added value: +"Replacement label description."
      • addedInput schema / properties / name / description
        Added value: +"Existing label name."
      • addedInput schema / properties / name / maxLength
        Added value: +100
      • addedInput schema / properties / name / minLength
        Added value: +1
      • changedInput schema / properties / new_name / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 100,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / new_name / description
        Added value: +"Replacement label name."
      • addedInput schema / properties / owner / description
        Added value: +"GitHub repository owner or organization login."
      • addedInput schema / properties / owner / maxLength
        Added value: +39
      • addedInput schema / properties / owner / minLength
        Added value: +1
      • addedInput schema / properties / owner / pattern
        Added value: +"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$"
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repository name without the owner prefix."
      • addedInput schema / properties / repo / maxLength
        Added value: +100
      • addedInput schema / properties / repo / minLength
        Added value: +1
      • addedInput schema / properties / repo / pattern
        Added value: +"^[A-Za-z0-9_.-]{1,100}$"
      • changedOutput schema / description
        Previous value: -"Result of editing a label."New value: +"Authoritative outcome of one label edit attempt."
      • addedOutput schema / properties / precondition_checked
        Added value: +{
        +  "title": "Precondition Checked",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / readback_completed
        Added value: +{
        +  "title": "Readback Completed",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / state_matches_requested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "State Matches Requested"
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warning"
        +}
      • addedOutput schema / properties / write_completed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Write Completed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "name",
        -  "url",
        -  "message"
        -]New value: +[
        +  "precondition_checked",
        +  "write_completed",
        +  "readback_completed",
        +  "state_matches_requested",
        +  "name",
        +  "url",
        +  "message"
        +]
      • changedOutput schema / title
        Previous value: -"LabelEdit"New value: +"LabelEditResult"
    • Changedgh_edit_pr32 fields changed
      • changedInput schema / properties / assignees_add / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 39,
        +      "minLength": 1,
        +      "pattern": "^(?:@me|[A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))$",
        +      "type": "string"
        +    },
        +    "maxItems": 10,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / assignees_add / description
        Added value: +"Assignee logins or the @me selector to add."
      • changedInput schema / properties / assignees_remove / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 39,
        +      "minLength": 1,
        +      "pattern": "^(?:@me|[A-Za-z0-9](?:[A-Za-z0-9-]{0,38}))$",
        +      "type": "string"
        +    },
        +    "maxItems": 10,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / assignees_remove / description
        Added value: +"Assignee logins or the @me selector to remove."
      • changedInput schema / properties / base / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 1024,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / base / description
        Added value: +"Replacement base branch name."
      • changedInput schema / properties / body / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 65536,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / body / description
        Added value: +"Replacement Markdown pull request body."
      • changedInput schema / properties / labels_add / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 100,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "maxItems": 100,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / labels_add / description
        Added value: +"Labels to add."
      • changedInput schema / properties / labels_remove / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "maxLength": 100,
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    "maxItems": 100,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / labels_remove / description
        Added value: +"Labels to remove."
      • addedInput schema / properties / number / description
        Added value: +"Pull request number to edit."
      • addedInput schema / properties / number / minimum
        Added value: +1
      • addedInput schema / properties / owner / description
        Added value: +"GitHub repository owner or organization login."
      • addedInput schema / properties / owner / maxLength
        Added value: +39
      • addedInput schema / properties / owner / minLength
        Added value: +1
      • addedInput schema / properties / owner / pattern
        Added value: +"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$"
      • addedInput schema / properties / repo / description
        Added value: +"GitHub repository name without the owner prefix."
      • addedInput schema / properties / repo / maxLength
        Added value: +100
      • addedInput schema / properties / repo / minLength
        Added value: +1
      • addedInput schema / properties / repo / pattern
        Added value: +"^[A-Za-z0-9_.-]{1,100}$"
      • changedInput schema / properties / title / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 256,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / title / description
        Added value: +"Replacement pull request title."
      • changedOutput schema / description
        Previous value: -"Result of editing a pull request."New value: +"Authoritative outcome of one pull-request metadata edit attempt."
      • addedOutput schema / properties / precondition_checked
        Added value: +{
        +  "title": "Precondition Checked",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / readback_completed
        Added value: +{
        +  "title": "Readback Completed",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / request_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Request Id"
        +}
      • addedOutput schema / properties / state_matches_requested
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "State Matches Requested"
        +}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warning"
        +}
      • addedOutput schema / properties / write_completed
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "title": "Write Completed"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "number",
        -  "title",
        -  "url",
        -  "message"
        -]New value: +[
        +  "precondition_checked",
        +  "write_completed",
        +  "readback_completed",
        +  "state_matches_requested",
        +  "number",
        +  "title",
        +  "url",
        +  "message"
        +]
    • Addedgh_get_api_rate_status
    • Addedgh_get_artifact
    • Addedgh_get_commit
    • Addedgh_get_failed_run_logs
    • Addedgh_get_file_contents
    • Changedgh_get_issue1 field changed
      • addedOutput schema / properties / body
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Body"
        +}
    • Addedgh_get_job_logs
    • Addedgh_get_merge_requirements
    • Changedgh_get_pr17 fields changed
      • addedInput schema / properties / number / description
        Added value: +"Positive pull request number."
      • addedInput schema / properties / number / minimum
        Added value: +1
      • addedInput schema / properties / owner / description
        Added value: +"Canonical GitHub repository owner."
      • addedInput schema / properties / owner / maxLength
        Added value: +39
      • addedInput schema / properties / owner / minLength
        Added value: +1
      • addedInput schema / properties / owner / pattern
        Added value: +"^[A-Za-z0-9](?:[A-Za-z0-9-]{0,38})$"
      • addedInput schema / properties / repo / description
        Added value: +"Canonical GitHub repository name without path separators."
      • addedInput schema / properties / repo / maxLength
        Added value: +100
      • addedInput schema / properties / repo / minLength
        Added value: +1
      • addedInput schema / properties / repo / pattern
        Added value: +"^[A-Za-z0-9_.-]+$"
      • addedOutput schema / properties / baseRefOid
        Added value: +{
        +  "pattern": "^[0-9A-Fa-f]{40}$",
        +  "title": "Baserefoid",
        +  "type": "string"
        +}
      • addedOutput schema / properties / body
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Body"
        +}
      • addedOutput schema / properties / comments / minimum
        Added value: +0
      • addedOutput schema / properties / comments / type
        Added value: +"integer"
      • addedOutput schema / properties / headRefOid
        Added value: +{
        +  "pattern": "^[0-9A-Fa-f]{40}$",
        +  "title": "Headrefoid",
        +  "type": "string"
        +}
      • addedOutput schema / properties / labels / items / type
        Added value: +"string"
      • changedOutput schema / required
        Previous value: -[
        -  "number",
        -  "title",
        -  "state",
        -  "url"
        -]New value: +[
        +  "number",
        +  "title",
        +  "state",
        +  "url",
        +  "headRefOid",
        +  "baseRefOid"
        +]
    • Addedgh_get_pr_checks
    • Addedgh_get_pr_diff
    • Addedgh_get_pr_review_eligibility
    • Addedgh_get_pr_review_state
    • Addedgh_get_ref
    • Addedgh_get_run_logs
    • Addedgh_list_artifact_files
    • Addedgh_list_pr_commits
    • Addedgh_list_pr_files
    • Addedgh_list_pr_reviews
    • Addedgh_list_run_artifacts
    • Addedgh_list_run_jobs
    • Changedgh_list_runs17 fields changed
      • addedInput schema / properties / actor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Actor"
        +}
      • addedInput schema / properties / check_suite_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Exact check-suite identifier.",
        +  "title": "Check Suite Id"
        +}
      • addedInput schema / properties / created_from
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Inclusive timezone-aware ISO 8601 creation lower bound.",
        +  "title": "Created From"
        +}
      • addedInput schema / properties / created_to
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Inclusive timezone-aware ISO 8601 creation upper bound.",
        +  "title": "Created To"
        +}
      • addedInput schema / properties / event
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Event"
        +}
      • addedInput schema / properties / head_sha
        Added value: +{
        +  "anyOf": [
        +    {
        +      "pattern": "^[0-9A-Fa-f]{40}$",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Exact 40-character workflow-run head commit SHA.",
        +  "title": "Head Sha"
        +}
      • addedInput schema / properties / page
        Added value: +{
        +  "default": 1,
        +  "description": "One-based result page.",
        +  "maximum": 10000,
        +  "minimum": 1,
        +  "title": "Page",
        +  "type": "integer"
        +}
      • addedInput schema / properties / workflow_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "minimum": 1,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Exact workflow identifier to scope the authoritative route.",
        +  "title": "Workflow Id"
        +}
      • changedOutput schema / description
        Previous value: -"Paginated search results."New value: +"One bounded workflow-run result page with explicit completeness metadata."
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "title": "Has More",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / page
        Added value: +{
        +  "minimum": 1,
        +  "title": "Page",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / per_page
        Added value: +{
        +  "maximum": 100,
        +  "minimum": 1,
        +  "title": "Per Page",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / total_count / default
        Removed value: -0
      • addedOutput schema / properties / total_count / minimum
        Added value: +0
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Warning"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "items",
        -  "truncated",
        -  "query"
        -]New value: +[
        +  "total_count",
        +  "items",
        +  "truncated",
        +  "query",
        +  "page",
        +  "per_page",
        +  "has_more"
        +]
      • changedOutput schema / title
        Previous value: -"SearchResults"New value: +"WorkflowRunsPage"
    • Addedgh_merge_pr
    • Addedgh_read_artifact_file
    • Addedgh_request_pr_changes
    • Removedgh_run_workflow
    • Addedgh_run_workflow_exact
    • Addedgh_server_info
    • Addedgh_set_issue_state
    • Addedgh_set_pr_draft_state
    • Changedgh_watch_run2 fields changed
      • removedInput schema / properties / compact
        Removed value: -{
        -  "default": false,
        -  "title": "Compact",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / timeout_seconds
        Added value: +{
        +  "default": 1800,
        +  "title": "Timeout Seconds",
        +  "type": "integer"
        +}
  2. 31 tool updatesv0.1.0
    • First observedgh_create_branch
    • First observedgh_create_comment
    • First observedgh_create_issue
    • First observedgh_create_label
    • First observedgh_create_milestone
    • First observedgh_create_pr
    • First observedgh_create_release
    • First observedgh_create_repo
    • First observedgh_edit_issue
    • First observedgh_edit_label
    • First observedgh_edit_pr
    • First observedgh_get_issue
    • First observedgh_get_pr
    • First observedgh_get_release
    • First observedgh_get_repo
    • First observedgh_get_run
    • First observedgh_get_workflow
    • First observedgh_info
    • First observedgh_list_issues
    • First observedgh_list_labels
    • First observedgh_list_milestones
    • First observedgh_list_prs
    • First observedgh_list_releases
    • First observedgh_list_repos
    • First observedgh_list_runs
    • First observedgh_list_workflows
    • First observedgh_run_workflow
    • First observedgh_search_code
    • First observedgh_search_issues
    • First observedgh_search_repos
    • First observedgh_watch_run

TDQS

A3.7/5.0
Disambiguation4/5

Tools are largely distinct, but the high number of similar read-only operations (e.g., multiple 'get' variants for PRs, reviews, checks) may require careful reading; however, each has a unique purpose.

Naming Consistency5/5

All tools follow a consistent 'gh_' prefix with snake_case verb_noun pattern, making them predictable.

Tool Count2/5

61 tools is far above the typical well-scoped range; even for a comprehensive GitHub server, this is excessive and likely to confuse agents.

Completeness4/5

Covers a wide range of GitHub operations including CRUD for issues, PRs, repos, and more, but lacks delete operations for labels, releases, and branches, which are notable omissions.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that wraps the GitHub CLI to provide comprehensive access to repository management, pull requests, issues, and workflows. It enables users to perform complex GitHub operations and interact with the GitHub API through a standardized interface.
    10
    1
    ISC
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server for the GitHub REST API that enables interaction with repositories, pull requests, issues, branches, commits, reviews, and code search, with configurable write and destructive operations.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    A read-only MCP server that exposes GitHub user profiles, repository info, and search via tools for AI assistants like Claude.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/fvanevski/gh_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server