01
Claude Code
Register HumanPost as a user-level Streamable HTTP server.
claude mcp add --scope user --transport http humanpost https://us-central1-clickbaitcarousel.cloudfunctions.net/mcp --header "Authorization: Bearer YOUR_API_KEY"Connect Claude, Cursor, or any Streamable HTTP MCP client.
The HumanPost MCP server turns publishing, content-tagging, account, queue, analytics, and usage operations into structured tools that compatible AI clients can discover and call.
Create an API key in the dashboard →Server URL
https://us-central1-clickbaitcarousel.cloudfunctions.net/mcpAuthentication
Send your API key as the HTTP header Authorization: Bearer YOUR_API_KEY. The server does not use browser login sessions.
Verifies authentication, tool discovery, company, and scopes. The key is cleared after the test.
Create a key with the tools' required scopes, replace YOUR_API_KEY, and restart the client if it does not discover tools immediately.
01
Register HumanPost as a user-level Streamable HTTP server.
claude mcp add --scope user --transport http humanpost https://us-central1-clickbaitcarousel.cloudfunctions.net/mcp --header "Authorization: Bearer YOUR_API_KEY"02
Add HumanPost as a custom connector in Claude.
URL: https://us-central1-clickbaitcarousel.cloudfunctions.net/mcp
Authorization: Bearer YOUR_API_KEY03
Add this server entry to your Cursor mcp.json file.
{
"mcpServers": {
"humanpost": {
"url": "https://us-central1-clickbaitcarousel.cloudfunctions.net/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}04
Use Streamable HTTP transport and send the API key on every request.
{
"name": "humanpost",
"transport": {
"type": "streamable-http",
"url": "https://us-central1-clickbaitcarousel.cloudfunctions.net/mcp"
},
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}The catalog and schemas are generated from the running tools. MCP tools/list includes input and output schemas, required scopes, and read/write annotations. Tool failures return isError plus structuredContent.error with requestId, field details, and retryability. Keep idempotency keys and payloads unchanged when retrying.
These focused publishing tools enforce the API key's scopes on every call. A client can discover a tool even when the current key cannot run it.
| Tool | What it does | Required scope |
|---|---|---|
| list_task_types | Use when the user needs supported HumanPost comment or engagement task types, inputs, costs, or availability. Discover comment and Amplify inputs, credit costs, availability and blockers. Optionally inspect a company account. Worker business hours apply; review remains with HumanPost. Requires tasks:read. | tasks:read |
| create_task | Use when the user authorizes a human operator to comment on a social post or to repost, like, and comment on it. Create an exact Comment or one Amplify request containing Repost + Like and Comment. Requires idempotencyKey; keep payload unchanged for retries. No worker or payout overrides. Creation reserves one credit. Requires tasks:write. | tasks:write |
| list_tasks | Use when the user wants to browse their company’s HumanPost comment or engagement requests. List company-visible requests and effective status. Operational Amplify children and comment replacements are embedded in the original task. Follow nextCursor even after an empty filtered page. Requires tasks:read. | tasks:read |
| get_task | Use when the user wants the progress of a specific HumanPost comment or engagement request. Read combined Amplify progress or the full bounded comment attempt chain under one stable task ID. Completed means approved; submitted screenshots await review. Requires tasks:read. | tasks:read |
| list_task_events | Use when the user wants the revision history of a specific HumanPost task. Page persisted task revisions; events arrive asynchronously. historyComplete is false for legacy tasks; missing history is not invented. Requires tasks:read. | tasks:read |
| get_task_evidence | Use when the user wants screenshot evidence for a specific HumanPost task. Page current and archived screenshots with expiring signed URLs. Requires company task ownership. URLs are bearer links until expiry; no worker personal data is included. Requires tasks:evidence:read. | tasks:evidence:read |
| cancel_task | Use when the user authorizes cancellation of unfinished HumanPost comment or engagement work. Cancel unfinished Comment or Amplify work while retaining evidence/history. Cancellation cannot undo platform actions. Amplify refunds only before either component is approved. Requires tasks:write. | tasks:write |
| resume_task | Use when the user authorizes retrying blocked repost, like, or comment components of an existing HumanPost engagement request. Resume failed/expired components of an unfinished Amplify bundle on the original account and worker. Approved components stay complete; no additional credit is charged. Requires tasks:write. | tasks:write |
| get_context | Use when the user needs the connected HumanPost company, granted permissions, or supported publishing capabilities. Returns company identity, granted scopes, available tools, and publishing capabilities. Does not change company or permissions. | Job scope / authenticated context |
| list_accounts | Use when the user wants to browse their company’s HumanPost publishing accounts or choose posting targets. Inspect account IDs, eligibility, daily usage, queue depth, and stored profilePictureUrl, bio, and warmupSearchTerms before choosing targets. Setup values may be requested; stored values do not independently verify the live platform profile or completed warm-up. One post can target up to 100 distinct company-owned accounts, including multiple accounts on the same platform. Requires accounts:read. | accounts:read |
| get_account | Use when the user wants details of one company-owned HumanPost publishing account. Read one company-owned publishing account, including stored profilePictureUrl, bio, and warmupSearchTerms. Setup values may be requested; pending profile edits retain previous values until worker approval. This does not independently verify the live platform profile or completed warm-up. Requires accounts:read. | accounts:read |
| get_company_schedule | Use when the user wants their company’s default daily posting windows. Read the company's daily posting windows; account overrides take precedence. Requires accounts:read. | accounts:read |
| update_company_schedule | Use when the user authorizes replacing their company’s default daily posting windows. Replace company windows while preserving account overrides. Example: {schedule:{windows:['08:00','17:00']}}. null restores global rules, not a pause; future dispatches only, in worker-local time, up to four posts/day including make-up posts. Requires accounts:write. | accounts:write |
| get_account_schedule | Use when the user wants an account’s effective posting windows and worker timezone. Read the override, company default, effective windows, source, and worker timezone. Requires accounts:read. | accounts:read |
| update_account_schedule | Use when the user authorizes replacing or clearing one account’s posting-window override. Replace an account's daily worker-local windows. schedule:null restores company inheritance, not a pause. Future dispatches only, up to four posts/day including make-up posts. Requires accounts:write. | accounts:write |
| get_account_queue | Use when the user wants to browse queued posts for a specific publishing account. Page through queued targets. Pass nextCursor back as cursor, even after an empty page. scheduledAfter is an earliest release instant, not a guaranteed posting time. Requires posts:read. | posts:read |
| create_account | Use when the user authorizes requesting a new TikTok or Instagram account through HumanPost. Submits a TikTok or Instagram profile to the human operator setup queue; it does not immediately create a live account. For an uploaded profile picture, use upload_media, complete_upload after a signed PUT, and get_upload_status to obtain the stable url. Compatible direct image URLs are validated and copied into owned assets; Drive viewer pages are rejected. Requires accounts:write. | accounts:write |
| upload_media | Use when the user wants to import an existing image or video into HumanPost. Import a public sourceUrl (auto-completed), or provide filename, contentType and actual sizeBytes for a signed PUT. After PUT with requiredHeaders, call complete_upload. Videos: MP4/MOV, H.264/HEVC, AAC, <=250MB, <=2160x3840, <=60fps; images: JPG/PNG/WebP/HEIC <=50MB. Supported video is not transcoded. Requires posts:write. | posts:write |
| get_upload_status | Use when the user wants the readiness or failure reason of a specific media upload. Inspect pending, ready, or failed uploads and corrective errors. Requires posts:read. | posts:read |
| complete_upload | Use when a requested media upload has finished its signed PUT and needs validation. Validate media after the signed PUT finishes. Ready uploads replay safely. Requires posts:write. | posts:write |
| create_upload_batch | Use when the user wants to import multiple existing images or videos from public media URLs. Start a resumable, ordered import of up to 100 public media URLs. Poll get_job; results retain input indices and per-file errors. Use an idempotencyKey for safe retries. Requires posts:write. | posts:write |
| get_job | Use when the user wants progress or results for a previously started media import, preview render, or analytics report. Poll a batch upload, draft preview, or analytics report. Access requires the job's scope. Completed jobs return their ordered results or report. | Job scope / authenticated context |
| create_post | Use when the user authorizes creating and submitting new video or carousel content to specified publishing accounts. Create one-video or 1–20-image post (Instagram defaults to Reels; feed posts require an explicit choice and company permission) and submit it to up to 100 distinct company-owned accounts, including multiple accounts on the same platform, atomically. Managed approval rules apply unless skipApproval is explicitly requested. For review first, use create_draft. Use idempotencyKey for safe retries; scheduledAfter/expiresAt define a release interval, not exact publication times. Requires posts:write. | posts:write |
| create_draft | Use when the user wants to prepare video or carousel content in HumanPost without submitting it for publication. Prepare a video or carousel without queueing or publishing it. Optional slides keep text editable. Use idempotencyKey for safe retries, then inspect content and request a preview before queue_post. Requires posts:write. | posts:write |
| get_post_content | Use when the user wants a saved post’s media, editable slide text, styles, or artwork version. Read media URLs, slide text/styles, and versionId. Background image URLs expire in 15 minutes. Requires posts:read. | posts:read |
| update_draft | Use when the user authorizes editing an existing unqueued HumanPost draft. Replace draft media or slides, or edit metadata. expectedVersionId detects conflicting artwork edits. Submitted or published posts are rejected. Preview the new version before submitting it. Requires posts:write. | posts:write |
| request_post_preview | Use when the user wants a rendered preview of an existing unqueued draft. Start a durable render of the current unqueued draft version without approving or queueing it. Poll get_job or get_post_preview. Old renders cannot replace newer artwork. Requires posts:write. | posts:write |
| get_post_preview | Use when the user wants the render status or preview URLs for an existing draft. Read the current version's preview URLs and pending/ready/failed status. A preview does not submit a draft. Requires posts:read. | posts:read |
| queue_post | Use when the user authorizes submitting an existing HumanPost draft to specified publishing accounts. Queue an existing draft with ready media to up to 100 distinct company-owned accounts, including multiple accounts on the same platform, atomically. No media creation. Managed approval rules apply unless skipApproval is explicitly requested. Use idempotencyKey for safe retries; scheduledAfter/expiresAt define a release interval. Requires posts:write. | posts:write |
| get_post_status | Use when the user wants a specific post’s publishing progress or published links. Read aggregate and per-account publishing status, release times, and posted URLs. Requires posts:read. | posts:read |
| list_posts | Use when the user wants to browse or filter their company’s HumanPost posts. Page through company posts filtered by account, status, creation date, or content group. Pass nextCursor as cursor, even if a filtered page has no results. Requires posts:read. | posts:read |
| update_post | Use when the user authorizes editing a saved post’s metadata or internal reporting tags. Edit metadata while every target remains editable. contentGroupIds replaces explicit tags and remains editable after publication; [] clears explicit tags while preserving template provenance. Requires posts:write. | posts:write |
| list_content_tags | Use when the user wants their company’s internal content reporting tags and IDs. Read active and archived company tags and stable contentGroupId values. Requires posts:read. | posts:read |
| create_content_tag | Use when the user wants to create an internal reporting tag in HumanPost. Create an optional internal reporting tag; it does not change public captions. Requires posts:write. | posts:write |
| update_content_tag | Use when the user authorizes renaming, recoloring, archiving, or restoring an internal reporting tag. Rename, recolor, archive, or restore a tag. Archiving preserves attribution. Requires posts:write. | posts:write |
| delete_content_tag | Use when the user authorizes permanently removing a custom reporting tag from their company’s posts. Remove a custom tag from all company posts. Archive instead to preserve history. Requires posts:write. | posts:write |
| cancel_post | Use when the user authorizes cancelling queued publishing targets for an existing post. Cancel pre-release targets and report targets already posting, posted, or cancelled as skipped. Published social posts are not deleted. Requires posts:write. | posts:write |
| get_post_analytics | Use when the user wants performance measurements for a specific HumanPost post. Read the latest summary and paginate historical destination observations. Inspect lastUpdated/collectedAt for freshness. Requires analytics:read. | analytics:read |
| get_account_analytics | Use when the user wants the stored performance summary for one publishing account. Read legacy latest-200-post totals with scannedPosts and coverage metadata; use create_analytics_report for complete rollup comparisons. Requires analytics:read. | analytics:read |
| create_analytics_report | Use when the user wants a company performance report or comparisons by period, account, platform, tag, or template. Create a durable company-scoped report of UTC-day growth, previous-period comparison, account/platform/tag/template breakdowns, and top destinations by latest cumulative views. Poll get_job. Requires active V3 rollups; availability and freshness are explicit. Requires analytics:read. | analytics:read |
| get_usage | Use when the user wants their existing HumanPost quotas, usage counters, or remaining credits. Read effective daily caps, counters, plan credits, and the next UTC reset. Requires usage:read. | usage:read |
| get_workspace | Use when the user wants an overview of their connected HumanPost workspace. Read company/account context. includeAssets:true adds a legacy bounded folder/image-pack snapshot; use paginated folder/image tools for efficient complete asset discovery. Requires workspace:read. | workspace:read |
| list_workspace_folders | Use when the user wants to browse or find asset folders in their HumanPost workspace. Page through company folders with optional name search. Follow nextCursor even after an empty search page. Requires workspace:read. | workspace:read |
| list_workspace_images | Use when the user wants to browse or find saved images in a specific HumanPost folder. Page through available images in a company-owned folder, optionally searching labels, descriptions, or tags. Requires workspace:read. | workspace:read |
| get_workspace_media_urls | Use when the user needs temporary download links for selected images owned by their HumanPost company. Resolve company-owned images to signed download URLs valid for 60–3600 seconds. Caller-supplied storage paths are never accepted. Requires media:read. | media:read |
create_post accepts 1–20 image upload IDs for a carousel; their upload order is the slide order.
list_accounts({platform: "tiktok"})
get_account({accountId: "ACCOUNT_ID"})Requires accounts:read. Both tools include stored profilePictureUrl, bio (strings or null), and warmupSearchTerms (an array, empty when absent). Setup placeholders contain requested values; pending profile edits retain previous values until worker approval. These fields let GIMI display and compare stored configuration without independently verifying the live social profile or completed warm-up. create_accountstill accepts warmup.searchTerms (1–5 terms); longer historical lists remain readable.
Use create_draft, get_post_content, and update_draft with expectedVersionId to edit slide text and styles. request_post_preview renders the current version without approving or queueing it. Poll get_job, inspect get_post_preview, then queue_post. A later artwork edit invalidates the preview.
create_draft({media:["UP1","UP2"],idempotencyKey:"launch-draft-1"})
get_post_content({postId:"POST_ID"})
request_post_preview({postId:"POST_ID",idempotencyKey:"launch-preview-1"})
get_job({jobId:"JOB_ID"}) // poll until complete
get_post_preview({postId:"POST_ID"}) // inspect mediaUrls and status: ready
queue_post({postId:"POST_ID",accountIds:["ACCOUNT_ID"],idempotencyKey:"launch-submit-1"})create_upload_batch imports up to 100 URLs with persisted ordered results and per-file errors. create_analytics_report compares UTC-day growth across equal periods, groups by account, platform, tag or template, and ranks destinations by latest cumulative views. Both return a jobId for get_job. Reports expose collection freshness and coverage; dates are UTC midnight, from inclusive to exclusive. Missing observations do not mean zero performance.
Content tags are optional internal reporting groups. They appear beside template attribution in analytics, but never change the public caption or the content sent to a social platform.
# Create a reusable company tag; keep the returned contentGroupId.
create_content_tag({ name: "Launch", color: "blue" })
→ { contentGroupId: "tag:abc123", ... }
# Add it when creating a post.
create_post({ media: ["UPLOAD_ID"], accountIds: ["ACCOUNT_ID"], contentGroupIds: ["tag:abc123"] })
# Replace the post's tags at any time, including after publishing.
update_post({ postId: "POST_ID", contentGroupIds: ["tag:abc123", "tag:def456"] })
# Remove every explicit tag.
update_post({ postId: "POST_ID", contentGroupIds: [] })Use get_company_schedule and update_company_schedule for the company default, or get_account_schedule and update_account_schedule for an individual account. Read tools need accounts:read; changes need accounts:write. Set schedule: null to restore inheritance. See Scheduling posts for window selection, examples, and missed-post behavior.
You
Upload these 3 videos and spread them across my accounts over the next week. Use the launch caption and trending sound.
Agent
I'll check your ready accounts and queue capacity, upload each video, then create the scheduled posts.
Tools
get_context → list_accounts → upload_media × 3 → create_post (scheduledAfter + idempotencyKey) × 3 → get_post_status × 3
Agent
Done. Three posts are queued with different scheduledAfter dates across seven days. Each becomes eligible for a worker-local posting window after its release date; exact posting times are not guaranteed. I included each post ID for tracking.
Ask for the outcome, not the API calls. A capable agent can inspect your accounts, sequence the right tool calls, and return the IDs you need for follow-up.
The key is missing, malformed, or revoked. Confirm the header starts with “Bearer ccb_live_” and rotate the key if its secret was lost.
The tool needs a permission the key does not have. Create a new key with the scope shown in the tools table, then update the client configuration.
Use a public HTTPS source URL and a supported video or image. Wait for processing before creating a post, and keep carousels between 2 and 20 images.
A version_conflict means artwork changed: read get_post_content and merge your edit into its current versionId. For idempotency_conflict, reuse the original payload or choose a new key for a different operation. Include requestId when asking for support.
Poll get_job with the returned jobId until complete. Use get_post_preview only after rendering completes, and submit only a ready current preview. Partial import results retain indices; reuse successful uploads and retry failed items as a new batch.