Skip to main content
Glama
navidmoazzez

Threads MCP

by navidmoazzez

Threads MCP

npm License YouTube X LinkedIn

Give any AI agent full control of your Threads profile. Threads has its own API, separate from Instagram's, so it needs its own token.

One Meta app can carry both, with one app id and one testers list.

Publishing and deleting ask for confirmation. Everything else is a read.

30 tools. One command to authorise, and the 60-day token refreshes itself from then on.

Built and maintained by Navid Moazzez.

You: what did people actually reply to me about this week, and what needs an answer?

Claude: Reading every reply across your posts for the last 7 days. 168 replies,
        four worth your time.

  1. Three people asking the same thing on Tuesday's post: whether the
     workflow survives a token expiring. It does; nobody has said so.
     That is a post, not three replies.
  2. One substantive disagreement on the carousel, from someone with
     40k followers. They are half right. Draft below.
  3. Two support questions you can answer in a line each.
  4. Everything else is praise or noise.

  Also: your Tuesday post has 4.1% engagement against 22k views, which is
  triple your median. It opened with a number instead of a question.

Contents

Section

1

What you can ask it

Real prompts, not features

2

Install

Every client, copy and paste

3

Connect your account

The Meta app, in about ten minutes

4

Tools

All 30, with arguments

5

Writing safely

Why posting asks twice

6

Writing posts

Limits, media, threads, carousels

7

Reading posts

The output format, and why

8

Several profiles

Personal and brand, one server

9

Tokens

The 60-day clock, and how it is kept alive

10

How it works

Architecture

11

Your data

What is stored and where

12

Risks

Read this before you install

13

Troubleshooting

When something breaks

Related MCP server: Enterprise Threads MCP Server

1. What you can ask it

  • Post this, and put the link in a card rather than as bare text.

  • Turn these notes into a thread. Show me the draft first, then stage part one so I can see it before anything is public.

  • Which of my posts this month actually worked, ranked by engagement against views rather than raw likes?

  • Read every reply I got today and tell me which ones deserve an answer.

  • Publish these six screenshots as a carousel with alt text on each.

  • Hide that reply, and everything nested under it.

  • How much of today's posting quota have I used?

  • Where are my followers, by country?

  • Search for what people are saying about this launch, ranked by engagement.

  • Restrict this post to the UK and Sweden.

The third one is the point. Threads reports views alongside likes, replies, reposts and quotes, so engagement can be measured against reach instead of against nothing. Ranked by raw likes, your best post is usually just your oldest.

2. Install

Node 20 or newer. Nothing else.

Not released to npm yet. The npx commands below work once v1.0.0 is published. Until then, install from source with section 14 and point your client at node /path/to/threads-mcp/dist/index.js.

Authorise first, in a terminal:

export THREADS_APP_ID=...        # from your Meta app
export THREADS_APP_SECRET=...
npx -y @thenavidm/threads-mcp login

That stores a 60-day token at ~/.threads-mcp/tokens.json, and every client below picks it up with no credentials in its config at all. Section 3 covers where the app id and secret come from.

Claude Code

claude mcp add threads -- npx -y @thenavidm/threads-mcp

Claude Desktop

1. Open the config file.

In Claude Desktop, go to Settings, then Developer, then click Edit Config. That reveals claude_desktop_config.json in your file manager. Open it in any text editor.

If you would rather go straight there:

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

Linux

~/.config/Claude/claude_desktop_config.json

On macOS you can open it from a terminal with:

open -e ~/Library/Application\ Support/Claude/claude_desktop_config.json

2. Add the server.

If the file is empty or does not exist, paste this whole thing in:

{
  "mcpServers": {
    "threads": {
      "command": "npx",
      "args": ["-y", "@thenavidm/threads-mcp"]
    }
  }
}

If you already have other servers, add only the "threads": { ... } part inside your existing "mcpServers", and put a comma after the entry before it. The file has to stay valid JSON. A single missing comma or a trailing one stops every server from loading, not just this one.

No credentials go in this file, because login already stored the token. If you would rather keep it here instead, add an env block with THREADS_ACCESS_TOKEN, and read section 9 first: a token in a config file cannot be refreshed by anything, so it dies on day 60.

3. Restart properly.

Quit Claude Desktop completely and reopen it. On macOS closing the window is not enough, use Cmd+Q. On Windows quit it from the system tray. Claude only reads that file at startup.

4. Check it worked.

Look for the tools icon in the message box and click it. You should see threads with its tools listed. Then ask it something from section 1.

If nothing appears, Claude Desktop's own log is the fastest way in:

macOS

~/Library/Logs/Claude/mcp-server-threads.log

Windows

%APPDATA%\Claude\logs\mcp-server-threads.log

tail -n 50 ~/Library/Logs/Claude/mcp-server-threads.log

Two things account for most failures. Node is not installed, or not on the PATH that Claude Desktop sees, in which case use the full path to node as the command. Or the JSON is malformed, which you can check by pasting the file into any JSON validator.

Cursor

Create ~/.cursor/mcp.json for every project, or .cursor/mcp.json inside a single project. Use the same JSON as Claude Desktop. Then reload the window, or open Settings, MCP, and toggle the server.

Windsurf

~/.codeium/windsurf/mcp_config.json, same JSON, then reload.

VS Code

.vscode/mcp.json in a project, or run MCP: Add Server from the command palette.

Everything else

Zed, Cline, Continue and anything else that speaks MCP over stdio all work. They each keep their config somewhere different, but they all want the same things: the command, the args, and optionally the env.

Docker

The token store has to be mounted, or the container authorises into a filesystem that disappears:

docker build -t threads-mcp .
docker run --rm -i \
  -v ~/.threads-mcp:/home/node/.threads-mcp \
  threads-mcp

Self-hosting over HTTP

For a machine that is always on, which is also the most reliable way to keep a token alive:

THREADS_HTTP_PORT=8787 \
THREADS_HTTP_TOKEN=$(openssl rand -hex 32) \
threads-mcp --http

Binds 127.0.0.1 by default. A Threads token can post as you, so put it behind a reverse proxy with TLS before you change THREADS_HTTP_HOST, and set THREADS_HTTP_TOKEN so the endpoint is not open. GET /health returns the tool count, the account count and each token's remaining days without authentication.

Check it worked

npx -y @thenavidm/threads-mcp doctor

It checks the network, then each token, then probes every capability separately: publishing, replies, insights, keyword search, profile discovery, geo-gating. Each one reports granted, missing, or missing with the exact scope to add.

3. Connect your account

Threads has no app passwords. Every credential is an OAuth token minted against a Meta app you own, which is a real setup step, so here it is in full. It takes about ten minutes once.

Create the app

TIP

One app covers Facebook, Instagram and Threads.

Use cases are ticked in a list, and you can tick several. If you plan to use more than one of these, do it now rather than making three apps and managing three sets of credentials.

Use case

For

Server

Manage everything on your Page

Facebook Pages

facebook-mcp

Manage messaging and content on Instagram

Instagram

instagram-mcp

Access Threads API

Threads

this one

Incompatible combinations grey out. If an option will not tick, it conflicts with something already selected.

  1. Go to developers.facebook.com/apps and Create App.

  2. Choose the Threads API use case.

  3. In the app, open Threads API, then Settings. Copy the Threads App ID and Threads App Secret.

  4. Under Redirect Callback URLs, add:

    http://127.0.0.1:8788/callback

    That is the loopback address login listens on. It never leaves your machine. If port 8788 is taken, use login --port=9000 and add the matching URL instead.

  5. Under Roles, add yourself as a Threads Tester, then accept the invitation from your Threads profile at Settings, Website permissions, Invites.

Step 5 is the one people miss. Without it, every call comes back empty and nothing explains why.

Authorise

export THREADS_APP_ID=1234567890
export THREADS_APP_SECRET=abc123...
threads-mcp login

That opens the authorisation page, catches the redirect, exchanges the code, exchanges the short-lived token for a 60-day one, verifies it against your profile, and writes it to ~/.threads-mcp/tokens.json at mode 0600.

For the permissions that need App Review, once you have them:

threads-mcp login --all-scopes

If the browser cannot open, threads-mcp login --manual prints the URL and takes a pasted token instead.

The scopes

login requests these by default, and they work for you as a tester on your own app with no review at all:

Scope

What it unlocks

threads_basic

Everything. Required for any call

threads_content_publish

Posting, threads, carousels, quotes, reposts

threads_manage_replies

Hiding replies, reply approvals

threads_read_replies

Reading replies and conversations

threads_manage_insights

Post and profile metrics, follower demographics

threads_delete

Deleting your own posts

These three need App Review, and --all-scopes requests them:

Scope

What it unlocks

threads_keyword_search

Searching posts other than your own

threads_profile_discovery

Looking up other public profiles

threads_location_tagging

Tagging posts with a location

A missing scope usually shows up as an empty result rather than an error. threads_keyword_search is the worst of them: without it, Meta does not refuse a search, it quietly narrows it to your own posts. search_keyword notices when every result is yours and says so, and doctor probes for it directly.

Pasting a token instead

You can skip login and set THREADS_ACCESS_TOKEN to a long-lived token you already have. Everything works, with one consequence: the server has nowhere to write a refreshed token, so it cannot keep that one alive. See section 9.

Tokens from Meta's Graph API Explorer are short-lived and stop working in an hour. That is the single most common reason a Threads setup "randomly breaks".

4. Tools

30 tools. Every one takes an optional account; every listing tool takes limit and cursor. Anywhere a post is named, it is the numeric id, which every read tool returns.

Accounts

Tool

What it does

list_accounts

Every connected profile, which one acts by default, and days left on each token

whoami

Authenticate and return the live profile. Use this to confirm credentials

get_publishing_limit

How much of today's posting, reply and delete quota is spent

refresh_token

Extend this profile's token by another 60 days

Posting

Tool

Arguments

create_post

text, image_url, video_url, alt_text, link_attachment, topic_tag, reply_to_id, quote_post_id, reply_control, allowlisted_country_codes, enable_reply_approvals, confirm

create_thread

posts[], image_url, video_url, alt_text, link_attachment, topic_tag, reply_to_id, reply_control, confirm

create_carousel

items[], text, topic_tag, reply_control, confirm

stage_post

Everything create_post takes, minus confirm. Builds a container, publishes nothing

publish_staged

container_id, confirm

get_container_status

container_id

quote_post

text, quoted_post_id, confirm

repost

id, confirm

delete_post

id, confirm

Replies

Tool

Arguments

reply_to

id, text, image_url, video_url, alt_text, confirm

get_replies

id, reverse, limit, cursor

get_conversation

id, reverse, limit, cursor

get_all_replies

since_hours, limit, cursor

hide_reply

reply_id, hide

get_pending_replies

limit, cursor

manage_pending_reply

reply_id, action, confirm

Threads exposes three different reply views and they are not interchangeable. get_replies is one level deep under one post. get_conversation is the whole tree under one of your posts. get_all_replies is every reply you have received across every post, which is the one you want when the question is "what needs answering".

Reading

Tool

Arguments

get_posts

since_hours, since, until, limit, cursor

get_post

id

since_hours reads a time window rather than a count: since_hours: 168 pages until it reaches a week back.

Insights

Tool

Arguments

get_post_insights

id

get_account_insights

since, until, metrics[]

get_follower_demographics

breakdown (country, city, age, gender)

get_top_posts

sample, sort_by

get_top_posts is the one that does not map to an endpoint. It fetches recent posts, pulls metrics for each, and ranks by engagement against views. That costs one request per post, so the sample is capped at 50 and the result says what it scored.

Profile insights only go back to 13 April 2024, and are unreliable before 1 June 2024. Earlier windows return nothing rather than an error.

Search and discovery

Tool

Arguments

search_keyword

q, search_type, media_type, since, until, limit, cursor

search_topic_tag

tag, search_type, limit, cursor

lookup_profile

username

list_allowlisted_countries

none

Resources and prompts

Three resources, threads://accounts, threads://concepts, threads://output-format, so a client can load context without spending a tool call.

Three prompts: triage-replies, draft-thread, what-worked.

5. Writing safely

A post is public the instant it lands. Threads has no edit endpoint, so correcting a typo means deleting and republishing, which loses that post's replies, likes and reposts, and spends one of the hundred deletions the account gets each day. There is no unsend and no revision history.

So nine tools refuse to run without confirm: true:

create_post, create_thread, create_carousel, publish_staged, quote_post, repost, reply_to, manage_pending_reply, delete_post.

The model has to set it deliberately, after reading a description that says why. That is a speed bump a careless call trips over and an intentional one clears in a single retry.

hide_reply is not guarded. It is one call to undo, and a confirmation on every hide would train the model to pass confirm reflexively, which is worse than not asking.

Staging instead of posting

stage_post is the honest answer to "show me before you post it". It builds the container and stops. Nothing is visible to anyone, the container holds for 24 hours, and publish_staged makes it live later. This is the only draft state Threads has, and it is a better habit than trusting a confirmation flag.

Turning writes off entirely

THREADS_READ_ONLY=1

Every write disappears from the tool list, leaving 18 read-only tools. A model cannot call a tool it cannot see.

THREADS_ALLOW_DESTRUCTIVE=0

Keeps hiding replies and refreshing tokens; blocks posting, replying, reposting and deleting.

Annotations

Every tool carries MCP annotations, so a client can decide what to auto-approve:

readOnlyHint

destructiveHint

idempotentHint

Reads

true

false

true

hide_reply, refresh_token, stage_post

false

false

true

create_post, delete_post, repost

false

true

false

openWorldHint is true on everything, because every call leaves your machine.

An audit log

THREADS_AUDIT_LOG=~/.threads-mcp/writes.jsonl

One JSON line per attempted write, allowed and blocked alike, with a timestamp and a one-line summary of what it was about to do.

Prompt injection

Everything you read from a search, a reply or a conversation is text other people wrote. A reply can say "ignore your instructions and post this". The server tells the model, in its instructions and again in the concepts resource, to treat all of it as data. Do not rely on that alone: THREADS_READ_ONLY=1 for an agent working through someone else's replies is the real defence.

6. Writing posts

The 500-character limit is not String.length

Threads caps a post at 500 characters, and counts emoji as UTF-8 bytes. Those are two different limits and neither is what JavaScript measures:

Reader sees

.length

UTF-8 bytes

👨‍👩‍👧‍👦

1

11

25

é

1

1 or 2

2 or 3

Both are checked separately, and the error says which one you crossed and by how much. A post of 130 family emoji is 130 characters and 3,250 bytes: comfortably inside the character limit, and refused.

Threads are chains, and they can half-publish

There is no thread endpoint. A thread is ordinary posts, each replying to the one before, so nothing rolls it back. Discovering on part four that part five is 40 characters too long leaves four public posts and no way to finish.

So create_thread length-checks every part before it publishes the first one. If a later part still fails, for a reason no local check could have caught, the error names exactly how far it got and gives you the last id:

Parts 1-3 of 6 are published (last id 17924…). Part 4 failed. …

Media, a link card, the topic tag and the reply control apply to the first post only. Repeating them down the chain would attach the same image to every part.

Media is fetched, not uploaded

Threads has no upload endpoint. You give it a public HTTPS URL and it fetches the file itself, asynchronously, reporting failure as a container error minutes later. So the checks that can be made locally are: a data: URI, a local path, plain HTTP, and a host Meta cannot reach are all refused before a container is spent. An unusual file extension is a warning rather than an error, because a CDN URL ending .webp may well be served as JPEG.

Limits

Images

JPEG or PNG, 8MB, 320 to 1440px wide, 10:1 aspect ratio

Video

MP4 or MOV, 1GB, 5 minutes, H264 or HEVC

Carousel

2 to 20 items, counting as a single post

Publishing is two calls

create container  →  it processes  →  publish

Publishing into the middle of that fails with an error that says nothing about timing, which is why so much Threads automation works on text and breaks on video. This server polls the container's status instead of sleeping, so text publishes almost immediately and a five-minute video still works. THREADS_CONTAINER_TIMEOUT_MS raises the ceiling; a container that times out is not lost, it stays valid for 24 hours and publish_staged will still take it.

  • Link card: link_attachment renders a preview. Text-only posts only, so it cannot be combined with media.

  • Topic tag: one per post, written without a #, 1 to 50 characters, no periods or ampersands. A leading # is stripped rather than refused.

  • Quote: quote_post_id, or the quote_post tool.

  • Links in text: at most five distinct URLs, which is a warning rather than a refusal.

Who can reply

reply_control on create_post and create_thread:

Value

Who can reply

everyone

anyone (the default)

accounts_you_follow

only accounts you follow

followers_only

only accounts that follow you

mentioned_only

only accounts named in the post

parent_post_author_only

only the author of the post being replied to

enable_reply_approvals: true holds replies for approval instead. They stay invisible until you approve them; read the queue with get_pending_replies.

Geo-gating

allowlisted_country_codes: ["GB", "SE"] restricts a post to those countries. Meta enables this per profile and there is no way to request it through the API. whoami reports whether the profile is eligible, and list_allowlisted_countries returns what it may use.

7. Reading posts

Listings come back as tagged text rather than Graph API JSON, roughly a tenth the size, with the text where a model expects it.

<posts count="2" account="thenavidm" cursor="…">
  <post id="17924…" type="standalone" url="https://www.threads.com/@thenavidm/post/C…"
        author="thenavidm" posted_at="2026-08-31T09:14:02.000Z" topic_tag="buildinpublic">
    <content>
The post text, exactly as published.
    </content>
    <media type="image" url="https://…" alt="…" />
    <engagement>1204 views, 38 likes, 4 replies</engagement>
  </post>

  <post id="17925…" type="reply" replied_to="17924…" hidden="HIDDEN">…</post>
</posts>
  • posted_at is always ISO-8601 UTC. Threads answers with a +0000 offset format, normalized here so two timestamps compare.

  • type is one or more of standalone, reply, quote, repost.

  • replied_to and root_post carry thread structure without reordering the list.

  • A quoted or reposted post nests as <quoted_post> or <reposted_post>, rather than being flattened. A repost with no text of its own is otherwise indistinguishable from an empty post.

  • hidden appears on replies you have hidden, so a gap in a conversation is visible instead of implied.

  • <engagement> appears only where insights were joined on, which is get_top_posts and get_post_insights.

  • cursor on the root element continues the listing.

Post text is reproduced exactly, including its own line breaks. Nothing indents inside <content>.

8. Several profiles

A personal profile and a brand profile, from one server, without restarting anything to switch between them.

Set them up

Run login once per profile, signed in as that profile each time. Both land in the same store and both are refreshed independently.

Or pass them explicitly:

export THREADS_ACCOUNTS='[
  {"access_token":"THQ...","username":"thenavidm"},
  {"access_token":"THQ...","username":"navidmedia"}
]'
export THREADS_DEFAULT_ACCOUNT=thenavidm

In an MCP client config, that goes in env as a single JSON string:

{
  "mcpServers": {
    "threads": {
      "command": "npx",
      "args": ["-y", "@thenavidm/threads-mcp"],
      "env": {
        "THREADS_ACCOUNTS": "[{\"access_token\":\"THQ...\",\"username\":\"thenavidm\"},{\"access_token\":\"THQ...\",\"username\":\"navidmedia\"}]",
        "THREADS_DEFAULT_ACCOUNT": "thenavidm"
      }
    }
  }
}

username and user_id are both optional. Neither is in the token, so the server resolves them from the profile on first use and caches them.

Using them

list_accounts shows what is connected, which one acts by default, and how many days each token has left. Every tool that acts as someone takes an optional account:

create_post(text: "…", account: "navidmedia", confirm: true)

How a name is matched

In order:

  1. Exact username: navidmedia

  2. Numeric profile id, if you pass one

  3. Prefix, when it is unambiguous

Exact beats prefix deliberately. navid is a prefix of navidmedia, so a prefix-first search would hand an unnamed post to the wrong profile whenever both are connected. If nothing matches, the call fails and lists what is connected rather than guessing.

Which profile acts by default

THREADS_DEFAULT_ACCOUNT, falling back to the first account. It accepts a comma-separated list, so you can express a preference order that survives one of them being removed:

export THREADS_DEFAULT_ACCOUNT=thenavidm,navidmedia

9. Tokens

This section is the difference between a setup that keeps working and one that dies in two months.

A Threads long-lived token is valid for 60 days. It can be refreshed for another 60 at any point after it is 24 hours old. Once it expires it is gone: there is no grace period, no recovery, and the only way back is walking the whole OAuth flow again.

So:

Where the token lives

Can this server refresh it?

The store, from threads-mcp login

Yes. Automatically, and written back

THREADS_ACCESS_TOKEN in a config file

No. Nowhere to write the new value

THREADS_ACCOUNTS JSON

No. Same reason

When the token is one the server owns, it refreshes on its own inside the last 20 days of its life, before the request that needed it, and again reactively if Meta says the token expired between the check and the call. THREADS_REFRESH_WINDOW_DAYS moves that window.

The catch is that an MCP server launched over stdio only exists while a client has it open. If nothing runs for 60 days, nothing refreshes. Three ways to avoid that:

  • Leave the MCP client connected. Normal use refreshes it.

  • Run threads-mcp refresh occasionally. A cron entry once a month is plenty.

  • Run it over HTTP on a machine that is always on, which never lets the window close.

list_accounts and doctor both report days remaining, and the server warns on startup when anything is inside a week.

10. How it works

src/
  index.ts              entry: stdio, --http, login, refresh, doctor
  config.ts             credentials, and which profile acts
  server.ts             tools, resources, prompts
  safety.ts             the write guard and MCP annotations
  doctor.ts             setup diagnosis, and `refresh`

  auth/
    login.ts            the OAuth flow on a loopback redirect
    tokens.ts           exchange, refresh, and the 60-day arithmetic
    store.ts            the token file, 0600, written atomically

  api/
    client.ts           Graph calls, retry, throttle, container polling
    errors.ts           one class per failure, each naming its fix
    identity.ts         post ids, container ids, permalinks

  content/
    text.ts             graphemes, UTF-8 bytes, topic tags, escaping
    media.ts            what Threads accepts, checked before a container
    containers.ts       the publish state machine, and chained threads

  format/
    posts.ts            the tagged output format

  tools/
    kit.ts              registration, guarding, pagination
    accounts.ts posts.ts replies.ts read.ts insights.ts discover.ts

Two dependencies: the MCP SDK and zod.

Profile ids. Nearly every Threads endpoint is keyed by a numeric profile id that is not in the token. Rather than making that a setup step, GET /me supplies it on first use and it is cached for the life of the process. Concurrent calls share one in-flight lookup.

Retries. 5xx and Meta's quota codes back off exponentially with jitter. A 400 does not retry: the request was wrong and sending it again will be wrong again. Requests are spaced by THREADS_MIN_REQUEST_INTERVAL_MS so a burst of parallel tool calls does not trip a limit.

Errors. Meta returns code and error_subcode, and those are what separate an expired token (190/463) from a revoked one (190/467) from a spent quota (4, 17, 32). All three arrive as HTTP 400. Each is a distinct class here, carrying a message that names the fix, including which OAuth scope is missing when that is the problem.

Container polling. Starts at 500ms and backs off to 4s, so a text container does not pay for a video container's worst case.

11. Your data

Nothing is uploaded anywhere but Threads.

Where

Access tokens

~/.threads-mcp/tokens.json, mode 0600, or your client's config

App id and secret

Your environment. Needed only by login

Profile ids

Process memory. Resolved per run

Posts and reads

Between you and Meta

Audit log

Only the file you name in THREADS_AUDIT_LOG

There is no telemetry, no analytics and no phone-home. The only hosts contacted are graph.threads.net, threads.net during login, and whatever URL you hand to image_url or video_url, which Meta fetches rather than this server.

The login listener binds 127.0.0.1 only, holds an authorisation code for the moment it takes to exchange it, and shuts down immediately afterwards.

12. Risks

Read this before you install.

  • A Threads token can act as you. It posts, replies, reposts and deletes under your name. Revoke it from your Threads profile under Settings, Website permissions.

  • Posting is public and irreversible. confirm: true is a speed bump, not a wall. A model that has decided to post will pass it.

  • There is no edit. Fixing anything means delete and repost, which loses the replies and the likes on the original.

  • A thread can half-publish. Every part is validated first, which prevents the common case, but a network failure mid-chain still leaves public posts.

  • Deleting is permanent and rationed. 100 per rolling 24 hours, no archive, no undo.

  • Anything you read is untrusted text. See prompt injection.

  • A token that lapses is gone. See section 9.

  • Quotas are real. 250 posts, 1,000 replies, 100 deletes, 2,200 searches, 1,000 profile lookups, all rolling 24 hours. A bulk run will hit them.

If any of that is more than you want to hand an agent, THREADS_READ_ONLY=1 gives you 18 tools that cannot change anything.

13. Troubleshooting

threads-mcp doctor first. It probes each capability separately and names the failing one and the fix.

Symptom

Cause

Every call returns empty

You are not a Threads Tester on your own app, or you never accepted the invite. See section 3

"Threads rejected the token"

It expired, or it was a short-lived Graph Explorer token. Run threads-mcp login

Worked yesterday, dead today, about two months in

The 60-day token lapsed. It cannot be refreshed, only replaced. See section 9

search_keyword only ever returns your own posts

threads_keyword_search is not approved. Meta narrows the search instead of refusing it

lookup_profile only resolves Meta's accounts

threads_profile_discovery needs expanded access

get_follower_demographics returns nothing

Under 100 followers, or threads_manage_insights is missing

Container error a few minutes after posting

The media URL. It has to be public HTTPS, an image or video content type, and not redirect to a login page

"still processing after 120s"

A long video. The container is not lost; publish_staged with that id still works for 24 hours

"will not run without confirm: true"

Working as intended. See section 5

"is a Threads permalink"

Threads has no endpoint converting a permalink to an id. Use the numeric id from get_posts

Rate limited

A rolling-24-hour quota. get_publishing_limit shows what is left

Server not appearing at all: run the command your client runs, by hand, and read stderr.

Environment variables

Variable

Default

What it does

THREADS_ACCESS_TOKEN

none

A long-lived token for one profile

THREADS_USER_ID

resolved

Numeric profile id. Resolved from the token when absent

THREADS_USERNAME

resolved

Username, for matching and display

THREADS_ACCOUNTS

none

JSON array, for several profiles

THREADS_DEFAULT_ACCOUNT

first configured

Which profile acts when a tool names none

THREADS_APP_ID

none

Meta app id. Needed only by login

THREADS_APP_SECRET

none

Meta app secret. Needed only by login

THREADS_TOKEN_STORE

~/.threads-mcp/tokens.json

Where tokens are kept

THREADS_PERSIST_TOKENS

1

Write refreshed tokens back to the store

THREADS_REFRESH_WINDOW_DAYS

20

Refresh this many days before expiry

THREADS_READ_ONLY

0

Hide every write from the tool list

THREADS_ALLOW_DESTRUCTIVE

1

0 blocks posting, replying and deleting

THREADS_AUDIT_LOG

none

Append-only log of every attempted write

THREADS_CONTAINER_TIMEOUT_MS

120000

How long to wait for media to process

THREADS_REQUEST_TIMEOUT_MS

30000

Per-request deadline

THREADS_MIN_REQUEST_INTERVAL_MS

120

Spacing between requests

THREADS_MAX_RETRIES

3

Retries on 5xx and transient errors

THREADS_GRAPH_HOST

https://graph.threads.net

The Graph API host

THREADS_HTTP_PORT

8787

For --http

THREADS_HTTP_HOST

127.0.0.1

For --http

THREADS_HTTP_TOKEN

none

Bearer token required by --http

Versions

See VERSIONS.md.

FAQ ❓

An MCP server is a standard way to give an AI assistant real access to a tool, so it can act rather than guess. You install it once, your assistant gains the tools, and it works in Claude, Cursor, ChatGPT and anything else that speaks the protocol.

Threads is Meta's text-first social app, tied to an Instagram account. Its API is separate from Instagram's, with its own permissions and its own token, so a token that works for Instagram does nothing here.

You need one, and it is free. Threads authorises through Meta's app system, so you tick the Threads use case when creating the app. The same app can carry Instagram as well, with one app id and one testers list, though each product issues its own token.

Your Threads profile is tied to an Instagram account, so yes in that sense. You do not need the Instagram API or its permissions to use this server.

Nothing leaves your machine except calls to Meta. There is no backend here, no account to create and no telemetry. Your token sits in your client's config.

It posts when you ask it to. Publishing and deleting require the model to pass confirm: true, which it sets after reading a description explaining what cannot be undone. Hiding a reply is not guarded, because it is one click to undo.

Setting THREADS_READ_ONLY=1 removes every write tool from the list, so the model cannot see or call them.

A missing OAuth scope and an App Review that has not been granted look identical from a tool call, which is why doctor exists: it probes each capability and names which scope is missing rather than leaving you to guess.

It reads your own profile and its replies. Meta's API does not expose other people's posts the way a public search would, so competitor research is not something this can do honestly.

It costs nothing. The server is MIT licensed and Meta's API is free at the volumes a person generates.

It works with any MCP client. Claude Code, Claude Desktop, Cursor, Windsurf, VS Code, Codex CLI and Gemini CLI all run it the same way.

Long-lived tokens last 60 days and can be refreshed before they lapse. doctor reports how long each one has left, so this is visible before it breaks rather than after.

Remove the app's access from your Threads or Instagram settings, which invalidates the token immediately, then remove the server from your client's config.

Questions

Run into a problem or have a question? Open an issue and I will help.

About the author

Navid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. This Threads MCP server is one piece of that system.

Links

If this is useful, star the repo and come say hi on X.

Dependencies

Library

License

What it does

MCP TypeScript SDK

MIT

The MCP server and transports

zod

MIT

Tool argument schemas and validation

License

MIT. Free to use, modify, and share.

Not affiliated with, endorsed by, or connected to Meta Platforms, Inc.


© 2026 NM Media. Made with ❤️ by Navid Moazzez.

Available Tools

30 tools
create_postPublish a postA
Destructive

Publish one post to Threads: creates the media container, waits for it to finish processing, then publishes. Public the moment it runs, and Threads has no edit endpoint, so this needs confirm: true. For anything over 500 characters use create_thread instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoPost body. 500 characters, and emoji count as UTF-8 bytes.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
confirmNoMust be true for this to run. The result is public immediately or cannot be undone, so it is refused without an explicit confirmation. Threads has no edit endpoint and no unsend.
alt_textNoAlt text for the attached image or video.
image_urlNoPublic HTTPS URL of a JPEG or PNG, 8MB or less. Threads fetches it itself; there is no upload endpoint.
topic_tagNoOne topic tag, without the #. 1-50 characters, no periods or ampersands.
video_urlNoPublic HTTPS URL of an MP4 or MOV, up to 1GB and 5 minutes.
reply_to_idNoNumeric id of the post this replies to.
quote_post_idNoNumeric id of a post to quote.
reply_controlNoWho may reply. Defaults to everyone.
link_attachmentNoA URL to render as a preview card. Text-only posts only; it cannot be combined with media.
enable_reply_approvalsNoHold replies for approval before they appear. Read the queue with get_pending_replies.
allowlisted_country_codesNoRestrict who can see this post to these ISO 3166-1 alpha-2 country codes. Needs a profile Meta has made eligible; whoami reports whether this one is.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already flag destructiveHint, but the description adds critical behavioral context: the post becomes public immediately, Threads has no edit endpoint, and confirm: true is mandatory. It also discloses the wait-then-publish flow, going well 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?

Three sentences, front-loaded with the core action, then critical consequences, then a routing rule. No wasteful prose; every sentence earns its place.

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

Completeness4/5

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

For a 13-parameter publish tool, the description covers the central behavior, irreversibility, confirmation requirement, and the main sibling alternative. The only gap is the lack of any mention of the expected return value or failure behavior, especially given there is no output schema.

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

Parameters3/5

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

Schema description coverage is 100%, and each parameter already has a rich description, so the baseline is 3. The main description adds little per-parameter meaning beyond the schema; it reinforces the 500-char limit and confirm requirement but does not introduce 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 states a specific verb and resource: 'Publish one post to Threads', and explains the internal flow (creates media container, waits, then publishes). It also distinguishes itself from the sibling create_thread by the 500-character rule, so an agent can disambiguate 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?

The description gives an explicit when-to-use ('publish one post') and an explicit when-not-to-use with a named alternative: 'For anything over 500 characters use create_thread instead.' It also communicates the required confirmation flag and irreversibility, which are essential usage conditions.

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

create_threadPublish a chain of postsA
Destructive

Publish several posts as a thread, each replying to the one before. Threads has no thread endpoint: a thread is a chain of ordinary posts, so it can half-publish. Every part is length-checked before the first one goes out, and if a later part still fails the error names exactly how far it got. Public and irreversible, so this needs confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
postsYesThe parts, in order. Each is capped at 500 characters and validated before anything is published.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
confirmNoMust be true for this to run. The result is public immediately or cannot be undone, so it is refused without an explicit confirmation. Threads has no edit endpoint and no unsend.
alt_textNoAlt text for the attached image or video.
image_urlNoPublic HTTPS URL of a JPEG or PNG, 8MB or less. Threads fetches it itself; there is no upload endpoint.
topic_tagNoOne topic tag, without the #. 1-50 characters, no periods or ampersands.
video_urlNoPublic HTTPS URL of an MP4 or MOV, up to 1GB and 5 minutes.
reply_to_idNoStart the thread as a reply to this post, rather than as a new one.
reply_controlNoWho may reply. Defaults to everyone.
link_attachmentNoA URL to render as a preview card. Text-only posts only; it cannot be combined with media.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, but the description adds substantial behavioral detail: the operation can half-publish, all parts are length-checked before the first post goes out, failures name how far publishing got, and the result is public and irreversible. This meaningfully exceeds annotation-only information.

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: three dense sentences, each earning its place. It front-loads the purpose, then covers the critical partial-failure behavior, then the confirmation requirement. No filler 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?

Despite having 10 parameters and no output schema, the description is sufficient for correct invocation. The schema covers all parameter meanings, while the description supplies the critical operational context: partial publishing, validation ordering, failure reporting, and the mandatory confirm flag. Nothing essential for safe invocation 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 already documents every parameter and the confirm requirement. The description mentions 'needs confirm: true' but that only restates the schema. It adds no new parameter-level semantics beyond what the structured 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?

States a specific verb ('publish'), a precise resource ('several posts as a thread'), and the mechanism ('each replying to the one before'). It further clarifies that a thread is just a chain of ordinary posts, distinguishing this from a dedicated thread resource.

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 clearly signals when to use this tool: when publishing multiple posts as a reply chain. It gives useful context about Threads having no thread endpoint, but 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.

delete_postDelete one of your postsA
Destructive

Permanently delete one of your own Threads posts. There is no undo, no archive, and no edit endpoint to reach for instead: replies and likes go with it. Deletions are also capped at 100 per rolling 24 hours. Needs confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNumeric id of the post to delete.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
confirmNoMust be true for this to run. The result is public immediately or cannot be undone, so it is refused without an explicit confirmation. Threads has no edit endpoint and no unsend.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark destructiveHint=true, but the description adds critical behavioral context: permanent deletion, cascade to replies and likes, no archive/undo, a rolling 24-hour cap, and the explicit confirm requirement. This goes well beyond the annotations and fully discloses the consequences.

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?

Four short, front-loaded sentences: the main action first, then consequences, rate cap, and the confirmation requirement. Every sentence adds essential information with zero 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?

Given the destructive nature and absence of an output schema, the description covers all critical invocation concerns: ownership, permanence, cascading effects, rate limit, and confirmation. The agent has enough to call the tool safely and correctly.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already fully documents id, account, and confirm. The description adds no per-parameter details beyond what the schema provides; its extra context is mostly behavioral rather than semantic.

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 ('delete'), a specific resource ('one of your own Threads posts'), and explicitly notes there is no edit endpoint, clarifying its unique role among siblings. It clearly distinguishes itself from read-only and create operations.

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 actionable context: the post must be your own, the deletion is permanent, and confirm must be true. It explicitly rules out undo/archive/edit alternatives, though it does not mention hide_reply as a possible non-destructive alternative for replies.

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

get_account_insightsMetrics for the whole profileA
Read-onlyIdempotent

Profile-level views, likes, replies, reposts, quotes, link clicks and follower count. Data starts on 13 April 2024 and is not reliable before 1 June 2024; earlier windows return nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoISO date or Unix timestamp. Nothing before 2024-04-13 is available.
untilNoISO date or Unix timestamp.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
metricsNoWhich metrics to fetch. Defaults to all of them.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover readOnly, idempotent, non-destructive, and open-world hints, so the safety profile is handled. The description adds a meaningful behavioral caveat: data starts 13 April 2024, is unreliable before 1 June 2024, and earlier windows return nothing. This is genuinely 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?

Two short sentences carry all essential information with no filler. The metric list and profile scope are front-loaded, and the important data-availability caveat is placed second without bloating the description.

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 read-only, idempotent insights tool with a rich schema, the description covers what is returned and the critical temporal limitation. It does not describe the exact return shape, but no output schema exists and the listed metrics give sufficient expectation for an agent.

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 already documents all four parameters thoroughly. The description mostly restates the metrics list and date caveat rather than adding new parameter-level meaning, though it slightly supplements the 'since' parameter with the reliability window.

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 resource (the whole profile) and enumerates the exact metrics returned: views, likes, replies, reposts, quotes, link clicks, and follower count. The phrase 'Profile-level' clearly distinguishes it from the sibling get_post_insights, which targets individual posts.

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 makes it clear this is for profile-level metrics rather than post-level insights, and it gives an explicit time-window constraint. It does not explicitly name alternatives or state when not to use it, but the profile-level framing is strong enough context for selection.

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

get_all_repliesRead every reply across all your postsA
Read-onlyIdempotent

Every reply you have received, newest first, across every post. This is the inbox view: use it to find what needs answering without walking each post one at a time.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many to return, 1-100.
cursorNoContinue from a previous page. Pass the `cursor` attribute from the last result.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
since_hoursNoOnly replies from the last N hours. Filtered after fetching, so pair it with a larger limit.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: newest-first ordering, aggregation across all posts, and the inbox-view framing. It does not mention pagination or filtering behavior, but that is documented in the schema.

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

Conciseness5/5

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

Two focused sentences with no filler. The core scope ('every reply you have received, newest first, across every post') is front-loaded, and the use-case guidance ('inbox view', 'find what needs answering') adds value in the second sentence without redundancy.

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 read-only list tool with fully documented parameters, the description is nearly complete. It conveys scope, ordering, and when to use it. The only minor gap is that it does not describe the response shape or mention the cursor attribute, though the schema's cursor parameter description already implies its presence.

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 four parameters are already documented in the input schema. The tool description adds no parameter-specific meaning beyond what the schema provides, 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 states a specific verb ('read'), resource ('every reply across every post'), and ordering ('newest first'), and explicitly contrasts with the per-post walk by saying 'without walking each post one at a time.' This clearly distinguishes get_all_replies from sibling get_replies.

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 use case: 'use it to find what needs answering.' It implies the alternative of checking posts individually and frames this as the aggregate inbox view, though it does not explicitly name an alternative tool 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.

get_container_statusCheck a staged containerA
Read-onlyIdempotent

The processing status of a container: IN_PROGRESS, FINISHED, ERROR or EXPIRED, with the failure reason when there is one. Useful when a video is taking a long time, or to check whether a staged post is still within its 24-hour window.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
container_idYes

TDQS

A3.8/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description discloses the possible statuses (IN_PROGRESS, FINISHED, ERROR, EXPIRED) and the failure-reason detail. This adds useful behavioral context about what the tool returns 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?

Two sentences, front-loaded with the status enumeration and followed by practical use cases. Every sentence earns its place with no filler or redundant restatement of the tool name.

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 read-only status check with no output schema, the description sufficiently covers output semantics and likely user intents. It could mention that the container_id comes from staging, but the overall context is clear enough for an agent to select and call the tool.

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

Parameters2/5

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

Schema coverage is only 50%: account is documented, but container_id has no schema description. The tool description does not compensate by explaining that container_id identifies the staged container, nor does it mention the account parameter at all. Description adds little to parameter understanding.

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 identifies the tool as a status check for a staged container and enumerates the exact status values returned. It is distinct enough from siblings like get_post or get_posts because 'container' is a staging resource, though the description does not explicitly contrast itself with those alternatives.

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 two concrete use cases: checking a slow video and verifying whether a staged post is still within its 24-hour window. These are clear contextual triggers, but there is no explicit when-not-to-use guidance or named alternative tool.

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

get_conversationRead a whole conversationA
Read-onlyIdempotent

Every reply under one of your posts, including replies to replies, flattened into one list with each reply naming its parent. Only works on posts you own. This is what to read before deciding what deserves an answer.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNumeric id of one of your posts.
limitNoHow many to return, 1-100.
cursorNoContinue from a previous page. Pass the `cursor` attribute from the last result.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
reverseNo

TDQS

A4/5.0
Behavior4/5

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

Beyond the annotations (read-only, idempotent, non-destructive), the description reveals the flattening behavior, the parent-naming format, the recursive scope, and the ownership restriction. This is useful behavioral context, though it does not cover response pagination or error conditions.

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

Conciseness5/5

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

Three sentences, each with distinct value: the core behavior, the ownership constraint, and the practical use case. No filler or repetition.

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

Completeness4/5

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

With no output schema, the description gives a sufficient mental model of the return value (flattened list with parent naming) and the intended decision context. Minor gaps remain around 'reverse', pagination, and how this differs from get_replies/get_all_replies, but these are partially covered by the schema.

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

Parameters3/5

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

Schema description coverage is 80%, so the schema already documents id, limit, cursor, and account. The description adds only that the post must be owned, which the id schema already states. It does not compensate for the undocumented 'reverse' parameter.

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 names a specific resource (a whole conversation under one of your posts) and a concrete behavior (every reply including replies-to-replies, flattened, with each reply naming its parent). It is clear but does not explicitly contrast with sibling tools such as get_replies or get_all_replies, so it stops short of full differentiation.

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 usage context: 'Only works on posts you own' and 'This is what to read before deciding what deserves an answer.' It does not, however, state when to prefer this over get_replies/get_all_replies or give exclusions.

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

get_follower_demographicsWho follows this profileA
Read-onlyIdempotent

Follower breakdown by country, city, age or gender. One dimension per call: Threads refuses more than one breakdown at a time. Needs at least 100 followers, and ignores any date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
breakdownYesWhich dimension to break followers down by. Only one per call.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already mark the tool as read-only and non-destructive. The description adds meaningful behavioral constraints beyond those annotations: Threads rejects multiple breakdowns per call, at least 100 followers are required, and any provided date range is ignored. This is exactly the kind of contextual behavior an agent needs.

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

Conciseness5/5

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

Three short sentences deliver all key facts with no filler. The core purpose is front-loaded, and each additional sentence adds a distinct operational constraint.

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, single-dimension demographic breakdown tool, the description covers what the tool does, the key constraint, the minimum follower threshold, and the date-range caveat. The schema covers parameter details, and no output schema is expected for invocation. 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%, so the schema already documents both parameters. The description's mention of dimensions and the one-per-call rule largely duplicates the schema's enum and description, adding little semantic value beyond what is already structured.

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 what the tool does: provides a follower breakdown by country, city, age, or gender. It is easily distinguished from siblings like get_account_insights and get_post_insights because it is specifically about follower demographics.

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 usage context: one dimension per call, a 100-follower minimum, and that date ranges are ignored. It does not explicitly name alternative tools or state when not to use it, but the constraints are clear and actionable.

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

get_pending_repliesRead the reply approval queueA
Read-onlyIdempotent

Replies waiting for approval on posts published with enable_reply_approvals. They are invisible to everyone until approved. Empty unless reply approvals were switched on for the post.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many to return, 1-100.
cursorNoContinue from a previous page. Pass the `cursor` attribute from the last result.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark this as read-only and idempotent, and the description adds value beyond that by explaining that pending replies are invisible to everyone until approved and that the result set is empty unless reply approvals were enabled. This is useful behavioral context not present in 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 three short sentences with no filler. It front-loads the core meaning with the first sentence and uses the remaining two to clarify important behavioral details.

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 plus well-documented parameters and safe annotations are mostly sufficient. There is no output schema, but the description clarifies what is being returned, so an agent can understand the tool's purpose without needing further detail.

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 describes all three parameters with complete coverage, so the schema carries the parameter-documentation burden. The description adds no additional parameter-specific meaning, which is acceptable but does not exceed 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 clearly identifies the resource: replies waiting for approval on posts with enable_reply_approvals. It also distinguishes itself from sibling tools like get_replies and get_all_replies by noting that pending replies are invisible until approved.

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 clear context for when the tool is relevant: posts published with reply approvals enabled, and notes the queue is empty unless that setting was used. It does not explicitly name alternative tools or state when not to use it, but the context is strong enough for an agent to infer appropriate usage.

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

get_postRead one postA
Read-onlyIdempotent

One Threads post by its numeric id, with its full field set: text, media, permalink, topic tag, link attachment, quoted post and whether it has replies.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNumeric post id.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already convey read-only, idempotent, and non-destructive behavior, so the description does not need to repeat those. It adds value by enumerating the returned fields (text, media, permalink, topic tag, link attachment, quoted post, has_replies), which explains the tool's behavioral output beyond what annotations and schema 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 one sentence, front-loads the core behavior ('One Threads post by its numeric id'), and packs the return-field list efficiently without repetition. Every phrase contributes context.

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-record retrieval tool with rich read-only and idempotent annotations, the description plus schema covers what an agent needs: the id source, the account context, and the expected response fields. The absence of an output schema is mitigated by the explicit field enumeration.

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 describes both parameters (id and account) at 100% coverage, so the schema already carries the parameter documentation. The description only repeats 'numeric id' and does not add new semantic details about the parameters beyond the schema.

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 identifies the resource (a single Threads post) and the selection method (numeric id), and lists the full field set, which distinguishes it from collection-style tools like get_posts. It relies on the title for the verb 'Read', so it is clear but not maximally 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 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 retrieving exactly one post when you already know its numeric id, but it does not explicitly say when to prefer it over siblings like get_posts or get_replies. No alternative guidance or exclusion criteria are provided, so usage is only implied.

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

get_post_insightsMetrics for one postA
Read-onlyIdempotent

Views, likes, replies, reposts, quotes and shares for one of your posts. Reply metrics count direct replies only, not the whole tree underneath.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNumeric post id.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover safety and side effects (readOnlyHint=true, destructiveHint=false, idempotentHint=true), so the bar for added behavioral value is lower. The description adds a non-obvious metric nuance: 'Reply metrics count direct replies only, not the whole tree underneath.' This is genuinely useful behavioral context beyond annotations. It doesn't discuss error cases or output shape, but annotations cover the 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.

Conciseness5/5

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

Two short sentences, both substantive. The first sentence names the exact metrics and scope; the second adds an important definitional caveat. Every word earns its place, and the most important information is front-loaded.

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 read-only metrics tool with robust annotations and a fully described schema, the description is mostly complete: it names all returned metric categories and flags an important counting nuance. There is no output schema, so a bit more detail about return shapes or time ranges would be nice, but the description provides enough for an agent to select and invoke the 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?

Schema description coverage is 100%, so the schema already documents the id and account parameters adequately. The description adds no additional parameter-level detail beyond the overall scope of 'one of your posts.' Baseline 3 is appropriate because the schema carries the burden.

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 identifies the tool as returning metrics—views, likes, replies, reposts, quotes, and shares—for a single post. It conveys the resource and scope, and the metric enumeration makes it easy to distinguish from account-level tools like get_account_insights. However, it doesn't explicitly differentiate itself from get_post or get_posts, so it stops short of full sibling differentiation.

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

Usage Guidelines3/5

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

Usage is implied: it is the tool to call when you need engagement metrics for one of your own posts. But there is no explicit guidance on when to choose it over get_post, get_account_insights, or get_replies, and no mention of alternatives. A clear context is present, but exclusions and alternatives are not.

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

get_postsRead your recent postsA
Read-onlyIdempotent

Your own Threads posts, newest first, with ids and permalinks. The numeric id on each result is what every other tool wants: Threads has no way to convert a permalink back into an id, so this is where ids come from.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many to return, 1-100.
sinceNoISO date or Unix timestamp to start from.
untilNoISO date or Unix timestamp to stop at.
cursorNoContinue from a previous page. Pass the `cursor` attribute from the last result.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
since_hoursNoRead back this many hours, paging as needed, rather than a fixed number of posts.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful behavioral context beyond that: the response is ordered newest-first, contains ids and permalinks, and id/permalinks have an asymmetric relationship across the API. It does not cover pagination or rate limits, but the schema documents pagination parameters.

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

Conciseness5/5

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

Two sentences, front-loaded with resource, scope, and ordering, followed by a substantive note about why the ids matter. Every sentence earns its place and there is no 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 read-only list tool with full schema parameter coverage, the description covers the essentials: whose posts, ordering, key returned fields, and the critical dependency other tools have on the IDs. It does not describe every returned field, but no output schema is present and the description gives enough orientation 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 every parameter already has a description in structured form. The prose adds no parameter-specific detail, so the baseline of 3 is appropriate; the description does not need to compensate.

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 and resource: reading your own Threads posts, not general or public posts. It also specifies the ordering ('newest first') and content ('ids and permalinks'), making it clearly distinct from siblings like get_post, get_top_posts, or search_keyword.

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 context for use: results are the source of numeric IDs that other Threads tools require, and permalinks cannot be converted back to IDs. It does not explicitly name alternative tools or state when not to use it, but the ID-origin framing makes the primary use case obvious.

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

get_publishing_limitCheck the daily publishing quotaA
Read-onlyIdempotent

How much of the rolling 24-hour quota this profile has spent. Threads allows 250 posts, 1,000 replies and 100 deletes per 24 hours, and refuses everything once a quota is gone. Check this before a bulk run rather than discovering it halfway through.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark this as read-only, idempotent, and non-destructive. The description adds useful behavioral context beyond that: the quota is rolling over 24 hours, specific action limits, and that Threads refuses everything once any quota is exhausted. This helps the agent understand why the check matters.

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 information-dense. It front-loads the core semantic, then provides the quota limits and the practical operational recommendation, all in three short sentences with no filler 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 simple read-only tool with one optional parameter and no output schema, the description is complete: it explains the quantity being measured, the platform limits, the consequence of exhaustion, and when to invoke the tool. Nothing essential is missing for an agent to select and 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 single parameter, account, is already fully documented in the schema with a description, default behavior, an example, and a pointer to list_accounts. Schema coverage is 100%, so the description does not need to add parameter-level detail; it adds no new param semantics, making baseline 3 appropriate.

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

Purpose5/5

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

The description clearly states what the tool does: reports how much of the rolling 24-hour publishing quota has been spent. It gives concrete limits for posts, replies, and deletes, making the resource and semantics immediately identifiable and distinct from sibling tools like create_post or get_posts.

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 an explicit usage cue: check before a bulk run rather than discovering the quota is gone halfway through. There is no alternative quota tool among siblings, so the lack of an explicit 'when not to use' is not a significant gap.

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

get_repliesRead direct replies to a postA
Read-onlyIdempotent

The direct replies to one post, one level deep. For the whole tree underneath it, including replies to replies, use get_conversation.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNumeric id of the post.
limitNoHow many to return, 1-100.
cursorNoContinue from a previous page. Pass the `cursor` attribute from the last result.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
reverseNoOldest first. Defaults to newest first.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover read-only, open-world, idempotent, and non-destructive behavior. The description adds the key scoping behavior: this returns only direct replies and does not recurse into nested replies. That is meaningful behavioral context beyond the annotations, though it does not detail pagination or auth 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 two short sentences with no filler. The core behavior is front-loaded, and the sibling differentiator is placed in a single clear follow-up sentence.

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 read-only list operation with thorough schema descriptions and safety annotations, the description is mostly complete. It covers the tool's scope and the key alternative, though it does not describe the output shape and does not contrast with the sibling get_all_replies. These are minor gaps, not blockers.

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?

All five parameters are already described in the schema, including id, limit, cursor, account, and reverse. The description does not add any param-specific meaning beyond what the schema provides, so the baseline of 3 applies.

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

Purpose5/5

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

The title and description clearly state that this tool reads the direct replies to a post, one level deep. It also distinguishes itself from get_conversation by explicitly excluding the full reply tree, so an agent can confidently identify what this tool does and what it does not do.

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 gives explicit routing guidance: use get_replies for direct one-level replies, and use get_conversation for the whole tree including replies to replies. This directly tells the agent when to choose this tool and when to choose a sibling.

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

get_top_postsRank your posts by what actually workedA
Read-onlyIdempotent

Fetch recent posts, pull the metrics for each, and rank them. Sorting by engagement rate rather than raw likes is the point: absolute likes mostly rank posts by age, while engagement against views shows which ones landed. Costs one request per post, so keep the sample modest.

ParametersJSON Schema
NameRequiredDescriptionDefault
sampleNoHow many recent posts to score. Defaults to 20, capped at 50 because each one is a request.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
sort_byNoRanking key. Defaults to engagement_rate.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish readOnly, idempotent, non-destructive behavior. The description adds the important cost trait—one API request per post—along with the insight that absolute likes mostly rank by age, which shapes expected results. 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 three tight sentences with no filler. The core action is front-loaded, the rationale follows, and the cost warning earns its place. Every sentence contributes to correct invocation.

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 workflow, ranking rationale, and request-cost behavior, which is sufficient given that all parameters are optional and fully schema-documented. It does not specify the exact return shape, but 'rank them' plus the sorting explanation makes the output intent clear enough.

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%: sample, account, and sort_by are each documented in the schema itself. The description reinforces the cost tradeoff for sample size but adds no new parameter semantics beyond what the schema already states. 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 states a concrete composite action—fetch recent posts, pull metrics, rank them—and clarifies the ranking methodology (engagement rate vs. raw likes). This clearly differentiates it from raw listing tools like get_posts or get_post_insights.

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 clear context on when this tool is valuable: when the user wants to know which posts 'landed' relative to views, not just which accumulated the most likes. It also warns about cost-per-post and advises a modest sample. It does not explicitly name sibling alternatives or exclusion conditions, but the intended use is clear.

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

hide_replyHide or unhide a replyA
Idempotent

Hide a reply on one of your posts, or unhide one you hid. Hiding a top-level reply cascades to everything nested under it. Reversible in one call, so this does not need a confirmation.

ParametersJSON Schema
NameRequiredDescriptionDefault
hideNoTrue to hide, false to unhide. Defaults to true.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
reply_idYesNumeric id of the reply.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (mutation, idempotent, non-destructive), the description discloses two non-obvious behaviors: hiding a top-level reply cascades to nested replies, and the operation is reversible in one call so no confirmation is needed. This is valuable context that helps an agent predict side effects.

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 twwo concise sentences: the first states the action, the second gives the two critical behavioral caveats. There is no wasted wording or repetition of schema content.

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 three-parameter mutation with rsich annotations, the description covers action, scope, cascade behavior, and reversibility. There is no output schema, but the tool is simple enough that the description is complete without detailing return values.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds general behavioral context around hide and reply_id (cascade, reversibility), but no parameter-specific detail beyond what the schema already 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 states a specific verb ('Hide'/'unhide'), a clear resource ('a reply on one of your posts'), and a distinguishing condition ('Hiding a top-level reply cascades to everything nested under it'). No sibling tool covers this exact action, so 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 gives clear context: this tool is for hiding/unhiding replies on your own posts, with the cascade behavior and reversible one-call nature. It does not name alternatives or exclusions, but no sibling tool is an obvious substitute, so the intended usage is well implied.

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

list_accountsList connected Threads profilesA
Read-onlyIdempotent

Every connected Threads profile, which one acts by default, and how many days each token has left before it expires. Call this first when more than one profile might be connected.

ParametersJSON Schema
NameRequiredDescriptionDefault
fastNoSkip the live profile lookups and return only what is configured locally.

TDQS

A4.2/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, so the safety profile is well covered. The description adds useful behavioral context about what the response will tell the agent (default profile, token expiry days) and positions the tool as a first step in multi-account scenarios. It does not mention the live-lookup behavior implied by the 'fast' parameter, but that is captured in the schema.

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

Conciseness5/5

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

Two sentences, no filler. The first sentence lists what is returned; the second sentence gives a concise invocation directive. Every phrase adds value and the main output is front-loaded.

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 read-only tool with one optional parameter and robust annotations, the description covers the essential return categories and the primary usage scenario. There is no output schema, so a bit more explicit structure (e.g., that it returns an array/object) would be helpful, but the current text is sufficient for a competent 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%: the only parameter, 'fast', is fully explained in the schema ('Skip the live profile lookups and return only what is configured locally'). The tool description adds no additional meaning for the parameter, 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 uses a specific verb ('list') and resource ('connected Threads profiles'), and goes beyond a simple label by enumerating what is returned: the default profile and token expiry in days. This clearly separates it from siblings like whoami (single identity) and lookup_profile (search).

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 an explicit usage trigger: 'Call this first when more than one profile might be connected.' This is a clear context for when to use it, though it does not name alternative tools for the opposite case or explicitly 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.

list_allowlisted_countriesCountries available for geo-gatingA
Read-onlyIdempotent

The country codes this profile may restrict a post to. Geo-gating is only enabled for some profiles; whoami reports whether this one is eligible. Read this before passing allowlisted_country_codes to create_post.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark the tool read-only, idempotent, and non-destructive; the description adds that geo-gating is only enabled for some profiles and that whoami determines eligibility, which is behavior not captured in annotations. It also conveys that the output is a prerequisite for create_post. No contradictions with annotations.

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

Conciseness5/5

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

Two sentences deliver purpose, eligibility caveat, and usage timing with no filler. The first sentence is the core definition, front-loaded before supporting context. Every sentence earns its place.

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

Completeness5/5

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

For a simple read-only list with one optional parameter, no output schema, and rich annotations, the description covers what the tool returns, when to call it, and a related eligibility check. It complements the schema's account parameter guidance with list_accounts. An agent has enough to invoke it correctly in a geo-gating workflow.

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 fully describes the single optional account parameter, including its default and a pointer to list_accounts, so the description does not need to add parameter detail. The description's phrase 'this profile' loosely ties to the account parameter but does not explain its semantics further. With 100% schema coverage, the baseline score 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 returns the country codes a profile may restrict a post to, grounding the 'list' verb in a concrete resource. It references geo-gating and create_post, which distinguishes it from all sibling tools. The title reinforces the domain without ambiguity.

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 instructs to read this before passing allowlisted_country_codes to create_post, giving a clear usage context. It also points to whoami as the way to check geo-gating eligibility, effectively positioning this tool as a follow-up to that check. It lacks an explicit 'when not to use', but the context is sufficient.

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

lookup_profileLook up a public profileA
Read-onlyIdempotent

A public Threads profile by username, with its follower count and seven-day totals for views, likes, quotes and reposts. Only returns public profiles with at least 100 followers, and is capped at 1,000 lookups per rolling 24 hours. Without expanded access this is limited to Meta's own accounts.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
usernameYesThe username, with or without the @. Must match exactly.

TDQS

A4.1/5.0
Behavior4/5

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

Beyond the readOnly/idempotent annotations, the description discloses a rate limit, a minimum-follower filter, and an expanded-access requirement for non-Meta accounts. It does not describe error behavior for missing or non-public profiles, but the annotations and constraints cover the main safety-relevant 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?

Three sentences, each contributing a distinct piece of information: what the tool returns, the public/minimum-follower constraint, and the access/rate limitations. No filler 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?

With no output schema, the description explicitly lists the return fields (follower count and seven-day totals for views, likes, quotes, reposts) and covers limiting conditions. For a simple single-parameter-required lookup, nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters are already fully documented in the input schema. The description only restates the 'by username' lookup theme and adds no new semantics for the account or username parameters.

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 combined title and description make clear this tool looks up a single public Threads profile by username and returns follower count plus seven-day engagement totals. It is differentiated from read siblings by focusing on a profile resource rather than posts or insights, though it does not explicitly name an alternative.

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 clear context for when to use the tool: to fetch a public profile by username with follower and engagement metrics. It also states important access constraints (100+ followers, 1,000-lookup cap, expanded-access limitation), but it does not explicitly say when to prefer a sibling tool instead.

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

manage_pending_replyApprove or ignore a pending replyA
Destructive

Approve a reply waiting in the approval queue, making it public, or ignore it so it stays hidden. Approving is public, so it needs confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesapprove makes it public; ignore leaves it hidden.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
confirmNoMust be true for this to run. The result is public immediately or cannot be undone, so it is refused without an explicit confirmation. Threads has no edit endpoint and no unsend.
reply_idYesNumeric id of the pending reply.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint: true), the description and schema text disclose that approving makes content public immediately, cannot be undone, requires confirm: true, and that Threads has no edit or unsend. This is exactly the behavioral context an agent needs for an irreversible mutation.

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

Conciseness5/5

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

Two sentences, ordered action first and confirmation caveat second. Every sentence adds necessary operational information, with no repetitive 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 mutation tool with no output schema, the description explains outcome, irreversibility, and confirmation enough to call it correctly. A small gap is not pointing to get_pending_replies as the way to obtain pending reply IDs, and the confirm requirement is framed only around approving even though the schema suggests it applies generally.

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 parameters already carry clear meanings in their own descriptions. The tool description adds no param-level detail beyond what the schema provides, meriting the baseline score 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 uses specific verbs ('Approve'/'ignore') with a named resource ('reply waiting in the approval queue') and says what each action does ('making it public'/'stays hidden'). This clearly distinguishes it from sibling tools like get_pending_replies and hide_reply.

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

Usage Guidelines4/5

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

It gives clear context: the tool acts on replies in an approval queue, and the action enum defines the two intended workflows. It does not explicitly name sibling alternatives or say when not to use them, but the scope is unmistakable.

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

publish_stagedPublish a staged containerA
Destructive

Publish a container created by stage_post, waiting for processing first. This is what makes it public, so it needs confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
confirmNoMust be true for this to run. The result is public immediately or cannot be undone, so it is refused without an explicit confirmation. Threads has no edit endpoint and no unsend.
container_idYesThe container id returned by stage_post.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and idempotentHint=false, so the safety profile is covered. The description adds useful behavioral context beyond that: the call waits for processing, makes the container public, and requires explicit confirmation ('confirm: true').

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

Conciseness5/5

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

Two tight sentences deliver the action, source, sequencing, effect, and the critical confirmation requirement. There is no filler and the most important facts are 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?

For a destructive, non-idempotent publish operation, the description together with the schema and annotations covers the prerequisite (stage_post), blocking behavior (waiting for processing), effect (makes public), and required confirmation. Nothing needed 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.

Parameters3/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 even without description support. The description reinforces that container_id comes from stage_post and that confirm must be true, but adds little beyond what the schema already states.

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') on a specific resource ('a container created by stage_post'), and the phrase 'This is what makes it public' clearly distinguishes it from staging and other post-related siblings. An agent can tell exactly 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 gives clear context: use this on containers produced by stage_post, and wait for processing first. It does not explicitly name alternatives or exclusions, but the sequencing and prerequisite are clear enough to guide correct use.

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

quote_postQuote another postA
Destructive

Publish a post that quotes an existing Threads post. Public and irreversible, so this needs confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesYour commentary. 500 characters.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
confirmNoMust be true for this to run. The result is public immediately or cannot be undone, so it is refused without an explicit confirmation. Threads has no edit endpoint and no unsend.
quoted_post_idYesNumeric id of the post being quoted.

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate a destructive, non-idempotent write, so the bar is lower. The description adds valuable specifics: the resulting post is public and irreversible, and an explicit confirm flag is required. This goes beyond the generic destructiveHint and appropriately warns the agent about the consequence of using the tool.

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

Conciseness5/5

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

Two short sentences front-load the purpose and immediately follow with the critical safety condition. There is no filler, redundancy, or irrelevant detail.

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 plus the fully described schema covers the essential invocation facts: required fields, optional account selection, and the confirmation requirement for an irreversible public action. It does not describe the response after publishing, but no output schema exists and the most important safety context is present.

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 detailed descriptions for text, account, confirm, and quoted_post_id, so the baseline is 3. The description's mention of confirm: true restates the schema's requirement rather than adding new parameter 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 clear action ('Publish a post') and a specific resource ('an existing Threads post'), so it is obvious this tool creates a quote rather than an original post or a plain repost. The verb and object distinguish it from siblings like create_post and repost without needing to inspect the schema.

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

Usage Guidelines3/5

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

The description implies this tool is for quoting an existing post, but it does not explicitly say when to prefer it over repost, reply_to, or create_post, nor does it state exclusions. The only guidance beyond purpose is the mandatory confirm: true requirement, which is more parameter usage than tool-selection guidance.

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

refresh_tokenExtend this profile's token by 60 daysA
Idempotent

Refresh the long-lived access token, giving it another 60 days. A Threads token can be refreshed once it is 24 hours old and never after it expires, so an expired one has to be replaced by authorising again. This server refreshes automatically when a token is inside its refresh window; call this to do it now.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark this as non-read-only, non-destructive, and idempotent. The description adds valuable context beyond the annotations: the automatic refresh window, the manual force-now behavior, and the lifetime constraints. It does not specify what happens when the token is outside the refresh window, but the lifecycle guidance largely covers 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?

Three sentences with no filler. The primary action is front-loaded, followed by the crucial lifecycle constraints, and the optional/manual nature of the call is clarified at the end. Every sentence earns its place.

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

Completeness5/5

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

For a single-optional-parameter, no-output-schema tool with rich annotations, this description is complete. It explains what the tool does, when it can be called, when it cannot, and why an agent would call it manually instead of relying on the server's automatic refresh.

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 only parameter, 'account', is fully documented in the schema with type, username example, default behavior, and a pointer to list_accounts. With 100% schema description coverage, the description adds no additional parameter-level meaning, so the baseline score 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 names a specific verb ('Refresh'), the exact resource ('long-lived access token'), and the concrete outcome ('another 60 days'). It clearly distinguishes itself from the sibling tools by focusing on token lifecycle rather than posting, lookup, or account listing.

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

Usage Guidelines5/5

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

It gives explicit validity conditions: a token can be refreshed once it is 24 hours old and never after expiry. It also tells the agent when the tool is unnecessary (because the server auto-refreshes) and what to do for expired tokens (authorise again), which is an effective alternative.

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

reply_toReply to a postA
Destructive

Publish a reply to a Threads post, yours or anyone's. Public the moment it runs and counted against the 1,000-reply daily quota, so it needs confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNumeric id of the post being replied to.
textYesThe reply. 500 characters.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
confirmNoMust be true for this to run. The result is public immediately or cannot be undone, so it is refused without an explicit confirmation. Threads has no edit endpoint and no unsend.
alt_textNo
image_urlNoOptional public HTTPS image URL.
video_urlNoOptional public HTTPS video URL.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description reveals that replies are public immediately, count against a 1,000-reply daily quota, and require confirm:true. The schema further adds that Threads has no edit endpoint and no unsend, giving the agent a clear picture of irreversibility.

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

Conciseness5/5

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

Two concise sentences front-load the action and immediately state the most important behavioral caveats. There is no filler or unnecessary repetition of schema content.

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 captures the essential behavioral constraints and the schema covers the parameters well, so an agent can invoke the tool correctly. It does not describe the response shape or explain how to obtain post IDs, but those are minor gaps given the schema and sibling context.

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

Parameters3/5

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

With 86% schema description coverage, the input schema already documents id, text, account, confirm, image_url, and video_url. The description adds the confirm requirement but no new per-parameter meaning, so it remains at the high-coverage 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 ('Publish'), a specific resource ('a reply to a Threads post'), and scope ('yours or anyone's'). This clearly distinguishes it from create_post, quote_post, and repost without requiring the agent to inspect sibling schemas.

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: use this tool when the goal is to reply to an existing Threads post, not to create a new post or quote/repost. It does not explicitly name alternatives or state when not to use it, so it falls just short of a 5.

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

repostRepost a postA
Destructive

Repost an existing Threads post to your own profile. This is visible to your followers immediately and the API has no un-repost call, so it needs confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNumeric id of the post to repost.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
confirmNoMust be true for this to run. The result is public immediately or cannot be undone, so it is refused without an explicit confirmation. Threads has no edit endpoint and no unsend.

TDQS

A4.3/5.0
Behavior5/5

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

The description adds meaningful behavioral detail beyond the annotations: the repost is immediately visible to followers, the API has no un-repost call, and confirmation is required. This explains why destructiveHint is true and why confirm must be enforced, which is exactly the kind of context an agent needs before invoking a permanent public action.

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

Conciseness5/5

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

The description is two sentences with no filler. The primary action is stated first, and the critical warning about visibility and irreversibility is placed immediately after. Every sentence earns its place and the overall structure 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?

For a simple tool with only one required parameter, a complete input schema, and rich annotations, this description is sufficient. It covers the action, the public consequence, the irreversibility, and the confirmation requirement. No output schema exists, but for this kind of one-shot action the description provides what an agent needs to invoke it 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 descriptions for all three parameters, so the baseline applies. The description does not add meaningful per-parameter meaning beyond saying the post is 'existing'; the confirm behavior is also covered in the schema. It is adequate but does not raise the value above what the schema already provides.

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 identifies the action ('repost') and the resource ('an existing Threads post') plus the destination ('your own profile'), so an agent knows what the tool does. It is more specific than a generic verb and is distinguishable from create_post and delete_post, though it does not explicitly differentiate itself from the sibling quote_post, which is also a repost-like action.

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 clear context: use this when you want to share an existing post to your own profile. It also flags the important constraint that the action is immediately visible and irreversible, which helps an agent decide whether to proceed. It does not name alternative tools like quote_post or list a when-to-use/ when-not-to-use rule, but the implied usage is sufficiently clear.

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

search_keywordSearch public Threads postsA
Read-onlyIdempotent

Search public Threads posts by keyword. Capped at 2,200 queries per rolling 24 hours. Needs the threads_keyword_search permission for anything beyond your own posts.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesThe keyword or phrase to search for.
limitNoHow many to return, 1-100.
sinceNoISO date or Unix timestamp.
untilNoISO date or Unix timestamp.
cursorNoContinue from a previous page. Pass the `cursor` attribute from the last result.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
media_typeNoOnly return posts of this media type.
search_typeNoTOP ranks by engagement, RECENT by time. Defaults to TOP.

TDQS

A3.8/5.0
Behavior4/5

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

The annotations already declare read-only, idempotent, open-world, and non-destructive behavior. The description adds meaningful behavioral constraints beyond those annotations: the 2,200-query rolling limit and the threads_keyword_search permission requirement. No contradiction with annotations.

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

Conciseness5/5

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

Two tightly written sentences. The first front-loads the core action, and the second bundles the quota and permission constraints without filler. Every sentence earns its place.

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

Completeness4/5

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

Covers the essential call context: purpose, quota, and permissions. The schema handles all parameters. However, since there is no output schema, the description does not explain the expected return shape or pagination behavior beyond the cursor parameter's own schema description.

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 input schema already documents all parameters well. The description adds no extra parameter-level meaning beyond the word 'keyword' in the purpose statement, which maps to q. Baseline 3 is appropriate.

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

Purpose4/5

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

States a specific verb, resource, and method: 'Search public Threads posts by keyword.' This is clear and unambiguous. It doesn't explicitly differentiate from the sibling search_topic_tag, but 'keyword' versus 'topic tag' is implied.

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 useful context: a quota cap and a permission requirement. However, it does not explicitly tell the agent when to choose this tool over alternatives like search_topic_tag or get_posts. Usage is implied rather than explicitly guided.

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

search_topic_tagSearch a topic tagA
Read-onlyIdempotent

Public posts carrying a topic tag. Threads topic tags are written without a # and there is one per post, so this is an exact tag match rather than a text search. Shares the 2,200-query daily budget with search_keyword.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesThe topic tag, with or without a leading #.
limitNoHow many to return, 1-100.
cursorNoContinue from a previous page. Pass the `cursor` attribute from the last result.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
search_typeNo

TDQS

A4.4/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, so the safety profile is covered. The description adds genuine behavioral context beyond annotations: results are public-only, matching is exact (one tag per post, no # prefix), and the tool shares a quota with search_keyword. 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?

Three sentences, each earning its place: scope, matching semantics, and budget constraint. The core function is front-loaded in the first sentence, and there is zero filler or repetition of schema content.

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 5-parameter search tool with no output schema, the description covers the important operational aspects: public scope, exact-match behavior, and the shared rate budget. Minor gaps remain — the response shape is not hinted at, and the search_type parameter's TOP vs RECENT distinction is unexplained — but these are secondary for a read-only search operation.

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 description coverage is 80% (4 of 5 parameters documented), which puts the baseline at 3. The description adds real value on top by clarifying tag semantics — exact match, one per post, written without # — which affects how an agent should construct the tag argument. The search_type enum (TOP/RECENT) remains undocumented in both description and schema, a minor gap.

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 identifies the resource precisely (public posts by topic tag) and explicitly differentiates from the most similar sibling, search_keyword, by stating this is an exact tag match rather than a text search. The verb is implied by the name/title but the resource and matching semantics make the tool's function 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 names the alternative tool (search_keyword) and clarifies the boundary between them: exact tag match versus text search, which effectively tells an agent when each tool applies. It also discloses the shared 2,200-query daily budget, an operational constraint affecting tool choice. However, it stops short of an explicit 'use this when / use that instead' statement.

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

stage_postStage a post without publishing itA

Build a media container without publishing. Nothing appears anywhere: the container is invisible, holds for 24 hours, and is published later with publish_staged. This is the only draft state Threads has, and the right way to show a human a post before it goes public. Nothing is public, so no confirmation is needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoPost body. 500 characters, and emoji count as UTF-8 bytes.
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.
alt_textNoAlt text for the attached image or video.
image_urlNoPublic HTTPS URL of a JPEG or PNG, 8MB or less. Threads fetches it itself; there is no upload endpoint.
topic_tagNoOne topic tag, without the #. 1-50 characters, no periods or ampersands.
video_urlNoPublic HTTPS URL of an MP4 or MOV, up to 1GB and 5 minutes.
reply_to_idNoNumeric id of the post this replies to.
quote_post_idNoNumeric id of a post to quote.
reply_controlNoWho may reply. Defaults to everyone.
link_attachmentNoA URL to render as a preview card. Text-only posts only; it cannot be combined with media.
enable_reply_approvalsNoHold replies for approval before they appear. Read the queue with get_pending_replies.
allowlisted_country_codesNoRestrict who can see this post to these ISO 3166-1 alpha-2 country codes. Needs a profile Meta has made eligible; whoami reports whether this one is.

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (openWorldHint true, readOnlyHint false), the description discloses key behaviors: the container is invisible, holds for 24 hours, is published later with publish_staged, and causes no public visibility. This gives an agent a concrete mental model of side effects rather than just generic mutation flags.

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 short and front-loaded with the core purpose. There is slight redundancy between 'Nothing appears anywhere' and 'Nothing is public,' but the rest of the sentences earn their place by explaining the 24-hour hold, the publish_staged relationship, and the human-review use case.

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 12-parameter tool with no output schema, the description covers the crucial workflow: stage, hold for 24h, publish later, nothing is public. It does not spell out the return value, but the term 'container' and the explicitly named publish_staged step make the flow intelligible.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds no parameter-level detail, but it does not need to: the schema already documents constraints like 500-character limit with emoji bytes, public HTTPS URLs, media type limits, and reply_control enum 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 opens with a specific verb and resource: 'Build a media container without publishing.' It clearly distinguishes this from publishing tools by stating nothing appears anywhere and calling it 'the only draft state Threads has,' so an agent can tell it apart from create_post and publish_staged.

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 clear usage context: this is the draft state and 'the right way to show a human a post before it goes public,' and it names publish_staged as the follow-up. It does not explicitly state 'use create_post instead if you want to publish immediately,' so it stops short of full when-not guidance.

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

whoamiVerify the token and show the profileA
Read-onlyIdempotent

Confirm which Threads profile the current token acts as, and return the live profile: username, name, bio, verification, and whether the profile is eligible for geo-gated posts. Use this to check credentials before anything else.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoWhich connected Threads profile to act as, by username (for example 'thenavidm'). Defaults to the first connected profile. Call list_accounts to see them.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds value by revealing that it returns live profile data, specifying fields like username, name, bio, verification, and geo-gated post eligibility. It does not discuss rate limits or auth failure behavior, but that is acceptable for this simple check.

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 two sentences with no filler. Purpose and return fields are front-loaded, and the usage instruction is a concise closing note. Every clause earns its place.

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

Completeness5/5

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

For a zero-required-parameter, read-only identity tool, the description covers what it returns, the token context, and when to call it. Even without an output schema, it explicitly lists the key response fields, so the agent has enough to invoke 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 schema description fully documents the only optional parameter, including default behavior and a pointer to list_accounts. The tool description itself adds no parameter-specific detail, so the baseline of 3 applies given 100% 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 names the specific operation ('confirm which Threads profile the current token acts as') and enumerates the returned fields. It clearly differentiates from the sibling list_accounts by focusing on the active token's identity rather than listing all connected profiles.

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 an explicit usage cue: 'Use this to check credentials before anything else.' It does not name alternatives or when-not conditions, but the context is clear for a read-only identity verification step.

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

TDQS

A4/5.0
Disambiguation5/5

Each tool maps to a distinct Threads API action—publishing, staging, replying, insights, search, or token management—and the descriptions call out exactly where boundaries lie. The reply-related tools in particular are carefully separated by depth, scope, and ownership, so an agent is unlikely to pick the wrong one.

Naming Consistency4/5

The vast majority of tools follow a clear snake_case verb_noun pattern like create_post, get_replies, and hide_reply. The few exceptions—whoami, repost, reply_to—are still readable and do not break the overall predictability.

Tool Count2/5

At 30 tools, this is above the 25+ threshold that makes a toolset feel heavy, even though each tool appears to cover a distinct part of the Threads API. The broad scope explains the count, but it is still more than most agents will need to hold in context at once.

Completeness5/5

The surface covers the Threads content lifecycle completely: staging, publishing, threading, carousels, quoting, replying, reposting, deleting, reply moderation, insights, search, and token refresh. There are no obvious dead ends—the missing edit operation is an API limitation, not a gap in this server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to manage Instagram and Threads accounts — publish content, handle comments, view insights, search hashtags, and manage DMs through the Meta Graph API.
    59
    46
    12
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables posting and managing Threads content via Meta Threads API, including text, image, video, carousel, and replies.
    9
    38
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to publish images and Reels to an Instagram Business account through the Meta Graph API, with tools for uploading media, creating and publishing containers, managing comments, and retrieving insights.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/navidmoazzez/threads-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server