MCP Server
The publishing connector for AI agents. Connect Claude, Cursor, ChatGPT or Muse to Chirpie with one URL and post to X, Bluesky, LinkedIn, Mastodon and Telegram.
Chirpie is the publishing connector for AI agents. It speaks MCP (Model Context Protocol), so any MCP-capable agent can post, thread, schedule and read analytics across every account you connect: X, Bluesky, LinkedIn, Mastodon and Telegram, with Threads, Instagram and Facebook coming soon.
Three ways to connect
- Claude, in one click. Chirpie is listed in the Claude Connectors Directory. Add it from the listing and sign in; there is no URL to paste. Claude Code takes the Chirpie plugin or one
claude mcp addcommand. - Any other AI app, by URL. Add
https://chirpie.ai/mcpand sign in. This is how Chirpie works in ChatGPT developer mode, Meta Muse, Cursor and any client that speaks remote MCP. - On your own machine. The
@chirpie/mcppackage runs the same server over stdio with your Chirpie login. See Running the server locally.
Step-by-step guides for specific agents: Use Chirpie with Claude (claude.ai, Claude Desktop and Claude Code), Use Chirpie with ChatGPT (ChatGPT developer mode and the OpenAI Responses API) and Use Chirpie with Meta Muse.
How do I connect Chirpie to Claude, Cursor, or ChatGPT?
Add this URL as a remote MCP server in your client and sign in when prompted:
https://chirpie.ai/mcpThat is the whole setup. There is nothing to install and no API key to paste. Your client walks you through Chirpie sign-in the first time and remembers it afterwards. If you would rather run the server on your own machine, the @chirpie/mcp package does the same job over stdio; see Running the server locally below.
Client setup
The quickest route is the Chirpie plugin, which bundles the hosted MCP server and the Chirpie skills. Run these two commands inside Claude Code:
/plugin marketplace add Firefloco/chirpie-skills
/plugin install chirpie@chirpie-skillsThe plugin registers https://chirpie.ai/mcp for you and signs you in with OAuth the first time a Chirpie tool runs, so there is no API key to paste. It also installs the Chirpie skills, so Claude already knows the API, the SDK, the CLI, and how scheduling works.
If you only want the MCP server without the skills, add it directly:
claude mcp add --transport http chirpie https://chirpie.ai/mcpThen run /mcp inside Claude Code and pick chirpie to sign in.
Or add it to your project's .mcp.json so your whole team gets it:
{
"mcpServers": {
"chirpie": {
"type": "http",
"url": "https://chirpie.ai/mcp"
}
}
}The quickest route is the Chirpie listing in the Claude Connectors Directory: open it, connect, and sign in to Chirpie. Chirpie then appears among your connectors in claude.ai and Claude Desktop.
To add it by URL instead, in the Claude app (claude.ai or desktop):
- Open Customize → Connectors (in Claude Desktop, Settings → Connectors)
- Click +, then Add custom connector
- Name it
Chirpieand paste the URL:
https://chirpie.ai/mcp- Click Add, then Connect, and sign in to Chirpie in the window that opens.
Team and Enterprise setup, and what the sign-in looks like, are in Use Chirpie with Claude.
Add to .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"chirpie": {
"url": "https://chirpie.ai/mcp"
}
}
}Cursor prompts you to sign in the first time it connects.
- On the web, turn on Developer mode (Settings → Apps → Advanced settings). Posting needs full MCP support, which OpenAI offers on Business, Enterprise and Education; Pro gets read and fetch only.
- Open Settings → Apps → Create, name the app Chirpie and enter the MCP server URL:
https://chirpie.ai/mcp- Leave authentication on OAuth, select Scan Tools, sign in to Chirpie, then Create.
Workspace roles, choosing the app in a chat, which tools ask first, and the OpenAI Responses API are in Use Chirpie with ChatGPT.
Can I use an API key instead of signing in?
Yes. If your client doesn't do OAuth, or you're wiring Chirpie into a script or CI job, send an API key as a bearer token instead:
{
"mcpServers": {
"chirpie": {
"type": "http",
"url": "https://chirpie.ai/mcp",
"headers": {
"Authorization": "Bearer chirpie_sk_your_key_here"
}
}
}
}Create a key in the dashboard. See Authentication for details.
Read only or full access
When you connect an AI app by signing in, Chirpie asks what the app may do, on a Chirpie screen after you sign in:
- Full access (the default): everything the tools below can do, including publishing, scheduling, editing and deleting posts, answering and moderating comments, uploading media and connecting or disconnecting accounts.
- Read only: the app can list your connected accounts, list and read posts, read analytics and read comments, and nothing else. It is offered only
chirpie_list_posts,chirpie_get_post,chirpie_list_accounts,chirpie_analytics,chirpie_list_commentsandchirpie_get_x_keys_status, so it never suggests an action it cannot take.
The choice is part of the connection itself and is enforced by Chirpie on every call, not only by what the app is shown. If a read-only connection asks for something it does not cover, the tool answers insufficient_scope and names the permission it needs (for example posts:write).
To change your mind, disconnect Chirpie in your AI app and connect it again, then choose the other option. A connection made before this choice existed keeps full access. API keys are unaffected: give a key scopes to narrow it, and the MCP server likewise offers it only the tools those scopes cover.
How do I connect a social account from chat?
You don't have to leave your agent to connect a platform. Ask it to connect an account and it returns a link for you to open:
"Connect my X account to Chirpie"
The agent calls chirpie_connect_x, hands you an authorization URL, and once you approve it the account shows up in chirpie_list_accounts.
Can I run the server locally?
Yes. The @chirpie/mcp package runs the same server on your own machine over stdio.
1. Authenticate
npm install -g chirpie
chirpie loginThe local server reads saved credentials from ~/.chirpie/config.json. No API key in your MCP config.
Alternatively, set CHIRPIE_API_KEY as an environment variable (useful for CI/CD or Docker).
2. Configure your client
claude mcp add chirpie -- npx @chirpie/mcpOr add to your project's .mcp.json:
{
"mcpServers": {
"chirpie": {
"type": "stdio",
"command": "npx",
"args": ["@chirpie/mcp"]
}
}
}Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"chirpie": {
"command": "npx",
"args": ["@chirpie/mcp"]
}
}
}Add to your Cursor MCP settings:
{
"mcpServers": {
"chirpie": {
"command": "npx",
"args": ["@chirpie/mcp"]
}
}
}Both servers expose exactly the same tools, so anything below works either way.
What tools does the Chirpie MCP server expose?
| Tool | Description |
|---|---|
chirpie_post | Create a single post, or the same post to several accounts at once. Pass draft to save it without sending it |
chirpie_thread | Create a thread (2-25 posts), on one account or several at once. Pass draft to save it without sending it |
chirpie_list_posts | List posts with optional filters |
chirpie_get_post | Get a single post by ID |
chirpie_upload_media | Upload an image or video and get the id a post can attach |
chirpie_update_post | Edit a post that has not published yet, or finish a draft and publish or schedule it |
chirpie_retry_first_comment | Post a first comment that failed, again |
chirpie_delete_post | Take a post down from the platform. Chirpie keeps it, marked deleted |
chirpie_hide_post | Hide a post from your Chirpie listings. Nothing reaches the platform |
chirpie_unhide_post | Put a hidden post back in your listings |
chirpie_list_accounts | List connected accounts, active and inactive |
chirpie_activate_account | Activate a connected account so it can publish |
chirpie_deactivate_account | Deactivate an account (stays connected, frees a plan slot) |
chirpie_disconnect_account | Disconnect an account (ends the connection, frees a plan slot) |
chirpie_analytics | Get engagement metrics for a post |
chirpie_list_comments | List the comments on a post you published |
chirpie_reply_to_comment | Reply to a comment (counts as one post against your quota) |
chirpie_hide_comment | Hide or unhide a comment |
chirpie_delete_comment | Delete a comment |
chirpie_create_key | Create a new API key, optionally narrowed with scopes (API-key auth only) |
chirpie_list_keys | List API keys (API-key auth only) |
chirpie_revoke_key | Revoke an API key (API-key auth only) |
chirpie_connect_x | Connect an X/Twitter account |
chirpie_connect_linkedin | Connect a LinkedIn profile |
chirpie_connect_linkedin_pages | Connect the LinkedIn Pages you administer (Coming Soon) |
chirpie_connect_threads | Connect a Threads account (Coming Soon) |
chirpie_connect_instagram | Connect an Instagram account, via instagram or facebook (Coming Soon) |
chirpie_connect_facebook | Connect a Facebook Page (Coming Soon) |
chirpie_connect_bluesky | Connect a Bluesky account (app password) |
chirpie_connect_mastodon | Connect a Mastodon account (instance URL) |
chirpie_connect_telegram | Connect a Telegram bot |
chirpie_set_x_keys | Register your own X developer app for connecting X accounts |
chirpie_get_x_keys_status | Check whether your own X developer app is configured |
chirpie_remove_x_keys | Remove your own X developer app (API-key auth only) |
chirpie_connect_instagram takes an optional via: "instagram" (the
default) signs in with Instagram, and "facebook" signs in with Facebook and
connects the Instagram accounts linked to the Pages the user shares, which can
be several at once. The Facebook route is the one where a published post can be
deleted from Chirpie; everything else is identical. An optional reconnect
asks Facebook again about anything turned down last time. See
Instagram publishing options.
The tools marked "API-key auth only" are registered only when you authenticate the MCP server with an API key. Sign in with OAuth and they are not offered, because an OAuth connection can be disconnected from your client, so it deliberately cannot leave a long-lived key behind or tear down credentials your other connections depend on. Manage API keys in the dashboard, and your own X developer app in account settings. Registering your own X app and checking its status stay available over OAuth.
Which tools ask before they run?
Every tool carries a title and the standard MCP tool annotations, which say
what a call does before it runs: readOnlyHint (changes nothing),
destructiveHint (can delete, cancel or overwrite something),
idempotentHint (a repeat with the same arguments changes nothing further) and
openWorldHint (reaches a social platform or another service). Clients use
them to decide when to ask you first. Claude, for example, can run a read-only
tool without asking and, unless you have allowed it, asks before a destructive
one. ChatGPT treats every tool not marked read-only as a write, and may ask you
to confirm one depending on the app's permissions and the action.
| Kind | Tools | Read-only | Destructive |
|---|---|---|---|
| Read | chirpie_list_posts, chirpie_get_post, chirpie_list_accounts, chirpie_analytics, chirpie_list_comments, chirpie_list_keys, chirpie_get_x_keys_status | Yes | No |
| Create | chirpie_post, chirpie_thread, chirpie_upload_media, chirpie_reply_to_comment, chirpie_retry_first_comment, chirpie_create_key, every chirpie_connect_* tool | No | No |
| Reversible | chirpie_hide_post, chirpie_unhide_post, chirpie_hide_comment, chirpie_activate_account | No | No |
| Destructive | chirpie_delete_post, chirpie_delete_comment, chirpie_update_post, chirpie_deactivate_account, chirpie_disconnect_account, chirpie_revoke_key, chirpie_set_x_keys, chirpie_remove_x_keys | No | Yes |
Editing a queued post, deactivating an account and setting your own X app count
as destructive because each replaces or cancels something: an edit overwrites
the text, deactivating cancels the account's scheduled posts, and new X keys
replace the old ones. Creating tools are never marked idempotent, not even the
ones that take an idempotency_key (chirpie_post, chirpie_thread,
chirpie_upload_media, chirpie_reply_to_comment and
chirpie_retry_first_comment): the key is optional, and without one, repeating a
post, thread, reply or first comment can publish it twice.
Tool Details
chirpie_post
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | Yes, unless account_ids is given | Account UUID |
account_ids | string[] | Yes, unless account_id is given | 1 to 25 account UUIDs, to publish to all of them in one call. The result is a group_id plus one entry per account |
account_configurations | object | No | Per-account overrides keyed by account UUID, each taking text, first_comment, configuration and media. Only with account_ids. See Post to several accounts at once |
text | string | Yes | Post text. Max: 280 (X), 25,000 (X Premium), 300 (Bluesky), 3,000 (LinkedIn), 500 (Threads), 500 (Mastodon), 2,200 (Instagram), 63,206 (Facebook), 4,096 (Telegram) |
media | object[] | No | Uploaded files and public links, each { id? , url?, alt? }. Limits vary by platform. Instagram requires media. |
media_urls | string[] | No | Public image/video URLs, for a post that needs no alt text. |
first_comment | string | No | A comment to publish under the post the moment it goes out. X today, with Threads, Instagram and Facebook coming soon, and it counts as one post against your quota. See First comment |
configuration | object | No | Per-platform publishing options keyed by platform. Instagram takes a feed post, a story or a reel; a Facebook Page takes a feed post or a story. An option the placement does not carry is refused with 400 configuration_unsupported. See Publishing options |
schedule_at | string | No | ISO 8601 datetime: either an absolute instant carrying a timezone, or a local time with no offset read in timezone or the one saved on the account. On a draft it is only the time to remember |
timezone | string | No | The IANA timezone a schedule_at with no offset is read in, such as America/New_York. Daylight saving is worked out for the date named. Ignored when schedule_at already carries an offset. Leave it out to use the timezone saved on the account. See Timezones |
idempotency_key | string | No | A key of your own making that makes retrying this call safe. The same key with the same request replays the first answer for 24 hours instead of sending it again. Max 255 characters. See Idempotency |
draft | boolean | No | Save the post without sending it. Nothing publishes and nothing counts against your quota. The answer lists anything that would go wrong |
chirpie_thread
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | Yes, unless account_ids is given | Account UUID |
account_ids | string[] | Yes, unless account_id is given | 1 to 25 account UUIDs, to publish the thread to all of them in one call |
account_configurations | object | No | Per-account overrides keyed by account UUID, each taking posts, which replaces the whole array for that account, first_comment, and configuration |
posts | array | Yes | Array of { text, media?, media_urls? } objects (2-25, or 1-25 on a draft). Media limits vary by platform. LinkedIn, Instagram and Facebook post each item standalone (no native threading). |
first_comment | string | No | One comment for the whole thread, published under the last part and reported on it. X today, with Threads, Instagram and Facebook coming soon |
configuration | object | No | Per-platform publishing options for every part alike. A thread publishes to the feed, so an Instagram story or reel, and a Facebook Page story, are refused: each is a single post |
schedule_at | string | No | ISO 8601 datetime: either an absolute instant carrying a timezone, or a local time with no offset read in timezone or the one saved on the account. On a draft it is only the time to remember |
timezone | string | No | The IANA timezone a schedule_at with no offset is read in, such as America/New_York. Daylight saving is worked out for the date named. Ignored when schedule_at already carries an offset. Leave it out to use the timezone saved on the account. See Timezones |
idempotency_key | string | No | A key of your own making that makes retrying this call safe. The same key with the same request replays the first answer for 24 hours instead of sending it again. Max 255 characters. See Idempotency |
draft | boolean | No | Save the thread without sending it. A draft thread may be a single part while it is still being written |
chirpie_update_post
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The post to edit |
text | string | No | Replacement post text |
media | object[] | No | Replacement media, each { id? , url?, alt? }. An empty array removes it |
media_urls | string[] | No | Replacement media URLs. An empty array removes them |
first_comment | string | No | A new first comment, or an empty string to remove the one the post carries. This is also how a first comment is added to a post that has not published yet |
configuration | object | No | New publishing options, or an empty object to put the post back to a plain feed post. A block replaces the ones the post carries rather than merging into them |
schedule_at | string | No | New publish time. On a draft it queues the post, unless draft is true |
draft | boolean | No | Keep a draft a draft, so schedule_at only changes the time it remembers |
publish | boolean | No | Publish a draft now. Never valid together with schedule_at |
chirpie_retry_first_comment
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The post whose first comment to send again |
idempotency_key | string | No | A key of your own making that makes retrying this call safe. The same key with the same request replays the first answer for 24 hours instead of sending it again. Max 255 characters. See Idempotency |
A first comment never fails its post, so a published post can be carrying one
that did not go out. This re-sends the text the post already holds; to change
that text, use chirpie_update_post. A retry that works counts as one post
against your monthly quota.
chirpie_list_posts
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | No | Filter by status: draft, scheduled, publishing, published, failed, deleted |
account_id | string | No | Filter by account |
group_id | string | No | Every post of one multi-account send, by its group id |
limit | number | No | Results to return |
chirpie_list_accounts
No parameters required. Returns every connected account, including inactive ones. An account
with is_active: false and inactive_reason: "plan_limit" is connected but not publishing
because your plan's account limit was already full when it was connected. One Facebook
authorization can grant several Pages, and Chirpie stores them all rather than dropping any.
chirpie_activate_account
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | Yes | Account UUID |
Fails with a plan-limit error when no slot is free. Deactivate another account first.
chirpie_deactivate_account
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | Yes | Account UUID |
The account stays connected and can be activated again without reauthorizing.
chirpie_disconnect_account
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | Yes | Account UUID |
Ends the connection. The account stops publishing immediately, stops counting against your
plan's account limit, and the credential Chirpie stored for it is removed, so connecting it
again means authorizing it on the platform again. Every scheduled post queued against it is
cancelled and its monthly quota returned; canceled_posts in the response says how many,
and they are not restored. Posts the account already published are kept.
Deactivate instead when the account should come back later without reauthorizing.
chirpie_analytics
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | Yes | Post UUID |
refresh | boolean | No | Ask the platform for the current numbers instead of reading the stored snapshot. Allowed once per post every 5 minutes; past that it answers 429 analytics_refresh_rate_limited with a Retry-After, and the stored numbers are still one ordinary call away |
The numbers come from a snapshot at most an hour old, so calling this often costs nothing.
Reserve refresh for the moment somebody is actually looking. See
Analytics.
chirpie_list_comments
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | Yes | Post UUID |
limit | number | No | Comments to return (default 25, max 100) |
cursor | string | No | The next_cursor from the previous page |
since | string | No | ISO 8601 datetime: only comments after it |
sync | string | No | auto (default), true to refresh now (honoured a minute after the last refresh, 15 minutes on X), false to read what is stored |
include_hidden | boolean | No | Include comments you have hidden (hidden: true) |
include_deleted | boolean | No | Include deleted comments (deleted: true), with the last text Chirpie stored |
Returns the comments plus capabilities for that platform and a sync object saying how
fresh they are. Replying to one publishes a post, so it uses one post from the monthly
quota; listing and hiding do not.
chirpie_reply_to_comment
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | Yes | Post UUID |
comment_id | string | Yes | Comment UUID from chirpie_list_comments |
text | string | Yes | The reply. Same character limits as a post on that platform |
idempotency_key | string | No | A key of your own making that makes retrying this call safe. The same key with the same request replays the first answer for 24 hours instead of sending it again. Max 255 characters. See Idempotency |
chirpie_hide_comment
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | Yes | Post UUID |
comment_id | string | Yes | Comment UUID |
hidden | boolean | No | true (default) hides, false shows it again |
Facebook, Instagram and Threads support hiding, and all three are coming soon. Elsewhere the tool reports that the platform has no hide rather than reporting success.
chirpie_delete_comment
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | Yes | Post UUID |
comment_id | string | Yes | Comment UUID |
Most platforms allow deleting only replies you wrote. Check capabilities.delete_any from
chirpie_list_comments before deleting someone else's comment. On Facebook, Instagram,
Threads and LinkedIn the replies under a deleted comment are deleted with it.
chirpie_set_x_keys
Registers your own X developer app so X accounts connect through it and post against your X API credits. See Bring your own X keys.
| Parameter | Type | Required | Description |
|---|---|---|---|
client_id | string | Yes | OAuth 2.0 Client ID from developer.x.com |
client_secret | string | Yes | OAuth 2.0 Client Secret. Stored encrypted, never returned |
label | string | No | A name for the app |
chirpie_get_x_keys_status
No parameters required. Returns configuration status and the callback URI to register on your X app, never the client secret.
chirpie_remove_x_keys
No parameters required. Removes your own X developer app. API-key auth only. Over OAuth, remove the app from account settings instead.
What can I ask my agent to do?
Once configured, you can ask Claude:
- "Post a tweet saying 'Just shipped a new feature!'"
- "Post to Bluesky saying 'Hello from Chirpie!'"
- "Post to LinkedIn about our new product launch"
- "Post to Mastodon saying 'Hello from Chirpie!'"
- "Send a message to our Telegram channel"
- "Post this image to X and Mastodon with alt text"
- "Schedule a LinkedIn post for Tuesday at 9am in my timezone"
- "Post this to X, Bluesky and LinkedIn at once, with a shorter version for Bluesky"
- "Create a thread about the benefits of TypeScript"
- "Show me my recent posts"
- "What are the analytics for my last post?"
- "Schedule a post for tomorrow at 9am saying 'Good morning!'"
- "Save this as a draft, I will decide on the wording later"
- "Show me my drafts, then publish the one about the launch"
- "List my connected accounts"
- "Connect my X account"
How does authentication work?
Hosted server, either works:
- Sign in through your client's connector flow (OAuth). Recommended: there is no key to store or leak, access lasts only as long as your client keeps its token, and you choose Full access or Read only when you connect.
- Send
Authorization: Bearer chirpie_sk_…if your client supports custom headers. API keys can be revoked at any time from the dashboard.
Any app can register itself to sign in, as the MCP specification requires, and every sign-in uses PKCE. Registration accepts only https redirect addresses, plain http on localhost, 127.0.0.1 or [::1], or the editor schemes of Cursor, VS Code and Windsurf, and the app must give a name. Before you approve, the Chirpie screen shows where you will be sent back to, such as claude.ai or the Cursor app, and says so when Chirpie does not recognise that app. The name an app gives itself is its own choice, so check the destination too.
Local server, resolves your API key in this order:
CHIRPIE_API_KEYenvironment variable (useful for CI/CD)~/.chirpie/config.json(written bychirpie login)
Both the CLI and the local MCP server share the same config file. One chirpie login authenticates both.
Rate limits and plan quotas are identical across the API, SDK, CLI and both MCP servers. See Rate Limits.
Frequently asked questions
Do I need to install anything to use Chirpie's MCP server?
No. https://chirpie.ai/mcp is a hosted, remote MCP endpoint. Paste it into your client, sign in, and the tools appear. The @chirpie/mcp npm package is only needed if you specifically want to run the server locally.
Which AI clients work with it?
Any client that speaks MCP over Streamable HTTP. Claude (web, desktop and Claude Code), Cursor, and ChatGPT are the ones with setup steps above, with full guides in Use Chirpie with Claude and Use Chirpie with ChatGPT, and Meta Muse has its own guide: Use Chirpie with Meta Muse. Clients that only speak stdio can use the local @chirpie/mcp package instead.
Do I need developer accounts on X, LinkedIn, or Mastodon?
No. Chirpie holds the platform integrations. You connect your social accounts once, from the dashboard or by asking your agent, and Chirpie handles OAuth, token refresh and publishing.
Is the hosted server free to use?
Yes, on every plan including the free one. The MCP server is an interface onto the same API, so it consumes the same monthly post quota. See Rate Limits.
Can my agent schedule posts through MCP?
Yes. Pass schedule_at to chirpie_post or chirpie_thread, either as an absolute ISO 8601
instant (2026-04-01T14:00:00Z) or as a local time with no offset (2026-11-01T09:30:00)
alongside timezone: "America/New_York". Daylight saving is worked out for the date named,
which is the thing an offset computed today gets wrong. See Scheduling and
Timezones.
How do I stop my agent posting twice when a call times out?
Pass idempotency_key on chirpie_post, chirpie_thread, chirpie_upload_media,
chirpie_retry_first_comment or chirpie_reply_to_comment. The same key with the same
request replays the first answer for 24 hours instead of publishing again. A retry that
arrives while the first call is still running answers 409 idempotency_in_progress: retry
once more to collect the replay. See Idempotency.
Can I give my agent a key that can only post?
Yes. Create a key with scopes, either in the dashboard or with chirpie_create_key's
scopes parameter, and the agent's calls outside those scopes are refused with
403 insufficient_scope. See Scopes.
Can I connect an AI app that can only read?
Yes. Choose Read only on the Chirpie screen that appears when you sign in. The app can then list your accounts, read posts, analytics and comments, and is not offered any tool that publishes, edits, deletes or connects anything. See Read only or full access.
Can my agent save a draft instead of posting?
Yes. Pass draft: true to chirpie_post or chirpie_thread and the post is
saved without being sent: nothing reaches the platform and nothing counts
against your quota. The answer lists anything that would go wrong if it were
sent as it stands. Finish it with chirpie_update_post, then promote it with
schedule_at to queue it or publish: true to send it now. See
Drafts.
What happens if a tool call fails?
Tools return the API's error code and message verbatim, so your agent can act on it, for example rate_limited or a plan-quota error. The full list is in Error Codes.