npm @automatelab/seo-performance-mcpstdioMITupdated 3mo ago
Know which blog posts to refresh, expand, merge, or kill - without guessing.
¿Qué puedes hacer con SEO Performance MCP?
seo-performance-mcp
Know which blog posts to refresh, expand, merge, or kill - without guessing.
A 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.
What it does
seo-performance-mcp unifies post-publish signals from every channel you already pay for:
- Google Search Console - clicks, impressions, CTR, position, top queries
- Matomo or GA4 - visits, dwell time, bounce rate
- Microsoft Clarity - scroll depth, rage clicks, dead clicks
- AI citation tracking - which LLMs cite your URL today vs. last month
- Sitemap / CMS - publish dates, tags, word counts (any platform via XML sitemap; optional Ghost integration for richer metadata)
It then runs a deterministic rule engine over those signals and emits a verdict per URL:
refresh/expand/merge/kill/double_down/hold
with reason codes, evidence, and a 0-1 confidence score. Reporting only - the server never mutates your posts.
Why it matters
Most 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.
This MCP closes the loop:
- One question, one URL in, one verdict out.
- Same logic across the whole cohort, so the ranking is comparable.
- All decisions traceable to numeric thresholds you can pin in
src/verdict/rules.ts. - AI clients (Claude, Cursor, MCP hosts) can drive the entire content audit in plain English.
Who it's for
- Content marketers running a blog of 50+ posts and tired of guessing what to refresh.
- SEO consultants doing audits who want a portable, deterministic scoring layer instead of bespoke spreadsheets.
- AI-first content teams wiring up rewrite agents - this MCP is the upstream signal layer.
- Indie publishers on Ghost, WordPress, Hugo, Astro, Next, Webflow, or any CMS that exposes a sitemap.
What you get
After one cohort run you have:
- A ranked table of every post with a verdict and confidence score.
- A markdown brief per "refresh" URL: numbers + top queries + suggested actions an editor (or a writing agent) can act on immediately.
- A list of "quick wins": queries sitting at positions 5-15 with below-expected CTR - the fastest title-rewrite wins on the property.
- A historical AI-citation diff: which LLMs cited you and stopped.
Install
npx -y @automatelab/seo-performance-mcp
In a Claude, Claude Code, or Cursor MCP config:
{
"mcpServers": {
"seo-performance": {
"command": "npx",
"args": ["-y", "@automatelab/seo-performance-mcp"],
"env": {
"POSTS_SITEMAP_URL": "https://example.com/sitemap.xml",
"GSC_SERVICE_ACCOUNT_JSON": "<base64-encoded service-account JSON>",
"GSC_SITE_URL": "sc-domain:example.com",
"MATOMO_URL": "https://example.com/analytics",
"MATOMO_TOKEN": "...",
"MATOMO_SITE_ID": "1",
"GA4_PROPERTY_ID": "123456789",
"GA4_SERVICE_ACCOUNT_JSON": "<base64-encoded service-account JSON>",
"CLARITY_PROJECT_ID": "...",
"CLARITY_API_TOKEN": "...",
"CITATION_INTELLIGENCE_URL": "https://citation.example.com"
}
}
}
}
Every 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.
Platform integration
Point it at any site, no CMS plugin required. The post-discovery layer resolves in priority order:
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.- Ghost Admin API - if both
GHOST_ADMIN_API_URLandGHOST_ADMIN_API_KEYare set, Ghost is used as a richer metadata source. Optional. - HTML extraction - per-URL
og:title,article:published_time, and JSON-LDdatePublishedare read live from the URL. - XML sitemap - set
POSTS_SITEMAP_URLto your sitemap (or sitemap index) and the server enumerates posts from<loc>+<lastmod>.
Most 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.
To add a brand-new platform: nothing to build - just point POSTS_SITEMAP_URL at it.
Tools exposed
| Tool | What it returns |
|---|---|
posts_list |
Posts with {url, title, age_days, tags} from sitemap, Ghost, or your POSTS_LIST. |
posts_snapshot |
Per-URL unified rollup for a 30/60/90-day window: GSC + Matomo + GA4 + Clarity + citations + meta. |
posts_decay_curve |
Weekly GSC clicks/impressions/position buckets + a decay/plateau/growth trend label. |
posts_verdict |
Verdict (refresh/expand/merge/kill/double_down/hold) + reason codes + 0-1 confidence. |
posts_refresh_brief |
Markdown brief for a human or downstream LLM editor: numbers, top queries, suggested actions. |
cohort_report |
Cohort verdict table sorted by priority + confidence. "Which three posts should I refresh this week?" |
posts_cite_loss |
LLM citations that dropped off for a given URL. Needs CITATION_INTELLIGENCE_URL. |
gsc_quick_wins |
(page, query) pairs at positions 5-15 with low CTR - fastest title-rewrite wins. |
Use as a GitHub Action
Run 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.
- uses: AutomateLab-tech/seo-performance-mcp@v1
with:
tool: cohort_report
format: markdown
input: '{"window": 90, "min_age_days": 90, "limit": 20}'
gsc-service-account-json: ${{ secrets.GSC_SERVICE_ACCOUNT_JSON }}
gsc-site-url: ${{ secrets.GSC_SITE_URL }}
posts-sitemap-url: ${{ secrets.POSTS_SITEMAP_URL }}
Outputs:
| Output | Description |
|---|---|
result |
Tool output as a multi-line string (markdown or JSON, per format). |
result-file |
Path of the file the tool output was written to. Hand to peter-evans/create-issue-from-file etc. |
rows |
For cohort_report with format: json only: number of rows returned. |
A complete weekly-audit workflow that opens a GitHub Issue with the cohort report is in examples/weekly-cohort-report.yml.
Use as a one-shot CLI
The package also ships a seo-perf-cli bin so you can run a single tool without an MCP client:
npx -p @automatelab/seo-performance-mcp seo-perf-cli cohort_report \
--input '{"window": 90, "limit": 20}' \
--format markdown
Same env vars as the MCP server. --format markdown is supported for cohort_report and posts_refresh_brief; other tools fall back to fenced JSON.
Companion skills + Cursor rule
Three thin routing files ship in the repo so the LLM in your client knows when to reach for these tools:
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.skills/weekly-audit/SKILL.md- one-shot weekly audit playbook. Composesgsc_quick_wins+cohort_report+posts_cite_lossinto a deduped, cross-signal ranked digest with proposed edits per URL. Drop in alongside the routing skill.cursor/rules/seo-performance.mdc- copy to.cursor/rules/seo-performance.mdcin any Cursor workspace.
All optional. The MCP server works without them; they just shorten the "which tool do I call" round-trip.
MCP prompts
The server exposes three prompts that bundle the playbook. Any MCP client (Claude Desktop, Claude Code, Cursor, Continue) can list and invoke them:
| Prompt | What it runs |
|---|---|
audit_cohort |
cohort_report on posts >=90d, then posts_refresh_brief per refresh/expand/merge row. The weekly audit. |
find_quick_wins |
gsc_quick_wins (positions 5-15) + per-URL posts_snapshot, then proposes verbatim-query meta_title rewrites. |
citation_loss_sweep |
posts_cite_loss per URL, refresh_brief for any with losses, targeted H1/lead phrasing recommendations. |
Verdict engine
Deterministic, rule-based, traceable. Reason codes:
ctr_below_position_expectedposition_driftdecay_30d_over_30pct/decay_60d_over_50pctstagnant_no_clicksthin_content_low_dwellrising_impressions_low_ctr/rising_clicks_continue_investmentcitation_loss/citation_growthduplicate_or_cannibalizinghigh_bounce_low_scrollfresh_post_too_young
The mapping (reasons → verdict) and every threshold lives in src/verdict/rules.ts. Edit it, pin it in tests, ship your own rule book.
Development
npm install
npm run dev # tsx src/index.ts
npm run build # tsc
npm test # vitest
License
MIT
Instalación
Añade SEO Performance MCP a tu cliente. Elige el que uses.
claude mcp add seo-performance-mcp -- npx -y @automatelab/seo-performance-mcpcodex mcp add seo-performance-mcp -- npx -y @automatelab/seo-performance-mcpamp mcp add seo-performance-mcp -- npx -y @automatelab/seo-performance-mcp{
"mcpServers": {
"seo-performance-mcp": {
"command": "npx",
"args": [
"-y",
"@automatelab/seo-performance-mcp"
]
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"seo-performance-mcp": {
"command": "npx",
"args": [
"-y",
"@automatelab/seo-performance-mcp"
]
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
code --add-mcp '{"name":"seo-performance-mcp","command":"npx","args":["-y","@automatelab/seo-performance-mcp"]}'Or add the block manually to `.vscode/mcp.json` under `servers`.
{
"mcpServers": {
"seo-performance-mcp": {
"command": "npx",
"args": [
"-y",
"@automatelab/seo-performance-mcp"
]
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
{
"mcpServers": {
"seo-performance-mcp": {
"command": "npx",
"args": [
"-y",
"@automatelab/seo-performance-mcp"
]
}
}
}Add to `cline_mcp_settings.json` via the MCP Servers panel.
{
"mcpServers": {
"seo-performance-mcp": {
"command": "npx",
"args": [
"-y",
"@automatelab/seo-performance-mcp"
]
}
}
}Add to `~/.gemini/settings.json`.
{
"mcpServers": {
"seo-performance-mcp": {
"type": "local",
"command": "npx",
"args": [
"-y",
"@automatelab/seo-performance-mcp"
],
"tools": [
"*"
]
}
}
}Add to `~/.copilot/mcp-config.json`, or run `/mcp add` inside the CLI.
{
"context_servers": {
"seo-performance-mcp": {
"command": {
"path": "npx",
"args": [
"-y",
"@automatelab/seo-performance-mcp"
]
}
}
}
}Add to your Zed `settings.json`.
npx -y @automatelab/seo-performance-mcpRun `goose configure`, choose **Add Extension → Command-line Extension**, and paste this command.
8 herramientas
SEO Performance MCP expone 8 herramientas a un agente conectado.
- posts_list
- Posts with `{url, title, age_days, tags}` from sitemap, Ghost, or your `POSTS_LIST`.
- posts_snapshot
- Per-URL unified rollup for a 30/60/90-day window: GSC + Matomo + GA4 + Clarity + citations + meta.
- posts_decay_curve
- Weekly GSC clicks/impressions/position buckets + a `decay/plateau/growth` trend label.
- posts_verdict
- Verdict (`refresh/expand/merge/kill/double_down/hold`) + reason codes + 0-1 confidence.
- posts_refresh_brief
- Markdown brief for a human or downstream LLM editor: numbers, top queries, suggested actions.
- cohort_report
- Cohort verdict table sorted by priority + confidence. "Which three posts should I refresh this week?"
- posts_cite_loss
- LLM citations that dropped off for a given URL. Needs `CITATION_INTELLIGENCE_URL`.
- gsc_quick_wins
- `(page, query)` pairs at positions 5-15 with low CTR - fastest title-rewrite wins.
Puntuación
81 / 100
Excelente
- Documentación25/25
- Mantenimiento22/25
- Confianza16/20
- Capacidad6/15
- Instalación12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 85 days ago
- Has a release history
- Repository is not archived
- Licensed MIT
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 8 tool(s) documented
- Provides prompt templates
- Provides resources
- 12 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint — no local install
Historial de versiones
| Versiones | Publicada |
|---|---|
| 1.0.0Última | 8 jun 2026 |
| 0.5.0 | 29 may 2026 |
| 0.4.1 | 28 may 2026 |
| 0.4.0 | 28 may 2026 |