Skip to main content
Glama
threads-mcp

threads-mcp

threads-mcp

A Model Context Protocol (MCP) server for the Threads API. Exposes 26 tools covering profile management, content reading, publishing, replies, and discovery.


Quick Start

1. Get a Threads Access Token

You can start using Threads API immediately for your own account via the Threads Tester — no App Review required for self-use.

  1. Go to developers.facebook.com/tools/explorer

  2. Select your Threads App from the app dropdown (or create one at developers.facebook.com/apps with the Threads product)

  3. In the Threads Tester, generate a short-lived token

  4. To get a long-lived token (60 days), call:

curl "https://graph.threads.net/access_token?grant_type=th_exchange_token&client_id=YOUR_APP_ID&client_secret=YOUR_APP_SECRET&access_token=SHORT_LIVED_TOKEN"
  1. To refresh a long-lived token before it expires:

curl "https://graph.threads.net/refresh_access_token?grant_type=th_refresh_token&access_token=LONG_LIVED_TOKEN"

Note: Long-lived tokens expire after 60 days. Refresh them at least once per 60 days. There is no refresh token — you must always refresh before expiry.

2. Set Environment Variables

export THREADS_ACCESS_TOKEN=your_access_token_here

# Optional: skip the GET /me call at startup by providing your user ID directly
export THREADS_USER_ID=your_threads_user_id

3. Run the Server

# Install globally
npm install -g threads-mcp

# Or run directly
npx threads-mcp

Or build from source:

git clone https://github.com/your-repo/threads-mcp
cd threads-mcp
pnpm install
pnpm build
THREADS_ACCESS_TOKEN=your_token node dist/index.js

Related MCP server: meta-threads-mcp

Claude Desktop Configuration

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "threads": {
      "command": "npx",
      "args": ["-y", "threads-mcp"],
      "env": {
        "THREADS_ACCESS_TOKEN": "your_access_token_here"
      }
    }
  }
}

Or if installed globally:

{
  "mcpServers": {
    "threads": {
      "command": "threads-mcp",
      "env": {
        "THREADS_ACCESS_TOKEN": "your_access_token_here",
        "THREADS_USER_ID": "your_user_id_optional"
      }
    }
  }
}

Cursor Configuration

Add to .cursor/mcp.json in your project root, or ~/.cursor/mcp.json globally:

{
  "mcpServers": {
    "threads": {
      "command": "npx",
      "args": ["-y", "threads-mcp"],
      "env": {
        "THREADS_ACCESS_TOKEN": "your_access_token_here"
      }
    }
  }
}

Tools Reference

Profile Tools

Tool

Description

Required Permission

get_profile

Get your Threads profile (username, bio, follower count)

threads_basic

get_publishing_limit

Check remaining publishing quota (250 posts/24h)

threads_content_publish

get_account_insights

Account-level analytics (views, likes, followers)

threads_read_replies or threads_manage_insights

Content Tools

Tool

Description

Required Permission

list_my_threads

Paginated list of your posts

threads_basic

list_my_replies

Paginated list of your replies

threads_basic

get_thread

Get details of a specific post

threads_basic

get_thread_insights

Engagement metrics for a post

threads_manage_insights

get_mentions

Posts where you've been @mentioned

threads_basic

Publishing Tools

Tool

Description

Required Permission

create_text_post

Create/publish a text post

threads_content_publish

create_image_post

Create/publish a post with an image

threads_content_publish

create_video_post

Create a video post container

threads_content_publish

create_carousel_post

Create a multi-media carousel post

threads_content_publish

publish_thread

Publish a container created with publish:false

threads_content_publish

get_container_status

Check if a video container finished processing

threads_content_publish

delete_thread

Delete one of your posts

threads_content_publish

repost_thread

Repost another user's thread

threads_content_publish

quote_thread

Quote-post another thread with your commentary

threads_content_publish

Replies Tools

Tool

Description

Required Permission

get_replies

Get direct replies to a post

threads_read_replies

get_conversation

Get full conversation thread

threads_read_replies

reply_to_thread

Post a reply to a thread

threads_content_publish

manage_reply

Hide or unhide a reply on your posts

threads_manage_replies

Discovery Tools

Tool

Description

Required Permission

search_keyword

Search posts by keyword

threads_keyword_search ⚠️

lookup_profile

Look up a user profile by username

threads_profile_discovery ⚠️

list_profile_posts

List posts from any public user

threads_basic

search_locations

Search for location tags

threads_basic

get_location

Get details about a location

threads_basic

⚠️ App Review required for threads_keyword_search and threads_profile_discovery. These permissions require Meta's App Review process before they can be used in production. For self-use development, you may be able to use them in Development mode with your own account only.


Publishing Workflow

Text Post (simplest)

Tool: create_text_post
  text: "Hello, Threads!"
  publish: true   ← publishes immediately

Video Post (requires polling)

1. Tool: create_video_post
   video_url: "https://..."
   publish: false  ← don't auto-publish; get container ID

2. Tool: get_container_status
   container_id: "from step 1"
   → poll until status = FINISHED

3. Tool: publish_thread
   container_id: "from step 1"

Carousel Post

1. Tool: create_carousel_post
   items: [{type: IMAGE, url: "..."}, {type: IMAGE, url: "..."}]
   publish: true  ← auto-publish carousel

Rate Limits

  • Publishing: 250 posts per 24 hours (use get_publishing_limit to check)

  • API rate limits: Follow standard Meta API rate limits (~200 calls/hour per user for most endpoints)

  • Video processing: Videos typically take 10–30 seconds; poll with get_container_status


Security

  • The THREADS_ACCESS_TOKEN is never logged or included in tool responses

  • All outgoing URLs with the token are built internally and never surfaced to the MCP layer

  • Error messages from the API that may reference the token URL are automatically redacted


Development

pnpm install
pnpm test           # run all tests
pnpm test:watch     # watch mode
pnpm typecheck      # TypeScript check
pnpm build          # build dist/

Running locally

THREADS_ACCESS_TOKEN=your_token pnpm build && node dist/index.js

Verify tool count

echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
  | THREADS_ACCESS_TOKEN=test node dist/index.js 2>/dev/null \
  | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d['result']['tools']), 'tools')"

Available Tools

26 tools
create_carousel_postA

Create a carousel post with multiple images or videos. Set publish:true to immediately publish after container creation.

Inputs: items (required), text, publish, reply_control.

create_image_postC

Create a Threads post with an image. Set publish:true to immediately publish.

Inputs: image_url (required), text, publish, reply_control, +1 more.

create_text_postA

Create a text-only Threads post. Set publish:true to immediately publish, or false to get a container_id for later publishing.

Inputs: text (required), publish, reply_control, reply_to_id.

create_video_postA

Create a Threads post with a video. Videos require processing time — use get_container_status to check readiness, then publish_thread when FINISHED.

Inputs: video_url (required), text, publish, reply_control, +1 more.

delete_threadB

Delete a Threads post by ID

Inputs: thread_id (required).

get_account_insightsB

Get insights/analytics for the authenticated user's Threads account

Inputs: metric (required), period (required), breakdown, since, +1 more.

get_container_statusB

Check the processing status of a media container (useful for videos)

Inputs: container_id (required).

get_conversationA

Get the full conversation thread (all replies at any level) for a Threads post

Inputs: thread_id (required), fields, limit, after.

get_locationA

Get details about a specific location tag by its ID

Inputs: location_id (required), fields.

get_mentionsA

Get threads where the authenticated user has been @mentioned

Inputs: fields, limit, after.

get_profileB

Get the authenticated user's Threads profile information

Inputs: fields, user_id.

get_publishing_limitB

Get the current publishing quota usage and limits for the authenticated user

Inputs: fields.

get_repliesC

Get direct replies to a specific Threads post

Inputs: thread_id (required), fields, limit, after, +1 more.

get_threadB

Get details of a specific Threads post by ID

Inputs: thread_id (required), fields.

get_thread_insightsC

Get engagement insights for a specific Threads post

Inputs: thread_id (required), metric (required).

list_my_repliesB

List all replies made by the authenticated user

Inputs: fields, limit, after, before.

list_my_threadsB

List all Threads posts by the authenticated user

Inputs: fields, limit, after, before.

list_profile_postsC

List public Threads posts from a specific user by their user ID

Inputs: user_id (required), fields, limit, after, +1 more.

lookup_profileA

Look up a Threads user profile by username. Requires threads_profile_discovery permission.

Inputs: username (required), fields.

manage_replyB

Hide or unhide a reply on the authenticated user's threads

Inputs: thread_id (required), hide (required).

publish_threadA

Publish a previously created media container. Use after create_*_post with publish:false, or after a video finishes processing.

Inputs: container_id (required).

quote_threadB

Create a quote post that references another thread

Inputs: thread_id (required), text, publish, reply_control.

reply_to_threadA

Post a reply to a Threads post. Creates and immediately publishes a text reply.

Inputs: thread_id (required), text (required), reply_control.

repost_threadB

Repost (share) a Threads post from another user

Inputs: thread_id (required).

search_keywordB

Search Threads posts by keyword. Requires threads_keyword_search permission.

Inputs: q (required), search_type, search_mode, fields, +2 more.

search_locationsA

Search for location tags that can be attached to Threads posts

Inputs: q (required), limit.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 26 tools

    Disambiguation5/5

    Each tool targets a distinct action and resource, with clear descriptions that differentiate overlapping concepts like get_thread vs get_conversation vs get_replies. No two tools are easily confused.

    Naming Consistency5/5

    All tools follow a consistent verb_noun pattern in snake_case (e.g., create_text_post, get_thread_insights). No mixing of styles or ambiguous verbs.

    Tool Count4/5

    With 26 tools, the set is on the higher end but each tool serves a specific and necessary function for the Threads API, covering posting, reading, searching, analytics, and moderation without unnecessary redundancy.

    Completeness4/5

    The tool surface covers core CRUD and lifecycle operations for posts, plus searching and analytics. A notable gap is the lack of an update/edit tool for posts, but most workflows are supported.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Unofficial MCP server for Meta's Threads API. Enables LLMs like Claude to publish posts, manage replies, and track insights through the Model Context Protocol.
      15
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      An MCP server for Meta's Threads that acts as your own account, enabling reading profiles, posts, replies, timeline, search, and performing actions like posting, replying, liking, following, and scheduling, using a real logged-in browser session.
      24
      15 npm
      3
      MIT