{"_id":"@automatelab/seo-performance-mcp","_rev":"6-47b6d8904fbab7f7434f02ba4161f297","name":"@automatelab/seo-performance-mcp","dist-tags":{"latest":"1.0.0"},"versions":{"0.1.0":{"name":"@automatelab/seo-performance-mcp","version":"0.1.0","keywords":["mcp","seo","analytics","gsc","matomo","ga4","clarity","content-operations","ghost"],"author":{"name":"automatelab.tech"},"license":"MIT","_id":"@automatelab/seo-performance-mcp@0.1.0","maintainers":[{"name":"ratamaha","email":"hello@automatelab.tech"}],"homepage":"https://github.com/AutomateLab-tech/seo-performance-mcp","bugs":{"url":"https://github.com/AutomateLab-tech/seo-performance-mcp/issues"},"bin":{"seo-performance-mcp":"dist/index.js"},"dist":{"shasum":"27e00650cecfff26ed9f635426428225cda09e40","tarball":"https://registry.npmjs.org/@automatelab/seo-performance-mcp/-/seo-performance-mcp-0.1.0.tgz","fileCount":99,"integrity":"sha512-OEBDotC1Thf3wRYvqdzYyfAjruhtUMCz0QsX/zBtZ0g8rUqxbS7+B4guQKEaNMVfYJDKEvnDaqClfEz00MycsQ==","signatures":[{"sig":"MEYCIQCcpOGU4f/0xzYl+sdnDktRTipQAbxBWiDL4zsNNcbJygIhAJDvO2jOEuEgmz7leDcGEF73pUzDjDfT/4/e7L7TMHJi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188130},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"cebfcdf7727e11d01a3672e77b91c26a5751a22d","mcpName":"io.github.AutomateLab-tech/seo-performance-mcp","scripts":{"dev":"tsx src/index.ts","test":"vitest run","build":"tsc","start":"node dist/index.js","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"ratamaha","email":"hello@automatelab.tech"},"repository":{"url":"git+https://github.com/AutomateLab-tech/seo-performance-mcp.git","type":"git"},"_npmVersion":"11.12.1","description":"Post-publish SEO performance MCP. Unifies Google Search Console, Matomo, GA4, Clarity, and AI-citation signals per URL and emits a verdict (refresh / expand / merge / kill / double_down / hold) per post with reason codes.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"3.25.76","undici":"7.25.0","googleapis":"144.0.0","duckdb-async":"1.2.0","fast-xml-parser":"4.5.1","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.22.0","vitest":"3.2.4","typescript":"5.7.3","@types/node":"22.19.19"},"_npmOperationalInternal":{"tmp":"tmp/seo-performance-mcp_0.1.0_1779894479369_0.6452157358958699","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@automatelab/seo-performance-mcp","version":"0.3.0","keywords":["mcp","seo","analytics","gsc","matomo","ga4","clarity","content-operations","ghost"],"author":{"name":"automatelab.tech"},"license":"MIT","_id":"@automatelab/seo-performance-mcp@0.3.0","maintainers":[{"name":"ratamaha","email":"hello@automatelab.tech"}],"homepage":"https://github.com/AutomateLab-tech/seo-performance-mcp","bugs":{"url":"https://github.com/AutomateLab-tech/seo-performance-mcp/issues"},"bin":{"seo-performance-mcp":"dist/index.js"},"dist":{"shasum":"314cf881851c43d4a5f4af622b7d63a3a1d92c69","tarball":"https://registry.npmjs.org/@automatelab/seo-performance-mcp/-/seo-performance-mcp-0.3.0.tgz","fileCount":99,"integrity":"sha512-jem7nYyzOwNSlBIV6n2uOzeDKYeHWmbcYQryVv5AWRc+2USCR5pvaqzfIiro3h5KpygC49daACRDxrQio3uqEw==","signatures":[{"sig":"MEYCIQDKv4exHHBxD5CfZM6dS704kWAH3+4/Mu4hwS8iOhxx9AIhAOQ0NButztdQydgIuo9reMoHzQcX/i+hw5Z/3S/+kB97","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":211640},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"cda59f2a86e33c90d4c51cf509b9a7579a3cc3ab","mcpName":"io.github.AutomateLab-tech/seo-performance-mcp","scripts":{"dev":"tsx src/index.ts","test":"vitest run","build":"tsc","start":"node dist/index.js","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"ratamaha","email":"hello@automatelab.tech"},"repository":{"url":"git+https://github.com/AutomateLab-tech/seo-performance-mcp.git","type":"git"},"_npmVersion":"11.12.1","description":"Post-publish SEO performance MCP. Unifies Google Search Console, Matomo, GA4, Clarity, and AI-citation signals per URL and emits a verdict (refresh / expand / merge / kill / double_down / hold) per post with reason codes.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"3.25.76","undici":"7.25.0","googleapis":"144.0.0","duckdb-async":"1.2.0","fast-xml-parser":"4.5.1","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.22.0","vitest":"3.2.4","typescript":"5.7.3","@types/node":"22.19.19"},"_npmOperationalInternal":{"tmp":"tmp/seo-performance-mcp_0.3.0_1779899484404_0.22368793313506474","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@automatelab/seo-performance-mcp","version":"0.4.0","keywords":["mcp","seo","analytics","gsc","matomo","ga4","clarity","content-operations","ghost"],"author":{"name":"automatelab.tech"},"license":"MIT","_id":"@automatelab/seo-performance-mcp@0.4.0","maintainers":[{"name":"ratamaha","email":"hello@automatelab.tech"}],"homepage":"https://github.com/AutomateLab-tech/seo-performance-mcp","bugs":{"url":"https://github.com/AutomateLab-tech/seo-performance-mcp/issues"},"bin":{"seo-perf-cli":"dist/cli.js","seo-performance-mcp":"dist/index.js"},"dist":{"shasum":"abe4dcffb9c7df27e4daa7b9fe27abd3711da9f6","tarball":"https://registry.npmjs.org/@automatelab/seo-performance-mcp/-/seo-performance-mcp-0.4.0.tgz","fileCount":103,"integrity":"sha512-C+Bcx3oGsNeCB1uvu1oeJkVssS2hhjqOm6dTfGohADi58uM47pxF+dUlkIXLDRbNVuGPzjslLmG+iqA3h/jDhQ==","signatures":[{"sig":"MEYCIQDut7NfqkcdTPZ5dZDJhrAF0L6YT9V8wBIT+SB/rFq5eQIhAMVDitBAjRYRPzNXUkdlqteNkXKBPNLWufXWzO2lKrac","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":228846},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"3ec671652eac02dfcf791c6a84df64a5ab4fd2ef","mcpName":"io.github.AutomateLab-tech/seo-performance-mcp","scripts":{"dev":"tsx src/index.ts","test":"vitest run","build":"tsc","start":"node dist/index.js","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"ratamaha","email":"hello@automatelab.tech"},"repository":{"url":"git+https://github.com/AutomateLab-tech/seo-performance-mcp.git","type":"git"},"_npmVersion":"11.12.1","description":"Post-publish SEO performance MCP. Unifies Google Search Console, Matomo, GA4, Clarity, and AI-citation signals per URL and emits a verdict (refresh / expand / merge / kill / double_down / hold) per post with reason codes.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"3.25.76","undici":"7.25.0","googleapis":"144.0.0","duckdb-async":"1.2.0","fast-xml-parser":"4.5.1","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.22.0","vitest":"3.2.4","typescript":"5.7.3","@types/node":"22.19.19"},"_npmOperationalInternal":{"tmp":"tmp/seo-performance-mcp_0.4.0_1779972001064_0.18754455993032204","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@automatelab/seo-performance-mcp","version":"0.4.1","keywords":["mcp","seo","analytics","gsc","matomo","ga4","clarity","content-operations","ghost"],"author":{"name":"automatelab.tech"},"license":"MIT","_id":"@automatelab/seo-performance-mcp@0.4.1","maintainers":[{"name":"ratamaha","email":"hello@automatelab.tech"}],"homepage":"https://github.com/AutomateLab-tech/seo-performance-mcp","bugs":{"url":"https://github.com/AutomateLab-tech/seo-performance-mcp/issues"},"bin":{"seo-perf-cli":"dist/cli.js","seo-performance-mcp":"dist/index.js"},"dist":{"shasum":"c64bbcb7c96c512b31de185d6e5f0dde753c71ef","tarball":"https://registry.npmjs.org/@automatelab/seo-performance-mcp/-/seo-performance-mcp-0.4.1.tgz","fileCount":103,"integrity":"sha512-OOwkd2Wxcll077ZIYFogHfvi6sLm9L1YtzlrzpqYeJCTPEQPZQwFvRkqwQDcxNoz1yEAzyYZ6ssoPVUX2lBuGw==","signatures":[{"sig":"MEQCICAONF18YplOS80pbHZbLsIX1AtcWBc89N+0otdxSdGoAiBd5JeuWEdb8xI3bgPHt85n9ldVa3ZHxd0TJ0Y4ASF14w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":228821},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"549e92050bdd24c0ae7893b76592f1e4b6f913ef","mcpName":"io.github.AutomateLab-tech/seo-performance-mcp","scripts":{"dev":"tsx src/index.ts","test":"vitest run","build":"tsc","start":"node dist/index.js","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"ratamaha","email":"hello@automatelab.tech"},"repository":{"url":"git+https://github.com/AutomateLab-tech/seo-performance-mcp.git","type":"git"},"_npmVersion":"11.12.1","description":"Post-publish SEO performance MCP. Unifies Google Search Console, Matomo, GA4, Clarity, and AI-citation signals per URL and emits a verdict (refresh / expand / merge / kill / double_down / hold) per post with reason codes.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"3.25.76","undici":"7.25.0","googleapis":"144.0.0","duckdb-async":"1.2.0","fast-xml-parser":"4.5.1","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.22.0","vitest":"3.2.4","typescript":"5.7.3","@types/node":"22.19.19"},"_npmOperationalInternal":{"tmp":"tmp/seo-performance-mcp_0.4.1_1779982972797_0.6128638694466331","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@automatelab/seo-performance-mcp","version":"0.5.0","keywords":["mcp","seo","analytics","gsc","matomo","ga4","clarity","content-operations","ghost"],"author":{"name":"automatelab.tech"},"license":"MIT","_id":"@automatelab/seo-performance-mcp@0.5.0","maintainers":[{"name":"ratamaha","email":"hello@automatelab.tech"}],"homepage":"https://github.com/AutomateLab-tech/seo-performance-mcp","bugs":{"url":"https://github.com/AutomateLab-tech/seo-performance-mcp/issues"},"bin":{"seo-perf-cli":"dist/cli.js","seo-performance-mcp":"dist/index.js"},"dist":{"shasum":"96d184d74155a0889d23640046c22f1c452cdde2","tarball":"https://registry.npmjs.org/@automatelab/seo-performance-mcp/-/seo-performance-mcp-0.5.0.tgz","fileCount":111,"integrity":"sha512-nL3MZV1CFU79fD1sDK8KE3M92SFQutxZK/9GSh97E93eHH1McpcurbKXUt1dOHEM6b7ksarGAZ7j2JuSmGsCjg==","signatures":[{"sig":"MEQCIC2jW2pMA1eZG7L909Cn0o9rT+VvH+QhWCW9Z6X8XUV1AiB+7K8gtCS+Jj4cX7g9oBt7kaJ8JTf+GQzA9v5iEzJsCw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":260521},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"80e4219a324c5d759b2470b786f7c5584c37e376","mcpName":"io.github.AutomateLab-tech/seo-performance-mcp","scripts":{"dev":"tsx src/index.ts","test":"vitest run","build":"tsc","start":"node dist/index.js","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"ratamaha","email":"hello@automatelab.tech"},"repository":{"url":"git+https://github.com/AutomateLab-tech/seo-performance-mcp.git","type":"git"},"_npmVersion":"11.12.1","description":"Post-publish SEO performance MCP. Unifies Google Search Console, Matomo, GA4, Clarity, and AI-citation signals per URL and emits a verdict (refresh / expand / merge / kill / double_down / hold) per post with reason codes.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"3.25.76","undici":"7.25.0","googleapis":"144.0.0","duckdb-async":"1.2.0","fast-xml-parser":"4.5.1","@modelcontextprotocol/sdk":"1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"4.22.0","vitest":"3.2.4","typescript":"5.7.3","@types/node":"22.19.19"},"_npmOperationalInternal":{"tmp":"tmp/seo-performance-mcp_0.5.0_1780057646833_0.3019758433341684","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@automatelab/seo-performance-mcp","version":"1.0.0","mcpName":"io.github.AutomateLab-tech/seo-performance-mcp","description":"Post-publish SEO performance MCP. Unifies Google Search Console, Matomo, GA4, Clarity, and AI-citation signals per URL and emits a verdict (refresh / expand / merge / kill / double_down / hold) per post with reason codes.","license":"MIT","author":{"name":"automatelab.tech"},"homepage":"https://github.com/AutomateLab-tech/seo-performance-mcp","repository":{"type":"git","url":"git+https://github.com/AutomateLab-tech/seo-performance-mcp.git"},"publishConfig":{"access":"public"},"engines":{"node":">=20"},"type":"module","bin":{"seo-performance-mcp":"dist/index.js","seo-perf-cli":"dist/cli.js"},"main":"dist/index.js","scripts":{"build":"tsc","dev":"tsx src/index.ts","start":"node dist/index.js","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit"},"dependencies":{"@modelcontextprotocol/sdk":"1.29.0","duckdb-async":"1.2.0","fast-xml-parser":"4.5.1","googleapis":"144.0.0","undici":"7.25.0","zod":"3.25.76"},"devDependencies":{"@types/node":"22.19.19","tsx":"4.22.0","typescript":"5.7.3","vitest":"3.2.4"},"keywords":["mcp","seo","analytics","gsc","matomo","ga4","clarity","content-operations","ghost"],"gitHead":"ade605f78ffae67bb4f2960716c48d8570d80039","types":"./dist/index.d.ts","_id":"@automatelab/seo-performance-mcp@1.0.0","bugs":{"url":"https://github.com/AutomateLab-tech/seo-performance-mcp/issues"},"_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-utyZu/pRM5yp2KTxP282bIv0ZEu0IhlWIb+LKpxjdHlzVKhFIP0J6MjzyzqHAkmRPMc5JAuvwfunxyuxt/G5SA==","shasum":"3c237134382ecaa8218c150611990c7feedb96c2","tarball":"https://registry.npmjs.org/@automatelab/seo-performance-mcp/-/seo-performance-mcp-1.0.0.tgz","fileCount":111,"unpackedSize":260694,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDtUbap4JtRjKvMt+/zXIjjBYTNUONJoT1w/B0mStAUUAiB8Y99YLkM+vxnWCnUkuDTX4h7mP4fKFwX7/HKBjIcNXw=="}]},"_npmUser":{"name":"ratamaha","email":"hello@automatelab.tech"},"directories":{},"maintainers":[{"name":"ratamaha","email":"hello@automatelab.tech"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/seo-performance-mcp_1.0.0_1780916579164_0.7415256566386192"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-27T15:07:59.223Z","modified":"2026-06-08T11:02:59.427Z","0.1.0":"2026-05-27T15:07:59.545Z","0.3.0":"2026-05-27T16:31:24.635Z","0.4.0":"2026-05-28T12:40:01.216Z","0.4.1":"2026-05-28T15:42:52.960Z","0.5.0":"2026-05-29T12:27:26.970Z","1.0.0":"2026-06-08T11:02:59.308Z"},"bugs":{"url":"https://github.com/AutomateLab-tech/seo-performance-mcp/issues"},"author":{"name":"automatelab.tech"},"license":"MIT","homepage":"https://github.com/AutomateLab-tech/seo-performance-mcp","keywords":["mcp","seo","analytics","gsc","matomo","ga4","clarity","content-operations","ghost"],"repository":{"type":"git","url":"git+https://github.com/AutomateLab-tech/seo-performance-mcp.git"},"description":"Post-publish SEO performance MCP. Unifies Google Search Console, Matomo, GA4, Clarity, and AI-citation signals per URL and emits a verdict (refresh / expand / merge / kill / double_down / hold) per post with reason codes.","maintainers":[{"name":"ratamaha","email":"hello@automatelab.tech"}],"readme":"# seo-performance-mcp\r\n\r\n**Know which blog posts to refresh, expand, merge, or kill - without guessing.**\r\n\r\nA MCP server that turns your scattered SEO and analytics data into one clear verdict per URL. Plug it into Claude, Cursor, or any MCP-aware client and ask: \"Which three posts should I update this week?\" - and get an answer backed by hard numbers.\r\n\r\n## What it does\r\n\r\n`seo-performance-mcp` unifies post-publish signals from every channel you already pay for:\r\n\r\n- **Google Search Console** - clicks, impressions, CTR, position, top queries\r\n- **Matomo** or **GA4** - visits, dwell time, bounce rate\r\n- **Microsoft Clarity** - scroll depth, rage clicks, dead clicks\r\n- **AI citation tracking** - which LLMs cite your URL today vs. last month\r\n- **Sitemap / CMS** - publish dates, tags, word counts (any platform via XML sitemap; optional Ghost integration for richer metadata)\r\n\r\nIt then runs a deterministic rule engine over those signals and emits a verdict per URL:\r\n\r\n> `refresh` / `expand` / `merge` / `kill` / `double_down` / `hold`\r\n\r\nwith reason codes, evidence, and a 0-1 confidence score. Reporting only - the server never mutates your posts.\r\n\r\n## Why it matters\r\n\r\nMost content teams have analytics in five tabs and a gut feeling. That's how good posts rot quietly, mediocre posts get over-promoted, and the obvious \"rewrite this one\" is invisible until traffic has already cratered.\r\n\r\nThis MCP closes the loop:\r\n\r\n- One question, one URL in, one verdict out.\r\n- Same logic across the whole cohort, so the ranking is comparable.\r\n- All decisions traceable to numeric thresholds you can pin in `src/verdict/rules.ts`.\r\n- AI clients (Claude, Cursor, MCP hosts) can drive the entire content audit in plain English.\r\n\r\n## Who it's for\r\n\r\n- **Content marketers** running a blog of 50+ posts and tired of guessing what to refresh.\r\n- **SEO consultants** doing audits who want a portable, deterministic scoring layer instead of bespoke spreadsheets.\r\n- **AI-first content teams** wiring up rewrite agents - this MCP is the upstream signal layer.\r\n- **Indie publishers** on Ghost, WordPress, Hugo, Astro, Next, Webflow, or any CMS that exposes a sitemap.\r\n\r\n## What you get\r\n\r\nAfter one cohort run you have:\r\n\r\n- A ranked table of every post with a verdict and confidence score.\r\n- A markdown brief per \"refresh\" URL: numbers + top queries + suggested actions an editor (or a writing agent) can act on immediately.\r\n- A list of \"quick wins\": queries sitting at positions 5-15 with below-expected CTR - the fastest title-rewrite wins on the property.\r\n- A historical AI-citation diff: which LLMs cited you and stopped.\r\n\r\n## Install\r\n\r\n```bash\r\nnpx -y @automatelab/seo-performance-mcp\r\n```\r\n\r\nIn a Claude, Claude Code, or Cursor MCP config:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"seo-performance\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"@automatelab/seo-performance-mcp\"],\r\n      \"env\": {\r\n        \"POSTS_SITEMAP_URL\": \"https://example.com/sitemap.xml\",\r\n        \"GSC_SERVICE_ACCOUNT_JSON\": \"<base64-encoded service-account JSON>\",\r\n        \"GSC_SITE_URL\": \"sc-domain:example.com\",\r\n        \"MATOMO_URL\": \"https://example.com/analytics\",\r\n        \"MATOMO_TOKEN\": \"...\",\r\n        \"MATOMO_SITE_ID\": \"1\",\r\n        \"GA4_PROPERTY_ID\": \"123456789\",\r\n        \"GA4_SERVICE_ACCOUNT_JSON\": \"<base64-encoded service-account JSON>\",\r\n        \"CLARITY_PROJECT_ID\": \"...\",\r\n        \"CLARITY_API_TOKEN\": \"...\",\r\n        \"CITATION_INTELLIGENCE_URL\": \"https://citation.example.com\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nEvery env var is optional. Adapters that lack their env config skip their slice of the snapshot; the server still boots. The verdict engine works on whatever slices are present.\r\n\r\n## Platform integration\r\n\r\nPoint it at any site, no CMS plugin required. The post-discovery layer resolves in priority order:\r\n\r\n1. **`POSTS_LIST`** - JSON array of `{url, title?, published_at?, tags?, word_count?}`. Use this when you already have a content index and want exact control.\r\n2. **Ghost Admin API** - if both `GHOST_ADMIN_API_URL` and `GHOST_ADMIN_API_KEY` are set, Ghost is used as a richer metadata source. Optional.\r\n3. **HTML extraction** - per-URL `og:title`, `article:published_time`, and JSON-LD `datePublished` are read live from the URL.\r\n4. **XML sitemap** - set `POSTS_SITEMAP_URL` to your sitemap (or sitemap index) and the server enumerates posts from `<loc>` + `<lastmod>`.\r\n\r\nMost users only need `POSTS_SITEMAP_URL`. WordPress, Hugo, Astro, Next.js, Webflow, Framer, Wix, Squarespace, Notion-as-a-site, Substack-mirror sites all expose a sitemap by default.\r\n\r\nTo add a brand-new platform: nothing to build - just point `POSTS_SITEMAP_URL` at it.\r\n\r\n## Tools exposed\r\n\r\n| Tool | What it returns |\r\n|---|---|\r\n| `posts_list` | Posts with `{url, title, age_days, tags}` from sitemap, Ghost, or your `POSTS_LIST`. |\r\n| `posts_snapshot` | Per-URL unified rollup for a 30/60/90-day window: GSC + Matomo + GA4 + Clarity + citations + meta. |\r\n| `posts_decay_curve` | Weekly GSC clicks/impressions/position buckets + a `decay/plateau/growth` trend label. |\r\n| `posts_verdict` | Verdict (`refresh/expand/merge/kill/double_down/hold`) + reason codes + 0-1 confidence. |\r\n| `posts_refresh_brief` | Markdown brief for a human or downstream LLM editor: numbers, top queries, suggested actions. |\r\n| `cohort_report` | Cohort verdict table sorted by priority + confidence. \"Which three posts should I refresh this week?\" |\r\n| `posts_cite_loss` | LLM citations that dropped off for a given URL. Needs `CITATION_INTELLIGENCE_URL`. |\r\n| `gsc_quick_wins` | `(page, query)` pairs at positions 5-15 with low CTR - fastest title-rewrite wins. |\r\n\r\n## Use as a GitHub Action\r\n\r\nRun any of the tools on a cron from CI and post the output to a GitHub Issue, Discussion, or PR. The action is published on the GitHub Marketplace.\r\n\r\n```yaml\r\n- uses: AutomateLab-tech/seo-performance-mcp@v1\r\n  with:\r\n    tool: cohort_report\r\n    format: markdown\r\n    input: '{\"window\": 90, \"min_age_days\": 90, \"limit\": 20}'\r\n    gsc-service-account-json: ${{ secrets.GSC_SERVICE_ACCOUNT_JSON }}\r\n    gsc-site-url: ${{ secrets.GSC_SITE_URL }}\r\n    posts-sitemap-url: ${{ secrets.POSTS_SITEMAP_URL }}\r\n```\r\n\r\nOutputs:\r\n\r\n| Output | Description |\r\n|---|---|\r\n| `result` | Tool output as a multi-line string (markdown or JSON, per `format`). |\r\n| `result-file` | Path of the file the tool output was written to. Hand to `peter-evans/create-issue-from-file` etc. |\r\n| `rows` | For `cohort_report` with `format: json` only: number of rows returned. |\r\n\r\nA complete weekly-audit workflow that opens a GitHub Issue with the cohort report is in [examples/weekly-cohort-report.yml](./examples/weekly-cohort-report.yml).\r\n\r\n## Use as a one-shot CLI\r\n\r\nThe package also ships a `seo-perf-cli` bin so you can run a single tool without an MCP client:\r\n\r\n```bash\r\nnpx -p @automatelab/seo-performance-mcp seo-perf-cli cohort_report \\\r\n  --input '{\"window\": 90, \"limit\": 20}' \\\r\n  --format markdown\r\n```\r\n\r\nSame env vars as the MCP server. `--format markdown` is supported for `cohort_report` and `posts_refresh_brief`; other tools fall back to fenced JSON.\r\n\r\n## Companion skills + Cursor rule\r\n\r\nThree thin routing files ship in the repo so the LLM in your client knows *when* to reach for these tools:\r\n\r\n- `skills/seo-performance/SKILL.md` - tool-routing skill. Drop into `~/.claude/skills/seo-performance/` (or `.claude/skills/` per project) to auto-load in Claude Code. Routes a single question to the right tool.\r\n- `skills/weekly-audit/SKILL.md` - one-shot weekly audit playbook. Composes `gsc_quick_wins` + `cohort_report` + `posts_cite_loss` into a deduped, cross-signal ranked digest with proposed edits per URL. Drop in alongside the routing skill.\r\n- `cursor/rules/seo-performance.mdc` - copy to `.cursor/rules/seo-performance.mdc` in any Cursor workspace.\r\n\r\nAll optional. The MCP server works without them; they just shorten the \"which tool do I call\" round-trip.\r\n\r\n## MCP prompts\r\n\r\nThe server exposes three prompts that bundle the playbook. Any MCP client (Claude Desktop, Claude Code, Cursor, Continue) can list and invoke them:\r\n\r\n| Prompt | What it runs |\r\n|---|---|\r\n| `audit_cohort` | `cohort_report` on posts >=90d, then `posts_refresh_brief` per refresh/expand/merge row. The weekly audit. |\r\n| `find_quick_wins` | `gsc_quick_wins` (positions 5-15) + per-URL `posts_snapshot`, then proposes verbatim-query meta_title rewrites. |\r\n| `citation_loss_sweep` | `posts_cite_loss` per URL, refresh_brief for any with losses, targeted H1/lead phrasing recommendations. |\r\n\r\n## Verdict engine\r\n\r\nDeterministic, rule-based, traceable. Reason codes:\r\n\r\n- `ctr_below_position_expected`\r\n- `position_drift`\r\n- `decay_30d_over_30pct` / `decay_60d_over_50pct`\r\n- `stagnant_no_clicks`\r\n- `thin_content_low_dwell`\r\n- `rising_impressions_low_ctr` / `rising_clicks_continue_investment`\r\n- `citation_loss` / `citation_growth`\r\n- `duplicate_or_cannibalizing`\r\n- `high_bounce_low_scroll`\r\n- `fresh_post_too_young`\r\n\r\nThe mapping (reasons → verdict) and every threshold lives in `src/verdict/rules.ts`. Edit it, pin it in tests, ship your own rule book.\r\n\r\n## Development\r\n\r\n```bash\r\nnpm install\r\nnpm run dev        # tsx src/index.ts\r\nnpm run build      # tsc\r\nnpm test           # vitest\r\n```\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}