mcp-server-reddit-ads
Integrates with the Reddit Ads API v3 to provide tools for managing advertising campaigns, ad groups, ads, performance reports, and account settings, with tiered write safety controls for pausing, creating, budget and bid changes, targeting edits, and copying ads between ad groups.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-server-reddit-adsshow my campaigns last 7 days"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Server for Reddit Ads (mcp-server-reddit-ads)
A Reddit Ads API v3 MCP server with working write operations and tiered safety controls, built and dogfooded by an actual Reddit advertiser. It gives an MCP client read access to campaigns, ad groups, ads, and performance reports, plus gated write tools for pausing, creating, budget and bid changes, targeting edits, and copying ads between ad groups.
Requirements
A Reddit Ads account, with business-admin access so you can register an app.
Node.js 20 or newer.
An MCP client (Claude Code, Claude Desktop, or any other).
Related MCP server: Reddit Ads MCP Server
Getting started
Pick the path that matches your setup: a paste-one-prompt route for Claude Code or Claude Desktop, or the manual steps for any other client. Every path installs read-only and cannot change anything in your account until you deliberately turn on writes (the last step).
Simple setup with Claude Code (recommended)
If you use Claude Code, let it do the mechanical work. Copy this whole prompt and paste it into Claude Code:
Set up the mcp-server-reddit-ads MCP server for me so I can manage my Reddit Ads
account from here. Install it read-only for now - no write access. Please:
1. Read the setup instructions at https://github.com/camlowe/mcp-server-reddit-ads
2. Check I'm on Node.js 20 or newer.
3. Walk me through registering a Reddit app, since only I can do that part. Tell me
exactly where to click and which two values (client ID and client secret) to copy.
4. Run `npx mcp-server-reddit-ads auth` and guide me through the browser login.
5. Add the server to my .mcp.json using the credentials from the auth step, with the
write tier set to read-only.
6. Confirm the server loads and list my Reddit ad accounts to prove it works.
Do not enable any write access yet. I'll ask for that later when I'm ready.Claude reads this README, tells you exactly what to do for the parts only you can do, runs npx mcp-server-reddit-ads auth, writes your .mcp.json, and confirms the server loads. Later, when you want to make changes, just ask it to raise the write tier.
Simple setup with Claude Desktop
Claude Desktop can't run terminal commands for you, so this prompt has it act as a patient guide while you run one command and edit one config file. Paste it into a new Claude Desktop chat:
I want to set up the mcp-server-reddit-ads MCP server so I can manage my Reddit Ads
account with you. I'm not a developer, so please guide me one step at a time with
simple, copy-pasteable instructions, and wait for me to confirm each step before
moving to the next.
Look up the setup details at https://github.com/camlowe/mcp-server-reddit-ads. The
main steps are: register a Reddit app to get a client ID and secret, run a one-time
`npx mcp-server-reddit-ads auth` command in my terminal to log in, and add the server
to my Claude Desktop config file. Set it up read-only so nothing in my account can
change until I decide to turn writes on.Either way, you still register the Reddit app (step 1 below) and approve the browser login yourself - those cannot be automated.
Advanced setup (manual)
The full process, for other MCP clients or if you prefer to do it by hand. It takes about five minutes.
1. Register a Reddit app
Open the Reddit Ads dashboard at ads.reddit.com and sign in with an account that has business-admin access.
Open Business settings (the gear / settings menu, top right), then Developer Applications, then Create App.
Give the app a name, set the redirect URI to exactly
http://localhost:8080, and choose a primary contact (a business admin). Save it.
Reddit then shows the two values you need in step 2:
Client ID - the short string (roughly 22 characters, for example
Ab3xK9zQ1rStUvWxYzAbCd) displayed directly under the app's name. Reddit often shows it without a "client ID" label, so it is easy to miss; it is the code beneath the app title, not the app name itself.Client secret - the longer value shown in the field explicitly labeled secret. Copy it right away; if you lose it you can regenerate a new secret from the same page.
Do not use reddit.com/prefs/apps: it silently rejects new apps under the Responsible Builder Policy, so the Ads developer portal is the only working path for advertisers.
2. Mint a refresh token
Run the built-in setup helper:
npx mcp-server-reddit-ads authIt asks for the client ID and secret from step 1 (or reads them from REDDIT_CLIENT_ID and REDDIT_CLIENT_SECRET if you have set them), opens the Reddit authorization page in your browser, and waits on http://localhost:8080 for you to approve.
Once you approve, it offers to save the configuration for you:
Where should I save this? (I'll patch the file, keeping anything already there.)
[1] Claude Code ./.mcp.json
[2] Claude Desktop <your platform's claude_desktop_config.json>
[3] Just print it (don't write any file)Pick [1] or [2] and it writes the credentials straight to disk (backing up any existing file to <file>.bak and leaving other servers untouched), so nothing sensitive has to pass through your MCP client. If you prefer to place it yourself, pick [3] and it prints a ready-to-paste block instead. When it can't detect a TTY (for example, piped output), it skips the menu and prints the block.
If it fails, it tells you how to fix the two common causes: port 8080 already in use, and a redirect-URI mismatch (the app's redirect URI must be exactly http://localhost:8080).
3. Add the server to your MCP client
If you picked [1] or [2] in step 2, this is already done - skip to step 4. Otherwise, paste the printed block into your client's config. It has this shape, with the three credential values already populated by the auth command:
{
"mcpServers": {
"reddit-ads": {
"command": "npx",
"args": ["-y", "mcp-server-reddit-ads"],
"env": {
"REDDIT_CLIENT_ID": "your-client-id",
"REDDIT_CLIENT_SECRET": "your-client-secret",
"REDDIT_REFRESH_TOKEN": "your-refresh-token",
"REDDIT_ADS_WRITE_TIER": "read"
}
}
}
}Claude Code users can register it from the command line instead:
claude mcp add reddit-ads \
-e REDDIT_CLIENT_ID=your-client-id \
-e REDDIT_CLIENT_SECRET=your-client-secret \
-e REDDIT_REFRESH_TOKEN=your-refresh-token \
-e REDDIT_ADS_WRITE_TIER=read \
-- npx -y mcp-server-reddit-ads4. Restart and verify
Restart your client so it picks up the server (in Claude Code, approve the server when prompted, and confirm it loaded with /mcp). Then ask it to list your Reddit ad accounts. You should see your account id (a2_...). If you manage a single account, set REDDIT_ADS_ACCOUNT_ID to that id in the config and restart, so you never have to name the account in a request again.
5. Try some read-only queries
You are connected and read-only. Good first questions:
"Give me an overview of my Reddit ad account."
"Show the last 7 days of performance by campaign."
"Which of my ad groups are currently active?"
Most people stay here day to day. When you want to make changes, turn on writes.
6. Turn on writes when you need them
A fresh install cannot pause, create, or edit anything. To allow changes, raise REDDIT_ADS_WRITE_TIER in your config and restart. Start with safe (nothing at that level can start or grow spend) and move to spend only when you intend to resume delivery or change budgets, bids, or targeting. See Write tiers for exactly what each level unlocks.
Write tiers
Writes are off by default. REDDIT_ADS_WRITE_TIER opens them in two steps, so an accident at the read or safe tier cannot start spending money.
Tools above the configured tier are not just refused - they are hidden from the client's tool list entirely. A read-only session exposes 18 tools; the model cannot even attempt update_budget because it does not know the tool exists. If a hidden tool is somehow called anyway, the server refuses it with an error naming the tier that would unlock it.
Tier | What it allows | Rule |
| No writes. | Reads only. |
| Pause, create (born paused), rename, copy ads. | Cannot start or expand delivery. |
| Everything in | Can start, resume, or reshape delivery. |
Environment variables
Variable | Meaning |
| Required. Startup fails with a pointer to the |
|
|
| Optional default account ( |
Tools
Group | Tools | Tier |
Diagnostics |
| read |
Accounts |
| read |
Entities |
| read |
Creative |
| read |
Search |
| read |
Reporting |
| read |
Targeting data |
| read |
Create |
| safe |
Pause / rename |
| safe |
Comments |
| safe |
Workflows |
| safe |
Resume |
| spend |
Money |
| spend |
Delivery shape |
| spend |
Ad URL |
| spend |
Notes:
get_campaigns,get_ad_groups, andget_adstake an optionalstatusfilter (ACTIVE,PAUSED, orARCHIVED), applied client-side onconfigured_status.Tool results are capped at 200,000 characters; a truncated result says so and suggests narrowing the query.
get_performance_reporttakes friendly lowercase metric names (impressions,clicks,spend,cpc,conversion_page_visit_clicks, and so on) and validates them locally before the call, suggesting the closest match on a typo.create_ad_grouprequires aconversion_pixel_id, andcreate_campaignrequires one when campaign budget optimization is on (a Reddit mandate since 2026-07-13). The pixel id is in the Reddit Ads dashboard under Events Manager; in observed data it equals the ad account id.copy_adsduplicates ads into another ad group (Reddit creates a duplicate promoted post per copy) with an option to rewriteutm_campaignand other click-URL query params.Ad copy (headline, body) is immutable via the Reddit API - the only editable post property is
allow_comments. To change what an ad says, create a new ad with the new copy, enable it, and pause the old one.
Reddit API gotchas
The client encodes behaviors verified against the live API. The ones that cause the most confusion:
Updates use
PATCH, neverPUT, and Reddit returns 404 (not 405) for the wrong verb. A verb bug looks exactly like a missing resource. This is the bug that breaks every write in the upstream package.Single resources live on bare paths (
/ads/{id}); collections and creates use account-scoped paths (/ad_accounts/{id}/ads). Mixing them returns 404.All money values are microcurrency (one millionth of the currency unit). This server converts them to USD on read and back on write, so tool inputs and outputs are in dollars.
Report metric names are UPPERCASE enums in requests but lowercase in responses, with inconsistent spelling (
CONVERSION_SIGN_UP_CLICKSvsCONVERSION_SIGNUP_TOTAL_VALUE). Use the friendly lowercase names; the server validates and maps them.After a write, trust
configured_status, noteffective_status. The configured value updates immediately; the effective value can lag by minutes.Ad copy cannot be edited. The creative lives on a promoted post, and
PATCH /posts/{id}permits exactly one field:allow_comments. Headline and body are rejected outright. Changing copy means shipping a new ad (create_ad, born paused) and pausing the old one - which also keeps performance history per message, so it is the right workflow anyway.
Development
npm install
npm test # unit and contract tests (no live API calls)
npm run typecheck
npm run lint
npm run build
npm run smoke # manual, hits the live API; needs real credentials in envDisclaimer
This software is provided "as is" and "as available", without warranty of any kind, as set out in the LICENSE. It may contain bugs or errors, and any safeguards or controls it provides may fail or behave unexpectedly. Use it at your own risk.
This tool can create, rename, pause, resume, and reconfigure live Reddit advertising entities, and can change budgets, bids, and targeting. These actions can start, increase, or otherwise affect real ad spend. You are solely responsible for:
any charges, ad spend, or financial outcomes that result from using this server;
independently reviewing and verifying every change it makes to your account;
keeping your Reddit API credentials secure; and
your use of the Reddit Ads API in line with Reddit's terms.
The author accepts no liability for lost or unintended ad spend, misconfigured or paused campaigns, unintended changes, or any other damages arising from use of this software, including any failure of its safety controls to prevent an action.
This project is an independent, unofficial client. It is not affiliated with, endorsed by, or sponsored by Reddit, Inc.
License
MIT
Available Tools
30 toolscompare_adsARead-only
Per-ad performance within one ad group, joined with each ad's name and creative headline and sorted by spend - answers 'which creative is winning?' in one call. Money metrics in USD. Scoped to a single ad group: use get_performance_report for account-level totals.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Trailing days to report over. Default 30. | |
| metrics | No | Friendly metric names. Default: a useful spend+conversions set. | |
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. | |
| ad_group_id | Yes | Ad group whose ads to compare. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=true. The description adds that money metrics are in USD and results are sorted by spend, but does not detail all output fields. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff: first defines purpose and output, second gives scope and alternative. Efficiently structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description provides a good idea of return fields (per-ad, name, headline, spend). It covers the main context but could be more explicit about all fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds context that money metrics are in USD and reinforces the scoping to a single ad group, providing extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool compares per-ad performance within one ad group, joined with ad name and headline, sorted by spend, answering 'which creative is winning?'. It distinguishes from sibling get_performance_report for account-level totals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Scoped to a single ad group: use get_performance_report for account-level totals', providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_periodsARead-only
Compare account performance over the trailing N days against the N days immediately before (same-length back-to-back windows). Returns totals for both windows plus absolute and percent change per metric. Money metrics in USD. Two totals per metric only: use get_daily_performance to see the day-level shape within a window.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Window length in trailing days. Default 7. | |
| metrics | No | Friendly metric names. Default: a useful spend+conversions set. | |
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds useful behavioral details: returns totals for both windows plus absolute/percent change, money in USD, and only two totals per metric. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each dense with information. First sentence states purpose and window logic, second states returns, third gives usage guidance. No unnecessary words, well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with 3 optional parameters and no output schema, the description adequately explains the return structure (totals, change, USD) and limitations (no day-level breakdown). It provides sufficient context for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; each parameter has a description. The description adds minimal extra meaning—e.g., that 'days' defaults to 7 and 'metrics' defaults to a useful set. Baseline is 3, and the description does not significantly enhance parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool compares account performance over back-to-back trailing periods. It specifies the verb 'compare', the resource 'account performance', and the exact window logic. It distinguishes from sibling 'get_daily_performance' by noting that this tool returns only two totals per metric.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool (comparing back-to-back windows) and when not to: if day-level shape is needed, use 'get_daily_performance'. This provides clear guidance on alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_adsA
Duplicate a set of ads into another ad group. Each copy is created PAUSED. Reddit creates a new duplicate promoted post per copy. Optionally rewrite click_url query params (e.g. utm_campaign) for the destination. One bad source id does not abort the rest.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. | |
| name_suffix | No | Appended to each copy's name. | |
| source_ad_ids | Yes | Ad ids to copy. | |
| utm_overrides | No | Query params to set on each copy's click_url, e.g. { utm_campaign: 'remarketing-reddit' }. | |
| destination_ad_group_id | Yes | Ad group the copies are created in. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses key behaviors: copies are created PAUSED, Reddit creates a new duplicate promoted post per copy, optional click_url rewriting, and partial failure handling. Adds value beyond annotations which are minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core purpose, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main behaviors and parameters, though no output schema is provided. Could mention that original ads remain unchanged, but implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds context for utm_overrides and source_ad_ids (partial failure) beyond the 100% schema coverage, but the parameter descriptions in schema already cover basics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'duplicate' and the resource 'ads into another ad group', distinguishing it from sibling tools like create_ad or pause_items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context that copies are created paused and that one bad source ID doesn't abort the rest, but does not explicitly compare to alternatives or state when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_adA
Create an ad. Always created PAUSED. Either promote an existing post (post_url) or build a link ad (headline + click_url, optionally creative_type/thumbnail_url).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Ad name. | |
| headline | No | Headline for a link ad. | |
| post_url | No | Existing Reddit post URL to promote. | |
| click_url | No | Landing URL for a link ad. | |
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. | |
| ad_group_id | Yes | Parent ad group id. | |
| creative_type | No | Creative type for a link ad. | |
| thumbnail_url | No | Thumbnail image URL for a link ad. | |
| call_to_action | No | Call to action, e.g. SIGN_UP, LEARN_MORE. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutable, non-destructive, non-idempotent. Description adds the key behavioral trait 'Always created PAUSED' and explains the two creation modes. No contradictions. Could add more on auth or limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then paused state, then two modes. No fluff. Could be slightly more compact, but still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters and no output schema, the description covers the essential logic and parameter dependencies. However, it does not mention what is returned (e.g., ad ID) or error scenarios, which would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds crucial grouping info: mutual exclusivity of post_url vs headline+click_url, and optional creative_type/thumbnail_url. This is beyond individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create an ad' and distinguishes two distinct modes: promoting an existing post or building a link ad. This differentiates it from siblings like update_ad or copy_ads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context on when to use: creating a new ad, with explicit guidance on the two paths (post_url vs headline+click_url). It does not explicitly mention when not to use or alternatives, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ad_groupA
Create an ad group. Always created PAUSED. A conversion pixel id is required (Reddit mandate since 2026-07-13). Find the conversion pixel id in the Reddit Ads dashboard under Events Manager; in practice it equals the ad account id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Ad group name. | |
| bid_usd | No | Bid value in USD (for manual/capped strategies). | |
| targeting | No | Targeting object (geos, communities, devices, etc.). | |
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. | |
| campaign_id | Yes | Parent campaign id. | |
| bid_strategy | No | Bid type, e.g. MANUAL_BIDDING, MAXIMIZE_VOLUME, BIDLESS. | |
| daily_budget_usd | Yes | Daily spend budget in USD. | |
| optimization_goal | No | Optimization goal, e.g. LEAD, PAGE_VISIT, CLICKS. | |
| conversion_pixel_id | Yes | Conversion pixel id (required). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral detail beyond annotations: 'Always created PAUSED' and the mandate requiring a conversion pixel id. Annotations only indicate readOnlyHint=false and openWorldHint=true, so the description fills a gap with concrete startup behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences: purpose, behavioral trait, practical guidance. No fluff. The most important info (creation, paused state) comes first. Efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters, nested objects, and no output schema, the description covers critical behavioral and contextual details (paused state, pixel requirement). It doesn't explain return values or default behaviors for all parameters, but the schema descriptions compensate. Overall, it is sufficiently complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds extra meaning for conversion_pixel_id (mandate, how to find, practical equivalence to account id). This goes beyond the schema's generic description, raising the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create an ad group' (verb+resource) and immediately adds 'Always created PAUSED', which differentiates it from sibling tools like create_campaign or create_ad. The purpose is unambiguous and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains a critical prerequisite: the conversion pixel id is required and provides a practical way to find it. While it doesn't explicitly compare to alternatives or give when-not-to-use guidance, the practical context (Reddit mandate, how to obtain the pixel) is highly useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_campaignA
Create a campaign. Always created PAUSED. If campaign budget optimization is on, a conversion pixel id is required (Reddit mandate since 2026-07-13). Find the conversion pixel id in the Reddit Ads dashboard under Events Manager; in practice it equals the ad account id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Campaign name. | |
| objective | Yes | Campaign objective, e.g. CONVERSIONS, CLICKS, IMPRESSIONS. | |
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. | |
| spend_cap_usd | No | Lifetime spend cap in USD. | |
| conversion_pixel_id | No | Conversion pixel id. Required when CBO is on. | |
| is_campaign_budget_optimization | No | Enable CBO (requires conversion_pixel_id). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate non-readOnly, non-idempotent, non-destructive. The description adds crucial behavioral details: campaigns are created in PAUSED state, and there is a dependency between CBO and conversion_pixel_id (a Reddit mandate). This goes beyond the annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short (two sentences) and front-loaded with the main action. It efficiently communicates key behaviors without unnecessary detail. However, the second sentence could be slightly restructured for clarity. Overall it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters (2 required), no output schema, and moderate complexity, the description covers the main behavioral expectations: creation state and CBO dependency. It does not explain return values, but that's acceptable without an output schema. It could optionally mention idempotency or error cases, but it's reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds meaning for conversion_pixel_id and is_campaign_budget_optimization by explaining their relationship and requirement. For other parameters like name, objective, account_id, spend_cap_usd, it does not add beyond schema. The description does not compensate for gaps since there are none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a campaign, with a specific verb ('Create') and resource ('campaign'). Among sibling tools, only this one creates campaigns, so it's well-distinguished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: it specifies that campaigns are always created PAUSED and that a conversion pixel id is required when CBO is on, with a mandate date. It gives a concrete example of where to find the pixel id. However, it does not explicitly state when not to use this tool or suggest alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enable_itemsADestructiveIdempotent
Resume delivery on one or more entities of a single type (set configured_status ACTIVE). This restarts spend. One bad id does not abort the rest; each result reports the read-back configured_status.
| Name | Required | Description | Default |
|---|---|---|---|
| item_ids | Yes | Ids to enable (all of item_type). | |
| item_type | Yes | Type of every id in item_ids. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond annotations: it notes that partial failures are tolerated ('one bad id does not abort the rest'), describes the return format ('each result reports the read-back configured_status'), and mentions the consequence of restarting spend. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two succinct sentences: the first delivers the core purpose, the second adds essential behavioral details (partial failure handling, output format). No wasted words, front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and annotations covering safety, the description fully covers behavior, error handling, and return shape. It addresses the tool's effect on spend and status change, making it complete for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with clear descriptions for both parameters. The tool description adds no additional semantic meaning beyond reinforcing that item_ids must all be of the same type. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'resume[s] delivery on one or more entities of a single type' and specifies it sets configured_status to ACTIVE. This distinguishes it from sibling 'pause_items' (which would do the opposite) and explains core functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly indicates this is for enabling or resuming delivery, but does not explicitly contrast with alternatives like 'pause_items' or provide when-not-to-use guidance. It lacks explicit usage context beyond the action itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_entityARead-only
Find campaigns, ad groups, or ads by name (case-insensitive substring match). Use this to turn a human-readable name into an id before calling other tools. Prefer get_campaign, get_ad_group, or get_ad when you already have the id.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Name fragment to search for. | |
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. | |
| entity_type | No | Restrict the search to one type. Default: any. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already declare readOnlyHint and openWorldHint, the description adds the case-insensitive substring match behavior and the purpose of ID resolution. However, it does not detail the exact output (e.g., list of matches, what fields are returned) or mention potential edge cases like multiple results or empty results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences are concise and front-loaded with the core purpose and usage guidance. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema, the description should cover what the tool returns (e.g., list of entities with IDs). It mentions 'turn a human-readable name into an id' but does not explicitly describe the output structure or any pagination/limits. This gap reduces completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, all three parameters are described in the schema. The description adds the 'case-insensitive substring match' context for the query and clarifies that entity_type defaults to 'any'. This adds value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds campaigns, ad groups, or ads by name via case-insensitive substring match, and distinguishes it from sibling tools that require an ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use (to convert human-readable name to ID) and when not to (when ID already known), and directs to preferred alternatives like get_campaign, get_ad_group, or get_ad.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_overviewARead-only
One-glance health of an account: campaign/ad-group/ad counts by effective status, and this-week vs last-week spend (two comparable 7-day windows). One entity sweep plus one report call.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds value by detailing the data retrieved (counts and spend comparison) and the efficiency of the operation. No contradictions or missing behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (two sentences) and front-loaded with core purpose. Every word contributes meaning with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description sufficiently explains what the tool returns (entity counts and spend comparison). However, it could specify the return format (e.g., JSON structure) for full completeness. Still, it is adequate for a quick-overview tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter account_id, which already has a description. The tool description adds no additional meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides a 'one-glance health' overview of an account, including counts by effective status for campaigns, ad groups, and ads, as well as spend comparison between two 7-day windows. This distinguishes it from siblings like get_performance_report or compare_periods by focusing on a consolidated snapshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for a quick, efficient overview ('one entity sweep plus one report call'), but does not explicitly state when not to use it or name alternatives. The context is clear, but lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_accountsARead-only
List every Reddit ad account these credentials can reach, across all businesses. Use this first to get an account id for the other tools, or set REDDIT_ADS_ACCOUNT_ID to default it. One row per account, so the result is small.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and open world; description adds that output is small ('One row per account'), confirming non-destructive nature and result size beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences covering purpose, usage hint, and output characteristic. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Sufficient for a simple enumeration tool with no output schema; describes scope, usage, and result size, though could mention typical fields (e.g., id, name) for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist; baseline 4 applies. Description adds meaning about what is listed (all reachable accounts) and how to use results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States verb 'List' and resource 'every Reddit ad account' with clear scope ('across all businesses'), distinguishing it from sibling tools focused on campaigns, ads, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this first to get an account id for the other tools' and mentions alternative of setting environment variable, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adARead-only
Get one ad by id: status, ad group, and click-through URL, but not the creative copy. Use get_ad_creative for the headline, body, and media, and get_ads to browse an account or ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | Ad id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the tool returns only a subset of ad data (not creative copy), which is a key behavioral trait beyond the readOnlyHint annotation. Also implies read-only access consistent with annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no waste. Front-loaded with action and resource, then efficiently adds exclusions and sibling references.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with one parameter and no output schema, the description fully covers what the agent needs: what it does, what it returns, what it excludes, and how to get missing data via siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (ad_id) with schema description 'Ad id.' The description mentions 'by id' but adds minimal extra meaning beyond what the schema already provides. Baseline 3 due to 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states it gets one ad by ID, lists the specific fields returned (status, ad group, click-through URL), and distinguishes from siblings by noting what it excludes and directing to get_ad_creative and get_ads for other purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear when to use this tool (when needing ad metadata without creative), and when not (use get_ad_creative for creative copy, get_ads for browsing). Provides explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_creativeARead-only
Read the creative behind an ad: headline, body text, media, thumbnail, and post URL. The creative lives on the ad's promoted post and is immutable via the API - changing copy means creating a new ad. Use get_ad for the ad's status and click-through URL instead.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | Ad id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. Description adds that creative is 'immutable via the API - changing copy means creating a new ad,' which is useful context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with purpose and key details, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with one parameter and annotations present, description covers return fields (headline, body, etc.) and immutability. Output schema absent but description compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (ad_id) with schema description 'Ad id.' Description does not add extra meaning beyond what schema provides. Baseline 3 since schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Read the creative behind an ad' with specific fields (headline, body text, media, thumbnail, post URL). Distinguishes from sibling get_ad by contrasting what it returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when NOT to use this tool: 'Use get_ad for the ad's status and click-through URL instead.' Provides clear alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_groupARead-only
Get one ad group by id, with budget and bid fields in USD. This is where budget, bid, and targeting live, so read it before and after update_budget, update_bid, or update_targeting to confirm a change landed.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_group_id | Yes | Ad group id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already note readOnlyHint and openWorldHint. Description adds that budget, bid, and targeting fields are included and that it serves as a confirmation step, enhancing behavioral context without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. Purpose is front-loaded, and additional guidance is efficiently packed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given single parameter and no output schema, description fully explains what the tool retrieves (budget, bid in USD) and its role in a change-verification workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers parameter ad_group_id fully (100% coverage). Description does not add new parameter details but implies its role in fetching budget/bid data, meeting baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Get one ad group by id' with specific fields (budget, bid in USD). Distinguishes purpose from sibling tools by referencing update workflows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises reading before and after update_budget, update_bid, or update_targeting to confirm changes, providing clear usage context and recommended workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_groupsARead-only
List ad groups in an account, optionally filtered to one campaign, with budget and bid fields in USD. Ad groups hold the budget, bid, and targeting that update_budget, update_bid, and update_targeting change. Use get_ad_group for a single known id.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Client-side filter on configured_status. | |
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. | |
| campaign_id | No | Only return ad groups in this campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and openWorldHint. The description adds value by stating budget/bid fields are in USD and explaining that ad groups hold the fields modified by update tools. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, no redundancy. First sentence is the purpose; second adds relational context. Well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description mentions returned fields (budget/bid in USD) and relationships to other tools. Could mention pagination or further details, but adequate for the simple parameter set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds the context of optional campaign filtering and mentions USD fields, providing slight extra meaning beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'List ad groups in an account' specifying verb and resource, and distinguishes from sibling 'get_ad_group' by mentioning single known id. Adds details about optional campaign filtering and USD fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly contrasts with 'get_ad_group' for single known id, providing clear when-to-use guidance. Could expand on other alternatives but the sibling distinction is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adsARead-only
List ads in an account, optionally filtered to one ad group. Returns ad records only, not creative copy: use get_ad_creative for headline and body text, or compare_ads to rank one ad group's ads by spend.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Client-side filter on configured_status. | |
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. | |
| ad_group_id | No | Only return ads in this ad group. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description correctly aligns. It adds that the tool returns ad records only, not creative copy, but does not disclose additional behavioral traits like pagination or rate limits. The description adds marginal value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The main purpose is front-loaded, and the additional guidance is compact yet informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is a list function with optional filters and no output schema, the description adequately covers what it does and points to related tools. Could mention pagination or ordering, but the completeness is sufficient for the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already well-described. The description reinforces the scope (account and ad group) but does not add new meaning beyond what the schema provides. The alternative tool references are not directly parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List ads in an account, optionally filtered to one ad group' with a specific verb and resource. It distinguishes from siblings by noting it returns ad records only, not creative copy, and directs to get_ad_creative and compare_ads for other needs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly mentions when to use get_ad_creative (for creative copy) and compare_ads (to rank ads by spend), providing clear alternatives. Does not explicitly state when not to use this tool, but the guidance is sufficient for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaignARead-only
Get one campaign by id, with budget fields converted to USD. Use get_campaigns to browse or filter, or find_entity when you only know the name.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | Campaign id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds valuable behavioral context about budget fields being converted to USD, which is not captured by annotations. No contradictory information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that are concise and front-loaded: first sentence states purpose and key behavior, second sentence provides usage guidance. No extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 parameter, no output schema), the description is sufficiently complete. It covers purpose, notable behavior, and usage alternatives. Could be enhanced by mentioning the return format, but not necessary for this context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the parameter 'campaign_id' described as 'Campaign id.'. The description reinforces 'by id' but does not add new semantic meaning beyond what the schema provides, resulting in baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get one campaign by id' with a specific resource and verb, and adds a notable behavior 'budget fields converted to USD'. It also distinguishes from siblings by referencing get_campaigns and find_entity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides guidance on when to use this tool vs alternatives: 'Use get_campaigns to browse or filter, or find_entity when you only know the name.' This helps the agent select the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaignsARead-only
List all campaigns in a Reddit ad account, with budget fields converted to USD (*_usd siblings). Use get_campaign for a single known id, or find_entity to resolve a name to an id. Returns every campaign in the account, so narrow with status on large accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Client-side filter on configured_status. | |
| account_id | No | Ad account id (a2_...). Falls back to REDDIT_ADS_ACCOUNT_ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds that status is a client-side filter and that budget fields are converted to USD. No contradictions, but lacks details on pagination or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences front-loaded with purpose, then usage guidance, then practical advice. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with no output schema, the description explains return (all campaigns, USD conversion) and gives scaling advice. Missing pagination info, but openWorldHint covers unlisted fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds meaningful context: 'Client-side filter on configured_status' and account_id fallback to env variable. This exceeds the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all campaigns in a Reddit ad account' and distinguishes from siblings get_campaign (single) and find_entity (name resolution).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use alternatives: 'Use get_campaign for a single known id, or find_entity to resolve a name to an id.' Also advises narrowing with status on large accounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_performanceARead-only
Day-by-day performance for the trailing N days, broken down by date, with money metrics in USD. Use this to see a trend or spot a spike. For window totals use get_performance_report, or compare_periods for a like-for-like change against the previous N days.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of trailing days. Default 7. | |
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description adds value by noting money metrics are in USD. It does not discuss rate limits or data aggregation details, but the annotations sufficiently convey the read-only nature. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, followed by usage guidance and alternatives. Every sentence earns its place with zero redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, but the description states the output is by date with USD metrics. It could mention specific metrics (e.g., impressions, clicks), but for a simple trailing-period tool with two parameters, this is largely sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters ('days' and 'account_id'), so the description need not elaborate. It adds no extra meaning beyond the schema, which is acceptable at baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns 'day-by-day performance for the trailing N days, broken down by date, with money metrics in USD.' It also distinguishes from siblings by naming alternatives like get_performance_report and compare_periods, making the tool's unique value obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to see a trend or spot a spike' and provides clear alternatives for other use cases: 'For window totals use get_performance_report, or compare_periods for a like-for-like change against the previous N days.' This leaves no ambiguity about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_interest_categoriesARead-only
List Reddit's interest targeting categories. Returns the ids to pass as interests to update_targeting. Takes no arguments and returns the whole catalogue, so call it once and reuse the result rather than per ad group.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds behavioral context: 'Takes no arguments and returns the whole catalogue', which is consistent and clarifies the scope and reuse recommendation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states purpose, second adds usage guidance and efficiency tip. Every word carries meaning; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with no output schema, the description covers purpose, usage, efficiency, and output hint ('returns the ids'). No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters and 100% schema coverage, the description confirms 'takes no arguments' and adds value by explaining the consequence (returns whole catalogue). This meets the baseline of 4 for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('List Reddit's interest targeting categories') and the resource, and explicitly notes the purpose ('Returns the ids to pass as interests to update_targeting'). This clearly distinguishes it from sibling tools like get_campaigns or get_ad_groups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the tool: 'call it once and reuse the result rather than per ad group', and notes that it takes no arguments and returns the whole catalogue, effectively telling the agent to avoid repeated calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_performance_reportARead-only
Performance totals for an ad account over a date window. Accepts friendly lowercase metric names (e.g. impressions, clicks, spend, ctr, cpc, conversion_page_visit_clicks) validated locally before the call. Money metrics come back in USD. Defaults to the last 7 days. Use get_daily_performance for a per-day breakdown, compare_periods for change against the prior window, or compare_ads to rank the ads inside one ad group.
| Name | Required | Description | Default |
|---|---|---|---|
| metrics | No | Friendly metric names. Default: a useful spend+conversions set. | |
| end_date | No | YYYY-MM-DD, inclusive. Default: today. | |
| account_id | No | Ad account id. Falls back to REDDIT_ADS_ACCOUNT_ID. | |
| breakdowns | No | Dimensions to break down by, e.g. date, campaign_id, country, community. | |
| start_date | No | YYYY-MM-DD, inclusive. Default: 7 days ago. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=true. The description adds that metric names are validated locally, money metrics are in USD, and defaults to last 7 days. No contradictions. Some additional context like rate limits or auth could be beneficial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured, and front-loaded with purpose. Each sentence adds value: purpose, accepted metrics, defaults, and alternatives. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although the description covers purpose and usage, it lacks details about the response structure since no output schema is provided. It mentions money in USD but doesn't describe the format of the performance totals. This is a gap given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining that metric names are friendly and lowercase, giving examples, and noting default behavior. It repeats some schema defaults but provides extra context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns performance totals for an ad account over a date window, distinguishes from siblings like get_daily_performance, compare_periods, and compare_ads, and specifies the resource and verb.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly mentions when to use this tool (for totals over a date window) and suggests alternative tools for different needs: get_daily_performance for per-day breakdown, compare_periods for change, compare_ads for ranking ads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_statusARead-only
Diagnose the server: Reddit Ads API connectivity, configured write tier, how many tools that tier hides, and the default account. Start here when something is not working.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, indicating a safe read operation with potentially dynamic results. The description adds value by specifying what behaviors to expect: checking connectivity, write tier, hidden tools, and default account. This enriches the transparency beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the purpose and lists key diagnostic details, followed by a clear call to action. No wasted words; every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and no output schema, the description covers the input side well but leaves the output format vague. It doesn't describe what the agent will receive (e.g., status codes, JSON structure, error messages). For a diagnostic tool, this is a notable gap, though the low complexity tempers the impact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, and schema coverage is 100% (empty). Per rubric, 0 params earns a baseline of 4. The description does not need to add parameter information, so the score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool diagnoses server status, listing specific elements (connectivity, write tier, hidden tools, default account). This clearly distinguishes it from sibling tools like get_campaigns, which retrieve specific entities. The phrase 'Start here when something is not working' further clarifies its role as a troubleshooting entry point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance: use this tool when something is not working, positioning it as the first step in troubleshooting. While it doesn't explicitly state when not to use it or list alternatives, the context of siblings being data-retrieval tools makes the usage scenario unambiguous. A slight deduction for lack of explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_itemsAIdempotent
Pause one or more entities of a single type (campaigns, ad groups, or ads), stopping their spend. Reversible with enable_items. One bad id does not abort the rest; each result reports success and the read-back configured_status, which is the field to trust after a write (effective_status lags by minutes).
| Name | Required | Description | Default |
|---|---|---|---|
| item_ids | Yes | Ids to pause (all of item_type). | |
| item_type | Yes | Type of every id in item_ids. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, describes partial failure handling, return of configured_status, and lag of effective_status. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no wasted words. Efficiently communicates all key points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description covers return behavior, error handling, and latency. Complete for a 2-parameter mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers parameters fully; description adds context about consistent item_type and output behavior (configured_status). Adds value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool pauses one or more entities of a single type, stopping spend, and distinguishes from enable_items as the reverse operation. Clear verb and resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context: when to pause (stop spend), that it is reversible via enable_items, and behavior with bad IDs. Lacks explicit when-not-to-use compared to other sibling tools, but sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_geo_targetsARead-only
Search geographic targets (countries, regions, and metros) by name. Returns the ids to pass as geolocations to update_targeting, which needs Reddit geo ids rather than plain place names. Read-only lookup: it does not change any targeting by itself.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text, e.g. 'united'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. Description reinforces that it does not change targeting and explains output usage, adding value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with core purpose, no redundant information. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple tool with one parameter; description covers what the tool does, what it returns, and how to use the result. No output schema needed given the explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a description for 'query'. Description adds an example ('united'), which aids understanding beyond the schema's generic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches geographic targets by name and returns IDs for use in update_targeting. It distinguishes itself from sibling tools like search_subreddits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the returned IDs are for update_targeting and that it is read-only. Lacks explicit when-not-to-use or alternatives, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_subredditsARead-only
Search targetable subreddits (communities) by name or keyword. Returns the ids to pass as communities to update_targeting, which needs Reddit ids rather than display names. Read-only lookup: it does not change any targeting by itself.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text, e.g. 'gaming'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Reinforces read-only behavior from annotations and adds context about output format (ids) and usage with update_targeting. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, no fluff, front-loaded with key action. Highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a simple search tool with annotations. Explains output and integration with another tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers parameter with description and example. Description adds context about returning ids and usage, justifying above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'search', resource 'subreddits', and purpose: find ids for targeting. Distinguishes from siblings like search_geo_targets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States it's read-only and for use with update_targeting. Implicitly says when to use but lacks explicit exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ad_commentsADestructiveIdempotent
Turn commenting on an ad's promoted post on or off. This is the only property of a post the Reddit API allows changing. Echoes old -> new.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | Ad id (the post is resolved from it). | |
| allow_comments | Yes | true to allow comments on the ad, false to disable them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context beyond annotations by stating the tool 'echoes old -> new' and is the only mutable property. Annotations already indicate mutability and idempotency, so the description provides complementary behavioral insight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences that efficiently convey purpose, exclusivity, and return behavior. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter toggle tool with no output schema, the description covers purpose, exclusive property, and return behavior. It lacks details on error conditions or prerequisites, but these are not critical given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. The description does not add any new meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'turn commenting...on or off' and clearly identifies the resource as 'an ad's promoted post'. It also distinguishes from other tools by noting this is the only property the API allows changing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (to toggle comments) and highlights its exclusive scope, but does not explicitly state when not to use it or provide direct comparisons to sibling tools like update_name or update_budget.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ad_urlADestructiveIdempotent
Change an existing ad's click-through URL. Pass a full replacement click_url, or set_query_params to rewrite individual query params (e.g. UTMs) while preserving the rest. Echoes old -> new. On a live ad, paid traffic goes to the new URL immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | Ad id. | |
| click_url | No | Full replacement click-through URL. | |
| set_query_params | No | Query params to set or overwrite on the URL, e.g. {"utm_content": "v2"}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it echoes old->new and that changes take effect immediately on live ads. Annotations indicate destructiveness and idempotency; description enriches with timing and output format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, no filler. Front-loaded with purpose, then modes, then effect. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main behavioral aspects and output (echo). Lacks clarity on behavior if both parameters are provided simultaneously (though implied exclusive), but sufficient for typical usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds usage context: either provide full click_url or set_query_params to rewrite individual params while preserving rest. This aids selection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it changes an ad's click-through URL and specifies two modes: full replacement or setting query params. It also notes immediate effect on live ads. Distinct from sibling tools like update_name or update_budget.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance on when to use each mode (full replacement vs. setting params). However, no explicit when-not-to-use or alternatives mentioned, but the tool is self-contained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_bidADestructiveIdempotent
Set an ad group's bid in USD, echoing the previous and new value. Overwrites the prior bid and applies to the live ad group immediately. The bid governs what you pay per auction; use update_budget to cap total daily spend.
| Name | Required | Description | Default |
|---|---|---|---|
| bid_usd | Yes | New bid value in USD. | |
| ad_group_id | Yes | Ad group id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutation (destructiveHint=true) and idempotency (idempotentHint=true). The description adds context about echoing old and new values, overwriting the prior bid, and immediate application, which clarifies behavior beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each adding unique value: action+echo, overwrite+immediacy, and differentiation. No redundant or extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter mutation tool with full schema coverage and clear annotations, the description covers core behavior and provides an alternative. It lacks error conditions or permission requirements, but these are not critical for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for both parameters (bid_usd and ad_group_id). The description does not add new parameter details beyond what the schema provides, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Set an ad group's bid in USD', specifying the verb (set) and resource (bid on ad group). It distinguishes from sibling tool 'update_budget' by explicitly noting its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance to use 'update_budget' for capping daily spend, helping differentiate from a key alternative. It also implies the tool is for immediate, one-off bid adjustments, though it doesn't list prerequisites or typical use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_budgetADestructiveIdempotent
Set an ad group's daily spend budget in USD, echoing the previous and new value. Overwrites the prior budget and applies to the live ad group immediately. Budgets live on ad groups, not campaigns; read the current value with get_ad_group first.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_group_id | Yes | Ad group id. | |
| daily_budget_usd | Yes | New daily budget in USD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds details beyond annotations: 'echoing previous and new value', 'overwrites', 'applies immediately'. No contradiction; annotations indicate destructive, idempotent write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with distinct purpose: action, behavior, guidance. No redundant words, well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-param tool with annotations, description covers purpose, behavior, and usage hint. Lacks output format details, but acceptable given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% with descriptions. Description adds 'in USD' and implies output echo, not essential for parameter understanding. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Set an ad group's daily spend budget in USD' with verb and resource. It distinguishes from siblings like get_ad_group (read) and update_bid (different resource).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context: 'Budgets live on ad groups, not campaigns' and suggests reading first with get_ad_group. Does not explicitly list when not to use or alternatives, but guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_nameADestructiveIdempotent
Rename one entity (campaign, ad group, or ad). Cosmetic only: delivery, budget, and targeting are untouched. The previous name is overwritten and cannot be recovered through this API.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New name. | |
| item_id | Yes | Entity id. | |
| item_type | Yes | Type of the entity. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant value beyond annotations by explaining what is unaffected (delivery, budget, targeting) and that the name is overwritten and unrecoverable, aligning with destructiveHint and providing clarity on side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both essential and front-loaded with the core action. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple rename tool with rich annotations, the description covers purpose, scope, and irreversibility fully. No output schema needed as return is straightforward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description does not add additional detail about parameter syntax or constraints beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool renames one entity (campaign, ad group, or ad), specifies it is cosmetic only, and distinguishes from sibling tools like update_budget or update_bid.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clarifies the tool is for cosmetic renaming only and mentions that previous names are unrecoverable. However, it does not explicitly state when not to use it or suggest alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_targetingADestructiveIdempotent
Update an ad group's targeting. Only the fields you pass are changed; every other targeting key (including exclusions) is preserved. Echoes a from/to diff of the changed keys.
| Name | Required | Description | Default |
|---|---|---|---|
| devices | No | Device targets. | |
| interests | No | Interest category targets. | |
| locations | No | Placement targets. | |
| ad_group_id | Yes | Ad group id. | |
| communities | No | Subreddit/community targets. | |
| geolocations | No | Geo target ids. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds that it's a partial update (non-destructive to unpassed fields) and echoes a from/to diff, providing complete behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, concise and front-loaded with the primary action, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description covers the return format (diff) and the update behavior (partial, preserving others). It is complete for the complexity of the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all 6 parameters. The description adds meaning by explaining the partial update semantics and the preservation of exclusions, which is not evident from schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the verb 'Update' and the resource 'an ad group's targeting', distinguishing it from sibling tools like update_budget, update_bid, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states that only passed fields are changed and others (including exclusions) are preserved, guiding when to use this for partial updates. It does not explicitly mention alternatives but context with sibling tools makes it clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
12 tool updates
v0.5.8- Added
copy_ads - Added
create_ad - Added
create_ad_group - Added
create_campaign - Added
enable_items - Added
pause_items - Added
update_ad_comments - Added
update_ad_url - Added
update_bid - Added
update_budget - Added
update_name - Added
update_targeting
18 tool updates
v0.5.4- First observed
compare_ads - First observed
compare_periods - First observed
find_entity - First observed
get_account_overview - First observed
get_accounts - First observed
get_ad - First observed
get_ad_creative - First observed
get_ad_group - First observed
get_ad_groups - First observed
get_ads - First observed
get_campaign - First observed
get_campaigns - First observed
get_daily_performance - First observed
get_interest_categories - First observed
get_performance_report - First observed
get_server_status - First observed
search_geo_targets - First observed
search_subreddits
TDQS
Scored across 30 tools
Each tool targets a distinct action and resource: list vs single entity, create, update, pause/enable, search, compare, and reporting. No two tools have overlapping functionality; even the generic find_entity is clearly scoped to name resolution.
All tool names follow a consistent verb_noun pattern with underscores (e.g., get_ad_groups, create_campaign, update_budget). The naming convention is uniform across all tools, with only minor variations like search_ and compare_ prefixes that follow the same pattern.
30 tools is on the high side but justified by the complexity of an advertising platform covering campaign, ad group, ad CRUD, targeting lookups, performance reporting, and account management. The count feels well-scoped without unnecessary bloat.
The tool set provides comprehensive coverage of the Reddit Ads API: full lifecycle for campaigns, ad groups, and ads (create, read, update, pause/enable), targeting management (interests, geo, subreddits), performance reporting (daily, period, compare, per-ad), and utility tools for account overview and diagnostics. No obvious gaps for typical ad management workflows.
Maintenance
Related MCP Connectors
Manage Reddit advertising across accounts, campaigns, ad groups, posts, and ads. List accounts, fu…
Manage Reddit advertising end-to-end: browse ad accounts and payment methods, and organize campaig…
Read and manage Meta Ads campaigns, ad sets, ads, audiences, pages and Business Manager. You provide
Hosted TikTok ads MCP with OAuth, bounded reads, and prepare/confirm writes.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables managing Facebook ads campaigns, ad sets, ads, creatives, insights, and audience targeting via Meta's Marketing API.-
- FlicenseNot gradedqualityDmaintenanceRead-only access to Reddit Ads API v3 for listing ad accounts, campaigns, ad groups, ads, and generating performance reports with OAuth2 authentication.-
- AlicenseBqualityCmaintenanceA self-hosted MCP server for the Reddit Ads API v3, enabling reading ad accounts, campaigns, ad groups, ads, and performance reports, with optional write support for pausing/activating, budgeting, patching, and creating entities.6MIT
- AlicenseNot gradedqualityBmaintenanceEnables reading and writing the Google Ads API for full campaign management, with a dry-run/confirm safety flow on every write.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/camlowe/mcp-server-reddit-ads'
If you have feedback or need assistance with the MCP directory API, please join our Discord server