Brand Sponsor Finder MCP Server
Find brands with recent public evidence of paid creator placements in a niche, returning brand-level and sighting-level rows with paging.
Search public YouTube descriptions, podcasts, newsletters, event sponsor pages, job posts, and creator/affiliate program pages.
Provide a niche plus optional audience keywords, seed sources, event calendar, source selection, and lookback window.
Get one row per brand domain with sighting count, last-seen date, sources, creators/events, public contact, and recency score.
Get one row per sighting with brand, source, creator/event, date, evidence link, promo code, placement type, and pitch angle.
Control run size and costs with per-source limits, max_rows, max_brands_to_check, and max_charge_usd.
Page through results using cursor without starting a new run or re-billing.
Requires APIFY_TOKEN; read-only; does not read Instagram, TikTok, or Meta Ad Library.
Checks discovered brand domains for open partnership job posts on Greenhouse, using those postings as a public-contact and partnership signal for sponsorship prospecting.
Reads podcast RSS feed URLs as seed sources, extracting sponsor mentions, promo codes, and evidence from episode show notes and descriptions.
Reads public YouTube video descriptions and channel feeds to find sponsor lines, promo codes, and sponsor placements, with optional use of a YouTube Data API key for additional channel search.
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., "@Brand Sponsor Finder MCP Serverfind brands sponsoring fitness creators in the last 90 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.
Brand Sponsor Finder MCP Server
Find the brands that paid creators in a niche in the last 90 days, with the public evidence for each placement. One row per brand with a recency score, and one row per sighting with its evidence link, date, and promo code.
What's Inside
Related MCP server: Sponsorbook MCP
What it does
Reads public YouTube video descriptions (channel feeds, or your own YouTube Data API key), podcast show notes, newsletter issues, and event sponsor pages for sponsor lines, promo codes, and sponsor slots.
Follows shortlinks and affiliate redirects to the brand's own domain, and merges every sighting into one row per brand domain.
Checks the brands it found for open partnership job posts (Greenhouse, Lever, Ashby) and creator or affiliate program pages, which become the brand's public contact.
Returns only sightings inside your date window, each with an evidence link. Instagram, TikTok, and the Meta Ad Library are not read.
All of the work runs on Apify. This package is a thin client that starts the actor run, waits for it, and hands back the dataset rows.
Row cap and paging
One run can return hundreds of rows (633 rows and about 0.8 MB of text on a 30 day health and fitness search), which is more than an agent context holds. So each call returns at most max_rows rows: 50 unless you set it, and never more than 200.
The first call starts the run and returns the first page. The first content block is the JSON array of rows. The second is a paging block with
run_id,total_rows,rows_returned, andnext_cursor.To get the next page, call
find_brand_sponsorsagain with onlycursorset tonext_cursor. Addmax_rowsto change the page size.Repeat until
next_cursorisnull.
A cursor call starts no run. It reads the next page of rows the first run already wrote, so no row is billed twice. A cursor works for as long as Apify keeps that run's dataset.
Quick start
You need Node.js 18 or newer and an Apify account with an API token.
Add this to your Claude Desktop config (claude_desktop_config.json), Cursor, or any MCP client:
{
"mcpServers": {
"mamba-brand-sponsor-finder": {
"command": "npx",
"args": [
"-y",
"@mambalabsdev/mcp-brand-sponsor-finder"
],
"env": {
"APIFY_TOKEN": "your-apify-token"
}
}
}
}Restart the client. The find_brand_sponsors tool appears.
Prerequisites
Node.js 18 or newer.
An Apify API token from console.apify.com/account/integrations, set as
APIFY_TOKEN. The server lists its tool without a token; a call needs one.
Example prompts
"Find brands sponsoring health and fitness creators in the last 90 days."
"Which brands paid beauty YouTubers this month? Brand rows only."
"List coffee brands sponsoring podcasts and newsletters, with promo codes."
Tool
find_brand_sponsors. One tool. Example arguments:
{
"niche": "health and fitness",
"window_days": "90"
}Inputs
Every buyer facing input of the actor, unchanged, plus the two paging settings. Omitted inputs take the actor's own defaults. Numbers and booleans are sent as strings.
Input | Type | Description |
| string | The audience niche, for example "health and fitness", "beauty and skincare", or "food and beverage". Searches for channels, shows, and newsletters use it, and every row carries it. These three niches also start from a list of sources Mamba Labs has read before (turn off with use_niche_presets) |
| string | Optional. More search terms for the audience, one per line or separated by commas, for example "strength training". Each one widens the podcast, newsletter, and (with your key) YouTube channel search. Up to 20. A text field, so a Clay column maps straight in |
| string | Only sightings from the last N days. Whole number, default 90, at most 365. Sent as text so Clay works Default 90 |
| string | Optional. Which sources to run, separated by commas, any of: youtube, podcast, event, newsletter, job_post, program. Empty runs all of them. job_post and program check the brands the other sources found |
| string | Optional. YouTube channel URLs or @handles, podcast RSS feed URLs, or newsletter URLs to read first, one per line or separated by commas. Each is read even beyond the per source limits |
| string | Optional. Events whose sponsor or partner page to read, as a JSON list of objects: [{"name": "...", "url": "sponsor page URL", "date": "YYYY-MM-DD", "city": "...", "audience": "...", "size": "..."}], or one sponsor page URL per line. url is needed; the rest is optional. A dated event inside the window gives dated rows; an undated or upcoming event gives undated rows |
| string | true or false, default true. For health and fitness, beauty and skincare, and food and beverage, also read the channels, shows, newsletters, and event pages Mamba Labs has read before Default true |
| string | true or false, default true. One row per brand domain with sighting count, last seen date, sources, creators or events, contact, and recency score Default true |
| string | true or false, default true. One row per sighting with its evidence link, date, promo code, placement type, and pitch angle Default true |
| string | YouTube channels read per run. Whole number, default 20, at most 100. Sent as text so Clay works Default 20 |
| string | Newest uploads read per channel (the public feed holds 15). Whole number, default 15, at most 50. Sent as text so Clay works Default 15 |
| string | Podcast shows read per run. Whole number, default 15, at most 100. Sent as text so Clay works Default 15 |
| string | Newest episodes read per show. Whole number, default 8, at most 30. Sent as text so Clay works Default 8 |
| string | Newsletters read per run. Whole number, default 8, at most 50. Sent as text so Clay works Default 8 |
| string | Newest issues read per newsletter. Whole number, default 8, at most 30. Sent as text so Clay works Default 8 |
| string | Brands, most sighted first, whose job boards and program pages are checked. Whole number, default 25, at most 200. Sent as text so Clay works Default 25 |
| string | Optional. The run stops before it would charge more than this |
| string | Wrapper setting, not sent to the actor. Rows returned per call: whole number, default 50, at most 200 |
| string | Wrapper setting, not sent to the actor. The |
Pricing
Pay per event on Apify, billed to your Apify account. Prices in USD.
Event | Free plan | Bronze | Silver | Gold |
| $0.02 | $0.019 | $0.018 | $0.017 |
| $0.005 | $0.00475 | $0.0045 | $0.00425 |
| $0.002 | $0.002 | $0.002 | $0.002 |
Free rows: a run with no result writes one free row that says why, and a refused input writes one free row whose error_reason starts with input_invalid:.
Your keys
No key is needed. Your own YouTube Data API key is optional: set YOUTUBE_API_KEY in this server's environment and it is passed to the actor as youtube_api_key, so the key never goes through the conversation. With it the actor searches YouTube for channels in the niche and reads up to 50 uploads per channel.
Full actor documentation
apify.com/mambalabs/brand-sponsor-finder
License
MIT. See LICENSE.
Available Tools
1 toolfind_brand_sponsorsFind brands paying creators in a niche, with evidenceARead-only
Find brands with recent public proof of paid placement in a niche. Give a niche (for example health and fitness, beauty and skincare, food and beverage) and optionally audience keywords, seed YouTube channels, podcast feeds, or newsletters, and event sponsor pages. The actor reads public YouTube descriptions, podcast show notes, newsletter issues, event sponsor pages, partnership job posts, and brand creator program pages, and returns one row per brand domain (sighting count, last seen date, sources, creators or events sponsored, public contact, recency score) and one row per sighting (brand, domain, source, creator or event, date, evidence link, promo code, placement type, pitch angle). Instagram, TikTok, and the Meta Ad Library are not read. ROW CAP AND PAGING: a call returns at most max_rows rows (default 50, at most 200) as a JSON array in the first content block, and a paging block in the second with total_rows and next_cursor. To get every row, call again with only cursor set to next_cursor until next_cursor is null. A cursor call reads the same finished run's rows, starts no new run, and is not billed again. Input with nothing to run returns one free row whose error_reason starts with input_invalid:. A run that does not succeed is returned as an error with its run ID. Read-only; requires an APIFY_TOKEN; Apify charges per brand row, per sighting row, and per run start.
| Name | Required | Description | Default |
|---|---|---|---|
| niche | No | The audience niche, for example "health and fitness", "beauty and skincare", or "food and beverage". Searches for channels, shows, and newsletters use it, and every row carries it. These three niches also start from a list of sources Mamba Labs has read before (turn off with use_niche_presets). | |
| cursor | No | Wrapper setting, not sent to the actor. The next_cursor from the previous call's paging block. With a cursor the call starts no run and returns the next page of that run's rows, so nothing is billed again; every other input except max_rows is ignored. | |
| sources | No | Optional. Which sources to run, separated by commas, any of: youtube, podcast, event, newsletter, job_post, program. Empty runs all of them. job_post and program check the brands the other sources found. | |
| max_rows | No | Wrapper setting, not sent to the actor. Rows returned per call: whole number, default 50, at most 200. Reach the rest of the run's rows with cursor. | |
| window_days | No | Only sightings from the last N days. Whole number, default 90, at most 365. Sent as text so Clay works. Default 90. | |
| max_channels | No | YouTube channels read per run. Whole number, default 20, at most 100. Sent as text so Clay works. Default 20. | |
| max_podcasts | No | Podcast shows read per run. Whole number, default 15, at most 100. Sent as text so Clay works. Default 15. | |
| seed_sources | No | Optional. YouTube channel URLs or @handles, podcast RSS feed URLs, or newsletter URLs to read first, one per line or separated by commas. Each is read even beyond the per source limits. | |
| event_calendar | No | Optional. Events whose sponsor or partner page to read, as a JSON list of objects: [{"name": "...", "url": "sponsor page URL", "date": "YYYY-MM-DD", "city": "...", "audience": "...", "size": "..."}], or one sponsor page URL per line. url is needed; the rest is optional. A dated event inside the window gives dated rows; an undated or upcoming event gives undated rows. | |
| include_brands | No | true or false, default true. One row per brand domain with sighting count, last seen date, sources, creators or events, contact, and recency score. Default true. | |
| max_charge_usd | No | Optional. The run stops before it would charge more than this. | |
| max_newsletters | No | Newsletters read per run. Whole number, default 8, at most 50. Sent as text so Clay works. Default 8. | |
| audience_keywords | No | Optional. More search terms for the audience, one per line or separated by commas, for example "strength training". Each one widens the podcast, newsletter, and (with your key) YouTube channel search. Up to 20. A text field, so a Clay column maps straight in. | |
| include_sightings | No | true or false, default true. One row per sighting with its evidence link, date, promo code, placement type, and pitch angle. Default true. | |
| use_niche_presets | No | true or false, default true. For health and fitness, beauty and skincare, and food and beverage, also read the channels, shows, newsletters, and event pages Mamba Labs has read before. Default true. | |
| max_brands_to_check | No | Brands, most sighted first, whose job boards and program pages are checked. Whole number, default 25, at most 200. Sent as text so Clay works. Default 25. | |
| max_videos_per_channel | No | Newest uploads read per channel (the public feed holds 15). Whole number, default 15, at most 50. Sent as text so Clay works. Default 15. | |
| max_episodes_per_podcast | No | Newest episodes read per show. Whole number, default 8, at most 30. Sent as text so Clay works. Default 8. | |
| max_issues_per_newsletter | No | Newest issues read per newsletter. Whole number, default 8, at most 30. Sent as text so Clay works. Default 8. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: discloses the billing model (per brand row, per sighting row, per run start), that cursor calls start no run and are not billed again, the APIFY_TOKEN requirement, the max_charge_usd circuit breaker, and the error contract (free input_invalid row, failed run returned as an error with run ID). Nothing contradicts readOnlyHint=true or idempotentHint=false; describing a new run per fresh call is consistent with non-idempotency.
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?
Front-loads the purpose, then source coverage, then the return shape, then paging, then cost/auth/error behavior in a deliberate order. Sentences are dense but each carries an operational fact; the only mild redundancy is restating row contents that the parameters also describe.
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 19 parameters and no output schema, the description carries the return-shape burden and does so: one row per brand domain with named fields, one row per sighting with named fields, plus a paging block with total_rows and next_cursor. Cost, auth, failure modes, and source exclusions are all covered, so an agent can call it correctly on the first attempt.
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 still adds framing the schema does not, namely why values are sent as text (Clay interoperability), the cursor rule that all other inputs except max_rows are ignored, and that max_charge_usd aborts the run rather than truncating output. Some prose (two row types, defaults) duplicates the schema, keeping it out of 5 territory.
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 a specific verb and resource ('Find brands with recent public proof of paid placement in a niche') and immediately names the evidence set and both return row types. No siblings exist, but the scope is unambiguous: it is a sponsor-discovery search over named sources, not a lookup or a general web search.
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?
Explains required input (a niche), optional wideners (audience_keywords, seed_sources, event_calendar), and the run-vs-cursor alternation for paging. It also draws explicit boundaries by excluding Instagram, TikTok, and the Meta Ad Library, which prevents mis-selection. It lacks an explicit 'do not use when' statement, so it stops short of a 5.
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.
1 tool update
v1.1.0- Changed
find_brand_sponsors2 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Wrapper setting, not sent to the actor. The next_cursor from the previous call's paging block. With a cursor the call starts no run and returns the next page of that run's rows, so nothing is billed again; every other input except max_rows is ignored.", + "type": "string" +} - added
Input schema / properties / max_rowsAdded value: +{ + "description": "Wrapper setting, not sent to the actor. Rows returned per call: whole number, default 50, at most 200. Reach the rest of the run's rows with cursor.", + "type": "string" +}
1 tool update
v0.1.0- First observed
find_brand_sponsors
TDQS
Scored across 1 tool
There is only one tool, so there is no risk of selecting the wrong tool or confusing overlapping purposes. Its purpose—finding brand sponsors in a niche with optional seeds—is explicit and distinct.
The single tool uses a clear snake_case verb_noun convention: find_brand_sponsors. With only one name, there is no inconsistency across the set.
One tool is below the typical 3–15 range, but the server has a narrow, single-operation purpose and the tool encapsulates paging, validation, and detailed output internally. It is not a trivial tool, though a separate run-status or cancellation tool could have been reasonable.
The tool covers the core read-only sponsor-discovery workflow with detailed brand and sighting rows, paging via cursor, and input-error handling. Minor gaps include no dedicated run-status/cancel operation and explicit exclusion of Instagram, TikTok, and Meta Ad Library sources.
Maintenance
Related MCP Connectors
Public index of YouTube sponsorships: which brands sponsor which creators, from sampled videos.
YouTube sponsorship data: which brands sponsor which creators, and who to contact. Read only.
Find brands that sponsor podcasts and newsletters like yours, with dated public ad reads.
Find brands that already sponsor newsletters like yours, with sponsorship rates.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceConnects a podcast-sponsorship database to AI assistants, allowing users to search for brands that sponsor podcasts and reveal buyer contacts by name and email.MIT

Sponsorbook MCPofficial
AlicenseNot gradedqualityBmaintenanceEnables AI agents to research YouTube sponsors, inspect brands and their video evidence, explore overlapping creators and similar brands, manage research lists, and work with verified contacts.47 npmMIT- AlicenseAqualityCmaintenanceEnables agents to analyze X creators' niches, audiences and engagement, estimate sponsored-post prices with a transparent formula, rank creators against a brand brief, and run deals from offer through post verification to a recorded payout ledger. Every write is previewed and confirmed by a human, and the server never posts to X or moves money.161MIT
- AlicenseAqualityAmaintenanceEnables finding who sponsors a given newsletter or which newsletters a brand sponsors, by mining public Substack, beehiiv, and RSS archives for sponsor names, domains, placements, and issue links. Runs on Apify and returns dataset rows ready for analysis.1121 npmMIT