{
  "serverInfo": {
    "name": "scrapersocial-threads",
    "title": "Threads data via ScraperSocial",
    "version": "1.0.0",
    "websiteUrl": "https://scrapersocial.com/mcp/?utm_source=server-card&spoke=threads",
    "description": "Public Threads data as JSON tools: post stats, profiles, account posts, keyword search. 5 Threads endpoints reachable by path. 100 free credits.",
    "iconUrl": "https://scrapersocial.com/icon-512.png",
    "icons": [
      {
        "src": "https://scrapersocial.com/icon-512.png",
        "mimeType": "image/png",
        "sizes": [
          "512x512"
        ]
      },
      {
        "src": "https://scrapersocial.com/icon-128.png",
        "mimeType": "image/png",
        "sizes": [
          "128x128"
        ]
      }
    ],
    "documentationUrl": "https://scrapersocial.com/ai-agents/",
    "privacyPolicyUrl": "https://scrapersocial.com/privacy/",
    "termsOfServiceUrl": "https://scrapersocial.com/terms/",
    "supportEmail": "support@scrapersocial.com"
  },
  "transport": {
    "type": "streamable-http",
    "endpoint": "https://mcp.scrapersocial.com/threads"
  },
  "protocolVersion": "2025-06-18",
  "capabilities": {
    "tools": {
      "listChanged": false
    }
  },
  "coverage": {
    "endpoints": 5,
    "platforms": [
      "threads"
    ]
  },
  "tools": [
    {
      "name": "get_post_stats",
      "title": "Get post engagement stats",
      "description": "Engagement stats for one public post or video: views, likes, comments, shares and reposts where the platform publishes them. Threads only. Credits: 3 per call. Input: url.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "Full public URL of the post, video, profile or page."
          }
        },
        "required": [
          "url"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "description": "The endpoint's payload: one object, or an array for list calls."
          },
          "meta": {
            "type": "object",
            "description": "count, limit and next_cursor on list calls; credits_charged, credits_remaining and cache (hit or miss) on billed calls; limit_clamped when fewer items were requested upstream than asked for."
          },
          "request_id": {
            "type": "string"
          }
        },
        "required": [
          "data"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "get_profile",
      "title": "Get an account profile",
      "description": "Profile, page or channel record for a public account: follower and subscriber counts, bio, and totals. Threads only. Credits: 4 per call. Input: handle.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "handle": {
            "type": "string",
            "description": "Account handle, without the @."
          }
        },
        "required": [
          "handle"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "description": "The endpoint's payload: one object, or an array for list calls."
          },
          "meta": {
            "type": "object",
            "description": "count, limit and next_cursor on list calls; credits_charged, credits_remaining and cache (hit or miss) on billed calls; limit_clamped when fewer items were requested upstream than asked for."
          },
          "request_id": {
            "type": "string"
          }
        },
        "required": [
          "data"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "get_channel_posts",
      "title": "List an account's posts",
      "description": "Recent public posts or videos from one account, with per-item metrics. Threads only. Credits: 3 per item returned, with a minimum of 1 credit per successful call, so an empty result still costs 1. Input: handle.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "handle": {
            "type": "string",
            "description": "Account handle, without the @."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20,
            "description": "Items to return, up to 50; a larger value is lowered to 50. Credits are charged per item returned, with a minimum of 1 credit per successful call, so an empty result still costs 1."
          },
          "cursor": {
            "type": "string",
            "description": "next_cursor from a previous call's meta."
          }
        },
        "required": [
          "handle"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "description": "The endpoint's payload: one object, or an array for list calls."
          },
          "meta": {
            "type": "object",
            "description": "count, limit and next_cursor on list calls; credits_charged, credits_remaining and cache (hit or miss) on billed calls; limit_clamped when fewer items were requested upstream than asked for."
          },
          "request_id": {
            "type": "string"
          }
        },
        "required": [
          "data"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "search",
      "title": "Search a platform",
      "description": "Keyword search over one platform's public content. Threads only. Credits: 4 per item returned, with a minimum of 1 credit per successful call, so an empty result still costs 1. Input: query.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "minLength": 1,
            "description": "Search keywords."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20,
            "description": "Items to return, up to 50; a larger value is lowered to 50. Credits are charged per item returned, with a minimum of 1 credit per successful call, so an empty result still costs 1."
          },
          "cursor": {
            "type": "string",
            "description": "next_cursor from a previous call's meta."
          }
        },
        "required": [
          "query"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "description": "The endpoint's payload: one object, or an array for list calls."
          },
          "meta": {
            "type": "object",
            "description": "count, limit and next_cursor on list calls; credits_charged, credits_remaining and cache (hit or miss) on billed calls; limit_clamped when fewer items were requested upstream than asked for."
          },
          "request_id": {
            "type": "string"
          }
        },
        "required": [
          "data"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "list_endpoints",
      "title": "List every Threads endpoint",
      "description": "Discover every Threads endpoint that can serve right now, with its path, what it takes as input, what one credit buys, and whether it paginates. Free — this reads our registry and calls nothing upstream. Use it to find the endpoint for anything the other tools do not cover, then call it with call_endpoint.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "q": {
            "type": "string",
            "description": "Substring match over the endpoint path, e.g. 'search' or 'profile'."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 500,
            "description": "Rows to return. Defaults to every endpoint that matched; lower it, or filter by platform, only if you want a smaller response."
          }
        },
        "required": []
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "description": "The endpoint's payload: one object, or an array for list calls."
          },
          "meta": {
            "type": "object",
            "description": "count, limit and next_cursor on list calls; credits_charged, credits_remaining and cache (hit or miss) on billed calls; limit_clamped when fewer items were requested upstream than asked for."
          },
          "request_id": {
            "type": "string"
          }
        },
        "required": [
          "data"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "call_endpoint",
      "title": "Call any Threads endpoint by path",
      "description": "Call any Threads endpoint from list_endpoints by its path under /v1/threads/. This reaches everything Threads offers, including what the capability tools above do not wrap; a path on another platform is refused. Pass only the parameters that endpoint accepts; list_endpoints reports which one it needs.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "description": "Endpoint path exactly as list_endpoints reports it, starting with /v1/threads/."
          },
          "url": {
            "type": "string",
            "description": "For endpoints whose input is a URL."
          },
          "handle": {
            "type": "string",
            "description": "For endpoints whose input is a handle. Usually an account handle without the @; list_endpoints reports handle_is on the endpoints where it identifies something else."
          },
          "query": {
            "type": "string",
            "description": "For search endpoints."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "description": "Items to return on list endpoints, up to 50; a larger value is lowered to 50. Charged per item returned, with a minimum of 1 credit per successful call, so an empty result still costs 1."
          },
          "cursor": {
            "type": "string",
            "description": "next_cursor from a previous call."
          },
          "fields": {
            "type": "string",
            "description": "Comma-separated field projection, to trim the response."
          },
          "include_email": {
            "type": [
              "boolean",
              "string"
            ],
            "enum": [
              true,
              "true",
              false,
              "false"
            ],
            "description": "Only on endpoints that price an email separately."
          },
          "fresh": {
            "type": [
              "boolean",
              "string"
            ],
            "enum": [
              true,
              "true",
              false,
              "false"
            ],
            "description": "Bypass the cache. Same credit cost, slower."
          }
        },
        "required": [
          "path"
        ]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "data": {
            "description": "The endpoint's payload: one object, or an array for list calls."
          },
          "meta": {
            "type": "object",
            "description": "count, limit and next_cursor on list calls; credits_charged, credits_remaining and cache (hit or miss) on billed calls; limit_clamped when fewer items were requested upstream than asked for."
          },
          "request_id": {
            "type": "string"
          }
        },
        "required": [
          "data"
        ]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    }
  ],
  "authentication": {
    "oauth2": {
      "authorization_url": "https://api.scrapersocial.com/oauth/authorize",
      "token_url": "https://api.scrapersocial.com/oauth/token",
      "registration_url": "https://api.scrapersocial.com/oauth/register",
      "scopes": [
        "mcp:access"
      ],
      "pkce_required": true,
      "resource": "https://mcp.scrapersocial.com/threads",
      "resource_metadata": "https://mcp.scrapersocial.com/.well-known/oauth-protected-resource/threads"
    },
    "bearer": {
      "format": "Bearer sk_live_<32 char base64url>",
      "signup_url": "https://scrapersocial.com/signup",
      "management_url": "https://scrapersocial.com/app/keys"
    }
  },
  "documentation": {
    "guide": "https://scrapersocial.com/ai-agents/",
    "rest": "https://scrapersocial.com/openapi.json",
    "agents": "https://scrapersocial.com/mcp/"
  },
  "publisher": {
    "name": "ScraperSocial",
    "email": "support@scrapersocial.com"
  },
  "hub": {
    "name": "scrapersocial",
    "endpoint": "https://mcp.scrapersocial.com",
    "server_card": "https://scrapersocial.com/.well-known/mcp/server-card.json"
  }
}
