> ## Documentation Index
> Fetch the complete documentation index at: https://rankahead.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Content Tools — Rankahead MCP Reference

> Generate, edit, publish, and manage AI-optimized blog posts via MCP. Configure content settings, personas, and CMS connections for your Rankahead domain.

The content tools give AI agents full control over Rankahead's content generation pipeline. You can generate blog posts from answer gap suggestions, GSC keyword data, or competitor URLs — then edit, publish, and track their search performance. Additional tools let you manage CMS connections, configure tone and style settings, and define the audience persona that shapes generated content.

***

## list\_blog\_posts

Lists all blog posts in your account. You can filter by the prompt they were generated from or by their current status.

<ParamField path="promptId" type="string">
  Optional prompt ID to return only posts generated from a specific prompt.
</ParamField>

<ParamField path="status" type="string">
  Optional status filter. Accepted values: `GENERATING`, `DRAFT`, `PUBLISHED`, `FAILED`.
</ParamField>

<CodeGroup>
  ```json Request — all posts theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "list_blog_posts",
      "arguments": {}
    },
    "id": 1
  }
  ```

  ```json Request — published posts only theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "list_blog_posts",
      "arguments": {
        "status": "PUBLISHED"
      }
    },
    "id": 2
  }
  ```
</CodeGroup>

***

## get\_blog\_post

Returns full content and metadata for a single blog post, including the generated body, title, and associated prompt information.

<ParamField path="blogPostId" type="string" required>
  The ID of the blog post to retrieve.
</ParamField>

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "get_blog_post",
      "arguments": {
        "blogPostId": "blg_04ncp5t3p9fa"
      }
    },
    "id": 3
  }
  ```
</CodeGroup>

<ResponseField name="blogPostId" type="string">
  Unique identifier for the blog post.
</ResponseField>

<ResponseField name="title" type="string">
  The post title.
</ResponseField>

<ResponseField name="content" type="string">
  The full post body in TipTap JSON format.
</ResponseField>

<ResponseField name="status" type="string">
  Current status: `GENERATING`, `DRAFT`, `PUBLISHED`, or `FAILED`.
</ResponseField>

***

## get\_blog\_publish\_status

Returns the CMS publish records for a blog post, showing the publish status per connected CMS integration.

<ParamField path="blogPostId" type="string" required>
  The ID of the blog post to check publish status for.
</ParamField>

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "get_blog_publish_status",
      "arguments": {
        "blogPostId": "blg_04ncp5t3p9fa"
      }
    },
    "id": 4
  }
  ```
</CodeGroup>

<ResponseField name="publishRecords" type="object[]">
  Array of publish records, one per CMS connection, each showing the connection name, status, and published URL if available.
</ResponseField>

***

## generate\_blog\_post

Triggers asynchronous generation of a new blog post. You must choose a generation mode, and some modes require additional parameters.

<ParamField path="domainId" type="string" required>
  The domain to generate the post for.
</ParamField>

<ParamField path="mode" type="string" required>
  Generation mode. Accepted values:

  * `FROM_SUGGESTIONS` — generates from an answer gap suggestion identified by a prompt run
  * `FROM_GSC_KEYWORD` — generates targeting a keyword from your Google Search Console data
  * `FROM_COMPETITOR` — generates from a competitor URL for gap or comparison content
</ParamField>

<ParamField path="promptId" type="string">
  Required when `mode` is `FROM_SUGGESTIONS`. The ID of the prompt whose suggestions to use.
</ParamField>

<ParamField path="promptRunId" type="string">
  Optional specific run ID to pull suggestions from when using `FROM_SUGGESTIONS` mode.
</ParamField>

<ParamField path="keyword" type="string">
  Required when `mode` is `FROM_GSC_KEYWORD`. The GSC keyword to target.
</ParamField>

<ParamField path="competitorUrl" type="string">
  Required when `mode` is `FROM_COMPETITOR`. The competitor page URL to generate content from.
</ParamField>

<ParamField path="title" type="string">
  Optional custom title. If omitted, a title is generated automatically.
</ParamField>

<CodeGroup>
  ```json Request — from suggestions theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "generate_blog_post",
      "arguments": {
        "domainId": "dom_01j9z3k8p4c2x",
        "mode": "FROM_SUGGESTIONS",
        "promptId": "prm_02kxw9a1m7d3y"
      }
    },
    "id": 5
  }
  ```

  ```json Request — from GSC keyword theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "generate_blog_post",
      "arguments": {
        "domainId": "dom_01j9z3k8p4c2x",
        "mode": "FROM_GSC_KEYWORD",
        "keyword": "best crm for startups",
        "title": "The Best CRM Software for Startups in 2025"
      }
    },
    "id": 6
  }
  ```

  ```json Request — from competitor URL theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "generate_blog_post",
      "arguments": {
        "domainId": "dom_01j9z3k8p4c2x",
        "mode": "FROM_COMPETITOR",
        "competitorUrl": "https://rivalcrm.com/blog/crm-for-startups"
      }
    },
    "id": 7
  }
  ```
</CodeGroup>

<ResponseField name="blogPostId" type="string">
  The ID of the newly created blog post. Poll `get_blog_post` until status changes from `GENERATING` to `DRAFT` or `FAILED`.
</ResponseField>

***

## get\_blog\_gsc\_metrics

Returns Google Search Console performance metrics for a published blog post, including clicks, impressions, CTR, and average position.

<ParamField path="blogPostId" type="string" required>
  The ID of the blog post to retrieve GSC metrics for.
</ParamField>

<ParamField path="days" type="number" default="28">
  Lookback window in days. Defaults to `28`.
</ParamField>

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "get_blog_gsc_metrics",
      "arguments": {
        "blogPostId": "blg_04ncp5t3p9fa",
        "days": 28
      }
    },
    "id": 8
  }
  ```
</CodeGroup>

<ResponseField name="clicks" type="number">
  Total organic clicks over the selected period.
</ResponseField>

<ResponseField name="impressions" type="number">
  Total search impressions over the selected period.
</ResponseField>

<ResponseField name="ctr" type="number">
  Average click-through rate as a decimal (e.g. `0.042` for 4.2%).
</ResponseField>

<ResponseField name="position" type="number">
  Average search ranking position over the selected period.
</ResponseField>

***

## update\_blog\_post

Updates the title and/or content of a blog post. Only posts in `DRAFT` status can be edited.

<ParamField path="blogPostId" type="string" required>
  The ID of the blog post to update.
</ParamField>

<ParamField path="title" type="string">
  Updated post title.
</ParamField>

<ParamField path="content" type="string">
  Updated post body as a JSON string in TipTap format.
</ParamField>

<Warning>
  Only `DRAFT` posts can be edited. Attempting to update a `PUBLISHED` post will return an error.
</Warning>

<CodeGroup>
  ```json Request — update title theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "update_blog_post",
      "arguments": {
        "blogPostId": "blg_04ncp5t3p9fa",
        "title": "The Best CRM Software for Early-Stage Startups"
      }
    },
    "id": 9
  }
  ```
</CodeGroup>

***

## delete\_blog\_post

Permanently deletes a blog post and all associated CMS publish records. This action cannot be undone.

<ParamField path="blogPostId" type="string" required>
  The ID of the blog post to delete.
</ParamField>

<Warning>
  Deletion is permanent and removes all publish records for this post across connected CMS integrations.
</Warning>

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "delete_blog_post",
      "arguments": {
        "blogPostId": "blg_04ncp5t3p9fa"
      }
    },
    "id": 10
  }
  ```
</CodeGroup>

***

## publish\_blog\_post

Publishes a blog post to a connected CMS. You must supply both the post ID and the CMS connection ID. Use `list_cms_connections` to retrieve available connection IDs.

<ParamField path="blogPostId" type="string" required>
  The ID of the blog post to publish.
</ParamField>

<ParamField path="cmsConnectionId" type="string" required>
  The ID of the CMS connection to publish to.
</ParamField>

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "publish_blog_post",
      "arguments": {
        "blogPostId": "blg_04ncp5t3p9fa",
        "cmsConnectionId": "cms_09qdr6u4q2gw"
      }
    },
    "id": 11
  }
  ```
</CodeGroup>

***

## list\_cms\_connections

Lists all connected CMS integrations for your account. Use the returned connection IDs with `publish_blog_post`.

This tool takes no input parameters.

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "list_cms_connections",
      "arguments": {}
    },
    "id": 12
  }
  ```
</CodeGroup>

<ResponseField name="connections" type="object[]">
  Array of CMS connections, each with an ID, name, and connection type (e.g. WordPress, Webflow).
</ResponseField>

***

## get\_content\_settings

Returns the content generation settings for a domain, including tone of voice, target audience, value proposition, blocked words, and internal link configuration.

<ParamField path="domainId" type="string">
  Optional domain ID. Defaults to the first domain in your organisation if omitted.
</ParamField>

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "get_content_settings",
      "arguments": {
        "domainId": "dom_01j9z3k8p4c2x"
      }
    },
    "id": 13
  }
  ```
</CodeGroup>

***

## update\_content\_settings

Updates content generation settings for a domain. Only the fields you provide are changed — all fields are optional except `domainId`.

<ParamField path="domainId" type="string">
  Optional domain ID. Defaults to the first domain in your organisation if omitted.
</ParamField>

<ParamField path="valueProp" type="string">
  Value proposition describing what makes the brand unique.
</ParamField>

<ParamField path="targetAudience" type="string">
  Description of the target audience for generated content.
</ParamField>

<ParamField path="toneOfVoice" type="string">
  Writing tone. Accepted values: `PROFESSIONAL`, `CASUAL`, `AUTHORITATIVE`, `FRIENDLY`, `EDUCATIONAL`.
</ParamField>

<ParamField path="contentLanguage" type="string">
  Language code for content generation (e.g. `en`, `fr`, `de`).
</ParamField>

<ParamField path="blockedWords" type="string">
  JSON array string of words to exclude from generated content (e.g. `'["spam","cheap"]'`).
</ParamField>

<ParamField path="internalLinks" type="string">
  JSON array string of internal URLs to include in generated content (e.g. `'["https://example.com/pricing"]'`).
</ParamField>

<ParamField path="competitorDomains" type="string">
  JSON array string of competitor domain URLs to use for content differentiation (e.g. `'["competitor.com"]'`).
</ParamField>

<CodeGroup>
  ```json Request — update tone and audience theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "update_content_settings",
      "arguments": {
        "domainId": "dom_01j9z3k8p4c2x",
        "toneOfVoice": "PROFESSIONAL",
        "targetAudience": "Marketing managers at B2B SaaS companies responsible for pipeline generation"
      }
    },
    "id": 14
  }
  ```

  ```json Request — set blocked words and internal links theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "update_content_settings",
      "arguments": {
        "domainId": "dom_01j9z3k8p4c2x",
        "blockedWords": "[\"cheap\",\"free trial\"]",
        "internalLinks": "[\"https://acmecrm.com/pricing\",\"https://acmecrm.com/features\"]"
      }
    },
    "id": 15
  }
  ```
</CodeGroup>

***

## get\_persona

Returns the audience persona configured for a domain. The persona shapes the reading level, terminology, and examples used in generated content.

<ParamField path="domainId" type="string">
  Optional domain ID. Defaults to the first domain in your organisation if omitted.
</ParamField>

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "get_persona",
      "arguments": {
        "domainId": "dom_01j9z3k8p4c2x"
      }
    },
    "id": 15
  }
  ```
</CodeGroup>

<ResponseField name="name" type="string">
  The persona's name (e.g. "Growth-Stage Founder").
</ResponseField>

<ResponseField name="description" type="string">
  A description of the target audience.
</ResponseField>

<ResponseField name="ageRangeMin" type="number">
  Minimum age in the target range.
</ResponseField>

<ResponseField name="ageRangeMax" type="number">
  Maximum age in the target range.
</ResponseField>

<ResponseField name="educationLevel" type="string">
  Highest education level: `HIGH_SCHOOL`, `BACHELORS`, `MASTERS`, `PHD`, or `SELF_TAUGHT`.
</ResponseField>

***

## upsert\_persona

Creates or updates the audience persona for a domain. If a persona already exists for the domain, it is overwritten.

<ParamField path="name" type="string" required>
  The persona's name (e.g. "Growth-Stage Founder").
</ParamField>

<ParamField path="description" type="string" required>
  A description of the target reader, their goals, and their pain points.
</ParamField>

<ParamField path="domainId" type="string">
  Optional domain ID. Defaults to the first domain in your organisation if omitted.
</ParamField>

<ParamField path="ageRangeMin" type="number">
  Minimum age in the target demographic.
</ParamField>

<ParamField path="ageRangeMax" type="number">
  Maximum age in the target demographic.
</ParamField>

<ParamField path="educationLevel" type="string">
  Highest education level of the target reader. Accepted values: `HIGH_SCHOOL`, `BACHELORS`, `MASTERS`, `PHD`, `SELF_TAUGHT`.
</ParamField>

<CodeGroup>
  ```json Request theme={null}
  {
    "jsonrpc": "2.0",
    "method": "tools/call",
    "params": {
      "name": "upsert_persona",
      "arguments": {
        "domainId": "dom_01j9z3k8p4c2x",
        "name": "Growth-Stage Founder",
        "description": "Founders at Series A/B companies evaluating tools to scale their go-to-market motion. Technical enough to evaluate integrations but focused on business outcomes.",
        "ageRangeMin": 28,
        "ageRangeMax": 45,
        "educationLevel": "BACHELORS"
      }
    },
    "id": 16
  }
  ```
</CodeGroup>
