ChimpanSEO

Generate GEO/AEO-optimized articles and publish them to WordPress from your AI agent.

Should I use this

Quality & Safety

A
Description quality
98%
Schema completeness
85%
Naming quality
95%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,221Tokens (tool definitions)
~1.2 KBTypical response size
Significant attention impact (2.52% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "chimpanseo": {
      "url": "https://chimpanseo.app/api/mcp"
    }
  }
}

Remote endpoints

https://chimpanseo.app/api/mcpstreamable-http

What it can do

Tool inventory

Tools (13)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢list_sites

List the WordPress/Framer/Webflow sites connected to this ChimpanSEO account, with id, name, url, platform and language.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_usage

Check the current plan, monthly article limit, articles used this month and articles remaining — call this before generating to use the quota consciously instead of guessing.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_articles(limit)

List the most recent articles generated on this account, with title, status, site and link.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "default": 10,
      "description": "Max number of articles to return",
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_article(articleId)

Fetch one article's full HTML content and metadata by id — list_articles deliberately omits content to stay compact, use this to actually read what was generated (e.g. after generate_article or refresh_article, or before deciding whether to publish it).

Input Schema

{
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The article id, from list_articles, generate_article or get_generation_status"
    }
  },
  "required": [
    "articleId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢suggest_topics(siteId, count, creativity)

Generates topic suggestions for a site's next articles, using the same logic as the dashboard's topic generator — biased toward an experiment/case-study angle for a share of the results, and informed by the site's differentiators if set, rather than generic keyword-chasing titles. Fast (a few seconds, not a background job) — use this before generate_article or schedule_article instead of inventing topics yourself.

Input Schema

{
  "type": "object",
  "properties": {
    "siteId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "Target site id (from list_sites) — determines language, tone, SEO tags and differentiators used"
    },
    "count": {
      "default": 5,
      "description": "How many topic suggestions to generate",
      "type": "integer",
      "minimum": 1,
      "maximum": 20
    },
    "creativity": {
      "default": 50,
      "description": "0 = safe/proven angles, 100 = more experimental angles",
      "type": "integer",
      "minimum": 0,
      "maximum": 100
    }
  },
  "required": [
    "siteId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢list_scheduled_articles(siteId, limit)

List scheduled_article slots (past and future) — topic, target date, status, site. Use this before schedule_article to see what's already queued and avoid duplicating dates/topics.

Input Schema

{
  "type": "object",
  "properties": {
    "siteId": {
      "description": "Filter to one site's slots only",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢audit_site(siteId)

Fetches the site's homepage and checks the on-page technical SEO factors that matter for both Google and AI citation — title/meta tags, canonical, H1, mobile viewport, HTTPS, Open Graph, JSON-LD structured data, image alt coverage, indexability, response time. Each finding includes a concrete tip, not just pass/fail. Fast (a few seconds) — no background job needed.

Input Schema

{
  "type": "object",
  "properties": {
    "siteId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "Site id, from list_sites"
    }
  },
  "required": [
    "siteId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡generate_article(topic, siteId)

Starts generating a new SEO/GEO-optimized article via AI for a given topic and site. Counts against the account's monthly article quota, same as generating from the dashboard. Does NOT publish it — call publish_article separately once you're happy with it. ASYNC: this returns a jobId immediately, it does NOT wait for the article. Generation typically takes 1-6 minutes (reasoning model, non-streaming) — poll get_generation_status with the returned jobId every ~15-20s until status is "ready" or "error". (Older integrations that awaited this call directly would hit their own client's default request timeout, typically 60s, long before generation finished — this is why it's async now.)

Input Schema

{
  "type": "object",
  "properties": {
    "topic": {
      "type": "string",
      "minLength": 3,
      "description": "The article topic or working title"
    },
    "siteId": {
      "description": "Target site id (from list_sites) — determines language, tone and SEO tags used",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "topic"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢get_generation_status(jobId)

Poll the status of a generate_article or refresh_article call by jobId. Returns status: "pending" (still working), "ready" (done — includes articleId, title, excerpt, charCount), or "error" (includes the error message).

Input Schema

{
  "type": "object",
  "properties": {
    "jobId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The jobId returned by generate_article"
    }
  },
  "required": [
    "jobId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴refresh_article(articleId)

Rewrites an existing article to be current and more SEO/AEO-optimized — updates dates/stats/examples, improves headings, adds a FAQ section, adds 300+ words. Same action as the dashboard's "Migliora & aggiorna" button. If the article is already published to WordPress, the refreshed version is automatically re-published there too (title and WordPress status unchanged); otherwise only ChimpanSEO's own copy is updated. ASYNC: returns a jobId immediately — poll get_generation_status with it, typically ready in 1-4 minutes.

Input Schema

{
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The article id to refresh, from list_articles"
    }
  },
  "required": [
    "articleId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴publish_article(articleId, siteId, status)

Publish (or save as draft) a previously generated article to its WordPress site. Only works for WordPress sites — Framer/Webflow sites are copy-paste only (Beta) and are not supported here.

Input Schema

{
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The article id, from generate_article or list_articles"
    },
    "siteId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The WordPress site id to publish to"
    },
    "status": {
      "default": "publish",
      "type": "string",
      "enum": [
        "draft",
        "publish"
      ]
    }
  },
  "required": [
    "articleId",
    "siteId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
⚪schedule_article(topic, siteId, scheduledFor, publishStatus, dualLanguage)

Schedule a topic to be generated and auto-published at a future date/time on a WordPress site — the same editorial calendar the dashboard uses. Requires a plan with scheduling enabled.

Input Schema

{
  "type": "object",
  "properties": {
    "topic": {
      "type": "string",
      "minLength": 3
    },
    "siteId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "scheduledFor": {
      "type": "string",
      "description": "ISO 8601 date-time in the future, e.g. 2026-08-01T09:00:00Z"
    },
    "publishStatus": {
      "default": "publish",
      "type": "string",
      "enum": [
        "draft",
        "publish"
      ]
    },
    "dualLanguage": {
      "default": false,
      "description": "Also publish an Italian translation alongside the original",
      "type": "boolean"
    }
  },
  "required": [
    "topic",
    "siteId",
    "scheduledFor"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴cancel_scheduled_article(scheduledArticleId)

Removes a slot from the editorial calendar, from list_scheduled_articles. Same as deleting it from the dashboard calendar — works regardless of the slot's current status, so double-check it hasn't already published if that matters (see list_scheduled_articles' wp_post_id/article_id fields).

Input Schema

{
  "type": "object",
  "properties": {
    "scheduledArticleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The slot id, from list_scheduled_articles or schedule_article"
    }
  },
  "required": [
    "scheduledArticleId"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded13 tools