google/integration-review
Reviews an ADK integration documentation page (a Markdown file under docs/integrations/) or an integration pull request for correctness, structure, style, working code, valid links, and catalog conventions. Produces a prioritized review report, a recommended decision (approve, request changes, or close PR), a top-level review response, and draft line-anchored comments; only fixes issues when explicitly asked. Triggers on "integration-review", "review integration page", "review integration PR", "review this integration", "check integration docs".
npx skills add https://github.com/google/adk-docs --skill integration-review
This skill guides a rigorous review of integration documentation pages in the
adk-docs repository. Integration pages
live under docs/integrations/ and document third-party tools, plugins,
observability platforms, data stores, MCP servers, connectors, and other
extensions to ADK agents.
The authoritative sources of truth for this review are:
CONTRIBUTING.md (see the "Integrations" section and itsacceptance criteria).
Always open and compare against peers of the same category:
docs/integrations/github.md, docs/integrations/notion.mddocs/integrations/phoenix.md, docs/integrations/arize-ax.mddocs/integrations/daytona.md, docs/integrations/goodmem.mdscripts/integrations.py.> [!NOTE]
> Read this skill and follow its steps whenever asked to review an integration
> page or an integration PR.
gh to pull it and read the full cumulative diff,not a single commit: gh pr view <n> --repo google/adk-docs and `gh pr diff
<n> --repo google/adk-docs. A stale mkdocs.yml` entry or asset can hide in
files that only show in the full diff.
(maintainerCanModify) so fixes can be pushed directly if requested later.
google-cla bot). An unsigned CLA is a 🔴Critical finding and blocks merge until signed.
git status and git diff to see the change.Find 5 or more similar pages and read them in full. Identify candidates in one
pass by scanning catalog_tags (grep catalog_tags docs/integrations/*.md) and
matching the tag under review (e.g. mcp, observability); widen the set with
other signals such as product domain, structural template, and language support
(they need not all be the exact same category). Reading the full pages, not just
frontmatter, grounds the review in live examples and repo conventions rather
than inferring everything from the templates in this skill.
Work through every dimension in the review checklist below.
Do real verification, not a surface read (see "Deep verification").
Gather objective evidence about the project's maturity, adoption, and whether it
genuinely integrates with ADK (see "Developer value and maturity"). Base the
assessment on verifiable facts, not impressions or the PR's own marketing.
Produce the prioritized report (see "Report format"), then emit the three
follow-on outputs in "Review decision and response": a top-level review
response, a decision (approve, request changes, or close PR), and draft
line-anchored comments. Do not edit files, post to GitHub, or offer to fix
issues by default. Stop and wait for an explicit instruction to fix.
If, and only if, the user explicitly asks you to fix findings: apply precise
edits, keep the contributor's wording where possible, fix only ADK-owned issues
unless told otherwise (leave vendor-SDK bugs for the author), and verify with
mkdocs serve where practical.
Every page starts with exactly these four YAML fields:
---
catalog_title: <Display Name>
catalog_description: <short verb-led phrase>
catalog_icon: /integrations/assets/<slug>.png
catalog_tags: ["<tag>", "<tag>"]
---
catalog_title: the human-readable product name shown on the card.catalog_description: short, verb-led, roughly 45 to 75 characters (about6 to 11 words). Flag anything over ~80 characters as likely to wrap awkwardly
on a card. It must not repeat the product name (the title already shows
it). No verbose lists of technologies; describe what the integration does. No
overclaims.
catalog_icon: /integrations/assets/<slug>.png (or .svg or .jpg).The referenced asset file must actually exist in docs/integrations/assets/
and be a real image.
catalog_tags: a JSON array of lowercase tags. **Use only tags thatalready exist in the catalog; never invent a new one.** Tags combine (e.g.
["data", "mcp"]). Any page that uses MCP in its body must carry the mcp
tag. Enumerate the valid tags in one pass with `grep catalog_tags
docs/integrations/*.md`.
# <Product> <type> for ADK, where <type> matches thecategory (e.g. # GitHub MCP tool for ADK, `# AgentOps observability for
ADK, # Daytona plugin for ADK`).
markdown):
<div class="language-support-tag">
<span class="lst-supported">Supported in ADK</span><span class="lst-python">Python</span><span class="lst-typescript">TypeScript</span>
</div>
## Use cases -> ## Prerequisites -> ## Use with agent(tabbed Python / TypeScript) -> ## Available tools -> ## Configuration
(optional) -> ## Additional resources
## Overview -> ## Installation ->## Setup -> ## Observe -> ## Support and Resources
## Use cases -> ## Prerequisites -> ## Installation ->## Use with agent -> ## Available tools -> ## Configuration
(optional) -> ## Additional resources
## Use with agent over ## Usage or verbose## Example: ... headings. Prefer ## Installation for the install step.
Prefer specific names (Available tools, Available methods) over a bare
## API.
code block); recommend consolidating into a ## Setup with numbered steps. A
single copy-pasteable end-to-end code block is acceptable and often better for
the user than a split Setup/Observe.
gemini-flash-latest, gemini-pro-latest, or othervalid *-latest aliases in sample code rather than specific versioned model
strings, which increase the maintenance burden when new model versions are
released.
from google.adk.agents import Agent (short form), and forMCP from google.adk.tools.mcp_tool import McpToolset.
root_agent (Python) / rootAgent (TypeScript); TypeScriptfiles end with export { rootAgent };.
=== "Python" / `==="TypeScript", with nested sub-tabs like === "Local MCP Server"` where
relevant). Admonitions inside tabs use 8-space indentation.
(see "Deep verification").
In term — definition bullets replace the em dash with a colon; in prose
split into two sentences or use commas / parentheses. On third-party-owned
content, flag but leave to the author; on anything you edit, remove them.
"The ADK", in prose and code comments.
package-name library adds..." rather than "package-name adds...").
marketing and makes sweeping claims.
/sessions/memory/), not absolute https://adk.dev/... or legacy
https://google.github.io/.... Relative links resolve in PR previews, survive
domain changes, and are caught by the link checker. This is a nit on
vendor-owned pages but generally fix it.
docs/integrations/ should useassets/<img>.png, not ../assets/... unless the image genuinely lives in
docs/assets/. Trace the path against what peer pages actually do; do not
theorize.
nonexistent repos, samples, or docs. When you find one, suggest removing it or
ask the author for the real target rather than assuming.
render_catalog('integrations/*.md') in docs/integrations/index.md. **No
mkdocs.yml nav entry is needed**; adding one is an error.
and drop package-name prefixes (e.g. mongodb.md, not
mongodb-mcp-server.md; avoid adk--prefixed names that float to the top).
mkdocs.yml only when a page is renamed or moved froman existing URL. Point redirects directly at the final destination; **never
chain** them.
.md file with correct frontmatterplus the icon asset in assets/.
Verify all code samples against actual APIs and library code. The canonical
source repositories are listed in docs/community/contributing-guide.md.
stated version and Python requirement match the prose.
against the canonical source repositories (listed in
docs/community/contributing-guide.md) for the relevant language SDK (e.g.
Runner, run_async, create_session, append_event, save_artifact,
session/artifact service URIs, adk web / adk run CLI flags, genai types).
Do not assume a local checkout: fetch the source with gh or git (or use a
local clone if one exists), and check the released version the docs target
rather than a main branch that may be ahead of or behind the release. Note the
version you verified against, and flag mismatches.
the vendor SDK source or docs.
issues (flag and leave for the author).
minimum mkdocs serve to confirm the card renders and the icon loads.
Integration pages are official ADK documentation, so an integration must earn
its place by offering real, demonstrated value to developers. The goal here is
to research and determine if the integration is for an established platform with
genuine utility, a track record, and real adoption vs. for a brand-new or
low-adoption project with little substance behind it. Do the research and report
the evidence; do not infer value from the PR's own description or marketing.
Gather objective, verifiable signals and cite each with a source:
the PyPI JSON API (https://pypi.org/pypi/<pkg>/json) or the npm registry
(https://registry.npmjs.org/<pkg>) for the first-release date, number of
releases, and latest version, and check download counts (pypistats or the npm
downloads API). A missing package, or one published the same day as the PR, is
a strong negative signal.
gh api repos/<owner>/<repo> to readcreated_at, stars, forks, contributor count, commit count, releases,
license, and last-commit date. A repository created within the last few weeks,
with a handful of commits, a single author, or no license is a negative
signal.
package download counts (see above), repository stars, forks, and dependent
projects, plus any documented production users, case studies, or independent
third-party coverage found via web search, and how long the product has
operated. Broad, verifiable usage is a positive signal; its absence across
every source is a negative one.
points (callbacks, plugins, toolsets, MCP) rather than patching a dependency
such as google-genai, or wrapping a REST API with plain functions and
presenting that as an ADK integration (cross-check against "Deep verification"
and the scope trigger below).
not a parked domain or placeholder.
Weighing the evidence. A new project is not automatically low-value: an
established vendor shipping a brand-new package, or a project with clear utility
plus a real source repository, tests, and a license, is credible and should not
be treated as a value concern. Genuine concern is the accumulation of negative
signals: brand-new and unpublished, no adoption or track record, no source or
license, no real ADK extension use, and claims the page makes that your
verification could not confirm. When the evidence is mixed, give the contributor
the benefit of the doubt, lay out the facts, and recommend closing as a judgment
call for the maintainer rather than asserting a verdict. Keep the write-up
neutral and factual.
Rejection triggers (close the PR):
functionality that does not exist yet.
vendor's own docs, with at most a one-line link from the existing ADK page).
unpublished or same-day package, no adoption or track record, or no source
repository or license. Support this with the evidence from "Developer value
and maturity" and treat it as a maintainer judgment call, not an automatic
verdict.
while claiming to integrate with ADK.
ADK-specific artifact. The ADK docs are not an API directory.
contribution-graph padding, very new integrations with low usage).
A good page: complete four-field frontmatter with a short verb-led
description and a valid existing tag; correct H1 and single-line
language-support div; the right category template with specific, non-fragmented
sections; complete, runnable, hand-tested code using gemini-flash-latest (or a
valid *-latest alias) and canonical imports (plus Python and TypeScript tabs
for MCP); relative internal links, working external links, valid icon asset; no
verbose AI-generated language, correct use when referring to "ADK", no
overclaims or marketing bias; auto-discovered with no nav edits.
Produce a Markdown report categorized by priority, each finding with an exact
file:line and context. Derive line numbers from the file under review (the
local page, or the PR via gh pr diff or a fetched copy) using a line-numbered
read, grep -n, or the diff's hunk headers; never approximate (no ~).
**Always list all four tiers in order and print None under any tier with no
findings**, so the absence of Critical issues is stated, not merely implied. A
finding you consider genuinely take-or-leave belongs under 🔵 Nits; keep 🔴,
🟠, and 🟡 reserved for items that must be fixed before merge.
hallucinated links, unsigned CLA, wrong destination directory, duplicate page.
overclaims, incorrect vendor/ADK API details.
inline-code sentence starts, word-choice, model string, imports, description
length, marketing tone.
pages, image size, heading-capitalization variants.
Every finding you list here must produce at least one line-anchored comment in
output 3 (a finding that spans multiple locations gets one comment per
location); the report and the comments must cover the same items.
After the tiers, add a short Developer value and maturity narrative
paragraph: summarize the evidence gathered in the "Research developer value and
maturity" step (package age, adoption and track record, repository signals,
genuine ADK extension use), cite each signal with a source link, and end with a
provisional lean. When the research concludes value or maturity is insufficient,
also record it as a 🔴 Critical finding tagged "judgment call" so it stays
consistent with the approve gate.
After the prioritized report, produce the outputs in "Review decision and
response" below.
After the prioritized report, emit these three outputs in order. They map onto a
GitHub PR review (review body + decision + inline comments). Everything here is
a draft: do not post to GitHub, do not run gh, and do not edit files
unless the user explicitly asks.
A short review body (a few sentences), suitable to paste as the GitHub PR review
summary. State what the integration is, the overall assessment, the headline
reasons, and what needs to happen next. Use the "Feedback tone" below: short,
direct, diplomatic, and actionable. For a Close PR outcome, adapt the matching
snippet from "Decline response templates" and fill in the specific evidence.
Choose exactly one, justified by citing the specific findings from the report
above it. Cross-reference the "Acceptance and rejection" criteria so the
decision stays consistent with them.
None); at most 🔵 nits remain, and the page meets the "A good page" bar.
finding that must be fixed before it can merge. List the must-fix items.
(fabricated/unreleased APIs, duplicate page, code that does not match the real
ADK or vendor API, broken or hallucinated links, unsigned CLA, misrepresented
integration, out of scope, insufficient value/maturity, spam signals).
Recommend the PR be closed and record the reason (link the superseding doc or
PR where relevant). When insufficient developer value/maturity is the *only*
concern (the code otherwise works), present it as a recommendation explicitly
flagged as a maintainer judgment call, backed by the "Developer value and
maturity" narrative, rather than an automatic hard blocker.
Do not use a plain "comment" (no-decision) outcome unless there is a strong,
stated reason the review genuinely cannot land on one of the three above.
A copy-pasteable list of inline PR comments a maintainer can drop onto the diff.
Cover every finding in the report, across all four tiers (🔴 🟠 🟡 🔵). Do
not filter by severity or decide that some categories are not worth commenting:
every flagged item, down to the last nit, gets a comment so the maintainer can
relay all of it and nothing is silently dropped.
file:line (or file:start-end) locator with the tier emoji on its own line,
then the one- to two-sentence suggestion as a blockquote so it copies cleanly.
For example:
docs/integrations/weave.md:76 🟡 Style
> Use model="gemini-flash-latest" instead of the pinned
> model="gemini-2.5-flash" to match repo convention and avoid
> model-version churn.
file:line for the finding, taken from the file under review(the local page or the PR diff), never approximated (no ~). Only when a
finding genuinely maps to no line (for example, a missing section, or the
value and maturity judgment call) fall back to a page-level or
frontmatter-level comment, and say so explicitly.
page serves as the sample").
locations (e.g. the same issue in the Python and TypeScript samples) gets one
comment per location.
comment (so comments equal or outnumber findings). If any finding lacks one,
add it rather than shipping a partial list.
These are drafts only; do not post them.
After these three outputs, stop. Do not modify files unless the user
explicitly asks.
sample agent in a repo? Otherwise you can remove this link and this page will
serve as the sample.").
frontmatter field, not "rename the page"). Reference the contributing guide
for mechanics instead of over-explaining.
When the decision is Close PR, adapt the matching template below for the
top-level review response. These mirror the maintainer's established voice; keep
them short and **replace every [bracket] with the specific, verified
evidence** for this PR. Link the acceptance criteria
(https://github.com/google/adk-docs/blob/main/CONTRIBUTING.md#acceptance-criteria).
More than one may apply; combine the relevant paragraphs.
our [acceptance criteria], we're not able to accept this integration at this
time. Value for developers: We look for integrations that provide clear,
demonstrated value to developers building agents with ADK, and we evaluate
factors such as project maturity, active user base, and track record.
[evidence: e.g. the supporting repository was created within the last few
weeks, there is no published package to integrate against, and the project
does not yet have the community adoption or track record we look for.]"
against our [acceptance criteria], we're not able to accept this integration
at this time. Completeness and testability: Code examples in our docs must
be functional and runnable by developers. [evidence: e.g. the ADK imports and
classes referenced do not exist / the <pkg> package is not published / the
example imports from an unmerged PR.]"
integration. Per our [acceptance criteria], we can't publish integrations for
services that may circumvent technical protection measures, violate terms of
service, or access services without authorization. [evidence]"
scope for the ADK docs. Integration pages are for third-party functionality
that extends or tightly integrates with ADK (tools, plugins, toolsets, MCP
servers, or observability platforms). [evidence: e.g. this defines plain
functions that call a REST API, the generic 'wrap a REST API as a function
tool' pattern, which is already documented and applies to any API. The ADK
docs are not an API directory.]"
<N> /duplicates the existing [<page>]. [Optional: vendor-specific features belong
in the vendor's own docs, with at most a one-line link from the existing ADK
page.]"
Take google/integration-review from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.