Skip to main content
Glama

type: Knowledge Bundle title: PR Genius — the board for the PRs you sent out description: Project management for your outbound open-source contributions — not a code reviewer. Know which of your open PRs needs you today, and what to do about it. version: 2.2.3 created: 2026-07-01 updated: 2026-10-17 author: zsxh1990 conforms_to: OKF v0.1 (Sudhakaran88/okf-conformance) + agent_guidelines extension

mcp-name: io.github.zsxh1990/pr-genius

PR Genius

Somewhere in your GitHub there are PRs you have stopped opening.

One needs a rebase you keep meaning to do. One has been red for four days and nobody told you. Three have sat untouched for three weeks. And one you avoid entirely, because opening it would mean confirming that it is dead.

PR Genius is the board for that work — the contributions you sent out into other people's repositories, where you have no tracker, no standup, and no clue.

It is not a code reviewer. By default it never reads your diff, and it will never tell you your code is correct. There are good tools for that, and this is not one of them.

Unlike PR-Agent or CodeRabbit, this tool does not read your diff. It does not write review comments on your code, and it is not an LLM. It scores a PR against 61 anti-patterns harvested from PRs that actually got rejected, and answers a different question from the one a review bot answers.

It answers the question a working contributor actually has on a Tuesday morning: of everything I have sent out, what do I touch today — and what exactly do I do about it?

CI PyPI Python License Glama score GitHub Marketplace DSH Plugin


Related MCP server: devflow-mcp

Why this exists

GitHub remembers the PR.

It does not remember why you closed your third attempt on a given repo. What worked. What didn't. Which reviewer actually answers and which commented once and vanished. Whether the thing that got you bounced last time was the size, the missing issue link, or the tone.

That knowledge lives in your head. It dies when the session ends.

PR Genius is where it goes instead.

A Repo Profile captures the what a project wants. A case study captures the how a contribution landed or died. Your own status history captures the then-what — how long it waited, what changed, whether it ever came back.

Neither a code reviewer nor a chat model can have the third one. They see your PR once, in someone else's repo. This sees your portfolio over months.


What it knows

It knows

Why it matters to you

How 67 large projects actually behave — merge rates, review cadence, what gets closed

You stop guessing what encode/httpx wants and start matching it

Why real PRs got rejected — written down, with the evidence

You stop repeating the mistake that already cost someone else three weeks

What your own PRs did over time — which state each sat in, for how long

You find out a PR died while it was dying, not three weeks later

The policy of the repo you are aiming at

A Fixes #N in the body is still the single most common reason a first PR gets bounced

Numbers, for the sceptical: 753 loaded patterns, 190 harvested failed-PR observations, 68 repo profiles, 302 reviewed cases. Those are receipts for the sentence above, not the point of it — every one of them is verified against the live tree on each release by scripts/verify_claims.py.

One of those corpora deserves a caveat: success-patterns/ is retrieval/reference only and is not wired into scoring. It is browsable context, not a positive-feedback system, and no verdict has ever been changed by it. The 61 anti-patterns are what actually move the risk tier.


The nine states are nine decisions

A number on a dashboard tells you something is wrong. A state tells you what to do about it.

State

What it means for you today

NEEDS_REBASE

Twenty minutes of work and this PR is still alive.

CI_FAILING

It has been red for days and nobody was going to tell you.

STALE_REVIEW

Someone looked and stopped. Move now or it goes cold.

STALE_NO_REVIEW

Nobody looked. Wait, ping, or walk away — but decide.

CLEAN

Leave it alone. That is also a decision worth being told.

WAITING

Still inside a normal response window. Go do something else.

Half the value of a board is being told what not to spend today on.


The two moments it shows up for

Before you open something. Is this ready, or am I about to waste a maintainer's attention?

python3 -m prgenius coach "fix: timeout in connection pool" \
  --repo encode/httpx --body "Fixes #4821"

Five answers, each with a next move — READY_TO_SUBMIT, FIX_BEFORE_SUBMIT, NEEDS_DISCUSSION, IMPROVE_CHANCE, ASK_MAINTAINER. It is read-only and advisory: it never comments, labels, closes or merges anything.

After it is out there. Which of these needs me?

python3 -m prgenius status --author your-handle

Nine states, stale detection, and a suggestion per PR — fix CI, rebase, ping, wait, or abandon. Run it from cron and it becomes the daily line you actually read.


Install

pip install "prgenius-core[mcp]"     # engine + MCP server

What the wheel actually ships. Since #116, prgenius-core bundles the decision-relevant corpus — anti-patterns/, profiles/, pr-observations/, docs/policies/, locale/ — as prgenius/data/, and root resolution finds it without a checkout. A clone and PRGENIUS_REPO_ROOT are overrides, not prerequisites.

success-patterns/ (~2.7 MB) is deliberately not bundled: the scorer never consults it (#69), so it would triple the wheel without changing a decision. doctor reports success_patterns_installed: false rather than pretending.

prgenius-core doctor      # where the knowledge came from, what it found, what it did not

doctor is the first thing worth running. It reports repo_root_source and the per-corpus counts on its first lines, and it never lies about what is missing.

python3 -m prgenius analyze "feat: add feature" --repo org/repo --body "Fixes #123"
python3 -m prgenius status --author your-handle
python3 -m prgenius profile get owner/name     # what does this project actually want?

CLI reference

Console script is prgenius-core; python3 -m prgenius is equivalent. Every command takes --repo-root to point at a knowledge-base checkout.

Command

What it does

Key flags

status

Health of your in-flight outbound PRs

--author, --format json, --save-snapshot

coach

Ready to open? — exit 0 = pass, 1 = fail

title, --repo, --body

contributor

Contributor decision (5 actions)

title, --repo, --diff-stat

maintainer

The maintainer's side of the same call (5 actions)

title, --repo

analyze

PR analysis + improvement suggestions

title, --repo, --body, --diff-stat

triage

Policy-aware preflight checks

title, --repo, --diff-stat

profile get

Show a repo profile

owner/repo

profile writeback

Profile update suggestions (dry-run)

--author

auto-ping

Suggest pings for stale PRs (dry-run; --confirm acts)

--author, --confirm

auto-rebase

Suggest rebases (dry-run; --confirm acts)

--author, --confirm

harvest

A rejected PR → an anti-pattern draft

owner/repo [number]

doctor

Install / knowledge-base / gh / MCP self-test

--format json

issue / issue-batch

Score one issue, or a labelled batch

--repo, --number, --state, --limit, --format

review-queue

Prioritised review-queue digest

--prs-file

mcp serve

MCP server on stdio

—

eval / suggest

Older aliases, kept for compatibility

—


Where it runs

From your shell — what is above.

From cron, as the one line you read with coffee:

# scripts/pr_status_heartbeat.sh --all
0 10 * * * cd /path/to/pr-genius && bash scripts/pr_status_heartbeat.sh --all

As an MCP server, so your coding agent can read your contribution history instead of starting from zero every time. 14 tools — status_prs, contributor_view, maintainer_view, get_repo_profile, search_patterns and the rest. See MCP Configuration.

As a GitHub Action on a repository you maintain — advisory comments on incoming PRs, never blocking. See GitHub Action.

As a DSH (Cordis) plugin, so the board lives next to the chat you are already in: sidebar action, session tab, right-hand panel, settings, and /prgenius. See DSH Plugin.


What it will never do

Stated plainly, because the rest of this page is worthless if these are fuzzy:

  • It will not tell you your code is correct. It does not judge your logic. You can hand it a diff (--diff) and it will flag install commands, downloads piped into a shell, and secret-shaped strings — a keyword pass, not a review. Without one, it looks at the summary counts only.

  • It will not write or send anything on your behalf unless you pass an explicit --confirm. Every mutating command is dry-run by default.

  • It will not phone home. Analysis is local: no LLM, no API key, no network call. The commands that touch GitHub do it with your token and only for PR metadata. There is no telemetry — see docs/ADOPTION_DATA.md for what is measured instead and why we chose not to build the rest.

  • It will not pretend. If a fact is not verified, the docs say so. This page has been wrong before and the corrections are in the changelog.

What this tool is NOT

The section above is about behaviour. This one is about roles — the jobs people assume it does because of what it looks like. It does not do them, and that is a boundary, not an oversight.

It is not

What that means in practice

A merge gate

It never blocks a merge and never fails a job. The GitHub Action offers comment_mode and apply_labels only — there is no required-check integration, because a "gate" that can be ignored is worse than no gate. If you want it to block, wire the Action's exit into your branch protection yourself.

A PR title linter

It will not fail a PR for a malformed title. It will tell you that a missing Fixes #N is the most common reason a first PR gets bounced, and leave the decision to you.

A CODEOWNERS-aware reviewer

It does not know who owns which file, and will not route or request reviewers.

A code reviewer

See above. It never reads your diff unless you hand one to --diff, and what it does then is a keyword pass.

A positive-feedback system

success-patterns/ (692 of the 753 loaded patterns) is retrieval/reference only and is not wired into scoring. Only the 61 anti-patterns can move a verdict.

The last row is the one worth internalising: the corpus is large, but the part that scores is small on purpose — it is the part backed by PRs that actually got rejected.


🤖 GitHub Action

Advisory analysis on incoming PRs to a repository you maintain. It never blocks a merge and never fails a job — every path degrades to a warning.

name: PR Genius
on:
  pull_request:
    types: [opened, synchronize, reopened]

permissions:
  contents: read
  issues: write   # required when comment_mode != never (post/update PR comment)

jobs:
  pr-genius:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: zsxh1990/pr-genius@v2.1.4
        id: pr-genius
        with:
          title: ${{ github.event.pull_request.title }}
          repo: ${{ github.repository }}
          body: ${{ github.event.pull_request.body }}
          pr_number: ${{ github.event.pull_request.number }}
          comment_mode: always   # never | high_risk | always

comment_mode controls whether the analysis is posted as a PR comment: never (default), high_risk, or always (existing comments are updated in place — no spam). comment_on_high_risk: true still works as an alias.

comment_format controls how long that comment is:

  • compact — default. A short bullet list: risk tier, finding counts, the one-line summary, and a link to the action run. Around 6 lines.

  • verbose — the full table: every signal, the whole anti-patterns table, the full checklist. Can exceed 100 lines.

Any other value falls back to compact and warns on the run — a typo is never a reason to post a 100-line comment. The long form is not gone: it lives on the run page and in $GITHUB_STEP_SUMMARY, which is exactly where the compact comment points.

Behavior change worth knowing: the default is now compact, so workflows that set comment_mode but not comment_format post shorter comments than they used to. Set comment_format: verbose for the old output.

Version pins

Use a pinned tag (@v2.1.4) for reproducibility. There is no floating v2 tag; the only floating major is v1, frozen at v1.8.0.

Docker image

ghcr.io/zsxh1990/pr-genius is available if you prefer not to run the composite action; see the docs index for the docker:// form.


🤖 MCP Configuration

{
  "mcpServers": {
    "pr-genius": {
      "command": "python3",
      "args": ["-m", "prgenius", "mcp", "serve"],
      "env": { "PRGENIUS_REPO_ROOT": "/path/to/pr-genius" }
    }
  }
}

14 read-only tools, including status_prs, contributor_view, maintainer_view, get_repo_profile, get_case_study, search_patterns, list_open_prs, review_queue, profile_writeback_suggestions, prgenius_doctor. All annotated readOnlyHint: true — the surface cannot write to GitHub.

diff_stat is a summary string (git diff --stat output). Size and impact come from those counts, or from title keywords when no diff_stat is given.

diff (optional) is the unified diff body. When you pass one, a keyword pass over its added lines reports three families: install commands (the typosquat surface, with the package names), downloads piped into an interpreter, and secret-shaped strings (reported truncated, never echoed). It is string matching — it cannot tell you whether a package exists on PyPI and it makes no network call. The verdict carries diff_scan.diff_scanned, so 'looked and found nothing' never reads as 'did not look'. Pass no diff and nothing about the current behaviour changes.


🧩 DSH Plugin

Read this before installing. The five surfaces are registered by runtime probing, not by a known-good map. The reason is not that the catalog is unobtainable — an earlier note here said so, citing gh api repos/deepseek-ai/deepseek-harness-sdk 404, but that is a typo'd repo name; the real one, deepseek-ai/deepseek-harness, is public and the catalog file fetches fine (289,726 bytes at master). The reason is that you do not know which SDK version the host has installed, and the right-hand pane moved between them:

SDK

CLIENT_SLOT_API

details

sidebar.right.pane.tab

0.0.1-rc.x

42 keys

yes

no

0.2.1-rc.3

103 keys

removed

added (with .title)

Counts are the bracket-matched CLIENT_SLOT_API element count, matching npm run smoke:release's catalog keys= report. So apply() tries each candidate slot and registers into whichever the host accepts — and if the host accepts none of them, the install looks empty and there is nothing obviously wrong. That is exactly how "empty shell install" shipped eight times in five weeks (#86, #90, #95, #97, #98, #100, #101, #117).

Two things now make it survivable: a total registration failure logs an error (not a warn) naming the surfaces and the slots that were tried, and service.describe().surfaces reports the outcome structurally so a host or a test can read it instead of scraping logs (#131).

Still unverified: whether any surface actually renders. That needs a real DSH web host — which is what #102 is recruiting for. The contract gate (scripts/check_dsh_plugin_contract.py — it prints its own blocking-check count) and npm run smoke:release prove registration shape, not rendering; both say so themselves. Full scoring: docs/maturity-self-assessment.md.

PR Genius runs as a DSH (Cordis) plugin inside the DeepSeek Harness.

dsh plugin add pr-genius

Or apply the one-line patch in cordis.patch.yml. Full guide: docs/dsh-integration.md.

Five surfaces: sidebar footer action (dashboard), conversation tab, right-hand panel, /prgenius command, and settings. The dashboard surface shows knowledge base scale, install health, and your in-flight PRs.

Compatibility. Verified for TypeScript compilation, unit tests and static contract conformance. Fixes shipped since 2.1.5 have not been re-verified in a host, and the version matrix in docs/compatibility.md is entirely unrun.


📊 For agents

If you are an LLM reading this to act on someone's behalf: this is a knowledge bundle first and a tool second. The markdown in anti-patterns/, success-patterns/, profiles/, pr-observations/ and review-cases/ is the durable part. Read docs/index.md for the file map and the intended reading order, then AGENT_GUIDELINES_SCHEMA.md for the agent_guidelines field.

Nothing here is a command for you to execute without checking it. It is data.


🤝 Contributing

Profiles, case studies and anti-patterns are all welcome — see CONTRIBUTING.md. The bottleneck is curation hours per upstream, not infrastructure: a repo profile is roughly 30 minutes of research plus the work of landing a supporting PR upstream.

Code of conduct: CODE_OF_CONDUCT.md. Security: SECURITY.md (coordinated disclosure + privacy).

中文文档

README.zh-CN.md · README.zh.md · docs/BLOG.md — the long-form version of the story above.

Citation

@software{pr_genius,
  title  = {PR Genius — the board for your outbound open-source contributions},
  author = {zsxh1990},
  year   = {2026},
  url    = {https://github.com/zsxh1990/pr-genius}
}

Available Tools

14 tools
analyze_prA
Read-onlyIdempotent

Detailed PR analysis with signals and checklist. Use analyze_pr for deep analysis, coach_pr for quick pass/fail.

Returns: tier (low_risk/medium_risk/high_risk), signals (positive/negative/neutral), checklist (P0/P1/P2 items), and recommended_action.

Use this before submitting a PR to a large open-source repo to check if your contribution strategy is sound. Combines repo profile data, anti-pattern matching, and success pattern analysis.

Args: title: PR title (e.g. "feat: add new search endpoint") repo: Target repo in org/name format (e.g. "encode/httpx") body: PR body/description text description: Extended description (optional) author: PR author username author_association: Author's association with repo (NONE/CONTRIBUTOR/COLLABORATOR/MEMBER/OWNER) labels: PR labels (e.g. ["bug", "documentation"]) star_count: Repository star count (>= 0; 0 = unknown) repo_merge_rate: Repository's external PR merge rate 0.0-1.0 (0 = unknown) mergeable: Mergeable state (MERGEABLE/CONFLICTING/UNKNOWN) diff_stat: git diff --stat output — populates impact/review and is the authoritative PR-size signal (null when omitted)

Returns: dict with keys: tier, signals, checklist, recommended_action, repo, title, impact, review (impact/review null without diff_stat)

Example: analyze_pr("fix: timeout in connection pool", "encode/httpx", "Fixes #123") → {"tier": "medium_risk", "signals": {...}, "checklist": [...], "recommended_action": "..."}

NameRequiredDescriptionDefault
bodyNo
repoYes
titleYes
authorNo
labelsNo
diff_statNo
mergeableNoMERGEABLE
star_countNo
descriptionNo
repo_merge_rateNo
author_associationNoNONE

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already establish readOnly/idempotent/non-destructive, and the description adds real behavior: it combines repo profile data, anti-pattern matching, and success pattern analysis, and discloses the exact response keys and the diff_stat dependency for impact/review. It stops short of noting limits such as cost, latency, or behavior on missing optional inputs.

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?

Front-loads purpose, alternative, and return shape before the Args list, which is well organized. The Args section partly restates the schema, but each entry adds format or default semantics that justify its place.

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?

With no output schema, the description supplies the return keys and the diff_stat caveat, plus an example call and response. For an 11-parameter read-only analysis tool this is nearly complete, though it does not describe how optional defaults (e.g. mergeable='MERGEABLE') affect results.

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?

Schema coverage is 0%, so the description carries the full burden and does it well: it defines formats and sentinel semantics for star_count (0 = unknown), repo_merge_rate (0.0-1.0, 0 = unknown), mergeable enum values, author_association enum values, labels as a string array, and flags diff_stat as the authoritative PR-size signal. This meaningfully exceeds the bare 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?

States a specific verb+resource (detailed PR analysis) and immediately differentiates from the sibling coach_pr by intent (deep analysis vs quick pass/fail). Also names what it produces: tier, signals, checklist, recommended_action.

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?

Explicitly names the alternative (coach_pr) with the selecting condition, and gives a concrete when-to-use scenario: before submitting a PR to a large open-source repo. Nothing is left to inference.

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

coach_prA
Read-onlyIdempotent

Agent PR Dojo: quick pass/fail gate. Use coach_pr for go/no-go decision, analyze_pr for detailed analysis.

Use this as a final gate before opening a PR. Returns pass=true if safe to submit, pass=false if there are blocking issues to fix first.

Combines repo profile analysis, anti-pattern matching, and maintainer policy checks into a single go/no-go decision.

Args: title: PR title repo: Target repo (org/name) body: PR body/description description: Extended description author: PR author username author_association: Author's association (NONE/CONTRIBUTOR/etc.) labels: PR labels star_count: Repo star count (>= 0) repo_merge_rate: External PR merge rate (0.0-1.0) mergeable: Mergeable state (MERGEABLE/CONFLICTING/UNKNOWN) diff_stat: git diff --stat output (populates impact/review)

Returns: dict with pass (bool), tier, signals, checklist, recommended_action

NameRequiredDescriptionDefault
bodyNo
repoYes
titleYes
authorNo
labelsNo
diff_statNo
mergeableNoMERGEABLE
star_countNo
descriptionNo
repo_merge_rateNo
author_associationNoNONE

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint, so the safety profile is covered. The description adds real value beyond that by disclosing what work happens internally (profile analysis + anti-pattern matching + policy checks) and the branch semantics of the return value (pass=true safe to submit, pass=false blocking issues). It does not mention latency, data sources, or failure modes, so it stops short of a 5.

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?

Front-loaded with the routing sentence and final output semantics before the Args list, which is justified at length given 0% schema coverage. Minor redundancy: 'quick pass/fail gate,' 'go/no-go decision,' and 'final gate' restate the same idea across three sentences, and the Returns line partly duplicates the pass=true/false sentence.

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?

With no output schema, the description steps in to describe the returned dict (pass, tier, signals, checklist, recommended_action), and it covers all 11 inputs at a useful level. It is complete enough to invoke correctly, though it lacks guidance on required vs optional inputs and on what the 'tier'/'signals' values mean.

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 description coverage is 0% across 11 parameters, so the description carries the full burden and largely meets it: it gives ranges and accepted values (repo_merge_rate 0.0-1.0, star_count >= 0, mergeable MERGEABLE/CONFLICTING/UNKNOWN, author_association NONE/CONTRIBUTOR/etc.) and explains the role of diff_stat. It falls short of 5 because the body vs description split is ambiguous ('PR body/description' vs 'Extended description') and it never indicates which params drive the decision.

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 ('quick pass/fail gate' for a PR) and immediately distinguishes itself from the sibling analyze_pr by contrasting go/no-go with detailed analysis. It also enumerates the inputs it combines (repo profile analysis, anti-pattern matching, maintainer policy checks), so an agent understands exactly what this tool produces without opening a schema.

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 names the moment to use it ('final gate before opening a PR') and the explicit alternative plus its selection condition ('analyze_pr for detailed analysis'). This is the clearest possible routing guidance in a one-line form.

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

contributor_viewA
Read-onlyIdempotent

Contributor-facing action decision for a single PR (v1.6.0).

Output answers: 'Is my PR ready to submit? What should I fix?' Maps analyze_pr signals to 5 actions: READY_TO_SUBMIT, FIX_BEFORE_SUBMIT, NEEDS_DISCUSSION, IMPROVE_CHANCE, ASK_MAINTAINER.

Args: title: PR title repo: Target repo (org/name) body: PR body description: Extended description author: PR author username author_association: Author's association (NONE/CONTRIBUTOR/etc.) labels: PR labels star_count: Repo star count repo_merge_rate: External PR merge rate 0.0-1.0 diff_stat: Diff stat string

Returns: dict with keys: persona, repo, title, author, action, action_label, action_icon, reason, next_step, checklist, confidence, merge_probability, impact, review, author_info, context.

NameRequiredDescriptionDefault
bodyNo
repoYes
titleYes
authorNo
labelsNo
diff_statNo
star_countNo
descriptionNo
repo_merge_rateNo
author_associationNoNONE

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds useful behavioral context: the deterministic mapping from analyze_pr signals to a fixed set of 5 named action outcomes, plus the version. It does not disclose whether inputs need a live PR, latency, or failure modes, so it is informative but not rich.

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?

Purpose and output questions are front-loaded, and the Args/Returns sections are scannable. The 15-key Returns list is somewhat long, but with no output schema it is justified rather than padding.

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 10-parameter tool with no output schema and no annotation-gap in the safety domain, the description supplies both the argument inventory and the return-key inventory, so an agent knows what it will get back. The main residual gap is the ambiguous body/description parameters and the absence of any live-input requirement note.

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 0%, so the description must carry the parameter burden, and it does enumerate all 10 args. But most entries are near-tautological (title='PR title', author='PR author username'), and the body vs description distinction ('PR body' vs 'Extended description') is left ambiguous. It adds format hints only for repo (org/name) and author_association, so it partially compensates for the coverage 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?

States a specific verb+resource ('action decision for a single PR') and immediately enumerates the exact 5 actions produced. The 'contributor-facing' framing cleanly distinguishes it from the maintainer_view sibling, so an agent can pick between them without opening schemas.

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 quoted questions ('Is my PR ready to submit? What should I fix?') imply when a contributor would call it, and the reference to mapping analyze_pr signals hints at its relationship to that sibling. However there is no explicit when-to-use-vs-alternative or exclusion guidance, leaving the choice between contributor_view, analyze_pr, coach_pr and triage_pr to inference.

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

get_case_studyA
Read-onlyIdempotent

Get a specific PR case study with full details and rounds.

Returns the complete case study including frontmatter, body text, and round-by-round interaction history. Useful for learning from past PR experiences.

Args: repo: Repository in org/name format pr_number: PR number (integer)

Returns: dict with frontmatter, body, path, or error if not found

NameRequiredDescriptionDefault
repoYes
pr_numberYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate read-only and idempotent behavior. The description adds details about the return structure (frontmatter, body, path) and error handling, which are beyond the annotations and schema. It is sufficient for a simple retrieval 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 concise, with a one-sentence purpose, a brief context statement, and clearly separated Args/Returns sections. Every sentence adds value, and the structure is front-loaded.

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 tool with 2 simple parameters and no output schema, the description covers the core functionality and return format. It mentions error handling ('or error if not found'). An example would be nice but is not essential given the simplicity.

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 no descriptions (0% coverage), so the description compensates by explaining 'repo: Repository in org/name format' and 'pr_number: PR number (integer)'. This adds meaningful guidance beyond the bare 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 it retrieves a specific PR case study with full details and rounds, distinguishing it from sibling tools like list_open_prs (which lists PRs) and search_patterns (which searches patterns). The verb 'get' and resource 'case study' are specific and 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 indicates it is useful for learning from past PR experiences, providing context for when to use. While it lacks explicit when-not-to-use or alternative tools, the purpose is clear enough to differentiate from siblings.

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

get_repo_profileA
Read-onlyIdempotent

Get repository profile with maintainer guidelines, AI policy, and merge rate.

Returns 17 agent_guidelines fields including ai_policy, maintainer_vibe, external_merge_rate, close_keywords, and more. Use this to understand a repo's contribution culture before submitting a PR.

Args: repo: Repository in org/name format (e.g. "encode/httpx")

Returns: dict with repo metadata and agent_guidelines, or error if not found

NameRequiredDescriptionDefault
repoYes

TDQS

A4.4/5.0
Behavior4/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 useful behavioral context by stating that it returns repository metadata plus agent_guidelines, and that an error is returned if the repo is not found, which goes beyond what the annotations or schema 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 front-loaded with a clear one-sentence summary, followed by useful return details and a concise Args/Returns structure. Every sentence contributes meaningful 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?

With one parameter, no output schema, and comprehensive annotations, the description covers everything needed: input format, what fields are returned, a usage scenario, and error behavior. There are no critical gaps for an agent to call this tool correctly.

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 schema provides only the parameter name and type with no description, but the description fully compensates by specifying the required format: 'Repository in org/name format (e.g. "encode/httpx")'. This is exactly the semantic information an agent needs to invoke the tool correctly.

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 a specific verb and resource: it gets a repository profile with maintainer guidelines, AI policy, and merge rate. It names concrete fields returned, making the tool's purpose unmistakable, though it does not explicitly differentiate it from sibling 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 explicit context for when to use the tool: 'Use this to understand a repo's contribution culture before submitting a PR.' It does not mention exclusions or when to prefer a sibling tool, but the context is clear enough for an 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.

list_open_prsA
Read-onlyIdempotent

List open PR case-study records in the local knowledge base (issue #74).

NOTE: these are local case-study folders with final_status=open — NOT live GitHub PRs. For live GitHub PR health use status_prs.

Args: repo: filter by target repo (org/name, e.g. "encode/httpx"); "" = all author: filter by PR author username; "" = all

Returns: list of {repo, pr_number, pr_url, author, folder} for each matching open case study

NameRequiredDescriptionDefault
repoNo
authorNo

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered. The description adds genuine context beyond that: it clarifies the records are local case-study folders with final_status=open rather than live data, and specifies the return fields. It does not cover pagination or ordering, so it falls just short of the top.

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?

Front-loaded with the core purpose, then a NOTE for the critical disambiguation, followed by scannable Args/Returns blocks. Every line earns its place 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?

No output schema exists, so the description correctly spells out the returned fields ({repo, pr_number, pr_url, author, folder}). Combined with annotations covering safety and full parameter documentation, an agent has everything needed to call this correctly.

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?

Schema description coverage is 0%, so the description must carry the burden — and it does, documenting both params: `repo` filters by target repo with format example 'org/name' and '`""` = all', and `author` filters by PR author username with the same empty-string default 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?

States a specific verb and resource ('List open PR case-study records in the local knowledge base') and immediately disambiguates the misleading name by clarifying these are NOT live GitHub PRs. An agent can tell it apart from status_prs without opening the schema.

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?

Explicitly names the alternative for the other case: 'For live GitHub PR health use `status_prs`.' It gives a clear when-to-use boundary and an exclusion, leaving nothing to inference.

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

maintainer_viewA
Read-onlyIdempotent

Maintainer-facing action decision for a single PR (v1.5.1).

Output answers: 'What should I do with this PR right now?' Maps analyze_pr signals to 5 actions: READY_FOR_REVIEW, WAIT_FOR_AUTHOR, CLOSE_DUPLICATE, CLOSE_STALE_OR_RISKY, HOLD_MAINTAINER_DECISION.

Phase 5.1: Adds impact (files/lines/breaking/security), review (complexity/estimated_minutes), and author_info fields.

Args: title: PR title repo: Target repo (org/name) body: PR body description: Extended description author: PR author username author_association: Author's association (NONE/CONTRIBUTOR/etc.) labels: PR labels star_count: Repo star count repo_merge_rate: External PR merge rate 0.0-1.0 diff_stat: Diff stat string (e.g. "3 files changed, 10 insertions(+), 5 deletions(-)")

Returns: dict with keys: persona, repo, title, author, action, reason, blocking_signals, next_step, review_ready, impact, review, author_info, context.

NameRequiredDescriptionDefault
bodyNo
repoYes
titleYes
authorNo
labelsNo
diff_statNo
star_countNo
descriptionNo
repo_merge_rateNo
author_associationNoNONE

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description usefully discloses the 5 action outcomes and the decision semantics, but adds nothing about latency, whether repo_merge_rate/labels must be pre-fetched, or failure modes for this 10-param tool.

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

Conciseness3/5

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

Front-loaded with the purpose and action list, which is good, but version/phase trivia ('v1.5.1', 'Phase 5.1') and the verbose Args/Returns blocks add noise an agent does not need. Every sentence about parameters does earn some place given 0% schema coverage, so it is not wasteful overall but is not tight.

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?

With no output schema, the description compensates by enumerating the return dict keys (action, reason, blocking_signals, next_step, review_ready, impact, review, author_info, context), and it covers all input params. Sufficient for correct invocation, though it never explains what the required vs optional split means or how missing optional inputs affect the action.

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 description coverage is 0%, so the description carries the full burden and does document all 10 args, including non-obvious detail: repo as org/name, author_association values, repo_merge_rate as 0.0-1.0, and a diff_stat format example. It omits semantics for description vs body overlap and the effect of defaults, keeping it short of a 5.

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?

States a specific action-decision role for a single PR and frames the output question ('What should I do with this PR right now?'), which is distinctive among siblings. It names analyze_pr as the upstream signal source, but does not distinguish itself from triage_pr, coach_pr, or contributor_view, which sound adjacent.

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 'Maintainer-facing action decision' framing implies the maintainer-side use case and mentions the analyze_pr dependency, giving usable context. However, there is no explicit when-to-use/when-not or routing to triage_pr/coach_pr/review_queue for the overlapping workflows, so the agent must infer selection.

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

prgenius_doctorA
Read-onlyIdempotent

Self-test the pr-genius install (issue #70).

Run this before trusting analyze_pr output. Reports Python/package versions, knowledge-base readability and coverage (anti-patterns, success-patterns, profiles, case studies, policies), gh CLI availability, MCP tool registration, a sample analyze against a known profile, and data-coverage warnings.

Returns: dict with keys: ok, prgenius_version, python_version, platform, knowledge_base, gh, mcp, sample, warnings

NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

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

With annotations already covering the safety profile (readOnly, idempotent, non-destructive), the description goes further and enumerates the concrete checks performed (versions, KB readability/coverage, gh CLI, MCP registration, sample analyze, warnings). Since there is no output schema, spelling out the return dict keys is genuinely additive 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?

Purpose and precondition are front-loaded in two tight sentences. The 'Returns' block is somewhat long, but each key listed is load-bearing given no output schema exists, so the length is largely earned.

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-param diagnostic with no output schema, the description supplies both the invocation precondition and the shape of the result (ok, versions, kb, gh, mcp, sample, warnings). Nothing an agent needs in order to call or interpret it is missing.

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 takes zero parameters, so per the rubric the baseline is 4. The description correctly implies a no-argument invocation and has no parameter semantics to get wrong.

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?

States a specific verb and resource ('Self-test the pr-genius install') and instantly separates itself from the analysis siblings by framing itself as a pre-flight health check. Nothing about what it does is left ambiguous.

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?

Explicitly prescribes the usage condition: 'Run this before trusting analyze_pr output.' That names the sibling whose reliability it gates, which is exactly the routing signal an agent needs to pick this tool over analyze_pr or status_prs.

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

profile_writeback_suggestionsA
Read-onlyIdempotent

Get profile writeback suggestions based on PR status analysis.

Analyzes PR health data and suggests profile updates (e.g., stale_days_threshold, response_time). Returns suggestions with evidence, source, and confidence score.

Args: author: GitHub username mode: 'suggest' (all suggestions) or 'auto' (confidence >= 0.8 only)

Returns: list of {field, value, repo, evidence, source, confidence, private}

NameRequiredDescriptionDefault
modeNosuggest
authorYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds value beyond that by disclosing the output structure (field, value, repo, evidence, source, confidence, private) and the auto-mode confidence threshold, which tells the agent what the results mean.

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?

Front-loads the purpose before the Args/Returns blocks, and every sentence carries information. The Args/Returns formatting slightly duplicates what a schema would normally hold, but given 0% schema coverage it earns its place.

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?

With no output schema, the Returns section is essential and present. Parameter behavior and thresholds are documented. Only the default mode value and any permission/pagination considerations are missing, which is minor for a two-parameter read tool.

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 description coverage is 0%, so the description must carry parameter meaning — and it does: author is a GitHub username, and mode's two values are defined with the 0.8 confidence cutoff. This compensates well for the empty schema, though it doesn't state the default value ('suggest') that the schema declares.

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?

States a specific verb and resource ('Get profile writeback suggestions') and names the basis ('PR status analysis'), with an example of the fields suggested. It does not explicitly differentiate itself from siblings like analyze_pr or get_repo_profile, so it stops short of a 5.

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 mode parameter is explained with a concrete selection rule ('suggest' = all, 'auto' = confidence >= 0.8), which implies usage. However, there is no guidance on when to call this tool versus analyze_pr, get_repo_profile, or other profile/PR siblings.

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

review_queueA
Read-onlyIdempotent

Build maintainer review queue digest from a list of PRs (v1.5.0).

Groups PRs by maintainer action (5 classes) and produces a digest suitable for Actions summary or git-trackable markdown file.

Args: prs: List of {repo, number, title, body, author, labels, star_count, repo_merge_rate} prs_file: Alternative — path to JSON file containing the PR list

Returns: dict with keys: generated_at, total, summary (action -> count), results (per-PR maintainer_view), digest_markdown

NameRequiredDescriptionDefault
prsNo
prs_fileNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint, so the safety profile is covered. The description adds genuine context beyond that: the grouping behavior (5 action classes), the two output forms, and a full enumeration of the returned dict keys, which matters since there is no output schema.

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?

Well front-loaded and cleanly sectioned into Args/Returns, with the core purpose stated first. The version tag '(v1.5.0)' is minor noise, but overall it is tight and earns its length.

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 moderately complex digest-builder with no output schema, the description supplies the return keys, the input field list, and the two output destinations. Missing only the specific 5 action classes and the precedence between prs and prs_file, which are minor gaps.

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 description coverage is 0%, so the description must carry the load and it largely does: it documents prs as a list of {repo, number, title, body, author, labels, star_count, repo_merge_rate} and prs_file as an alternative path to a JSON PR list. It does not specify the JSON file's expected shape or how the two inputs interact if both are supplied, but it compensates well for the empty schema.

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 opens with a specific verb+resource ('Build maintainer review queue digest from a list of PRs') and clarifies the mechanism (groups by maintainer action into 5 classes, emits markdown). It is clearly distinguishable from the per-PR sibling maintainer_view, but it never explicitly names or contrasts any sibling.

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 only implied through the stated output targets ('suitable for Actions summary or git-trackable markdown file'). There is no explicit when-to-use vs. maintainer_view/analyze_pr/triage_pr guidance, no prerequisites, and no exclusions.

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

schema_infoA
Read-onlyIdempotent

返回支持的 schema 版本和枚举值。

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/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, covering the safety profile. The description adds the return scope but no further behavioral context such as caching, response shape, or rate limits, so it neither contradicts nor significantly extends 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 front-loaded sentence with no filler. It directly states the tool's output in a compact way that is easy for an agent 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 zero-parameter, read-only metadata tool, the description covers the essential information needed to select and call it. It could be slightly more detailed about the format or structure of the returned schema versions and enum values, but nothing critical is missing.

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 an empty input schema, so there are no parameter semantics to explain. The description accurately focuses on what the tool returns, which is sufficient for invocation.

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 states a specific verb and resource: it returns supported schema versions and enum values. This is clear and distinct from the sibling tools, though it does not explicitly name a sibling to differentiate itself.

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?

There is no guidance about when to use this tool versus the sibling tools, nor any mention of prerequisites or context. The intended use is only implied by the purpose statement, so an agent gets no explicit routing support.

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

search_patternsA
Read-onlyIdempotent

Search anti-patterns and success-patterns by keyword.

Use this to find relevant patterns before submitting a PR. Anti-patterns show what NOT to do, success-patterns show what works.

Args: query: Search keyword (e.g. "duplicate PR", "missing tests", "out of scope", "breaking change") pattern_type: Filter type — "all" (default), "anti-pattern", or "success-pattern" limit: Max results to return (default 10)

Returns: list of dicts with keys: key, title, symptom, fix_action, source_pr, type, file

Example: search_patterns("duplicate PR") → finds anti-patterns about duplicate submissions search_patterns("timeout", "anti-pattern") → finds timeout-related failure patterns

NameRequiredDescriptionDefault
limitNo
queryYes
pattern_typeNoall

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is clear. The description adds behavioral context (search, filter, return format) but doesn't introduce new traits beyond what annotations imply.

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 well-structured with sections for purpose, usage, args, returns, and examples. It is efficient, though slightly verbose with the example lines; still, every sentence adds value.

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 no output schema, the description explains the return format (list of dicts with specific keys) and provides examples. The tool's complexity is low, and the description is adequate for correct invocation.

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?

Despite 0% schema coverage, the description fully explains each parameter with examples: query (with keyword examples), pattern_type (options: all, anti-pattern, success-pattern), limit (default 10). This adds significant meaning 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 clearly states 'Search anti-patterns and success-patterns by keyword,' providing a specific verb and resource. It distinguishes itself from sibling tools like list_open_prs and get_case_study by focusing on patterns.

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?

Explicitly says 'Use this to find relevant patterns before submitting a PR,' giving clear context of when to use. It also clarifies the two types of patterns but doesn't explicitly state when not to use, though the context is sufficient.

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

status_prsA
Read-onlyIdempotent

Check health of in-flight PRs (outbound PR heartbeat).

Classifies open PRs into 9 statuses: NEEDS_REBASE, CI_FAILING, STALE_REVIEW, CHANGES_REQUESTED, STALE_NO_REVIEW, BLOCKED, CLEAN, UNKNOWN, WAITING. Suggests actions for each.

Args: author: GitHub username to check PRs for repo: Repository to check (org/name) stale_days: Days without update to consider stale (default: profile or 14) save_snapshot: If True, persist the result to data/status-snapshots/ for transition detection across runs. Default False because MCP callers (Cursor, Claude Code) may poll frequently and would otherwise flood the snapshot directory.

Returns: dict with prs, ignored, summary, actions, transitions

NameRequiredDescriptionDefault
repoNo
authorNo
stale_daysNo
save_snapshotNo

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: the save_snapshot side effect (persisting to data/status-snapshots/) and the explicit rationale for defaulting it False (frequent MCP polling would flood the directory). It does not explain the transition-detection semantics of the snapshot beyond a one-line mention.

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?

Front-loaded with the purpose and the status taxonomy, then organized into Args and Returns sections. The 9-status enumeration is long but earns its place by defining the output vocabulary; the 'Returns' line is useful given there is no output schema.

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?

With no output schema, the description compensates by naming the return keys (prs, ignored, summary, actions, transitions) and the status categories. Params are covered and the snapshot side effect is disclosed, leaving only minor gaps such as parameter optionality and the meaning of 'transitions'.

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 description coverage is 0%, so the description must carry the burden, and it does: all four params are explained with meaning and format hints ('GitHub username', 'org/name', stale_days defaulting to profile or 14, and the save_snapshot tradeoff). It omits that every parameter is optional with a null default, which the schema technically encodes but doesn't document.

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?

States a specific verb and resource ('Check health of in-flight PRs') and quantifies the output (9 named statuses plus suggested actions), so an agent knows exactly what it gets back. It does not, however, differentiate itself from the many related siblings (list_open_prs, triage_pr, review_queue), leaving overlap ambiguous.

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 never says when to use this tool versus alternatives, despite a crowded sibling set that includes list_open_prs, triage_pr, and review_queue. The 'outbound PR heartbeat' phrase hints at context but offers no when/when-not condition or prerequisite.

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

triage_prA
Read-onlyIdempotent

Policy-aware PR screening.

Reads docs/policies/-.md and checks the PR against hard/soft rules.

返回: verdict: pass / needs_preflight / warn / reject policy_loaded: bool violations: list of {rule, severity, evidence} generic_checks: list (only when needs_preflight) recommended_action: str (always)

Example: triage_pr("docs: typo", "Ikalus1988/MisakaNet", "fix typo", "docs/faq.md | 3 ++-") → {verdict: "pass", policy_loaded: true, ...}

triage_pr("docs: add installation", "pallets/flask", ...)
→ {verdict: "needs_preflight", generic_checks: [...6 items...], ...}
NameRequiredDescriptionDefault
bodyNo
repoYes
titleYes
labelsNo
diff_statNo

TDQS

A3.7/5.0
Behavior4/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. Beyond that, the description adds genuine behavioral context: it reads a per-org/repo policy file, applies hard/soft rules, and enumerates the return fields including verdict levels and recommended_action. Undisclosed are edge cases like what happens when the policy file is missing (only hinted at by policy_loaded) — hence not a 5.

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?

Front-loaded purpose, then a compact return-value block, then two short examples — efficient and scannable with minimal waste. The examples repeat fields the return block already listed, but structurally the layout is sound and appropriately sized for the tool's complexity.

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?

With no output schema, the description usefully documents the return shape (verdict, policy_loaded, violations, generic_checks, recommended_action), which is exactly the burden it should carry. Combined with annotations covering the safety profile, it is largely complete; only auth requirements and the behavior when no policy file exists remain unstated.

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 schema carries no parameter documentation at all. The example call implicitly maps four of the five parameters (title, repo, body, diff_stat) via positional values, but 'labels' is never mentioned and no parameter's format or constraints are described. Partial compensation for a real coverage gap.

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?

States a specific verb and resource — 'Policy-aware PR screening' — and elaborates that it reads docs/policies/<org>-<repo>.md and checks the PR against hard/soft rules, which is concrete enough to distinguish it from a generic analyzer. It does not, however, contrast itself against close siblings like analyze_pr or coach_pr, so the differentiation is only implied.

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 conveyed only through two worked examples rather than explicit when-to-use/when-not guidance. Given siblings such as analyze_pr, coach_pr, and review_queue that plausibly overlap in PR-evaluation territory, the description leaves the agent to infer when triage_pr is the right choice. This is implied-usage territory, not explicit routing.

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.

  1. 12 tool updatesv2.1.4
    • Addedanalyze_pr
    • Addedcoach_pr
    • Addedcontributor_view
    • Addedget_repo_profile
    • Changedlist_open_prs2 fields changed
      • addedInput schema / properties / author
        Added value: +{
        +  "default": "",
        +  "title": "Author",
        +  "type": "string"
        +}
      • addedInput schema / properties / repo
        Added value: +{
        +  "default": "",
        +  "title": "Repo",
        +  "type": "string"
        +}
    • Addedmaintainer_view
    • Addedprgenius_doctor
    • Addedprofile_writeback_suggestions
    • Addedreview_queue
    • Addedschema_info
    • Addedstatus_prs
    • Addedtriage_pr
  2. 2 tool updatesv1.3.0
    • Removedget_repo_profile
    • Removedschema_info
  3. 8 tool updatesv1.3.1
    • Removedanalyze_pr
    • Removedcoach_pr
    • Addedget_case_study
    • Addedget_repo_profile
    • Addedlist_open_prs
    • Addedschema_info
    • Addedsearch_patterns
    • Removedtriage_pr
  4. 3 tool updatesv0.1.0
    • First observedanalyze_pr
    • First observedcoach_pr
    • First observedtriage_pr

TDQS

A3.9/5.0

Scored across 14 tools

Disambiguation3/5

Five tools (analyze_pr, coach_pr, triage_pr, maintainer_view, contributor_view) all analyze a single PR with overlapping decision outputs; descriptions clarify perspective and depth, but an agent could still confuse coach_pr with contributor_view or triage_pr. The remaining tools are distinct, so overlap is notable but manageable.

Naming Consistency4/5

All tool names use lowercase snake_case with descriptive domain terms, but the pattern mixes verb_noun (analyze_pr, get_repo_profile) and noun_noun (maintainer_view, review_queue). The mix is still predictable and readable, with only minor deviations.

Tool Count4/5

14 tools fit the PR assistant domain well and stay within the 3-15 sweet spot. The only concern is that several analysis tools overlap, but the count itself is appropriate.

Completeness4/5

The surface covers pre-submission analysis, policy checks, repo profiles, pattern search, case studies, in-flight status, maintainer/contributor views, review queues, and self-diagnostics. Minor gap: no tool to fetch a live PR's full content by number, but core decision-support workflows are covered.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers