Skip to main content
Glama
CrawlForge MCP Server

CrawlForge MCP Server

reddit_search

Read-onlyIdempotent

Use this to search Reddit posts or comments, or read a full comment thread - reddit.com blocks direct scraping, so this reads the Arctic Shift community archive instead (free, no Reddit credentials).

Instructions

Use this to search Reddit posts or comments, or read a full comment thread - reddit.com blocks direct scraping, so this reads the Arctic Shift community archive instead (free, no Reddit credentials). Modes: 'posts' (default) and 'comments' search; 'thread' returns a post plus its nested comment tree by link_id. A subreddit/author-scoped search queries the archive directly. A keyword search across ALL of Reddit finds posts with a site-restricted web search and then reads those posts from the archive, because Arctic Shift can only keyword-search within a scope; results come back as real archive rows, ordered by search relevance. An unscoped COMMENT search discovers posts the same way and then searches each post's comments for the keywords. A scoped comment search Arctic Shift times out on is retried over narrower windows (7d, 3d, 1d) and reports window_applied. Arctic Shift is tried first and the PullPush archive second for posts/comments searches (fallback_used says so; PullPush has refused automated clients since August 2026). Not for reddit.com URLs via scrape or fetch_url (blocked) - use mode:'thread' with the post's link_id. Cost: 5 credits. Example: reddit_search({query: "best mechanical keyboard", subreddit: "MechanicalKeyboards", limit: 10})

Input Schema

NameRequiredDescriptionDefault
modeNoWhat to search: posts (default), comments, or thread (full comment tree — requires link_id)
sortNoSort by post date (default desc = newest first)
afterNoOnly content posted after this date — ISO 8601, epoch seconds, or an offset like '7d'
limitNoMax results (default 25; thread mode: max comments returned)
queryNoKeyword search. Posts: matches title+selftext; comments: matches body. Supports "quoted phrases", OR, -exclusion
authorNoLimit to one author (with or without the u/ prefix)
beforeNoOnly content posted before this date — same formats as after
sourceNoBackend: auto routes + falls back (default). web_discovery serves only unscoped keyword searches (web search finds the posts, the archive supplies the rows). reddit_api uses the official Reddit Data API — only when REDDIT_CLIENT_ID/REDDIT_CLIENT_SECRET are set; serves posts/thread, not comment search
link_idNoPost ID (e.g. '1twm1zh' or 't3_1twm1zh') — required for thread mode, optional filter for comments mode
subredditNoLimit to one subreddit (with or without the r/ prefix)

Output Schema

NameRequiredDescriptionDefault
modeNo
postNothread mode: the post itself
_costNoCost-transparency metadata (D3.5): what this call was projected to cost and what it was charged
cacheNoPage cache: whether this call reused a copy of the page fetched earlier in the session
countNo
notesNoData-provenance caveats (archive freshness, coverage gaps)
queryNo
authorNo
sourceNoWhich backend served this result — an archive, or web discovery (site-restricted web search hydrated from the archive) for Reddit-wide keyword search
link_idNoPresent in thread mode
resultsNoposts/comments modes
commentsNothread mode: nested comment tree ({...comment, replies:[...]}); a collapsed branch appears as a {more_count, more_ids} stub, where more_count is how many comments it hides, replies included, and more_ids lists only the hidden direct replies, so more_ids can be shorter than more_count
checkedAtNo
next_stepNoFailed calls only: the tool or fix to try next
subredditNo
discoveredNoweb_discovery: how many post ids the site-restricted web search surfaced before archive hydration
comment_countNothread mode: comments in `comments` at every depth, stubs excluded; at most limit
fallback_usedNoPresent when the primary archive failed and the fallback served the result
posts_searchedNoweb_discovery comments mode: how many discovered posts had their comments searched before limit was reached
window_appliedNoarctic_shift comments mode: the after-window ("7d"/"3d"/"1d") the search was narrowed to after the full-history search timed out; absent when the caller set after or no narrowing was needed
comments_collapsedNothread mode: the sum of every stub's more_count, i.e. comments the source holds for this thread that the response leaves out. comment_count + comments_collapsed is what the source holds; post.num_comments is Reddit's own total from when the post was read, so it can be higher (deleted, removed or not yet archived comments) or lower (comments made after that read)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv6.24.0
    • changedOutput schema / properties / _cost / description
      Previous value: -"Cost-transparency metadata (D3.5), present when injected into the text copy of the result"New value: +"Cost-transparency metadata (D3.5): what this call was projected to cost and what it was charged"
    • changedOutput schema / properties / _cost / properties / actual / description
      Previous value: -"Credits actually charged (0 in creator mode, half-rate on error)"New value: +"Credits actually charged (0 in creator mode, and 0 for a failed call)"
    • addedOutput schema / properties / cache
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Page cache: whether this call reused a copy of the page fetched earlier in the session",
      +  "properties": {
      +    "ageMs": {
      +      "description": "Age of that copy in ms",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "fetchedAt": {
      +      "description": "When the oldest page used was fetched (ISO 8601)",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "note": {
      +      "description": "Hits only: how old the copy is and how to force a fresh fetch",
      +      "type": "string"
      +    },
      +    "state": {
      +      "description": "hit: every page came from this session's copy; bypass: fetched fresh on request (maxAge 0) or not cacheable; miss: fetched",
      +      "enum": [
      +        "hit",
      +        "miss",
      +        "bypass"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / next_step
      Added value: +{
      +  "description": "Failed calls only: the tool or fix to try next",
      +  "type": "string"
      +}
  2. Changed3 schema fields changedv6.19.2
    • addedOutput schema / properties / comment_count / description
      Added value: +"thread mode: comments in `comments` at every depth, stubs excluded; at most limit"
    • changedOutput schema / properties / comments / description
      Previous value: -"thread mode: nested comment tree ({...comment, replies:[...]}); collapsed branches appear as {more_count, more_ids}"New value: +"thread mode: nested comment tree ({...comment, replies:[...]}); a collapsed branch appears as a {more_count, more_ids} stub, where more_count is how many comments it hides, replies included, and more_ids lists only the hidden direct replies, so more_ids can be shorter than more_count"
    • addedOutput schema / properties / comments_collapsed
      Added value: +{
      +  "description": "thread mode: the sum of every stub's more_count, i.e. comments the source holds for this thread that the response leaves out. comment_count + comments_collapsed is what the source holds; post.num_comments is Reddit's own total from when the post was read, so it can be higher (deleted, removed or not yet archived comments) or lower (comments made after that read)",
      +  "type": "number"
      +}
  3. Changed4 schema fields changedv6.0.0
    • removedInput schema / additionalProperties
      Removed value: -false
    • changedOutput schema / properties / _cost / additionalProperties
      Previous value: -trueNew value: +{}
    • changedOutput schema / properties / post / anyOf
      Previous value: -[
      -  {
      -    "$ref": "#/properties/results/items/anyOf/0"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "author": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "created_iso": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "created_utc": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "id": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "num_comments": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "permalink": {
      +        "description": "Full reddit.com URL of the post",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "score": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "selftext": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "selftext_truncated": {
      +        "type": "boolean"
      +      },
      +      "subreddit": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "title": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "url": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / results / items / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "properties": {
      -      "author": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "created_iso": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "created_utc": {
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "id": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "num_comments": {
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "permalink": {
      -        "description": "Full reddit.com URL of the post",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "score": {
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "selftext": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "selftext_truncated": {
      -        "type": "boolean"
      -      },
      -      "subreddit": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "title": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "url": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "properties": {
      -      "author": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "body": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "body_truncated": {
      -        "type": "boolean"
      -      },
      -      "created_iso": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "created_utc": {
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "id": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "link_id": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "parent_id": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "permalink": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "score": {
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "subreddit": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "author": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "created_iso": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "created_utc": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "id": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "num_comments": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "permalink": {
      +        "description": "Full reddit.com URL of the post",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "score": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "selftext": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "selftext_truncated": {
      +        "type": "boolean"
      +      },
      +      "subreddit": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "title": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "url": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "author": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "body": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "body_truncated": {
      +        "type": "boolean"
      +      },
      +      "created_iso": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "created_utc": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "id": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "link_id": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "parent_id": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "permalink": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "score": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "subreddit": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  }
      +]
  4. Changed5 schema fields changedv5.6.6
    • changedInput schema / properties / source / description
      Previous value: -"Backend: auto routes + falls back (default). reddit_api uses the official Reddit Data API — only when REDDIT_CLIENT_ID/REDDIT_CLIENT_SECRET are set; serves posts/thread, not comment search"New value: +"Backend: auto routes + falls back (default). web_discovery serves only unscoped keyword searches (web search finds the posts, the archive supplies the rows). reddit_api uses the official Reddit Data API — only when REDDIT_CLIENT_ID/REDDIT_CLIENT_SECRET are set; serves posts/thread, not comment search"
    • changedInput schema / properties / source / enum
      Previous value: -[
      -  "auto",
      -  "arctic_shift",
      -  "pullpush",
      -  "reddit_api"
      -]New value: +[
      +  "auto",
      +  "arctic_shift",
      +  "pullpush",
      +  "reddit_api",
      +  "web_discovery"
      +]
    • addedOutput schema / properties / discovered
      Added value: +{
      +  "description": "web_discovery: how many post ids the site-restricted web search surfaced before archive hydration",
      +  "type": "number"
      +}
    • addedOutput schema / properties / posts_searched
      Added value: +{
      +  "description": "web_discovery comments mode: how many discovered posts had their comments searched before limit was reached",
      +  "type": "number"
      +}
    • addedOutput schema / properties / window_applied
      Added value: +{
      +  "description": "arctic_shift comments mode: the after-window (\"7d\"/\"3d\"/\"1d\") the search was narrowed to after the full-history search timed out; absent when the caller set after or no narrowing was needed",
      +  "type": "string"
      +}
  5. Addedv5.1.0

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the read-only/idempotent annotations: it discloses the cost (5 credits), backend order and fallback (Arctic Shift then PullPush), the PullPush refusal, timeouts with narrowed retry windows, and the window_applied/fallback_used reporting fields. The one gap is pagination/cursor behavior for large result sets, but overall this is unusually transparent for a search tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the key exclusion are front-loaded, and the mode/fallback details follow in a logical order. It is dense and long for a search tool, with some near-duplication between the fallback sentence and the source enum text, but nearly every clause carries operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, multi-mode tool with three backends, the description covers everything an agent needs to call it correctly: mode selection, credential-free access, cost, routing/fallback outcomes, and the correct alternative path for URLs. Return shape is covered by the output schema, so no further detail is required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns above that by explaining mode-dependent semantics the schema only hints at — how scoped vs. unscoped keyword searches execute differently, and what 'thread' returns (post plus nested comment tree). It does not restate every parameter, but the mode behavior it adds is genuinely load-bearing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states the specific verb and resources (search Reddit posts/comments, read a full comment thread) and explains the mechanism (Arctic Shift archive rather than scraping). An agent can distinguish it from scrape/fetch_url without inspecting the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the wrong path ('Not for reddit.com URLs via scrape or fetch_url (blocked)') and gives the correct alternative ('use mode:'thread' with the post's link_id'). It also explains which mode to pick for scoped vs. unscoped searches, so the selection logic is spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.