Inklate Docs
For agents

Connect over MCP

Point Claude or any MCP client at Inklate's Streamable HTTP server, authenticate with an API key or OAuth, and call the full tool catalog.

Inklate exposes a Model Context Protocol server so any AI agent — Claude Code, Claude Desktop, Cursor, and other MCP clients — can discover channels, author posts, preflight, schedule, publish, and measure through natural language. The agent drives the same procedures the dashboard uses, so an agent and a human can never diverge.

Endpoint and transport

  • Transport: Streamable HTTP.
  • Production URL: https://api.inklate.com/mcp
  • Local dev: http://localhost:3000/mcp (the server runs on :3000, the web dashboard on :3001).
  • Auth: a bearer token in the Authorization header — either an Organization API key (prefix inklate_) or an OAuth 2.1 access token.

Scheduling and publishing are durable, background operations. create_post and preflight_post work on their own, but a schedule_post or publish_post call fails loudly rather than silently if the durable-execution layer isn’t running — a scheduled ship is never dropped.

Authenticate

Option A — Organization API key

Create a key in the dashboard under Settings → API (see API keys), then pass it as a bearer token. A key is bound to exactly one organization, so tools act on that organization with no further selection.

Option B — OAuth 2.1

Instead of a pasted key, a client can sign the user in through the browser — Inklate is a full OAuth 2.1 provider with dynamic client registration, PKCE, and a consent screen. Connect the server with no auth header; the first unauthenticated call returns 401 with a WWW-Authenticate header that kicks off discovery and the browser handshake.

An OAuth connection is not pinned to one organization. Tools act on your active organization by default; pass an organization slug argument (from list_organizations) to target a specific one. Every tool accepts this optional organization argument — it is needed only on the OAuth door.

claude.ai and Claude Desktop custom connectors require a public HTTPS URL. Local CLI clients (Claude Code, MCP Inspector) can use localhost because their OAuth callback is a local port.

Client configuration

Claude Code (CLI), API key:

claude mcp add inklate https://api.inklate.com/mcp -t http \
  -H "Authorization: Bearer inklate_XXXXXXXX"
claude mcp list          # inklate should show connected

Claude Code (CLI), OAuth — add with no header; the 401 starts the flow:

claude mcp add inklate https://api.inklate.com/mcp -t http
# then in a session:  /mcp  → Authenticate → completes in the browser

Cursor / Claude Desktop (mcp.json / MCP config):

{
  "mcpServers": {
    "inklate": {
      "url": "https://api.inklate.com/mcp",
      "headers": { "Authorization": "Bearer inklate_XXXXXXXX" }
    }
  }
}

Tool catalog

The tools are grouped by what they are for. Every tool takes an optional organization slug (needed only on the OAuth door).

Discover

ToolWhat it does
list_organizationsOrganizations (brands/clients) you can act in, with slug and your role. Pass a slug as organization to other tools.
list_channelsPublishable destinations connected to the organization plus their connection health. Posts target channels by id.
get_capabilitiesWhat each channel can do right now (a publish verdict, with the reason when blocked — missing scope, disconnected, unsupported) plus every provider’s manifest (text limits, metrics, platform_options schema).

Author

One Story fans out into per-channel Renditions. Write the Story once; each placement’s rendition is adapted from it unless you supply an explicit variants entry.

ToolWhat it does
create_postCreate a draft. Supply content (a Story doc or markdown) for cross-platform authoring, or body for plain text; target via placements (channel + format) or channel_ids. Also takes variants, idempotency_key, per-channel platform_options, and ordered media_handles.
update_postEdit a draft / scheduled / failed post’s content/body, placements/channel_ids, or authored variants. Changing targets re-materializes renditions; a content change after approval re-enters the approval pipeline. Published posts are immutable.
preflight_postFit-check a draft with no persistence: per-placement publishability (reachability → scopes → content) plus adapt warnings and lengths. Run before schedule/publish.
apply_fixApply a machine-readable repair from preflight_post’s refusal.fixes to one placement’s rendition: trim_to_fold (over-length text), rebalance_thread (too many/long items), or crop_to (image aspect). Returns the refreshed verdict.
sync_variantsCopy from the Story (default) or a Rendition into target Renditions, scoped copy / assets / both. Overwrites — check wasEdited on the response before re-syncing edited targets.

Media

ToolWhat it does
upload_mediaUpload an image by public https url (preferred) or inline base64; returns a med_… handle in the uploaded state. Images only for now.
get_mediaPoll an asset’s status (uploaded → processing → ready | rejected | failed), dimensions, scan status, and variants — before attaching or publishing.

Schedule and publish

ToolWhat it does
schedule_postSchedule (or reschedule) the whole post for a future instant; the pipeline publishes it automatically.
schedule_placementsPer-placement scheduling: a default fire time all placements fall back to, plus per-placement overrides, plus an optional cascade that staggers them N minutes apart.
publish_postPublish immediately (also the failed-post retry path); idempotency_key makes retries replay. Returns a per-platform result envelope, one entry per target channel.
unschedule_postCancel a pending scheduled publish and return the post to draft.
get_job_statusA post’s async journey: overall status plus per-target status / external id / URL / last error — poll after publish or schedule.

Find your content

ToolWhat it does
list_postsPosts plus per-channel targets; filter by status (draft/scheduled/publishing/published/failed) and/or a scheduled-time range.
search_contentFull-text search over your own stored posts (ranked, highlighted snippets, keyset pagination, websearch syntax). Not on-platform search.
list_interactionsIngested comments and mentions on your content, filtered by kind/channel/since.

Skills — durable multi-step workflows

ToolWhat it does
list_skillsDeclarative workflows you can run (e.g. cross_platform_publish), each with its JSON-Schema input — read it before run_skill.
run_skillStart a skill run (async, durable) by name and input; returns a run id.
get_skill_runPoll a skill run: status (running/succeeded/failed/compensated), per-step results, error.

Metrics

ToolWhat it does
get_post_metricsPer-channel totals (impressions, reactions, comments, shares, clicks) plus the full snapshot time series for one post.
get_channel_metricsAggregated totals plus per-day engagement across one channel’s published posts, optionally restricted to a time range.

Timestamps must be ISO-8601 with an offset — for example 2026-07-14T09:00:00-07:00 or ...Z. Naive local times are rejected with a corrective error; the agent’s client resolves the user’s timezone and sends the offset explicitly.

Next