# The MCP server: your campaign, read by your own AI assistant

Your campaign, readable by your own AI assistant: every tool, how to connect Claude Code, Cursor, VS Code or Claude Desktop, and the limits.

## What it is

Every Starter or Growth campaign has an MCP server: a way for your own AI assistant (Claude Code, Cursor, VS Code with Copilot, Claude Desktop) to read the campaign while it works. Ask it in plain words for this week’s results, why the AI answers leave you out, one question in depth, the page drafts, or the site fixes, and it reads them from Oftheard. Working in your site’s code, it can read the site fixes and make each change after showing it to you.

Every tool only reads. Nothing is searched, asked, bought, published or changed through it; the changes are made by you, or by your assistant with your approval, in your site or in Oftheard.

## Making a key

On a campaign, open **Site fixes** and the card **Fix it with your AI assistant**, or **AI assistant (MCP)** on a running campaign, and press **Set it up**. The key looks like `sd_mcp_` and thirty-two letters and digits. There is one key per business; **Make a new key** stops the old one at once, and **Turn it off** stops it altogether. Keep it private: anyone with it can read the business’s campaign and site fixes, though nothing can be changed with it. On an agency’s client, the agency makes the key.

## Connecting your assistant

### Claude Code

In a terminal, in the site’s project folder:

```
claude mcp add --transport http oftheard https://oftheard.in/api/mcp --header "Authorization: Bearer sd_mcp_0123456789abcdef0123456789abcdef"
```

### Cursor

In Cursor Settings, MCP, Add new MCP server, or in ~/.cursor/mcp.json:

```
{
  "mcpServers": {
    "oftheard": {
      "url": "https://oftheard.in/api/mcp",
      "headers": {
        "Authorization": "Bearer sd_mcp_0123456789abcdef0123456789abcdef"
      }
    }
  }
}
```

### VS Code

In the project, as .vscode/mcp.json (Copilot agent mode):

```
{
  "servers": {
    "oftheard": {
      "type": "http",
      "url": "https://oftheard.in/api/mcp",
      "headers": {
        "Authorization": "Bearer sd_mcp_0123456789abcdef0123456789abcdef"
      }
    }
  }
}
```

### Claude Desktop

In Settings, Developer, Edit Config (claude_desktop_config.json); needs Node installed:

```
{
  "mcpServers": {
    "oftheard": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://oftheard.in/api/mcp",
        "--header",
        "Authorization:${AUTH}"
      ],
      "env": {
        "AUTH": "Bearer sd_mcp_0123456789abcdef0123456789abcdef"
      }
    }
  }
}
```

ChatGPT’s connectors need a sign-in flow Oftheard does not offer yet; use one of the four above. Then ask, for example: “Use the oftheard MCP server: catch me up on this week of the campaign. Which questions are we not named for in the AI answers, why, and what should we do first?”

## The tools

12 tools, all read-only. A `week` is a campaign week from 1 to 12; left out, it is the latest week with a run.

| Tool | Arguments | What it returns |
| --- | --- | --- |
| get_campaign | none | The campaign and where it stands: the business and its website, the plan, the setup steps (site ready, AI crawler sensor, questions, first report), its weeks and runs, its questions, places and competitors, and the latest week's catch-up (Google, Bing, AI answers, pages). |
| get_week | week: Campaign week, from 1 (12 a round; an extended campaign goes on to 24 and past). Optional: the latest week with a run. | One week's results: for every question, its Google position, its Bing position (or that Bing misread the search), how many AI answers named the business and the main reason when not, the page of the business it lands on and the state of that page's draft. |
| get_question | question (required): The question exactly as get_week lists it.week: Campaign week, from 1 (12 a round; an extended campaign goes on to 24 and past). Optional: the latest week with a run. | One question in depth for a week: Google's top 10 and its AI Overview, Bing, every AI answer (named or not, who was named instead, the pages it used), why the business is not named, the competitors in those answers, what the top pages have that the business's page lacks, and the searches around it. |
| list_drafts | none | The page drafts of the campaign: each page, its state (ready to approve, needs a fix, approved and to publish, live), the questions it covers and its checks. |
| get_writing_brief | question: A question of the campaign, as get_week lists it: the brief is for the page it lands on. Give this or url.url: The page, as get_week gives it. Give this or question.week: Campaign week, from 1 (12 a round; an extended campaign goes on to 24 and past). Optional: the latest week with a run. | Everything needed to write or improve one page so it can rank and be named: every search that lands on it, the searches around them with monthly volume, the sections the top pages share, the phrases and questions to answer, the words the AI answers use, how long it should be, the business's facts, and the rules to keep. Read this before drafting a page. |
| get_draft | url (required): The page, as list_drafts gives it. | One page draft in full: title, description, H1, each section marked kept, changed or added, the FAQ, what the owner must fill in, what changed, and the HTML to paste into the page. |
| get_trend | question: One question, as get_week lists it. Optional: every question. | How things moved week by week since the starting point: for every question (or one), its Google and Bing position and how many AI answers named the business in each week with a run, and what went up or down. |
| get_next_steps | none | What to do next, in order: drafts to fix, approve or publish, pages that need a draft, pages to keep as they are, sites to get named on, and site fixes, each with the page and the searches it serves. |
| get_competitors | week: Campaign week, from 1 (12 a round; an extended campaign goes on to 24 and past). Optional: the latest week with a run. | Who the business is up against across all its questions in a week: who the AI answers name (named in, share, cited), including names it does not track, and which sites hold Google's top 10 most often. |
| get_outreach_list | week: Campaign week, from 1 (12 a round; an extended campaign goes on to 24 and past). Optional: the latest week with a run. | The sites to get the business named on: the pages the AI answers used that do not mention it, and the list articles and directories in Google's top 10, each with the questions it serves. |
| get_ai_answers | week: Campaign week, from 1 (12 a round; an extended campaign goes on to 24 and past). Optional: the latest week with a run.assistant: Only one assistant. Optional.named: true: only answers that named the business; false: only those that did not. Optional. | The AI answers of a week across every question, filtered by assistant or by whether they named the business: each with the question, who was named instead, a passage of the answer and the pages it used. |
| get_site_fixes | fix: One fix in full, by its id from the list. Optional. | What to change on the website, ready to apply in its code: every check that did not pass, the failing ones first, each with why it matters, the fix, where it goes (`where`), the code to add or change (`code`, with REPLACE markers for values only the owner knows), a note, and outsideCode for work outside the code. |

## Calling it directly

It is JSON-RPC 2.0 over MCP’s Streamable HTTP transport, the stateless part: a POST carries a message and gets a JSON reply, with no connection id and no event stream. Protocol versions 2025-06-18, 2025-03-26, 2024-11-05. List the tools with `tools/list`; call one like this:

```
curl -X POST https://oftheard.in/api/mcp \
  -H "Authorization: Bearer sd_mcp_0123456789abcdef0123456789abcdef" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_week","arguments":{"week":5}}}'
```

The answer is the tool’s result as JSON text.

## Limits

- 30 tool calls a minute and 2,000 a day for each key; the day ends at midnight India time.

- 120 MCP messages a minute, counted separately, so the handshake never eats a question’s allowance.

- The same call asked again within 60 seconds is answered from memory.

- A reply is cut at 1,50,000 characters, and says so.

| Status | Meaning |
| --- | --- |
| 401 | No key as a Bearer token, or a key that is not known (made again, or turned off). |
| 405 | Anything but POST. |
| 429 | Too many messages with this key in the last minute. |

## Elsewhere

A business’s public profile has an open API of its own, for AI agents and apps acting for its customers; it is described with the [business profile](https://oftheard.in/docs/bookings).

All documentation: https://oftheard.in/docs
