Workflows, security, and troubleshooting
Example MCP prompts and calls, permission behavior, limits, revocation, and fixes for common failures.
Example prompts
Address a site by exact domain when possible:
List my SearchChamp sites, then summarize the latest ranking movers, AI Visibility, audit findings, and opportunities for example.com. Tell me which data is not set up yet.
For example.com, list draft articles ready to publish. Pull the full content for the strongest one and check it against the site's brand voice before suggesting edits.
List approved Page Optimizer changes for example.com. For each accepted change, show the exact before/after content and selector hints, but do not claim it is applied until the live deployment is complete.
Show the current llms.txt configuration and the latest two versions for example.com, then return their exact diff. Do not generate a new version.
Direct JSON-RPC calls
Most people should let an MCP client negotiate and call tools. For protocol debugging, a bearer-token request looks like this:
export SEARCHCHAMP_MCP_TOKEN='atl_mcp_your_token_here'
curl --fail-with-body 'https://mcp.searchchamp.com/mcp' \
--header "Authorization: Bearer $SEARCHCHAMP_MCP_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_rankings",
"arguments": {
"site": "example.com",
"days": 14,
"limit": 10
}
}
}'A tool response is nested inside the JSON-RPC result:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{ "type": "text", "text": "Rank movers for example.com" }
],
"structuredContent": {
"days": 14,
"movers": []
}
}
}Notifications without an id return HTTP 202 with no body.
Recommended workflows
Start a diagnostic session
OAuth: list_sites → get_site_snapshot → drill into get_rank_movers, get_audit_issues, get_opportunities, or get_ai_visibility.
Token: list_sites → get_rankings and get_ai_visibility; on Business/Pro+, add the catalog's audit, backlink, content-draft, and volatility reads.
Publish from a coding agent
OAuth only:
list_draft_articleswith the site.get_article_contentwith the selected article UUID.get_brand_voiceand optionallyget_page_recommendations.start_publishimmediately before editing/publishing; this creates a 30-minute claim.- Publish to the customer's own repository or CMS.
report_publishwith the article UUID and canonical URL on that site's domain.- Let SearchChamp independently verify the live page.
To have SearchChamp publish through a connected WordPress or Shopify integration, call publish_article and poll get_job. The server may return feature_disabled or a connection/plan refusal; never interpret those as a successful publish.
Apply a Page Optimizer change
list_approved_changes→ selectacceptedorapplied_unverifiedwork.get_change→ use the exact before/after bytes; selector hints are suggestions, not guaranteed selectors.- Edit, test, and deploy the customer's source.
- OAuth only: call
mark_appliedafter the public page contains the deployed change. - SearchChamp re-crawls independently and returns
verifiedorapplied_unverifiedwith a reason.
Generate llms.txt safely
Call get_llms_txt first. If generation is needed, use a stable idempotency_key such as your own job UUID with generate_llms_txt, then poll get_llms_txt_job. Reusing the same key reuses equivalent work rather than creating duplicates.
Security model
- OAuth identity: the access token is signature/issuer/client/expiry verified, the consented organization is recovered server-side, and site access follows the signed-in user's current grants.
- Token identity:
atl_mcp_...is hashed at rest and resolves to one organization plus an optional hard site lock. It is not tied to the minter's future user permissions. - Tenant isolation: every data read carries explicit organization/workspace/site predicates. Foreign and nonexistent IDs receive indistinguishable not-found results where disclosure would leak existence.
- Least privilege: scope checks and token catalog gates run before argument handling and tools. Unknown scopes/tools fail closed.
- Approval boundary: natural-language spending commands are proposed rather than silently run. Publish/apply tools require
mcp:act, and product/CMS enablement gates still apply. - Independent verification:
report_publishandmark_appliedare claims, not proof. SearchChamp fetches the live URL itself before settling verification. - No secrets in logs: never put a token in prompts, arguments, URLs, screenshots, or tickets. Store it in an environment variable or secret manager.
Limits and usage
| Limit | Current default |
|---|---|
| Requests per minute per token | 60 |
| Requests per minute per organization | 600 |
| MCP monthly token-work cap | 15,000 credits per workspace |
Every served tool has a non-zero credit cost shown in the tool reference. The organization-wide monthly usage ceiling applies across MCP and other metered SearchChamp work. Cheap reads are still metered; invalid/denied calls do not debit successful tool work.
Rate-limit failures return HTTP 429 with { "error": "rate_limited", "scope": "token" | "org" }. Pause and retry with backoff. Do not mint multiple tokens to evade a limit.
Errors and fixes
| Symptom | Meaning | Fix |
|---|---|---|
401 plus WWW-Authenticate | Missing/invalid/expired OAuth bearer, or unknown/revoked MCP token | Reconnect OAuth or replace/revoke-remint the token. Confirm Bearer is present. |
402 payment_required | Trial or lapsed-trial organization | Upgrade to a paid plan. |
403 mcp_beta_required | OAuth organization is not allow-listed | Request access under Settings → Connect your AI apps, or use an authorized token path where appropriate. |
429 rate_limited with token | This credential exceeded 60 requests/minute | Back off that client. |
429 rate_limited with org | Combined clients exceeded 600 requests/minute | Coordinate/batch organization traffic. |
JSON-RPC -32700 parse error | Invalid JSON body | Validate JSON and Content-Type. |
unknown tool | Misspelling, OAuth-only tool called by a token, or tool unavailable to that token catalog | Call tools/list and use the exact returned name. |
invalid_input | Wrong/missing field, unknown key, invalid UUID/type, or range violation | Read the tool's live inputSchema; remove extra fields. |
insufficient_scope | Credential lacks the tool's required class | Reauthorize OAuth with the minimum needed scope. User tokens cannot gain OAuth-only scopes. |
upgrade_required | Token plan is below a Business/Pro-only tool floor | Upgrade; plan is evaluated at call time. |
site_not_found | Domain/slug is not addressable by this credential | Call list_sites; check the token's site lock. |
site_ambiguous | A name matched multiple accessible sites | Retry with the exact domain. |
setup_required | No audit, AI Visibility, or other prerequisite data exists | Follow next_step; this is a valid empty state, not a transport error. |
feature_disabled | A write lane is not enabled for the workspace/environment | Use the supported in-app path or contact SearchChamp; do not retry as if it succeeded. |
tool_failed | The handler could not complete without safely exposing internals | Retry once; if persistent, contact support with tool name, time, organization, and request ID—but never the token. |
Client-specific troubleshooting
- OAuth loop: remove the connector from the AI app, add the fresh URL from SearchChamp, and sign in again. Stale sessions on either side are the common cause.
- Tools work but the client cannot see a new one: start a new conversation or reconnect so the client refreshes
tools/list. - Claude Desktop token config fails: confirm Node/npm is installed for
npx mcp-remote, retain the exactAuthorization:${AUTH_HEADER}argument, and restart the desktop app. - Cursor rejects the config: remove
type; Cursor usesurl+headers. - Claude Code/VS Code rejects the config: include
"type": "http". - Codex cannot authenticate: export
SEARCHCHAMP_MCP_TOKENin the same shell that launches Codex and check that the configured bearer-token variable name matches. - Unexpectedly small token catalog: check the current organization plan, token
readversusfullscope, and optional site lock. Token catalogs are intentionally smaller than OAuth.
Revoke access
- OAuth: remove the active connection under Settings → Connect your AI apps. Revocation is immediate; remove the connector from the AI client as a separate cleanup step.
- Token: revoke it under Settings → MCP Tokens. Any later call with that bearer returns unauthorized. Create a replacement because plaintext tokens cannot be recovered.
If a token may have leaked, revoke it first, rotate the consumer, then inspect the token's Last used timestamp and relevant activity/audit logs.