Skip to main content
Glama

reddit_monitor_add

Create a Reddit monitor that watches subreddits or all of Reddit for new posts or comments matching filters and sends matches to your webhooks.

Instructions

Create a new Reddit monitor: watch one or more subreddits, or ALL of Reddit, for new posts (or comments, via kind) matching a filter, and get every match delivered to a webhook you've registered with reddit_monitor_webhook_create. Omit subreddit and set q for a sitewide keyword monitor covering every subreddit at once (posts only). By default matches go to EVERY active webhook on your account; pass webhook_ids to route this monitor's matches to only specific webhook(s). Every redditapis.com account holds a free entitlement of ONE all-of-Reddit post watch at a 60s cadence (up to 10,000 deliveries a day), so no subscription is needed to create that monitor. Naming a subreddit, matching comments, a faster cadence and any additional watch require a paid plan. Needs at least one monitor slot free (see reddit_monitor_list's slots). Forward-looking only from the moment of creation, or from baseline_item_id if given -- it never backfills posts that already existed. Returns the created monitor (with its id) on success, or subscription_required (402) if the account holds no recognised entitlement at all, subreddit_scope_requires_paid_plan (402) if a free account named a subreddit, monitor_slots_exhausted (402) if the plan's slot limit is reached, sitewide_slots_exhausted (402) if the plan's separate sitewide cap is reached, distinct_subreddit_limit_reached (402) if the account already watches as many DIFFERENT subreddits as the plan covers (the limit counts distinct subreddits across all your monitors, not monitors, and the same subreddit in two monitors counts once; see reddit_monitor_list's slots.distinct_subreddits_total), sitewide_comment_monitoring_not_available (501) if a sitewide monitor asks for comments, subreddit_reserved (400) if subreddit names 'all', subreddit_not_found (400) if a named subreddit does not exist, or webhook_not_found (400) if a webhook_ids entry is not yours.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
qNoFree-text keyword or phrase to match. Matched against the fields in `search_in` (default title+body+url). Omit to match every new post in the watched subreddits.
kindNoWhat to watch in the named subreddits: 'post' (default when omitted), 'comment', or 'both'. Comment monitoring requires a Growth, Pro or Scale plan -- on a lower tier this returns `comment_monitoring_requires_higher_tier` (402). Comments run roughly 7x the volume of posts, so expect proportionally more deliveries and check reddit_monitor_health's delivery ceiling before enabling it on a busy subreddit.
nsfwNoSet false to EXCLUDE NSFW/over-18 posts. Omitted or true both mean NSFW is allowed through -- there is no exclude-by-default; you must explicitly pass false to filter it out. POSTS ONLY: nsfw=false is REJECTED with a field-level 400 when kind is 'comment' or 'both', because Reddit flags NSFW on a post and never on an individual comment, so there is no field to filter a comment on. Run a kind='post' monitor to keep NSFW filtering, and cut unwanted comment text with exclude_terms.
groupNoOptional label to bundle multiple matches into one delivery instead of one webhook call per match. Omit for one delivery per matching item.
authorNoOnly match posts by this Reddit username (without u/).
domainNoOutbound link domains to watch for (e.g. ['example.com']). Matches the post's link URL, any URL inside a self-post/comment body, and a crosspost's original link, including one that only appeared in the original post's body. Exact-or-subdomain match only: 'example.com' matches 'blog.example.com' but never 'notexample.com'. Does NOT resolve shortened links (bit.ly, t.co).
cadence_sNoRequested poll interval in seconds. May only be SLOWER than the plan tier's floor, never faster -- a too-low value is silently clamped up to the tier's minimum. Omit to use the tier's default.
min_scoreNoOnly match posts with at least this many upvotes.
search_inNoWhich fields keyword/term matching is scoped to. Default ['title', 'body', 'url']. Narrow to avoid false positives, e.g. a term that only appears in a URL slug matching a post that never mentions it in prose. All four resolve on comments as well as posts: on a comment, 'title' matches the title of the THREAD the comment sits under (a comment has no title of its own), which also applies through the default scope and can deliver every comment under a busy matching thread. Scope to ['body'] if you only want comments that say the term themselves.
subredditNoSubreddits to watch, without the r/ prefix (e.g. ['SaaS', 'startups']). 1 to 50. OMIT this entirely (and set `q`) to watch ALL of Reddit for a keyword -- a monitor must be anchored by either a subreddit list or a keyword, never neither. Do NOT pass ['all']: r/all is Reddit's site-wide listing rather than a subreddit, so it is refused with 400 subreddit_reserved. Sitewide monitors are capped per plan tier (see reddit_monitor_list's `slots`) and cover POSTS only.
include_allNoEVERY one of these terms must appear (AND match) for the post to qualify, on top of any `q`.
include_anyNoAt least ONE of these terms must appear (OR match) for the post to qualify, on top of any `q`.
webhook_idsNoRestrict delivery to specific webhook(s) instead of every active webhook on the account. Pass id(s) from reddit_monitor_webhook_create/reddit_monitor_webhook_list. Omit (or pass an empty array) for the default: deliver to every active webhook you've registered. Every id must be a webhook you own -- returns `webhook_not_found` (400) otherwise.
exclude_termsNoPosts containing any of these terms are suppressed even if they otherwise match. Use to cut noise (e.g. exclude 'giveaway' from a brand-mention monitor).
min_relevanceNoAI relevance floor, 0-100. 0 (the default) is off. Above 0, every match is scored by a language model against this monitor's own keywords and anything below the floor is NOT delivered -- it is recorded in your delivery history with status 'suppressed' and reason 'low_relevance', carrying its score and a one-line explanation, so you can always read what was filtered and why. Nothing is silently discarded. Rough calibration: 80-100 squarely on topic, 50-79 related but peripheral, 20-49 tangential, 0-19 the keyword is used in an unrelated sense. The comparison is inclusive, so a score equal to the floor is delivered. If scoring is unavailable the match is delivered UNSCORED rather than withheld. Requires a Growth, Pro or Scale plan -- on a lower tier this returns `ai_relevance_requires_higher_tier` (402). REJECTED with a field-level 400 on a monitor that has no q, include_any or include_all, because there would be no topic to score an item against and the floor could only ever admit everything.
baseline_item_idNoA Reddit post fullname (e.g. 't3_abc123') to use as the starting point instead of 'now' -- matching starts strictly after this item. Omit to start from the moment of creation.
exclude_subredditsNoSubreddits to SUPPRESS, without the r/ prefix (e.g. ['politics', 'AskReddit']). SITEWIDE MONITORS ONLY: pass this only when you have OMITTED `subreddit` and anchored the monitor with `q`. Passing it together with `subreddit` is rejected with a field-level 400 -- a monitor that names its subreddits should drop the unwanted name from that list instead. Up to 50, matched exactly like `subreddit` so 'r/Politics', '/r/politics' and 'politics' are one entry. This is the noise control for an all-of-Reddit keyword watch: it filters DELIVERY only, so it never changes what is polled, never frees quota, and never affects matching in any other subreddit. Independent of exclude_terms -- an item is dropped if either fires.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv0.5.3

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare create semantics (readOnlyHint=false, openWorldHint=true, destructiveHint=false), so the description carries the load and does so richly: forward-looking only with no backfill, baseline_item_id as the start point, slot/entitlement accounting, and a full catalog of failure codes with HTTP statuses (402/501/400). It also states the success return value includes the monitor `id`.

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?

The size is broadly justified by 17 parameters and complex entitlement rules, and the core purpose is front-loaded. However, the dense run-on error-code chain and repeated plan/sitewide caveats make it a wall of text that could be broken into a structured list.

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?

No output schema exists, so the description must cover returns — and it does by naming the created monitor with its `id` plus the full error surface. Combined with the annotations and the exhaustive schema, an agent has everything needed to invoke this correctly.

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 and the schema already documents all 17 parameters in depth. The description adds cross-parameter meaning beyond the schema — the q/subreddit anchoring rule, the webhook_ids default-vs-restrict behavior, and slot counting semantics — though much of the per-parameter detail is duplicated in schema descriptions.

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?

States a specific verb and resource ('Create a new Reddit monitor') plus the watched surface (subreddits or all of Reddit) and match kinds (posts/comments via `kind`). It explicitly routes the agent to sibling tools (reddit_monitor_webhook_create, reddit_monitor_list), so it is distinguishable without opening another 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?

Gives explicit conditions: omit `subreddit` and set `q` for a sitewide keyword monitor, pass `webhook_ids` to target specific webhooks, omit it for the all-webhooks default. It also spells out when a plan is required, when the free entitlement suffices, and requires a free monitor slot before calling. Alternatives and prerequisites are fully named.

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