Skip to main content
Glama

Server Details

Post, schedule, and track social posts on X, Bluesky, LinkedIn, Instagram and more from AI agents.

Ownership verified
Status
Healthy
Uptime
20.2% over 41 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
Firefloco/chirpie-mcp
GitHub Stars
0
Server Listing
@chirpie/mcp

TDQS

A3.9/5.0

Scored across 33 tools

Disambiguation4/5

Each tool has a clearly distinct purpose: connect_* tools are differentiated by platform, and hide/delete/unhide and activate/deactivate/disconnect are explicitly contrasted in their descriptions. Minor overlap exists between the several publish-oriented tools (post, thread, reply_to_comment, retry_first_comment), but descriptions make the boundaries clear.

Naming Consistency4/5

Almost all tools follow a consistent chirpie_verb_noun snake_case pattern (list_accounts, connect_x, delete_post, revoke_key). A few deviations—chirpie_post, chirpie_thread, chirpie_analytics—use bare nouns/verbs rather than verb_noun, and chirpie_get_x_keys_status is verbose, but overall the convention is predictable.

Tool Count3/5

33 tools is on the heavy side. Much of the count is justified by the multi-platform scope (8 separate connect_* tools), but the connect/disconnect/activate/deactivate and X-key tools could plausibly be consolidated, so the surface feels somewhat over-expanded.

Completeness4/5

The surface covers the full lifecycle: connect/disconnect/activate/deactivate accounts, create/update/delete/hide/unhide posts and threads, media upload, comment moderation, analytics, API keys, and X developer keys. Minor gaps exist (no account detail/update, no media or comment retrieval beyond listing), but core workflows are complete.

Available Tools

33 tools
chirpie_activate_accountActivate an accountA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYesAccount ID to activate

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the bar is lower. The description still adds real behavioral value by disclosing the plan-limit failure mode and the quota mechanic that resolves it, which annotations do not express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: action and effect first, then when-to-use, then failure handling. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one required parameter, full schema coverage, no output schema, and annotations covering the safety profile, the description supplies everything an agent needs: purpose, eligibility condition, and failure/remedy behavior. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single account_id parameter, so the schema already carries the syntax. The description adds only indirect context about which accounts are eligible (is_active: false), which is useful but not parameter-level detail, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Activate a connected account') plus the outcome ('so it can publish'), which clearly distinguishes it from the sibling chirpie_deactivate_account. An agent can tell what it does and on what entity without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger condition ('accounts listed with is_active: false') and even a concrete example (extra Facebook Pages over plan limit). It also names the remedy when it fails (deactivating another account frees a slot), which routes the agent toward the sibling deactivate tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_analyticsGet post analyticsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYesPost ID to get analytics for
refreshNoAsk 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.

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new context: numbers come from a snapshot up to an hour old, frequent calls are free, Telegram exposes no analytics, and refresh is rate-limited (429 analytics_refresh_rate_limited with Retry-After). This is rich disclosure well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose and platform list, then packs the caching and refresh behavior into a single efficient sentence. Slightly dense but no filler; every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully names the returned metrics (likes, reposts, replies, etc.), covers platform support and the Telegram gap, and explains snapshot freshness and refresh. It does not describe the response shape in detail, but is otherwise complete for a two-parameter read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents post_id and the full refresh rate-limit behavior. The description largely restates the snapshot/refresh tradeoff, adding little syntax or meaning the schema does not already carry, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get analytics (likes, reposts, replies, etc.) for a published post') and enumerates the supported platforms, so the agent knows exactly what is retrieved. It stops short of explicit sibling differentiation (e.g. vs chirpie_get_post), keeping it below a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives strong operational guidance for the refresh parameter ('calling this often costs nothing; set refresh to ask the platform now instead') and flags that Telegram is unsupported. However, it never states when to pick this over a sibling such as chirpie_get_post, so tool-selection guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_connect_blueskyConnect a Bluesky accountAInspect

Connect a Bluesky account using an app password, never the account password. An app password looks like xxxx-xxxx-xxxx-xxxx and is created in Bluesky under Settings, Privacy and Security, App Passwords (https://bsky.app/settings/app-passwords). Anything else is refused with bluesky_app_password_required.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYesBluesky handle. The first part alone is enough ("user"), and "user.bsky.social", a handle on your own domain, or the account email also work.
app_passwordYesBluesky app password, shaped xxxx-xxxx-xxxx-xxxx (four groups of four lowercase letters or digits). The account password is refused.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the safety envelope (not read-only, open-world, not idempotent). The description adds genuinely non-obvious behavior: that the account password is refused, that anything other than the xxxx-xxxx-xxxx-xxxx format is refused, and the exact error code (bluesky_app_password_required) returned on failure. That is real additional transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and the credential restriction, then supplies format and a creation link. Efficient, though the password format is repeated from the schema, which is minor redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a connect tool with no output schema, the description covers everything an agent needs: required credential type, format, how to create it, and the failure mode. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented in the input schema, including the app-password format and the identifier flexibility. The description's restatement of the format is largely redundant; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Connect a Bluesky account') and distinguishes itself from the sibling connect_* family (facebook, instagram, x, etc.) by naming the platform in the tool name and title. An agent can route to it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for how to obtain the required credential (app password created under Settings > Privacy and Security) and the exact URL, which is strong practical guidance. It does not explicitly name sibling alternatives or state when not to use this tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_connect_facebookConnect Facebook PagesInspect

Start the OAuth flow for a Facebook Pages account. Returns an authorization_url the user must open in a browser to complete the connection.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

chirpie_connect_instagramConnect an Instagram accountInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viaNoWhich 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 post can be deleted.
reconnectNoSet when the user has been through this consent screen before, so anything they turned down last time is asked again.
chirpie_connect_linkedinConnect a LinkedIn profileAInspect

Start the OAuth flow for a LinkedIn profile account. Returns an authorization_url the user must open in a browser to complete the connection.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (not read-only, open-world, non-idempotent), so the description correctly focuses on what they cannot convey: that this only starts the flow and returns an authorization_url the user must open in a browser. That workflow detail is genuinely additive, though it omits what happens if the flow is abandoned or that repeated calls yield fresh URLs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both front-loaded and purposeful: the first defines the action, the second defines the return value and required user follow-up. No filler or restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no output schema and full annotation coverage, the description supplies the essential missing piece — the authorization_url return value and the browser step. It stops short of describing post-authorization behavior or how to verify the connection succeeded, which would make it fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to disambiguate, and it correctly avoids inventing parameter detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource — 'Start the OAuth flow for a LinkedIn profile account' — which pins down both the action and the platform. Against siblings like chirpie_connect_bluesky or chirpie_connect_x, the platform-specific naming makes it unambiguous which tool to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it (to initiate a LinkedIn connection) and describes the follow-up step the user must take, but it names no alternative or exclusion — e.g., whether an existing connection should be checked via chirpie_list_accounts first or how this differs from chirpie_disconnect_account. Usage is inferable but not guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_connect_mastodonConnect a Mastodon accountAInspect

Start the OAuth flow for a Mastodon account. Pass the user's server, handle or profile URL; Chirpie keeps only the server. A value naming no server is refused with mastodon_instance_invalid.

ParametersJSON Schema
NameRequiredDescriptionDefault
instance_urlYesThe Mastodon server, in any form: "mastodon.social", "https://mastodon.social/", a handle ("@you@mastodon.social") or a profile URL ("https://mastodon.social/@you").

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=false, openWorldHint=true, idempotentHint=false), so the description only needs to add context. It does add two non-obvious facts: Chirpie retains only the server from the supplied value, and an unresolvable server is rejected with the specific error code mastodon_instance_invalid. It does not say what the call returns or that the user must complete an external redirect, but the annotation bar is met.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the action is front-loaded, then the accepted inputs and the failure mode. No filler and nothing important buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter OAuth initiation tool with annotations carrying the safety profile, the description covers action, input leniency, retention behavior, and the failure case. The main omission is the return value or next step (e.g. an auth URL the user must visit), which matters since there is no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter is fully documented there, so the baseline is 3. The description's "keeps only the server" adds the useful nuance that a handle or profile URL is accepted and normalized rather than stored verbatim, but otherwise restates what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Start the OAuth flow for a Mastodon account") and names the platform explicitly, which cleanly separates it from the sibling connect_* tools for Bluesky, X, Facebook, and the rest.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to call it (a user wants to link a Mastodon account) and names the accepted input forms, but it never states when NOT to use it or routes the agent to an alternative, such as disconnecting or listing accounts. Usage is inferable rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_connect_telegramConnect a Telegram botAInspect

Connect a Telegram bot. Create a bot with @BotFather on Telegram, then pass the bot token and the chat ID (user, group, or channel).

ParametersJSON Schema
NameRequiredDescriptionDefault
chat_idYesTarget chat. A bare channel name is enough ("channelname"), and "@channelname", a t.me link, or a numeric chat ID also work.
bot_tokenYesBot token from @BotFather

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose the safety profile (readOnly=false, destructive=false, openWorld=true, idempotent=false), so the description only needs to add context. It contributes the @BotFather prerequisite and the accepted chat target types, but never addresses the non-idempotent behavior — e.g., what happens if the same bot/chat is connected twice — which is the one trait the annotations flag as risky.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the action front-loaded and the prerequisite sequence immediately after. No filler, no repetition of the title, every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter connect tool with no output schema and annotations covering safety, the description supplies the essential setup prerequisite and target scope. It is nearly complete; only post-connection behavior and duplicate-connect handling are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with chat_id formats and the bot_token source fully documented in the schema itself. The description restates 'pass the bot token and the chat ID (user, group, or channel)' without adding syntax or format detail beyond what the schema already carries, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (connect a Telegram bot) plus the required setup path, so the agent knows exactly what the call accomplishes. It does not explicitly differentiate itself from the connect_* siblings, but the platform-specific naming makes the distinction obvious without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a prerequisite workflow (create the bot with @BotFather first, then pass token and chat ID), which is useful implied guidance for invoking it correctly. It offers no when-to-use vs. when-not guidance and does not mention chirpie_disconnect_account or reconnection scenarios as alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_connect_threadsConnect a Threads accountInspect

Start the OAuth flow for a Threads account. Returns an authorization_url the user must open in a browser to complete the connection.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

chirpie_connect_xConnect an X accountAInspect

Start the OAuth flow for a X/Twitter account. Returns an authorization_url the user must open in a browser to complete the connection.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=false, openWorld=true, idempotent=false, destructive=false, so the safety profile is covered. The description adds value beyond that by disclosing the return artifact (authorization_url) and the required human step, which is essential behavior for an OAuth initiation tool. It doesn't mention expiry or re-invocation behavior, keeping it at a 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the action stated first and the required user follow-up second. Nothing redundant with the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly carries the return-value burden by naming authorization_url and the browser step the user must perform. It leaves unspecified whether the URL expires, how the connection is confirmed, or whether a callback is involved, but the core invocation path is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema is empty, so there is nothing for the description to clarify. Baseline 4 applies for a no-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: 'Start the OAuth flow for a X/Twitter account.' Naming the platform separates it from the many connect_* siblings (bluesky, facebook, etc.) without needing the schema. It stops short of a 5 only because it doesn't explicitly frame itself against the X-specific key-management siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the follow-through ('the user must open in a browser to complete the connection'), which implies the context of use, but never says when to choose this over alternatives such as chirpie_set_x_keys or chirpie_get_x_keys_status, nor when not to use it. Adequate implicit guidance, no explicit routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_create_keyCreate an API keyAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFriendly name for the key (default: 'Default')
scopesNoWhat 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 credentials.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-readonly, non-idempotent, non-destructive write. The description adds critical non-obvious behavior: the key is returned exactly once, is prefixed 'chirpie_sk_', and is never shown again. That is exactly the kind of disclosure the description should carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three focused sentences, front-loaded with the action and the one-time-return warning. The scope-inheritance sentence is dense but earns its place. Slightly heavy for a two-parameter tool, but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fills the gap by telling the agent the return value (the full key) is available only once. Combined with the scope rules and one-time visibility, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents both parameters, setting a baseline of 3. The description goes beyond it by explaining scope inheritance: a key with no scopes mirrors the calling key, and a key can never grant a scope the caller does not hold — real semantic value the schema doesn't convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create a new Chirpie API key.' This cleanly distinguishes it from sibling tools like chirpie_list_keys and chirpie_revoke_key without requiring schema inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the semantics of scopes (what happens if you omit them, and the no-escalation rule), which implies when a scoped key is appropriate, but it never states explicit when-to-use/when-not-to-use conditions or names an alternative tool. Usage guidance is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_deactivate_accountDeactivate an accountA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYesAccount ID to deactivate

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (destructiveHint, idempotentHint, openWorldHint=false) by disclosing the exact side effect: all scheduled posts are cancelled, quota is returned, reactivation does NOT restore them, and the count appears as canceled_posts in the response. This is precisely the destructive consequence an agent must surface before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and its reversibility, then the cancellation consequence. Every sentence carries information, though the explanation of cancel semantics is repeated slightly ('CANCELS', 'cannot publish', 'cancelled', 'does NOT restore'), costing a bit of tightness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by naming the canceled_posts response field and the scheduled_posts pre-check field, so an agent knows both what it will get back and how to preview the impact. Complete for a one-parameter mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single required parameter and the schema documents it at 100% coverage ('Account ID to deactivate'), so the description need not explain it. The description adds nothing about the parameter itself; its useful detail is about response fields, not inputs. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Deactivate a connected account') and immediately contrasts it against the other obvious lifecycle action by noting it 'stays connected so it can be activated again without reauthorizing', which separates it from chirpie_disconnect_account and chirpie_delete_post.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear use context — stop publishing and free a plan slot while preserving the authorization — and points to chirpie_list_accounts' scheduled_posts as a way to preview the cost. It does not explicitly name disconnect_account or delete_post as the alternative when the user wants a full removal, so the exclusion is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_delete_commentDelete a commentA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYesPost ID the comment is on
comment_idYesComment ID from chirpie_list_comments

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds substantial behavior beyond them: the platform-first-then-record ordering that prevents false deletion reports, cascade deletion of nested replies on Facebook/Instagram/Threads/LinkedIn, and the irreversibility note that a deleted comment cannot be restored. This is exactly the extra operational context an agent needs for a destructive call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first sentence, and each subsequent sentence carries distinct, non-redundant information (ordering guarantee, cascade behavior, permission check, irreversibility). It is dense but appropriately sized for a destructive, multi-platform operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully covers what matters: preconditions (owning the post, delete_any capability), the safety semantics of the deletion, cross-platform cascade behavior, and irreversibility. Nothing an agent needs to call this destructive tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are documented there (post_id, comment_id with its chirpie_list_comments origin). The description reinforces that comment_id comes from chirpie_list_comments and ties post_id to 'a post you published,' but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource with scope ("Delete a comment on a post you published"), which is more precise than the bare title. It does not, however, explicitly differentiate itself from the sibling chirpie_hide_comment, leaving the delete-vs-hide distinction to be inferred.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives real context for when the call is legitimate: the comment must be on a post you published, and capabilities.delete_any from chirpie_list_comments determines whether deleting someone else's comment is permitted. It stops short of naming exclusions or the hide_comment alternative, so the guidance is clear but not complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_delete_postDelete a postA
DestructiveIdempotent
Inspect

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 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPost ID to delete

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes far beyond the annotations (destructiveHint/idempotentHint/openWorldHint): it explains upstream_error retry semantics, quota-return behavior via cancelled_ids/deleted_ids, delete_unsupported platform cases, thread-wide cancellation, and that the post persists in Chirpie with status 'deleted'. This is rich, non-redundant behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long and dense, but every sentence carries a distinct behavioral fact rather than filler, and the core operation is front-loaded. It is justified by the tool's complexity, though the multi-clause sentences could be trimmed slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, open-world mutation tool with no output schema, the description supplies everything an agent needs: return signals (cancelled_ids, deleted_ids), error cases (upstream_error, delete_unsupported), reversibility, and post-deletion state. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter with 100% schema coverage, so the schema already documents 'Post ID to delete'. The description alludes to post identity (kept id, history, status 'deleted') but adds no syntax or format meaning for the parameter itself; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Delete a post') and immediately distinguishes itself from chirpie_hide_post by naming it as the reversible alternative. The description makes the tool's distinct behavior (platform-reaching, irreversible) unmistakable versus any sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names alternatives explicitly: chirpie_hide_post is called out as the reversible alternative for published posts and for unsupported cases, and the platform's own app is noted. However, it never states a clean prescriptive 'use this when/not when' rule, leaving the routing inference partly to the reader.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_disconnect_accountDisconnect an accountA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
account_idYesAccount ID to disconnect

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations supply destructiveHint=true and idempotentHint=true, but the description goes far beyond them: publishing stops immediately, a plan slot is freed, the account vanishes from chirpie_list_accounts, repeat calls return 404, scheduled posts are cancelled with quota returned, `canceled_posts` reports the count, and published posts keep history but return `account_id: null`. It also discloses irreversibility and pre-call inspection via `scheduled_posts`.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and consequence, and nearly every clause carries distinct information (slot freeing, 404, cancellation, quota return, history behavior). It is dense rather than wasteful, though the run of chained clauses is longer than strictly needed for a single-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description compensates by naming the response field (`canceled_posts`) and the account-state fields (`account_id: null`) an agent will see. It also documents the pre-flight signal (`scheduled_posts`) and the irreversibility, so nothing needed to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the tool has only one parameter (account_id), so the schema already carries the parameter semantics. The description adds only the incidental note that a repeat call with 'the same id' 404s, which is behavioral rather than parameter meaning. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (disconnect) plus resource (connected account), and it explicitly differentiates from the closest sibling chirpie_deactivate_account, stating that deactivate keeps the connection while this removes it. An agent can pick between the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the when-to-use condition (permanent removal vs. temporary deactivation), names the alternative tool explicitly, and adds the recovery cost: 'Reconnecting it means the user authorizing Chirpie on that platform again.' Exclusions and alternatives are both spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_get_postGet a postA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPost ID

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds real behavioral value beyond them: it documents what a failed post returns (error_message, retry_count), that the reason connection_lost requires reconnecting the account before anything else publishes, and it routes to chirpie_list_accounts for identifying the account. It stops short of describing the success-path payload shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first sentence, and the following clauses are dense with operational detail rather than filler. The last two clauses run long and pack several ideas (error fields, connection_lost, list_accounts) into one sentence, but each idea earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the burden of explaining returns, and it does cover the important failure-state fields and the platform_post_url link for a single-post fetch. Missing coverage of the general success payload keeps it from being fully complete for a lookup tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With one parameter at 100% schema description coverage, the schema already documents id as the post ID. The description restates 'by ID' without adding format, sourcing, or ambiguity guidance, so it contributes no meaning beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get a single post by ID.' It is clearly distinguishable from bulk siblings like chirpie_list_posts and mutation siblings like chirpie_update_post. It does not, however, explicitly name a sibling to differentiate itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (fetch one post's details, especially when diagnosing a failed publish) rather than stated. The description notes that a Threads/Instagram post without a platform_post_url will have it 'asked for again here', which hints at a lookup use case, but it never contrasts this with chirpie_list_posts or other retrieval paths.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_get_x_keys_statusCheck your own X developer appA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: it returns configuration status plus the callback URI, and explicitly states it never returns the client secret — a meaningful disclosure for a credentials-adjacent tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste. The purpose is front-loaded and the security-relevant caveat (no client secret) is stated compactly rather than padded out.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so partially — it names configuration status and the callback URI but not the concrete shape of the status response. For a zero-param read tool whose annotations cover safety, this is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description correctly implies no input is needed and instead spends its words on what comes back, which is the right trade-off here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: checking whether the user has registered their own X developer app, and clarifies it is a status/configuration read. It implicitly contrasts with the set/remove x-keys siblings but never names them, so an agent must infer the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the mention of returning a callback URI signals this is how you learn what to register on the X app, but there is no explicit 'use this before set_x_keys' or 'use this instead of list_keys' guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_hide_commentHide or unhide a commentA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hiddenNotrue (default) hides the comment, false shows it again
post_idYesPost ID the comment is on
comment_idYesComment ID from chirpie_list_comments

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already covering safety (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description adds real behavioral context: unsupported platforms return comment_action_unsupported instead of a false success, and a hidden comment remains in the Chirpie listing behind include_hidden so moderation history is preserved. That is exactly the extra layer annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, no filler, and the core capability is front-loaded ahead of the platform caveat and the persistence note. Every sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter mutation with no output schema, the description covers the operation, platform support, failure token and post-hide state, so an agent has what it needs. Minor gap: it does not state reversal/permission requirements beyond what the idempotent annotation implies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter (hidden, post_id, comment_id) is already documented in the schema, so the baseline is 3. The description adds no syntax or format detail beyond what the schema provides; include_hidden refers to a listing tool, not this tool's inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (hide/unhide a comment) plus a scope constraint ('on a post you published'), which cleanly distinguishes it from chirpie_delete_comment and chirpie_hide_post. An agent can route to it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly scopes availability (Facebook, Instagram and Threads support hiding) and tells the agent what happens elsewhere, which is strong when-to-use guidance. It stops short of naming sibling alternatives such as chirpie_delete_comment for outright removal, so it is not a full when/when-not treatment.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_hide_postHide a post in ChirpieA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPost ID to hide. A thread or fan-out moves whole.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnly=false, idempotent=true, destructive=false. The description adds the non-obvious behavior: nothing reaches the platform, analytics/comments are preserved, no quota or billing impact, hidden posts are excluded from chirpie_list_posts unless include_hidden is true, and a hidden queued post still publishes. It also discloses the surprising return dimension that hidden_ids can list more posts than the id passed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then layered with caveats in rough order of importance. The all-caps emphasis and repeated contrast with chirpie_delete_post is slightly verbose, but nearly every clause carries a distinct routing or behavioral fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, non-destructive state toggle there is no output schema, yet the description still covers restore path, listing visibility, queued-post edge case, and the hidden_ids return shape. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single id parameter, so the baseline is already satisfied. The description goes beyond the schema by explaining that a thread or fan-out moves as one unit and that this is why the answer (hidden_ids) can name more posts than the id supplied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Hide a post from the user's Chirpie listings") and immediately scopes what it does not do. It names the sibling that actually removes content (chirpie_delete_post) and the inverse (chirpie_unhide_post), so an agent can separate it from the {delete, unhide, update}_post cluster without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use vs alternatives: use this to stop Chirpie showing a post, use chirpie_delete_post to take it off the platform, use chirpie_unhide_post to restore, and for a queued post use chirpie_delete_post because hiding won't stop publishing. Both the alternative and the condition that selects it are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_list_accountsList connected accountsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no output schema, the description carries the full semantics of the returned data: what `is_active: false` means, the exact vocabulary of `inactive_reason`, the consequence that a revoked token cancels scheduled posts with quota returned, and that reconnecting never needs a free slot. This is materially more than the readOnly/idempotent annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and each clause carries real information, but it is delivered as one dense, over-parenthesized block that mixes this tool's return semantics with sibling-tool behavior (what deactivate cancels, what reconnect requires). Structure would benefit from separating what this call returns from cross-tool guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless listing tool with no output schema, the description covers the fields an agent must interpret to act correctly and explains the LinkedIn `account_type` distinction. Nothing essential for correct use or follow-up action is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline of 4 applies; the schema is empty and there is nothing for the description to clarify. The mentions of `accounts_limit` and `accounts_active` describe returned fields, not inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first clause states a precise verb+resource ('List connected social accounts') and enumerates every platform covered. An agent immediately knows this is the enumeration tool for connection state, distinct from the many chirpie_connect_* siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description routes follow-up actions clearly: `inactive_reason` of `plan_limit` points to chirpie_activate_account, while `token_revoked`/`token_expired`/`reauth_required` require a fresh connect, and it notes retrying a post will not reactivate an account. It never explicitly frames when to call this lister itself versus checking state elsewhere, but the context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_list_commentsList comments on a postA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
syncNo'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), 'false' reads what is stored without one
limitNoComments to return (default 25, max 100)
sinceNoISO 8601 datetime: only comments posted after it
cursorNoThe next_cursor from the previous page
post_idYesPost ID whose comments to list
include_hiddenNoInclude comments you have hidden (they carry hidden: true)
include_deletedNoInclude 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

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint, and the description adds substantial context beyond them: snapshot freshness semantics via `sync` and `sync.reason`, per-platform capability flags including `delete_any`, cursor pagination, and the quota cost of the related reply action. This is rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence and the rest is dense, useful signal. The later sentences are run-on with stacked parentheticals, which slightly hurts scannability but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the burden of describing the return shape — `sync`, `sync.reason`, `capabilities`, and `next_cursor` — and it does so. An agent has everything needed to call and interpret the result correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema (including the `sync` enum values and their refresh windows). The description's 'Page with `next_cursor`' mostly restates schema content, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the comments on a post you published') plus the ordering ('newest first'). The scope constraint 'you published' and the capability enumeration implicitly separate it from the mutation siblings (chirpie_reply_to_comment, chirpie_hide_comment, chirpie_delete_comment).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for use — read a post's comments from the stored snapshot — and contrasts the free listing with quota-consuming replying, steering the agent away from mutation tools. It stops short of explicitly naming alternative tools or stating when not to use this one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_list_keysList API keysA
Read-onlyIdempotent
Inspect

List the user's Chirpie API keys (prefix + metadata; the full key is only shown on creation).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered by structured data. The description adds genuinely useful behavioral context beyond that: the return shape (prefix + metadata) and the security-relevant fact that the full secret is only shown at creation, which prevents an agent from attempting to re-fetch a key.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with a front-loaded verb and resource, plus one parenthetical that earns its place by disclosing the key-visibility limitation. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no input parameters and no output schema, the description carries the burden of describing the return value, and it does so ('prefix + metadata'). Nothing an agent needs in order to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a parameter-free tool is 4. No misleading parameter hints are present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('List the user's Chirpie API keys') and is naturally distinguishable from the create/revoke siblings in the same namespace. An agent can immediately tell this is a read-only inventory operation rather than a mutation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: it lists keys, so you'd call it to inspect existing key prefixes/metadata. The parenthetical hints at when you cannot use it for retrieval (full key only visible at creation), but no alternative tool or explicit condition is named, so guidance is only implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_list_postsList postsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 20)
statusNoFilter: 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'.
group_idNoOnly 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.
account_idNoFilter by account ID
include_hiddenNoInclude 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.

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, non-open-world), yet the description adds substantial behavior beyond them: the meaning of error_message and retry_count on failed posts, the enumerated cancel reasons on deleted posts (account_disconnected, account_deactivated, connection_lost), and the retention rule that Chirpie never removes post history. That is real disclosure an agent could not get from the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and filters are front-loaded in the first sentence, and the return-field detail follows. The middle sentences on error_message/retry_count are dense but relevant for a tool with no output schema; a tighter edit could trim redundancy around the hidden/deleted cases.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully explains the returned fields (platform_post_url, hidden, error_message, retry_count) and the delete/hide behaviors. Gaps remain around pagination/limit behavior and the group_id fan-out semantics, which are only covered parenthetically in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents limit, status, group_id, account_id and include_hidden, making 3 the baseline. The description reinforces the include_hidden/hidden relationship but says nothing about limit, group_id, or account_id beyond what the schema provides, so it adds no meaningful parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening two sentences state a specific verb and resource (list recent posts) plus the supported filters (status, account). It clearly differs from non-list siblings like chirpie_get_post or chirpie_post, but it never names a sibling or explicitly contrasts with get_post, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the reader learns that hidden posts are excluded unless include_hidden is true and that drafts are only returned with an explicit status filter (the latter lives in the schema, not the description). There is no explicit when-to-use-this-vs-alternative guidance, such as chirpie_get_post for a single post or chirpie_list_comments for comments.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_postPublish or schedule a postAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesPost 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 for Instagram, 63,206 for Facebook, 4,096 for Telegram, or 1,024 for Telegram when media_urls is set)
draftNoSave 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 stop it publishing as it stands.
mediaNoUploaded 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 a screen reader and is carried to X, Bluesky, LinkedIn, Mastodon, Instagram and Facebook. Use this or media_urls, not both. Images per post: X 4, Bluesky 4 (977 KB each), LinkedIn 4 (JPEG, PNG, GIF up to 8 MB), Threads 1, Mastodon 4, Instagram 10 (carousel), Facebook 10, Telegram 10. Video: X, Mastodon and Telegram only, one per post and never alongside images. Instagram REQUIRES at least 1 image. Anything a platform cannot take is refused with 400 unsupported_media, never dropped.
timezoneNoThe 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. Ignored when schedule_at already carries an offset. Leave it out to use the timezone saved on the account.
media_idsNoIds 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.
account_idNoAccount ID to post from (X, Bluesky, LinkedIn, Threads, Mastodon, Instagram, Facebook, or Telegram). Use this or account_ids, not both.
media_urlsNoPublic image or video URLs, for a post that needs no alt text. Same per-platform rules as `media`.
account_idsNoAccount 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 `success`: an account whose platform refused is reported there while the others stay published. Anything that fails the request as a whole (a character limit, a media rule, a spent quota) publishes nothing.
schedule_atNoISO 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-01T09:30:00', which is read in the timezone parameter or the one saved on the account and is refused when there is neither. Scheduled posts publish within ~5 minutes of this time. On a draft it is only the time you have in mind: the post is not queued for it.
configurationNoPer-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. Nothing is dropped quietly: a block keyed on a platform that takes no options, on a platform no account in the call uses, or a field the chosen placement does not carry, is refused with 400 configuration_unsupported naming the platform and the field. One block serves every account of that platform; give one account its own with an account_configurations entry.
first_commentNoA 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 with 400 first_comment_unsupported rather than dropped, and on a fan-out that refuses the whole request; an account_configurations entry whose first_comment is an empty string opts one account out. It counts as one post against the monthly quota, like a reply, and on X a first comment containing a link carries the same $0.25 surcharge a link post does and is rejected on the Free plan. It never fails the post: if it cannot be posted the post is still published and the answer carries first_comment with status "failed" and a reason, which chirpie_retry_first_comment sends again.
idempotency_keyNoA 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 request is refused with 422 idempotency_key_reused, and a retry that arrives while the first is still running is refused with 409 idempotency_in_progress; a retry after the first has finished collects the replay.
account_configurationsNoPer-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 replaces the shared media outright. Use one media spelling at a time.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare write/openWorld/non-idempotent/non-destructive. The description adds substantially beyond that: quota semantics and the two distinct 429 codes, X link-post billing and Free-plan rejection, the Instagram media requirement, draft-mode behavior plus the `warnings` array, and first_comment never failing the post. This is unusually rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long, but front-loaded with the core action and immediate-vs-scheduled branch first, then progressively deeper caveats. For a 13-parameter tool with nested objects, nearly every sentence (quota, media rules, draft warnings) earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, yet the description covers the failure modes (429 usage_limit_exceeded vs rate_limited, 400 unsupported_media/configuration_unsupported), the group_id per-account result shape, and draft warnings. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the nested objects are exhaustively documented, so the baseline is 3. The description restates the account_ids/account_configurations semantics that the schema already carries, adding little that isn't already in structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('Create a post') and enumerates the platforms, then distinguishes itself from chirpie_update_post (drafts) and the fan-out behavior. An agent can tell it apart from chirpie_thread and chirpie_update_post without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to account_ids for fan-out vs account_id, names schedule_at vs immediate publishing, points to draft:true for saving without sending, and directs editing/promotion to chirpie_update_post. When-to-use and the alternative are both stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_remove_x_keysRemove your own X developer appA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely useful downstream context: connected X accounts stop refreshing until keys are re-added or reconnected, which tells the agent the blast radius of the action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the destructive action front-loaded and the consequence following. No filler, no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter destructive tool, the description covers the action, the ownership scope, and the recovery path (re-adding keys). Combined with annotations covering reversibility and destructiveness, an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema is empty, so there is nothing for the description to disambiguate. Baseline of 4 applies for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Remove the user's own X developer app'. The possessive scope ('user's own') clarifies ownership. It doesn't distinguish from the sibling chirpie_revoke_key, which could plausibly be confused with this operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through the stated consequence (accounts stop refreshing), which hints at when an agent would invoke it. However, no explicit when-to-use guidance or comparison against alternatives like chirpie_revoke_key or chirpie_set_x_keys is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_reply_to_commentReply to a commentAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe reply text
post_idYesPost ID the comment is on
comment_idYesComment ID from chirpie_list_comments
idempotency_keyNoA 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 request is refused with 422 idempotency_key_reused, and a retry that arrives while the first is still running is refused with 409 idempotency_in_progress; a retry after the first has finished collects the replay.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the generic safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false). The description adds substantive behavior the annotations cannot: the reply becomes a public post, consumes monthly quota, triggers per-platform billing on X, and is rejected on the Free plan. That is exactly the side-effect disclosure a mutation tool needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action and then the operational consequences; nothing is padding. The second sentence is dense with billing/quota clauses but each clause is decision-relevant, so it stays efficient rather than bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description covers the publish side effects, quota consumption, billing and rejection rules, and character-limit inheritance. It omits what is returned on success and error surfaces beyond those in the schema, which is a minor gap for a write tool with no output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds only one marginal detail beyond the schema – that the same per-platform character limits as a post apply to text – while the idempotency_key semantics are richer in the schema itself. It neither compensates for nor detracts from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Reply to a comment on a post you published') and implicitly scopes the target, distinguishing it from chirpie_post (new posts), chirpie_thread (threads), and the hide/delete comment siblings. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives useful situational context (reply is published publicly, counts against the monthly quota, link-containing X replies cost $0.25 and are rejected on Free), which helps decide whether to call it. However, it names no alternative tool and gives no explicit when-not-to-use guidance, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_retry_first_commentRetry a first commentAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe post whose first comment to retry. For a thread, the last part, which is the one that carries it.
idempotency_keyNoA 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 request is refused with 422 idempotency_key_reused, and a retry that arrives while the first is still running is refused with 409 idempotency_in_progress; a retry after the first has finished collects the replay.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (which only say this is a non-readonly, non-destructive write), the description discloses the monthly-quota cost of a successful retry, the exact refusal codes (404 first_comment_not_found, 409 first_comment_not_retryable) and the propagation of the platform's own failure. That is genuine operational context an agent cannot get from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence and every subsequent clause carries real information (quota, preconditions, refusal codes). It is a single dense block of long sentences, which is slightly heavy, but there is little filler to cut.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully carries the burden: it covers the trigger condition, quota implications, sibling-tool escape hatch, and every documented failure mode. An agent has enough to call this correctly without further reading.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both params (id, idempotency_key) are already documented, including the idempotency replay semantics. The description adds the conceptual point that the comment text is carried by the post rather than passed in, but no syntax or format details beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence gives a specific verb, resource and click-scope: 'Post a first comment that failed, again.' It is immediately distinguishable from siblings like chirpie_update_post and chirpie_reply_to_comment, and it further pins down that the text is the one the post already holds rather than a new body.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the precondition for use (a first comment left in status 'failed' on a published post) and routes the agent elsewhere when the text must change, citing chirpie_update_post and its 409 post_not_editable refusal. Explicit 'when not to use' is only implied via the refusal list, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_revoke_keyRevoke an API keyA
DestructiveIdempotent
Inspect

Revoke a Chirpie API key by its ID. Revocation is permanent and immediate.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAPI key ID to revoke

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered structurally. The description adds real value beyond that by stating the effect is 'permanent and immediate', clarifying that the action is irreversible rather than a soft disable (contrast with chirpie_deactivate_account). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero waste, with the action front-loaded before the permanence warning. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool with full annotation coverage and no output schema, the description supplies what structured fields cannot: permanence and immediacy. It omits any return/confirmation behavior and routing to sibling key tools, which keeps it just under complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single 'id' parameter is fully described in the schema. The description's 'by its ID' merely restates that, adding no format, source, or validation detail beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (revoke) and resource (Chirpie API key) plus the lookup key (ID), which is unambiguous. It does not explicitly differentiate itself from the similarly named sibling chirpie_remove_x_keys, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says nothing about when to revoke versus using chirpie_remove_x_keys, chirpie_delete_comment, or other destructive siblings, and gives no preconditions (e.g., ownership or confirmation). Usage must be inferred entirely from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_set_x_keysSet your own X developer appA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoOptional human-readable name for the app
client_idYesOAuth 2.0 Client ID from developer.x.com
client_secretYesOAuth 2.0 Client Secret from developer.x.com. Stored encrypted and never returned.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, and the description adds valuable workflow behavior: a redirect_uri is returned, it must be registered as a callback URI, and each account must be reconnected. It does not disclose what the destructive hint actually destroys (e.g. overwriting previously stored keys), which is a remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action, followed by the billing benefit and the required post-steps. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by explaining the returned redirect_uri and the exact next steps the user must take. An agent has everything needed to invoke the tool and instruct the user correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so client_id, client_secret and label are already documented in the schema. The description adds context about where the credentials come from and their effect on billing, but no additional per-parameter syntax or format detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource: registering the user's OWN X developer app so their accounts post against their own API credits. This clearly differentiates it from siblings like chirpie_connect_x (account connection) and chirpie_get_x_keys_status (status check).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the context for using it (own app, own credits, no surcharge) and names the follow-up alternative chirpie_connect_x that must be called afterward. It does not explicitly state when NOT to use it (e.g. if the user is happy with Chirpie's credits), but the selection context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_threadPublish or schedule a threadAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
draftNoSave the thread without sending it. Every part is stored with status draft, nothing reaches the platform, and it costs no quota.
postsYesArray 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.
timezoneNoThe 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. Ignored when schedule_at already carries an offset. Leave it out to use the timezone saved on the account.
account_idNoAccount 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_idsNoAccount 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 own `success`: an account whose platform refused is reported there while the others stay published.
schedule_atNoISO 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-11-01T09:30:00', which is read in the timezone parameter or the one saved on the account and is refused when there is neither. Scheduled threads publish within ~5 minutes of this time. On a draft it is only the time you have in mind.
configurationNoPer-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. Nothing is dropped quietly: a block keyed on a platform that takes no options, on a platform no account in the call uses, or a field the chosen placement does not carry, is refused with 400 configuration_unsupported naming the platform and the field. One block serves every account of that platform; give one account its own with an account_configurations entry. A thread publishes to the feed: an Instagram story or reel, and a Facebook Page story, are each a single post, so a thread asking for one of those placements is refused.
first_commentNoA 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, Instagram and Facebook only: anywhere else is refused with 400 first_comment_unsupported rather than dropped. It counts as one post against the monthly quota, and it never fails the thread.
idempotency_keyNoA 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 request is refused with 422 idempotency_key_reused, and a retry that arrives while the first is still running is refused with 409 idempotency_in_progress; a retry after the first has finished collects the replay.
account_configurationsNoPer-account threads, keyed by account ID. Every key must also be in account_ids. An account with no entry publishes the shared posts.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false, openWorld=true, idempotent=false, destructive=false; the description adds far more: the atomic thread contract, what a rollback deletes, the thread_rollback payload, the difference between upstream_error (safe to retry) and thread_rollback_incomplete (retry would double-publish), the Instagram delete limitation, X link billing, and the 429 quota vs burst-limit distinction. This is exactly the behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the atomicity contract are front-loaded, and almost every clause carries operational weight (rollback codes, quotas, platform threading support). It is nonetheless very dense and long, with several multi-clause sentences that could be split or trimmed without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, nested-schema, no-output-schema mutation tool, the description covers the failure modes, retry safety, quota and rate-limit behavior, draft semantics, and enough of the response shape (group_id, per-account success, warnings, thread_rollback) that an agent can act and recover correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: what naming account_ids changes in the response, that a draft may be a single part, that a thread needs two parts to publish, and the interaction between schedule_at and timezone. It does not explain idempotency_key, which lives only in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb (create/publish a thread) and the resource (multiple posts on named platforms), and the definition is clearly distinct from the single-post sibling chirpie_post. It also disambiguates the multi-account variant (account_ids vs account_id) within the opening sentences.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for when to use it (multi-part threads, multi-account fan-out, scheduling, drafts) and states the condition that selects account_ids over account_id. It never explicitly names chirpie_post as the alternative for single posts or says when not to use this tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_unhide_postUnhide a post in ChirpieA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPost ID to show again. A thread or fan-out moves whole.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds value beyond them by disclosing that 'nothing reaches the platform' (no external side effect) and that unhiding a never-hidden post succeeds and changes nothing, giving concrete idempotency semantics. It stops short of describing the return payload, but no output schema exists to lean on.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, followed by the undo relationship and a discovery hint. Every sentence carries distinct information with no repetition or padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, non-destructive, idempotent local operation with full schema coverage and existing annotations, the description covers purpose, inverse relationship, side-effect scope, and idempotency edge case. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single id parameter is fully documented in the schema, including the 'thread or fan-out moves whole' note. The description adds no parameter-level detail beyond what the schema already provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Put a hidden post back in the user's Chirpie listings') and explicitly identifies itself as the inverse of the sibling chirpie_hide_post. An agent can distinguish it from hide_post, delete_post, and list_posts without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the operation it undoes (chirpie_hide_post) and points to chirpie_list_posts with include_hidden true as the way to find hidden posts, which is real routing guidance. It does not state an explicit when-not-to-use case, but the context is clear for such a narrow tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_update_postEdit a queued post or draftA
Destructive
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPost ID to edit
textNoReplacement text. The same per-platform character limits apply as when creating a post.
draftNoKeep 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.
mediaNoReplacement media, following the same per-platform rules as creating a post. Pass an empty array to remove the media.
publishNoPublish 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.
timezoneNoThe 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.
media_urlsNoReplacement public image or video URLs, for a post that needs no alt text. Pass an empty array to remove the media.
schedule_atNoNew 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 in the timezone parameter or the one saved on the account. Omit it to keep the time the post already has. On a draft this promotes it to scheduled, unless draft: true is sent too.
configurationNoNew 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 merging into them. The same rules a create runs apply, so a placement the post's media or text does not suit is refused with 400 configuration_unsupported.
first_commentNoA 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 belongs to the thread, so it applies whichever part you addressed.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only flag the mutation profile (destructiveHint=true, idempotentHint=false, openWorldHint=true). The description goes well beyond them by disclosing the 409 error code, the quota semantics ('costs nothing, since it spent its quota when it was created'), thread-wide rescheduling via rescheduled_post_ids, draft warnings behavior, and the create-equivalent validation on promotion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence is correctly front-loaded with the core action and scope. The remainder is information-dense with little waste, but it is delivered as one long unbroken paragraph, which hurts scannability for a tool with this many conditional behaviors.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly takes on return-value disclosure: it names rescheduled_post_ids, the warnings array, and promoted_from_draft_id. Combined with the error code and quota/thread behavior, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter is richly documented, so the baseline is 3. The description still adds cross-parameter semantics the schema states only piecemeal: omitting schedule_at preserves the existing time and never publishes, publish and schedule_at are mutually exclusive, and draft:true alongside schedule_at changes only the remembered time.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource plus a hard scope constraint: 'Edit a post that has not published yet, or finish a draft.' It clearly distinguishes the two modes (editing a queued post vs. finishing/promoting a draft) and reads differently from siblings like chirpie_post, chirpie_delete_post, or chirpie_get_post.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use and when-not-to-use conditions: a post can only be edited while still waiting to publish, and 'publishing, published, failed or deleted is refused with 409 post_not_editable.' It further spells out the mode-selecting conditions for schedule_at, draft:true, and publish:true, so the agent knows which parameters apply to which state.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

chirpie_upload_mediaUpload mediaAInspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoA public image or video URL for Chirpie to fetch and store.
dataNoThe file's bytes, base64 encoded. Use this or url, not both.
filenameNoA name to show in the dashboard. Never used to decide the file type.
idempotency_keyNoA 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 request is refused with 422 idempotency_key_reused, and a retry that arrives while the first is still running is refused with 409 idempotency_in_progress; a retry after the first has finished collects the replay.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), so the description carries real weight here and delivers: type detection from the file's own bytes rather than name/declared type, a 7-day id lifetime, the fact that a post keeps its own byte copy so expiry is harmless, and the 3 MB data limit. These are exactly the non-obvious traits an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, followed by input modes, safety behavior, attachment guidance, and limits in a logical order. Every sentence carries distinct information and none repeats the structured fields verbatim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must explain the return value, and it does (the id, its 7-day validity, how to attach it). Combined with lifetime, size limits, and the byte-copy guarantee, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description nevertheless adds meaning the schema lacks, notably the 3 MB ceiling on `data` and the rationale that the bound applies to the request, not the post. The `url`/`data` exclusivity and byte-sniffing behavior largely restate schema descriptions, so it sits above baseline but not at the top.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Upload an image or a video') and states the concrete outcome ('get back the id a post can attach'), which distinguishes it from the sibling post-creation tools it feeds. An agent can tell exactly what this tool produces without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use routing: supply either `url` or `data`, and it names the alternative path for large files ('attach a larger file with media_urls instead, which has no such limit'). It also names the three sibling tools (chirpie_post, chirpie_thread, chirpie_update_post) that consume the returned id, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updates
    • Changedchirpie_list_comments1 field changed
      • changedInput schema / properties / include_deleted / description
        Previous value: -"Include deleted comments (they carry deleted: true and keep the last text Chirpie stored). Deleting a comment on LinkedIn, or on Facebook, Instagram or Threads (coming soon), deletes its replies too"New value: +"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"
    • Changedchirpie_post9 fields changed
      • changedInput schema / properties / account_configurations / additionalProperties / properties / configuration / properties / facebook / description
        Previous value: -"How a Facebook Page (coming soon) publishes this post."New value: +"How a Facebook Page publishes this post."
      • changedInput schema / properties / account_configurations / additionalProperties / properties / configuration / properties / instagram / description
        Previous value: -"How an Instagram account (coming soon) publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."New value: +"How an Instagram account publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."
      • changedInput schema / properties / account_id / description
        Previous value: -"Account ID to post from (X, Bluesky, LinkedIn, Mastodon or Telegram; Threads, Instagram and Facebook coming soon). Use this or account_ids, not both."New value: +"Account ID to post from (X, Bluesky, LinkedIn, Threads, Mastodon, Instagram, Facebook, or Telegram). Use this or account_ids, not both."
      • changedInput schema / properties / configuration / description
        Previous value: -"Per-platform publishing options, keyed by platform. Two platforms take options, both coming soon: 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. Nothing is dropped quietly: a block keyed on a platform that takes no options, on a platform no account in the call uses, or a field the chosen placement does not carry, is refused with 400 configuration_unsupported naming the platform and the field. One block serves every account of that platform; give one account its own with an account_configurations entry."New value: +"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. Nothing is dropped quietly: a block keyed on a platform that takes no options, on a platform no account in the call uses, or a field the chosen placement does not carry, is refused with 400 configuration_unsupported naming the platform and the field. One block serves every account of that platform; give one account its own with an account_configurations entry."
      • changedInput schema / properties / configuration / properties / facebook / description
        Previous value: -"How a Facebook Page (coming soon) publishes this post."New value: +"How a Facebook Page publishes this post."
      • changedInput schema / properties / configuration / properties / instagram / description
        Previous value: -"How an Instagram account (coming soon) publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."New value: +"How an Instagram account publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."
      • changedInput schema / properties / first_comment / description
        Previous value: -"A comment to publish under the post the moment it goes out, the \"link in the first comment\" pattern. Available on X, and on Threads, Instagram and Facebook (coming soon). Sending it to any other platform is refused with 400 first_comment_unsupported rather than dropped, and on a fan-out that refuses the whole request; an account_configurations entry whose first_comment is an empty string opts one account out. It counts as one post against the monthly quota, like a reply, and on X a first comment containing a link carries the same $0.25 surcharge a link post does and is rejected on the Free plan. It never fails the post: if it cannot be posted the post is still published and the answer carries first_comment with status \"failed\" and a reason, which chirpie_retry_first_comment sends again."New value: +"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 with 400 first_comment_unsupported rather than dropped, and on a fan-out that refuses the whole request; an account_configurations entry whose first_comment is an empty string opts one account out. It counts as one post against the monthly quota, like a reply, and on X a first comment containing a link carries the same $0.25 surcharge a link post does and is rejected on the Free plan. It never fails the post: if it cannot be posted the post is still published and the answer carries first_comment with status \"failed\" and a reason, which chirpie_retry_first_comment sends again."
      • changedInput schema / properties / media / description
        Previous value: -"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 a screen reader and is carried to X, Bluesky, LinkedIn and Mastodon, and to Instagram and Facebook (coming soon). Use this or media_urls, not both. Images per post: X 4, Bluesky 4 (977 KB each), LinkedIn 4 (JPEG, PNG, GIF up to 8 MB), Mastodon 4, Telegram 10, and once available Threads 1, Instagram 10 (carousel), Facebook 10. Video: X, Mastodon and Telegram only, one per post and never alongside images. Instagram REQUIRES at least 1 image. Anything a platform cannot take is refused with 400 unsupported_media, never dropped."New value: +"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 a screen reader and is carried to X, Bluesky, LinkedIn, Mastodon, Instagram and Facebook. Use this or media_urls, not both. Images per post: X 4, Bluesky 4 (977 KB each), LinkedIn 4 (JPEG, PNG, GIF up to 8 MB), Threads 1, Mastodon 4, Instagram 10 (carousel), Facebook 10, Telegram 10. Video: X, Mastodon and Telegram only, one per post and never alongside images. Instagram REQUIRES at least 1 image. Anything a platform cannot take is refused with 400 unsupported_media, never dropped."
      • changedInput schema / properties / text / description
        Previous value: -"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 Mastodon, 4,096 for Telegram, or 1,024 for Telegram when media_urls is set; coming soon: 500 for Threads, 2,200 for Instagram, 63,206 for Facebook)"New value: +"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 for Instagram, 63,206 for Facebook, 4,096 for Telegram, or 1,024 for Telegram when media_urls is set)"
    • Changedchirpie_thread9 fields changed
      • changedInput schema / properties / account_configurations / additionalProperties / properties / configuration / properties / facebook / description
        Previous value: -"How a Facebook Page (coming soon) publishes this post."New value: +"How a Facebook Page publishes this post."
      • changedInput schema / properties / account_configurations / additionalProperties / properties / configuration / properties / instagram / description
        Previous value: -"How an Instagram account (coming soon) publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."New value: +"How an Instagram account publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."
      • changedInput schema / properties / account_id / description
        Previous value: -"Account ID to post from (X, Bluesky, LinkedIn, Mastodon or Telegram; Threads, Instagram and Facebook coming soon). Some platforms degrade to standalone posts. Use this or account_ids, not both."New value: +"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."
      • changedInput schema / properties / configuration / description
        Previous value: -"Per-platform publishing options, keyed by platform. Two platforms take options, both coming soon: 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. Nothing is dropped quietly: a block keyed on a platform that takes no options, on a platform no account in the call uses, or a field the chosen placement does not carry, is refused with 400 configuration_unsupported naming the platform and the field. One block serves every account of that platform; give one account its own with an account_configurations entry. A thread publishes to the feed: an Instagram story or reel, and a Facebook Page story, are each a single post, so a thread asking for one of those placements is refused."New value: +"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. Nothing is dropped quietly: a block keyed on a platform that takes no options, on a platform no account in the call uses, or a field the chosen placement does not carry, is refused with 400 configuration_unsupported naming the platform and the field. One block serves every account of that platform; give one account its own with an account_configurations entry. A thread publishes to the feed: an Instagram story or reel, and a Facebook Page story, are each a single post, so a thread asking for one of those placements is refused."
      • changedInput schema / properties / configuration / properties / facebook / description
        Previous value: -"How a Facebook Page (coming soon) publishes this post."New value: +"How a Facebook Page publishes this post."
      • changedInput schema / properties / configuration / properties / instagram / description
        Previous value: -"How an Instagram account (coming soon) publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."New value: +"How an Instagram account publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."
      • changedInput schema / properties / first_comment / description
        Previous value: -"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, and on Threads, Instagram and Facebook (coming soon). Anywhere else it is refused with 400 first_comment_unsupported rather than dropped. It counts as one post against the monthly quota, and it never fails the thread."New value: +"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, Instagram and Facebook only: anywhere else is refused with 400 first_comment_unsupported rather than dropped. It counts as one post against the monthly quota, and it never fails the thread."
      • changedInput schema / properties / posts / items / properties / media / description
        Previous value: -"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 a screen reader and is carried to X, Bluesky, LinkedIn and Mastodon, and to Instagram and Facebook (coming soon). Use this or media_urls, not both. Images per post: X 4, Bluesky 4 (977 KB each), LinkedIn 4 (JPEG, PNG, GIF up to 8 MB), Mastodon 4, Telegram 10, and once available Threads 1, Instagram 10 (carousel), Facebook 10. Video: X, Mastodon and Telegram only, one per post and never alongside images. Instagram REQUIRES at least 1 image. Anything a platform cannot take is refused with 400 unsupported_media, never dropped."New value: +"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 a screen reader and is carried to X, Bluesky, LinkedIn, Mastodon, Instagram and Facebook. Use this or media_urls, not both. Images per post: X 4, Bluesky 4 (977 KB each), LinkedIn 4 (JPEG, PNG, GIF up to 8 MB), Threads 1, Mastodon 4, Instagram 10 (carousel), Facebook 10, Telegram 10. Video: X, Mastodon and Telegram only, one per post and never alongside images. Instagram REQUIRES at least 1 image. Anything a platform cannot take is refused with 400 unsupported_media, never dropped."
      • changedInput schema / properties / posts / items / properties / text / description
        Previous value: -"Post text (max 280 chars for standard X, 25,000 for X Premium, 300 for Bluesky, 3,000 for LinkedIn, 500 for Mastodon, 4,096 for Telegram, or 1,024 for Telegram when media_urls is set; coming soon: 500 for Threads, 2,200 for Instagram, 63,206 for Facebook)"New value: +"Post text (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 for Instagram, 63,206 for Facebook, 4,096 for Telegram, or 1,024 for Telegram when media_urls is set)"
    • Changedchirpie_update_post2 fields changed
      • changedInput schema / properties / configuration / properties / facebook / description
        Previous value: -"How a Facebook Page (coming soon) publishes this post."New value: +"How a Facebook Page publishes this post."
      • changedInput schema / properties / configuration / properties / instagram / description
        Previous value: -"How an Instagram account (coming soon) publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."New value: +"How an Instagram account publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."
  2. 2 tool updates
    • Changedchirpie_connect_bluesky1 field changed
      • changedInput schema / properties / app_password / description
        Previous value: -"Bluesky app password"New value: +"Bluesky app password, shaped xxxx-xxxx-xxxx-xxxx (four groups of four lowercase letters or digits). The account password is refused."
    • Changedchirpie_connect_mastodon1 field changed
      • changedInput schema / properties / instance_url / description
        Previous value: -"Mastodon instance. A bare host is enough (\"mastodon.social\"), and \"https://mastodon.social\" or an \"@you@fosstodon.org\" address also work."New value: +"The Mastodon server, in any form: \"mastodon.social\", \"https://mastodon.social/\", a handle (\"@you@mastodon.social\") or a profile URL (\"https://mastodon.social/@you\")."
  3. 4 tool updates
    • Changedchirpie_list_comments1 field changed
      • changedInput schema / properties / include_deleted / description
        Previous value: -"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"New value: +"Include deleted comments (they carry deleted: true and keep the last text Chirpie stored). Deleting a comment on LinkedIn, or on Facebook, Instagram or Threads (coming soon), deletes its replies too"
    • Changedchirpie_post9 fields changed
      • changedInput schema / properties / account_configurations / additionalProperties / properties / configuration / properties / facebook / description
        Previous value: -"How a Facebook Page publishes this post."New value: +"How a Facebook Page (coming soon) publishes this post."
      • changedInput schema / properties / account_configurations / additionalProperties / properties / configuration / properties / instagram / description
        Previous value: -"How an Instagram account publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."New value: +"How an Instagram account (coming soon) publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."
      • changedInput schema / properties / account_id / description
        Previous value: -"Account ID to post from (X, Bluesky, LinkedIn, Threads, Mastodon, Instagram, Facebook, or Telegram). Use this or account_ids, not both."New value: +"Account ID to post from (X, Bluesky, LinkedIn, Mastodon or Telegram; Threads, Instagram and Facebook coming soon). Use this or account_ids, not both."
      • changedInput schema / properties / configuration / description
        Previous value: -"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. Nothing is dropped quietly: a block keyed on a platform that takes no options, on a platform no account in the call uses, or a field the chosen placement does not carry, is refused with 400 configuration_unsupported naming the platform and the field. One block serves every account of that platform; give one account its own with an account_configurations entry."New value: +"Per-platform publishing options, keyed by platform. Two platforms take options, both coming soon: 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. Nothing is dropped quietly: a block keyed on a platform that takes no options, on a platform no account in the call uses, or a field the chosen placement does not carry, is refused with 400 configuration_unsupported naming the platform and the field. One block serves every account of that platform; give one account its own with an account_configurations entry."
      • changedInput schema / properties / configuration / properties / facebook / description
        Previous value: -"How a Facebook Page publishes this post."New value: +"How a Facebook Page (coming soon) publishes this post."
      • changedInput schema / properties / configuration / properties / instagram / description
        Previous value: -"How an Instagram account publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."New value: +"How an Instagram account (coming soon) publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."
      • changedInput schema / properties / first_comment / description
        Previous value: -"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 with 400 first_comment_unsupported rather than dropped, and on a fan-out that refuses the whole request; an account_configurations entry whose first_comment is an empty string opts one account out. It counts as one post against the monthly quota, like a reply, and on X a first comment containing a link carries the same $0.25 surcharge a link post does and is rejected on the Free plan. It never fails the post: if it cannot be posted the post is still published and the answer carries first_comment with status \"failed\" and a reason, which chirpie_retry_first_comment sends again."New value: +"A comment to publish under the post the moment it goes out, the \"link in the first comment\" pattern. Available on X, and on Threads, Instagram and Facebook (coming soon). Sending it to any other platform is refused with 400 first_comment_unsupported rather than dropped, and on a fan-out that refuses the whole request; an account_configurations entry whose first_comment is an empty string opts one account out. It counts as one post against the monthly quota, like a reply, and on X a first comment containing a link carries the same $0.25 surcharge a link post does and is rejected on the Free plan. It never fails the post: if it cannot be posted the post is still published and the answer carries first_comment with status \"failed\" and a reason, which chirpie_retry_first_comment sends again."
      • changedInput schema / properties / media / description
        Previous value: -"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 a screen reader and is carried to X, Bluesky, LinkedIn, Mastodon, Instagram and Facebook. Use this or media_urls, not both. Images per post: X 4, Bluesky 4 (977 KB each), LinkedIn 4 (JPEG, PNG, GIF up to 8 MB), Threads 1, Mastodon 4, Instagram 10 (carousel), Facebook 10, Telegram 10. Video: X, Mastodon and Telegram only, one per post and never alongside images. Instagram REQUIRES at least 1 image. Anything a platform cannot take is refused with 400 unsupported_media, never dropped."New value: +"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 a screen reader and is carried to X, Bluesky, LinkedIn and Mastodon, and to Instagram and Facebook (coming soon). Use this or media_urls, not both. Images per post: X 4, Bluesky 4 (977 KB each), LinkedIn 4 (JPEG, PNG, GIF up to 8 MB), Mastodon 4, Telegram 10, and once available Threads 1, Instagram 10 (carousel), Facebook 10. Video: X, Mastodon and Telegram only, one per post and never alongside images. Instagram REQUIRES at least 1 image. Anything a platform cannot take is refused with 400 unsupported_media, never dropped."
      • changedInput schema / properties / text / description
        Previous value: -"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 for Instagram, 63,206 for Facebook, 4,096 for Telegram, or 1,024 for Telegram when media_urls is set)"New value: +"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 Mastodon, 4,096 for Telegram, or 1,024 for Telegram when media_urls is set; coming soon: 500 for Threads, 2,200 for Instagram, 63,206 for Facebook)"
    • Changedchirpie_thread9 fields changed
      • changedInput schema / properties / account_configurations / additionalProperties / properties / configuration / properties / facebook / description
        Previous value: -"How a Facebook Page publishes this post."New value: +"How a Facebook Page (coming soon) publishes this post."
      • changedInput schema / properties / account_configurations / additionalProperties / properties / configuration / properties / instagram / description
        Previous value: -"How an Instagram account publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."New value: +"How an Instagram account (coming soon) publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."
      • changedInput schema / properties / account_id / description
        Previous value: -"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."New value: +"Account ID to post from (X, Bluesky, LinkedIn, Mastodon or Telegram; Threads, Instagram and Facebook coming soon). Some platforms degrade to standalone posts. Use this or account_ids, not both."
      • changedInput schema / properties / configuration / description
        Previous value: -"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. Nothing is dropped quietly: a block keyed on a platform that takes no options, on a platform no account in the call uses, or a field the chosen placement does not carry, is refused with 400 configuration_unsupported naming the platform and the field. One block serves every account of that platform; give one account its own with an account_configurations entry. A thread publishes to the feed: an Instagram story or reel, and a Facebook Page story, are each a single post, so a thread asking for one of those placements is refused."New value: +"Per-platform publishing options, keyed by platform. Two platforms take options, both coming soon: 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. Nothing is dropped quietly: a block keyed on a platform that takes no options, on a platform no account in the call uses, or a field the chosen placement does not carry, is refused with 400 configuration_unsupported naming the platform and the field. One block serves every account of that platform; give one account its own with an account_configurations entry. A thread publishes to the feed: an Instagram story or reel, and a Facebook Page story, are each a single post, so a thread asking for one of those placements is refused."
      • changedInput schema / properties / configuration / properties / facebook / description
        Previous value: -"How a Facebook Page publishes this post."New value: +"How a Facebook Page (coming soon) publishes this post."
      • changedInput schema / properties / configuration / properties / instagram / description
        Previous value: -"How an Instagram account publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."New value: +"How an Instagram account (coming soon) publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."
      • changedInput schema / properties / first_comment / description
        Previous value: -"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, Instagram and Facebook only: anywhere else is refused with 400 first_comment_unsupported rather than dropped. It counts as one post against the monthly quota, and it never fails the thread."New value: +"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, and on Threads, Instagram and Facebook (coming soon). Anywhere else it is refused with 400 first_comment_unsupported rather than dropped. It counts as one post against the monthly quota, and it never fails the thread."
      • changedInput schema / properties / posts / items / properties / media / description
        Previous value: -"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 a screen reader and is carried to X, Bluesky, LinkedIn, Mastodon, Instagram and Facebook. Use this or media_urls, not both. Images per post: X 4, Bluesky 4 (977 KB each), LinkedIn 4 (JPEG, PNG, GIF up to 8 MB), Threads 1, Mastodon 4, Instagram 10 (carousel), Facebook 10, Telegram 10. Video: X, Mastodon and Telegram only, one per post and never alongside images. Instagram REQUIRES at least 1 image. Anything a platform cannot take is refused with 400 unsupported_media, never dropped."New value: +"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 a screen reader and is carried to X, Bluesky, LinkedIn and Mastodon, and to Instagram and Facebook (coming soon). Use this or media_urls, not both. Images per post: X 4, Bluesky 4 (977 KB each), LinkedIn 4 (JPEG, PNG, GIF up to 8 MB), Mastodon 4, Telegram 10, and once available Threads 1, Instagram 10 (carousel), Facebook 10. Video: X, Mastodon and Telegram only, one per post and never alongside images. Instagram REQUIRES at least 1 image. Anything a platform cannot take is refused with 400 unsupported_media, never dropped."
      • changedInput schema / properties / posts / items / properties / text / description
        Previous value: -"Post text (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 for Instagram, 63,206 for Facebook, 4,096 for Telegram, or 1,024 for Telegram when media_urls is set)"New value: +"Post text (max 280 chars for standard X, 25,000 for X Premium, 300 for Bluesky, 3,000 for LinkedIn, 500 for Mastodon, 4,096 for Telegram, or 1,024 for Telegram when media_urls is set; coming soon: 500 for Threads, 2,200 for Instagram, 63,206 for Facebook)"
    • Changedchirpie_update_post2 fields changed
      • changedInput schema / properties / configuration / properties / facebook / description
        Previous value: -"How a Facebook Page publishes this post."New value: +"How a Facebook Page (coming soon) publishes this post."
      • changedInput schema / properties / configuration / properties / instagram / description
        Previous value: -"How an Instagram account publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."New value: +"How an Instagram account (coming soon) publishes this post. A story carries no caption (send empty text), no first comment and no collaborators. A reel takes one video, collaborators, user tags, a cover, share_to_feed and trial_reel."
  4. 33 tool updates
    • First observedchirpie_activate_account
    • First observedchirpie_analytics
    • First observedchirpie_connect_bluesky
    • First observedchirpie_connect_facebook
    • First observedchirpie_connect_instagram
    • First observedchirpie_connect_linkedin
    • First observedchirpie_connect_mastodon
    • First observedchirpie_connect_telegram
    • First observedchirpie_connect_threads
    • First observedchirpie_connect_x
    • First observedchirpie_create_key
    • First observedchirpie_deactivate_account
    • First observedchirpie_delete_comment
    • First observedchirpie_delete_post
    • First observedchirpie_disconnect_account
    • First observedchirpie_get_post
    • First observedchirpie_get_x_keys_status
    • First observedchirpie_hide_comment
    • First observedchirpie_hide_post
    • First observedchirpie_list_accounts
    • First observedchirpie_list_comments
    • First observedchirpie_list_keys
    • First observedchirpie_list_posts
    • First observedchirpie_post
    • First observedchirpie_remove_x_keys
    • First observedchirpie_reply_to_comment
    • First observedchirpie_retry_first_comment
    • First observedchirpie_revoke_key
    • First observedchirpie_set_x_keys
    • First observedchirpie_thread
    • First observedchirpie_unhide_post
    • First observedchirpie_update_post
    • First observedchirpie_upload_media

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Social media scheduling and publishing for AI agents. 17 validation-first tools to post to X, LinkedIn, Instagram, TikTok, YouTube, Reddit, Discord, Telegram, and more through one connected workspace.
    87 npm
    95
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Manage Threads and Bluesky social media from AI assistants. Schedule posts, check analytics, and automate follow-up replies.
    3
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Schedule, manage, generate, and analyze social posts across 11 networks (Instagram, TikTok, X, LinkedIn, YouTube, Facebook, Pinterest, Threads, Bluesky, Mastodon, Telegram) from any AI agent — 13 tools covering scheduling, media upload, AI caption generation, best-times, analytics, listening, and comments.
    13
    57 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.