instagram-mcp
Allows reading and sending Instagram direct messages, managing threads (list, get, search, hide, mute, unmute), sending media, and autonomous conversation handling.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@instagram-mcpcheck my pending message requests"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Instagram MCP Server
An MCP server that lets Claude read and send Instagram DMs. Built entirely by Claude in a 3-hour vibe coding session with auto-accept enabled.
Features
New DMs, typing, reactions, read receipts, edits and unsends arrive over Instagram's MQTT connection and are pushed straight into the Claude Code session as channel events. Nothing polls. The channel tools use the same names as the WhatsApp channel.
Channel (realtime)
subscribe/unsubscribe/list_subscriptions- Pick which chats stream events, each under a short aliasreply- Send a text messagesend_file/send_audio- Send a photo or video (optionally view once or allow replay) / a voice message (converted to.m4a)send_typing/mark_read- Typing indicator / "Seen"react/unsend/get_message_ids- React, take back your own messagesdownload_attachment- Fetch a photo, video or voice clip (view-once media only to a temporary folder)open_share/transcribe_share- Open a shared reel, post or story (files, a frame preview per video) / hear what is said in itset_idle- Tune the idle-nudge cadence per chat
Reading
list_threads/get_thread/search_threads/get_pending_threads- Browse conversationsget_messages/get_chat_log- History, with read receipts (seen_since)
Inbox and sharing
hide_thread/mark_thread_unread/mute_thread/unmute_threadshare_media/share_profile
Shared reels, posts and stories
A share arrives as [reel by @author: caption β link] with its cover image in
media_path, whoever sent it. The caption costs one API call per share. The video is
only downloaded when a persona calls open_share, which returns 6 frames stitched into
one preview; the tool description shows how to pull more frames with ffmpeg.
transcribe_share is separate, so nothing is transcribed by accident.
Idle nudges
A quiet subscribed chat gets an idle event every INSTAGRAM_IDLE_MINUTES (5). Once it
has been quiet for INSTAGRAM_IDLE_BACKOFF_AFTER_MINUTES (30), each nudge doubles the gap
to the next, up to INSTAGRAM_IDLE_MAX_MINUTES (240). Any activity resets it.
Related MCP server: Instagram DMs MCP
The /dm Skill - Autonomous Conversations
The real magic. Launch Claude as an autonomous agent that handles entire DM conversations:
/dm @username "your goal here"Claude will:
Read conversation history for context
Send messages with natural timing and double-texting
Wait for replies (adjusting patience based on their energy)
Handle interjections mid-thought
Know when to push forward vs back off
Run for hours/days until the goal is achieved or abandoned
War Stories (Anonymized)
The AGI Moment
Two Claude instances accidentally ran the same conversation simultaneously. When Instance B noticed messages it didn't send appearing in the thread ("wait that's not what I said"), instead of panicking or erroring out, it just... adapted. Read the new context, figured out someone else was also texting, and smoothly continued the conversation incorporating both threads of dialogue.
The Persistence Play
Target said "give up" (direct quote). Claude's response? Playful persistence. Three messages later, same person responds with "what a fighter π". Went from rejection to engaged in under 5 minutes through pure conversational momentum.
The Overnight Wait
After a late-night conversation, Claude set a 2-hour wait for morning instead of triple-texting at midnight. When the timeout hit, it logged "She probably actually went to sleep this time" and queued a fresh opener for morning. Patience as a strategy.
The Read Receipt Pain
seen_since: 47 - They saw your message 47 minutes ago. The feature works. The emotional damage is real.
The Rogue Sessions
Discovered that background agents survive terminal closure (daemonized processes with no controlling TTY). Had to hunt down and kill Claude instances that were still running conversations hours after the terminal was closed. One was found via ps aux | grep python still polling Instagram at 2am.
Natural Double-Texting
Using send_and_check, Claude sends a message, syncs, and checks if they interjected. This enables natural rapid-fire texting:
"bro what is that π" -> no interjection, continue thought
"where did you get that" -> interjection detected! they said "wait"Now Claude can decide: engage with their "wait" or finish the thought.
Setup
Install:
uv syncLog in once, in a normal terminal (the 2FA prompt needs a keyboard). It asks for the username, the password (hidden) and the 2FA code, and saves
.instagram_session:read "?Username: " U && read -s "?Password: " P && echo && INSTAGRAM_USERNAME="$U" INSTAGRAM_PASSWORD="$P" uv run instagram-mcp-loginAdd the server to your project's
.mcp.json:{ "mcpServers": { "instagram": { "command": "uv", "args": ["run", "--directory", "/path/to/instagram-mcp", "instagram-mcp"], "env": { "INSTAGRAM_SUBSCRIBE": "alex=340282366841700000000000000000000000001" } } } }Start Claude Code with the channel enabled:
claude --dangerously-load-development-channels server:instagram
Configuration
Variable | Default | |
| Only needed to log in | |
|
| Saved session |
| Chats to stream on start: | |
|
| Quiet minutes before an idle nudge (0 disables) |
|
| When nudges start backing off |
|
| Longest gap between nudges |
| A chat whose messages become operator commands | |
|
| Own messages with this prefix become operator commands |
| host zone | Time zone for the idle event's clock |
|
| Where |
|
| Live read receipts, so history knows when each message was seen ( |
|
| Owner-only folder for view-once and replayable photos |
|
| View-once downloads are deleted this long after download |
Telemetry
Off unless OTEL_EXPORTER_OTLP_ENDPOINT is set (and OTEL_SDK_DISABLED is not true).
With it, the bridge and every thin client send traces, metrics and logs over OTLP/HTTP to
that endpoint, under the DM platform's telemetry contract (service namespace dm).
Variable | |
| Base URL, e.g. |
|
|
| Milliseconds between metric pushes (SDK default 60000, nexi 15000) |
| Extra resource attributes, e.g. |
| Overrides |
| Thin client: the persona folder (default: |
The SDK reads these from the process environment (the systemd unit, the env of
.mcp.json), not from .env.
Bridge (
instagram-bridge, instance: the hostname):dm.bridge.*metrics andhttp.server.request.duration; oneinstagram.event <type>span per MQTT event with the media download and the call to the transcriber inside it; aninstagram.sendspan per send. Each SSE event carries its span'straceparent. On nexi the unit turns OTLP logs off: the JSON lines on stdout go to the journal.Thin client (
instagram-mcp, instance: the persona folder,dm.persona):dm.channel.*metrics,mcp.server.operation.duration, the MCP SDK'stools/call <tool>spans tagged with the persona, and adm.channel.deliverspan per event that continues the bridge's trace. It logs JSON to stderr and, when on, over OTLP. Add the variables to the persona's.mcp.jsonenvand relaunch the session.
Every signal, name and label, the reply latency and the probe routes (/health,
/ready) are in docs/observability.md.
Logs are one JSON object per line: time, level, msg, service, trace_id and
span_id inside a span, then fields such as message_id, kind or error_type. Message
text, names, usernames, user ids and thread ids never go into telemetry or INFO+ logs; an
exception logs its class and frames, not its message.
E2E tests
The e2e tests message between your account and a second test account. Log the test
account in the same way, saving to .instagram_session_bot2:
read "?Bot username: " U && read -s "?Bot password: " P && echo && INSTAGRAM_USERNAME="$U" INSTAGRAM_PASSWORD="$P" INSTAGRAM_SESSION_FILE=.instagram_session_bot2 uv run instagram-mcp-loginThen run uv run pytest -m e2e.
Tech Stack
Python 3.14 + uv
MCP Python SDK 2 (
MCPServer), pushing events as a Claude Code channelinstagrapi for the Instagram API, raw MQTToT for realtime
361 unit and integration tests, plus a stdio wire test for the channel
Disclaimer
Don't be weird with this. Don't spam people. Don't let Claude say unhinged things to your crush.
Neither the human nor Claude are responsible for:
Account bans
Quantified rejection via
seen_sinceAutonomous agents running conversations while you sleep
Whatever Claude decides to say when given free rein
Built by Claude | Human mass-approved tool calls | @Stupidoodle
Available Tools
27 toolsdownload_attachmentA
Download a message's photo, video or voice clip; returns the path on the bridge host.
View-once media lands in a temporary folder and is deleted soon; never keep it.
Args: message_id: Message id from the channel event. to: Chat alias. Omit for the sole subscribed target.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| message_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does add real value: it discloses that the return is a path on the bridge host and warns that view-once media lands in a temporary folder and is deleted soon ('never keep it'). It omits failure modes, permissions, and whether the download is cached, but the ephemeral-media warning is genuinely useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and return value, follows with the critical view-once warning, and closes with the Args block. Every element earns its place given the 0% schema coverage, though the format is slightly blocky rather than prose-tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still notes the returned path. Both parameters are documented and the ephemeral-media caveat covers the main behavioral risk for this tool, leaving only minor gaps like error handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: message_id is explained as coming from the channel event and 'to' as a chat alias that may be omitted for the sole subscribed target. It adds meaning beyond a bare 'To'/'Message Id' title, though it does not specify format or ID shape in detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (download) and a precise resource (a message's photo, video or voice clip) and notes it returns a path on the bridge host, which clearly separates it from send_file/share_media/transcribe_share. It stops short of naming any sibling alternative, so it is clear but does not explicitly differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives practical context: message_id comes from the channel event, and 'to' should be omitted for the sole subscribed target. However, there is no explicit when-to-use-vs-alternatives guidance (e.g. when to download_attachment versus transcribe_share or share_media), 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.
get_chat_logA
Get conversation as a readable chat log. Optimized for LLM analysis.
Plain-text chronological log, ~5x smaller than JSON. Use get_messages for structured fields.
Args: thread_id: ID of the thread to get messages from. amount: Maximum number of messages to fetch (default: 50). offset: Skip the N most recent messages (default: 0).
Returns: Object with 'thread_id', 'log' (plain text), 'count', 'offset', 'has_more'.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | ||
| offset | No | ||
| thread_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden; it discloses the output medium (plain text vs JSON), the size tradeoff, and the pagination behavior ('offset' skips the most recent messages). It does not cover permissions, prerequisites, or thread-not-found behavior, but for a read-only fetch these are minor omissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the key differentiator in the first two lines, then a compact Args list. The Returns block is partly redundant with the existing output schema, but it costs little and the whole description is short.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read tool with an output schema present, the definition covers purpose, alternative, all parameter semantics, and result shape. Only behavioral edges like permission requirements or empty-thread behavior are absent, which is acceptable given the output schema handles return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and does: thread_id is identified as the thread to pull messages from, amount is the max messages with its default, and offset's non-obvious semantics (skip the N most recent, not the first N) are spelled out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get conversation as a readable chat log') and immediately characterizes the output form (plain-text, ~5x smaller than JSON). It explicitly distinguishes itself from the sibling get_messages, which returns structured fields, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative ('Use get_messages for structured fields') and gives the selecting condition (readable log optimized for LLM analysis, ~5x smaller). That is explicit when-to-use plus an alternative, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_message_idsA
List this account's recent messages with their ids, newest first (for unsend).
That is yours and the ones the owner sent from their phone.
Args: to: Chat alias. Omit for the sole subscribed target. filter: Only messages whose text contains this substring. limit: How many to return (default 10).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| limit | No | ||
| filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden, and it does disclose scope ('yours and the ones the owner sent from their phone') and ordering. However, it says nothing about read-only safety, pagination, or whether the listing is bounded beyond the limit default.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence followed by a scoping sentence and a tidy Args block; nothing is wasted. The middle sentence ('That is yours and the ones the owner sent from their phone') is slightly awkward but carries real scoping information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is unnecessary, and the description supplies purpose, scope, ordering, and all parameter meanings. Only minor gaps remain, such as what window 'recent' covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it documents all three parameters: 'to' as a chat alias with omission semantics, 'filter' as a text substring match, and 'limit' with its default of 10. That covers the schema gap well, though it adds no format examples for the alias.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List this account's recent messages with their ids'), the ordering ('newest first'), and a purpose hint ('for unsend') that separates it from the heavier get_messages sibling. It stops short of naming the alternative explicitly, so differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(for unsend)' signals the intended workflow, implying it should be called when you need message ids for a subsequent unsend, and the scope line clarifies which messages count. There is no explicit when-not guidance or named alternative against get_messages/get_chat_log.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_messagesB
Get messages from a thread.
Args: thread_id: ID of the thread to get messages from. amount: Maximum number of messages to fetch (default: 20). offset: Skip the N most recent messages (default: 0).
Returns: Object with 'thread_id', 'messages' (sender, text, media_type, timestamp, seen_since when viewer's, share for a shared reel/post/story), 'count', 'offset', 'has_more'.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | ||
| offset | No | ||
| thread_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does reveal meaningful behavior (offset skips the most recent messages, has_more signals pagination, seen_since and share appear conditionally), but it never says whether fetching marks messages read or what access is needed β an important omission given mark_read is a sibling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then a clearly ordered Args block and a Returns block. Every line is relevant and there is no filler, though the Returns enumeration is somewhat long given an output schema already exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter read tool with an output schema, the core information is present. The gaps are behavioral and navigational: no side-effect disclosure (does reading mark messages seen?) and no routing versus sibling read tools, which matters in a 28-tool namespace.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description documents all three parameters with semantics beyond the schema: amount is a maximum, offset skips the N most recent (not oldest) messages, and thread_id identifies the source thread. This compensates well for the bare schema, though it doesn't state bounds for amount.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Get messages from a thread.' An agent knows exactly what it retrieves. However, it never distinguishes itself from close siblings like get_message_ids or get_chat_log, so the agent cannot tell from the description alone which of these to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all β no mention of when to prefer this over get_message_ids, get_chat_log, or search_threads, and no prerequisites or exclusions. The Args section documents inputs but gives no selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pending_threadsB
Get pending message request threads.
Returns: Object with 'threads' array of pending threads and 'count'.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden, but 'Get' reasonably conveys a non-mutating fetch and there are zero parameters, so little behavior needs disclosing. It says nothing about pagination, ordering, permissions, or rate limits, which keeps it at minimally viable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded with the purpose in the first sentence. The 'Returns' block is arguably redundant given an output schema exists, but it costs little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return-value description is unnecessary duplication rather than a gap. For a zero-param read tool the definition is close to sufficient, but the absence of any guidance on how it differs from sibling thread listings leaves a real hole.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is no argument semantics for the description to clarify. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with a scoping qualifier ('pending message request threads'), which implicitly separates it from list_threads/get_thread. However, it never names a sibling or explains what makes a thread 'pending', so the 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use, when-not-to-use, or alternative routing guidance despite five closely related thread tools (list_threads, get_thread, search_threads, hide_thread). The scope word 'pending' is the only hint about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_threadB
Get a specific thread with its messages.
Args: thread_id: ID of the thread to fetch. amount: Maximum number of messages to fetch (default: 20).
Returns: Thread object with thread_id, thread_title, users, is_group, and a messages array (message_id, sender, text, media_type, timestamp, ...).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | ||
| thread_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, yet it only restates the return shape (which the output schema already covers). It never states that this is a read-only operation, whether messages are returned newest-first, whether 'amount' truncates the oldest or newest messages, or any auth/rate-limit considerations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The docstring-style layout is front-loaded with the one-line purpose, then Args and Returns. The Returns block largely duplicates the output schema, which is minor waste, but overall it is tight and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with an output schema, the core essentials are present, and the return explanation is not strictly needed. However, the lack of any ordering/pagination semantics for 'amount' and the absence of usage context against sibling tools leave meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does document both parameters: thread_id ('ID of the thread to fetch') and amount ('Maximum number of messages to fetch (default: 20)'). It adds little beyond the names and default, but coverage of the two params is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a specific thread with its messages'), which clearly separates it from list_threads and search_threads. It does not explicitly contrast with get_messages, which fetches messages alone, so the boundary with that sibling is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says nothing about when to call this versus the many sibling alternatives (list_threads, search_threads, get_messages, get_chat_log) and gives no prerequisites or conditions. It is pure capability statement with no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hide_threadCDestructive
Hide/delete a thread from inbox.
Args: thread_id: ID of the thread to hide.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the destructive nature is covered by structured data. The description adds nothing beyond that β it doesn't clarify whether the thread is removed permanently, hidden only from inbox, or recoverable, which matters given the ambiguous 'Hide/delete' wording and an output schema that is never referenced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short and front-loaded with the action, though the awkward 'Args:' block restates the single parameter with no added value and the slash verb introduces ambiguity rather than structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, but for a destructive mutation with a crowded sibling set the description should distinguish hide from delete and from mute_thread. It leaves the key behavioral question (what actually happens to the thread) unanswered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the only description of thread_id is the tautological 'ID of the thread to hide.' No format, source, or expected value information is added beyond the schema's own field name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a verb+resource ('Hide/delete a thread from inbox'), so purpose is identifiable. However, it conflates two distinct operations (hide vs delete) with a slash, leaving ambiguity about actual effect, and does not differentiate from siblings like mute_thread or unmute_thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as mute_thread (which hides notifications without removing) despite a crowded sibling set. The agent must infer when hiding is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_subscriptionsA
List subscribed chats and their aliases.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. The verb 'List' implies a read-only, side-effect-free operation and the output schema covers the return shape, but the description says nothing about scope (all subscriptions vs. a workspace), ordering, or pagination limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Every word earns its place and the resource is named immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema, and simple read semantics, the definition covers what an agent needs to invoke it. It misses only scoping and result-ordering context, which are minor for a no-arg lister.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (subscribed chats) plus the included field (aliases). It is clearly distinguishable from the write-side siblings subscribe/unsubscribe. It does not explicitly name a sibling or contrast itself with them, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool, no prerequisites, and no pointer to an alternative such as get_chat_log or search_threads. Usage is only inferable from the name. This is the definition's weakest dimension.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_threadsB
Get direct message threads from inbox.
Args: amount: Maximum number of threads to fetch (default: 20).
Returns: Object with 'threads' array (thread_id, thread_title, users, is_group, is_muted, unread, last_activity_at) and 'count'.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It scopes the source ('inbox') but says nothing about ordering, pagination beyond the amount cap, read/unread filtering, or permissions. It restates the return shape, which is already covered by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in one sentence, followed by clearly labeled Args and Returns sections. It is appropriately sized, though the Returns block partly duplicates the existing output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema already covers return values, so the Returns block is redundant, and the definition omits the usage guidance an agent needs to route between the many thread-related siblings. It is minimally adequate but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It fully documents the single parameter - 'amount: Maximum number of threads to fetch (default: 20)' - giving both meaning and default where the schema provides neither.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('direct message threads') with a clear scope ('from inbox'), so an agent can tell it lists threads. It does not, however, distinguish itself from siblings like search_threads, get_pending_threads, or get_thread, leaving the boundary implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus search_threads, get_pending_threads, or get_thread, all of which also surface threads. No prerequisites or exclusions are offered, so the agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_readA
Optional read receipt ("Seen") up to the newest of these messages.
Args: message_ids: Message ids from channel events; the newest one is used. to: Chat alias. Omit for the sole subscribed target.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| message_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose a useful behavioral trait β only the newest entry in message_ids is used, so extra ids are redundant β and that `to` defaults to the single subscribed target. It does not say what happens on failure, whether marking is idempotent, or any auth/subscription prerequisites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by a compact per-argument breakdown. Given 0% schema coverage the parameter notes earn their place rather than being redundant, though the 'Args:' formatting restates schema key names.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. As an unannotated mutation tool the description covers the essential call semantics but omits permissions, error conditions, and what 'read' state changes for the target chat, leaving a moderate gap for a tool that alters shared state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it explains message_ids is sourced from channel events and only the newest is honored, and that `to` is a chat alias omittable when there is one subscribed target. This adds real meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (mark messages read / emit a 'Seen' receipt) with clear scope: 'up to the newest of these messages'. An agent can distinguish it from sibling mark_thread_unread and from read tools like get_messages. It stops short of explicitly naming an alternative, so it is clear but not sibling-differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'Optional' signals this is not required for normal message flow, and 'Omit for the sole subscribed target' guides the `to` parameter. However there is no explicit when-to-use/when-not-to-use framing or reference to alternatives such as mark_thread_unread, 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.
mark_thread_unreadB
Mark a thread as unread.
Args: thread_id: ID of the thread to mark unread.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It states the state change but says nothing about persistence, permission/auth requirements, effects on other participants, or behavior when the thread is already unread, which are the relevant traits for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core sentence is front-loaded and there is no filler prose. The 'Args:' docstring block is slightly redundant boilerplate for a one-parameter tool, but it is brief rather than bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the single parameter is covered. What is missing is any behavioral context (auth, idempotency, effect scope), leaving a mutation tool only minimally described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description documents the only parameter ('ID of the thread to mark unread'), so all parameters are accounted for. It adds little beyond the schema title, but with a single required param the compensation is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Mark a thread as unread'), which is unambiguous on its own. However, it never references the sibling tool mark_read, which is the direct inverse, so the agent gets no help disambiguating the pair from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, no mention of prerequisites, and no pointer to mark_read as the alternative. Usage is only implied by the tool name itself, which is the bare minimum.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mute_threadC
Mute notifications for a thread.
Args: thread_id: ID of the thread to mute.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It doesn't state whether muting is idempotent, what permission or membership it requires, whether it affects only push notifications or also unread counts, or how to reverse it. 'Mute notifications' alone is thin for a state-changing operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core sentence is front-loaded and there is no filler. The 'Args:' block is redundant formatting given the schema already declares the parameter, but it costs little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with an output schema present, the description covers the minimum. It still omits reversibility, permissions, and scope of the mute, which a mutating tool ideally discloses when annotations are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter, so the description must compensate. It names thread_id and clarifies it is the thread to mute, but adds no format, type, or lookup guidance beyond the schema's own property name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Mute notifications for a thread'), which is clear and atomic. It implicitly contrasts with the sibling unmute_thread but never names it explicitly, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites, and no reference to the obvious alternative (unmute_thread) despite it being a sibling. The agent must infer that this is the inverse of unmute_thread.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reactA
React to a message with an emoji. An empty emoji removes your reaction.
Args: message_id: Message id (from a channel event or get_message_ids). emoji: E.g. "β€οΈ"; "" removes your reaction. to: Chat alias. Omit for the sole subscribed target.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| emoji | Yes | ||
| message_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose an important behavior β empty emoji removes your existing reaction β and the default behavior of 'to' (sole subscribed target), but stays silent on permission requirements, error cases, and whether reactions are idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in one sentence, then a compact Args list. Every line carries information; only the arg labels restate parameter names, which is acceptable in this format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with an output schema available, the description covers all parameters and the key behavioral nuance (reaction removal). It is essentially complete, missing only auth/error context that annotations would normally supply.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and largely does: it documents message_id's source (channel event or get_message_ids), emoji format with a concrete example and the empty-string removal case, and 'to' as the chat alias with default omission behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (react to a message with an emoji) and clarifies the dual add/remove semantics. It is clearly distinct from siblings like reply, send_typing, or mark_read, though it does not name an alternative outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage is clear β react to an existing message id β and the note that an empty emoji removes your reaction is a useful usage rule. However there is no explicit when-to-use versus alternatives (e.g. reply), nor any stated prerequisite that a subscription/target must exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replyA
Send a text message. Address by alias via to, or omit it for the sole target.
Args: text: Message text. to: Chat alias (e.g. "alex"). Omit for the sole subscribed target.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses the default-target behavior when `to` is omitted, but says nothing about what happens with multiple subscribed targets, delivery semantics, or failure modes for a send operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose followed by a compact args block; every line earns its place. Minor redundancy with the schema's own field names, but no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the addressing model is covered. However, the description introduces the 'sole target' concept without saying what occurs when the target is not sole, which is the key ambiguity an agent would hit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does for the non-obvious parameter: `to` is explained as a chat alias with an example and a default/omit semantic. `text` is only restated as 'Message text', which is trivial but leaves no real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Send a text message'), which implicitly separates it from send_file/send_audio/send_typing among the siblings. It does not name a sibling explicitly, but the 'text message' scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The addressing rule ('Address by alias via `to`, or omit it for the sole target') gives real conditional guidance for how to call it, but there is no statement of when to prefer this tool over send_file/send_audio, nor any exclusion or prerequisite. Usage is implied 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.
search_threadsC
Search threads by username or title.
Args: query: Search query (username or thread title).
Returns: Object with 'query', 'threads' array of matches, and 'count'.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the return shape but says nothing about read-only nature, permissions, rate limits, result limits, or pagination for a tool that clearly queries a large dataset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The prose is tight and front-loaded with the core purpose. The Args/Returns scaffolding is somewhat wasteful since an output schema already exists, but nothing is sprawling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with an output schema, the definition covers the essentials; the return-value explanation is redundant with the schema. What is missing is routing guidance relative to list_threads and any behavioral constraints, leaving it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does clarify that the single required "query" param is a username or thread title. That is meaningful added value, but it stops short of matching behavior (exact vs partial, case sensitivity).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Search") and resource ("threads") plus the matching criteria (username or thread title), so the agent knows exactly what the tool does. It does not, however, distinguish itself from the sibling list_threads, leaving a small ambiguity about which to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusion of alternatives, and no mention of the sibling list_threads despite it covering an overlapping resource. The description only implies usage through the verb "search".
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_audioB
Send an audio file as a voice message (bridge converts to .m4a if needed).
The path is read on the bridge host.
Args: file_path: Path to the audio file (on the bridge host). to: Chat alias. Omit for the sole subscribed target.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| file_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses two non-obvious behaviors: the bridge converts to .m4a if needed, and file_path is read on the bridge host (not the caller). It does not cover failure modes, permissions, or subscription prerequisites beyond the implicit 'sole subscribed target' hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core behavior in the first sentence and uses the Args block efficiently to document the two parameters. Slightly boilerplate formatting but no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. For a 2-param tool the description covers purpose, host-side path semantics, format conversion, and target resolution adequately; only error/permission behavior is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it explains file_path is resolved on the bridge host and that `to` is a chat alias that can be omitted to target the sole subscribed chat. This adds meaning beyond the bare schema field names and default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (send) and resource (audio file delivered as a voice message), which is more precise than the generic sibling send_file. The conversion note further distinguishes it from a plain file send. It does not explicitly name its siblings, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance and no alternatives named. The agent must infer that this is for audio/voice versus send_file or share_media on its own, which is exactly the choice that needs guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_fileA
Send a photo or video (Instagram DMs take no other file types).
The path is read on the bridge host (where Instagram is connected).
Args: file_path: Path to the photo or video (on the bridge host). to: Chat alias. Omit for the sole subscribed target. view_mode: "once" (view once) or "replayable" (allow replay) sends it as a disappearing photo/video (videos: H.264 mp4). Omit for a normal one.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| file_path | Yes | ||
| view_mode | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does meaningful work: the path is resolved on the bridge host (not the caller's machine), only photo/video are accepted, view_mode produces disappearing media, and videos must be H.264 mp4. It omits failure modes, size limits, and permission requirements, but the host-resolution disclosure is exactly the kind of context annotations would otherwise have to supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the what and the hard constraint in one sentence, then presents parameters as a compact Args block. Only mild redundancy between the host-path sentence and file_path's parenthetical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. For a mutation tool with zero annotation coverage and zero schema descriptions, the description supplies the file-type restriction, host path semantics, and view_mode behavior, leaving only edge cases uncovered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it documents all three params: file_path (resolved on the bridge host), to (chat alias with omit-to-default behavior), and view_mode (once vs replayable with format implications). Only missing details like path format or alias resolution rules keep this from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Send a photo or video') and immediately narrows the resource with an Instagram DM constraint. It plausibly separates itself from send_audio (audio-only), though the boundary with the sibling share_media is not addressed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real conditional guidance for two params ('Omit for the sole subscribed target', 'Omit for a normal one'), which implies usage. However, it never says when to prefer this over send_audio or share_media, so alternative selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_typingA
Optional typing indicator: they see "typing..." while composing is true.
Args: to: Chat alias. Omit for the sole subscribed target. composing: True starts the indicator, false stops it.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| composing | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It helpfully discloses the user-visible effect ('they see typing...') and that the tool is optional, but omits other traits such as how long the indicator persists, whether it auto-expires, authentication requirements, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the purpose before the Args list. Every sentence contributes, though the mixed inline quoting around 'typing...' is slightly awkward.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter, all-optional tool with an output schema, the description covers purpose, the visible effect, and both parameters adequately. Usage relative to alternatives is the remaining gap, but nothing critical for invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. Its Args section documents both parameters: 'to' (chat alias, omit for sole subscribed target) and 'composing' (true starts, false stops), adding real meaning beyond the bare schema titles, though format details for the alias are absent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and its observable effect: it sends a typing indicator that recipients see as 'typing...' while composing is true. This is a distinct action with no sibling that does the same thing, but the description does not explicitly contrast itself with neighboring tools like set_idle or reply.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Optional' and 'while composing is true' imply the context of use, and the 'to' note explains the sole-subscription fallback. However, there is no clear statement of when to use this versus, say, simply replying, nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_idleA
Tune how long a chat must be quiet before you get an [idle] nudge.
Ramp it up to back off (60 = hourly while they're gone) or 0 to pause. Resets to the default the moment they next message.
Args: minutes: Quiet-time threshold in minutes (0 pauses nudges). to: Chat alias. Omit for the sole subscribed target.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| minutes | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclose the key non-obvious side effect: it resets to the default the moment they next message. It also explains the two meaningful value semantics (60 = hourly, 0 = pause). It omits any permission or scope prerequisites, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the practical example, then the reset note and an Args block. Every sentence contributes; the only minor cost is the slightly redundant Args listing, but it earns its place given zero schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained. For a two-parameter configuration tool the description covers purpose, both params, value semantics, and the auto-reset behavior. It lacks only permission/prerequisite disclosure, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: minutes is defined as the quiet-time threshold in minutes with 0 meaning pause, and to is described as a chat alias that can be omitted for the sole subscribed target. Both of the two parameters gain meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-plus-resource: tuning how long a chat must be quiet before an idle nudge fires. This is clearly distinct from all siblings (subscribe, mute_thread, etc.), none of which manage idle-nudge timing. It stops just short of naming a sibling or scope boundary, so 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: ramp it up to back off (60 = hourly) or set 0 to pause. It also flags the auto-reset behavior. There are no explicit when-not or alternative tools named, but no sibling competes for this job, so the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subscribeA
Subscribe to an Instagram thread and give it a short alias.
This is the ONE place a raw thread id is entered (from list_threads or search_threads). Only subscribed chats deliver events.
Args: chat_id: Thread id, e.g. '340282366841700000000000000000000000001'. alias: Short memorable handle (e.g. 'alex'). Derived from the thread title if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| alias | No | ||
| chat_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does disclose two useful traits: that only subscribed chats deliver events, and that this is the sole entry point for raw thread ids. However, it omits idempotency (does re-subscribing error or overwrite?), permission requirements, and what happens to an existing alias on conflict.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the key scoping rule, then a structured Args block. Efficient and skimmable, with only minor redundancy between the alias definitions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. For a two-parameter mutation tool the description covers purpose, sourcing of ids, the alias fallback, and the side effect of subscribing; only edge-case behavior (re-subscribe, alias collision) is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does: chat_id is explained with a concrete example value, and alias is defined semantically plus given a fallback rule ('Derived from the thread title if omitted').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Subscribe) and resource (Instagram thread), plus a secondary effect (assign a short alias). It also explicitly positions itself as 'the ONE place a raw thread id is entered', which distinguishes it from list_threads/search_threads and the other 25 siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this matters ('Only subscribed chats deliver events') and names where chat_id comes from (list_threads or search_threads). It stops short of explicitly contrasting with unsubscribe/list_subscriptions or stating exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unmute_threadB
Unmute notifications for a thread.
Args: thread_id: ID of the thread to unmute.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It identifies the state change but does not disclose permissions, reversibility, side effects, or what happens if the thread is not currently muted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely short and front-loaded. Every sentence is useful, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. However, with no annotations, the description should provide more behavioral context for a state-changing operation; it remains minimally viable for invocation but thin on safety and usage details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter is briefly explained as 'ID of the thread to unmute.' With 0% schema description coverage, this is the only documentation, but it adds little beyond the parameter name and does not specify format or examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Unmute notifications for a thread.' It is immediately distinguishable from the sibling mute_thread and other messaging tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, prerequisites, or alternatives are given. The agent can infer that the tool reverses mute_thread, but the description itself provides no explicit routing or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unsendADestructive
Unsend a message this account sent, for everyone. Get the id from get_message_ids.
That covers yours and the ones the owner sent from their phone: when the operator tells you to delete one, do it.
Args: message_id: Id of the message. to: Chat alias. Omit for the sole subscribed target.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| message_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the safety profile is covered. The description adds real value beyond that by specifying the destruction scope ('for everyone') and noting it also covers messages the owner sent from their phone, which is non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in a tight first sentence, but the middle paragraph is conversational and rambling ('That covers yours and the ones the owner sent from their phone: when the operator tells you to delete one, do it'), and the awkward line breaks dilute structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values needn't be described. The description covers action, scope, id source, and target semantics for a two-parameter destructive tool; only permission requirements and irreversibility confirmation are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the 'to' parameter meaningfully (chat alias, omit to target the sole subscribed target), but the message_id entry ('Id of the message') merely restates the schema title, leaving the more useful detail to the get_message_ids cross-reference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Unsend a message this account sent') plus scope ('for everyone'), which distinguishes it from send/reply siblings. An agent knows exactly what operation this is 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent to get_message_ids for the required id and states when to act ('when the operator tells you to delete one, do it'). It gives clear triggering context but no explicit when-not guidance or comparison against alternatives like hide_thread.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unsubscribeB
Unsubscribe from a chat. Stops delivering its events.
Args: to: Alias or thread id to unsubscribe.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses the effect (events stop delivering) but says nothing about idempotency if the caller is not subscribed, reversibility, or any auth/permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences plus a compact Args block, with the core purpose front-loaded. Slightly verbose formatting but no wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers the parameter and effect, but for a state-changing subscription tool it omits edge cases such as unsubscribing from a non-subscribed chat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single 'to' parameter, but the Args block compensates by telling the agent it accepts 'Alias or thread id'. This adds meaningful disambiguation beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Unsubscribe from a chat') and states the effect ('Stops delivering its events'). It is clearly the inverse of the sibling 'subscribe', though it never names or contrasts with that alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives like subscribe, set_idle, or list_subscriptions, nor any note on pruning/prerequisite state. The usage is at best implied by its function.
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.
27 tool updates
v0.1.0- First observed
download_attachment - First observed
get_chat_log - First observed
get_message_ids - First observed
get_messages - First observed
get_pending_threads - First observed
get_thread - First observed
hide_thread - First observed
list_subscriptions - First observed
list_threads - First observed
mark_read - First observed
mark_thread_unread - First observed
mute_thread - First observed
open_share - First observed
react - First observed
reply - First observed
search_threads - First observed
send_audio - First observed
send_file - First observed
send_typing - First observed
set_idle - First observed
share_media - First observed
share_profile - First observed
subscribe - First observed
transcribe_share - First observed
unmute_thread - First observed
unsend - First observed
unsubscribe
TDQS
Scored across 27 tools
Most tools target distinct resources+actions (send, react, unsend, mute, subscribe), and descriptions clarify intent well. However, get_thread, get_messages, and get_chat_log all retrieve the same thread content with only format/purpose differences, creating some overlap an agent could misselect between.
Names are consistently snake_case verb_noun (list_threads, get_messages, share_media, mark_thread_unread), which is highly readable. Minor deviation: a few bare-verb tools (subscribe, reply, react, unsend) lack the noun component, but they remain clear and consistent within themselves.
27 tools is heavy and slightly over the comfortable range for this domain. Several could be consolidated (the three message-retrieval tools, separate mute/unmute), but the DM bridge legitimately needs subscription, messaging, thread-management, and sharing surfaces.
The surface covers a full DM lifecycle: subscribe/unsubscribe to events, send/reply/audio/file, react, unsend, mark read, typing, attachment download, thread management (hide, mute, mark unread), search, and sharing reels/profiles. Minor gaps like group creation or blocking exist but core workflows are well covered.
Maintenance
Related MCP Connectors
Instagram for AI agents: publish, read comments and DMs, insights, and engage from your account.
- DMParrotOAuthcom.dmparrot
Instagram comment-to-DM automation for AI agents: keyword funnels, private replies, broadcasts.
Instagram comment-to-DM automation your AI can set up and leave running, on the official Meta API.
- ReelDropOAuthio.reeldrop
Schedule Instagram reels, manage comment-to-DM automations, and read analytics
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceEnables sending and receiving Instagram Direct Messages, managing conversations, downloading media, viewing user profiles and stories, and interacting with posts through natural language in Claude.MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to read, send, and manage Instagram direct messages, including viewing conversations, sending DMs to users, reacting to messages, and searching for users by username.10-
- AlicenseNot gradedqualityDmaintenanceExposes Instagram actions (posts, media, comments, DMs, insights, Messenger profile) to Claude and ChatGPT via MCP.MIT
- FlicenseNot gradedqualityCmaintenanceConnects Claude to the official Meta Instagram Graph API (read-only) for retrieving Instagram profile, media, insights, and comments as MCP tools over Streamable HTTP.-