Skip to content

Desearch

by Desearch-ai · remote · local (npm) · no sign-in to list tools · v0.3.3 · published by GitHub user Desearch-ai

AI search (Reddit, HN, arXiv, Wikipedia), X and web search, page extraction, X data, People Search.

Deletes · 2Final · 2Changes · 10

22 tools: 2 can delete or cancel things, 2 do something that can't be undone, 10 change things and 8 only read.

Scanned Oct 21, 2026

11 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http desearch https://mcp.desearch.ai/mcp

Findings

Matches of fixed checks, with the text they matched.

11 warn
  • The server marks "web-links-search" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "web-links-search" says "link": a word for a change.

    What this check looks for
  • The server marks "x-links-search" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-links-search" says "link": a word for a change.

    What this check looks for
  • The server marks "x-posts-by-urls" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-posts-by-urls" says "post": a word for a change.

    What this check looks for
  • The server marks "x-post-by-id" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-post-by-id" says "post": a word for a change.

    What this check looks for
  • The server marks "x-posts-by-user" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-posts-by-user" says "post": a word for a change.

    What this check looks for
  • The server marks "x-post-retweeters" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-post-retweeters" says "post": a word for a change.

    What this check looks for
Show 5 more findings
  • The server marks "x-user-posts" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-user-posts" says "post": a word for a change.

    What this check looks for
  • The server marks "x-user-replies" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-user-replies" says "reply": a word for sending, and what is sent cannot be taken back.

    What this check looks for
  • The server marks "x-post-replies" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-post-replies" says "post": a word for a change.

    What this check looks for
  • The server marks "people-search" destructive (destructiveHint: true), and its name says "search", a word for reading.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}; The name "people-search" says "search": a word for reading.

    What this check looks for
  • The server marks "people-search-control" destructive (destructiveHint: true), and its name says "search", a word for reading.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":true}; The name "people-search-control" says "search": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

22 tools

Deletes or cancels 2Claude Code: deny
  • people-search-controlPause, resume, or cancel a People Search task.1 finding

    Why it is in this group

    • The name "people-search-control" says "search": a word for reading.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Warn

      The server marks "people-search-control" destructive (destructiveHint: true), and its name says "search", a word for reading.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":true}; The name "people-search-control" says "search": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Pause, resume, or cancel a People Search task. Free. pause: a queued search pauses at once; a running one finishes its current batch first (status pausing, then paused). A search paused for more than 7 days is cancelled. resume: continues a paused search where it stopped, with no new charge. cancel: stops the search for good; you pay only for the people it already delivered and the rest of the reservation is returned. People found so far stay readable for 30 days.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
    • title: Control People Search
Can't be undone 2Claude Code: ask
  • x-post-repliesFetch replies to an X (Twitter) post, with an optional keyword query.1 finding

    Why it is in this group

    • The name "x-post-replies" says "post": a word for a change.
    • The name "x-post-replies" also says "reply": a word for sending, and what is sent cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "x-post-replies" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-post-replies" says "post": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Fetch replies to an X (Twitter) post, with an optional keyword query.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: Get X Post Replies
  • x-user-repliesFetch posts and replies by an X (Twitter) user, with an optional keyword query.1 finding

    Why it is in this group

    • The name "x-user-replies" says "reply": a word for sending, and what is sent cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "x-user-replies" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-user-replies" says "reply": a word for sending, and what is sent cannot be taken back.

      What this check looks for
    Description, as the server wrote it
    Fetch posts and replies by an X (Twitter) user, with an optional keyword query.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: Get X User Replies
Changes things 10Claude Code: ask
  • extractExtract a public URL and return its content as plain text or HTML using Desearch.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Extract a public URL and return its content as plain text or HTML using Desearch. Preferred over web-crawl for new integrations. API docs: https://www.desearch.ai/docs/api-reference/get-web-extract

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: Extract Page Content
  • people-profilesEveryone your People Searches found on one platform, one entry per person: their best-scoring result and the search that found them (found_by).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Everyone your People Searches found on one platform, one entry per person: their best-scoring result and the search that found them (found_by). Free; it does not run a new search. Search by name, handle, bio, or location with q, filter by contact channels (has), audience, fit score, location, or verification, and sort by score, recent, or audience. People from searches that ended more than 30 days ago are left out.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: List People Found
  • web-crawlCrawl a public URL and return its content as plain text or HTML on the legacy Desearch /web/crawl route.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Crawl a public URL and return its content as plain text or HTML on the legacy Desearch /web/crawl route. The SDK marks webCrawl deprecated in favor of extract; this tool stays for parity with that route. Prefer extract for new integrations. API docs: https://www.desearch.ai/docs/guide/apis/extract-api

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: Crawl Web Page (Legacy)
  • x-post-by-idFetch a single X (Twitter) post by its ID.1 finding

    Why it is in this group

    • The name "x-post-by-id" says "post": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "x-post-by-id" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-post-by-id" says "post": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Fetch a single X (Twitter) post by its ID.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: Get X Post by ID
  • x-post-retweetersList users who retweeted an X (Twitter) post.1 finding

    Why it is in this group

    • The name "x-post-retweeters" says "post": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "x-post-retweeters" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-post-retweeters" says "post": a word for a change.

      What this check looks for
    Description, as the server wrote it
    List users who retweeted an X (Twitter) post. Pass cursor to page through more users.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: List X Post Retweeters
  • x-posts-by-urlsFetch full X (Twitter) posts for a list of post URLs.1 finding

    Why it is in this group

    • The name "x-posts-by-urls" says "post": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "x-posts-by-urls" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-posts-by-urls" says "post": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Fetch full X (Twitter) posts for a list of post URLs.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: Get X Posts by URLs
  • x-posts-by-userSearch X (Twitter) posts by a specific user, with an optional keyword query.1 finding

    Why it is in this group

    • The name "x-posts-by-user" says "post": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "x-posts-by-user" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-posts-by-user" says "post": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Search X (Twitter) posts by a specific user, with an optional keyword query.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: Search X Posts by User
  • x-user-postsRetrieve a user's X (Twitter) timeline posts by username.1 finding

    Why it is in this group

    • The name "x-user-posts" says "post": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "x-user-posts" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "x-user-posts" says "post": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Retrieve a user's X (Twitter) timeline posts by username. Pass cursor to page through more posts.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: Get X User Timeline
Only reads 8Claude Code: allow
  • fetchRead a public page as text.No findings

    Why it is in this group

    • The name "fetch" says "fetch": a word for reading.
    Description, as the server wrote it
    Read a public page as text. Pass a URL returned by search.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: Fetch Page
  • people-search-statusStatus, progress, and cost of one People Search task, plus a page of the people found so far: name, handle, url, platform, audience, location, fit score, why they matched, contacts…No findings

    Why it is in this group

    • The name "people-search-status" says "search": a word for reading.
    Description, as the server wrote it
    Status, progress, and cost of one People Search task, plus a page of the people found so far: name, handle, url, platform, audience, location, fit score, why they matched, contacts, and links. Free. People arrive while the search runs: pass the returned next_cursor as cursor on the next call to get only the people found since then. When done is true and has_more is false you have everyone the search found. An ended task has completion_reason (why it stopped), coverage_limited: true when a budget stopped it before count (more people may match), and warnings such as partial_enrichment (some profiles could not be read, so those people were scored on the search hit; they show enrichment: failed). Each person has fully_verified (every criterion confirmed by their own profile or posts) and unverified_criteria (criteria that are unknown or not met, or a disqualifier that applies). These are information only: the person still qualified.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: Get People Search Status
  • people-search-tasksYour People Search tasks, newest first, with status, counts, cost, why each ended search stopped (completion_reason, coverage_limited), and the metadata labels set on people-search…No findings

    Why it is in this group

    • The name "people-search-tasks" says "search": a word for reading.
    Description, as the server wrote it
    Your People Search tasks, newest first, with status, counts, cost, why each ended search stopped (completion_reason, coverage_limited), and the metadata labels set on people-search. Free. Use it to find a task_id (filter by metadata to find the searches of one campaign), or to see which searches are still queued, running, or paused: a new search is refused while too many are active.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
    • title: List People Search Tasks

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.3.3. Values in angle brackets are yours to fill in.

claude mcp add --transport http desearch https://mcp.desearch.ai/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__desearch__ai-search",
      "mcp__desearch__x-search",
      "mcp__desearch__web-search",
      "mcp__desearch__x-trends",
      "mcp__desearch__search",
      "mcp__desearch__fetch",
      "mcp__desearch__people-search-status",
      "mcp__desearch__people-search-tasks"
    ],
    "ask": [
      "mcp__desearch__web-links-search",
      "mcp__desearch__x-links-search",
      "mcp__desearch__x-posts-by-urls",
      "mcp__desearch__x-post-by-id",
      "mcp__desearch__x-posts-by-user",
      "mcp__desearch__x-post-retweeters",
      "mcp__desearch__x-user-posts",
      "mcp__desearch__x-user-replies",
      "mcp__desearch__x-post-replies",
      "mcp__desearch__extract",
      "mcp__desearch__web-crawl",
      "mcp__desearch__people-profiles"
    ],
    "deny": [
      "mcp__desearch__people-search",
      "mcp__desearch__people-search-control"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as desearch. Review it before you use it.