Chirpie
NPM · @CHIRPIE/MCP · 2 COMPONENTS
Post, schedule, and track social posts on X, Bluesky, LinkedIn, Instagram and more from AI agents.
Available components
Last scanned (2 hours ago)
Scores higher than 76% of npm servers
Category Marketing and SEO
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 30 of 93 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 31 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability68
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 8026 tokens (~243/item across 33 items; 33 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 34 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Nov 26 +1
- Stability: 0.97 → pass security
- 1 Nov 26 −1
- Stability: pass → 0.93 functional
- 20 Oct 26 +1
- Stability: 0.97 → pass security
- 18 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 16 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 14 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Oct 26 −4
- Stability: pass → 0.77 functional
- 12 Oct 26 +1
- Stability: 0.97 → pass security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/@chirpie/mcp@1.2.3
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 93 packages
| Packages resolved | 93 |
|---|---|
| Stale | 30 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
chirpie_activate_account Activate an account ~76
Activate a connected account so it can publish. Use for accounts listed with `is_active: false`, for example extra Facebook Pages imported beyond the plan's account limit. Fails with a plan-limit error if no slot is free; deactivating another account frees one.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Account ID to activate |
No output schema declared.
No examples provided.
chirpie_analytics Get post analytics ~154
Get analytics (likes, reposts, replies, etc.) for a published post on X, Bluesky, LinkedIn, Threads, Mastodon, Instagram or Facebook. Note: Telegram does not expose analytics. The numbers come from a stored snapshot that is at most an hour old, so calling this often costs nothing; set refresh to ask the platform now instead.
| Name | Type | Req | Description |
|---|---|---|---|
| post_id | string | yes | Post ID to get analytics for |
| refresh | boolean | – | 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… |
No output schema declared.
No examples provided.
chirpie_connect_bluesky Connect a Bluesky account ~87
Connect a Bluesky account using an app password (create one at https://bsky.app/settings/app-passwords).
| Name | Type | Req | Description |
|---|---|---|---|
| app_password | string | yes | Bluesky app password |
| identifier | string | yes | Bluesky handle. The first part alone is enough ("user"), and "user.bsky.social", a handle on your own domain, or the account email also work. |
No output schema declared.
No examples provided.
chirpie_connect_facebook Connect Facebook Pages ~40
Start the OAuth flow for a Facebook Pages account. Returns an authorization_url the user must open in a browser to complete the connection. Coming soon.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
chirpie_connect_instagram Connect an Instagram account ~212
Start the OAuth flow for an Instagram account. Returns an authorization_url the user must open in a browser to complete the connection. There are two routes and they differ in what the account can do afterwards: `instagram` signs in with Instagram and needs no Facebook Page, while `facebook` signs in with Facebook, connects the Instagram professional accounts linked to the Pages the user shares, and is the only route where chirpie_delete_post can remove a published Instagram post. One Facebook grant can connect several accounts at once; any beyond the plan's account limit are stored switched off rather than dropped. Coming soon.
| Name | Type | Req | Description |
|---|---|---|---|
| reconnect | boolean | – | Set when the user has been through this consent screen before, so anything they turned down last time is asked again. |
| via | string | – | Which route to use. 'instagram' (the default) needs no Facebook Page. 'facebook' requires the Instagram professional account to be linked to a Facebook Page, and is the only route where a published p… |
No output schema declared.
No examples provided.
chirpie_connect_linkedin Connect a LinkedIn profile ~38
Start the OAuth flow for a LinkedIn profile account. Returns an authorization_url the user must open in a browser to complete the connection.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
chirpie_connect_mastodon Connect a Mastodon account ~69
Start the OAuth flow for a Mastodon account on a specific instance.
| Name | Type | Req | Description |
|---|---|---|---|
| instance_url | string | yes | Mastodon instance. A bare host is enough ("mastodon.social"), and "https://mastodon.social" or an "@you@fosstodon.org" address also work. |
No output schema declared.
No examples provided.
chirpie_connect_telegram Connect a Telegram bot ~95
Connect a Telegram bot. Create a bot with @BotFather on Telegram, then pass the bot token and the chat ID (user, group, or channel).
| Name | Type | Req | Description |
|---|---|---|---|
| bot_token | string | yes | Bot token from @BotFather |
| chat_id | string | yes | Target chat. A bare channel name is enough ("channelname"), and "@channelname", a t.me link, or a numeric chat ID also work. |
No output schema declared.
No examples provided.
chirpie_connect_threads Connect a Threads account ~38
Start the OAuth flow for a Threads account. Returns an authorization_url the user must open in a browser to complete the connection. Coming soon.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
chirpie_connect_x Connect an X account ~37
Start the OAuth flow for a X/Twitter account. Returns an authorization_url the user must open in a browser to complete the connection.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
chirpie_create_key Create an API key ~155
Create a new Chirpie API key. Returns the full key once: keys are prefixed `chirpie_sk_` and the API never shows one again. Named scopes give a key that can do less than the calling key: a key created without any can do everything the key that made it can, and a key can never grant a scope it does not itself hold.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Friendly name for the key (default: 'Default') |
| scopes | array | – | What the new key may do. Leave it out for a key that can do exactly what the calling key can do. Reading and listing API keys needs keys:write, because the key list is the inventory of the account's… |
No output schema declared.
No examples provided.
chirpie_deactivate_account Deactivate an account ~127
Deactivate a connected account. It stops publishing and frees a slot against the plan's account limit, but stays connected so it can be activated again without reauthorizing. CANCELS the account's scheduled posts: a deactivated account cannot publish, so every post queued against it is cancelled and its monthly quota returned, and `canceled_posts` in the response says how many. Activating the account again does NOT restore them. `scheduled_posts` in chirpie_list_accounts says beforehand how many posts this would cancel.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Account ID to deactivate |
No output schema declared.
No examples provided.
chirpie_delete_comment Delete a comment ~142
Delete a comment on a post you published. It is deleted from the platform first and recorded as deleted in Chirpie only once that succeeded, so a comment is never reported gone while it is still public. On Facebook, Instagram, Threads and LinkedIn the platform deletes the replies under it too, and Chirpie records them deleted as well. Most platforms allow deleting only replies the account wrote; capabilities.delete_any from chirpie_list_comments says whether this one allows deleting somebody else's comment. A deleted comment cannot be restored.
| Name | Type | Req | Description |
|---|---|---|---|
| comment_id | string | yes | Comment ID from chirpie_list_comments |
| post_id | string | yes | Post ID the comment is on |
No output schema declared.
No examples provided.
chirpie_delete_post Delete a post ~314
Delete a post. If it was already published, the platform is told first, and the post is reported deleted only once the platform confirms it is gone; if the platform refuses or is unavailable the call fails with upstream_error and nothing changes, so the same request can simply be retried. If it has not gone out yet, nothing reaches a platform at all: a queued post is cancelled and its quota returned (cancelled_ids), while a draft is simply marked deleted (deleted_ids) and nothing is returned, because a draft never counted against any quota. Deleting a draft returns no quota. A published TikTok post, a Facebook Page story, and any published post on an Instagram account connected by signing in with Instagram rather than through a Facebook Page cannot be deleted through the platform's API, so each is refused with delete_unsupported rather than reported deleted and stays published; it can be deleted in the platform's own app, and chirpie_hide_post keeps it out of the Chirpie listings. THE POST IS NEVER REMOVED FROM CHIRPIE: it keeps its id and its history with status 'deleted', so chirpie_get_post still returns it. Deleting any post of a scheduled thread cancels the whole thread: a thread is published as a unit, so it is cancelled as one. Deleting a published post reaches the platform and cannot be undone; chirpie_hide_post is the reversible alternative, which changes only what Chirpie shows.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Post ID to delete |
No output schema declared.
No examples provided.
chirpie_disconnect_account Disconnect an account ~190
Disconnect a connected account. The connection is REMOVED: the account stops publishing straight away, frees a slot against the plan's account limit, disappears from chirpie_list_accounts, and calling this again with the same id answers 404. Reconnecting it means the user authorizing Chirpie on that platform again, whereas chirpie_deactivate_account keeps the connection so the account can come back later without reauthorizing. CANCELS the account's scheduled posts: every post queued against it is cancelled and its monthly quota returned, and `canceled_posts` in the response says how many. They are NOT restored. Posts the account already published keep their history, but stop reporting its handle and come back with `account_id: null`. `scheduled_posts` in chirpie_list_accounts says beforehand how many posts this would cancel. Cannot be undone.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | yes | Account ID to disconnect |
No output schema declared.
No examples provided.
chirpie_get_post Get a post ~102
Get a single post by ID. `platform_post_url` is its public link on the platform; a Threads or Instagram post published without one has it asked for again here. A post that did not go out explains itself in `error_message` and `retry_count`; when the reason is `connection_lost` the account needs reconnecting before anything else will publish, and chirpie_list_accounts says which one.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Post ID |
No output schema declared.
No examples provided.
chirpie_get_x_keys_status Check your own X developer app ~43
Check whether the user has registered their own X developer app. Returns configuration status and the callback URI to register on the X app, never the client secret.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
chirpie_hide_comment Hide or unhide a comment ~117
Hide or unhide a comment on a post you published. Facebook, Instagram and Threads support hiding; everywhere else this reports comment_action_unsupported rather than reporting success for something that did not happen. A hidden comment stays in Chirpie's listing behind include_hidden, so the moderation history is kept.
| Name | Type | Req | Description |
|---|---|---|---|
| comment_id | string | yes | Comment ID from chirpie_list_comments |
| hidden | boolean | – | true (default) hides the comment, false shows it again |
| post_id | string | yes | Post ID the comment is on |
No output schema declared.
No examples provided.
chirpie_hide_post Hide a post in Chirpie ~209
Hide a post from the user's Chirpie listings. NOTHING REACHES THE PLATFORM: the post stays exactly as it is, keeps its analytics and its comments, and chirpie_unhide_post puts it back. Nothing is charged and no quota moves. Hiding changes only what Chirpie shows; chirpie_delete_post is what takes a post down from the platform. A hidden post is left out of chirpie_list_posts unless include_hidden is true, and is always readable by id with chirpie_get_post. HIDING A QUEUED POST DOES NOT STOP IT PUBLISHING: the scheduler pays no attention to it, and chirpie_delete_post is what stops a scheduled post going out. A thread, or a fan-out made in one request, is hidden as the one thing it was made as, so `hidden_ids` in the answer can name more posts than the id you passed.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Post ID to hide. A thread or fan-out moves whole. |
No output schema declared.
No examples provided.
chirpie_list_accounts List connected accounts ~305
List connected social accounts (X/Twitter, Bluesky, LinkedIn, Threads, Mastodon, Instagram, Facebook and Telegram), with `accounts_limit` (how many the plan allows to be active) and `accounts_active` (how many are) beside them, which say whether there is room to connect another. Accounts with `is_active: false` are connected but not publishing; `inactive_reason` says why: `"plan_limit"` means the account was connected while the plan's account limit was already full and can be switched on with chirpie_activate_account, while `"token_revoked"`, `"token_expired"` and `"reauth_required"` mean the platform stopped accepting the stored credential, so the account has to be connected again and anything it had scheduled was cancelled with its quota returned. Retrying a post does not bring an inactive account back: `inactive_reason` says whether chirpie_activate_account or a fresh connect does. An account switched off deliberately carries no reason at all, and chirpie_activate_account switches it back on. Reconnecting an account already held never needs a free slot. `scheduled_posts` is how many scheduled posts are queued against the account, all of which chirpie_deactivate_account would cancel. On LinkedIn, `account_type` says whether the account is the member's own profile (`"member"`) or a LinkedIn Page they administer (`"organization"`); both post the same way, with their own `id`.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
chirpie_list_comments List comments on a post ~326
List the comments on a post you published, newest first. Answers from Chirpie's stored snapshot, which is refreshed on a schedule, so the response carries a `sync` object saying how fresh it is (anything but status `ok` has a ready-worded sentence in `sync.reason`) and a `capabilities` object saying what this platform allows: `reply`, `hide`, `delete_own` and `delete_any`. `delete_any` says whether somebody else's comment can be deleted. Page with `next_cursor`. Listing costs nothing, but replying publishes a post and so uses one post from the monthly quota.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | The next_cursor from the previous page |
| include_deleted | boolean | – | Include deleted comments (they carry deleted: true and keep the last text Chirpie stored). Deleting a comment on Facebook, Instagram, Threads or LinkedIn deletes its replies too |
| include_hidden | boolean | – | Include comments you have hidden (they carry hidden: true) |
| limit | number | – | Comments to return (default 25, max 100) |
| post_id | string | yes | Post ID whose comments to list |
| since | string | – | ISO 8601 datetime: only comments posted after it |
| sync | string | – | 'auto' (default) refreshes when the platform's refresh window has passed, 'true' asks for a refresh now (honoured a minute after the last refresh, 15 minutes on X; sync.next_sync_after says when), 'f… |
No output schema declared.
No examples provided.
chirpie_list_keys List API keys ~31
List the user's Chirpie API keys (prefix + metadata; the full key is only shown on creation).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
chirpie_list_posts List posts ~323
List recent posts. Filter by status or account. Every post carries `error_message` and `retry_count`: on a failed post the platform's own refusal and how many attempts it took before Chirpie gave up, and on a deleted one the reason Chirpie cancelled it (`account_disconnected`, `account_deactivated`, or `connection_lost` when the platform stopped accepting the account's credential). `platform_post_url` is the public permalink once published. A post the user deleted stays in the listing with status 'deleted' and no cancel reason: Chirpie never removes a post's history. Posts the user hid with chirpie_hide_post are left out unless include_hidden is true, and `hidden` on each post says which those are.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | string | – | Filter by account ID |
| group_id | string | – | Only the posts of one fan-out, from the group_id a multi-account chirpie_post or chirpie_thread returned. Every post also carries its own group_id, or null when it went to a single account. |
| include_hidden | boolean | – | Include posts the user hid with chirpie_hide_post. Off by default on every filter, because hiding is the user saying they do not want to see it. |
| limit | number | – | Max results (default 20) |
| status | string | – | Filter: draft, scheduled, publishing, published, failed, deleted. With no filter the listing is what has been sent, queued or tried, so drafts are left out; ask for them with status 'draft'. |
No output schema declared.
No examples provided.
chirpie_post Publish or schedule a post ~1,458
Create a post on X/Twitter, Bluesky, LinkedIn, Threads, Mastodon, Instagram, Facebook, or Telegram with optional media. Posts immediately or at a scheduled time. Publish to several accounts at once by naming account_ids instead of account_id, and give one of them its own text or media with account_configurations. Note: Instagram REQUIRES media. X posts whose text contains a link are billed at $0.25 each on paid plans and are rejected on the Free plan (x_link_posts_require_paid_plan); X accounts connected with your own X API keys are exempt. A spent monthly post or scheduled-post quota answers 429 usage_limit_exceeded, which waiting does not clear; the separate per-minute burst limit on the API key answers 429 rate_limited and does clear. Set draft: true to save the post without sending it: nothing reaches the platform, nothing counts against the monthly quota, the text may even be empty, and the answer carries a `warnings` array saying per account what would go wrong if it were sent as it stands. chirpie_update_post edits a draft and promotes it with schedule_at or publish: true.
| Name | Type | Req | Description |
|---|---|---|---|
| account_configurations | object | – | Per-account overrides, keyed by account ID. Every key must also be in account_ids. An account with no entry publishes the shared text and media. Media never merges: an account naming any media field… |
| account_id | string | – | Account ID to post from (X, Bluesky, LinkedIn, Threads, Mastodon, Instagram, Facebook, or Telegram). Use this or account_ids, not both. |
| account_ids | array | – | Account IDs to publish the same post to, 1 to 25 of them, each named once. Naming this instead of account_id answers with a group_id and one result per account, in the order given, each with its own… |
| configuration | object | – | Per-platform publishing options, keyed by platform. Instagram takes a feed post, a story or a reel, and a Facebook Page takes a feed post or a story; leave it out and everything publishes to the feed… |
| draft | boolean | – | Save the post without sending it. It is stored with status draft, nothing reaches the platform, and it costs no quota. The answer carries a `warnings` array naming, per account, anything that would s… |
| first_comment | string | – | A comment to publish under the post the moment it goes out, the "link in the first comment" pattern. Available on X, Threads, Instagram and Facebook only: sending it to any other platform is refused… |
| idempotency_key | string | – | 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; the same key with a different reques… |
| media | array | – | Uploaded files and public links, each with optional alt text. An entry takes either `id`, from chirpie_upload_media, or `url`, a public link Chirpie fetches. `alt` describes the item for people using… |
| media_ids | array | – | Ids from chirpie_upload_media, for a post that needs no alt text. Same per-platform rules as `media`. Use one of media, media_ids or media_urls, not several. |
| media_urls | array | – | Public image or video URLs, for a post that needs no alt text. Same per-platform rules as `media`. |
| schedule_at | string | – | ISO 8601 datetime to schedule the post. Either an absolute instant carrying a timezone, such as '2026-04-01T14:00:00Z' or '2026-04-01T16:00:00+02:00', or a local time with no offset, such as '2026-11… |
| text | string | yes | Post text, and what an account with no override of its own publishes (max 280 chars for standard X, 25,000 for X Premium, 300 for Bluesky, 3,000 for LinkedIn, 500 for Threads, 500 for Mastodon, 2,200… |
| timezone | string | – | 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, which is what makes '09:30 on 1 November' come out right. Igno… |
No output schema declared.
No examples provided.
chirpie_remove_x_keys Remove your own X developer app ~44
Remove the user's own X developer app. X accounts connected through it stop refreshing until the keys are re-added or the accounts are reconnected through Chirpie's app.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
chirpie_reply_to_comment Reply to a comment ~217
Reply to a comment on a post you published. The reply is published to the platform like any other post, so it counts as one post against the monthly quota, and an X reply whose text contains a link is billed at $0.25 on paid plans and rejected on the Free plan. The same per-platform character limits as a post apply.
| Name | Type | Req | Description |
|---|---|---|---|
| comment_id | string | yes | Comment ID from chirpie_list_comments |
| idempotency_key | string | – | 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; the same key with a different reques… |
| post_id | string | yes | Post ID the comment is on |
| text | string | yes | The reply text |
No output schema declared.
No examples provided.
chirpie_retry_first_comment Retry a first comment ~304
Post a first comment that failed, again. A first comment never fails its post, so a published post can be carrying first_comment with status "failed" and a reason; this re-sends the text the post already holds. That text cannot be changed once the post is out, because chirpie_update_post refuses a published post with 409 post_not_editable, so set it while the post is still a draft or still queued. A first comment is a post on the platform, so a retry that works costs one post from the monthly quota, exactly as the first attempt would have. Refusals: 404 first_comment_not_found when the post has none, 409 first_comment_not_retryable when it is already posted or the post has not published, and the platform's own refusal when the retry failed too.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The post whose first comment to retry. For a thread, the last part, which is the one that carries it. |
| idempotency_key | string | – | 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; the same key with a different reques… |
No output schema declared.
No examples provided.
chirpie_revoke_key Revoke an API key ~41
Revoke a Chirpie API key by its ID. Revocation is permanent and immediate.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | API key ID to revoke |
No output schema declared.
No examples provided.
chirpie_set_x_keys Set your own X developer app ~153
Register the user's OWN X developer app (from developer.x.com) so their X accounts connect through it and post against their X API credits instead of Chirpie's. Link posts from accounts connected this way are not surcharged. After setting keys, the user must add the returned redirect_uri as a callback URI on their X app and then reconnect each X account (chirpie_connect_x) to move it onto their app.
| Name | Type | Req | Description |
|---|---|---|---|
| client_id | string | yes | OAuth 2.0 Client ID from developer.x.com |
| client_secret | string | yes | OAuth 2.0 Client Secret from developer.x.com. Stored encrypted and never returned. |
| label | string | – | Optional human-readable name for the app |
No output schema declared.
No examples provided.
chirpie_thread Publish or schedule a thread ~1,172
Create a thread (multiple posts) on X/Twitter, Bluesky, LinkedIn, Threads, Mastodon, Instagram, Facebook, or Telegram. Publish to several accounts at once by naming account_ids instead of account_id, and give one of them a thread of its own with account_configurations. X, Bluesky, Threads, Mastodon, and Telegram support native reply threading. Others degrade gracefully to standalone posts. A THREAD IS ATOMIC: if any part fails, every part already published is deleted from the platform and the whole thread's quota is refunded, and the error's `thread_rollback` says what was rolled back. Two codes tell you whether a retry is safe: `upstream_error` means nothing of the thread is on the platform, so repeating the request is safe, while `thread_rollback_incomplete` means the posts named in `thread_rollback.still_live` are still up with their ids and URLs, and repeating the request would publish them twice. On an Instagram account connected by signing in with Instagram, where Chirpie cannot delete a published post, a failed thread always reports its published parts as still live. On X, each post in the thread whose text contains a link is billed at $0.25 on paid plans; on the Free plan such threads are rejected (x_link_posts_require_paid_plan). X accounts connected with your own X API keys are exempt. A thread that would cross the monthly post or scheduled-post quota answers 429 usage_limit_exceeded and publishes nothing; the per-minute burst limit on the API key answers 429 rate_limited. Set draft: true to save the thread without sending it: nothing reaches the platform, nothing counts against the quota, a draft thread may still be a single part long, and the answer carries a `warnings` array. chirpie_update_post on any of its parts promotes it, and the whole thread goes together.
| Name | Type | Req | Description |
|---|---|---|---|
| account_configurations | object | – | Per-account threads, keyed by account ID. Every key must also be in account_ids. An account with no entry publishes the shared posts. |
| account_id | string | – | Account ID to post from (X, Bluesky, LinkedIn, Threads, Mastodon, Instagram, Facebook, or Telegram). Some platforms degrade to standalone posts. Use this or account_ids, not both. |
| account_ids | array | – | Account IDs to publish the same thread to, 1 to 25 of them, each named once. Naming this instead of account_id answers with a group_id and one result per account, in the order given, each with its ow… |
| configuration | object | – | Per-platform publishing options, keyed by platform. Instagram takes a feed post, a story or a reel, and a Facebook Page takes a feed post or a story; leave it out and everything publishes to the feed… |
| draft | boolean | – | Save the thread without sending it. Every part is stored with status draft, nothing reaches the platform, and it costs no quota. |
| first_comment | string | – | A comment to publish under the thread's LAST post once the thread is out. One comment for the whole thread, not one per part, and reported on that last part's first_comment. Available on X, Threads,… |
| idempotency_key | string | – | 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; the same key with a different reques… |
| posts | array | yes | Array of posts in the thread. A thread needs at least 2 to publish; a draft may be saved with 1 while it is still being written. |
| schedule_at | string | – | ISO 8601 datetime to schedule the thread. Either an absolute instant carrying a timezone, such as '2026-04-01T14:00:00Z' or '2026-04-01T16:00:00+02:00', or a local time with no offset, such as '2026-… |
| timezone | string | – | 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, which is what makes '09:30 on 1 November' come out right. Igno… |
No output schema declared.
No examples provided.
chirpie_unhide_post Unhide a post in Chirpie ~89
Put a hidden post back in the user's Chirpie listings. The exact undo of chirpie_hide_post, and as with hide, nothing reaches the platform. Unhiding a post that was never hidden succeeds and changes nothing. chirpie_list_posts with include_hidden true lists the hidden posts.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Post ID to show again. A thread or fan-out moves whole. |
No output schema declared.
No examples provided.
chirpie_update_post Edit a queued post or draft ~731
Edit a post that has not published yet, or finish a draft. Only a post still waiting to publish can be edited; one that is publishing, published, failed or deleted is refused with 409 post_not_editable. Leaving schedule_at out keeps the time a queued post already has, so editing a queued post never publishes it and never turns it into an immediate one, and costs nothing, since it spent its quota when it was created. Rescheduling a post that belongs to a thread moves every part of that thread, and the response lists them in rescheduled_post_ids. A draft is different: it is held to far less, so an edit that leaves it too long or with no text at all is saved and answers with a `warnings` array instead of an error. Promoting a draft is the one thing this call does publish: schedule_at queues it, publish: true sends it now, both run every rule a create runs and spend the quota the draft never spent, and the answer carries the new post plus promoted_from_draft_id. draft: true alongside schedule_at changes only the time the draft remembers.
| Name | Type | Req | Description |
|---|---|---|---|
| configuration | object | – | New publishing options, or an empty object to put the post back to a plain feed post. Leaving it out keeps the options the post already carries, and sending a block replaces them outright rather than… |
| draft | boolean | – | Keep this a draft, whatever else changes. Only meaningful on a post that is already a draft, where it is the difference between remembering a new time and queueing the post for it. |
| first_comment | string | – | 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 never had one, as long as it has not published yet. On a thread it… |
| id | string | yes | Post ID to edit |
| media | array | – | Replacement media, following the same per-platform rules as creating a post. Pass an empty array to remove the media. |
| media_urls | array | – | Replacement public image or video URLs, for a post that needs no alt text. Pass an empty array to remove the media. |
| publish | boolean | – | Publish this draft now. Only valid on a draft, and never together with schedule_at. The draft is checked in full and charged as a post, then sent. |
| schedule_at | string | – | New ISO 8601 publish time, in the future. Either an absolute instant carrying a timezone, such as '2027-04-01T14:00:00Z', or a local time with no offset, such as '2027-04-01T09:30:00', which is read… |
| text | string | – | Replacement text. The same per-platform character limits apply as when creating a post. |
| timezone | string | – | 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 o… |
No output schema declared.
No examples provided.
chirpie_upload_media Upload media ~342
Upload an image or a video and get back the id a post can attach. Give it either a public `url` for Chirpie to fetch, or `data`, the file's bytes as base64. The file type is read from the file's own first bytes, never from its name or a declared type, so a mislabelled file is refused rather than published. The id is valid for 7 days; attach it with `media: [{ id, alt }]` on chirpie_post, chirpie_thread or chirpie_update_post. A post keeps its own copy of the bytes, so it is unaffected when the id expires. Uploads are limited to 3 MB of file when sent as `data`, which bounds the request rather than the post; attach a larger file with media_urls instead, which has no such limit.
| Name | Type | Req | Description |
|---|---|---|---|
| data | string | – | The file's bytes, base64 encoded. Use this or url, not both. |
| filename | string | – | A name to show in the dashboard. Never used to decide the file type. |
| idempotency_key | string | – | 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; the same key with a different reques… |
| url | string | – | A public image or video URL for Chirpie to fetch and store. |
No output schema declared.
No examples provided.
How do I install the Chirpie MCP server?
Chirpie runs locally as an npm package, launched with npx -y @chirpie/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @chirpie/mcp
claude mcp add firefloco-chirpie -- npx -y @chirpie/mcp
What is the Chirpie MCP server?
Chirpie is an MCP server listed in the public MCP registry as io.github.Firefloco/chirpie. Post, schedule, and track social posts on X, Bluesky, LinkedIn, Instagram and more from AI agents. This page covers its npm package (@chirpie/mcp).
Is the Chirpie MCP server safe to use?
Chirpie scores 83 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Chirpie MCP server expose?
Chirpie exposes 33 tools: chirpie_upload_media, chirpie_post, chirpie_thread, chirpie_list_posts, chirpie_get_post, and 28 more. Their descriptions and schemas cost roughly 7,781 tokens of context every time the server is loaded.
Is the Chirpie MCP server still maintained?
Chirpie is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the Chirpie MCP server under?
Chirpie declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.