Skip to content

Commit 2059ab2

Browse files
fix: rename dotted MCP tool names to underscores for Anthropic API compat
Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 661036a commit 2059ab2

5 files changed

Lines changed: 120 additions & 114 deletions

File tree

CHANGELOG.md

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,25 @@ All notable changes to `@automatelab/ai-seo-mcp` are documented in this file.
44

55
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [1.0.0] - 2026-06-08
8+
9+
### Changed
10+
11+
**Breaking:** MCP wire names no longer use dots. Anthropic's Messages API (and MCP clients that forward tool definitions to it — Claude Desktop, Claude Code, Zed, etc.) reject tool names outside `^[a-zA-Z0-9_-]{1,64}$`. All 19 tools renamed: namespace separator is now `_` instead of `.` (e.g. `audit.page``audit_page`). Semantics unchanged.
12+
713
## [0.6.1] - 2026-06-02
814

915
### Fixed
1016

11-
- **`llms_txt.generate` output-schema validation.** The handler omitted the required `domain` field, so the SDK rejected every response with `MCP error -32602` (invalid `structuredContent`). `domain` is now populated, and `llms_full_txt` is relaxed to nullable to match the handler's `null`-when-`include_full=false` return.
12-
- **`llms_txt.generate` now follows sitemap-index files.** It previously parsed only a top-level `<urlset>`, so sites whose `sitemap.xml` is an index pointing at child sitemaps fell back to the homepage only. It now walks the referenced child sitemaps (bounded breadth-first) and indexes the full `max_pages`.
17+
- **`llms_txt_generate` output-schema validation.** The handler omitted the required `domain` field, so the SDK rejected every response with `MCP error -32602` (invalid `structuredContent`). `domain` is now populated, and `llms_full_txt` is relaxed to nullable to match the handler's `null`-when-`include_full=false` return.
18+
- **`llms_txt_generate` now follows sitemap-index files.** It previously parsed only a top-level `<urlset>`, so sites whose `sitemap.xml` is an index pointing at child sitemaps fell back to the homepage only. It now walks the referenced child sitemaps (bounded breadth-first) and indexes the full `max_pages`.
1319

1420
## [0.6.0] - 2026-06-01
1521

1622
### Added
1723

18-
- **`score.agentic_browsing`** — new tool scoring a page against Lighthouse's Agentic Browsing signals: `llms_txt`, `webmcp`, `accessibility_tree`, and `layout_stability` (0-100 each), with a letter grade and findings.
19-
- **Chunk-level extractability in `score.citation_worthiness`** — section-by-section scoring of how cleanly an LLM can lift a self-contained answer from each chunk, surfaced as a length-weighted `extractability_score` plus per-chunk analysis and the most/least extractable sections.
24+
- **`score_agentic_browsing`** — new tool scoring a page against Lighthouse's Agentic Browsing signals: `llms_txt`, `webmcp`, `accessibility_tree`, and `layout_stability` (0-100 each), with a letter grade and findings.
25+
- **Chunk-level extractability in `score_citation_worthiness`** — section-by-section scoring of how cleanly an LLM can lift a self-contained answer from each chunk, surfaced as a length-weighted `extractability_score` plus per-chunk analysis and the most/least extractable sections.
2026

2127
## [0.5.1] - 2026-06-01
2228

@@ -27,14 +33,14 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
2733
### Added
2834

2935
- **`openclaw.plugin.json`** + a clawhub `SKILL.md` so the MCP lists on clawhub / OpenClaw.
30-
- Expanded the `audit.site` description (Glama listing) with behavioral transparency and when-to-use guidance.
36+
- Expanded the `audit_site` description (Glama listing) with behavioral transparency and when-to-use guidance.
3137

3238
## [0.5.0] - 2026-05-26
3339

3440
### Added
3541

36-
- **Body-quality dimensions in `audit.page`** — image alt-text coverage, anchor-text quality, heading hierarchy, Title↔H1 overlap, and readability.
37-
- **Response-header dimensions in `audit.page`** — mixed-content detection plus HSTS, `X-Content-Type-Options`, and `Referrer-Policy` checks.
42+
- **Body-quality dimensions in `audit_page`** — image alt-text coverage, anchor-text quality, heading hierarchy, Title↔H1 overlap, and readability.
43+
- **Response-header dimensions in `audit_page`** — mixed-content detection plus HSTS, `X-Content-Type-Options`, and `Referrer-Policy` checks.
3844
- **`.mcp.json`** at repo root for Open Plugins / cursor.directory compatibility.
3945

4046
## [0.4.1] - 2026-05-23
@@ -52,25 +58,25 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
5258

5359
### Changed
5460

55-
- **Breaking: tool rename to dot-notation.** All tools migrated from flat snake_case (`audit_page`, `check_robots`, …) to a navigable dot-notation tree (`audit.page`, `check.robots`, …). Categories: `audit.*`, `check.*`, `score.*`, `llms_txt.*`, `rewrite.*`, `extract.*`, `diff.*`, `report.*`. Update any saved invocations.
61+
- **Breaking: tool rename to dot-notation.** All tools migrated from flat snake_case (`audit_page`, `check_robots`, …) to a navigable dot-notation tree (`audit_page`, `check_robots`, …). Categories: `audit.*`, `check.*`, `score.*`, `llms_txt.*`, `rewrite.*`, `extract.*`, `diff.*`, `report.*`. Update any saved invocations.
5662

5763
### Added
5864

5965
- **`outputSchema` (Zod) on every tool** — callers can type-check responses; hosts can reason about return shape before calling. Returns now also surface `structuredContent` alongside the legacy `content` text block.
6066
- **MCP `annotations` on every tool**`title`, `readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`. Hosts use these to decide whether to auto-approve a call, prompt the user, or block.
61-
- **`.describe()` on every input parameter** that lacked one (`audit.site`, `report.save`) — input schemas are now fully self-documenting.
67+
- **`.describe()` on every input parameter** that lacked one (`audit_site`, `report_save`) — input schemas are now fully self-documenting.
6268

6369
### Migration
6470

6571
- `server.tool()``server.registerTool()` throughout.
6672
- Rename map (use sed/IDE find-replace on any saved configs):
67-
`audit_page → audit.page`, `audit_schema → audit.schema`, `audit_canonical → audit.canonical`,
68-
`audit_site → audit.site`, `audit_sitemap → audit.sitemap`,
69-
`check_robots → check.robots`, `check_sitemap → check.sitemap`, `check_technical → check.technical`,
70-
`score_ai_overview_eligibility → score.ai_overview_eligibility`, `score_citation_worthiness → score.citation_worthiness`, `test_citation → score.test_citation`,
71-
`generate_llms_txt → llms_txt.generate`, `validate_llms_txt → llms_txt.validate`,
72-
`rewrite_for_aeo → rewrite.aeo`, `rewrite_for_geo → rewrite.geo`,
73-
`extract_entities → extract.entities`, `diff_pages → diff.pages`, `save_audit_report → report.save`.
73+
`audit_page → audit_page`, `audit_schema → audit_schema`, `audit_canonical → audit_canonical`,
74+
`audit_site → audit_site`, `audit_sitemap → audit_sitemap`,
75+
`check_robots → check_robots`, `check_sitemap → check_sitemap`, `check_technical → check_technical`,
76+
`score_ai_overview_eligibility → score_ai_overview_eligibility`, `score_citation_worthiness → score_citation_worthiness`, `test_citation → score_test_citation`,
77+
`generate_llms_txt → llms_txt_generate`, `validate_llms_txt → llms_txt_validate`,
78+
`rewrite_for_aeo → rewrite_aeo`, `rewrite_for_geo → rewrite_geo`,
79+
`extract_entities → extract_entities`, `diff_pages → diff_pages`, `save_audit_report → report_save`.
7480

7581
## [0.3.4] - 2026-05-18
7682

README.md

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -134,27 +134,27 @@ The Action builds the auditor from the pinned ref, runs `audit_page` on each URL
134134

135135
| Tool | Purpose |
136136
|------|---------|
137-
| `audit.page` | Composite AI-SEO audit with 8-dimension scoring (schema, technical, structure, robots, freshness, authority, entity density, sitemap). |
138-
| `audit.schema` | Validate JSON-LD against Schema.org rules and AI-citation best practice. Flags deprecated patterns. |
139-
| `audit.canonical` | Canonical link integrity, trailing-slash hygiene, `og:url` consistency. |
140-
| `audit.site` | Single-call site sweep: `audit.page` + `check.robots` + `check.sitemap` + `audit.schema` with overall grade and top-5 fixes. |
141-
| `audit.sitemap` | Site-wide content audit: stride-sample N URLs from the sitemap, run `audit.page` on each, return distribution + worst pages + top findings. |
142-
| `check.robots` | Parse `robots.txt` and report per-crawler allow/disallow for all known AI crawlers. Surfaces the GPTBot-blocked-but-OAI-SearchBot-allowed trap. |
143-
| `check.sitemap` | Validate XML sitemaps: presence, URL count, `lastmod` freshness, image/video extensions. |
144-
| `check.technical` | HEAD tag audit: canonical, OpenGraph, Twitter Card, hreflang, HTTPS, noindex, title hygiene. |
145-
| `score.ai_overview_eligibility` | Score a page's probability of appearing in Google AI Overviews using current correlation factors. |
146-
| `score.citation_worthiness` | Score how citable a page or text block is for Perplexity, ChatGPT, Google AI Overviews, and Claude. Includes per-section `chunk_analysis` / `extractability_score`: how cleanly an LLM can lift a standalone answer from each heading. |
147-
| `score.agentic_browsing` | Score a page against the Lighthouse "Agentic Browsing" category (May 2026): llms.txt, WebMCP, accessibility-tree integrity, and layout stability. |
148-
| `score.test_citation` | Simulate "would an AI engine cite this for this query?" via MCP sampling, with deterministic heuristic fallback. |
149-
| `llms_txt.generate` | Generate `llms.txt` and optionally `llms-full.txt` from a domain's sitemap. |
150-
| `llms_txt.validate` | Lint an existing `llms.txt` for spec compliance and broken links. |
151-
| `rewrite.aeo` | Rewrite content for Answer Engine Optimization (BLUF structure, FAQ format, schema additions). |
152-
| `rewrite.geo` | Rewrite content for Generative Engine Optimization (entity definitions, comparison tables, synthesis-ready structure). |
153-
| `extract.entities` | Extract named entities, `sameAs` links, and citation-density score from a page's content and structured data. |
154-
| `diff.pages` | Compare two URLs for AI citation-worthiness: side-by-side dimension scores, gap analysis, and prioritized fix recommendations for url_a. |
155-
| `report.save` | Render an `audit.page` / `audit.site` result as a Markdown report and write it to disk under `MCP_WORKSPACE_ROOT`. |
156-
157-
> **v0.4.0** renamed tools from flat `snake_case` to dot-notation (`audit.page`, `check.robots`, …) for a navigable hierarchy. Update any saved invocations.
137+
| `audit_page` | Composite AI-SEO audit with 8-dimension scoring (schema, technical, structure, robots, freshness, authority, entity density, sitemap). |
138+
| `audit_schema` | Validate JSON-LD against Schema.org rules and AI-citation best practice. Flags deprecated patterns. |
139+
| `audit_canonical` | Canonical link integrity, trailing-slash hygiene, `og:url` consistency. |
140+
| `audit_site` | Single-call site sweep: `audit_page` + `check_robots` + `check_sitemap` + `audit_schema` with overall grade and top-5 fixes. |
141+
| `audit_sitemap` | Site-wide content audit: stride-sample N URLs from the sitemap, run `audit_page` on each, return distribution + worst pages + top findings. |
142+
| `check_robots` | Parse `robots.txt` and report per-crawler allow/disallow for all known AI crawlers. Surfaces the GPTBot-blocked-but-OAI-SearchBot-allowed trap. |
143+
| `check_sitemap` | Validate XML sitemaps: presence, URL count, `lastmod` freshness, image/video extensions. |
144+
| `check_technical` | HEAD tag audit: canonical, OpenGraph, Twitter Card, hreflang, HTTPS, noindex, title hygiene. |
145+
| `score_ai_overview_eligibility` | Score a page's probability of appearing in Google AI Overviews using current correlation factors. |
146+
| `score_citation_worthiness` | Score how citable a page or text block is for Perplexity, ChatGPT, Google AI Overviews, and Claude. Includes per-section `chunk_analysis` / `extractability_score`: how cleanly an LLM can lift a standalone answer from each heading. |
147+
| `score_agentic_browsing` | Score a page against the Lighthouse "Agentic Browsing" category (May 2026): llms.txt, WebMCP, accessibility-tree integrity, and layout stability. |
148+
| `score_test_citation` | Simulate "would an AI engine cite this for this query?" via MCP sampling, with deterministic heuristic fallback. |
149+
| `llms_txt_generate` | Generate `llms.txt` and optionally `llms-full.txt` from a domain's sitemap. |
150+
| `llms_txt_validate` | Lint an existing `llms.txt` for spec compliance and broken links. |
151+
| `rewrite_aeo` | Rewrite content for Answer Engine Optimization (BLUF structure, FAQ format, schema additions). |
152+
| `rewrite_geo` | Rewrite content for Generative Engine Optimization (entity definitions, comparison tables, synthesis-ready structure). |
153+
| `extract_entities` | Extract named entities, `sameAs` links, and citation-density score from a page's content and structured data. |
154+
| `diff_pages` | Compare two URLs for AI citation-worthiness: side-by-side dimension scores, gap analysis, and prioritized fix recommendations for url_a. |
155+
| `report_save` | Render an `audit_page` / `audit_site` result as a Markdown report and write it to disk under `MCP_WORKSPACE_ROOT`. |
156+
157+
> **v0.4.0** renamed tools from flat `snake_case` to dot-notation (`audit_page`, `check_robots`, …) for a navigable hierarchy. Update any saved invocations.
158158

159159
Environment variables: see [ENV.md](./ENV.md).
160160

0 commit comments

Comments
 (0)