seo-analytics-mcp
Google Search Console, GA4 및 IndexNow — MCP 서버로 제공.
Claude에게 내 사이트에 대해 물어보세요. 무엇이 랭킹에 오르는지, 무엇이 바뀌었는지, 무엇이 색인되었는지, 무엇이 전환되는지.
"Which pages lost the most clicks in the last 28 days versus the 28 before?"
"How is /pricing doing?"
"Is https://example.com/new-post indexed yet?"
"Which pages rank on page one but get almost no clicks?"
"Top 20 queries for the blog last month, and which of them convert in GA4."내 Google 계정을 내 Google Cloud 프로젝트의 OAuth 클라이언트에 대해 직접 인증합니다. 내 액세스가 다른 사람을 통해 흐르는 일은 전혀 없으며, 이 저장소에는 자격 증명이 포함되어 있지 않고, 사용하는 모든 Google 할당량은 내 것이 됩니다.
목차
설치 · 설정 · 7일 문제 · 도구 · 응답 형식 · 구성 · 쓰기 작업 · 프로필 · 설계 · 문제 해결 · 개발
Related MCP server: GSC Analyst Connector
설치
Python 3.10+ 및 uv 필요.
uvx seo-analytics-mcp doctor # no install needed — prints your setup steps, in orderdoctor는 온보딩 경험 전체입니다. 각 단계에서 정확히 무엇이 빠졌고 무엇을 실행해야 하는지 알려줍니다. 여기서 다른 것을 읽지 않는다면, 그것을 실행하세요.
설정
Google Cloud 콘솔에서 여섯 번의 클릭, 그 다음 명령어 하나. 10분, 한 번이면 됩니다.
Google Cloud 프로젝트 만들기 — 또는 기존 프로젝트 재사용. console.cloud.google.com/projectcreate
API 활성화. Search Console은 필수이고, GA4 쌍은 선택 사항입니다.
searchconsole ·
analyticsdata ·
analyticsadmin
동의 화면을 구성한 다음 앱 게시를 누르세요. console.cloud.google.com/auth/overview
외부를 선택하고 게시하세요. 본인 앱의 유일한 사용자는 본인이므로 Google의 개인 사용 예외가 적용되어 검증이 필요 없습니다. Workspace 사용자는 대신 내부를 선택할 수 있습니다.
게시 단계를 건너뛰지 마세요 — 아래 참조.
데스크톱 앱 유형의 OAuth 클라이언트를 만들고 JSON을 다운로드하세요.
console.cloud.google.com/auth/clients
웹 애플리케이션 클라이언트는 이 서버에 필요한 루프백 리디렉션을 수행할 수 없습니다. doctor는 이 특정 실수를 확인합니다. 왜냐하면 그것이 가장 쉽게 저지르는 실수이기 때문입니다.
터미널에서 한 번 인증하세요:
uvx seo-analytics-mcp auth --client-secret ~/Downloads/client_secret_*.json브라우저가 열립니다. Google이 *"Google hasn't verified this app"*이라고 표시합니다 — 본인 클라이언트에서는 예상된 것입니다: 고급 → 계속. 토큰은 프로필 디렉터리에 모드 0600으로 저장됩니다.
확인한 다음 연결하세요:
uvx seo-analytics-mcp doctor # eleven checks; exit 0 means it will work연결하기
claude mcp add seo \
-e GSC_DEFAULT_SITE=sc-domain:example.com \
-e GA4_DEFAULT_PROPERTY=properties/123456789 \
-- uvx seo-analytics-mcp{
"mcpServers": {
"seo": {
"command": "uvx",
"args": ["seo-analytics-mcp"],
"env": {
"GSC_DEFAULT_SITE": "sc-domain:example.com",
"GA4_DEFAULT_PROPERTY": "properties/123456789"
}
}
}
}그런 다음 Claude Desktop을 완전히 종료하고(⌘Q — 창을 닫는 것만으로는 충분하지 않음) 다시 여세요.
[!NOTE] 해당 구성에는 자격 증명 경로가 없습니다. 토큰은
seo-mcp auth가 기록한 프로필 디렉터리에 있으므로 전체 블록을 GitHub 이슈에 붙여넣어도 안전합니다.
7일 문제
[!WARNING] 서버가 작동하다가 약 일주일 후에 멈춘다면, 이것이 이유입니다.
Google은 게시 상태가 여전히 테스트인 외부 OAuth 앱에 대해 7일 후 만료되는 리프레시 토큰을 발급합니다. 명백한 설정 경로 — 프로젝트 만들기, 클라이언트 만들기, 자신을 테스트 사용자로 추가하기 — 는 그 상태에 머물게 합니다.
해결책은 한 번의 클릭입니다: 동의 화면에서 대상을 외부로 설정하고 앱 게시를 누르세요. 그런 다음 uvx seo-analytics-mcp auth --reauth.
doctor는 여전히 테스트 토큰일 가능성이 있는 어린 토큰을 표시하고, 서버의 모든 invalid_grant 오류는 이 내용을 전체적으로 설명합니다. 서버의 버그는 아닙니다 — 하지만 이에 대해 제기되는 가장 흔한 이슈가 될 것입니다.
도구
13개의 도구: 10개는 상위 운영에 매핑되고, 2개는 소스를 결합하며, 1개는 모델이 혼란스러운 사용자에게 무엇을 해야 하는지 알려주기 위해 존재합니다.
도구 | 기능 | |
🔎 |
| 이 계정이 읽을 수 있는 속성, 권한 수준 포함 |
🔎 |
| 모든 차원 조합에 의한 클릭수, 노출수, CTR, 위치 |
🔎 |
| 두 기간 비교 — 양방향 최대 변동 항목 |
🔎 |
| 색인 상태, 적용 범위, 표준 URL, 마지막 크롤, 리치 결과 |
🔎 |
| 경고 및 오류 수가 포함된 제출된 사이트맵 |
✍️ |
| 사이트맵 제출 — 쓰기 범위 및 명시적 확인 |
📊 |
| 계정 및 속성, 숫자 속성 ID를 확인하기 위해 |
📊 |
| 임의의 |
📊 |
| 랜딩 페이지별 세션, 참여, 전환 |
⚡ |
| 키 파일이 올바르게 게시되었는지 확인 |
⚡ |
| 일괄 제출 — 기본적으로 드라이 런, 토큰 게이트 확인 |
🔗 |
| 하나의 URL: GSC 추세, 상위 쿼리, GA4 참여, 색인 상태 |
🩺 |
| 활성 프로필, 범위, 응답하는 API, 다음에 실행할 것 |
응답 형식
모든 읽기 도구는 동일한 네 개의 키를 반환합니다. 제한적이고, 자체 설명적이며, 자체 주의 사항을 담고 있습니다.
{
"summary": {
"source": "gsc",
"rows_returned": 10, // what you see
"rows_matched": 1847, // what exists upstream
"date_range": "2026-07-29..2026-08-25", // resolved, always echoed
"data_state": "final",
"totals": { "clicks": 4730, "impressions": 512903, "ctr": 0.0092, "position": 12.4 }
},
"rows": [ /* capped at min(row_limit, 1000) */ ],
"notes": [
"Google anonymises rare queries: these rows do NOT sum to property totals.",
"dataState=final excludes the most recent 2-3 days.",
"1837 further rows were not included inline."
],
"export": "~/.../exports/a1b2c3.csv" // only when rows spilled
}모든 곳에서 세 가지 규칙이 적용됩니다:
합계는 표시된 행뿐만 아니라 가져온 모든 행을 포함합니다 — 10개의 행과 10개의 합계를 보는 모델은 잘림과 현실을 구분할 수 없습니다. 비율은 절대 평균화되지 않습니다: ctr는 클릭수 ÷ 노출수에서 다시 계산되고, position은 노출 가중치가 적용되며, engagementRate는 참여 ÷ 세션입니다.
주의 사항은 데이터와 함께 이동합니다. 주의 사항을 아는 계층이 이를 추가합니다: 클라이언트는 query 차원이 요청되었음을 알고, shape()는 얼마나 많은 행을 버렸는지 알고, GA4는 응답이 샘플링되었음을 알고 있습니다. 독스트링만으로는 모델이 숫자를 보고 있는 바로 그 순간에 이를 잃어버립니다.
오류는 해결책을 명명합니다. 403은 어떤 권한을 확인해야 하고 어디에서 확인해야 하는지 알려줍니다 — 절대 원시 Google 오류 본문이 아닙니다.
The authorised Google account has no access to sc-domain:example.com. Confirm the
account you authorised is the one with access — Search Console grants are per-property
under Settings > Users and permissions, GA4 grants are per-property under Admin >
Property access management. If access was added recently, run `seo-mcp auth --reauth`.구성
모든 변수는 선택 사항입니다. 우선 순위: 도구 인수 → 환경 → 프로필 config.json.
변수 | 용도 |
| 기본 속성, 예: |
| 기본 GA4 속성, 예: |
| 사용할 프로필 (기본값: |
| 프로필 루트 디렉터리 재정의 |
| IndexNow에만 필요 |
| 상세 로깅을 위한 |
날짜
모든 날짜 인수는 YYYY-MM-DD, today, yesterday 또는 NdaysAgo를 허용합니다. 응답은 실제로 사용한 절대 범위를 반영합니다. 모델이 오늘 날짜를 잘못 추측하면 *"트래픽이 0으로 떨어졌다"*로 읽히는 빈 결과가 생성되기 때문입니다.
Search Console은 2~3일 지연되고 약 16개월을 보유합니다. 해당 범위를 벗어나는 범위는 조용히 아무것도 반환하지 않는 대신 표시되거나 거부됩니다. GA4는 속성 자체 시간대에서 보고하므로 날짜가 Search Console과 정확히 일치하지 않습니다 — 응답은 중요한 곳에서 이를 명시합니다.
쓰기 작업
두 도구는 내 컴퓨터 외부의 세계에 영향을 미칩니다. 둘 다 의도적으로 불편하게 설계되었습니다.
| 쓰기 범위(기본적으로 부여되지 않음) 및 |
| 키 파일을 확인한 다음 해당 정확한 URL 목록에 해시로 바인딩된 |
[!IMPORTANT]
confirm플래그만으로는 안전 메커니즘이 아닙니다 — 모델이 채우는 인수일 뿐이며, 잘못된 URL을 생성하는 동일한 오독이 그 옆에confirm=true를 생성합니다.토큰은 드라이 런 없이는 위조할 수 없고, URL 하나를 변경하면 더 이상 일치하지 않습니다. 두 도구 모두
destructiveHint주석도 포함하므로, 파괴적 도구를 자체 승인 프롬프트 뒤에 게이트하는 클라이언트는 그렇게 할 것입니다.
읽기 전용 범위가 기본값입니다. 낯선 사람이 설치한 SEO 도구가 즉시 Search Console 속성 수정 권한을 요청한다면 합리적으로 거절할 것입니다.
프로필
한 머신에 여러 Google 계정 — 클라이언트 속성을 나란히 보유하는 에이전시용.
uvx seo-analytics-mcp auth --profile client-a --client-secret ./client-a.json
uvx seo-analytics-mcp auth --profile client-b --client-secret ./client-b.json
uvx seo-analytics-mcp profiles listMCP 서버 항목별로 SEO_MCP_PROFILE을 설정하세요. 캐시 키에는 프로필이 포함되므로 두 계정이 서로의 데이터를 제공할 수 없습니다.
프로필은 하나의 디렉터리입니다 — 사용자에게 삭제를 요청하게 될 첫 번째 것입니다:
uvx seo-analytics-mcp profiles rm client-a --yes이들은 ~/Library/Application Support/seo-mcp/ (macOS), $XDG_CONFIG_HOME/seo-mcp/
(Linux) 또는 %APPDATA%\seo-mcp\ (Windows)에 있습니다.
설계
네 개의 계층, 엄격하게 하향식. 이것을 잘못하면 인증 흐름이 도구 호출 안에 들어가게 되며, 전체 설계가 방지하려는 것이 바로 그 실패입니다.
flowchart TD
subgraph L4["Entry points"]
S[server.py<br/><i>MCPServer, stdio</i>]
C[cli.py<br/><i>auth · doctor · profiles · serve</i>]
end
subgraph L3["Tools — argument surface, docstrings, cache policy"]
T[13 handlers<br/><i>no HTTP, no credentials, no row shaping</i>]
end
subgraph L2["Clients — the only modules that speak HTTP"]
G[gsc.py]
A[ga4.py]
I[indexnow.py]
end
subgraph L1["Leaves — importable by anyone, import nobody"]
LV[shaping · errors · config · cache · auth/store · auth/scopes]
end
F[auth/flow.py<br/><i>loopback + PKCE · opens a browser</i>]
S --> T
C --> T
C -.->|only reachable from here| F
T --> G & A & I
G & A & I --> LV브라우저 흐름은 도구 호출 안에서 절대 실행되어서는 안 됩니다. 사용자가 동의 화면을 끝낼 때까지 stdio에서 차단되는 MCP 도구는 중단된 서버처럼 보이며, 모델이 도울 방법이 없습니다. 한 번 실행하는 하나의 CLI 명령이 전체 차이입니다 — 그리고 테스트가 모든 모듈의 AST를 순회하여 이를 강제합니다.
테스트가 기계적으로 강제하는 다른 규칙: shaping.py는 Google 라이브러리를 가져오지 않고(그래서 행 로직이 자격 증명 없이 완전히 단위 테스트 가능), 도구는 HTTP 라이브러리를 가져오지 않으며, 서버 경로의 어떤 것도 print()를 호출하지 않습니다 — stdio 전송에서 stdout은 JSON-RPC를 전달하며 단 하나의 잘못된 print가 스트림을 손상시킵니다.
문제 해결
증상 | 원인 |
작동하다가 일주일 후 중단됨 | OAuth 앱이 여전히 Testing 상태 — 위 참조 |
| 대신 Desktop app OAuth 클라이언트를 만드세요 |
| 잘못된 Google 계정이거나 해당 속성에 대한 권한이 없음 |
| OAuth 클라이언트를 발급한 프로젝트에서 활성화한 후 1분간 기다리세요 |
GA4가 400을 반환함 | 호환되지 않는 dimension/metric 조합 — 모든 GA4 dimension이 모든 metric과 작동하는 것은 아님 |
서버가 클라이언트에 표시되지 않음 | 먼저 |
모든 문제 보고에는 seo-mcp doctor --json이 포함되어야 합니다. 여기에는 자격 증명이 없습니다. 경로, 버전, 통과한 검사와 응답한 API만 포함됩니다.
개발
uv sync --extra dev
uv run pytest -q # 147 tests · no credentials · no network
uv run python scripts/smoke.py # drives the server over real stdio JSON-RPC
uv run ruff check src testspython3 -m venv .venv && ./.venv/bin/pip install -e ".[dev]"
./.venv/bin/python -m pytest -q
./.venv/bin/python scripts/smoke.py ./.venv/bin/seo-mcpscripts/smoke.py는 서버를 하위 프로세스로 시작하고, MCP 핸드셰이크를 완료하며, 도구를 나열하고 여러 도구를 호출합니다. 임시 프로필 디렉터리를 사용하므로 실제 토큰은 건드리지 않습니다. Google 자격 증명이 있기 전에 프로토콜 측이 작동하는지 확인하는 가장 빠른 방법입니다.
직접 시험해 보려면 MCP Inspector는 Node만 있으면 됩니다:
npx @modelcontextprotocol/inspector ./.venv/bin/seo-mcp # web UI
npx @modelcontextprotocol/inspector --cli ./.venv/bin/seo-mcp \
--method tools/call --tool-name auth_status # scriptable자동화된 테스트로 다루지 않는 부분: OAuth 흐름 자체와 실제 IndexNow 제출입니다. 둘 다 사람과 실제 도메인이 필요하며, 이를 모킹하면 모크만 테스트하게 됩니다. 이들은 짧은 수동 릴리스 체크리스트에 속합니다.
하지 않을 두 가지
[!NOTE] IndexNow는 Google에 도달하지 않습니다. 참여자는 Bing, Yandex, Naver, Seznam.cz, Yep 및 Amazon입니다. 하나의 엔드포인트가 이들 모두에게 전파됩니다. Google은 참여하지 않으며, Google 자체 Indexing API는
JobPosting또는BroadcastEvent구조화 데이터가 포함된 페이지만 허용합니다. 더 빠른 Google 색인을 기대하고 이 도구를 설치한다면 실망할 것입니다.
[!NOTE] 쿼리 행은 합계와 일치하지 않습니다. Google은 드문 쿼리를 익명화하므로
querydimension으로 분류하면 수가 부족하게 집계됩니다. 해당 dimension을 포함하는 모든 응답은 이 주의 사항을 반복합니다. 그렇지 않으면 해당 행을 받은 모델이 자신 있게 잘못된 백분율을 계산하기 때문입니다.
기여
이슈와 풀 리퀘스트를 환영합니다. 자격 증명이 필요 없는 테스트 스위트는 Python 3.10 및 3.13에서 Linux, macOS, Windows 전반에 걸쳐 모든 푸시에서 실행됩니다. 로컬에서 통과하면 CI에서도 통과합니다.
도구 이름을 바꾸거나 인수를 변경하면 사용자가 저장한 모든 프롬프트가 깨집니다. 이러한 변경은 CHANGELOG.md에 기록되며 1.0 이전에는 minor 버전, 이후에는 major 버전으로 올라갑니다.
라이선스
MIT.
Available Tools
13 toolsauth_statusARead-only
Report which profile is active, which scopes its token holds, and which Google APIs actually answer. Call this first whenever another tool returns a permission error: the response names the exact command the user should run in their terminal.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds useful behavioral context beyond annotations: the tool proactively names a command for the user to run, and it should be invoked as a first-line diagnostic after permission failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two crisp sentences, front-loading the tool's outputs and then giving a concrete usage directive. Every word serves a purpose; no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has no parameters, has an output schema, and is well-annotated. The description covers what it reports, when to call it, and what value the response provides, leaving no practical gap for an agent deciding to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and 100% schema coverage, so parameter documentation is irrelevant. Per the rubric, a zero-parameter tool gets a baseline of 4; the description correctly implies no inputs are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Report') and identifies the exact diagnostic resource: active profile, token scopes, and reachable Google APIs. This clearly differentiates it from the reporting and analytics sibling tools, which focus on data, not authentication state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs the agent to call this tool first after a permission error and notes that the response names the exact terminal command. This provides an unambiguous trigger condition and practical guidance, which is more than enough for a zero-parameter diagnostic tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_landing_pagesARead-only
Sessions, engagement rate, conversions and revenue by landing page - the preset that joins to Search Console. Every row gains a normalised 'path' key ('/pricing', no host, no trailing slash, no query string) which is directly comparable to the 'path' key added by gsc_search_analytics rows grouped by page.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | ||
| end_date | No | yesterday | |
| start_date | No | 28daysAgo | |
| property_id | No | ||
| path_contains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| notes | Yes | |
| export | No | |
| summary | Yes | |
| export_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only, so the description correctly focuses on added behavioral detail: the join to Search Console and the path normalization rules (no host, no trailing slash, no query string). This goes beyond what the schema or annotations provide, though it does not discuss sampling or property selection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense, efficient sentences with no redundancy. The metric set and identity come first, and the path-normalization behavior earns its place as the key differentiator.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and read-only annotations, the description covers core identity and join behavior well. However, with five undocumented optional parameters, the agent is left guessing about filtering, date handling, and property selection, and the description does not guide away from siblings like ga4_run_report.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and all five parameters are undocumented. The description only mentions the output path key and never explains top_n, start_date, end_date, property_id, or path_contains, so it fails to add meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete report — sessions, engagement rate, conversions, and revenue by landing page — and identifies it as the preset that joins to Search Console. It also distinguishes itself from gsc_search_analytics by explaining the shared normalized path key.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is for GA4 data joined with Search Console and that its path key is directly comparable to gsc_search_analytics rows. It stops short of explicitly naming sibling alternatives or saying when not to use it, but the join context is strong guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_list_propertiesARead-only
List the GA4 accounts and properties this Google account can read, so a property name can be resolved to the numeric ID every other GA4 tool needs. Universal Analytics properties are not returned - they no longer exist in this API.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| notes | Yes | |
| export | No | |
| summary | Yes | |
| export_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds useful behavioral context: results are limited to what the Google account can read, and Universal Analytics properties will not appear because they are absent from the API.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences. The first states purpose and value; the second removes a common misunderstanding. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a parameterless list tool: it explains what is returned, the authorization scope, the ID-resolution purpose, and the exclusion of Universal Analytics. The existing output schema covers return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100% by default, so the description need not explain parameters. Baseline 4 applies for parameterless tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('GA4 accounts and properties'), and clarifies the purpose: resolving a property name to the numeric ID required by other GA4 tools. It also distinguishes itself from GA4 reporting tools and from Universal Analytics, which is explicitly excluded.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context: use this when you need to discover readable GA4 properties and map names to IDs. It does not explicitly name alternative tools or say when not to use it, but the purpose and scope strongly imply the correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ga4_run_reportARead-only
Run an arbitrary GA4 report (the runReport method).
metrics and dimensions are GA4 API names, not UI labels: 'sessions', 'activeUsers', 'screenPageViews', 'conversions', 'totalRevenue'; 'landingPage', 'pagePath', 'sessionDefaultChannelGroup', 'country', 'date'. Not every dimension is compatible with every metric - a 400 error means the pair is not queryable together, not that the names are wrong. dimension_filter and order_by take GA4 FilterExpression and OrderBy objects as plain dicts. Dates accept YYYY-MM-DD, 'today', 'yesterday' or 'NdaysAgo'. GA4 reports in the property's own timezone, so its dates do not line up exactly with Search Console's.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| metrics | Yes | ||
| end_date | No | yesterday | |
| order_by | No | ||
| dimensions | No | ||
| start_date | No | 28daysAgo | |
| property_id | No | ||
| dimension_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| notes | Yes | |
| export | No | |
| summary | Yes | |
| export_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description adds valuable non-obvious behavioral context: 400 errors mean incompatible metric/dimension pairs, dimension_filter and order_by require GA4 object dicts, and reports are generated in the property's timezone. This is precisely the kind of information an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six sentences each carry distinct, necessary information: purpose, API-name caveat, compatibility error semantics, object formats, date formats, and timezone behavior. The description is front-loaded with the purpose and contains no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main non-obvious failure modes and formatting requirements, and the output schema means return values need no explanation. It could be more complete by addressing pagination and property_id selection, but these are minor given the schema defaults and the presence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero schema description coverage, the description compensates well by explaining GA4 API-name conventions, listing valid metric and dimension examples, specifying date formats, and clarifying filter/order_by object formats. It does not mention the limit or property_id parameters, but those are either self-evident or have schema defaults, so the compensation is strong but not complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence uses a specific verb ('Run') and resource ('GA4 report'), explicitly names the underlying runReport method, and the word 'arbitrary' distinguishes it from more targeted sibling tools like ga4_landing_pages. An agent can immediately tell what this tool does and roughly how it differs from specialized report tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly frames this as the general-purpose/custom GA4 reporting tool, and the timezone note contrasts it with Search Console tools. It does not explicitly name sibling alternatives or provide a 'when not to use' statement, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_compare_periodsARead-only
Compare two consecutive Search Console periods and return the biggest movers in both directions - the 'what changed' question in one call.
period_days is the length of each window; the current window ends offset_days before the freshest available data, and the comparison window is the period_days immediately before it. metric is clicks, impressions, ctr or position. For position, a DECREASE is an improvement, and the response says so. dimension is usually page or query; query rows are anonymised by Google and will not sum to totals.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | ||
| metric | No | clicks | |
| site_url | No | ||
| dimension | No | page | |
| offset_days | No | ||
| period_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses concrete behavioral details: window anchoring via offset_days, the direction caveat for position, and the fact that query rows are anonymized and will not sum to totals. This materially helps the agent interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences convey purpose, window mechanics, and the key metric/dimension caveats without repetition or filler. The most important behavioral details are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, existing output schema, and the description's coverage of window semantics and special cases, an agent has enough information to select and invoke the tool correctly. The remaining implicit parameters are minor and inferable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description compensates well by explaining period_days, offset_days, metric values, and dimension caveats. top_n and site_url are left implicit, but their titles and defaults make them reasonably self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: compare two consecutive Search Console periods and return the biggest movers in both directions. The 'what changed' framing clearly distinguishes it from siblings like gsc_search_analytics, which does not compare periods.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames this tool as answering the 'what changed' question, giving a clear use case. It does not name specific alternatives or exclusions, but the intended context is clear relative to the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_inspect_urlARead-only
Inspect one URL's index status in Google: coverage verdict, last crawl time, Google's chosen canonical versus the declared one, robots.txt state, mobile usability and rich-result verdicts. inspection_url must be a full URL that belongs to site_url. This is the tightest Google quota in the set (2,000 calls per day per property), so results are cached for an hour.
| Name | Required | Description | Default |
|---|---|---|---|
| site_url | No | ||
| inspection_url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses quota limits (2,000 calls/day/property), caching behavior (1 hour), and input validation constraints. This is meaningful behavioral context that materially affects when and how an agent should call the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences front-load the tool's purpose and output, then provide constraints and quota/caching context. No filler or redundant restating of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is largely complete given the output schema and annotations: it covers input constraints, expected output categories, rate limits, and caching. The main small gap is the undocumented site_url parameter, which prevents a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains that inspection_url must be a full URL belonging to site_url, but it leaves site_url's format, meaning, and optional/default behavior ambiguous. Partial compensation, with a clear gap on the site_url parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Inspect one URL's index status in Google') and enumerates the exact verdicts returned. This clearly distinguishes it from aggregate tools like gsc_search_analytics or sitemap tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context by warning that this tool has the tightest quota in the set and that results are cached, signaling it should be used judiciously. It does not explicitly name alternatives or state when not to use it, but context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_list_sitemapsARead-only
List the sitemaps submitted for a property, with when each was last downloaded by Google and how many warnings and errors it carries. A sitemap Google has never downloaded, or one with errors, is usually the answer to 'why isn't this indexed'.
| Name | Required | Description | Default |
|---|---|---|---|
| site_url | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| notes | Yes | |
| export | No | |
| summary | Yes | |
| export_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this is a safe read operation. The description adds behavioral detail beyond that by revealing that the tool surfaces undownloaded sitemaps and reports warning/error counts, which helps the agent interpret the results. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place. The first identifies the tool's core action and result fields; the second adds practical diagnostic value. Information is front-loaded and there is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the output schema exists, so return-value documentation is not the description's burden. However, the one input parameter is undocumented in both the schema and the description, leaving an agent unsure how to specify the property. This is a clear completeness gap for a tool with a single important argument.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one parameter, site_url, with no description and 0% schema description coverage. The description only says 'for a property' and never explains that site_url is the property identifier, what format it should take, or whether it is required. The description fails to compensate for the schema's complete lack of parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'List the sitemaps submitted for a property.' It further specifies the output content (last downloaded date, warnings, errors), which makes the tool's purpose unambiguous and distinguishes it from siblings like gsc_list_sites or gsc_submit_sitemap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear diagnostic context: a sitemap never downloaded by Google or one with errors is likely the answer to 'why isn't this indexed.' This tells the agent when the tool is useful, though it does not explicitly name alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_list_sitesARead-only
List the Search Console properties this Google account can read, with the permission level held on each. Call this first in any session: the exact string returned here is what every other Search Console tool needs as site_url. Domain properties look like 'sc-domain:example.com'; URL-prefix properties are full URLs with a trailing slash.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| notes | Yes | |
| export | No | |
| summary | Yes | |
| export_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=true. The description adds useful behavioral context beyond annotations: it lists the permission-level-inclusive return, the need to pass the returned string to sibling tools, and the distinct string formats for domain versus URL-prefix properties.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three purposeful sentences with no filler. It front-loads the core action, then the critical 'call this first' guidance, then the property format details. Every sentence contributes directly to correct invocation and downstream use.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, a read-only annotation, and an output schema, the description is complete. It covers what the tool does, why it must be called first, how its output feeds other tools, and how to recognize the two property types.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema makes parameter semantics moot. The description still adds relevant semantic detail about what will be returned and how those return values will be used as site_url parameters elsewhere, which compensates well for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'List the Search Console properties this Google account can read, with the permission level held on each.' It clearly differentiates this tool from siblings like gsc_list_sitemaps and gsc_search_analytics by focusing on property enumeration and access level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs agents to 'Call this first in any session' and explains that the exact string returned is required by every other Search Console tool as site_url. This is strong, practical guidance on when and why to use the tool before alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_search_analyticsARead-only
Query Search Console performance data: clicks, impressions, CTR, position.
Dates are YYYY-MM-DD, or 'today' / 'yesterday' / 'NdaysAgo'; the absolute range actually used is echoed in summary.date_range. dimensions may include query, page, country, device, date (default ["query"]). filters are "dimension operator value", e.g. "page contains /blog/". search_type is web, image, video, news or discover. data_state "final" excludes the most recent 2-3 incomplete days; "all" is fresher but unstable. Rows carrying the 'query' dimension are anonymised by Google and will NOT sum to property totals - never compute shares or percentages from them.
| Name | Required | Description | Default |
|---|---|---|---|
| filters | No | ||
| end_date | No | yesterday | |
| site_url | No | ||
| row_limit | No | ||
| data_state | No | final | |
| dimensions | No | ||
| start_date | No | 28daysAgo | |
| search_type | No | web |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| notes | Yes | |
| export | No | |
| summary | Yes | |
| export_rows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important behavioral details: date range echoing in summary.date_range, data_state 'all' being fresher but unstable, and the critical anonymization caveat that query-dimension rows do not sum to property totals. This last warning prevents a real misuse of the data and adds significant value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes: metrics, date handling, dimensions, filters, search_type, data_state, and the aggregation caveat. It is front-loaded with the core purpose and avoids filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's 8 optional parameters and existing output schema, the description covers all critical usage aspects: date formats, dimension values, filter syntax, search_type options, data freshness semantics, and a non-obvious data-caveat. The only lightly covered parameters are row_limit and site_url, but they are self-evident or covered by sibling tools like gsc_list_sites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the full explanatory burden and succeeds. It explains date formats, default dimensions, filter syntax with an example, valid search_type values, and the meaning of data_state values. These semantics go far beyond the bare property titles in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Query Search Console performance data: clicks, impressions, CTR, position.' It clearly identifies what the tool returns and the metrics involved, making it easy to distinguish from siblings like gsc_list_sites or gsc_inspect_url. The mention of dimensions and search types further sharpens the tool's identity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes the context for using this tool: querying Search Console performance data with configurable dates, dimensions, filters, search types, and data states. It does not explicitly name alternatives or state when not to use it, but the intended use is unambiguous given the detailed parameter guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_submit_sitemapADestructive
Submit or re-ping a sitemap to Search Console. THIS WRITES TO THE USER'S LIVE PROPERTY. It needs the write scope, which is not granted by default, and it is a dry run unless confirm=true. Show the dry run to the user and get their explicit agreement before calling it again with confirm=true. feedpath must be the full sitemap URL, e.g. https://example.com/sitemap.xml.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| feedpath | Yes | ||
| site_url | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing that it writes to the user's live property, requires a non-default write scope, performs a dry run unless confirm=true, and must be preceded by user agreement. These are critical behavioral details that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: the action, the live-write warning, the scope prerequisite, the dry-run confirmation flow, and the feedpath format requirement. The most important warning is front-loaded in all caps, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the destructive nature, auth requirement, dry-run behavior, confirmation process, and feedpath format, which is strong for a write operation. It only omits guidance on the optional site_url parameter, but the output schema likely clarifies return shape and the tool remains safely usable without that detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description adds meaning for feedpath by requiring it to be the full sitemap URL, and it clarifies confirm's role in gating the real write. However, site_url is not explained, leaving one parameter undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: submit or re-ping a sitemap to Search Console. It does not explicitly contrast with sibling tools like gsc_list_sitemaps, but the action and target are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context and a concrete usage workflow: run as a dry run first, show the user, then call again with confirm=true after explicit agreement. It also warns that the write scope is not granted by default, though it does not list alternatives or when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
indexnow_submitADestructive
Submit URLs to IndexNow so participating search engines recrawl them. THIS ACTS ON THE LIVE WEB and cannot be undone.
Called without confirm it is a DRY RUN: it validates the key file and the URL list and returns a submission_token. Show that dry run to the user, then call again with confirm=true AND the exact submission_token you were given. The token is bound to that precise URL list, so if the list changes you must dry-run again.
IndexNow notifies Bing, Yandex, Naver, Seznam.cz, Yep and Amazon. Google does NOT participate - this will not speed up Google indexing. Per-endpoint HTTP status is returned verbatim, because 200, 202, 400, 403, 422 and 429 all mean different things.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | ||
| urls | Yes | ||
| confirm | No | ||
| endpoint | No | https://api.indexnow.org/indexnow | |
| submission_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavior beyond annotations: it 'ACTS ON THE LIVE WEB and cannot be undone,' the token is bound to a precise URL list, and per-endpoint HTTP statuses are returned verbatim because different statuses have different meanings. This complements the destructiveHint annotation rather than contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: live-web danger, dry-run flow, token binding, engine coverage, and status-code semantics. The most important operational constraint is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity and the presence of an output schema, the description covers the main invocation path well. The only notable gap is the lack of guidance for host and endpoint, but these have defaults and are not required, so the overall definition is still highly usable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains confirm, submission_token, and urls through the dry-run/confirmed workflow, but host and endpoint are left undocumented in both schema and description. This is partial compensation for a five-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Submit URLs to IndexNow so participating search engines recrawl them.' It also distinguishes this from siblings like indexnow_verify_key by describing the actual submission action and live-web effect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit workflow instructions: call without confirm for a dry run, show the dry run to the user, then call with confirm=true and the exact submission_token. It also warns that Google does not participate, clarifying when this tool will not help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
indexnow_verify_keyARead-only
Check that this host's IndexNow key file is correctly published: reachable, HTTP 200, served as text, and containing exactly the configured key. Every submission runs this check itself and aborts if it fails, so use this tool to diagnose a rejected submission. The key is read from configuration, never passed in.
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | ||
| key_location | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, and the description adds useful non-obvious behavior: the key comes from configuration, is never passed in, and the tool verifies several specific HTTP/content conditions. It does not overstate behavior or contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences with no filler. The purpose is front-loaded, followed by usage guidance and a valuable parameter-related clarification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only diagnostic tool with an output schema, the description covers purpose, behavior, and usage context well. However, the semantics of host and key_location remain undocumented, which leaves ambiguity for an agent deciding whether to pass them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. The only useful clue is that the key is read from configuration, but the two parameters host and key_location are never explained, including whether they override the configured defaults or how they interact with each other.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check') and resource ('this host's IndexNow key file'), plus concrete success criteria (reachable, HTTP 200, served as text, exactly configured key). This clearly differentiates it from the submission-oriented sibling indexnow_submit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this tool to diagnose a rejected submission and notes that submissions already run this check and abort on failure. It gives clear context but does not name an alternative tool or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
page_reportARead-only
Everything known about one page in a single call: its Search Console clicks and impressions trend, its top queries, its GA4 engagement, and its current index status. Use this for 'how is /pricing doing?'.
GA4 and index status are included on a best-effort basis - if GA4 is not authorised or the property is unknown, the Search Console half is still returned, with a note saying what was left out.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| days | No | ||
| site_url | No | ||
| property_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, and the description adds valuable behavioral detail beyond that: GA4 and index status are best-effort, and if GA4 is unauthorized or the property is unknown, the Search Console half is still returned with a note. This partial-failure behavior is not present in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence summarizes what the tool returns, the second gives a concrete use case, and the second paragraph explains the only important caveat. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values are covered, and the description explains fallback behavior. However, with four parameters and zero schema descriptions, the lack of any parameter semantics is a clear gap: an agent cannot confidently know why site_url and property_id are needed or how days affects the report.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, but it does not define any of the parameters: url, days, site_url, or property_id. The only indirect clue is 'one page,' which does not meaningfully explain the required url param or the optional disambiguation params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool does: aggregates Search Console clicks/impressions trend, top queries, GA4 engagement, and index status into one call. It also gives a concrete trigger example ('how is /pricing doing?'), which clearly distinguishes it from narrower siblings like gsc_search_analytics or ga4_run_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('Use this for...'), providing clear context. However, it does not explicitly say when not to use it or name alternative sibling tools, leaving some routing decisions to inference.
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.
13 tool updates
v0.1.0- First observed
auth_status - First observed
ga4_landing_pages - First observed
ga4_list_properties - First observed
ga4_run_report - First observed
gsc_compare_periods - First observed
gsc_inspect_url - First observed
gsc_list_sitemaps - First observed
gsc_list_sites - First observed
gsc_search_analytics - First observed
gsc_submit_sitemap - First observed
indexnow_submit - First observed
indexnow_verify_key - First observed
page_report
TDQS
Scored across 13 tools
Most tools target a distinct API and resource, but a few reporting tools overlap: page_report and gsc_inspect_url both report index status, and gsc_search_analytics/gsc_compare_periods both query performance. Descriptions are detailed enough to usually disambiguate, but an agent could still misselect on a quick read.
The dominant pattern is prefix_verb_noun (gsc_list_sites, ga4_run_report, indexnow_verify_key), but some tools deviate: page_report, auth_status, ga4_landing_pages, and indexnow_submit. The naming is consistent enough to be predictable, though not fully uniform.
13 tools is well within the sweet spot for a multi-API SEO server. Each tool covers a distinct operation or preset, and none feels redundant or gratuitous given the GSC, GA4, and IndexNow surface.
The surface covers GSC property discovery, performance queries, URL inspection, sitemap submission, GA4 reporting, and IndexNow submission. Minor gaps exist—notably no sitemap deletion and no GA4 metadata discovery—but core SEO workflows are fully usable.
Maintenance
Related MCP Connectors
Query your SEO data in plain language: rankings, audits, backlinks, competitors and AI visibility.
Google Search Console, GA4 and Bing Webmaster data for SEO and AI-search work. 20 read-only tools.
Query your Google Search Console, GA4 and Bing Webmaster data across every site you run.
Turn Search Console data into SEO actions, content, publishing, indexing, and AI insights.
Related MCP Servers
- FlicenseAqualityDmaintenanceIntegrates with Google Search Console to enable querying search analytics, comparing performance periods, generating visual reports, and identifying SEO optimization opportunities through natural language.59-
- FlicenseNot gradedqualityDmaintenanceEnables querying Google Search Console data via natural language, providing tools for site traffic analysis, page changes, and optimization opportunities.-
- AlicenseNot gradedqualityDmaintenanceEnables querying Google Search Console and Google Analytics 4 through natural language, with tools for SEO analysis like anomaly detection, cannibalization detection, and opportunity scoring.12 npm1MIT
- AlicenseNot gradedqualityDmaintenanceEnables querying Google Search Console data, including search analytics with advanced filtering, quick wins detection, and rich dimensions, through natural language.5,329 npmMIT