Skip to main content
Glama

threads-mcp

npm license CI GitHub Repo

An MCP server for Meta's Threads that acts as your own account — read profiles, posts, replies, your timeline & search, and post / reply / quote / like / repost / follow / schedule — from any MCP client (Claude Desktop, Claude Code, etc.).

No developer account. Unlike the official Threads Graph API approach (which needs an app, OAuth, and an Instagram Business account), this server drives a real logged-in browser session using your own cookies.

Contents: Rate limits · Tools · Structured output · Media · Scheduling · Setup · Run as a daemon · Config · How it works · When things break · Troubleshooting

Full reference: Documentation · Changelog: CHANGELOG.md · Versioning & releases: docs/RELEASES.md


⚠️ Behave for rate limits

You are automating a real Threads account. Meta rate-limits aggressively and can restrict or ban accounts that behave like bots — bursty posting, rapid follow/unfollow, like loops. This server helps, but the discipline is on you:

  • Writes are spaced ≥ THREADS_MIN_ACTION_INTERVAL_MS (default 8s) apart, enforced server-side.

  • Treat create_thread, follow_user, like_thread as scarce actions, not loops.

  • If you hit a 🐢 rate-limited message, stop for several minutes — don't retry immediately.

  • Reads are cheaper but still hit a real session; results are cached briefly.


Related MCP server: meta-threads-mcp

Tools

24 tools. Posts are identified by a full url or handle + code (the shortcode in .../@user/post/CODE).

Read

Tool

What it returns

whoami

Which account you're signed in as (handle, user id, name, follower/following).

get_profile

A user's bio, follower count, verified status + recent posts. Omit handle for your own.

get_user_threads

A user's recent posts (their profile feed).

get_thread

A single post with its like/reply/repost counts.

get_thread_replies

Replies under a post.

get_timeline

Your "For you" home feed.

search

Search Threads for posts or users.

get_followers

A partial sample of a user's followers.

get_following

A partial sample of who a user follows.

get_notifications

Your Activity feed — follows, replies, mentions, suggestions. Filterable by kind.

Write  (rate-limited — real account)

Tool

Action

create_thread

Post a new thread — text and/or media, optionally a multi-post chain.

reply_to_thread

Reply to a post — text and/or media.

quote_thread

Quote-post (repost with your own comment + optional media).

delete_thread

Delete one of your own posts (permanent).

like_thread / unlike_thread

Like / remove a like.

repost_thread / unrepost_thread

Repost / remove a repost.

follow_user / unfollow_user

Follow / unfollow a user.

Schedule

Tool

Action

schedule_thread

Queue a text/media post to publish later (at ISO time or in duration).

list_scheduled

List scheduled posts and their status.

cancel_scheduled

Cancel a pending scheduled post by id.

Note: reposting your own post is a no-op on Threads (it silently does nothing) — that's Threads' behavior, not a bug.

Tool annotations

Per the MCP annotations spec — side effects at a glance. Write tools act on your real account.

Tool

Read-only

Idempotent

Destructive

whoami, get_profile, get_user_threads, get_thread, get_thread_replies, get_timeline, search, get_followers, get_following, get_notifications, doctor

create_thread, reply_to_thread, quote_thread

like_thread / unlike_thread, repost_thread / unrepost_thread, follow_user / unfollow_user

delete_thread

schedule_thread

list_scheduled

cancel_scheduled

Structured output

Every read tool returns both a rendered text block and machine-readable structuredContent, described by an outputSchema the client can inspect. Text clients are unaffected; anything that understands structured output gets typed fields instead of parsing prose.

This matters for chaining. Recovering a shortcode from rendered markdown works right up until a post's own text contains something shortcode-shaped:

// search → structuredContent
{
  "posts": [
    {
      "code": "DbUd7C8iR7A", // pass straight to like_thread / get_thread
      "url": "https://www.threads.com/@someone/post/DbUd7C8iR7A",
      "author": "someone",
      "text": "…",
      "created_at": "2026-07-28T05:12:44.000Z", // ISO, not a relative "3h"
      "likes": 15,
      "replies": 2,
      "reposts": 0,
      "quotes": 0,
      "media": "image", // none | image | video
      "is_reply": false,
      "quoted": { "author": "other", "text": "…" }, // when it quotes a post
    },
  ],
}

get_profile and get_followers / get_following return profile / users in the same spirit; get_notifications returns notifications with a normalised kind plus Threads' own label.

The shapes are a small surface this project owns — deliberately not Meta's raw payloads, which reshuffle between app builds. Failures set isError and carry no structured content, so a failed call is never mistaken for an empty result.


Media

create_thread, reply_to_thread, quote_thread, and schedule_thread take an optional media array — local file paths and/or http(s) URLs (URLs are downloaded to a temp file first, then cleaned up). Supported: images (jpg/png/webp/avif) and video (mp4/mov/webm). Multiple images post as a carousel. Either text or media is required.

// text + single image
create_thread { "text": "hello", "media": ["/path/to/pic.jpg"] }

// carousel (multiple images, mix local + URL)
create_thread { "text": "trip 🧵", "media": ["a.jpg", "b.jpg", "https://…/c.jpg"] }

// image-only reply
reply_to_thread { "handle": "someone", "code": "ABC123", "media": ["reaction.png"] }

// quote with a comment + image
quote_thread { "url": "https://www.threads.com/@x/post/ABC", "text": "this 👇", "media": ["chart.png"] }

Multi-post threads

create_thread takes an optional chain — extra posts published as one connected thread, the format Threads calls "Add to thread". Posting them separately instead produces unlinked standalone threads.

create_thread {
  "text": "Three things I learned shipping this 🧵",
  "chain": ["1. Meta detects headless.", "2. Cache invalidation is still hard.", "3. Ship it."]
}

On your profile a chain appears as a single entry; the later parts are reachable via get_thread_replies on the first post.


Scheduling

Threads' web UI has no native scheduling (it's a mobile / Meta Business Suite feature), so this server runs its own scheduler: jobs are persisted to ~/.threads-mcp/scheduled.json and a poll loop publishes them when due, through the same code path as create_thread.

// absolute time (local timezone unless you add an offset like +07:00 or Z)
schedule_thread { "text": "launch 🚀", "at": "2026-07-20T09:00" }

// relative delay
schedule_thread { "text": "in a bit", "in": "2h", "media": ["teaser.jpg"] }

list_scheduled {}                 // → ids + status (pending / done / failed / canceled)
cancel_scheduled { "id": "b9ec…" }

The one hard limit

A cookie/browser approach can only post while this server process is running — there's no Threads-side scheduler to hand the job to. So:

  • Short horizons / same session — works while your MCP client keeps the server alive.

  • Past-due jobs — fire on the next startup (better late than never).

  • Long horizons (days out) — run the server as an always-on daemon so it's alive when the job is due.

Local media paths must still exist when the job fires (URLs are re-downloaded at fire time).


Setup

npm install -g @bintangtimurlangit/threads-mcp   # downloads the CloakBrowser binary (~200 MB, cached)

This puts two commands on your PATH: threads-mcp (the server) and threads-mcp-login (one-time login). Or run without installing: npx -y @bintangtimurlangit/threads-mcp.

From source

git clone https://github.com/bintangtimurlangit/threads-mcp.git
cd threads-mcp
npm install          # also downloads the CloakBrowser binary (~200 MB, cached)
npm run build

1. Log in once

threads-mcp-login    # global install — or, from a source checkout:  npm run login

Opens a CloakBrowser window — log into Threads, then press Enter. Saves your session to ~/.threads-mcp/chrome-profile. Re-run only when it expires.

2. Register with your MCP client

The server launches a headed browser, so it needs a display. On a headless machine wrap it with xvfb-run:

{
  "mcpServers": {
    "threads": {
      "command": "xvfb-run",
      "args": ["-a", "threads-mcp"]
    }
  }
}

On a machine with a real display, drop xvfb-run: "command": "threads-mcp", "args": []. From a source checkout, use "command": "node", "args": ["/absolute/path/to/threads-mcp/build/index.js"] (wrapped in xvfb-run on a headless box).


Running as a persistent daemon

For reliable scheduling (and to avoid re-launching the browser each session), run the server always-on under a virtual display. Example with systemd on Linux:

# ~/.config/systemd/user/threads-mcp.service
[Unit]
Description=threads-mcp (Threads MCP server)
After=network-online.target

[Service]
ExecStart=/usr/bin/xvfb-run -a /usr/bin/node /absolute/path/to/threads-mcp/build/index.js
Restart=on-failure
Environment=DEBUG=false

[Install]
WantedBy=default.target
systemctl --user enable --now threads-mcp
loginctl enable-linger "$USER"     # keep it running after logout

Or with pm2: pm2 start "xvfb-run -a node build/index.js" --name threads-mcp.

Signing in without a display

npm run login needs a visible browser, which is the main obstacle to running this anywhere without a desktop — a VPS, a container, CI. The session is only cookies, so move it instead of trying to log in headlessly:

  1. On a machine with a display, sign in to Threads normally.

  2. Open devtools → Application → Cookies → threads.com and copy sessionid and ds_user_id.

  3. On the server:

THREADS_SESSIONID=… THREADS_DS_USER_ID=… npx threads-mcp-import-session
npm run test:live      # confirm it worked

⚠️ A sessionid is a bearer credential for your entire account — whoever holds it is you. Prefer the environment-variable form so it stays out of shell history, never commit it, and revoke it by logging out of Threads if it leaks.

Chromium system libraries

On a fresh server Chromium needs system libraries that are not installed by default. If the browser fails to launch with a missing .so:

npx playwright install-deps chromium
# or, Debian/Ubuntu, without Playwright's helper:
sudo apt-get install -y libnss3 libatk1.0-0 libatk-bridge2.0-0 libcups2 \
  libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
  libgbm1 libasound2 libpango-1.0-0 libcairo2

Why not a Docker image? It would mainly pin those libraries — the one line above. Against that, MCP over stdio means the client owns the process, so a container turns npx threads-mcp into docker run -i with a volume for the profile; and a containerised Chromium on a virtual display has no GPU and reports renderer strings that match no real desktop, which cuts directly against the fingerprint work this server depends on. Running it natively under xvfb is both simpler and less detectable.

Note: MCP over stdio expects the client to own the process. Running a standalone daemon is specifically for the scheduler to survive between client sessions — the scheduled-post queue is shared via ~/.threads-mcp/scheduled.json.


Configuration

All optional — see .env.example, copy to .env to override.

Variable

Default

Purpose

THREADS_DOMAIN

threads.com

Threads domain (threads.net redirects here).

THREADS_PROFILE_DIR

~/.threads-mcp/chrome-profile

Where the saved login lives.

THREADS_HEADLESS

false

Keep false — headless is detected.

THREADS_MIN_ACTION_INTERVAL_MS

8000

Minimum gap between write actions. Raise to be safer.

CACHE_TTL_MS

30000

In-memory read-cache lifetime.

THREADS_LOCK_TIMEOUT_MS

120000

Ceiling on one browser operation; on timeout the page resets.

THREADS_MAX_MEDIA_BYTES

67108864

Largest accepted media file (64 MB).

THREADS_MEDIA_TIMEOUT_MS

60000

Per-download timeout for http(s) media.

DEBUG

false

Log startup, captured GraphQL op names, and scheduler activity to stderr.

State lives under ~/.threads-mcp/: chrome-profile/ (your login) and scheduled.json (the post queue).


How it works

Threads' web app talks to Meta's Relay GraphQL gateway with per-session tokens (fb_dtsg, lsd) and anti-automation fingerprinting. A hand-rolled fetch gets rejected, and operation IDs churn. So this server drives CloakBrowser — a fingerprint-patched Chromium — against a persistent profile you log into once, and:

  • Reads — collects the data the app renders: the server-side JSON embedded in each page's <script> tags, plus every /api/graphql and /graphql/query response (the home feed uses the latter). A defensive walker pulls posts/users out of whatever comes back, so it survives Meta renaming operations.

  • Writes — drive the real composer and action buttons so Meta's own client mints the tokens. Icon buttons are clicked at the DOM level (a humanized pointer click misses them). Replies use the inline composer's Ctrl+Enter; reply-with-media promotes it to the full dialog via "Expand composer".

  • Scheduling — a persisted queue + poll loop, delegating to the same publish path as create_thread.

The browser runs headed (Meta detects headless); on a server use a virtual display (xvfb).


Development

npm run typecheck
npm test             # unit tests (no browser, no login — runs in CI)
npm run test:live    # live READ-only smoke test (needs login + a display)
npm run dev          # tsx watch

DEBUG=true logs every GraphQL operation name the app fires and each scheduler tick — useful if Meta reshuffles a surface and a reader comes back empty.


When things break

Meta ships UI changes without notice. Because writes drive the real interface, a moved button shows up as a vague "couldn't confirm" from whichever tool happened to use it — not as an obvious failure.

Run doctor first. It checks the session and every DOM anchor the write tools depend on, and tells you what each failure breaks:

✅ session — session cookie present
✅ composer-add-to-thread — present
❌ post-repost — NOT FOUND

**Impact:**
- `post-repost` → repost_thread / quote_thread / unrepost_thread

Anchors are declared in src/browser/selectors.ts; update the ones that moved. doctor { "deep": true } also checks a real post page and the activity feed.


Troubleshooting

Symptom

Likely cause / fix

🔒 Not signed in on every tool

No/expired session → run npm run login.

A read returns empty for a public account

Try again (feed/timeline is lazy-loaded); run with DEBUG=true to see the GraphQL ops. Private/blocked accounts yield nothing.

A write says it couldn't find its button

Meta changed the UI, or a promo interstitial got in the way (the server tries to dismiss those). Retry; if persistent, the selector needs updating.

🐢 rate-limited

Stop for several minutes, then slow down.

Scheduled post never fired

The server wasn't running when it was due — see Run as a daemon. It'll fire on next startup.

Headless / server has no display

Wrap the command in xvfb-run -a ….


Caveats

  • Login required. No session → tools return a friendly "run npm run login" prompt.

  • Anti-bot is a moving target. The free CloakBrowser binary can go stale as Meta updates detection; CloakBrowser Pro ships newer patches. Writes rely on UI selectors Meta can change.

  • Reads are resilient to GraphQL renames (they parse whatever the app fetches), but a private/blocked account yields nothing, and just-posted content can be briefly stale on read-back.

  • Scheduling only fires while the server runs (see above).

  • Respect Threads' Terms of Service and the rate-limit guidance above. This is for personal use of your own account, not scraping or automation at scale.

Contributing & security

CONTRIBUTING.md · SECURITY.md · Code of Conduct

License

MIT


Disclaimer

This is an unofficial project. It is not affiliated with, authorized, maintained, sponsored, or endorsed by Meta, Threads, or Instagram.

It works by driving a real logged-in browser session against Threads' web app, which can change without notice — a tool may break when Meta updates its site or anti-bot behavior. It automates your own account and performs only the actions you invoke.

You are responsible for using this software in compliance with Threads' / Meta's Terms of Service and applicable law. Keep request and write volumes reasonable. All product names, logos, and brands are property of their respective owners.

Available Tools

24 tools
cancel_scheduledCancel a scheduled postA
Idempotent

Cancel a pending scheduled post by its id (from schedule_thread / list_scheduled).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe job id to cancel

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already indicate idempotent and non-destructive nature. Description adds the 'cancel' action matching the name, but doesn't disclose further behavioral details 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?

Single sentence, no wasted words, front-loaded with key information.

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 few parameters, no output schema, and clear annotations, the description covers all necessary information for using 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?

With 100% schema description coverage, the description adds minimal value beyond the schema: only mentions 'by its id' while schema already describes the parameter.

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

Purpose5/5

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

The description clearly states the action (cancel), the resource (pending scheduled post), and how to obtain the id (from schedule_thread / list_scheduled), distinguishing it from siblings.

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

Usage Guidelines4/5

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

The description tells when to use the tool (with a scheduled post id) and gives context on obtaining the id, but doesn't explicitly mention 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.

create_threadPost a threadA

Post a new thread to YOUR Threads account — text and/or media (images & video). ⚠️ Real account — use sparingly; the server enforces a minimum gap between writes to avoid rate-limit/automation flags.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoThe post text (max 500 chars). Optional if media is given.
chainNoAdditional posts to publish as one connected thread, in order, after `text`. This is the multi-post format Threads calls "Add to thread" — the parts stay linked. Posting them one at a time instead produces unlinked standalone threads.
mediaNoLocal file paths and/or http(s) URLs to attach. Images (jpg/png/webp/avif) and/or video (mp4/mov/webm). Multiple images post as a carousel. Optional if text is given.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, but the description wisely adds a critical behavioral note: 'Real account — use sparingly; server enforces minimum gap to avoid rate-limit/automation flags.' This goes beyond what annotations provide and helps the agent avoid misuse. No contradiction with annotations.

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

Conciseness5/5

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

The description is two concise sentences with an emoji warning. It front-loads the core purpose and then adds the critical rate-limit caution. No extraneous words.

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

Completeness3/5

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

The description covers the core purpose and a key behavioral warning, but omits details about return values (since there is no output schema). It also does not orient the agent among numerous sibling tools. Given the schema coverage of parameters, it is adequate but not fully complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already explains all parameters (text, chain, media). The description mentions 'text and/or media (images & video)' but does not add meaningful detail beyond the schema. 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 action ('Post'), the resource ('a new thread'), and the target ('YOUR Threads account'). It specifies content types (text and/or media), distinguishing it from sibling tools like 'reply_to_thread' or 'quote_thread' which modify existing threads.

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

Usage Guidelines3/5

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

Usage is implied through the purpose statement, but there is no explicit guidance on when to use this tool versus alternatives (e.g., when to use 'reply_to_thread' instead). The warning about sparing use provides behavioral context but does not compare to siblings.

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

delete_threadDelete a postA
DestructiveIdempotent

Delete one of YOUR OWN Threads posts. Provide the post url, or handle + code. This is permanent.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull post URL (must be your own post)
codeNoPost shortcode (if not using url)
handleNoYour @username (if not using url)

TDQS

A4.2/5.0
Behavior4/5

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

Adds 'permanent' behavior beyond the destructiveHint annotation. Also clarifies ownership constraint (your own posts) not captured by 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 action and constraint. No unnecessary words.

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 ownership constraint, permanence, and parameter alternatives. No output schema needed; return behavior is obvious for a delete operation.

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

Parameters3/5

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

Schema covers all three parameters with descriptions. Description adds that parameters are alternative methods (url or handle+code), but this is already implied by schema structure.

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?

Specifically states 'Delete one of YOUR OWN Threads posts' with clear verb and resource. Distinguishes from sibling tools like 'unlike_thread' or 'unrepost_thread' which are different actions.

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

Usage Guidelines4/5

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

Explicitly says to use for your own posts and emphasizes permanence, guiding when to invoke. Could be improved by naming specific alternative tools for other operations.

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

doctorHealth checkA
Read-onlyIdempotent

Check that this server can still drive Threads: session validity, and whether each DOM anchor the write tools depend on is still present. Run it when tools start failing oddly — Meta ships UI changes without notice, and a moved anchor otherwise shows up as a vague "could not confirm" from whichever tool happened to use it. Read-only: it opens the composer to inspect it but never posts, and discards any draft it would create.

ParametersJSON Schema
NameRequiredDescriptionDefault
deepNoAlso load a real post page and the activity feed to check those anchors. Slower (several page loads); needs a post to exist on your timeline.

Output Schema

ParametersJSON Schema
NameRequiredDescription
checksYes
healthyYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint. The description adds specific behavioral details: it opens the composer to inspect but never posts, and discards any draft. No contradictions.

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

Conciseness5/5

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

Three sentences, no wasted words. Front-loaded with core purpose, then usage guidance, then behavioral note. Highly efficient.

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

Completeness5/5

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

Given one optional parameter, explicit annotations, and an output schema (mentioned), the description fully covers purpose, usage context, behavior, and parameter semantics. No gaps.

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?

Single parameter 'deep' with 100% schema description coverage. The description adds semantic context by explaining the deeper check ('load real post page and activity feed') and trade-off ('slower, needs a post'). Baseline 3, +1 for added context.

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

Purpose5/5

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

The description clearly states the tool's purpose: checking session validity and DOM anchor presence for write tools. It uses specific verbs ('check', 'drive') and resource ('Threads', 'DOM anchor'), and distinguishes from sibling write tools by being diagnostic.

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

Usage Guidelines5/5

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

Explicitly states when to use ('when tools start failing oddly') and provides context about Meta UI changes. Also clarifies it is read-only and discards drafts, preventing misuse.

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

follow_userFollow a userA
Idempotent

Follow a Threads user by @handle. ⚠️ Real account — follow/unfollow bursts are a classic ban trigger, so this is rate-limited.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYesThe @username to follow

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate this is a write operation (readOnlyHint=false) and idempotent (idempotentHint=true). The description adds critical behavioral context: it operates on a real account, rate-limited, and can trigger bans if abused. This goes beyond 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 concise sentences. The first states the core functionality, the second adds a vital warning. No wasted words.

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 action with one parameter and no output schema, the description covers purpose, parameter, and critical behavioral caveats. It is complete enough for an agent to understand when and how to invoke it, though it lacks prerequisite info (e.g., authentication).

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

Parameters3/5

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

Schema description coverage is 100% with a clear description for the single 'handle' parameter ('The @username to follow'). The description reinforces this but adds no new semantics beyond the schema.

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

Purpose5/5

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

The description clearly states the action 'Follow a Threads user by @handle', specifying the verb (follow) and resource (Threads user by handle). It is distinct from sibling tools like unfollow_user.

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

Usage Guidelines3/5

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

The description mentions the dangerous nature of follow/unfollow bursts and rate-limiting, implying cautious usage, but does not explicitly state when to use this tool versus alternatives like unfollow_user or 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_followersGet followersA
Read-onlyIdempotent

Get a sample of a user's followers (opens the followers list and reads what loads). Threads does not expose a full follower dump; expect a partial list.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax followers (1-100, default 30)
handleYesThe @username whose followers to list

Output Schema

ParametersJSON Schema
NameRequiredDescription
usersYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint. Description adds useful behavior context (opens and reads what loads, partial list) beyond 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, no wasted words, front-loaded with purpose and limitation.

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?

Tool is simple with 2 params and output schema present. Description explains limitation and operation adequately for agent to use correctly.

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

Parameters4/5

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

Schema description coverage is 100%, baseline 3. The description adds semantics around 'sample' and 'partial list', providing context for the limit parameter.

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

Purpose5/5

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

Description clearly states 'Get a sample of a user's followers' and highlights the partial nature, distinguishing it from sibling tools like get_following.

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

Usage Guidelines4/5

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

Explicitly mentions Threads does not expose a full follower dump, warning agents to expect only a partial list. Provides clear context for when this tool is appropriate.

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

get_followingGet followingA
Read-onlyIdempotent

Get a sample of the accounts a user follows (opens their Following list and reads what loads). Threads does not expose a full dump; expect a partial list.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax accounts (1-100, default 30)
handleYesThe @username whose following list to read

Output Schema

ParametersJSON Schema
NameRequiredDescription
usersYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds context by explaining the mechanics ('opens their Following list and reads what loads') and confirms the partial nature, which goes beyond the annotations. 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?

The description is concise (two sentences) and front-loaded with the primary purpose. Every sentence adds value: first states what it does, second sets expectations about completeness. No unnecessary words.

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 that an output schema exists (so return values are documented), annotations are rich, and the description explains the partial nature and mechanism, the description is complete for this tool's complexity. It also covers the limitation of the platform.

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 baseline is 3. The description does not add significant meaning beyond the schema; it mentions 'sample' but that is already in the tool description. The schema itself provides clear descriptions for 'handle' and 'limit'.

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

Purpose5/5

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

The description clearly states the tool gets a sample of accounts a user follows, using the verb 'Get' and specifying the resource ('accounts a user follows'). It distinguishes from sibling tools like 'get_followers' by focusing on who the user follows, not followers. The phrase 'partial list' further differentiates it from a full dump.

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

Usage Guidelines4/5

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

The description provides clear usage context: it returns a sample, not a full list, and explains why ('Threads does not expose a full dump'). This guides the agent to set appropriate expectations. However, it does not explicitly mention when not to use or suggest alternative tools.

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

get_notificationsGet notificationsA
Read-onlyIdempotent

Read your Threads Activity feed — who followed you, replies and mentions, and suggestions. This is how you find out what happened on your account; every other read tool looks outward. Optionally filter by kind.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoOnly return this category. Filtering happens after fetching, because Threads drives its Activity tabs from a popover rather than the URL.
limitNoMax entries (1-100, default 20)

Output Schema

ParametersJSON Schema
NameRequiredDescription
notificationsYes

TDQS

A4.4/5.0
Behavior4/5

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

Discloses that filtering by kind happens after fetching due to a popover behavior, adding value beyond annotations. Annotations already declare readOnly, openWorld, and idempotent hints, so no contradiction.

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 efficient sentences plus a parenthetical note. Front-loads core purpose and key differentiator. No redundant or extra words.

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 full annotations, input schema, and output schema present, the description covers essential behavioral and usage aspects. Could mention pagination or limit behavior briefly, but not necessary given schema.

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

Parameters4/5

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

Description adds semantic context for the 'kind' parameter, explaining why filtering is post-fetch. Schema coverage is 100%, so baseline is 3; the extra explanation justifies a 4.

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

Purpose5/5

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

Clearly states 'Read your Threads Activity feed' with specific examples (follows, replies, mentions, suggestions). Distinguishes from siblings by stating 'every other read tool looks outward', making purpose unambiguous.

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

Usage Guidelines4/5

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

Provides context for when to use (find out what happened on your account) and contrasts with other read tools. Mentions optional filtering by kind. Lacks explicit when-not-to-use but is sufficiently clear given sibling context.

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

get_profileGet profileA
Read-onlyIdempotent

Get a Threads user's profile: display name, bio, follower count, verified status, and a few recent posts. Omit handle to get your own profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleNoThe @username (with or without @). Omit for your own profile.

Output Schema

ParametersJSON Schema
NameRequiredDescription
profileYes
recent_postsYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. Description adds the list of returned fields but no additional behavioral traits 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?

Two sentences clearly convey purpose and usage. No unnecessary words, front-loaded with key information.

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 simple single-parameter tool with output schema, the description covers all necessary context: what the tool does, what it returns, and how to use the parameter.

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 description adds no new information beyond the schema's parameter description. 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?

Description clearly states the tool retrieves a user's profile with specific fields (display name, bio, follower count, verified status, recent posts). Distinguishes from siblings like whoami and get_user_threads by focusing on profile data.

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

Usage Guidelines4/5

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

Provides explicit guidance on when to omit the handle parameter to get your own profile. While it doesn't list alternatives, the context is clear for this simple tool.

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

get_threadGet a postA
Read-onlyIdempotent

Get a single Threads post with its stats. Provide the post url, or handle + code.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull post URL, e.g. https://www.threads.com/@user/post/ABC123
codeNoPost shortcode (if not using url)
handleNoAuthor @username (if not using url)

Output Schema

ParametersJSON Schema
NameRequiredDescription
postNo

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the description's mention of 'stats' adds useful context but is not critical. It does not disclose further behavioral traits.

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 purpose and parameter guidance with no unnecessary words.

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

Completeness4/5

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

Given the low complexity, presence of an output schema, and clear parameter guidance, the description is nearly complete. It could mention potential errors or prerequisites but is sufficient for an agent.

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

Parameters4/5

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

Schema coverage is 100%, and the description adds meaning by explaining the mutually exclusive relationship between url and handle+code, which is not captured in the schema's property descriptions.

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 retrieves a single Threads post with its stats, differentiating it from sibling tools like get_user_threads or get_thread_replies which list multiple posts or 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 specifies two ways to identify the post (url or handle+code), providing clear input guidance. However, it does not explicitly state when not to use this tool or mention alternatives, leaving some ambiguity.

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

get_thread_repliesGet post repliesA
Read-onlyIdempotent

Get the replies to a Threads post. Provide the post url, or handle + code.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull post URL
codeNoPost shortcode (if not using url)
limitNoMax replies (1-50, default 15)
handleNoAuthor @username (if not using url)

Output Schema

ParametersJSON Schema
NameRequiredDescription
repliesYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, which describe the tool's safety and idempotency. The description adds 'Get the replies' but does not disclose additional behavioral traits like pagination, ordering, or rate limits. Given the annotations, the description offers minimal extra value.

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 a single, front-loaded sentence with no extraneous information. It is highly efficient.

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

Completeness4/5

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

The tool has a low complexity and an output schema, so the description does not need to explain return values. It covers the two identification methods adequately. However, it omits mention of the `limit` parameter's effect on the number of replies returned, which is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description clarifies that `url` or `handle`+`code` are alternative ways to specify the post, which adds meaning beyond the schema. However, it does not discuss the `limit` parameter, which is fully described in the schema.

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

Purpose5/5

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

The description clearly states the action ('Get the replies') and the resource ('a Threads post'). It distinguishes from siblings like 'get_thread' and 'get_user_threads' by specifying it's for replies. The alternative identification methods are explicitly listed.

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

Usage Guidelines4/5

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

The description provides clear instructions on how to specify the post ('Provide the post `url`, or `handle` + `code`'). However, it does not explicitly state when to use this tool versus alternatives or when not to use it, leaving the differentiation implicit.

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

get_timelineGet home timelineA
Read-onlyIdempotent

Get your Threads home feed (the "For you" timeline).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax posts (1-50, default 15)

Output Schema

ParametersJSON Schema
NameRequiredDescription
postsYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds the context that the timeline is personalized ('your', 'For you'), but does not disclose additional behavioral traits beyond what annotations provide.

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

Conciseness5/5

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

The description is a single sentence that directly conveys the tool's purpose with no extraneous words. It is well front-loaded.

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

Completeness3/5

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

Given the low complexity (1 optional parameter) and presence of a detailed output schema and annotations, the minimal description is adequate but could mention pagination or the nature of the feed (e.g., algorithmic vs chronological).

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 fully describes the 'limit' parameter with default, min, and max. The description adds no information about parameters beyond the schema.

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

Purpose5/5

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

The description uses the specific verb 'Get' and identifies the resource as 'your Threads home feed (the 'For you' timeline)', clearly distinguishing it from sibling tools like get_user_threads (which gets threads of a specific user) and search.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives such as get_user_threads or search. The description does not mention when not to use it or any prerequisites.

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

get_user_threadsGet user postsB
Read-onlyIdempotent

Get a user's recent Threads posts (their profile feed).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax posts (1-50, default 15)
handleYesThe @username whose posts to fetch

Output Schema

ParametersJSON Schema
NameRequiredDescription
postsYes

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds no behavioral context beyond stating it gets recent posts, such as pagination, ordering, or data freshness. It does not contradict 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 a single sentence of 10 words, front-loaded and to the point with no waste.

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

Completeness4/5

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

The tool is a simple read-only retrieval with good annotations and an output schema (not provided but present). The description is complete for the task, though it omits details like default limit or pagination, which are covered by schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds no meaning beyond the schema: it does not explain 'recent' or order. It merely restates the purpose.

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

Purpose5/5

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

The description clearly states the verb 'Get' and the resource 'a user's recent Threads posts (their profile feed)', distinguishing it from siblings like get_thread (single thread) or get_timeline (own feed).

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

Usage Guidelines2/5

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

The description does not provide guidance on when to use this tool vs alternatives such as get_thread, get_timeline, or search. It only states what it does, leaving the agent to infer usage context.

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

like_threadLike a postA
Idempotent

Like a Threads post. Provide the post url, or handle + code. ⚠️ Real account — rate-limited.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull post URL
codeNoPost shortcode (if not using url)
handleNoAuthor @username (if not using url)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare idempotentHint=true and destructiveHint=false. The description adds that this uses a 'real account' and is 'rate-limited', providing behavioral context beyond the structured annotations. No contradictions.

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

Conciseness5/5

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

Two sentences plus a warning emoji. Every element is useful: the verb, the identifier patterns, and the behavioral caveat. No wasted words, front-loaded with the action.

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 like operation with no output schema, the description provides sufficient context: how to identify the post and the key behavioral trait (rate-limited). The annotations cover idempotency and non-destructiveness. A small gap is that the return value is not mentioned, but this is minor.

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

Parameters4/5

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

Schema coverage is 100% so baseline is 3. The description adds value by explaining the OR relationship between url and handle+code, guiding the agent to provide either combination. This goes beyond the schema's individual descriptions.

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 the verb 'Like' and specifies the resource 'a Threads post', clearly identifying the action. It also distinguishes from sibling tools like unlike_thread by naming the positive action. The alternative identifier patterns (url or handle+code) add specificity.

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 tells how to specify the post (url or handle+code), but does not explicitly state when to use this tool versus alternatives like unlike_thread or repost_thread. The usage context is implied by the action name rather than spelled out.

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

list_scheduledList scheduled postsA
Read-onlyIdempotent

List scheduled posts and their status (pending / done / failed / canceled).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true and idempotentHint=true, so the description adds value by specifying the returned statuses. However, it does not disclose any additional behavioral traits like pagination or ordering.

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 a single concise sentence that directly states the tool's function without any unnecessary words.

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 list tool with no parameters and no output schema, the description provides the key information (list of scheduled posts with status). It could mention that all scheduled posts are returned, but it is still complete enough for an agent.

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

Parameters4/5

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

There are zero parameters, so the description does not need to add parameter details. Baseline is 4 for zero parameters, and the description is sufficient.

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

Purpose5/5

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

The description clearly states the tool lists scheduled posts and their statuses, with specific status values enumerated. It distinguishes well from siblings like cancel_scheduled and schedule_thread.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives. For example, it does not mention that to create scheduled posts use schedule_thread or to cancel use cancel_scheduled.

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

quote_threadQuote a postA

Quote-post a Threads post — repost it with your own comment (text and/or media). Provide the post url, or handle + code, plus your text and/or media. ⚠️ Real account — rate-limited.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull URL of the post to quote
codeNoPost shortcode (if not using url)
textNoYour comment on the quoted post (max 500 chars).
mediaNoLocal file paths and/or http(s) URLs to attach to your quote.
handleNoAuthor @username (if not using url)

TDQS

A4.4/5.0
Behavior4/5

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

Adds value beyond annotations with 'Real account — rate-limited' warning. Annotations already indicate non-read-only, non-idempotent, non-destructive. No contradictions.

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

Conciseness5/5

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

Two concise sentences plus a warning emoji. No filler, every part 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 purpose, target identification, content to add, and rate limits. No output schema, but for a simple action it's sufficient.

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 covers 100% of parameters. Description adds logical grouping (url OR handle+code, plus text/media) and mentions max lengths (already in schema).

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

Purpose5/5

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

Clearly states 'Quote-post a Threads post — repost it with your own comment', distinguishing it from sibling tools like 'repost_thread' (repost without comment) and 'reply_to_thread'.

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

Usage Guidelines4/5

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

Provides explicit instructions: 'Provide the post url, or handle + code, plus your text and/or media.' Does not explicitly list when not to use, but the context is clear.

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

reply_to_threadReply to a postA

Reply to a Threads post with text and/or media. Provide the post url, or handle + code. ⚠️ Real account — rate-limited.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull post URL to reply to
codeNoPost shortcode (if not using url)
textNoYour reply text (max 500 chars). Optional if media is given.
mediaNoLocal file paths and/or http(s) URLs — images (jpg/png/webp/avif) and/or video (mp4/mov/webm).
handleNoAuthor @username (if not using url)

TDQS

A4.4/5.0
Behavior4/5

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

Annotations indicate mutation and non-destructive behavior. Description adds context about rate limiting and the use of a real account, which supplements 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 concise sentences front-load the purpose and key constraints with no wasted words.

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 purpose, usage, and constraints well, but lacks mention of return value (e.g., reply post ID). Still, sufficient for a tool with 5 parameters and no output schema.

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

Parameters4/5

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

Schema coverage is 100%, but the description adds meaning: alternative identification methods, media types (images/video), and text length limit, going beyond the schema.

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

Purpose5/5

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

The description clearly states the action ('Reply to a Threads post') and the allowed content ('text and/or media'), distinguishing it from siblings like create_thread and quote_thread.

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 specifies how to identify the target post ('url, or handle + code') and warns about rate limiting, but does not explicitly contrast with similar tools like quote_thread or when to use each.

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

repost_threadRepost a postA
Idempotent

Repost a Threads post to your followers. Provide the post url, or handle + code. ⚠️ Real account — rate-limited.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull post URL
codeNoPost shortcode (if not using url)
handleNoAuthor @username (if not using url)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds important context: 'Real account — rate-limited,' which tells the agent this is a write action with rate limits. 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 plus a warning emoji. Front-loaded with the action, then parameter guidance. No unnecessary words; every sentence is essential.

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 action with no output schema and three optional parameters, the description covers how to specify the post and warns about rate limits. Lacks details on return value but sufficient given low complexity.

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 parameter descriptions. The description adds the 'or' logic between url and handle+code, clarifying mutually exclusive usage. This adds modest value beyond the schema.

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

Purpose5/5

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

The description clearly states 'Repost a Threads post to your followers.' It specifies the action (reposting) on a specific resource (Threads post) and distinguishes from sibling tools like reply_to_thread, quote_thread, and unlike_thread.

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 instructions on how to identify the post (url or handle+code) and warns about rate limits with '⚠️ Real account — rate-limited.' It implies usage for reposting but does not explicitly state when not to use or alternatives like unrepost_thread.

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

schedule_threadSchedule a postA

Schedule a text/media post to publish later. Give at (ISO datetime, e.g. "2026-07-14T20:00", interpreted in the server's local timezone unless you add an offset like "+07:00" or "Z") OR in (a duration like "30m", "2h", "1d"). ⚠️ The post only fires while THIS server is running; past-due jobs fire on the next startup. For long horizons, run the server as an always-on daemon. Local media file paths must still exist when the job fires.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoAbsolute time, ISO 8601 (e.g. "2026-07-14T20:00" or "2026-07-14T20:00+07:00").
inNoRelative delay from now, e.g. "45s", "30m", "2h", "3d".
textNoPost text (max 500 chars). Optional if media is given.
mediaNoLocal file paths and/or http(s) URLs — images and/or video. Resolved when the job fires.

TDQS

A4.7/5.0
Behavior5/5

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

Description discloses critical behaviors beyond annotations: the post only fires while the server runs, past-due jobs execute on next startup, and local media files must still exist when the job fires. This context is essential for correct usage.

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

Conciseness4/5

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

The description is a single paragraph that efficiently conveys purpose, parameter usage, and warnings. It is front-loaded with the main action. A minor improvement could be breaking into shorter sentences, but overall it is concise and structured.

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 all parameters and key behavioral caveats given no output schema. However, it does not mention what the tool returns (e.g., a job ID). This is a minor gap, but the description is otherwise complete for a scheduling tool.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds meaningful context: timezone handling for `at`, duration formats for `in`, optionality of `text` when media provided, and resolution timing for `media`. It enhances understanding beyond the schema.

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

Purpose5/5

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

The description clearly states the tool schedules a text/media post for later publishing. It distinguishes from siblings like 'create_thread' (immediate post) and 'cancel_scheduled' (removes a scheduled post).

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

Usage Guidelines5/5

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

The description explicitly explains when to use `at` vs `in` with examples, warns that the post only fires while the server is running (with past-due jobs on startup), and advises running as a daemon for long horizons. It also notes that local media paths must exist at firing time.

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

unfollow_userUnfollow a userA
Idempotent

Unfollow a Threads user by @handle. ⚠️ Real account — follow/unfollow bursts are a classic ban trigger, so this is rate-limited.

ParametersJSON Schema
NameRequiredDescriptionDefault
handleYesThe @username to unfollow

TDQS

A4.4/5.0
Behavior5/5

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

Discloses that this acts on a real account and is rate-limited, which goes beyond the annotations (idempotentHint=true, destructiveHint=false) by highlighting risks and constraints.

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, immediately front-loaded with purpose. Warning and context efficiently added with no wasted words.

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

Completeness4/5

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

Given simplicity (1 param, no output schema), the description adequately covers purpose and risks. Could mention success/error behavior, but idempotentHint reduces need. Slightly incomplete but sufficient for this tool.

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

Parameters3/5

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

Schema covers 100% of parameters with description, so baseline 3. The description adds 'by @handle' but this is already implied; no additional semantics beyond schema.

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

Purpose5/5

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

The description clearly states the verb 'Unfollow' and the resource 'Threads user by @handle', distinguishing it from sibling 'follow_user' and other tools.

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

Usage Guidelines4/5

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

Provides explicit warning against burst usage and mentions rate-limiting, guiding agents to avoid ban triggers. Does not explicitly name alternatives but context implies careful scheduling.

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

unlike_threadUnlike a postA
Idempotent

Remove your like from a Threads post. Provide the post url, or handle + code. ⚠️ Real account — rate-limited.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull post URL
codeNoPost shortcode (if not using url)
handleNoAuthor @username (if not using url)

TDQS

A4.3/5.0
Behavior4/5

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

Beyond the annotations (which show idempotentHint=true, destructiveHint=false), the description adds 'Real account — rate-limited', disclosing it uses a real account and is subject to rate limits. This provides useful behavioral context.

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

Conciseness5/5

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

The description is very concise: two short sentences and a warning emoji. It is front-loaded with the action and every sentence is informative with no redundancy.

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

Completeness5/5

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

For a simple tool with good parameter descriptions and annotations, the description provides sufficient context. No output schema is needed, and the note about rate-limits adds important operational detail.

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

Parameters4/5

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

Schema coverage is 100% with descriptions for all three parameters. The description adds value by clarifying the two alternative ways to identify the post: url or (handle+code), which is not explicit in the schema.

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

Purpose5/5

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

The description states 'Remove your like from a Threads post' with a specific verb ('remove') and resource ('like from a post'). It clearly distinguishes from the sibling tool 'like_thread' by performing the opposite action.

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 instructions on how to specify the post (url or handle+code) and includes a rate-limit warning. However, it does not explicitly state when to use this tool versus alternatives like 'like_thread' or other tools.

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

unrepost_threadRemove a repostA
Idempotent

Remove your repost of a Threads post. Provide the post url, or handle + code. ⚠️ Real account — rate-limited.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoFull post URL
codeNoPost shortcode (if not using url)
handleNoAuthor @username (if not using url)

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already specify idempotentHint=true and destructiveHint=false. Description adds context: 'Real account — rate-limited.' 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 sentences with clear, front-loaded information. No wasted words; uses code formatting for parameters and a warning symbol.

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 removal tool with well-described parameters and sparse output, the description covers input methods and key behavioral note. No gaps.

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

Parameters4/5

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

Schema descriptions cover 100% of parameters. The description adds value by specifying the combination pattern ('url, or handle + code'), which is not in the schema.

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

Purpose5/5

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

The description clearly states 'Remove your repost' (verb + resource). It distinguishes from the sibling tool 'repost_thread' which adds a repost.

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

Usage Guidelines4/5

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

Provides explicit input options: 'Provide the post url, or handle + code.' Also notes rate-limiting and real-account requirement, though not exhaustive when to use vs alternatives.

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

whoamiWho am IA
Read-onlyIdempotent

Show which Threads account this server is signed in as (your @handle, user id, name, follower/following counts). Use this to confirm the active session before posting.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
profileNo
signed_inYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark it as read-only and idempotent. Description adds specific output fields, enhancing transparency beyond annotations. No contradictions.

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

Conciseness5/5

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

Two sentences: first defines functionality, second gives usage context. No wasted words.

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 parameters and an output schema present, the description fully covers the tool's purpose and appropriate usage context.

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?

No parameters; baseline 4 applies. Description does not need to elaborate on parameters.

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?

Description clearly states it shows the current signed-in account with specific fields (@handle, user id, name, counts). Distinguishes from siblings like get_profile which target other users.

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

Usage Guidelines4/5

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

Explicitly recommends use before posting to confirm session. Does not explicitly mention when not to use, but the context is clear.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 12 tool updatesv0.2.0
    • Changedcreate_thread1 field changed
      • addedInput schema / properties / chain
        Added value: +{
        +  "description": "Additional posts to publish as one connected thread, in order, after `text`. This is the multi-post format Threads calls \"Add to thread\" — the parts stay linked. Posting them one at a time instead produces unlinked standalone threads.",
        +  "items": {
        +    "maxLength": 500,
        +    "type": "string"
        +  },
        +  "maxItems": 24,
        +  "type": "array"
        +}
    • Addeddoctor
    • Changedget_followers1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "users": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "avatar": {
        +            "type": "string"
        +          },
        +          "bio": {
        +            "type": "string"
        +          },
        +          "followers": {
        +            "type": "number"
        +          },
        +          "following": {
        +            "type": "number"
        +          },
        +          "handle": {
        +            "description": "@handle, without the @",
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "verified": {
        +            "type": "boolean"
        +          }
        +        },
        +        "required": [
        +          "verified"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "users"
        +  ],
        +  "type": "object"
        +}
    • Addedget_following
    • Addedget_notifications
    • Changedget_profile1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "profile": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "avatar": {
        +          "type": "string"
        +        },
        +        "bio": {
        +          "type": "string"
        +        },
        +        "followers": {
        +          "type": "number"
        +        },
        +        "following": {
        +          "type": "number"
        +        },
        +        "handle": {
        +          "description": "@handle, without the @",
        +          "type": "string"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "url": {
        +          "type": "string"
        +        },
        +        "verified": {
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "verified"
        +      ],
        +      "type": "object"
        +    },
        +    "recent_posts": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "author": {
        +            "description": "Author @handle, without the @",
        +            "type": "string"
        +          },
        +          "author_verified": {
        +            "description": "Whether the author is verified",
        +            "type": "boolean"
        +          },
        +          "code": {
        +            "description": "Shortcode — pass to any tool taking `code`",
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "description": "ISO 8601 timestamp",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Numeric post id (pk)",
        +            "type": "string"
        +          },
        +          "is_reply": {
        +            "type": "boolean"
        +          },
        +          "likes": {
        +            "type": "number"
        +          },
        +          "media": {
        +            "description": "Kind of attached media, if any",
        +            "enum": [
        +              "none",
        +              "image",
        +              "video"
        +            ],
        +            "type": "string"
        +          },
        +          "quoted": {
        +            "additionalProperties": false,
        +            "description": "The post this one quotes, when it is a quote-post",
        +            "properties": {
        +              "author": {
        +                "type": "string"
        +              },
        +              "text": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "text"
        +            ],
        +            "type": "object"
        +          },
        +          "quotes": {
        +            "type": "number"
        +          },
        +          "replies": {
        +            "type": "number"
        +          },
        +          "reposts": {
        +            "type": "number"
        +          },
        +          "text": {
        +            "description": "Post text, empty for media-only posts",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Canonical permalink",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "author_verified",
        +          "text",
        +          "likes",
        +          "replies",
        +          "reposts",
        +          "quotes",
        +          "media",
        +          "is_reply"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "profile",
        +    "recent_posts"
        +  ],
        +  "type": "object"
        +}
    • Changedget_thread1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "post": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "author": {
        +          "description": "Author @handle, without the @",
        +          "type": "string"
        +        },
        +        "author_verified": {
        +          "description": "Whether the author is verified",
        +          "type": "boolean"
        +        },
        +        "code": {
        +          "description": "Shortcode — pass to any tool taking `code`",
        +          "type": "string"
        +        },
        +        "created_at": {
        +          "description": "ISO 8601 timestamp",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Numeric post id (pk)",
        +          "type": "string"
        +        },
        +        "is_reply": {
        +          "type": "boolean"
        +        },
        +        "likes": {
        +          "type": "number"
        +        },
        +        "media": {
        +          "description": "Kind of attached media, if any",
        +          "enum": [
        +            "none",
        +            "image",
        +            "video"
        +          ],
        +          "type": "string"
        +        },
        +        "quoted": {
        +          "additionalProperties": false,
        +          "description": "The post this one quotes, when it is a quote-post",
        +          "properties": {
        +            "author": {
        +              "type": "string"
        +            },
        +            "text": {
        +              "type": "string"
        +            },
        +            "url": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "text"
        +          ],
        +          "type": "object"
        +        },
        +        "quotes": {
        +          "type": "number"
        +        },
        +        "replies": {
        +          "type": "number"
        +        },
        +        "reposts": {
        +          "type": "number"
        +        },
        +        "text": {
        +          "description": "Post text, empty for media-only posts",
        +          "type": "string"
        +        },
        +        "url": {
        +          "description": "Canonical permalink",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "author_verified",
        +        "text",
        +        "likes",
        +        "replies",
        +        "reposts",
        +        "quotes",
        +        "media",
        +        "is_reply"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_thread_replies1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "replies": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "author": {
        +            "description": "Author @handle, without the @",
        +            "type": "string"
        +          },
        +          "author_verified": {
        +            "description": "Whether the author is verified",
        +            "type": "boolean"
        +          },
        +          "code": {
        +            "description": "Shortcode — pass to any tool taking `code`",
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "description": "ISO 8601 timestamp",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Numeric post id (pk)",
        +            "type": "string"
        +          },
        +          "is_reply": {
        +            "type": "boolean"
        +          },
        +          "likes": {
        +            "type": "number"
        +          },
        +          "media": {
        +            "description": "Kind of attached media, if any",
        +            "enum": [
        +              "none",
        +              "image",
        +              "video"
        +            ],
        +            "type": "string"
        +          },
        +          "quoted": {
        +            "additionalProperties": false,
        +            "description": "The post this one quotes, when it is a quote-post",
        +            "properties": {
        +              "author": {
        +                "type": "string"
        +              },
        +              "text": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "text"
        +            ],
        +            "type": "object"
        +          },
        +          "quotes": {
        +            "type": "number"
        +          },
        +          "replies": {
        +            "type": "number"
        +          },
        +          "reposts": {
        +            "type": "number"
        +          },
        +          "text": {
        +            "description": "Post text, empty for media-only posts",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Canonical permalink",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "author_verified",
        +          "text",
        +          "likes",
        +          "replies",
        +          "reposts",
        +          "quotes",
        +          "media",
        +          "is_reply"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "replies"
        +  ],
        +  "type": "object"
        +}
    • Changedget_timeline1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "posts": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "author": {
        +            "description": "Author @handle, without the @",
        +            "type": "string"
        +          },
        +          "author_verified": {
        +            "description": "Whether the author is verified",
        +            "type": "boolean"
        +          },
        +          "code": {
        +            "description": "Shortcode — pass to any tool taking `code`",
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "description": "ISO 8601 timestamp",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Numeric post id (pk)",
        +            "type": "string"
        +          },
        +          "is_reply": {
        +            "type": "boolean"
        +          },
        +          "likes": {
        +            "type": "number"
        +          },
        +          "media": {
        +            "description": "Kind of attached media, if any",
        +            "enum": [
        +              "none",
        +              "image",
        +              "video"
        +            ],
        +            "type": "string"
        +          },
        +          "quoted": {
        +            "additionalProperties": false,
        +            "description": "The post this one quotes, when it is a quote-post",
        +            "properties": {
        +              "author": {
        +                "type": "string"
        +              },
        +              "text": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "text"
        +            ],
        +            "type": "object"
        +          },
        +          "quotes": {
        +            "type": "number"
        +          },
        +          "replies": {
        +            "type": "number"
        +          },
        +          "reposts": {
        +            "type": "number"
        +          },
        +          "text": {
        +            "description": "Post text, empty for media-only posts",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Canonical permalink",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "author_verified",
        +          "text",
        +          "likes",
        +          "replies",
        +          "reposts",
        +          "quotes",
        +          "media",
        +          "is_reply"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "posts"
        +  ],
        +  "type": "object"
        +}
    • Changedget_user_threads1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "posts": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "author": {
        +            "description": "Author @handle, without the @",
        +            "type": "string"
        +          },
        +          "author_verified": {
        +            "description": "Whether the author is verified",
        +            "type": "boolean"
        +          },
        +          "code": {
        +            "description": "Shortcode — pass to any tool taking `code`",
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "description": "ISO 8601 timestamp",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Numeric post id (pk)",
        +            "type": "string"
        +          },
        +          "is_reply": {
        +            "type": "boolean"
        +          },
        +          "likes": {
        +            "type": "number"
        +          },
        +          "media": {
        +            "description": "Kind of attached media, if any",
        +            "enum": [
        +              "none",
        +              "image",
        +              "video"
        +            ],
        +            "type": "string"
        +          },
        +          "quoted": {
        +            "additionalProperties": false,
        +            "description": "The post this one quotes, when it is a quote-post",
        +            "properties": {
        +              "author": {
        +                "type": "string"
        +              },
        +              "text": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "text"
        +            ],
        +            "type": "object"
        +          },
        +          "quotes": {
        +            "type": "number"
        +          },
        +          "replies": {
        +            "type": "number"
        +          },
        +          "reposts": {
        +            "type": "number"
        +          },
        +          "text": {
        +            "description": "Post text, empty for media-only posts",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Canonical permalink",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "author_verified",
        +          "text",
        +          "likes",
        +          "replies",
        +          "reposts",
        +          "quotes",
        +          "media",
        +          "is_reply"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "posts"
        +  ],
        +  "type": "object"
        +}
    • Changedsearch1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "posts": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "author": {
        +            "description": "Author @handle, without the @",
        +            "type": "string"
        +          },
        +          "author_verified": {
        +            "description": "Whether the author is verified",
        +            "type": "boolean"
        +          },
        +          "code": {
        +            "description": "Shortcode — pass to any tool taking `code`",
        +            "type": "string"
        +          },
        +          "created_at": {
        +            "description": "ISO 8601 timestamp",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Numeric post id (pk)",
        +            "type": "string"
        +          },
        +          "is_reply": {
        +            "type": "boolean"
        +          },
        +          "likes": {
        +            "type": "number"
        +          },
        +          "media": {
        +            "description": "Kind of attached media, if any",
        +            "enum": [
        +              "none",
        +              "image",
        +              "video"
        +            ],
        +            "type": "string"
        +          },
        +          "quoted": {
        +            "additionalProperties": false,
        +            "description": "The post this one quotes, when it is a quote-post",
        +            "properties": {
        +              "author": {
        +                "type": "string"
        +              },
        +              "text": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "text"
        +            ],
        +            "type": "object"
        +          },
        +          "quotes": {
        +            "type": "number"
        +          },
        +          "replies": {
        +            "type": "number"
        +          },
        +          "reposts": {
        +            "type": "number"
        +          },
        +          "text": {
        +            "description": "Post text, empty for media-only posts",
        +            "type": "string"
        +          },
        +          "url": {
        +            "description": "Canonical permalink",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "author_verified",
        +          "text",
        +          "likes",
        +          "replies",
        +          "reposts",
        +          "quotes",
        +          "media",
        +          "is_reply"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "users": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "avatar": {
        +            "type": "string"
        +          },
        +          "bio": {
        +            "type": "string"
        +          },
        +          "followers": {
        +            "type": "number"
        +          },
        +          "following": {
        +            "type": "number"
        +          },
        +          "handle": {
        +            "description": "@handle, without the @",
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "verified": {
        +            "type": "boolean"
        +          }
        +        },
        +        "required": [
        +          "verified"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedwhoami1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "profile": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "avatar": {
        +          "type": "string"
        +        },
        +        "bio": {
        +          "type": "string"
        +        },
        +        "followers": {
        +          "type": "number"
        +        },
        +        "following": {
        +          "type": "number"
        +        },
        +        "handle": {
        +          "description": "@handle, without the @",
        +          "type": "string"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "url": {
        +          "type": "string"
        +        },
        +        "verified": {
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "verified"
        +      ],
        +      "type": "object"
        +    },
        +    "signed_in": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "signed_in"
        +  ],
        +  "type": "object"
        +}
  2. 21 tool updatesv0.1.1
    • First observedcancel_scheduled
    • First observedcreate_thread
    • First observeddelete_thread
    • First observedfollow_user
    • First observedget_followers
    • First observedget_profile
    • First observedget_thread
    • First observedget_thread_replies
    • First observedget_timeline
    • First observedget_user_threads
    • First observedlike_thread
    • First observedlist_scheduled
    • First observedquote_thread
    • First observedreply_to_thread
    • First observedrepost_thread
    • First observedschedule_thread
    • First observedsearch
    • First observedunfollow_user
    • First observedunlike_thread
    • First observedunrepost_thread
    • First observedwhoami

TDQS

A4/5.0
Disambiguation5/5

Each tool targets a distinct action: scheduling, reading profiles/posts, interactions (like/repost/quote), follow/unfollow, etc. No two tools have overlapping purposes despite the large number.

Naming Consistency4/5

Nearly all tools follow a verb_noun pattern (e.g., list_scheduled, get_profile, create_thread). Two exceptions: 'whoami' (lowercase, no underscore) and 'doctor' (single word), which are minor deviations from the otherwise consistent schema.

Tool Count4/5

24 tools is slightly above the typical well-scoped range, but the server covers a broad domain (scheduling, posts, interactions, notifications, followers) without feeling bloated—each tool has a clear purpose.

Completeness4/5

The surface covers core CRUD for posts, scheduling, interactions, and account details. Minor gaps include no tool to update scheduled posts or edit profile information, but these are not critical for the primary use case.

Maintenance

ActivitySlowing
ResponsivenessSyncing

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

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/bintangtimurlangit/threads-mcp'

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