Troubleshooting

API and MCP: 401, 402, 403, 429, or a missing tool

What each response means when a key or an MCP client is refused, and the one fix that usually applies: mint a key with the right scope on the right plan.

Updated · 2 min read

401 Unauthorized

No Authorization: Bearer nhm_… header, a revoked or expired key, or a plan below Pro. Keys are re-checked on every request, so a key that worked last month stops the day the plan lapses.

Fix: create a key under Settings, API Keys on a Pro or Enterprise account, and send it as a bearer token.

402 plan_upgrade_required

The endpoint needs a capability the plan does not have: DMARC reports or SEO on Free, Local SEO on Starter, scanner issue reports below Enterprise. The body names required_plan.

Fix: upgrade, or use the read that the plan allows (GET /api/seo-results/policy is open on every plan so you can see what is allowed).

403 Forbidden

One of three things: the key lacks the resource scope for the route; the request mutates state and the key has no write scope (Enterprise only); or the resource belongs to another account.

Fix: mint a key with the scope. A key's scopes cannot be edited after creation.

429 Too Many Requests

The key's hourly rate limit (1,000 by default, up to 10,000 at creation), or a per-plan manual-scan allowance. Retry-After and the body say which and when.

409 idempotency_mismatch

A request_key was reused for a different paid request. Generate a fresh key for a new run, and use get_local_seo_operation to read back the earlier one.

A tool is missing from tools/list

The list is filtered to the key's scopes and the account's plan. A missing tool means a missing scope (or, for write tools, a Pro key or no write). Mint a new key with the scope rather than rewording the prompt.

isError: "read-only"

The tool changes state and the key has no write scope. Live-scan tools count as writes even when they do not modify the target, because they spend allowances and contact upstream providers.

The connection works but Claude says the server has no tools

Check the header is sent exactly as Authorization: Bearer nhm_… (a stray space or a missing Bearer is the usual cause), and that the URL is https://nhmohio.com/api/mcp. Confirm with the tools/list curl in Connecting the MCP server.

Still stuck?

Ask the people who run the scanner.

Send the domain and what you expected to see. We look at the same scan you are looking at and write back with what it means and what to change.