One workspace
A token is bound to the workspace it was created in. A site, crawl or report belonging to any other workspace answers 404 — the same answer as one that does not exist.
MrKeyword serves the Model Context Protocol at https://app.mrkeyword.io/mcp — JSON-RPC 2.0 over one HTTP POST, authenticated with a workspace token. Every tool it answers today is a read.
In MrKeyword, open Settings → Connections → API & MCP Tokens and press Create token. The value starts mk_ and is displayed once; MrKeyword stores only its SHA-256 hash, so it cannot show it to you again. Send it as Authorization: Bearer mk_….
A token is bound to the workspace it was created in. A site, crawl or report belonging to any other workspace answers 404 — the same answer as one that does not exist.
Every tool the server answers today performs a read. There is no tool that can edit your site, your workspace, your billing or your Google and Bing connections.
Revoke a token from the same screen and it stops working on the next call. A token also stops working automatically when the person who created it is removed from the workspace, and when its optional expiry passes.
One command, then /mcp inside Claude Code to confirm it connected.
claude mcp add --transport http mrkeyword \
https://app.mrkeyword.io/mcp \
--header "Authorization: Bearer mk_your_token"Settings → Developer → Edit Config, into claude_desktop_config.json, then restart Claude Desktop.
{
"mcpServers": {
"mrkeyword": {
"type": "http",
"url": "https://app.mrkeyword.io/mcp",
"headers": { "Authorization": "Bearer mk_your_token" }
}
}
}.cursor/mcp.json in the project, or ~/.cursor/mcp.json for every project.
{
"mcpServers": {
"mrkeyword": {
"url": "https://app.mrkeyword.io/mcp",
"headers": { "Authorization": "Bearer mk_your_token" }
}
}
}The endpoint is JSON-RPC 2.0 over a single POST. It answers initialize, tools/list and tools/call.
curl -s https://app.mrkeyword.io/mcp \
-H "Authorization: Bearer mk_your_token" \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Replace mk_your_token with the token you just created. The endpoint URL is also printed beside the token when MrKeyword creates it, which is the copy to trust if you are on a different deployment.
This table is generated from the server's own tool definitions, and the build fails if the two disagree — but tools/list on your own token is still the authority, because that is the one that answers you. Read tools work with any token. Action tools change something in the workspace and need a token created with the actions scope.
| Tool | What it returns | Kind |
|---|---|---|
list_sites | Every website in the workspace, with its connected Search Console property and latest totals. | Read |
get_site_summary | Clicks, impressions, CTR and average position for one site, with the period comparison. | Read |
get_daily_issues | Today's highest-priority ranking, technical, sync and cannibalisation issues for one site. | Read |
get_page_keywords | Every query one page is ranking with — which is how you catch the wrong page ranking. | Read |
get_latest_page_audit | The saved page audit: score, ranked recommendations and the structured data found. | Read |
get_page_brief | An evidence-only content brief for a page, built from its Search Console queries and its audit. | Read |
get_work_items | The workspace's list of SEO jobs and the state each one is in. | Read |
research_keyword | A live Google Keyword Planner report for one keyword: volume, trend, ideas and questions. Uses one lookup credit every time. | Read |
bulk_keyword_check | Live Google Keyword Planner volume, estimated difficulty and intent for up to 100 keywords. One lookup credit per 25 keywords. | Read |
get_rankings | Tracked positions, filtered by moved_up, moved_down, top3, top10, not_ranking or wrong_page. | Read |
get_rank_summary | The headline ranking picture: average position, the position bands, and what moved. | Read |
get_keyword_history | One keyword's position, clicks and impressions day by day. | Read |
get_search_queries | Queries the site already appears for, filtered page_one, almost_there or seen_not_clicked. | Read |
get_site_audit | The latest crawl: health score, severity counts and the crawl-over-crawl diff. | Read |
get_audit_issues | Issues from the crawler's 60 checks, with the affected pages and the fix for each. | Read |
get_page_templates | URL templates found in the crawl with their thin and near-duplicate share. | Read |
list_reports | The saved reports in the workspace and their schedules. | Read |
get_report | One report run, section by section, with each number's source. | Read |
get_account_usage | Plan limits and what is left this month: tracked keywords, audit pages, AI audits, scheduled reports, keyword lookups. | Read |
track_keywords | Adds keywords to rank tracking for a site. | Action |
set_target_page | Sets the page a keyword is meant to rank with, which turns on the wrong-page warning. | Action |
add_annotation | Writes a dated note onto the chart, so a jump has its explanation attached. | Action |
start_site_audit | Starts a crawl. It would spend audit pages from the workspace allowance. | Action |
run_report | Runs a saved report and returns the result. | Action |
The server exposes MCP prompts as well as tools, so a client that shows them gives you these as ready-made commands. Each one drives several tools and comes back with the answer written up, not a table dump.
weekly_seo_reviewWeekly rank review for one site: what moved, what needs attention, and five actions for this week.
fix_my_top_issuesWalk the latest site crawl: what is broken, grouped by category, with concrete fix steps per issue.
find_keyword_opportunitiesTurn near-miss Search Console queries into a prioritised list, sized with live Google Keyword Planner volume when you agree to spend lookups.
client_reportWrite a client-ready SEO report for one site from rankings, search queries and the latest site audit.
Every token can call the 19 read tools. It sees one workspace's data and nothing else: a site, crawl or report belonging to another workspace answers as though it does not exist.
Only a token created with “Allow this token to make changes” ticked — the actions scope — can call the 5 action tools. An existing token cannot gain it later, a viewer cannot create one at all, and every action a token takes is written to the workspace audit log under the person who minted it.
A token without it that calls an action tool is refused with an error that names the tool and tells you to create a new token with “Allow this token to make changes” ticked — it never fails silently.
POST to https://app.mrkeyword.io/mcp. It answers initialize, ping, tools/list, tools/call, prompts/list and prompts/get, and negotiates protocol versions 2025-06-18, 2025-03-26 and 2024-11-05. JSON-RPC batches are answered in one array. GET and DELETE return 405: there is no server-initiated SSE stream and no session to keep alive, because the server has nothing to push.tools and prompts, both without listChanged. There is deliberately no resources capability, because there are no resources — declaring one would only make your client call resources/list and get an error.Retry-After header and a message saying how long to wait. Separately, the tools that spend something spend it in the product, not at the protocol: start_site_audit uses audit pages and track_keywords uses tracked-keyword slots. Your plan sets those allowances.-32001 and a WWW-Authenticate header. An unsupported method answers -32601; a bad argument, an unknown tool or a refused scope answers -32602. A tool that fails for an ordinary reason — no crawl yet, keyword not tracked — comes back as a normal MCP tool error with the reason in it, so your assistant can correct itself instead of treating it as a transport fault.as_of date, so stale data is visible rather than implied to be current, and each figure says where it came from. The server's own initialize instructions tell your assistant the same things this website does: positions are period averages from the connected property and never live SERP ranks, and search volume comes only from research_keyword and bulk_keyword_check, fetched live from Google Keyword Planner and paid for with lookup credits, while difficulty and intent are MrKeyword estimates./api accept the same Authorization: Bearer mk_… header, so a script that already speaks HTTP does not need an MCP client at all.A reference page is a promise, so these are the gaps rather than a list we hope you do not check.
POST per call. A GET to the endpoint is a 405, on purpose.Create one in Settings → Connections, paste one line, and ask your assistant a question. Free to start, no credit card.