For Developers

The SEO content engine your agent can run

Inbounder exposes a Model Context Protocol (MCP) server so Claude, ChatGPT, Cursor, or your own agents can operate it end-to-end on a user's behalf: build topical content clusters, write articles in the brand voice and send them to WordPress as drafts, monitor rankings and AI-search (GEO) visibility, and draft promo posts for social — which a person posts.

No-card-required free tier. 3 credits, 10 calls/min, 200 calls/day.

60-second quickstart

1

Sign up free

Free tier gets you 3 credits, no card required. Use them in the dashboard or over MCP.

2

Issue a token

Open /settings/api, name your token, pick scopes, and copy the secret (shown once).

3

Wire your agent

Point Claude Desktop, Cursor, or any MCP client at /api/mcp with Authorization: Bearer …

Try it now — no signup needed (tools/list is public)
curl -sX POST https://www.getinbounder.com/api/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | jq

Connect your agent

Streamable HTTP transport, Bearer auth. Replace YOUR_TOKEN with the token from /settings/api.

Claude Code — one command
claude mcp add --transport http inbounder https://www.getinbounder.com/api/mcp \
  --header "Authorization: Bearer YOUR_TOKEN"
Cursor — ~/.cursor/mcp.json
{
  "mcpServers": {
    "inbounder": {
      "url": "https://www.getinbounder.com/api/mcp",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}
Claude Desktop — claude_desktop_config.json (via mcp-remote, needs Node)
{
  "mcpServers": {
    "inbounder": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://www.getinbounder.com/api/mcp",
        "--header",
        "Authorization: Bearer YOUR_TOKEN"
      ]
    }
  }
}

The server also ships MCP prompts (run_full_content_job, weekly_content_ops, fix_underperforming_content) — pre-built workflow recipes your client can invoke via prompts/get so multi-step jobs run with the right tool choreography.

20 tools out of the box

Every tool wraps an existing Inbounder primitive. Org-scoped, scope-gated, credit-metered.

list_clients
free

List every client in your organization with their ids (id, name, domain, industry). Call this first — most other tools take a client_id. Free, no scopes required.

create_client
free

Use this when someone gives you their website and list_clients has no match for it: it adds that site to Inbounder (or returns the existing one with the same domain) and gives back the client_id every later step needs. Find or create a client (brand/site) in your organization and return its client_id. Matches an existing client by website domain first, then by name — so calling it twice for the same site returns the same client (already_existed: true, matched_on: 'domain'|'name') rather than duplicating. ALWAYS pass domain when you know it. Fails with client_limit_reached when the plan's client limit is hit. Clients cannot be merged or deleted through this API, so prefer list_clients and reuse over creating; set allow_duplicate only after a human confirms a second client for the same site is intended.

write:clients
list_articles
free

List articles in your organization (id, title, status, scores, client) — optionally filtered by client_id and/or status, paginated. Returns metadata only, never article bodies. Use to discover article_ids before get_article, generate_article, score_content, or publish_to_target.

read:articles
get_article
free

Use this when someone wants to read a draft before deciding whether to send it to their site. Fetch a single article in full: title, status, keywords, scores, published URL, and the complete content (unless include_content=false; the outline is returned while there is no content yet). Use after list_articles when you need the actual text.

read:articles
list_connections
free

List your organization's active integration connections (WordPress, Google Search Console) with their connection ids, site name/URL, and client scope. Use to pick a connection_id before publish_to_target, or to check whether GSC is connected before get_gsc_performance.

get_credit_balance
free

Return your organization's remaining credit balance (total plus subscription/referral/purchased breakdown; -1 = unlimited), what each tool costs, and today's daily-quota usage. Use before a multi-step workflow to confirm you can afford every paid call. Exempt from daily quotas (the per-minute rate limit still applies).

get_brand_voice
free

Fetch the brand voice profile (tone, ICP, vocabulary, sample patterns) for a specific client. Use before generating any content for that client so the output sounds like them.

read:brand_voice
analyze_brand_voice
1 credit

Use this when someone wants blog posts that sound like their own website: it reads the site and learns how the brand writes, so the drafts match it. Scrape a client's website text (homepage, /about, blog index) and extract a structured brand VOICE profile with Claude: tone, formality, vocabulary, style guidelines, sentence structure, plus the ideal customer profile (ICP) and example phrases. The url must be on the domain of one of your organization's clients (or a subdomain of it) — any other site is rejected with url_not_owned and nothing is charged; use list_clients to see client domains. If save_to_client_id is provided, the profile is persisted to that client's brand voice (created or updated) and approved, so generate_article and generate_social_posts immediately write in it. If that client already has an APPROVED voice it is returned untouched and nothing is charged — pass overwrite: true only when a human has asked for it to be rebuilt, since re-analysis replaces settings a human may have tuned.

write:brand_voice
research_keywords
free

Find target keywords for a topic — a ranked set with search intent and a qualitative difficulty/opportunity read, shaped by your strategy (quick_wins / authority_building / balanced). Use this to plan what to write before create_content_cluster or generate_article. (Difficulty/opportunity are AI estimates; connect a keyword-data provider for hard volume metrics.)

read:articles
create_content_cluster
1 credit

Use this when someone asks you to "turn my website into blog posts" or to plan what to write: it proposes a set of linked blog posts on one topic for their site and saves each one as an outline for them to review before anything is written. Research a topic and design AND persist a topical-authority content cluster for a client: a pillar article plus N interlinked supporting articles, each saved as a real article (status 'outlined') with a title, meta description, target keywords, and outline. Runs the same planner as the app's Research > Cluster flow: keyword research with difficulty/intent/format analysis, then — when the client has an analyzed brand voice — that brand's copywriting framework, highest-commercial-intent-first ordering, and title-length discipline (call analyze_brand_voice first if it has none; without it the plan falls back to a weaker generic one, reported as planner:'basic'). Creates a new project for the client and returns real ids — feed each article_id to generate_article to write the content. Takes ~2-4 minutes; returns an error rather than hanging if it can't finish in time. Never modifies existing projects or articles. Requires client_id (use list_clients).

write:articles
generate_article
1 credit

Use this when someone asks you to "write articles that can rank on Google": it drafts one blog post in the site's own voice for them to read. It does not publish anything, and it cannot promise a ranking. Write a publish-ready SEO article in the client's brand voice for a title/topic + target keyword. Runs the same pipeline as the dashboard's Generate button: AEO structure (quick answer, key takeaways, definitions, FAQ), sourced statistics only, in-body internal links to cluster siblings, the humanization second pass, and a featured image. Returns the article HTML plus AEO + content-quality scores; if an existing article_id is given, the content, meta description, schema data, and hero image are saved back to it (ready to publish_to_target). Expect ~2-3 minutes per article_id call (ad-hoc title+keyword calls are faster but skip humanize/image). The 'write' step of the content engine.

write:articles
review_article
free

Run the SEO review board over a stored article: five deterministic seats (format conformance, intent contradiction, SERP coverage, answer shape, self-grading) plus one LLM substance seat, then AT MOST ONE bounded redline that rewrites only the sections carrying findings and leaves every other section byte-identical. Records the verdict, the findings and the review timestamp on the article. Free, and a second call against the same body returns the recorded verdict without re-running anything. Findings quote the bytes they rest on, and each carries a grounding tier — a finding grounded in our own format rules is labelled as that, never as 'what ranks'. The 'check' step of the content engine: run it after generate_article and before publish_to_target.

write:articles
score_content
free

Score a piece of content against a target keyword. Returns AEO (Answer Engine Optimization — readiness for ChatGPT/Perplexity/Google AI citation) and content quality scores. Useful for evaluating articles written outside Inbounder before publishing.

generate_social_posts
1 credit

Turn an article into channel-ready social promotion — one tailored post per requested platform (LinkedIn, X/Twitter, Instagram, Facebook, Threads), in the brand's voice. Accepts an existing article_id (content is fetched for you) or raw content. Returns the posts synchronously as drafts — nothing is posted anywhere; a person copies and posts them.

write:social
publish_to_target
1 credit

Use this when someone wants to "publish them to WordPress without pasting from a doc": it sends one article straight to their connected WordPress site. The first send creates a draft post that goes live only when they publish it there; sending the same article again overwrites that post. Call it only after the person has read that article and told you to send it. Publish an Inbounder article to a connected destination. Returns the post's URL and target-side ID; a new WordPress post is a draft, so that URL is not a public page until the person publishes it there. Idempotent: republishing an already-published article updates the existing post instead of duplicating it (but still costs 1 credit). Requires write:articles AND publish:wordpress.

write:articles
confirm_distribution
free

Confirm that an article is live at a URL published outside a connected CMS — the manual counterpart to publish_to_target. Records the URL as the article's live location and marks the article published, so Content Health distribution tracking counts it. Idempotent: re-confirming replaces the recorded URL. Inbounder records the URL exactly as confirmed — it does not fetch or verify the page, so only confirm URLs that are actually live. Free.

write:articles
get_gsc_performance
free

Use this when someone asks you to "show me which pages Google already sends traffic to", or which searches find their site: it reads their Google Search Console clicks and impressions (group_by "page" for pages, "query" for searches). Return GSC performance for a client over a date range: clicks, impressions, CTR, and average position, aggregated by query, page, country, or device (group_by). Reads from synced data — requires the client to have GSC connected and the daily sync cron to be active.

read:gsc
get_geo_visibility
free

Use this when someone asks you to "see if ChatGPT and other AI answers mention my site". Tell them plainly what it measures: mention rates come from Claude (web search) and Gemini (Google-grounded) answers; ChatGPT answers are not checked yet. Report AI-search (GEO) visibility for a client or the whole org. Returns TWO separate signals: (1) readiness — how well each article is optimized to be cited by AI answer engines, based on Inbounder's per-article AEO score, with an average, well-optimized/needs-work counts, and a ranked per-article breakdown; (2) measured — actual probe results from Claude (web search) and Gemini (Google-grounded): mention rate WITH sample size (e.g. mentioned in 14 of 42 runs), per-engine splits, top cited source domains, gap domains cited where the brand wasn't, and a third-party source breakdown — what share of citations came from surfaces the brand doesn't own (e.g. review sites, Reddit, editorial), with the top non-owned domains and example URLs. The third-party share is null (never 0%) until citations exist, and is only meaningful for clients with a domain on file — clients_missing_domain counts clients where it isn't, since every citation for those falls into third_party by construction. Measured is null with an explanatory note until probes have run. ChatGPT/Perplexity/Google AI Overviews are not currently probed. Omit client_id for an org-wide report.

read:geo
get_content_health
free

Per-dimension Content Health for one client: Production, Distribution, Keywords, and Maturity — each returned as a state (on_track / attention / too_early / no_data) with a 'why' sentence carrying the real counts it derives from, plus the cited reference bands (source, year, method, confidence) the states lean on. This tool deliberately returns no composite health score: a single blended number would hide which dimension needs work and imply measurement precision the underlying research does not support. Free.

read:articles
sync_site_pages
free

Import a client's sitemap and check which of its pages are live. Reads the client's domain: robots.txt Sitemap lines, then /sitemap.xml, then /sitemap_index.xml (sitemap indexes followed one level). Each listed URL is fetched once with a GET; only a 2xx response after redirects on the client's own domain counts as live — 404s, 5xx, timeouts and off-domain redirects are stored as not verified. Capped at 5,000 URLs per client: `truncated: true` means the sitemap listed more and only the first 5,000 were kept. Large sites finish in the background (a scheduled job continues every 15 minutes and re-syncs weekly); `in_progress` and `remaining` say how far it got. Repeating an identical call within ~15 minutes returns the first result, so wait before checking progress. This only builds the list of live pages — it does not mark articles as published, and get_content_health's live counts do not change from it yet. Requires the client to have a domain. Free.

write:clients

MCP tier limits

TierRate limitDaily callsCreditsSLA
Free10 calls/min200/day3 one-time—
Starter60 calls/min1,000/day10/mobest-effort
Growth120 calls/min3,000/day30/mobest-effort
Advanced240 calls/min10,000/day75/mo99.5% target

Read-only tools (e.g. score_content, get_gsc_performance) don't consume credits — they count against the rate limit and daily quota only. research_keywords is credit-free but LLM-backed, so it has its own daily cap (20/100/250/500 by tier). get_credit_balance is quota-exempt and reports your live usage.

Hashed at rest
SHA-256, timing-safe verify
Scoped tokens
11 scopes, revoke any time
Org-scoped data
No cross-tenant access

Ready to build?

The server describes itself: GET /api/mcp. Discovery manifest at /.well-known/mcp.json.

Questions? See Agents & API in the Help Center.