Threads MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| THREADS_USER_ID | No | Numeric profile id. Resolved from the token when absent. | |
| THREADS_ACCOUNTS | No | JSON array, for several profiles. | |
| THREADS_USERNAME | No | Username, for matching and display. | |
| THREADS_AUDIT_LOG | No | Append-only log of every attempted write. | |
| THREADS_HTTP_HOST | No | For --http. | 127.0.0.1 |
| THREADS_HTTP_PORT | No | For --http. | 8787 |
| THREADS_READ_ONLY | No | Hide every write from the tool list. | 0 |
| THREADS_GRAPH_HOST | No | The Graph API host. | https://graph.threads.net |
| THREADS_HTTP_TOKEN | No | Bearer token required by --http. | |
| THREADS_MAX_RETRIES | No | Retries on 5xx and transient errors. | 3 |
| THREADS_TOKEN_STORE | No | Where tokens are kept. | ~/.threads-mcp/tokens.json |
| THREADS_ACCESS_TOKEN | No | A long-lived token for one profile. | |
| THREADS_PERSIST_TOKENS | No | Write refreshed tokens back to the store. | 1 |
| THREADS_DEFAULT_ACCOUNT | No | Which profile acts when a tool names none. | first configured |
| THREADS_ALLOW_DESTRUCTIVE | No | '0' blocks posting, replying and deleting. | 1 |
| THREADS_REQUEST_TIMEOUT_MS | No | Per-request deadline. | 30000 |
| THREADS_REFRESH_WINDOW_DAYS | No | Refresh this many days before expiry. | 20 |
| THREADS_CONTAINER_TIMEOUT_MS | No | How long to wait for media to process. | 120000 |
| THREADS_MIN_REQUEST_INTERVAL_MS | No | Spacing between requests. | 120 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_accountsA | Every connected Threads profile, which one acts by default, and how many days each token has left before it expires. Call this first when more than one profile might be connected. |
| whoamiA | Confirm which Threads profile the current token acts as, and return the live profile: username, name, bio, verification, and whether the profile is eligible for geo-gated posts. Use this to check credentials before anything else. |
| get_publishing_limitA | How much of the rolling 24-hour quota this profile has spent. Threads allows 250 posts, 1,000 replies and 100 deletes per 24 hours, and refuses everything once a quota is gone. Check this before a bulk run rather than discovering it halfway through. |
| refresh_tokenA | Refresh the long-lived access token, giving it another 60 days. A Threads token can be refreshed once it is 24 hours old and never after it expires, so an expired one has to be replaced by authorising again. This server refreshes automatically when a token is inside its refresh window; call this to do it now. |
| create_postA | Publish one post to Threads: creates the media container, waits for it to finish processing, then publishes. Public the moment it runs, and Threads has no edit endpoint, so this needs confirm: true. For anything over 500 characters use create_thread instead. |
| create_threadA | Publish several posts as a thread, each replying to the one before. Threads has no thread endpoint: a thread is a chain of ordinary posts, so it can half-publish. Every part is length-checked before the first one goes out, and if a later part still fails the error names exactly how far it got. Public and irreversible, so this needs confirm: true. |
| create_carouselA | Publish 2 to 20 images or videos as one carousel post. Each item is staged separately and they transcode in parallel, then a parent container binds them together. Counts as a single post against the daily quota. Public and irreversible, so this needs confirm: true. |
| stage_postA | Build a media container without publishing. Nothing appears anywhere: the container is invisible, holds for 24 hours, and is published later with publish_staged. This is the only draft state Threads has, and the right way to show a human a post before it goes public. Nothing is public, so no confirmation is needed. |
| publish_stagedA | Publish a container created by stage_post, waiting for processing first. This is what makes it public, so it needs confirm: true. |
| get_container_statusA | The processing status of a container: IN_PROGRESS, FINISHED, ERROR or EXPIRED, with the failure reason when there is one. Useful when a video is taking a long time, or to check whether a staged post is still within its 24-hour window. |
| quote_postA | Publish a post that quotes an existing Threads post. Public and irreversible, so this needs confirm: true. |
| repostA | Repost an existing Threads post to your own profile. This is visible to your followers immediately and the API has no un-repost call, so it needs confirm: true. |
| delete_postA | Permanently delete one of your own Threads posts. There is no undo, no archive, and no edit endpoint to reach for instead: replies and likes go with it. Deletions are also capped at 100 per rolling 24 hours. Needs confirm: true. |
| reply_toA | Publish a reply to a Threads post, yours or anyone's. Public the moment it runs and counted against the 1,000-reply daily quota, so it needs confirm: true. |
| get_repliesA | The direct replies to one post, one level deep. For the whole tree underneath it, including replies to replies, use get_conversation. |
| get_conversationA | Every reply under one of your posts, including replies to replies, flattened into one list with each reply naming its parent. Only works on posts you own. This is what to read before deciding what deserves an answer. |
| get_all_repliesA | Every reply you have received, newest first, across every post. This is the inbox view: use it to find what needs answering without walking each post one at a time. |
| hide_replyA | Hide a reply on one of your posts, or unhide one you hid. Hiding a top-level reply cascades to everything nested under it. Reversible in one call, so this does not need a confirmation. |
| get_pending_repliesA | Replies waiting for approval on posts published with enable_reply_approvals. They are invisible to everyone until approved. Empty unless reply approvals were switched on for the post. |
| manage_pending_replyA | Approve a reply waiting in the approval queue, making it public, or ignore it so it stays hidden. Approving is public, so it needs confirm: true. |
| get_postsA | Your own Threads posts, newest first, with ids and permalinks. The numeric id on each result is what every other tool wants: Threads has no way to convert a permalink back into an id, so this is where ids come from. |
| get_postA | One Threads post by its numeric id, with its full field set: text, media, permalink, topic tag, link attachment, quoted post and whether it has replies. |
| get_post_insightsA | Views, likes, replies, reposts, quotes and shares for one of your posts. Reply metrics count direct replies only, not the whole tree underneath. |
| get_account_insightsA | Profile-level views, likes, replies, reposts, quotes, link clicks and follower count. Data starts on 13 April 2024 and is not reliable before 1 June 2024; earlier windows return nothing. |
| get_follower_demographicsA | Follower breakdown by country, city, age or gender. One dimension per call: Threads refuses more than one breakdown at a time. Needs at least 100 followers, and ignores any date range. |
| get_top_postsA | Fetch recent posts, pull the metrics for each, and rank them. Sorting by engagement rate rather than raw likes is the point: absolute likes mostly rank posts by age, while engagement against views shows which ones landed. Costs one request per post, so keep the sample modest. |
| search_keywordA | Search public Threads posts by keyword. Capped at 2,200 queries per rolling 24 hours. Needs the threads_keyword_search permission for anything beyond your own posts. |
| search_topic_tagA | Public posts carrying a topic tag. Threads topic tags are written without a # and there is one per post, so this is an exact tag match rather than a text search. Shares the 2,200-query daily budget with search_keyword. |
| lookup_profileA | A public Threads profile by username, with its follower count and seven-day totals for views, likes, quotes and reposts. Only returns public profiles with at least 100 followers, and is capped at 1,000 lookups per rolling 24 hours. Without expanded access this is limited to Meta's own accounts. |
| list_allowlisted_countriesA | The country codes this profile may restrict a post to. Geo-gating is only enabled for some profiles; whoami reports whether this one is eligible. Read this before passing allowlisted_country_codes to create_post. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| triage-replies | Work out which Threads replies deserve an answer |
| draft-thread | Turn an idea into a Threads thread, without posting it |
| what-worked | Find out what actually performs on this profile |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| threads-accounts | |
| threads-concepts | |
| threads-output-format |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/navidmoazzez/threads-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server