Skip to main content
Glama
osAlhaddad1

instagram-mcp

by osAlhaddad1

instagram-mcp

An MCP server that exposes instagrapi — Instagram's private mobile API — as 49 tools an agent can call.

Reading is enabled out of the box. Anything that changes the account (posting, liking, following, commenting, DMing, deleting) is refused until you explicitly turn writes on.

Setup

cp .env.example .env

Then fill in .env with either a username and password, or a sessionid cookie copied from a browser where you are already signed in (DevTools → Application → Cookies → instagram.com). The sessionid route is less likely to trigger a login challenge.

If the account uses two-factor auth, paste the authenticator "setup key" into INSTAGRAM_TOTP_SEED and codes are generated for you. Otherwise, when Instagram asks for a code, call instagram_login with verification_code.

Verify the install without touching Instagram:

.venv/Scripts/python smoke_test.py

Related MCP server: Instagram Complete MCP Server

Registering the server

Already registered for this project in ../.mcp.json. To use it elsewhere:

claude mcp add instagram -- "C:\Users\osami\OneDrive\Documents\GitHub\ayham project 2\instagram-mcp\.venv\Scripts\instagram-mcp.exe"

The executable works from any directory — it always reads .env and writes session.json next to this README.

Enabling write actions

INSTAGRAM_ALLOW_WRITES=true

Restart the server afterwards. While this is false, write tools fail with an explanation rather than doing anything, so the read-only tools stay usable.

Tools

Group

Tools

Writing DMs

instagram_prepare_dm, instagram_find_person, instagram_build_style_profile, instagram_get_style_profile

Persona search

instagram_search_start, instagram_search_recall, instagram_search_gate, instagram_search_expand, instagram_search_enrich, instagram_search_signals, instagram_search_shortlist, instagram_search_judge, instagram_search_results, instagram_search_list

Session

instagram_login_status, instagram_login, instagram_account_info

Users

instagram_get_user, instagram_search_users, instagram_get_followers, instagram_get_following, instagram_get_user_medias, instagram_get_user_stories

Posts

instagram_get_media, instagram_get_media_comments, instagram_get_media_likers, instagram_download_media

Discovery

instagram_get_timeline_feed, instagram_get_hashtag_info, instagram_get_hashtag_medias, instagram_search_locations, instagram_get_location_medias, instagram_search_posts, instagram_similar_accounts, instagram_account_about

Direct messages

instagram_list_direct_threads, instagram_get_direct_thread, instagram_send_direct_message *

Engagement

instagram_like_media *, instagram_unlike_media *, instagram_comment_media *, instagram_follow_user *, instagram_unfollow_user *

Publishing

instagram_upload_photo *, instagram_upload_video *, instagram_upload_reel *, instagram_upload_album *, instagram_upload_story *, instagram_delete_media *

* requires INSTAGRAM_ALLOW_WRITES=true.

Users are addressed by username or user_id. Posts are addressed by a media argument that accepts a post URL, a shortcode, or a numeric media id.

Writing DMs in your own voice

This is what the server is mainly for. The problem with letting a model write your messages is that it writes correctly — punctuated, capitalised, polite — and everyone who knows you can tell instantly.

So instagram_build_style_profile measures how you actually write, from your own sent DMs: message length, capitalisation, terminal punctuation, emoji rate, which emoji, how you spell laughter, shorthand, language mixing, and whether you send bursts of short messages instead of one composed one. It records this globally and per contact, because nobody writes to their mother the way they write to their closest friend.

Run it once:

.venv/Scripts/python -c "import asyncio,json;from instagram_mcp.server import server;print(asyncio.run(server.call_tool('instagram_build_style_profile',{})).content[0].text[:400])"

After that, instagram_prepare_dm(person="sarah") returns — in one call — the recent conversation, the measured rules of your voice, and samples of how you write to that specific person. That single call is the whole interface for drafting; there is no need to stitch together the raw thread tools.

The profile is cached in style_profile.json and never sent to Instagram. Refresh it occasionally as your writing drifts.

The skill

~/.claude/skills/instagram-dm/SKILL.md drives the whole workflow in normal conversation — "reply to ahmed", "what should I say back to her", "check my ig messages". It handles finding the person, loading your voice, drafting, and holding the draft for your approval before anything sends.

Nothing sends without you seeing the exact words first.

Finding people who match a persona

The other thing the server is for. You describe someone — female, Amsterdam, fitness, mid-twenties, blonde — and get back ranked profiles with a confidence figure per attribute.

The hard part is that Instagram has no index for any of that. It indexes four things: handle and name text, hashtags, place geotags, and the follow graph. A persona is none of them. So every attribute is either compiled into a probe against one of those four, or inferred afterwards from what came back — which makes this a funnel that trades recall for precision, not a query.

recall   hundreds of candidates, mostly wrong, from many cheap probes
gate     free: drops private accounts and shops
expand   chaining off the best survivors — the highest-precision channel
enrich   ~3 API calls each. The expensive stage, so it runs on a ranked subset
signals  free: name, pronouns, geotag clusters, captions, category, birth years
judge    vision, on the shortlist only, from one contact sheet per candidate
results  ranked, with every piece of evidence attached

What makes it work is instagram_similar_accounts, which reads Instagram's own "Suggested for you" graph, built from co-follow behaviour it already models. Once you have one good match, chaining outward from it beats any keyword search by a wide margin — which is why the text and hashtag probes exist mainly to find that first foothold.

Location is the other thing worth knowing about. Instagram's city field is almost always null and occasionally wrong — one live probe returned a place called "Hollanda" carrying coordinates in Alexandria, Egypt — and place names fragment badly, with one city arriving as "Amsterdam, Netherlands", "Amsterdam Canal District", "Red Light District, Amsterdam" and "Amsterdam Canal River". Coordinates are always present, so geotags are clustered by position rather than by name: the variants merge, and the mislabelled entry excludes itself.

One thing the design originally leaned on turned out not to exist. Instagram generates alt text for photos ("may be an image of 1 person, blonde hair, standing"), which would have been free coarse vision on every post — but it is only exposed to the web client, and came back empty on all thirty-two posts of a live probe. Appearance therefore costs a real look at real images, and the ceilings reflect that rather than pretending otherwise.

A search is a job on disk, not a function call: a real one is several hundred API calls over ten or twenty minutes against an account Instagram will rate limit, so it runs stage by stage, survives a crash, and lets you fix a bad probe plan after twenty calls instead of three hundred.

instagram_search_start(persona={"gender": {"value": "female", "required": true},
                                "city": "Amsterdam", "niche": ["fitness"],
                                "age_band": [24, 32], "hair": "blonde"})
instagram_search_recall(search_id, probes={"hashtags": [{"tag": "fitgirlnl"}],
                                           "places":   [{"query": "Amsterdam gym"}],
                                           "accounts": [{"query": "amsterdam fitness"}]})
instagram_search_gate(search_id)      # free
instagram_search_expand(search_id)    # chain off the best
instagram_search_enrich(search_id, limit=40)
instagram_search_signals(search_id)   # free, and resolves most personas outright
instagram_search_results(search_id, limit=20)

Judging the pictures

Appearance is the one thing no free signal reaches, so it has to be looked at. instagram_search_shortlist(download_images=true) fetches each candidate's profile picture and recent thumbnails and composes them into a single numbered contact sheet, rather than handing over a dozen loose files.

That is not just tidier. It costs a twelfth of the attention, the numbers let a judgement cite the tile it came from, and it makes the hardest question answerable: which of these faces is the account holder? Feeds are full of friends, partners and clients, and a judgement made on the wrong face arrives sounding exactly as confident as a right one. Seeing every picture side by side turns that into something you can just look at - find the recurring face, check it against the tile marked avatar, which is the only picture certain to be them, and report the result as owner_face_confidence. A low value there weakens how firmly every vision reading is held, rather than pretending the person fits worse than they do.

A screenshot of the profile page would show much the same thing, but that page needs a logged-in browser to render at all, while these thumbnails have already been fetched and paid for.

Reading the confidence

Every attribute carries two numbers, never one: match is how well the evidence agrees, certainty is how far that evidence can be trusted. A model that reports a single "85%" has silently multiplied them and thrown away which one was weak.

Certainty is capped per attribute and per source, so the system cannot overclaim. Hair colour read off one avatar caps at 0.45; read off several daylight posts, 0.80. Country from Instagram's own "account based in" reaches 0.95. Height caps at 0.15 — a photograph carries no scale reference — and height, ethnicity and build are advisory: reported, never allowed to move a ranking, and rejected outright if you mark them required.

Unknown is not "no". An attribute nobody could observe lowers coverage, not match, and the ranking shrinks toward the prior by how little was verified — so a 0.9 scored on two observed attributes loses to a 0.75 on six. Anything labelled unverified scored well on too little to act on.

Results are for public accounts. Private ones are dropped at the gate because they cannot be verified. Nobody under 18 is ever returned: age is read from a stated birth year and from Instagram's join date, the bottom of that estimate decides, and the check runs when age first becomes readable and again at every exit - an audit found the original gate-only version protected nothing, because the gate runs before any age has been read. Every candidate keeps full provenance — which probes found them, and what each conclusion rests on. Search jobs live in searches/ and are gitignored: they hold other people's profiles and photos.

Staying unblocked

instagrapi drives the private API that the phone app uses. Instagram detects and blocks automated behaviour, and the account it blocks is yours — so:

  • Sessions are cached in session.json and reused. Logging in from scratch repeatedly is the single fastest way to get flagged. Keep that file.

  • Requests are spaced out by a random INSTAGRAM_DELAY_MININSTAGRAM_DELAY_MAX second pause. Raise it if Instagram starts asking you to wait.

  • Back off on warnings. "Please wait a few minutes" and "action blocked" mean stop, not retry. The tools say so in their error messages.

  • Bulk reads are risky. Pulling thousands of followers in one go looks nothing like a human using the app.

  • Use a throwaway or secondary account if you are experimenting.

Layout

File

Contains

instagram_mcp/server.py

The 49 tool definitions

instagram_mcp/persona.py

What a persona is, and the confidence maths

instagram_mcp/signals.py

Reading a persona off a profile, free and offline

instagram_mcp/names.py

Given names to a gender prior, offline

instagram_mcp/discovery.py

The recall channels candidates come from

instagram_mcp/search.py

A persona search as a resumable job on disk

instagram_mcp/sheets.py

Candidate pictures composed into one judgeable sheet

instagram_mcp/client.py

Login, session persistence, the write guard, threading

instagram_mcp/serialize.py

Compact JSON views of instagrapi's models

instagram_mcp/errors.py

Instagram exceptions turned into actionable advice

smoke_test.py

Offline check: schemas, guards, serializers

.env and session.json hold credentials and live auth cookies, and searches/ holds other people's profiles and photos. All three are gitignored — keep them that way.

Available Tools

49 tools
instagram_account_aboutA
Read-onlyIdempotent

Read Instagram's own "About this account" panel: country, join date, past handles.

The country field is Instagram's own answer to where an account is based, which makes it the single most trustworthy location signal a profile can carry - worth far more than anything written in a bio. The join date and any former usernames are useful for spotting accounts that are newer, or more recycled, than they present themselves as.

Args: username: The handle to look up. user_id: The numeric id, if you already have it.

Returns: username, country, joined, former_usernames, and a note when Instagram returned the panel without a country. Fields it does not return are omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idNoNumeric user id. Use instead of username.
usernameNoHandle to look up, e.g. 'nasa'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds extra behavioral context: it notes that fields are omitted if Instagram doesn't return them and that a note is included when the country is missing. This goes beyond the annotations and informs the agent about potential incomplete responses.

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 description is well-structured: a crisp purpose line, a short rationale for why the data matters, then labeled Args/Returns sections. While the rationale paragraph is not strictly necessary for invoking the tool, it is valuable for decision-making and does not feel verbose. The main purpose is front-loaded, and every section 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?

The tool has an output schema (not shown but indicated as present), and the description's Returns section covers what fields to expect and the behavior for missing data (omission and a note). It does not mention login prerequisites or error handling, but given the read-only, idempotent nature and the simplicity of the panel, the description is largely complete for an agent to call it 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% — both parameters (username and user_id) are described in the input schema. The description's Args section repeats these descriptions without adding meaning beyond what the schema already provides. It does not explain the relationship between the two parameters (e.g., which takes precedence), so it stays at the baseline.

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: 'Read Instagram's own "About this account" panel' and lists the exact fields (country, join date, past handles). This clearly distinguishes it from other info-gathering tools like instagram_account_info or instagram_get_user, even though it doesn't name them. The purpose is unambiguous and self-contained.

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 explains why the country field is valuable ('single most trustworthy location signal a profile can carry') and how join date and former usernames help spot newer or recycled accounts. This gives clear context for when to use this tool. However, it does not explicitly name alternative tools or state when to avoid using it, so it misses the highest bar.

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

instagram_account_infoA
Read-onlyIdempotent

Get the profile of the logged-in account, including its private fields.

Returns the signed-in user's own details (email, phone, gender and birthday are visible here but not on other people's profiles). Use instagram_get_user for anyone else.

Returns: An account object: user_id, username, full_name, biography, external_url, is_private, is_verified, is_business, email, phone_number, gender.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds valuable context about private fields (email, phone, gender, birthday) being visible only for the signed-in user, and lists the return fields. It does not contradict annotations and adds useful behavioral detail beyond them.

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?

The description is concise, effectively front-loaded with the main purpose, then a clarifying note about private fields, and a structured 'Returns' section. Every sentence adds value 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?

For a parameterless, read-only tool, this description is complete. It states the purpose, usage, return fields, and the alternative tool. It implies the requirement of being logged in. Nothing essential 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 has zero parameters, so the schema is trivially 100% covered. There is nothing to describe about parameters. The description implicitly confirms no inputs are needed, and the return structure is outlined. With no parameters, the baseline of 4 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 description clearly states the tool gets the profile of the logged-in account and explicitly differentiates from instagram_get_user for other users. The verb 'Get' is specific, the resource is well-defined, and it distinguishes from the most similar sibling.

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 explicitly says 'Use instagram_get_user for anyone else', giving a direct alternative and the condition for using this tool. This is clear when-to-use and when-not-to-use guidance, with no ambiguity.

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

instagram_build_style_profileA
Idempotent

Learn how you write by measuring your own sent DMs, and cache the result.

Reads your conversations, keeps only the messages you sent, and measures the habits that make writing recognisable: message length, capitalisation, punctuation, emoji, how you spell laughter, shorthand, language mixing, and whether you send bursts of short messages. It also records how your voice shifts per contact, since nobody writes to their mother the way they write to a friend.

Run once to set up, then again occasionally to refresh. The profile is saved locally and read by instagram_prepare_dm. Nothing is sent to Instagram.

Args: thread_count: How many conversations to sample. messages_per_thread: How many messages to read from each.

Returns: messages_analyzed, threads_analyzed, style_rules[] (plain-language instructions for imitating the voice), voice (the raw measurements), samples[] (real sent messages), contacts (per-person breakdown), and saved_to (the cache path).

ParametersJSON Schema
NameRequiredDescriptionDefault
thread_countNoHow many recent conversations to learn from. More threads means a broader sample.
messages_per_threadNoHow many messages to read per conversation.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses behavioral traits beyond annotations: it reads the user's DMs, filters to sent messages, computes a style profile, and caches it locally. It explicitly states 'Nothing is sent to Instagram,' which is valuable privacy-relevant context not in the annotations. It also mentions the local cache path, reinforcing the idempotent and non-destructive hints.

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 description is well-structured and front-loaded: the core purpose is in the first sentence, followed by a detailed yet concise explanation of the process, usage advice, and then explicit Args and Returns sections. It is appropriately sized for the tool's complexity, with no redundant or filler sentences that detract from the value.

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?

The description is complete for a setup tool with two optional parameters. It covers purpose, behavior, caching, privacy, parameters (via schema and description), and return values (including the structure of style_rules and other outputs). The mention that the profile is read by instagram_prepare_dm ties it into the workflow, leaving no major gaps for correct invocation.

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?

The input schema already documents both parameters (thread_count and messages_per_thread) with descriptions and defaults (100% coverage). The description's Args section only repeats the same information without adding new meaning, such as examples, constraints beyond the schema, or relationships between parameters. Therefore it stays at the baseline of 3 for high schema coverage.

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+resource: 'Learn how you write by measuring your own sent DMs, and cache the result.' It clearly states what messages it samples (only those sent by the user), what habits it measures, and that it produces a cached profile. It distinguishes itself from sibling instagram_get_style_profile by noting the profile is 'read by instagram_prepare_dm' and is saved locally, making the build-vs-retrieve split obvious.

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?

Usage guidance is explicit: 'Run once to set up, then again occasionally to refresh.' This tells the agent when to invoke the tool and that it is a periodic operation. It does not explicitly name an alternative tool or state when not to use it, but the context is clear enough that an agent can infer that instagram_get_style_profile is the retrieval counterpart for an existing profile.

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

instagram_comment_mediaA

Post a comment on a post, or a reply to an existing comment.

Publicly visible immediately. Confirm the wording with the person you are working for first. Requires INSTAGRAM_ALLOW_WRITES=true.

Args: media: A post URL, shortcode or media id. text: What to say. replied_to_comment_id: Reply to this comment instead of the post.

Returns: posted (bool) and comment: comment_id, text, author, created_at.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesComment body.
mediaYesPost URL, shortcode or media id.
replied_to_comment_idNoComment id to reply to, from instagram_get_media_comments.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, but the description adds meaningful behavior: 'Publicly visible immediately' and the requirement for INSTAGRAM_ALLOW_WRITES=true. It also discloses the return structure. These go beyond the annotations, which already indicate a non-read operation, giving the agent practical expectations about effects and prerequisites.

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?

The description is compact and well-organized: a lead sentence with the primary action, two short warning lines about visibility and permission, then a clear Args/Returns breakdown. Every section earns its place, and the essential constraints are front-loaded. No wasted words or redundant elaboration.

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?

The description covers the core essentials: what it does, a critical prerequisite (write permission), a human-confirmation requirement, and return values. It does not mention error cases or rate limits, but the output schema (declared present) and annotations handle some of that, and the absence of extreme detail is acceptable for a straightforward write action. Missing nuances like idempotency are already covered by idempotentHint=false.

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?

The input schema has 100% descriptor coverage: 'Comment body,' 'Post URL, shortcode or media id,' and 'Comment id to reply to, from instagram_get_media_comments.' The description's Args section largely mirrors the schema, adding only the phrase 'Reply to this comment instead of the post' for replied_to_comment_id, which clarifies its effect but doesn't add new semantics beyond the schema. The description does not introduce format details beyond 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 description opens with 'Post a comment on a post, or a reply to an existing comment,' which clearly specifies the verb (post/reply), resource (comment on post/comment), and the two distinct use cases. This distinguishes it from other write tools like instagram_like_media or instagram_upload_photo, and there is no sibling comment tool, so purpose is unambiguous.

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 provides explicit context: 'Requires INSTAGRAM_ALLOW_WRITES=true' and instructs to 'Confirm the wording with the person you are working for first.' It does not explicitly name alternatives or when not to use, but since it's the only comment tool, the guidance is sufficient. It could improve by mentioning to fetch comment IDs via instagram_get_media_comments for replies, but that is inferred from the reply parameter.

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

instagram_delete_mediaA
Destructive

Permanently delete one of the logged-in account's own posts.

This cannot be undone and Instagram keeps no copy you can restore from. Always confirm the exact post with the person you are working for first - read it back with instagram_get_media and check it is theirs. Requires INSTAGRAM_ALLOW_WRITES=true.

Args: media: The post URL, shortcode or media id to delete.

Returns: deleted (bool) and media (the reference acted on).

ParametersJSON Schema
NameRequiredDescriptionDefault
mediaYesPost URL, shortcode or media id of one of YOUR posts.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true), the description warns that deletion is permanent, cannot be undone, and that 'Instagram keeps no copy you can restore from.' It also discloses the single-tool scope (only the logged-in account's own posts) and the write-permission requirement. This adds significant behavioral context beyond what annotations provide.

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?

The description is well-structured: a front-loaded purpose sentence, followed by essential warnings and usage guidance, then a clear Args/Returns section. Every sentence contributes—no filler or redundancy. It is concise yet complete.

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 operation, the description covers all critical aspects: irreversibility, verification step, write-permission requirement, and the return format. Combined with the output schema (not shown here but indicated as present), the agent has everything needed to call the tool correctly and safely.

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?

The schema already provides full documentation for the media parameter ('Post URL, shortcode or media id of one of YOUR posts') with 100% coverage. The description's Args section restates this almost verbatim, adding only the phrase 'to delete' which is obvious. Per the rubric, high schema coverage sets a baseline of 3, and the description adds no meaningful new parameter semantics.

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 'Permanently delete one of the logged-in account's own posts,' which is a specific verb (delete) and resource (own posts). It clearly distinguishes this from sibling tools like instagram_get_media, instagram_like_media, or instagram_upload_photo by focusing on permanent deletion of one's own content.

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?

The description explicitly instructs to first confirm the post with the owner and read it back using instagram_get_media before deletion. It also states the prerequisite INSTAGRAM_ALLOW_WRITES=true, which is a clear condition for use. This helps the agent decide when to invoke this tool versus alternative operations.

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

instagram_download_mediaA
Idempotent

Download a post's photo, video, or every item in an album, to local disk.

Writes files to the machine running this server, not to Instagram, so it is safe in read-only mode. Albums produce one file per item.

Args: media: A post URL, shortcode or media id. folder: Where to write the files.

Returns: type (photo/video/reel/igtv/album), file_count and files[] with the absolute paths written.

ParametersJSON Schema
NameRequiredDescriptionDefault
mediaYesPost URL, shortcode or media id.
folderNoDirectory to save into, e.g. 'C:/Users/me/Downloads'. Defaults to the server's working directory.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds meaningful context by clarifying that the write is to local disk, not to Instagram, and that it is safe in read-only mode. It also discloses behavior for albums (one file per item). This goes beyond the annotations without contradicting them, earning 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?

The description is tightly written: a one-line overview, a safety note, then structured Args and Returns. Every sentence earns its place, and the core action is front-loaded. No redundant detail; the format aids quick comprehension.

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?

Given the availability of an output schema (which details return structure) and annotations for idempotency/destructiveness, the description covers the essential usage context: what it downloads, where it writes, and album handling. It omits error-handling or prerequisites, but these are minor relative to its coverage. A 4 reflects strong completeness without being exhaustive.

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 both 'media' and 'folder' are already documented. The description repeats the same info ('A post URL, shortcode or media id' and 'Where to write the files') but adds no additional nuance. With high schema coverage, the description adds marginal value, meriting the baseline 3.

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 clearly states the verb (download), the resource (a post's photo, video, or album), and the destination (local disk). It differentiates from siblings like instagram_get_media by explicitly noting it writes to local disk and not to Instagram, making the tool's purpose unambiguous.

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 provides a clear context: 'Writes files to the machine running this server, not to Instagram, so it is safe in read-only mode.' This indicates when to use it (e.g., when a local copy is needed) and subtly aligns with alternatives (e.g., if you only need metadata, use get_media). However, it does not explicitly state exclusions or name alternative tools, 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.

instagram_find_personA
Read-onlyIdempotent

Find who to message, searching your existing conversations before all of Instagram.

Use this when a person is referred to by first name only, or when you are not sure which account is meant. People you already talk to rank first and come back with a thread_id you can pass straight to instagram_prepare_dm.

Args: query: The name or handle to look for. limit: How many matches to return.

Returns: count and matches[]: user_id, username, full_name, is_verified, thread_id (null if you have never messaged them), has_conversation, is_group.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum matches to return.
queryYesName or handle, e.g. 'sarah' or 'sarah_k'. Partial names work.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds valuable behavioral context beyond that: it searches existing conversations preferentially, returns a thread_id only if a conversation exists (null otherwise), and includes has_conversation and is_group flags. It also specifies the result fields, which helps the agent understand what to expect. 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.

Conciseness4/5

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

The description is moderately concise, with a clear introductory sentence, then a usage note, then structured Args and Returns sections. It front-loads the core purpose and usage condition. The Returns section provides useful detail without being verbose. It could be slightly tighter by removing the Args repetition, but overall it is well-organized and efficient.

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?

The tool is fairly simple (2 params, output schema present) and the description covers the essential aspects: when to use, what it returns, and how the results relate to messaging (thread_id). It does not mention rate limits or authentication, but annotations already cover the read-only, idempotent nature. The only minor gap is that it doesn't explicitly state that the query can be a partial name (only in the schema), but the schema covers that. Overall, complete enough for an agent to invoke 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%, and both parameters have detailed descriptions in the schema (e.g., query includes examples and 'Partial names work', limit has min/max). The description's Args section merely restates the parameter names without adding additional meaning or nuance. Since the schema fully covers semantics, a baseline score of 3 is appropriate; the description adds no extra semantic value.

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 clearly states the purpose: finding a person to message, prioritizing existing conversations. It distinguishes this from general user search by emphasizing the messaging context and the thread_id return for existing conversations. The phrase 'searching your existing conversations before all of Instagram' and the explicit reference to passing thread_id to instagram_prepare_dm make the tool's role unambiguous.

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 explicit usage conditions: use when a person is referred to by first name only or when unsure which account is meant. It implies that for exact handles or when certain, a different search (like instagram_search_users) would be more appropriate, though it does not name the alternative explicitly. The ranking behavior (existing conversations first) is also explained, which guides when to rely on this tool.

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

instagram_follow_userA
Idempotent

Follow a user as the logged-in account.

For private accounts this sends a follow request instead. Requires INSTAGRAM_ALLOW_WRITES=true.

Args: username: The handle to follow. user_id: The numeric id, if you already have it.

Returns: followed (bool) and user_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idNoNumeric user id. Use instead of username.
usernameNoHandle to follow, e.g. 'nasa'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false (write) and destructiveHint=false, which the description aligns with by stating 'Follow a user.' The description adds valuable context beyond annotations: the private account follow request behavior, the environment variable requirement, and the return fields (followed and user_id). It does not contradict any annotations and provides transparency about the outcome.

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 description is concise, using a short paragraph with sections for behavior, requirement, args, and returns. Each sentence adds information without fluff. It front-loads the core action and private-account nuance, then provides prerequisites and parameters. Slightly more structure could separate args into a list, but overall it is well-organized and efficient.

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 simple follow operation, the description covers everything an agent needs: how to specify the user (username or user_id), what happens with private accounts, the required environment variable, and the return values. An output schema exists but the description still states the return fields. With annotations covering idempotency and write nature, this is a complete definition for correct invocation.

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?

The input schema already describes both parameters ('Numeric user id. Use instead of username.' and 'Handle to follow, e.g. "nasa".'), giving 100% coverage. The description repeats this and adds the hint 'if you already have it' for user_id, which slightly clarifies when to use it. Since the schema largely covers semantics, the description adds marginal value, justifying a baseline of 3.

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 clearly states the verb and resource: 'Follow a user as the logged-in account.' It also specifies the behavioral nuance for private accounts ('sends a follow request instead'), which distinguishes it from a generic follow action. The name itself also makes it unambiguous relative to siblings like instagram_unfollow_user.

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 provides a clear precondition ('Requires INSTAGRAM_ALLOW_WRITES=true') and a conditional behavior ('For private accounts this sends a follow request instead'). It also implies usage via the two parameter options (username or user_id). However, it does not explicitly compare with alternative tools, but there is no other follow tool among siblings, so minimal guidance is needed. Context is clear, but no exclusions are stated.

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

instagram_get_direct_threadA
Read-onlyIdempotent

Read the messages in one direct-message conversation, newest first.

Shared posts, links and attachments are summarised rather than reproduced.

Args: thread_id: Which conversation to read. amount: How many messages to fetch.

Returns: thread_id, title, is_group, participants[], last_activity_at, unread and messages[]: message_id, sender_id, sent_at, item_type, is_sent_by_you, text, shared_post, link, attachment.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNoMaximum messages to return, newest first.
thread_idYesThread id from instagram_list_direct_threads, e.g. '340282366841710300949128288687654321'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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, openWorld, idempotent, and non-destructive traits. The description adds useful behavioral context by noting that shared posts, links, and attachments are summarized rather than reproduced, and it details the return structure in the Returns section, going beyond the annotation safety profile.

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 description is well-structured and concise: a clear opening sentence, a relevant behavioral note, then organized Args and Returns sections. No redundant language or padding; it earns its length.

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?

Given the tool's moderate complexity and the presence of an output schema, the description provides sufficient context: it names all return fields and types, explains summarization behavior, and covers the two parameters. Minor omissions like error handling or rate limits are not critical for this read-only operation.

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% with adequate parameter descriptions (amount range/default, thread_id source and example). The description's Args section adds minimal reinforcement, only restating what the schema already says. Since the schema carries the semantic weight, a baseline of 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?

The description states a clear verb ('Read') and resource ('messages in one direct-message conversation') with an explicit ordering ('newest first'). It distinguishes itself from sibling tools like instagram_list_direct_threads (which lists conversations) and instagram_send_direct_message (which writes) by focusing on a single thread's contents.

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 usage context (reading a specific thread) but does not explicitly state when to use this tool versus alternatives, nor does it provide exclusion criteria. The schema hints that thread_id comes from instagram_list_direct_threads, but the description itself does not give explicit routing guidance.

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

instagram_get_followersA
Read-onlyIdempotent

List the accounts that follow a user, newest follower first.

Only works for your own account, public accounts, and private accounts you follow. Fetching thousands of followers is slow and is the fastest way to get an account rate limited - ask for the smallest number that answers the question.

Args: username: The handle whose followers to list. user_id: The numeric id, if you already have it. amount: How many followers to fetch.

Returns: count, requested, possibly_more (bool) and users[]: user_id, username, full_name, is_private, is_verified.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNoMaximum followers to return. Large values take minutes and risk rate limits.
user_idNoNumeric user id. Use instead of username.
usernameNoHandle whose followers to list, e.g. 'nasa'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

The description adds significant behavioral context beyond the annotations: performance characteristics (slow for thousands), rate-limit risk, and a directive to minimize the amount. It also specifies the ordering and the return structure. The annotations already declare read-only/idempotent, so the description enriches rather than repeats them. No contradictions.

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?

The description is well-structured with a one-sentence purpose, a focused usage warning, then clearly labeled Args and Returns sections. It is compact, front-loaded with the core purpose, and every sentence earns its place. No fluff.

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?

The description covers the tool's scope, limitations, performance trade-offs, and return fields. Combined with the rich input schema and annotations (read-only, idempotent), it gives an agent everything needed to call the tool correctly. Nothing essential 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 schema descriptions for each parameter are more detailed than the Args section in the description (e.g., amount includes 'Large values take minutes and risk rate limits'). The description's param mentions add little beyond what the schema already provides. Baseline of 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?

The description states a specific verb ('List') and resource ('accounts that follow a user') plus an ordering detail ('newest follower first'). This clearly distinguishes it from the sibling instagram_get_following, which would list accounts a user follows. The purpose is unambiguous.

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 explicitly states when the tool works (own account, public accounts, private accounts you follow) and includes a strong recommendation to request the smallest number needed to avoid rate limiting. It does not name alternative tools like instagram_get_following, but the purpose statement makes the distinction obvious. The guidance is clear and actionable.

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

instagram_get_followingA
Read-onlyIdempotent

List the accounts a user follows.

Same visibility rules and rate-limit caution as instagram_get_followers.

Args: username: The handle whose following list to read. user_id: The numeric id, if you already have it. amount: How many accounts to fetch.

Returns: count, requested, possibly_more (bool) and users[]: user_id, username, full_name, is_private, is_verified.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNoMaximum accounts to return.
user_idNoNumeric user id. Use instead of username.
usernameNoHandle whose followed accounts to list, e.g. 'nasa'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint: false). The description adds value by flagging rate-limit and visibility rules via the sibling reference, which is beyond annotation scope. It also details the return fields, giving the agent a fuller picture of expected behavior.

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?

The description is compact and well-organized: purpose first, then a one-line sibling reference, then Args and Returns sections. Every sentence serves a purpose, with zero filler. The structure makes it easy to scan.

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?

The description covers return format (count, requested, possibly_more, users[] fields), mentions rate-limit and visibility cautions, and the schema fully documents parameters. It lacks explicit pagination instructions, though 'possibly_more' implies them, and subtle details like error handling are absent. Given the tool's simplicity and existing annotation coverage, this is adequately 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 description coverage is 100% — each parameter (username, user_id, amount) already has a clear description. The description rephrases these but adds no new meaning; 'if you already have it' for user_id marginally reinforces the schema's 'Use instead of username,' but this is not substantial. 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?

The description opens with 'List the accounts a user follows,' a specific verb+resource statement. It clearly distinguishes from the sibling instagram_get_followers by direction (following vs. followers) and names that sibling, leaving no ambiguity about what this tool does.

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 references 'Same visibility rules and rate-limit caution as instagram_get_followers,' giving contextual guidance about shared constraints. It doesn't explicitly state when to use this tool vs. the alternative, but the name and opening line make the use case obvious. Lacks an explicit exclusion, so it earns a 4 rather than a 5.

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

instagram_get_hashtag_infoA
Read-onlyIdempotent

Get a hashtag's total post count.

Use this to size a hashtag before pulling posts from it.

Args: name: The hashtag, with or without a leading #.

Returns: id, name, media_count (int) and url.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHashtag without the #, e.g. 'astrophotography'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds behavioral context about what it returns (id, name, media_count, url) and the input flexibility ('with or without a leading #'). This is useful 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.

Conciseness5/5

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

The description is compact, front-loaded with the core purpose, and uses a clean Args/Returns structure. Every sentence earns its place with no fluff.

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 simple read-only tool with one parameter and an existing output schema (per signal), the description covers the purpose, usage, parameter format, and return values. Nothing an agent needs to call it correctly is missing.

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

Parameters5/5

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

The schema already documents the 'name' parameter with an example, and schema description coverage is 100%. The description adds meaning by clarifying 'with or without a leading #,' which expands on the schema's restrictive 'without the #.' This nuance is valuable for the agent.

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: 'Get a hashtag's total post count.' It clearly distinguishes from sibling tools like instagram_get_hashtag_medias by focusing on sizing before pulling posts. No ambiguity about what it returns.

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 a clear, explicit usage cue: 'Use this to size a hashtag before pulling posts from it.' This implies when to use it (before fetching posts) and distinguishes it from the media-fetching tool, though it does not explicitly name alternatives or state when not to use it.

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

instagram_get_hashtag_mediasA
Read-onlyIdempotent

List posts carrying a hashtag, either the top posts or the most recent.

The main discovery tool: use 'top' to see what performs well on a tag and 'recent' to see current activity.

Args: name: The hashtag to read. sort: Ranked ('top') or chronological ('recent'). amount: How many posts to fetch.

Returns: hashtag (str), sort (str), count and medias[]: media_id, code, url, type, taken_at, author, caption, like_count, comment_count.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHashtag without the #, e.g. 'astrophotography'.
sortNo'top' for the most engaged posts, 'recent' for the newest.top
amountNoMaximum posts to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, indicating a safe read operation. The description adds value by explaining the two sorting behaviors and the structure of the response (media fields, counts, etc.), which goes beyond the annotations. It does not contradict annotations and provides useful context about what the agent can expect.

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 description is well-structured with a brief intro, a clear sentence on discovery, and bulleted argument and return sections. It is front-loaded with the primary purpose. No unnecessary fluff; each sentence contributes to understanding. Slightly longer than minimal, but acceptable given the detail.

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?

The tool has an output schema, and the description still lists the return fields, which is redundant but ensures clarity. All three parameters are documented in both schema and description. For a read-only, idempotent operation with no side effects, nothing critical is missing—neither prerequisites, error handling, nor usage restrictions. It is complete for reliable invocation.

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 already has a description. The description adds extra meaning by explaining the purpose of 'sort' (ranked vs chronological) and confirming 'amount' as the count of posts. It also ties the sort options to use cases ('see what performs well' vs 'see current activity'). This enriches the schema beyond literal definitions.

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 clearly states the tool lists posts carrying a hashtag, with two distinct modes (top and recent), and explicitly identifies itself as the main discovery tool. This sets it apart from siblings like instagram_get_hashtag_info (which likely provides tag metadata) and instagram_get_user_medias (which filters by user). The verb and resource are specific.

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 concrete guidance on when to use each sort option: 'top' for high-performing posts and 'recent' for current activity. It also positions itself as 'the main discovery tool', implying it is the default for hashtag exploration. It does not explicitly state when not to use it or mention alternatives (e.g., for user-specific posts), but the context is clear enough for an agent to select it appropriately.

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

instagram_get_location_mediasA
Read-onlyIdempotent

List posts tagged at a place.

Args: location_id: The place id from instagram_search_locations. sort: Ranked ('top') or chronological ('recent'). amount: How many posts to fetch.

Returns: location_id, sort, count and medias[] as in instagram_get_user_medias.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNo'top' for the most engaged posts, 'recent' for the newest.top
amountNoMaximum posts to return.
location_idYesNumeric place id from instagram_search_locations, e.g. '213819997'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds only a note that it returns a structure similar to instagram_get_user_medias, which is a minor behavioral detail. No additional constraints, rate limits, or pagination behavior are disclosed. The description neither adds substantial context nor contradicts 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?

The description is compact and front-loaded with the purpose in the first sentence. The Args list is structured but somewhat redundant given the schema, yet it is not bloated. It conveys the necessary information efficiently without sacrificing clarity.

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 simple read-only list operation, the description covers the core aspects: what it returns (via the reference to instagram_get_user_medias) and the key parameters. Since an output schema exists and annotations cover safety, the description is sufficient. Minor gaps like explicit pagination or rate-limit notes are acceptable given the tool's simplicity.

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 adds value by telling the agent that location_id comes from instagram_search_locations and clarifies that 'amount' controls how many posts to fetch. While it rephrases some schema text, the cross-reference to the search tool is genuinely useful beyond what the schema provides.

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 action and target: 'List posts tagged at a place.' This clearly distinguishes it from sibling tools like instagram_get_hashtag_medias or instagram_get_user_medias. It also references the source of location_id (instagram_search_locations), which anchors the purpose and prevents confusion.

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 provides clear context: it's for place-based posts, and location_id must come from instagram_search_locations. However, it does not explicitly state when NOT to use it or name an alternative tool, such as using instagram_get_hashtag_medias for hashtags. The guidance is adequate but lacks an explicit exclusion.

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

instagram_get_mediaA
Read-onlyIdempotent

Get everything about one post, including media URLs and tagged users.

Use after a listing tool when you need the full caption, the downloadable photo/video URLs, or the contents of an album.

Args: media: A post URL, a shortcode, or a numeric media id.

Returns: media_id, code, url, type, taken_at, author, caption, like_count, comment_count, view_count, location, thumbnail_url, video_url, video_duration, comments_disabled, tagged_users[] and album_items[] for multi-photo posts.

ParametersJSON Schema
NameRequiredDescriptionDefault
mediaYesPost URL, shortcode or media id, e.g. 'https://www.instagram.com/p/CX1a2b3c4d5/'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds valuable behavioral context by enumerating the return fields and noting that album_items[] are included for multi-photo posts, which is a conditional behavior not captured in 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?

The description is efficiently structured: purpose sentence, usage context, then Args/Returns sections. Every sentence earns its place, and the content is front-loaded with the most actionable information first. No fluff.

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 read-only tool with an output schema (indicated by signals), the description provides adequate context: when to use it, what to pass, and what to expect in return. Nothing critical is missing for correct invocation.

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?

The schema description covers 100% of the single parameter, including examples. The description repeats the accepted formats (URL, shortcode, or numeric ID) without adding new semantics. Baseline 3 is appropriate since the schema already does the heavy lifting.

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 clearly states 'Get everything about one post' and specifies the key included data (media URLs, tagged users). It distinguishes itself from listing tools and media-specific tools by targeting the full post entity, making it easy for an agent to select among the many Instagram siblings.

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 says 'Use after a listing tool when you need the full caption, the downloadable photo/video URLs, or the contents of an album.' This gives both the timing (after listing) and the specific triggers, effectively guiding the agent away from alternatives like media comments or user media lists.

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

instagram_get_media_commentsA
Read-onlyIdempotent

Read the comments on a post.

Returns top-level comments and replies as a flat list; a comment's replied_to_comment_id tells you what it is answering.

Args: media: A post URL, shortcode or media id. amount: How many comments to fetch.

Returns: count, requested, possibly_more and comments[]: comment_id, text, author, created_at, like_count, replied_to_comment_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
mediaYesPost URL, shortcode or media id.
amountNoMaximum comments to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds valuable behavioral context by explaining that comments are returned as a flat list and that replied_to_comment_id indicates parent relationships, plus the possibly_more flag for pagination. This goes beyond the annotations without contradicting them.

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 description is well-structured and efficient: a one-line summary, a brief explanation of the return format, then concise Args and Returns sections. It is front-loaded with the core purpose and avoids redundancy, though the Args/Returns could be streamlined slightly.

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?

Given the straightforward read-only nature and the presence of an output schema (which documents the return fields), the description covers the essential usage: what identifiers are accepted, how many comments to fetch, and the structure of the response. It does not address login requirements or rate limits, but these are not critical for basic usage and are partially covered by annotations.

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?

The input schema already includes descriptions for both parameters (media: 'Post URL, shortcode or media id.' amount: 'Maximum comments to return.'), and the description largely restates these (e.g., 'A post URL, shortcode or media id.' and 'How many comments to fetch.'). No additional semantic meaning is provided beyond the schema, so the baseline of 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?

The description clearly states the action ('Read the comments') and the resource ('a post'), and it distinguishes from siblings like instagram_get_media (get the post itself) and instagram_comment_media (add a comment). The mention of returning a flat list with reply structure further clarifies the specific data returned.

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 usage—if you need comments on a post, use this tool—but it does not explicitly contrast with alternatives or state when not to use it. There is no mention of using instagram_comment_media for writing or instagram_get_media for the post itself, leaving the agent to infer from the name.

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

instagram_get_media_likersA
Read-onlyIdempotent

List the accounts that liked a post.

Instagram returns only a recent window of likers, not everyone, so the count here will not match the post's like_count on popular posts.

Args: media: A post URL, shortcode or media id. amount: How many likers to keep.

Returns: count and users[]: user_id, username, full_name, is_private, is_verified.

ParametersJSON Schema
NameRequiredDescriptionDefault
mediaYesPost URL, shortcode or media id.
amountNoMaximum likers to return. Instagram itself caps this at roughly the most recent 1000.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds the key behavioral disclosure that the result is a limited recent window, which is not evident from annotations. It also explains that the returned count may differ from the post's like_count. This goes beyond what annotations provide, though it does not cover auth requirements or rate limits, which are not mentioned.

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?

The description is well-structured with a brief intro, then 'Args' and 'Returns' sections. Every sentence serves a purpose: it states the action, the behavioral caveat, the parameter definitions, and the return fields. There is no wasted text, and the caveat is placed early to anchor expectations. The formatting is clean and scannable.

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 simple read-only tool with a rich input schema (100% coverage) and an existing output schema, the description covers everything an agent needs: the media input formats, the amount limit, and the crucial behavioral caveat about the recent window. Annotations cover the safety profile. No pagination or error handling details are required given the scope. The description is complete for correct invocation.

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 both parameters (media and amount) are already documented in the schema. The description repeats the media formats ('post URL, shortcode or media id') but adds no new meaning beyond that. The amount parameter is described as 'How many likers to keep,' which is similar to the schema's 'Maximum likers to return.' Since the schema covers the semantics, the description adds little extra value, matching the baseline of 3.

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 clearly states the verb ('List') and resource ('accounts that liked a post'). It distinguishes from siblings like get_media_comments and get_media by focusing on likers. The mention of a 'recent window' adds scope specificity, leaving no ambiguity about what the tool does.

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 a clear usage caveat: Instagram returns only a recent window of likers, and counts won't match like_count on popular posts. This helps set expectations. It does not explicitly name alternative tools for when more complete data is needed, but the tool name and the dominance of Instagram-specific operations make the usage context clear. No explicit exclusions are given, but the contextual limitation serves as guidance.

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

instagram_get_style_profileA
Read-onlyIdempotent

Read the cached description of how you write, without contacting Instagram.

Instant and free, so prefer it over rebuilding. If no profile exists yet it says so and you should call instagram_build_style_profile once.

Returns: exists (bool), and when present: generated_at, messages_analyzed, style_rules[], voice, samples[].

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds key behavioral context beyond that: it reads a cached value, makes no network call ('without contacting Instagram'), is free/instant, and states what happens when no profile exists (returns exists=false). This enriches the agent's understanding 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.

Conciseness5/5

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

The description is highly concise and front-loaded: the core purpose is stated in the first sentence, followed by a usage note and a compact list of return fields. Every sentence earns its place with zero 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?

For a no-parameter, read-only cache lookup with a rich output schema, the description is complete. It covers the return structure, the fallback behavior, and the cost/performance advantage, leaving nothing essential for an agent 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?

There are zero parameters, so the baseline is 4. The description does not need to explain any parameters, and it correctly mentions the return fields. No additional parameter documentation is required.

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 ('Read') and resource ('cached description of how you write') and immediately clarifies it does not contact Instagram. It also distinguishes itself from the sibling tool instagram_build_style_profile by name, so an agent can tell them apart 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 Guidelines5/5

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

It explicitly advises preferring this tool over rebuilding (instagram_build_style_profile) and specifies the exact condition for when to call the build tool (if no profile exists). This gives clear when-to-use and when-not-to-use guidance with the alternative named.

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

instagram_get_timeline_feedA
Read-onlyIdempotent

Read the logged-in account's home timeline - posts from accounts it follows.

This is the feed the app opens on. Sponsored items are skipped.

Args: amount: How many posts to return.

Returns: count and medias[]: media_id, code, url, type, taken_at, author, caption, like_count, comment_count.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNoMaximum posts to return from the top of the feed.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the sponsored-item-skipping behavior and the return structure (count and medias with fields), providing context beyond the annotations without contradicting them.

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?

The description is concise and front-loaded: the first sentence states the core purpose, then adds the app-default context, sponsored-skip behavior, and a clear args/returns structure. There is no fluff or 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 read-only tool with one optional parameter and an output schema, the description covers the essential behavior, return fields, and implies authentication by referencing the logged-in account. No critical missing information.

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?

The schema description covers the single 'amount' parameter fully, specifying it's the maximum posts from the top of the feed. The description only restates 'How many posts to return' without adding new meaning, so no credit beyond the baseline 3 for high schema coverage.

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 uses a specific verb ('read') and resource ('home timeline'), clarifying it returns posts from accounts the logged-in user follows. It distinguishes itself from sibling tools like get_user_medias by noting it's the app's default feed and explicitly mentions skipping sponsored items, which is a unique behavior.

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 provides clear context ('the feed the app opens on') implying it's for browsing the logged-in user's feed. However, it doesn't explicitly state when not to use it or name alternatives, but the context is sufficient for an agent to select it over similar tools like searching posts or retrieving a specific user's media.

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

instagram_get_userA
Read-onlyIdempotent

Get a user's full public profile: counts, biography, category and links.

Use this to resolve a username to a user_id, to check whether an account is private before trying to read its posts, or to read follower/following/post counts. For the posts themselves use instagram_get_user_medias.

Args: username: The handle to look up. user_id: The numeric id, if you already have it.

Returns: user_id, username, full_name, url, biography, external_url, follower_count, following_count, media_count, is_private, is_verified, is_business, category, public_email, profile_pic_url. Fields Instagram does not return are omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idNoNumeric user id, e.g. '528817151'. Use instead of username.
usernameNoHandle without the @, e.g. 'nasa'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful behavioral details beyond those: resolving usernames to IDs, checking privacy, and the fact that 'Fields Instagram does not return are omitted.' These explain expected output variability without contradicting 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.

Conciseness5/5

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

The description is concise and well-structured: a clear one-sentence purpose, followed by usage guidance, then args and returns in a labeled format. It is front-loaded with the most important information and every sentence contributes value, 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?

The description covers all necessary aspects: purpose, usage scenarios, returned fields (including omission behavior), and tool differentiation. Given the strong annotation context (readOnly, openWorld, idempotent) and the presence of an output schema, nothing critical is missing for an agent to call this tool 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?

The schema descriptions for both username and user_id already provide clear guidance (format, examples, and 'Use instead of username'), with 100% schema description coverage. The description's Args section repeats this without adding new meaning beyond 'if you already have it' for user_id, which the schema implies. Thus the baseline of 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?

The description opens with a specific verb and resource: 'Get a user's full public profile: counts, biography, category and links.' It also distinguishes itself from the sibling tool instagram_get_user_medias by explicitly directing the agent to that tool for posts, making the purpose unambiguous.

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?

The description provides explicit when-to-use guidance: 'resolve a username to a user_id, to check whether an account is private before trying to read its posts, or to read follower/following/post counts.' It also names the alternative for posts ('For the posts themselves use instagram_get_user_medias'), leaving no ambiguity about tool selection.

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

instagram_get_user_mediasA
Read-onlyIdempotent

List a user's posts (photos, videos, reels and albums), newest first.

This is the main way to read someone's feed. Captions are truncated; call instagram_get_media on a single post for the full record and media URLs.

Args: username: The handle whose posts to list. user_id: The numeric id, if you already have it. amount: How many posts to fetch.

Returns: count, requested, possibly_more and medias[]: media_id, code, url, type (photo/video/reel/igtv/album), taken_at, author, caption, like_count, comment_count, view_count and location where present.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNoMaximum posts to return, newest first.
user_idNoNumeric user id. Use instead of username.
usernameNoHandle whose posts to list, e.g. 'nasa'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds valuable behavioral details: captions are truncated, ordering is newest first, and the response includes possibly_more (pagination signal). This goes beyond the annotations without contradicting them.

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?

The description is tight and well-structured: a one‑line purpose statement, a short usage note, and clean Args/Returns sections. Every sentence earns its place, and the key purpose is front‑loaded.

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?

The description fully covers what the tool does, its parameter roles, the return structure (including fields like medias[], type, taken_at), and the fallback (instagram_get_media) for more detail. Given the output schema and annotations, nothing an agent needs 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 description coverage is 100%, so each parameter (username, user_id, amount) already has a clear description. The tool description reiterates these semantics but does not add new meaning beyond what the schema provides. Per the rubric, with high schema coverage the baseline is 3, and the description does not exceed that.

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 'List a user's posts (photos, videos, reels and albums), newest first.' This is a specific verb (list) and resource (user's posts) with explicit content types and ordering. It also disambiguates from the sibling instagram_get_media (single post) and instagram_get_timeline_feed (likely a different feed), so an agent can clearly know when to use this tool.

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 explicitly states 'This is the main way to read someone's feed' and instructs to call instagram_get_media for full records when captions are truncated. This gives clear context and a condition for when to use an alternative. It also notes that user_id can be used instead of username, guiding parameter selection.

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

instagram_get_user_storiesA
Read-onlyIdempotent

Read a user's currently active stories.

Stories vanish after 24 hours, so an empty list usually means the user has not posted today rather than that something failed. Viewing stories this way does not mark them as seen.

Args: username: The handle whose stories to read. user_id: The numeric id, if you already have it. amount: How many stories to fetch.

Returns: count and stories[]: story_id, type (photo/video), taken_at, author, video_duration, mentions, links, thumbnail_url, video_url.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNoMaximum stories to return.
user_idNoNumeric user id. Use instead of username.
usernameNoHandle whose active stories to read, e.g. 'nasa'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds value by noting the 24-hour expiry, that empty results are expected, and that viewing doesn't mark stories as seen. This supplements the annotations without contradiction.

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 main purpose is front-loaded in the first sentence. The description then lists args and returns in a structured, readable format. Some redundancy with schema (Args section repeats parameter information), but it's compact and not verbose.

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?

The description explicitly lists the return fields (count, stories[] with story_id, type, etc.) and explains the empty-result case, covering what an agent needs. With an output schema present, it isn't overly reliant on description, yet it still provides enough context for correct invocation.

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?

Input schema covers all three parameters with descriptions (100% coverage). The description's Args section mostly reiterates the schema, but adds a small usage hint ('if you already have it' for user_id). This is marginally above baseline but doesn't deeply enrich meaning.

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 'Read a user's currently active stories,' a specific verb and resource. It clearly distinguishes from siblings like instagram_get_user (which fetches user info) and instagram_get_user_medias (which fetches media). No ambiguity about what it does.

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?

Provides clear usage context: stories expire after 24 hours, an empty list is normal, and viewing does not mark as seen. It does not explicitly name alternatives or when to avoid this tool, but the unique scope (active stories) makes it obvious relative to siblings.

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

instagram_like_mediaA
Idempotent

Like a post as the logged-in account.

Requires INSTAGRAM_ALLOW_WRITES=true. Liking in bursts is the quickest way to trigger an Instagram action block - space these out.

Args: media: A post URL, shortcode or media id.

Returns: liked (bool) and media (the post URL or reference acted on).

ParametersJSON Schema
NameRequiredDescriptionDefault
mediaYesPost URL, shortcode or media id.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already convey readOnlyHint=false (write), idempotentHint=true, destructiveHint=false. The description adds valuable context beyond that: the explicit need for INSTAGRAM_ALLOW_WRITES=true and a caution about burst liking triggering action blocks, plus a return format. This is genuinely helpful behavioral disclosure without contradicting 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?

The description is extremely efficient: a one-line purpose plus a requirement notice, a single warning sentence, and a clean Args/Returns breakdown. No filler or repetition, each sentence earns its place. It is well front-loaded with the core action.

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 tool with a known output schema and non-destructive write semantics, the description covers everything an agent needs: what it does, the configuration prerequisite, the risk warning, and the expected return fields. No missing information for correct invocation.

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 parameter 'media' (both schema and description say 'Post URL, shortcode or media id.'). The description repeats this verbatim but adds no extra semantic detail (e.g., examples, format nuances, or edge cases). Since the schema already documents it completely, 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 description opens with a specific verb and resource: 'Like a post as the logged-in account.' It clearly distinguishes from sibling actions like unlike_media (which would be the inverse) and other media interactions like commenting or uploading. The purpose is instantly obvious and unambiguous.

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 states the requirement INSTAGRAM_ALLOW_WRITES=true, which is a prerequisite rather than usage guidance. It does not mention when to choose this tool over alternatives (e.g., unlike_media, comment_media) or any context about typical use cases. There is no explicit 'use this when...' or 'do not use if...' guidance.

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

instagram_list_direct_threadsA
Read-onlyIdempotent

List direct-message conversations in the inbox.

Gives you the thread_id needed by instagram_get_direct_thread and instagram_send_direct_message, plus a preview of the latest message.

Args: amount: How many conversations to fetch. only_unread: Restrict to conversations with unread messages.

Returns: count and threads[]: thread_id, title, is_group, participants[], last_activity_at, unread, pending, muted and last_message.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNoMaximum conversations to return, most recently active first.
only_unreadNoReturn only conversations with unread messages.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds valuable context about the thread_id being the key output for downstream tools and the return of a last-message preview, which helps the agent understand the data flow. It does not disclose rate limits or authentication requirements, but these are likely handled at the platform level and not critical for a read-only list operation.

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?

The description is concise and well-organized. It front-loads the primary purpose in the first line, then follows with usage context, parameter summaries, and return details in a clean structure. No unnecessary filler or redundancy, and every sentence earns its place. It strikes a good balance between completeness and brevity.

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 2-parameter, read-only, idempotent listing tool with an output schema present, the description is complete. It explicitly lists the return fields, mentions the thread_id's role for other tools, and covers both parameters adequately. Even though it does not explain the output schema in full detail, that is not required when an output schema exists, and the description provides enough for correct invocation.

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 both parameters already well-documented in the input schema: `amount` explains 'Maximum conversations to return, most recently active first,' and `only_unread` explains 'Return only conversations with unread messages.' The description's Args section repeats this information nearly verbatim, so it adds no new meaning beyond what the schema provides. With full schema coverage, 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?

The description clearly states the verb and resource: 'List direct-message conversations in the inbox.' It also explains the output provides thread IDs for two specific sibling tools, which adds purpose context. However, it does not explicitly contrast with other listing or search tools, though the name and description are unambiguous enough for an agent to distinguish this from thread retrieval or messaging.

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 practical guidance by stating that it 'Gives you the thread_id needed by instagram_get_direct_thread and instagram_send_direct_message,' implying this is the entry point for those operations. It does not mention when not to use it or list alternatives, but for a listing tool with clear parameters, the context is sufficient. A minor gap is the lack of explicit conditions for using `only_unread` or any pagination caveats.

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

instagram_loginA
Idempotent

Authenticate with Instagram using the credentials in the server's .env.

Login is automatic on first use, so call this only to recover from an expired session or to supply a two-factor/challenge code. The session is cached on disk and reused, which matters: repeatedly logging in from scratch is what makes Instagram flag an account.

Args: verification_code: The code Instagram asked for, if any. force: Re-authenticate even if this process already holds a session.

Returns: logged_in (bool), logged_in_as (str), summary (str) describing whether a cached session was reused, and session_file (str) where it was saved.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoDiscard the in-process session and authenticate again. Use after a session expires.
verification_codeNoSix-digit 2FA or challenge code, e.g. '123456'. Leave empty unless a previous call asked for one.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

The description discloses the session caching behavior ('The session is cached on disk and reused'), the automatic first-use login, and the risk of account flagging. These go beyond the annotations (idempotentHint, readOnlyHint, destructiveHint) and give the agent important operational context. There is no contradiction with annotations; the idempotentHint is consistent with the cached-session reuse when force is not set. The description also explains the return values, which adds transparency.

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?

The description is well-structured: it opens with the core purpose, then immediately gives usage conditions, then lists parameters and returns. Every sentence earns its place, and the most important caveat (repeated logins) is front-loaded. Despite being longer than a single sentence, it is efficiently organized with explicit 'Args' and 'Returns' headings.

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?

Given the tool's complexity (authentication with session management, 2FA, and force re-auth), the description covers all essential aspects: when to call it, what the parameters do, the return structure, and the critical warning about account flagging. The output schema exists, but the description still explains return fields, which is helpful. No critical information is missing for an agent to call this tool 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?

The schema already provides detailed descriptions for both parameters (force: 'Discard the in-process session and authenticate again. Use after a session expires.'; verification_code: 'Six-digit 2FA or challenge code, e.g. '123456''). The description adds little beyond the schema: it repeats 'Re-authenticate even if this process already holds a session' and 'The code Instagram asked for, if any.' With 100% schema coverage, the baseline is 3, and the description does not significantly augment parameter semantics.

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: 'Authenticate with Instagram using the credentials in the server's .env.' It also defines the exact scope: 'call this only to recover from an expired session or to supply a two-factor/challenge code.' This clearly distinguishes it from all sibling tools, including instagram_login_status, by stating what it does and when it is intended to be used.

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?

Explicit usage guidance is given: 'Login is automatic on first use, so call this only to recover from an expired session or to supply a two-factor/challenge code.' It also warns about the consequence of repeated logins ('repeatedly logging in from scratch is what makes Instagram flag an account'), which is a clear behavioral downside. The parameter descriptions in the schema reinforce when to use force ('Use after a session expires'). No alternative tools are named, but the conditions for use are unambiguous.

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

instagram_login_statusA
Read-onlyIdempotent

Report whether an Instagram session is active and how the server is configured.

Never logs in and never contacts Instagram, so it is the safe first call when something is not working. Use it to check which account is in use, whether write actions are permitted, and whether credentials are present at all.

Returns: logged_in (bool), logged_in_as (str|null), summary (str), and a configuration object reporting which credentials are set (never their values), the write-mode flag, the session cache path and the delay range.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations: it states the tool never logs in and never contacts Instagram (stronger than readOnlyHint), and clarifies that the configuration object reports which credentials are set but never their values. This adds critical behavioral context that annotations alone do not provide.

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?

The description is efficiently structured with a clear opening sentence, a usage guidance paragraph, and a return-value list. Every sentence adds value—there is no filler or redundancy. It front-loads the key message about safety and non-contact.

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 zero-parameter diagnostic tool with an output schema, the description is fully complete. It explains the purpose, when to use it, and exactly what is returned. The presence of an output schema means the description does not need to repeat schema details, yet it still summarizes the return fields clearly.

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 has no parameters, so the baseline is 4 per rubric. The description does not need to explain parameters, and it does not mention any. It appropriately focuses on behavior and return values.

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 the tool reports session status and server configuration, and explicitly distinguishes itself from instagram_login by declaring it never logs in and never contacts Instagram. This makes its purpose precise and clearly separates it from the large set of sibling tools.

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 provides strong context: 'safe first call when something is not working' and lists concrete intended uses (check which account, write permissions, credentials present). It does not explicitly name alternatives, but the 'never logs in' statement implies it is not for login actions. The guidance is clear enough without being exhaustive.

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

instagram_prepare_dmA
Read-onlyIdempotent

Get everything needed to draft a DM in one call: who, the conversation so far, and your voice.

This is the tool to reach for when asked to write or reply to someone on Instagram. It bundles the recent back-and-forth with the measured rules of how you write - both in general and specifically to this person - so a draft can match your voice instead of guessing at it.

It only gathers context. Nothing is sent until instagram_send_direct_message is called, which is deliberate: the draft should be shown to you first.

If the person is ambiguous it returns the candidates instead of guessing.

Args: person: Name or handle of who to message. thread_id: Or an existing conversation id. history: How many recent messages to include.

Returns: Either needs_disambiguation with candidates[], or: contact, thread_id, conversation[] (chronological, each {from: 'you'|'them', text, at}), your_voice {rules[], samples[], measurements}, with_this_person {my_message_count, burst_rate, my_samples[]}, and last_message_from.

ParametersJSON Schema
NameRequiredDescriptionDefault
personNoWho to message, by name or handle, e.g. 'sarah'. Omit if you pass thread_id.
historyNoHow many recent messages of context to return.
thread_idNoExisting conversation id, from instagram_find_person or instagram_list_direct_threads.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral context: it emphasizes 'It only gathers context. Nothing is sent until instagram_send_direct_message is called, which is deliberate: the draft should be shown to you first.' It also discloses the disambiguation behavior ('If the person is ambiguous it returns the candidates instead of guessing') and details the output shape. This goes 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?

The description is structured with a clear opening summary, then usage context, behavior, and structured Args/Returns sections. It's informative without being excessively verbose. The most critical information (not sending, disambiguation) is front-loaded. It could be slightly more concise in the Returns section, but the structure is effective for a complex 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?

Given the tool's complexity and the presence of an output schema, the description is remarkably complete. It explains the two possible return shapes (needs_disambiguation vs. the full context object) which goes beyond the schema's structured definition. It covers parameter semantics, usage context, and behavioral expectations. Nothing an agent needs to correctly invoke and interpret the result 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%, so the schema already fully documents all three parameters. The description's Args section largely mirrors the schema, restating the same info (e.g., 'person: Name or handle of who to message'). It does add the note that person is omitted if thread_id is provided, but that is also implied in the schema for person. Since the schema carries the loading, the description adds minimal new semantic value, consistent with the baseline of 3.

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 starts with a clear, specific statement: 'Get everything needed to draft a DM in one call: who, the conversation so far, and your voice.' It names the verb (get/prepare) and the resource (DM context) and explicitly contrasts with the sibling that sends (instagram_send_direct_message) by stating it only gathers context. This distinguishes it from the many related tools in the sibling list.

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 explicitly says 'This is the tool to reach for when asked to write or reply to someone on Instagram.' It also clarifies that nothing is sent until instagram_send_direct_message is called, which guides the agent on sequencing and expectations. However, it does not explicitly mention when NOT to use it or compare with alternative context-gathering tools like instagram_get_direct_thread, so it's clear but not exhaustive.

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

instagram_search_enrichA
Read-onlyIdempotent

Fetch full profiles, posts and country for the most promising candidates.

This is the expensive stage - roughly three API calls per candidate, so a limit of 40 is around two hundred seconds of deliberate delay before it returns - and it is the one that gets accounts rate limited, so it works on a ranked subset rather than the whole pool. Progress is saved every few candidates and the lock is released between them, so an interruption costs only the candidate in flight and the server stays responsive throughout. Candidates found on several channels go first, since corroboration is the only precision signal available before a profile has been read.

Fetches are best-effort: a candidate whose profile fails is recorded and skipped rather than ending the batch. Nothing already fetched is fetched again, so calling this repeatedly walks further down the pool.

Args: search_id: The search to enrich. limit: How many candidates to fetch. posts_per_user: How many recent posts to read each. include_about: Whether to read the account's country.

Returns: enriched, failed, api_calls, failures[] and next_step.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many candidates to fetch. Each costs about three API calls.
search_idYesThe search whose candidates to fetch.
include_aboutNoAlso read Instagram's 'account based in' country. One extra call, and the best location signal there is.
posts_per_userNoPosts to read per candidate. Twelve is enough to place someone geographically.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds substantial non-redundant behavioral details: rate limiting risk, approximate API call counts, progress saving between candidates, lock release behavior, best-effort error handling, and idempotent re-entry. There is no contradiction with annotations. This far exceeds what annotations alone convey.

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 description is relatively long but every sentence adds value: purpose, cost, rate limiting, idempotency, error handling, and a returns summary. It is structured with a lead sentence and then explanatory details, followed by an Args section. While it could be tightened, the length is justified given the complexity of the tool's behavior and context. It is front-loaded with the purpose and then dives into important caveats.

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?

The description covers essential context: when to use (expensive stage, ranked subset), cost implications (API call counts, delay), failure handling (best-effort), idempotency (repeated calls progress), and even mentions the return fields. The presence of an output schema covers return structure, but the description also names the return keys. Parameters are fully documented in both schema and description. Nothing an agent needs to decide when and how to invoke this tool 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 each parameter has a clear description in the schema itself. The description's Args section largely repeats the schema information (e.g., 'include_about: Whether to read the account's country'). It adds minimal new meaning beyond the schema; it does mention that 'limit' relates to API calls and that 'posts_per_user' can be used for geographic placement, but these are already hinted in schema descriptions. Therefore, a 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?

The description clearly states the core function: 'Fetch full profiles, posts and country for the most promising candidates.' It identifies the resource (candidate profiles) and the action (fetch) with a specific scope (most promising). It does not explicitly name sibling tools or contrast with them, but it positions itself as the enrichment stage in a search pipeline, which distinguishes it from similar search tools like instagram_search_shortlist or instagram_search_expand. The 'expensive stage' framing adds clarity.

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 provides strong usage context: it is the expensive stage with rate-limiting risk, works on a ranked subset, makes multiple API calls per candidate, and is idempotent by skipping already-fetched items. It warns about deliberate delay and suggests calling repeatedly to walk further down the pool. It does not explicitly list alternatives, but it clearly explains when and how to use it within the search workflow. The 'best-effort' and 'progress saved' details also guide correct usage.

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

instagram_search_expandA
Read-onlyIdempotent

Grow the pool by asking Instagram for accounts similar to your best ones.

This is the highest-yield stage in the whole search. Keyword probes find a foothold; this walks Instagram's own similarity graph outward from it, which returns candidates at far better precision than any search box can. Run it once the pool has a few good accounts in it, and again after scoring, when the seeds it picks are proven matches rather than guesses.

Args: search_id: The search to expand. seed_count: How many top candidates to use as seeds. usernames: Explicit seeds, overriding the pool's own ranking.

Returns: seeds_used, added, pool_size, api_calls, errors[] and next_step.

ParametersJSON Schema
NameRequiredDescriptionDefault
search_idYesThe search to expand.
usernamesNoChain off these handles instead of picking from the pool.
seed_countNoHow many of the current best candidates to chain off.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable behavioral context: it emphasizes high precision ('far better precision than any search box'), clarifies that it operates on a pool (implying state expansion), and states it returns api_calls and errors, hinting at possible rate-limit or error behavior. This goes beyond what annotations state without contradicting them.

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 description is somewhat verbose—it opens with a marketing-style claim about being the 'highest-yield stage'—but every sentence serves either to define purpose, guide usage, or document parameters/returns. It is front-loaded with the core purpose, and the Args/Returns blocks are clearly separated. It could be tightened, but it remains effective and readable for its length.

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 tool with 3 parameters, an output schema, and annotations covering safety, the description is thorough. It explains the operational context (when to run it relative to the search pipeline), what it does, and what it returns (seeds_used, added, pool_size, api_calls, errors, next_step). It does not mention prerequisites like needing an active search_id, but that is implied and not critical. Overall it gives an agent 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.

Parameters3/5

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

The input schema has 100% coverage, with all three parameters described. The description's Args section essentially paraphrases the schema (e.g., 'Explicit seeds, overriding the pool's own ranking' vs. schema's 'Chain off these handles instead of picking from the pool'). It adds minimal new meaning beyond the schema, 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?

The description opens with a specific verb and resource: 'Grow the pool by asking Instagram for accounts similar to your best ones.' It immediately conveys that this tool expands a candidate pool via Instagram's similarity graph, and explicitly contrasts it with keyword probes, distinguishing it from sibling search tools like instagram_search_start and instagram_search_enrich. The purpose is unmistakable and operationally clear.

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 explicit when-to-use guidance: 'Run it once the pool has a few good accounts in it, and again after scoring, when the seeds it picks are proven matches rather than guesses.' It also frames the tool's position relative to other search stages ('Keyword probes find a foothold; this walks Instagram's own similarity graph outward from it'). It does not name specific sibling tools, but the context is clear enough for an agent to select it appropriately within the search workflow.

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

instagram_search_gateA
Read-onlyIdempotent

Cut the pool down using only data already fetched. Costs nothing.

Run it straight after recall, and again after enrichment - the first pass can only see privacy and handles, while the second can see follower counts and bios. The under-18 floor does not depend on this: it is applied the moment age becomes readable and again at every exit, so no ordering of stages can let a minor through.

Every drop is counted by reason, so a gate that removes too much can be loosened deliberately rather than guessed at.

Args: search_id: The search to filter. exclude_private: Drop private accounts. exclude_shops: Drop apparent businesses. min_media: Minimum post count. follower_min: Follower floor. follower_max: Follower ceiling. max_pool: Maximum candidates to keep.

Returns: kept, dropped, reasons (a count per drop reason) and next_step.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_poolNoCap the surviving pool, keeping the best-corroborated candidates.
min_mediaNoMinimum posts an account must have.
search_idYesThe search to filter.
follower_maxNoHighest acceptable follower count. Omit for no ceiling.
follower_minNoLowest acceptable follower count. Omit for no floor.
exclude_shopsNoDrop accounts that look like shops or brands rather than people.
exclude_privateNoDrop private accounts. They cannot be verified, so they are dead weight.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover read-only, non-destructive, idempotent behavior. The description adds useful context such as the two-pass visibility stages, the under-18 floor being independent, and that every drop is counted by reason. No contradiction with annotations, and it provides meaningful behavioral nuance beyond the structured hints.

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 description is moderately long but every sentence carries meaning, explaining workflow, safety, and return values. It front-loads the purpose and usage, then lists args and returns clearly. It could be slightly trimmed, but the structure is logical and not wasteful.

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?

Given the tool's complexity (7 parameters, output schema, two-stage visibility), the description covers the workflow stages, return values (kept, dropped, reasons, next_step), and the safety invariant. It explains the 'costs nothing' aspect and the reason counting for tunability. Nothing essential is missing for correct invocation.

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 descriptions already cover all parameters (100% coverage), so baseline is 3. The description adds value by explaining which filters are effective at which stage (e.g., follower_min/max only work on the second pass because follower counts aren't visible in the first). This contextual insight helps the agent understand parameter behavior beyond the raw 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?

Clearly states it filters the candidate pool using already-fetched data, naming the verb 'cut the pool down' and the resource (search results). It explicitly distinguishes from search tools by emphasizing no new data is fetched, and the phrase 'Run it straight after recall' positions it within the workflow.

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 instructions: 'Run it straight after recall, and again after enrichment' and explains that the first pass only sees privacy and handles while the second sees follower counts and bios. Also clarifies when not to rely on it for the under-18 floor and that over-removal can be loosened, providing actionable guidance.

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

instagram_search_judgeA
Read-onlyIdempotent

Record what you saw in bios and images, and rescore against the persona.

Report observations, not verdicts: say the hair was 'brown', not that it scored 0.2 against a persona wanting blonde. Whether an observation satisfies the persona is decided in one place, so judgments cannot grade themselves and a mismatch cannot be smuggled in as a good score.

Naming the source matters: several images agreeing ('vision_multi') is a stronger measurement than one avatar ('vision_single'), and each carries a different ceiling. Use 'strength' below 1.0 when a reading is genuinely uncertain, and owner_face_confidence when it is unclear which face belongs to the account - both make the reading less certain rather than pretending it fits worse than it does.

Args: search_id: The search to update. judgments: Per-candidate attribute readings.

Returns: applied, rejected, unknown_candidates, problems[] and next_step.

ParametersJSON Schema
NameRequiredDescriptionDefault
judgmentsYesOne entry per candidate: {'user_id':'123','owner_face_confidence':0.9,'attributes':{'hair':{'value':'blonde','source':'vision_multi'}}}. Report what you SAW, not how well it matched. Use 'reject_reason' to drop one.
search_idYesThe search these judgments belong to.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior1/5

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

The description directly contradicts the annotations: annotations declare readOnlyHint: true, implying this tool does not modify any state, but the description explicitly says 'Record what you saw' and 'rescore against the persona,' which are write-like operations. The title also says 'Record judgments.' This is a clear contradiction that could mislead an agent about side effects or state changes. The description also fails to disclose potential side effects or requirements beyond the contradiction. Given the direct conflict, a score of 1 is warranted.

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 description is well-structured with clear sections: purpose, guidance, and argument summaries. The prose is detailed but purposeful, explaining the reasoning behind the guidance (e.g., why to report observations not verdicts) though some redundancy exists (e.g., repeating the 'source matters' point). It front-loads the core purpose and provides a concise args/returns summary. While it could be trimmed, the length is justified by the tool's complexity.

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?

The description covers the tool's inputs, the behavioral expectations, and the return values (applied, rejected, unknown_candidates, problems[], next_step). It explains key concepts like source quality and confidence, which are essential for correct usage. However, it does not mention prerequisites (e.g., a valid search_id must exist) or error handling beyond problems[]. Given the tool's complexity and the presence of an output schema (though not shown), the description is sufficiently complete for an agent to use it correctly in most scenarios.

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?

While the schema description provides 100% coverage of parameters, the description adds meaningful semantics beyond the schema. It explains the intent behind judgments: 'Report what you SAW, not how well it matched,' and elaborates on how to encode uncertainty via 'strength' and 'owner_face_confidence.' It also clarifies the meaning of source values (vision_multi vs vision_single) and their impact on ceilings. This enriches the schema's basic type definitions, providing an agent with critical guidance for correct parameter construction.

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 clearly states the tool's purpose: 'Record what you saw in bios and images, and rescore against the persona.' It specifies the verb (record/rescore), the resource (bios and images), and the context (persona scoring). This distinguishes it from other Instagram tools, which focus on retrieval or actions. The description also explains the expected behavior of recording observations rather than verdicts, which is specific to this judge tool.

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 detailed guidance on how to use the tool (report observations, not verdicts; use 'strength' and 'owner_face_confidence' for uncertainty) but does not explicitly state when to use this tool versus alternatives. It does not mention any sibling tools or conditions that would route an agent to this tool instead of others like instagram_search_enrich or instagram_search_shortlist. The usage context is implied (after observations are gathered), but exclusions or alternative selection criteria are absent.

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

instagram_search_listA
Read-onlyIdempotent

List every persona search on disk, most recently touched first.

Reads local files only, so it never contacts Instagram. Use it to pick up a search that was interrupted - nothing already fetched needs fetching again.

Returns: count and searches[]: search_id, label, stage, candidates, api_calls, updated_at.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/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. The description adds that it reads local files only and never contacts Instagram, and specifies the ordering behavior. These details go beyond the annotations and are valuable for the agent. No contradiction exists.

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?

The description is concise, structured in three short paragraphs with the main action front-loaded. It avoids redundant phrasing and includes only essential usage and return information. Every sentence adds value, making it efficient and easy to parse.

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 simple list tool with no parameters, the description provides complete context: what it does, when to use it, what it returns, and that it is safe (local-only). The output schema exists, so the return structure is redundant but harmless. The agent can call it without any ambiguity.

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 has zero parameters, so there is nothing for the description to explain. Per the baseline for 0-parameter tools, a score of 4 is appropriate; the description correctly omits parameter details because none exist.

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 clearly states the action 'List', the resource 'persona searches on disk', and the ordering 'most recently touched first'. It distinguishes itself from siblings by noting it reads local files only and never contacts Instagram, separating it from network-touching tools like instagram_search_start or instagram_search_recall.

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 explicitly provides a usage scenario: 'Use it to pick up a search that was interrupted - nothing already fetched needs fetching again.' It implies that this is for resuming existing searches rather than starting new ones, but it does not explicitly name alternatives or state when not to use it. The context is clear enough, though a direct contrast with instagram_search_start would strengthen it.

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

instagram_search_locationsA
Read-onlyIdempotent

Find Instagram place pages by name, to get a location_id.

Feed instagram_get_location_medias with the location_id you get back.

Args: query: The place name to search for. amount: How many places to keep.

Returns: count and locations[]: location_id, name, address, city, lat, lng.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesPlace name, e.g. 'Vondelpark' or 'Rotterdam Centraal'.
amountNoMaximum places to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

The annotations already cover readOnlyHint, idempotentHint, and destructiveHint, so the description does not need to repeat those. It adds valuable context by describing the return format (count and locations[] with specific fields) and the integration with the media tool, which goes beyond the annotations. No contradictions found.

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 description is well-structured: a clear first sentence stating purpose, a second sentence for integration, then Args and Returns. It is concise and front-loaded, though the Args/Returns section could be omitted since the schema and output schema cover the same details. Still, it is not verbose and every line serves a purpose.

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 an output schema present and annotations covering safety/idempotency, the description provides all necessary operational context: what the tool does, how to use the result, and the structure of the output. There are no missing pieces an agent would need to call this tool 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?

The input schema has 100% coverage with descriptions for both parameters. The 'query' description includes examples, and 'amount' says 'Maximum places to return.' The description's Args section restates these but adds only minimal extra meaning (e.g., 'How many places to keep'), so it does not significantly compensate beyond the schema. Baseline of 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?

The description clearly states the tool 'Find Instagram place pages by name, to get a location_id.' This is specific and distinguishes it from sibling search tools like instagram_search_users or instagram_search_posts by focusing on places and the resulting location_id. The downstream integration with instagram_get_location_medias is also mentioned, reinforcing the purpose.

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 explicitly says 'Feed instagram_get_location_medias with the location_id you get back,' which provides clear contextual guidance on how to use the result. It does not explicitly list alternatives or exclusions, but the purpose is so focused that an agent can infer when to use it. This earns a 4 rather than 5 due to the lack of explicit contrast with other search tools.

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

instagram_search_postsA
Read-onlyIdempotent

Search posts by keyword, the way the app's search results tab does.

Unlike hashtag lookup this matches captions and Instagram's own topic modelling, so it works for phrases nobody tags. Mostly useful as a way to reach the accounts behind the posts.

Args: query: The phrase to search for. amount: How many posts to fetch.

Returns: query, count and medias[]: media_id, code, url, type, taken_at, author, caption, like_count, comment_count.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesWhat to search for, e.g. 'amsterdam fitness coach'.
amountNoMaximum posts to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral context beyond these: it mimics the app's search results tab, uses topic modelling rather than exact hashtags, and explains the purpose of reaching accounts. This adds useful behavioral detail without contradicting 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?

The description is fairly concise and well-structured: an intro, a contrast, a use case, then Args and Returns. It front-loads the main action. There is some redundancy in the Args section that repeats schema info, but overall it is organized and not overly verbose.

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?

Given the tool has annotations and an output schema, the description covers the essential aspects: what it does, how it differs from hashtag lookup, the use case, and what it returns. It provides enough information for an agent to decide when to use it and what to expect. The return fields are explicitly listed, and the matching behavior is explained. Nothing critical 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% with descriptions for both query and amount. The description's Args section merely restates the schema information ('The phrase to search for', 'How many posts to fetch') without adding new semantics. The intro adds a note about matching captions and topic modelling, which indirectly informs query behavior, but not enough to raise above the baseline of 3.

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: 'Search posts by keyword, the way the app's search results tab does.' It also distinguishes from hashtag lookup, making it clear this is a keyword-based post search. The purpose is unambiguous and differentiates from siblings like instagram_search_users or instagram_get_hashtag_medias.

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?

The description explicitly contrasts with hashtag lookup: 'Unlike hashtag lookup this matches captions and Instagram's own topic modelling, so it works for phrases nobody tags.' This tells the agent when to prefer this tool. It also states a specific use case: 'Mostly useful as a way to reach the accounts behind the posts.' That is clear guidance on when to use it.

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

instagram_search_recallA
Read-onlyIdempotent

Sweep Instagram for candidates and add them to the search pool.

Channels: accounts (handle/name/bio text, paginated), hashtags (post authors), places (authors of geotagged posts - the strongest location probe), posts (keyword search), seeds (accounts similar to one you name), followers, likers, commenters, co_tagged (who someone is photographed with).

Fire many cheap probes rather than one careful one. Precision per probe is poor by design; what matters is that candidates surfacing on several unrelated channels rank higher, and that costs nothing extra. Channels fail independently, so a rate limit on one does not lose the others.

Repeatable - call again with more probes to widen the pool.

Args: search_id: The search to add to. probes: Channel names mapped to lists of probe arguments.

Returns: pool_size, corroborated (found by more than one channel), api_calls, channels[] (per-probe counts), errors[] and next_step.

ParametersJSON Schema
NameRequiredDescriptionDefault
probesYesProbe plan, e.g. {'hashtags':[{'tag':'fitgirlnl','amount':40}],'places':[{'query':'Amsterdam gym'}],'accounts':[{'query':'amsterdam fitness','pages':2}],'seeds':['known_match']}.
search_idYesThe search to add candidates to, from instagram_search_start.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output 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. The description adds valuable behavioral context beyond that: channels fail independently so rate limits on one do not lose others, and the tool is intentionally low-precision-per-probe. It also explains return characteristics like 'corroborated' counts. 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.

Conciseness4/5

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

The description is moderately long but each section earns its place: opening purpose, channel list, strategy, repeatability, and then args/returns. The main action is front-loaded, and the list is compactly formatted. Slightly verbose but not wasteful.

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?

Given the complexity (2 params, nested object, many channels, and an output schema exists), the description covers channel options, probe strategy, error independence, repeatability, and return fields. It does not detail the exact probe argument format beyond the schema example, but the schema covers that. The existence of an output schema reduces the burden on the description for return values.

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% (both parameters have descriptions), so baseline is 3. The description adds meaning beyond the schema by explaining each channel type (e.g., 'places (authors of geotagged posts - the strongest location probe)') and the overall probe structure, which enriches understanding of how to use the `probes` parameter.

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 ('sweep') and resource ('Instagram for candidates') and clearly explains the action of adding them to a search pool. It enumerates all channels, distinguishing it from the many sibling search tools by describing its multi-channel aggregation role.

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?

Provides clear strategic guidance: 'Fire many cheap probes rather than one careful one' and explains why (precision per probe is poor by design, corroboration across channels matters). It also states it is repeatable to widen the pool and that channels fail independently, giving context for when to use this tool. It does not explicitly name alternative tools, but the guidance is strong enough.

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

instagram_search_resultsA
Read-onlyIdempotent

The ranked answer, with every attribute's evidence attached.

Read two numbers, not one. ranked_score is the ranking; coverage is how much of the persona was actually observable on that account. A high raw score over two observed attributes is worth less than a good one over six, and the ranking already reflects that - anything labelled 'unverified' scored well on too little to trust.

Attributes marked 'unobserved' were not visible, which is not the same as not matching. Attributes marked advisory are reported but were never allowed to affect the ranking.

Args: search_id: The search to read. limit: How many profiles to return.

Returns: count, persona, results[] (rank, username, url, confidence, ranked_score, coverage, found_via, attributes with evidence) and the search's total api_calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many profiles to return.
search_idYesThe search to read results from.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, and the description does not contradict these. It adds valuable contextual behavior: the distinction between ranked_score and coverage, the caveat about 'unverified' results, the meaning of 'unobserved' versus 'not matching', and that advisory attributes are reported but do not influence ranking. This goes beyond the annotations and improves the agent's understanding of the result semantics.

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 description is reasonably concise and front-loaded with the most important interpretation guidance ('Read two numbers, not one'). It is structured with a brief overview, an explanation of key concepts, and a clear Args/Returns section. The extra explanation about unobserved and advisory is essential context, so it earns its place. It is slightly verbose but not wasteful.

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 an output schema present, the description still lists the return fields, which is helpful. It covers the critical interpretation nuances (scoring, coverage, attribute states) that the schema does not express. It is complete enough for a read-only search-results retrieval tool, though it could mention that the search must already exist or be started via another tool. This is a minor omission given the depth of the rest.

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?

The schema description coverage is 100%, with both parameters (search_id and limit) having clear descriptions. The tool description repeats the args and adds no additional parameter-specific semantics (e.g., no instructions on how to obtain a search_id, no notes on limit behavior beyond what the schema already provides). It meets the baseline for schema-covered parameters but does not enhance them.

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 clearly states it returns ranked search results with evidence, and explains the key fields (ranked_score, coverage, unobserved, advisory). It distinguishes itself by focusing on the result of a search rather than the search initiation, but does not explicitly differentiate from sibling search-related tools like instagram_search_list or instagram_search_recall, leaving some ambiguity about when to use this specific result-reader.

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 usage by requiring a search_id and explains how to interpret the results, but it never explicitly states when to use this tool versus alternatives. It does not mention that this tool should be used after starting a search with one of the instagram_search_* tools, nor does it say when not to use it. The guidance is mostly about interpreting output rather than selecting the tool.

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

instagram_search_shortlistA
Idempotent

Get the best candidates packaged for judging, optionally with their images.

Each bundle says explicitly what is still unobserved and what was observed only weakly - those are the reasons to spend a look, and judging anything else is wasted effort.

With download_images, each candidate's profile picture and recent post thumbnails are fetched and composed into a single numbered contact_sheet on the machine running this server. Read that one image rather than the tiles individually: it is a twelfth of the attention, the numbers let a judgement cite the tile it came from, and seeing every picture side by side is what makes the hard question answerable.

That question is which face is the account holder. Feeds are full of friends, partners and clients, so before judging appearance find the face that recurs across the tiles and check it against the one marked 'avatar', which is the only picture certain to be them. Report the result as owner_face_confidence - a judgement made on the wrong face is worse than none, because it arrives sounding just as certain as a right one.

Args: search_id: The search to shortlist from. limit: How many candidates to prepare. download_images: Whether to fetch images to local disk. images_per_user: How many images per candidate.

Returns: count, candidates[] (each with biography, signals, needs_judging, weakly_observed and images[]) and how to report judgments back.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many candidates to prepare.
search_idYesThe search to shortlist from.
download_imagesNoDownload the profile picture and recent post thumbnails to local files so they can be looked at.
images_per_userNoImages per candidate, profile picture included.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare idempotentHint=true, readOnlyHint=false, etc. The description adds substantial behavioral detail: it discloses that bundles state what is unobserved or weakly observed, that download_images writes local files on the server, that the contact sheet is a single composed image, and warns about the risk of judging the wrong face. This goes well beyond the annotations and provides crucial insights for correct usage.

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 description is long but well-structured with an opening purpose, explanatory paragraphs, and an Args section. It front-loads the core purpose and then adds valuable context about the contact sheet and judgment guidance. Each paragraph earns its place, though some repetition with schema param descriptions could be trimmed. It is more verbose than strictly necessary but never waffles.

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?

The description is comprehensive for a tool with four parameters and an output schema. It covers purpose, behavior, judgment strategy, parameter semantics, and return format. The output schema already exists so detailed return documentation is unnecessary. Given the complexity and the need to guide an agent through a nuanced judgment process, nothing essential 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?

The input schema covers all four parameters with descriptions (100% coverage). The description's Args section largely mirrors the schema descriptions (e.g., 'search_id: The search to shortlist from.'). It adds no new semantics beyond what the schema already provides, so the baseline score 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?

The description opens with a specific verb+resource: 'Get the best candidates packaged for judging, optionally with their images.' It clearly differentiates from siblings like instagram_search_results, instagram_search_judge, and other search tools by focusing on packaging candidates specifically for the judging step. This is unambiguous.

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 rich 'when to use' guidance by explaining the judging workflow and how to interpret the output (e.g., 'find the face that recurs across the tiles and check it against the one marked avatar'). It does not name alternative tools explicitly, but the context of 'for judging' among siblings like instagram_search_judge and instagram_search_results makes the usage clear. It lacks explicit exclusions or sibling comparisons but is strong in context.

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

instagram_search_signalsA
Read-onlyIdempotent

Read every enriched candidate against the persona, for free.

Contacts nothing and calls no model. It measures what is already on disk: gender from the given name and any stated pronouns, city from a recency-weighted cluster of where posts were geotagged, country from Instagram's own answer, language from caption wording, niche from tags and category, and age from any birth year given away.

It resolves everything except appearance, which no free signal can reach - so run it before spending anything on images, and let vision see only what survives it.

Args: search_id: The search to analyse.

Returns: scored, confidence_breakdown, top[] (a preview of the ranking) and next_step.

ParametersJSON Schema
NameRequiredDescriptionDefault
search_idYesThe search to analyse.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful beyond-annotation context: 'Contacts nothing and calls no model' and 'measures what is already on disk' (no network or external dependency), plus a concrete breakdown of how each signal is derived. This enriches the behavioral picture beyond what the annotations state.

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 description is well-structured with clear sections (purpose, behavior/signals, args, returns) and front-loads the core purpose in the opening line. It is somewhat verbose — the granular per-signal derivation detail and the Returns enumeration could be trimmed since an output schema exists — but the information density is high and nothing is filler.

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 tool of this complexity (measuring six distinct signals), the description covers what each signal is derived from, notes the appearance limitation, and confirms no model/network calls. An output schema exists, so the Returns section is redundant but not harmful. The single parameter is fully documented in the schema, and the sibling context is clear. Coverage is thorough given annotations already carry the safety profile.

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% — the sole parameter `search_id` is already documented in the schema as 'The search to analyse.' The description's Args section merely restates this exact wording, adding no syntax, format, or validation detail on top. This is the baseline 3 where the schema does the heavy lifting.

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 ('Read') and resource ('every enriched candidate against the persona') and makes the scope unmistakable: it is a free, disk-only signal measurement tool. It clearly differentiates from sibling tools like instagram_search_enrich or instagram_get_style_profile by framing itself as the free pre-vision analysis step, so an agent can select 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?

It gives explicit when-to-use guidance: 'run it before spending anything on images, and let vision see only what survives it.' This routes the tool ahead of vision-based analysis while noting its limitation ('no free signal can reach' appearance). It lacks an explicit 'do not use when...' clause or named alternative sibling, which keeps it from a 5, but the actionable ordering advice is strong.

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

instagram_search_startA
Read-onlyIdempotent

Begin a persona search and get back a search_id to drive it with.

Nothing is fetched here. This validates the persona, tells you how certain each attribute could ever be, and opens a job on disk that survives crashes and rate limits - a full search is hundreds of calls over many minutes, so it is run stage by stage rather than in one blocking call.

Scorable attributes: country, city, language, niche, gender, age_band, hair, build, follower_range, engagement, account_type, height, ethnicity. Some are advisory - they are reported but never allowed to move the ranking, because they cannot be read off a profile reliably enough to reject anyone on.

After this, call instagram_search_recall with a probe plan.

Args: persona: The attributes to search for, with optional weights. label: A human-readable name for the search.

Returns: search_id, persona (compiled, with max_certainty per attribute) and next_step.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoA short name for this search, e.g. 'AMS fitness creators'.
personaYesWhat to look for, e.g. {'gender':'female','city':'Amsterdam','niche':['fitness'],'age_band':[24,32]}. Mark must-haves as {'value':'female','required':true}.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds substantial behavioral context: it opens a job on disk that survives crashes and rate limits, runs non-blockingly over many calls, and explains that some attributes are advisory and never affect ranking. This goes far beyond the annotations and gives the agent a clear model of the tool's side effects and limitations. 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?

The description is well-structured with a clear opening, an explanatory paragraph, a list of attributes, and a structured Args/Returns section. Every sentence contributes essential information—usage context, behavioral notes, next steps, and return format. No filler or redundancy, and important information is front-loaded.

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?

Given the tool's complexity (multi-stage search, nested persona object, long-running job), the description is remarkably complete. It explains what happens (validation, max_certainty compilation), what does not happen (fetching), the return values (search_id, compiled persona, next_step), and the next action (recall). The only minor omission is error handling, but that's not essential for selection and invocation. It fully equips an agent to know when and how to use it.

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

Parameters5/5

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

Schema coverage is 100% with detailed descriptions for both persona and label. The main description adds even more: it lists all scorable attributes (country, city, language, etc.), explains that some are advisory, and provides an example of the persona structure. This enriches the schema's semantics, helping the agent construct a valid persona and understand weight/required flags. The value added exceeds the baseline.

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 immediately states the verb and resource: 'Begin a persona search and get back a search_id to drive it with.' It also clarifies what it does NOT do ('Nothing is fetched here') and explains its role as the initialization step for a multi-stage search. This clearly distinguishes it from sibling tools like instagram_search_recall and instagram_search_users.

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?

The description explicitly instructs the next step: 'After this, call instagram_search_recall with a probe plan.' It also explains the long-running nature and that it must be run stage by stage, implying this tool is the starting point. It differentiates itself from alternatives by stating it only validates the persona and opens a job, not fetching data.

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

instagram_search_usersA
Read-onlyIdempotent

Search Instagram for users by handle or display name.

Returns the same ranked list the app's search box shows. Results are shallow; follow up with instagram_get_user for counts and biography.

Args: query: What to search for. amount: How many results to keep.

Returns: count (int) and users[]: user_id, username, full_name, is_private, is_verified.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesName or handle fragment, e.g. 'nasa' or 'jane doe'.
amountNoMaximum profiles to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable behavioral context: results are 'shallow' (limited fields) and it recommends a follow-up tool for richer data. It also notes that results match the app's search box ranking. No contradiction exists; the description enriches the annotation-driven expectations.

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?

The description is tightly structured: a one-sentence purpose, a note about output depth and follow-up, then concise Args and Returns blocks. Every sentence earns its place — no padding or repetition of the schema verbatim (except the Args section, which is acceptable for clarity). Front-loaded with the core purpose, it's easy to scan.

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?

Given the tool's simplicity (two params, shallow results), the description covers all essentials: what it does, what it returns (count and the specific user fields), and how to get more detail. It mentions the output shape clearly, which compensates for the output schema not being shown. With annotations handling safety and idempotency, little is missing for an agent to invoke this 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%, with both parameters already well-described (e.g., query: 'Name or handle fragment, e.g. nasa or jane doe'; amount: 'Maximum profiles to return'). The description's Args section essentially restates the schema without adding new meaning. It provides no additional syntax, defaults, or constraints beyond what the schema already conveys, so it stays at the baseline for high schema coverage.

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 'Search Instagram for users by handle or display name' — a specific verb, resource, and search criteria. It clearly distinguishes this tool from instagram_search_posts, which searches a different entity, and names the exact fields returned. The purpose is unambiguous.

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 provides clear usage context: it returns the same ranked list as the app's search box and explicitly recommends instagram_get_user for deeper data ('Results are shallow; follow up...'). This guides an agent on when to use this tool versus alternatives, though it doesn't explicitly compare with other search siblings like instagram_find_person. Still, the follow-up guidance is actionable and clear.

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

instagram_send_direct_messageA

Send a direct message, either into an existing thread or to new recipients.

Sends immediately and cannot be undone from here. Confirm the exact recipient and wording with the person you are working for before calling this. Requires INSTAGRAM_ALLOW_WRITES=true.

Args: text: The message to send. thread_id: Reply into this conversation. usernames: Or start/continue a conversation with these handles. user_ids: Or the same recipients by numeric id.

Returns: sent (bool), message_id, thread_id, sent_at and text.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesMessage body to send.
user_idsNoRecipients by numeric id. Use instead of usernames.
thread_idNoExisting conversation to reply in, from instagram_list_direct_threads.
usernamesNoRecipients by handle, e.g. ['nasa']. More than one starts a group chat.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, but the description adds valuable behavioral context: 'Sends immediately and cannot be undone from here' and the prerequisite environment variable. This goes beyond the annotations. However, it does not cover other relevant behaviors like rate limits, error handling, or what happens if both thread_id and usernames are supplied, so it is not fully transparent.

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 description is concise, front-loaded with the purpose, and includes a neatly formatted Args/Returns sections. Each sentence contributes value—cautions, requirements, and parameter semantics. It is well-structured and avoids fluff, though the Args/Returns format is slightly verbose compared to a single-line summary.

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

Completeness3/5

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

The output schema exists (though not shown), and the description lists return fields, so that aspect is covered. It explains the prerequisites and irreversibility. However, it omits details on parameter precedence (e.g., what happens if thread_id and usernames are both provided), error scenarios, or rate limits. Given the tool's complexity, a bit more detail on edge cases would improve completeness.

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 all parameters. The description adds meaning by explaining the intended usage: 'thread_id: Reply into this conversation' and 'usernames: Or start/continue a conversation with these handles,' clarifying the mutual exclusivity implied by the 'either/or' phrasing. This enriches the schema without redundancy.

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 clearly states the verb and resource: 'Send a direct message,' and specifies two modes (existing thread or new recipients). It distinguishes itself from read-only siblings like instagram_list_direct_threads and instagram_get_direct_thread by its action verb. However, it does not explicitly name any sibling tool as an alternative, so it falls just 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 Guidelines4/5

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

The description provides clear guidance: it warns that sending is immediate and irreversible, advises confirming with the user before calling, and states the INSTAGRAM_ALLOW_WRITES=true requirement. This gives the agent important context on when to call and what to check beforehand. It does not name specific alternative tools (e.g., instagram_prepare_dm) for non-sending actions, which would make it a 5.

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

instagram_similar_accountsA
Read-onlyIdempotent

List the accounts Instagram itself considers similar to one you name.

This reads the same "Suggested for you" graph the app shows under a profile, built from co-follow behaviour Instagram has already modelled. It is by far the highest-precision way to find more accounts like one you already like - far better than searching words - so the usual pattern is to find one good example by any means and then chain outward from it.

Instagram refuses chaining for some accounts, mostly private or recently flagged ones; a second, older endpoint is tried before giving up.

Args: username: The handle to find lookalikes for. user_id: The numeric id, if you already have it. amount: How many accounts to keep.

Returns: seed (the account asked about), count and users[]: user_id, username, full_name, is_private, is_verified.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountNoMaximum accounts to return.
user_idNoNumeric user id. Use instead of username.
usernameNoHandle to find lookalikes for, e.g. 'nasa'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond that: it clarifies the data source (the app's 'Suggested for you' graph), the reliance on pre‑modelled co-follow behaviour, and the automatic fallback to an older endpoint when chaining is refused. Minor gaps (e.g., rate limits or authentication requirements) are not mentioned, but these are secondary to the core behavior disclosed.

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?

The description is concise and well-structured: a one‑sentence purpose, a two‑sentence context about precision and usage pattern, a short limitation/fallback note, then a clean Args/Returns breakout. Every sentence earns its place, and the most important information (what the tool does) is front‑loaded. No fluff or redundant repetition of annotation data.

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?

Given the tool's moderate complexity and the availability of an output schema, the description covers all essential aspects: purpose, usage pattern, failure modes with fallback, parameter semantics, and a summary of the return structure (seed, count, users list with key fields). The agent has enough to invoke it correctly without additional probing. The description fully compensates for any information not in the schema.

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?

Input schema coverage is 100%, so each parameter is already documented with descriptions (amount default/max, user_id vs username, etc.). The description adds further nuance: it states that user_id is 'The numeric id, if you already have it' and clarifies the relationship between user_id and username ('Use instead of username'). This goes slightly beyond the schema's phrasing and helps the agent decide which parameter to supply, so the marginal value justifies a 4.

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 precise, specific action: 'List the accounts Instagram itself considers similar to one you name.' It clearly identifies the resource (Instagram's similarity graph) and the verb (list), and differentiates from siblings by emphasizing 'far better than searching words' and by referencing the 'Suggested for you' graph, which is unique among the sibling tools. An agent can immediately tell this is not about search, followers, or posts.

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?

The description provides explicit usage context: it explains the recommended pattern ('find one good example by any means and then chain outward from it') and compares it to alternatives ('far better than searching words'). It also flags a known limitation ('Instagram refuses chaining for some accounts') and the fallback behavior ('a second, older endpoint is tried before giving up'). This gives the agent clear direction on when and how to use the tool.

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

instagram_unfollow_userA
Idempotent

Unfollow a user as the logged-in account.

Requires INSTAGRAM_ALLOW_WRITES=true.

Args: username: The handle to unfollow. user_id: The numeric id, if you already have it.

Returns: unfollowed (bool) and user_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idNoNumeric user id. Use instead of username.
usernameNoHandle to unfollow, e.g. 'nasa'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false, but the description adds valuable context: the INSTAGRAM_ALLOW_WRITES=true requirement and the return format (unfollowed (bool) and user_id). This goes beyond what annotations provide, helping the agent understand the write-flag dependency and expected output. There is 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?

The description is front-loaded with the core purpose and then structured into requirements, arguments, and returns. Every sentence contributes: the first line states the action, the second gives a critical prerequisite, and the Args/Returns sections are terse and informative. No redundancy, ideal length for a simple mutation tool.

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?

The description covers the essential aspects for a two-parameter mutation: purpose, write-flag requirement, parameter semantics, and return values. It lacks only explicit edge-case handling (e.g., unfollowing a non-existent user) but that's arguably minor given the tool's simplicity and the annotations covering idempotency. Overall, 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.

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 both parameters with descriptions. The description adds only a slight nuance—'if you already have it' for user_id—suggesting a preference for username but not materially improving comprehension. Per the rubric, a 3 baseline is appropriate when the schema carries the meaning.

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 (unfollow) and resource (user as the logged-in account), clearly distinguishing it from the sibling follow_user. The first line 'Unfollow a user as the logged-in account' is unambiguous and leaves no doubt about the tool's function.

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 provides a prerequisite (INSTAGRAM_ALLOW_WRITES=true) but gives no explicit guidance on when to use this tool versus alternatives like follow_user or other mutation tools. It does not state conditions like 'use when the client wants to stop following a handle' or indicate when not to use it. The purpose is implied but routing 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.

instagram_unlike_mediaA
Idempotent

Remove the logged-in account's like from a post.

Requires INSTAGRAM_ALLOW_WRITES=true.

Args: media: A post URL, shortcode or media id.

Returns: unliked (bool) and media (the post reference acted on).

ParametersJSON Schema
NameRequiredDescriptionDefault
mediaYesPost URL, shortcode or media id.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations provide readOnlyHint=false and destructiveHint=false, indicating a non-read/non-destructive mutation, which the description aligns with by stating 'Remove'. The description adds the requirement for INSTAGRAM_ALLOW_WRITES=true and the return structure (unliked bool and media reference), which goes beyond annotations. However, it doesn't disclose idempotency behavior, error cases, or rate limits, which would be valuable for a write operation. Given the annotation coverage, a 3 is appropriate.

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?

The description is compact and well-structured: a one-line action, an environment prerequisite, and a clear Args/Returns section. Every sentence serves a purpose, and the most important information (what it does) is front-loaded. No filler or redundant phrasing.

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?

The tool has an output schema (not deeply shown but noted) and the description includes return values. It also specifies the environment variable requirement. For a simple mutation with a single parameter, the description covers the essential usage context. Minor omissions like error handling or idempotency confirmation are not critical given annotations already declare idempotentHint=true.

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?

The schema description for the media parameter is comprehensive ('Post URL, shortcode or media id.') and the description repeats exactly this text, adding no new meaning. With schema description coverage at 100%, the baseline for this dimension is 3. There is no additional elaboration on formats, validation rules, or typical usage examples.

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 begins with a specific verb ('Remove') and a clear resource ('the logged-in account's like from a post'), immediately distinguishing this from its sibling like_media and other read-only tools. The phrase 'logged-in account' clarifies scope unambiguously.

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 states a prerequisite (INSTAGRAM_ALLOW_WRITES=true) which is useful, but it does not explicitly mention the inverse relationship with like_media or provide any when-to-use/when-not-to-use guidance. The usage context is implied by the tool name and the sibling list. It lacks explicit exclusions or alternatives beyond the obvious counterpart.

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

instagram_upload_albumA

Publish several photos or videos as one carousel post.

Instagram allows between 2 and 10 items. Requires INSTAGRAM_ALLOW_WRITES=true.

Args: paths: The files to publish, in order. caption: The caption to publish with them.

Returns: posted (bool), item_count and media: media_id, code, url, type, caption.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYesAbsolute paths to 2-10 images or videos, in the order they should appear.
captionNoCaption text, hashtags included.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses that this is a write operation ('Publish'), requires a specific environment variable, and details the return values (posted, item_count, media object with fields). While annotations already flag readOnlyHint=false, the description adds valuable context about the prerequisite and expected outcome, going beyond the binary flag.

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?

The description is concise and well-organized: a one-sentence purpose, a requirement line, and labeled Args/Returns sections. It front-loads the action and omits any fluff. Every sentence earns its place, and the structure makes it easy for an agent to parse.

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 moderate-complexity tool with two parameters and an output schema, the description covers the essential aspects: what it does, the count constraint, the prerequisite, and the return values. It does not address failure cases or login requirements, but these are less critical given the explicit annotations and schema, making it complete enough for correct invocation.

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?

The schema already provides complete parameter descriptions (100% coverage), so the description's rephrasing of paths and caption adds little new meaning. It mentions the order for paths, but that is already in the schema. The description does not compensate for any missing schema information because none is missing; hence a baseline of 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?

The description states 'Publish several photos or videos as one carousel post.' This clearly identifies the verb (publish), the resource (photos/videos as a carousel), and distinguishes it from siblings like instagram_upload_photo and instagram_upload_video. It also specifies the count range (2–10), leaving no ambiguity about what the tool does.

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 provides a clear usage scenario (publishing multiple items as a carousel) and includes a specific prerequisite ('Requires INSTAGRAM_ALLOW_WRITES=true'). It does not explicitly name alternatives or state when not to use it, but the context is sufficiently clear to guide selection among upload tools.

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

instagram_upload_photoA

Publish a photo to the feed.

Instagram accepts JPEG; other formats are converted first. This posts publicly and immediately - confirm the file and caption with the person you are working for. Requires INSTAGRAM_ALLOW_WRITES=true.

Args: path: The image file to publish. caption: The caption to publish with it.

Returns: posted (bool) and media: media_id, code, url, type, taken_at, caption.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path to a JPEG on this machine, e.g. 'C:/photos/sunset.jpg'.
captionNoCaption text, hashtags included.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description adds significant behavioral context: posts publicly and immediately, requires INSTAGRAM_ALLOW_WRITES=true, handles format conversion (JPEG accepted, others converted), and warns to confirm with the person. These details are not present in annotations and guide appropriate use.

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?

The description is efficient and well-structured: the core action is front-loaded, followed by key behavioral caveats, then parameter and return summaries. Every sentence serves a purpose without redundancy, making it easy for an agent to scan quickly.

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 tool that publishes a photo, the description covers all essential aspects: prerequisites (permission env var), behavioral outcomes (public, immediate), format handling, and return structure. The existence of an output schema covers return details, and the description aligns with it, leaving no obvious gaps for correct invocation.

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 baseline is 3. The description restates the two parameters (path and caption) but adds no additional meaning beyond the schema's detailed field descriptions (e.g., absolute path format, caption max length). No extra semantic value is provided.

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 action, 'Publish a photo to the feed,' with a clear verb and target resource. It intuitively differentiates from sibling tools like upload_video, upload_reel, and upload_story by naming 'photo' and 'feed.'

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 usage context by specifying the feed and photo type, but does not explicitly state when to use this tool versus alternatives (e.g., upload_story or upload_reel). No exclusions or named alternatives are provided, leaving usage guidance implicit rather than explicit.

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

instagram_upload_reelA

Publish a reel.

Expects vertical 9:16 video. Requires INSTAGRAM_ALLOW_WRITES=true.

Args: path: The MP4 to publish as a reel. caption: The caption to publish with it. thumbnail: Optional cover image.

Returns: posted (bool) and media: media_id, code, url, type, taken_at, caption.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path to a vertical MP4, e.g. 'C:/videos/reel.mp4'.
captionNoCaption text, hashtags included.
thumbnailNoOptional cover image path. Instagram picks a frame if omitted.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations: it specifies the video format (vertical 9:16), the prerequisite environment variable, and the fact that thumbnail is optional. This complements readOnlyHint=false and openWorldHint=true without contradicting them. It does not mention failure behavior or side effects, but annotations cover the basic write nature.

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?

The description is extremely concise and well-organized: it leads with the purpose, then lists requirements, parameters, and return values. Every sentence is informative and there is no fluff. It is appropriately front-loaded and easy to scan.

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?

The description covers the core aspects needed to call the tool: purpose, input format, environment variable, parameters, and return structure. Given that an output schema exists and annotations are present, this is adequately complete. It does not mention rate limits or error handling, but for a publish action with clear inputs and outputs, this is sufficient.

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 all parameters are already well-documented. The description's parameter list is a concise summary but adds no new information beyond the schema. The schema provides more detail (absolute path, max length for caption, behavior when thumbnail omitted), so the description meets the baseline but does not exceed it.

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 clearly states the verb 'publish' and the resource 'reel', and explicitly mentions the vertical 9:16 format requirement, which distinguishes it from other upload tools. This is specific and understandable in isolation.

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 provides clear context for when to use this tool (publishing a reel, expects vertical video) and even mentions the required environment variable INSTAGRAM_ALLOW_WRITES=true. However, it does not explicitly contrast with sibling upload tools (upload_photo, upload_video, etc.), so the guidance is clear but not fully exclusionary.

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

instagram_upload_storyA

Publish a photo or video to your story, where it lasts 24 hours.

The file type is detected from its extension. Requires INSTAGRAM_ALLOW_WRITES=true.

Args: path: The image or video to publish. caption: Optional caption stored with the story.

Returns: posted (bool) and story: story_id, type, taken_at, author.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path to an image or MP4, e.g. 'C:/photos/story.jpg'.
captionNoOptional caption stored with the story.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish it as a write operation (readOnlyHint=false) and non-destructive. The description adds value by disclosing the INSTAGRAM_ALLOW_WRITES=true prerequisite and the extension-based file type detection. No contradictions with annotations exist.

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 description is concise and well-structured, with a clear purpose statement, a note on requirements, and an Args/Returns section that is easy to scan. It is not overly verbose, though the Args section partially duplicates the schema.

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 only two parameters both documented, the description includes the return structure (posted bool and story details) and the environment variable requirement. For a tool of this simplicity, it covers the essential context an agent needs, leaving little ambiguity.

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 the schema fully documents both parameters. The description reiterates them with minor additions like 'The file type is detected from its extension,' which slightly extends the path guidance, but it does not fundamentally enrich the parameter understanding beyond 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 description clearly states the action ('Publish a photo or video to your story') and the resource (story), and adds the 24-hour duration to reinforce the story context. It unambiguously distinguishes this from feed/reel uploads, even without naming alternatives.

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 this tool is for stories by saying 'to your story,' but it never explicitly mentions alternatives or when not to use it. Given many sibling upload tools (photo, video, reel, album), an agent would benefit from explicit routing guidance. The only conditional stated is the INSTAGRAM_ALLOW_WRITES requirement, which is not comparative.

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

instagram_upload_videoA

Publish a video to the feed.

For vertical short-form content use instagram_upload_reel instead - reels get different distribution. Requires INSTAGRAM_ALLOW_WRITES=true.

Args: path: The MP4 to publish. caption: The caption to publish with it. thumbnail: Optional cover image.

Returns: posted (bool) and media: media_id, code, url, type, taken_at, caption.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path to an MP4 on this machine, e.g. 'C:/videos/clip.mp4'.
captionNoCaption text, hashtags included.
thumbnailNoOptional cover image path. Instagram picks a frame if omitted.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Beyond the annotations (which only mark it as a non-read-only, non-destructive operation), the description discloses the write permission requirement and describes the return values (posted bool and media details). This adds valuable context without contradicting 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?

The description is well-structured: a one-line purpose, a routing note, a requirement, and clear Args/Returns sections. It is front-loaded with the most important information and avoids unnecessary verbosity, though the Args section is somewhat redundant with the schema.

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?

It covers the essential aspects: purpose, differentiation from reel, the write requirement, and the return shape. The presence of an output schema presumably details the return structure further, but the description is sufficient for an agent to invoke the tool correctly in most scenarios.

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?

The schema already provides 100% coverage for all parameters with detailed descriptions (e.g., path includes an example, thumbnail explains fallback). The description's Args section merely restates the parameter names and brief types, adding no new semantic information beyond 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 description opens with 'Publish a video to the feed,' a specific verb-resource-target statement. It also explicitly names instagram_upload_reel as the alternative for vertical short-form, clearly distinguishing this tool from a key sibling.

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 an explicit 'when not to use' by instructing to use instagram_upload_reel for vertical short-form content, and it states a required environment flag (INSTAGRAM_ALLOW_WRITES=true). This provides clear context for when this tool is appropriate versus alternatives.

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. 49 tool updatesv0.1.0
    • First observedinstagram_account_about
    • First observedinstagram_account_info
    • First observedinstagram_build_style_profile
    • First observedinstagram_comment_media
    • First observedinstagram_delete_media
    • First observedinstagram_download_media
    • First observedinstagram_find_person
    • First observedinstagram_follow_user
    • First observedinstagram_get_direct_thread
    • First observedinstagram_get_followers
    • First observedinstagram_get_following
    • First observedinstagram_get_hashtag_info
    • First observedinstagram_get_hashtag_medias
    • First observedinstagram_get_location_medias
    • First observedinstagram_get_media
    • First observedinstagram_get_media_comments
    • First observedinstagram_get_media_likers
    • First observedinstagram_get_style_profile
    • First observedinstagram_get_timeline_feed
    • First observedinstagram_get_user
    • First observedinstagram_get_user_medias
    • First observedinstagram_get_user_stories
    • First observedinstagram_like_media
    • First observedinstagram_list_direct_threads
    • First observedinstagram_login
    • First observedinstagram_login_status
    • First observedinstagram_prepare_dm
    • First observedinstagram_search_enrich
    • First observedinstagram_search_expand
    • First observedinstagram_search_gate
    • First observedinstagram_search_judge
    • First observedinstagram_search_list
    • First observedinstagram_search_locations
    • First observedinstagram_search_posts
    • First observedinstagram_search_recall
    • First observedinstagram_search_results
    • First observedinstagram_search_shortlist
    • First observedinstagram_search_signals
    • First observedinstagram_search_start
    • First observedinstagram_search_users
    • First observedinstagram_send_direct_message
    • First observedinstagram_similar_accounts
    • First observedinstagram_unfollow_user
    • First observedinstagram_unlike_media
    • First observedinstagram_upload_album
    • First observedinstagram_upload_photo
    • First observedinstagram_upload_reel
    • First observedinstagram_upload_story
    • First observedinstagram_upload_video

TDQS

A3.9/5.0

Scored across 49 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but there is some overlap between instagram_search_posts and instagram_get_hashtag_medias (both return posts) and between instagram_find_person and instagram_search_users (both find users). The descriptions clarify the intended use cases, so ambiguity is limited.

Naming Consistency5/5

All tools follow a consistent 'instagram_' prefix with a verb_noun pattern (e.g., instagram_get_user_medias, instagram_upload_photo, instagram_search_recall). This makes the API predictable and easy to navigate, with no mixed conventions or vague verbs.

Tool Count2/5

At 49 tools, this exceeds the '25+' threshold for too many. While the server covers a wide range of Instagram features, including a complex persona search pipeline, the sheer number makes the surface overwhelming and likely to cause selection fatigue for agents.

Completeness4/5

The tool set covers the core lifecycle well: retrieval (users, media, stories, comments, likes, hashtags, locations), engagement (like/unlike, comment, follow/unfollow, direct messages), publishing (photo, video, reel, album, story, delete), and account management. Minor gaps exist (e.g., no ability to edit an existing post or delete a comment), but they are not critical for most workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers