Xcatcher — Recent X Posts

Fetch recent public X/Twitter posts by named handle for monitoring, comparison, OSINT, and research.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
86%
Naming quality
98%
Poisoning risk
100%
Permission match
90%
Protocol compliance
100%

Findings (1)

  • LOWTool 'get_result_download_url' suggests web access but openWorldHint=falsein get_result_download_url

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,997Tokens (tool definitions)
~1.5 KBTypical response size
Significant attention impact (3.12% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "xcatcher": {
      "url": "https://xcatcher.top/mcp"
    }
  }
}

Remote endpoints

https://xcatcher.top/mcpstreamable-http
https://xcatcher.top/mcp/streamable-http

What it can do

Tool inventory

Tools (17)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢get_service_info

Read Xcatcher's live capabilities, prices, limits, endpoints, and recommended agent workflow. Call this first when planning a crawl or when cached documentation may be stale. No points are consumed.

Input Schema

{
  "type": "object",
  "properties": {},
  "title": "get_service_infoArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_service_infoOutput"
}
🟢preflight_crawl(users, mode)

Normalize and deduplicate X handles, validate the mode, and preview the current modeled points/USDC cost. This free read-only check requires no account, creates no quote or task, and moves no funds. Use it before requesting a live x402 payment challenge.

Input Schema

{
  "type": "object",
  "properties": {
    "users": {
      "description": "X handles, @handles, or x.com/twitter.com profile URLs.",
      "items": {
        "type": "string"
      },
      "maxItems": 500,
      "minItems": 1,
      "title": "Users",
      "type": "array"
    },
    "mode": {
      "default": "normal",
      "description": "API-key accounts use 1 point per normal handle and 10 per deep handle; direct x402 normal requests receive progressive batch pricing shown by preflight.",
      "enum": [
        "normal",
        "deep"
      ],
      "title": "Mode",
      "type": "string"
    }
  },
  "required": [
    "users"
  ],
  "title": "preflight_crawlArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "preflight_crawlOutput"
}
🟢get_sample_result

Return a stable synthetic example of Xcatcher's paginated result and coverage metadata. No live X data is fetched, no account is needed, no task or quote is created, and no funds move.

Input Schema

{
  "type": "object",
  "properties": {},
  "title": "get_sample_resultArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_sample_resultOutput"
}
🟢get_account_balance

Return the account attached to the current Bearer API key and its points balance. Use before creating a task to estimate whether an x402 top-up will be needed. Read-only.

Input Schema

{
  "type": "object",
  "properties": {},
  "title": "get_account_balanceArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_account_balanceOutput"
}
🟢list_crawl_tasks(limit, before_id)

List recent tasks owned by the current Bearer API key, newest first. Use next_before_id for cursor pagination. Read-only and does not consume points.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "default": 20,
      "description": "Tasks to return (1-100).",
      "maximum": 100,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    },
    "before_id": {
      "anyOf": [
        {
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Cursor from next_before_id; omit for the newest tasks.",
      "title": "Before Id"
    }
  },
  "title": "list_crawl_tasksArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "list_crawl_tasksOutput"
}
🟡get_x402_quote(points)

Create a short-lived USDC quote for a requested number of Xcatcher points. Returns the exact live amount and supported Base/Solana payment requirements; it does not move funds. Ask the user before signing or sending any payment.

Input Schema

{
  "type": "object",
  "properties": {
    "points": {
      "description": "Number of points to buy (1-200000). Live quote amount is authoritative.",
      "maximum": 200000,
      "minimum": 1,
      "title": "Points",
      "type": "integer"
    }
  },
  "required": [
    "points"
  ],
  "title": "get_x402_quoteArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_x402_quoteOutput"
}
🟡get_direct_crawl_payment(users, mode)

Create a request-bound x402 v2 payment requirement for an accountless crawl. Use this only for the accountless x402 path after preflight_crawl; API-key accounts use create_crawl_task instead. Normal requests use progressive batch pricing, so quote the complete deduplicated handle list together. This does not move funds. Return payment_required_b64 unchanged to an x402-compatible wallet/client; the live amount, asset, network, destination, and quoteId are authoritative.

Input Schema

{
  "type": "object",
  "properties": {
    "users": {
      "description": "X handles, @handles, or x.com/twitter.com profile URLs.",
      "items": {
        "type": "string"
      },
      "maxItems": 500,
      "minItems": 1,
      "title": "Users",
      "type": "array"
    },
    "mode": {
      "default": "normal",
      "description": "Direct x402 normal requests use progressive batch pricing; deep is $0.10 per normalized requested handle. Always preflight the complete list.",
      "enum": [
        "normal",
        "deep"
      ],
      "title": "Mode",
      "type": "string"
    }
  },
  "required": [
    "users"
  ],
  "title": "get_direct_crawl_paymentArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_direct_crawl_paymentOutput"
}
🔴submit_direct_crawl_payment(users, payment_signature_b64, mode)

Submit an x402 v2 PAYMENT-SIGNATURE for the exact users/mode used by get_direct_crawl_payment. This may settle USDC and create a crawl task. Call only after explicit spending approval. On success, securely save task_token: it grants task-scoped result access for seven days.

Input Schema

{
  "type": "object",
  "properties": {
    "users": {
      "description": "The exact handles/profile URLs used for the payment requirement.",
      "items": {
        "type": "string"
      },
      "maxItems": 500,
      "minItems": 1,
      "title": "Users",
      "type": "array"
    },
    "payment_signature_b64": {
      "description": "The base64(JSON) PAYMENT-SIGNATURE produced for the accepted x402 v2 requirement.",
      "title": "Payment Signature B64",
      "type": "string"
    },
    "mode": {
      "default": "normal",
      "description": "Must exactly match the quoted mode.",
      "enum": [
        "normal",
        "deep"
      ],
      "title": "Mode",
      "type": "string"
    }
  },
  "required": [
    "users",
    "payment_signature_b64"
  ],
  "title": "submit_direct_crawl_paymentArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "submit_direct_crawl_paymentOutput"
}
🟢get_direct_task_status(task_id, task_token)

Read an accountless paid crawl using its task_id and task-scoped token. Use this instead of get_task_status for an accountless x402 task. Poll every 5-10 seconds until task.has_result is true or it reaches failed/cancelled.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "description": "Task ID returned after x402 settlement.",
      "minimum": 1,
      "title": "Task Id",
      "type": "integer"
    },
    "task_token": {
      "description": "Task-scoped xtask_ token returned after settlement or idempotent recovery.",
      "title": "Task Token",
      "type": "string"
    }
  },
  "required": [
    "task_id",
    "task_token"
  ],
  "title": "get_direct_task_statusArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_direct_task_statusOutput"
}
🟢get_direct_result_preview(task_id, task_token, limit, offset)

Return structured JSON rows for a completed accountless paid crawl. Use this instead of get_result_preview for an accountless x402 task; API-key accounts use get_result_preview. Use offset for pagination; the task token is required and should be treated as a secret.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "description": "Completed paid task ID.",
      "minimum": 1,
      "title": "Task Id",
      "type": "integer"
    },
    "task_token": {
      "description": "Task-scoped xtask_ token.",
      "title": "Task Token",
      "type": "string"
    },
    "limit": {
      "default": 20,
      "description": "Rows to return (1-100).",
      "maximum": 100,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    },
    "offset": {
      "default": 0,
      "description": "Zero-based row offset.",
      "minimum": 0,
      "title": "Offset",
      "type": "integer"
    }
  },
  "required": [
    "task_id",
    "task_token"
  ],
  "title": "get_direct_result_previewArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_direct_result_previewOutput"
}
🔴create_crawl_task(users, mode, idempotency_key)

Create a crawl task for one or more X (Twitter) usernames. Side effects: creates a new task AND consumes points. If points are insufficient, upstream returns HTTP 402 with PAYMENT-REQUIRED (quote). This tool surfaces it as error.code=PAYMENT_REQUIRED with payment_required payload so agents can request spending approval, top up, then retry safely. Modes: - normal: Fast latest-post snapshot at scale (fresh-feed monitoring). Optimized for high-throughput batch retrieval. - deep: Deeper per-user collection/enrichment (typically slower; higher resource usage). Use when you need more than a quick latest-post snapshot. Performance note: Normal mode is optimized for a small latest-post snapshot per handle. Actual completeness and latency depend on X availability, upstream limits, and network conditions. Batching: For very large sets, split users into batches. Suggested upper bound per task: 500 users (configurable via MAX_USERS_PER_TASK). Reliability: - Use idempotency_key to make retries safe (avoid duplicate charges). - After creation, poll get_task_status every 5–10s until has_result=true. - Then call get_result_download_url (download still requires the same Bearer token).

Input Schema

{
  "type": "object",
  "properties": {
    "users": {
      "description": "Array of X usernames (handles). You may include a leading '@'.",
      "items": {
        "type": "string"
      },
      "maxItems": 500,
      "minItems": 1,
      "title": "Users",
      "type": "array"
    },
    "mode": {
      "default": "normal",
      "description": "normal = fast latest-post snapshot at scale; deep = deeper per-user collection (slower).",
      "enum": [
        "normal",
        "deep"
      ],
      "title": "Mode",
      "type": "string"
    },
    "idempotency_key": {
      "anyOf": [
        {
          "maxLength": 128,
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Optional idempotency key for safe retries (recommended for agents).",
      "title": "Idempotency Key"
    }
  },
  "required": [
    "users"
  ],
  "title": "create_crawl_taskArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "create_crawl_taskOutput"
}
🔴x402_topup(quote_id, payment_signature_b64)

Top up points for the CURRENT Bearer key using x402 proof. Inputs: - quote_id: returned by PAYMENT-REQUIRED (or /api/v1/x402/quote) - payment_signature_b64: base64(JSON) that will be passed as HTTP header PAYMENT-SIGNATURE Side effects: credits points to the same Bearer key (no key rotation). On success returns credited_points and balance_after (shape depends on upstream).

Input Schema

{
  "type": "object",
  "properties": {
    "quote_id": {
      "description": "Quote ID returned by PAYMENT-REQUIRED (or /x402/quote).",
      "title": "Quote Id",
      "type": "string"
    },
    "payment_signature_b64": {
      "description": "Base64(JSON) for header PAYMENT-SIGNATURE.",
      "title": "Payment Signature B64",
      "type": "string"
    }
  },
  "required": [
    "quote_id",
    "payment_signature_b64"
  ],
  "title": "x402_topupArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "x402_topupOutput"
}
🟢get_task_status(task_id)

Get API-key account task status by task_id (read-only); accountless x402 tasks use get_direct_task_status instead. Recommended polling interval: every 5–10 seconds until has_result=true. Returns safe structured state, result metadata, and authenticated result URLs; server filesystem paths are never exposed.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "description": "Task ID returned by create_crawl_task.",
      "minimum": 1,
      "title": "Task Id",
      "type": "integer"
    }
  },
  "required": [
    "task_id"
  ],
  "title": "get_task_statusArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_task_statusOutput"
}
🟢wait_for_task(task_id, timeout_seconds, poll_interval_seconds)

Poll a crawl task server-side until it has a result, reaches a terminal failure/cancelled state, or the bounded timeout expires. Read-only and cheaper for agent context than repeated manual polling.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "description": "Task ID returned by create_crawl_task.",
      "minimum": 1,
      "title": "Task Id",
      "type": "integer"
    },
    "timeout_seconds": {
      "default": 60,
      "description": "Maximum wait in seconds (5-120).",
      "maximum": 120,
      "minimum": 5,
      "title": "Timeout Seconds",
      "type": "integer"
    },
    "poll_interval_seconds": {
      "default": 5,
      "description": "Seconds between status checks (2-15).",
      "maximum": 15,
      "minimum": 2,
      "title": "Poll Interval Seconds",
      "type": "integer"
    }
  },
  "required": [
    "task_id"
  ],
  "title": "wait_for_taskArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "wait_for_taskOutput"
}
🟢get_result_preview(task_id, limit, offset)

Return up to 100 result rows from an API-key account task as native structured JSON for direct agent analysis; accountless x402 tasks use get_direct_result_preview instead. Use offset/next_offset for pagination; this does not download or parse XLSX. Use after has_result=true; use get_result_download_url when the complete XLSX is required. Read-only.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "description": "Completed task ID owned by the current API key.",
      "minimum": 1,
      "title": "Task Id",
      "type": "integer"
    },
    "limit": {
      "default": 20,
      "description": "Maximum result rows to return (1-100).",
      "maximum": 100,
      "minimum": 1,
      "title": "Limit",
      "type": "integer"
    },
    "offset": {
      "default": 0,
      "description": "Zero-based row offset for pagination.",
      "minimum": 0,
      "title": "Offset",
      "type": "integer"
    }
  },
  "required": [
    "task_id"
  ],
  "title": "get_result_previewArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_result_previewOutput"
}
🟢get_result_download_url(task_id)

Get an absolute download URL for a task result (read-only). If the task is not finished, returns ok=false with code=RESULT_NOT_READY (HTTP 409). Downloading the URL requires the same Authorization: Bearer token.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "description": "Task ID. Must be completed (has_result=true).",
      "minimum": 1,
      "title": "Task Id",
      "type": "integer"
    }
  },
  "required": [
    "task_id"
  ],
  "title": "get_result_download_urlArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "get_result_download_urlOutput"
}
🔴cancel_task(task_id)

Cancel a queued task by task_id. Side effects: changes task state. Xcatcher refunds cost_points when a queued task is successfully cancelled.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "description": "Task ID to cancel.",
      "minimum": 1,
      "title": "Task Id",
      "type": "integer"
    }
  },
  "required": [
    "task_id"
  ],
  "title": "cancel_taskArguments"
}

Output Schema

{
  "type": "object",
  "properties": {
    "result": {
      "additionalProperties": true,
      "title": "Result",
      "type": "object"
    }
  },
  "required": [
    "result"
  ],
  "title": "cancel_taskOutput"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools
verifiedversion not recorded17 tools