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 "Deploy 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-ads show 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
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.
Inputs: ad_group_id (required), days, metrics, account_id.
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.
Inputs: days, metrics, account_id.
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.
Inputs: source_ad_ids (required), destination_ad_group_id (required), account_id, name_suffix, +1 more.
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).
Inputs: name (required), ad_group_id (required), headline, post_url, +5 more.
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.
Inputs: name (required), campaign_id (required), daily_budget_usd (required), conversion_pixel_id (required), +5 more.
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.
Inputs: name (required), objective (required), account_id, spend_cap_usd, +2 more.
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.
Inputs: item_ids (required), item_type (required).
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.
Inputs: query (required), account_id, entity_type.
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.
Inputs: account_id.
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.
Inputs: no named parameters.
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.
Inputs: ad_id (required).
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.
Inputs: ad_id (required).
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.
Inputs: ad_group_id (required).
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.
Inputs: status, account_id, campaign_id.
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.
Inputs: status, account_id, ad_group_id.
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.
Inputs: campaign_id (required).
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.
Inputs: status, account_id.
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.
Inputs: days, account_id.
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.
Inputs: no named parameters.
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.
Inputs: metrics, end_date, account_id, breakdowns, +1 more.
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.
Inputs: no named parameters.
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).
Inputs: item_ids (required), item_type (required).
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.
Inputs: query (required).
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.
Inputs: query (required).
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.
Inputs: ad_id (required), allow_comments (required).
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.
Inputs: ad_id (required), click_url, set_query_params.
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.
Inputs: bid_usd (required), ad_group_id (required).
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.
Inputs: ad_group_id (required), daily_budget_usd (required).
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.
Inputs: name (required), item_id (required), item_type (required).
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.
Inputs: ad_group_id (required), devices, interests, locations, +2 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
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…
Reddit Ads MCP server: run Reddit campaigns, ad groups, ads and reports from AI.
Reddit Ads MCP server: 9 tools for subreddit reports, targeting, diagnosis. Read-only by default.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceRead-only access to Reddit Ads API v3 for listing ad accounts, campaigns, ad groups, ads, and generating performance reports with OAuth2 authentication.-
- AlicenseBqualityDmaintenanceA 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
- FlicenseNot gradedqualityCmaintenanceEnables natural-language interaction with the Reddit Ads API v3, allowing users to list ad accounts, campaigns, ad groups, and ads, fetch performance reports, and manage conversion pixels without needing endpoint paths or ad account IDs.-
- AlicenseNot gradedqualityDmaintenanceProvides read-only tools for Reddit Ads, listing accounts, campaigns, ad groups, ads, and generating performance reports.1MIT