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 & publish articles in the brand voice, monitor rankings and AI-search (GEO) visibility, and auto-promote on social.
No-card-required free tier. 3 credits, 10 calls/min, 200 calls/day.
60-second quickstart
Sign up free
Free tier gets you 3 credits, no card required. Use them in the dashboard or over MCP.
Issue a token
Open /settings/api, name your token, pick scopes, and copy the secret (shown once).
Wire your agent
Point Claude Desktop, Cursor, or any MCP client at /api/mcp with Authorization: Bearer …
curl -sX POST https://www.getinbounder.com/api/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | jqConnect your agent
Streamable HTTP transport, Bearer auth. Replace YOUR_TOKEN with the token from /settings/api.
claude mcp add --transport http inbounder https://www.getinbounder.com/api/mcp \ --header "Authorization: Bearer YOUR_TOKEN"
~/.cursor/mcp.json{
"mcpServers": {
"inbounder": {
"url": "https://www.getinbounder.com/api/mcp",
"headers": { "Authorization": "Bearer YOUR_TOKEN" }
}
}
}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.
19 tools out of the box
Every tool wraps an existing Inbounder primitive. Org-scoped, scope-gated, credit-metered.
list_clientsList 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_clientFind 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.
list_articlesList 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.
get_articleFetch 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.
list_connectionsList your organization's active integration connections (WordPress, Webflow, Google Search Console, Zapier) 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_balanceReturn 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_voiceFetch 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.
analyze_brand_voiceScrape a website's 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. 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.
research_keywordsFind 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.)
create_content_clusterResearch 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).
generate_articleWrite 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.
review_articleRun 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.
score_contentScore 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_postsTurn 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. The 'auto-promote' step after publishing.
publish_to_targetPublish an Inbounder article to a connected destination. Returns the published URL and target-side ID. Idempotent: republishing an already-published article updates the existing post instead of duplicating it (but still costs 1 credit). Requires write:articles AND the scope matching the target — publish:wordpress or publish:webflow — so a token granted only one of them cannot publish to the other.
confirm_distributionConfirm 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.
get_gsc_performanceReturn 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.
get_geo_visibilityReport 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.
get_content_healthPer-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.
MCP tier limits
| Tier | Rate limit | Daily calls | Credits | SLA |
|---|---|---|---|---|
| Free | 10 calls/min | 200/day | 3 one-time | — |
| Starter | 60 calls/min | 1,000/day | 10/mo | best-effort |
| Growth | 120 calls/min | 3,000/day | 30/mo | best-effort |
| Advanced | 240 calls/min | 10,000/day | 75/mo | 99.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.
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.