Creator discovery & analytics across YouTube, Instagram, TikTok (30M+) + brand/sponsor intel.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Inspect callable tools, capabilities, and parameters exposed to AI agents by CreatorDB.
get_api_usageDaily request counts and credit consumption by endpoint. Defaults to last 7 days; takes optional `start`/`end` Unix-ms timestamps.
search_creators_nlsNatural-language search across all three platforms. The AI picks the platform and converts the query into filters.
search_youtubeStructured filter search. Use `totalSubscribers` for count thresholds.
search_instagramStructured filter search. Use `totalFollowers` for count thresholds.
search_tiktokStructured filter search. Use `totalFollowers` for count thresholds.
search_sponsorsBrand search by structured filters. Lean records (brandId, name, logo, industries, country).
A Model Context Protocol server that exposes the CreatorDB V3 API to any MCP-compatible client (Claude Code, Claude Desktop, Cursor, etc.).
45 tools across six surfaces:
Every tool returns the underlying V3 JSON plus a Credits used: N | Remaining: M footer line, so the AI knows exactly what it's spending.
Working with Claude Code? Open this README in Claude Code (or paste the URL into a Claude session) and say "set up this MCP for me." The steps below are written so an AI assistant can follow them top to bottom.
There are two ways to connect, depending on your client:
npx β see Install (local / stdio).Both expose the same 45 tools. Both need a CreatorDB V3 API key.
node -v to check)/mcp in Claude Code β creatordb should appear with status connectedFor Claude Code, Claude Desktop, and Cursor. The server reads one environment variable: CREATORDB_API_KEY (your V3 key).
npx from npm (recommended)The package is published to npm as @creatordbai/mcp-server. No local clone, no SSH key, no GitHub access required:
Claude Code:
Claude Desktop β edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
If you have GitHub org access and want to track main instead of the npm release, swap the npm name for git+ssh://git@github.com/CreatorDB/creatordb-mcp-server.git β the repo's prepare script will build on install.
Good if you want to read/modify the source, or if npx from git doesn't work in your environment.
For Claude Desktop, use the same JSON as Method A but swap command + args:
.mcp.json (best for teams)Drop a .mcp.json into a CreatorDB project repo. Anyone who opens that repo in Claude Code gets prompted to enable the MCP β no per-person setup commands.
${CREATORDB_API_KEY} reads from the user's shell environment, so the key stays out of git. Each teammate sets it once in their .zshrc/.bash_profile:
Claude in the browser and the mobile apps can't spawn local subprocesses, so they connect to the hosted HTTP endpoint instead of running npx:
In Claude web: Settings β Connectors β Add custom connector, paste the URL, and provide your V3 API key as a Bearer token. The same 45 tools appear.
Notes:
Authorization header and this endpoint keeps no separate copy of it. (CreatorDB stores the key itself as the credential it issued you, to validate each request.)asia-northeast1; source is in functions/.{"status":"ok",...} if the service is up.You don't update a key inside the MCP server β it doesn't store keys. You change it in your client's MCP configuration and restart.
Edit the same config file you used during setup:
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)~/.cursor/mcp.json (or the in-app MCP settings UI)~/.mcp.json or your project's .mcp.jsonChange the CREATORDB_API_KEY value, then fully restart the client (βQ + reopen for Claude Desktop, restart the Cursor app, etc.). MCP clients only read the key at process startup.
If you set the key from your shell environment (Method C above, with ${CREATORDB_API_KEY} syntax), update ~/.zshrc / ~/.bash_profile and restart your terminal before restarting the client.
In Settings β Connectors β CreatorDB, either:
Changing the key on the client side only swaps which key your tools authenticate with. It does NOT invalidate the previous key. If you're rotating because the old key was exposed:
The MCP server never persists your key past a single request, so there's no server-side "stored key" to purge.
After install, restart Claude Code (or your MCP client) and:
/mcp β you should see creatordb listed with status connectedCredits used: 2 | Remaining: β¦ footer| Symptom | Cause | Fix |
|---|---|---|
/mcp shows creatordb as failed or connecting forever | API key missing or wrong | Re-add with claude mcp remove creatordb && claude mcp add β¦ using the correct key |
Tools work but every response ends Credits used: undefined | Stale tool schema from an older build of this server | Restart the MCP client β clients cache the schema at session start |
Error: VALIDATION_ERROR on Instagram tools | Passing userId instead of uniqueId | IG endpoints take the handle as uniqueId. Older clients with stale schemas hit this most |
npx install fails with EACCES: permission denied | npx cache permission issue | rm -rf ~/.npm/_npx and re-run |
Error: ENOENT or cannot find dist/index.js | Method B didn't run npm run build | cd into the repo and run npm install && npm run build |
| Tool descriptions seem outdated vs this README | Schema cached from an old version | claude mcp remove creatordb && claude mcp add β¦ to force a re-fetch |
Why restarts matter β MCP clients fetch the tool list once at session start. Server updates (new tools, renamed params, fixed costs) only show up after the client reconnects. This is the single most common confusion.
Upgrading to a newer published version?
npxcaches packages by exact version, so a configured client keeps running whatever version it first downloaded. To force-pull the latest, either pin to@latestin your config (npx -y @creatordbai/mcp-server@latestre-resolves each launch) or clear the npx cache once (rm -rf ~/.npm/_npx). Then restart the MCP client.
The .github/workflows/release.yml workflow publishes to npm whenever a v*.*.* tag is pushed.
The workflow validates that the tag matches package.json version, runs npm ci, builds, and publishes via npm Trusted Publishing with sigstore provenance attestation. No long-lived NPM_TOKEN is stored β the workflow exchanges a GitHub OIDC token for a short-lived npm publish token at runtime.
45 tools across six categories. Every tool returns a structured JSON payload plus a Credits used: N | Remaining: M footer line.
| Tool | Cost | Notes |
|---|---|---|
get_api_usage | 0 | Daily request counts and credit consumption by endpoint. Defaults to last 7 days; takes optional start/end Unix-ms timestamps. |
| Tool | Cost | Notes |
|---|---|---|
search_creators_nls | dynamic (token-based) | Natural-language search across all three platforms. The AI picks the platform and converts the query into filters. |
search_youtube | 1 per 10 filters | Structured filter search. Use totalSubscribers for count thresholds. |
search_instagram | 1 per 10 filters | Structured filter search. Use totalFollowers for count thresholds. |
search_tiktok | 1 per 10 filters | Structured filter search. Use totalFollowers for count thresholds. |
Filter type gotcha: numeric ops (>, <, = on subscriber/follower/rate fields) require a number value, not a numeric string. "1000000" β VALIDATION_ERROR; 1000000 β ok.
Hashtag value gotcha: stored hashtags on IG/TT carry the leading #, so filter values usually want "#beauty", not "beauty".
Brand-side intelligence: which brands sponsor creators, how much they spend, which creators they work with. Sponsor data covers YouTube and Instagram only β TikTok is not indexed for brands.
Brand-key: brandId, typically the brand's primary domain (e.g. "acer.com", "nike.com").
| Tool | Cost | Returns |
|---|---|---|
search_sponsors | 2 per page | Brand search by structured filters. Lean records (brandId, name, logo, industries, country). |
list_sponsors | 1 per page | Paginated directory of all 10K+ indexed brands. |
get_sponsor_information | 2 | Full brand profile: aliases, keyPeople, industries, location, website, socialMedia, competitors. |
get_sponsor_creators | 25 per page | Inverse of get_*_sponsorship β which creators has this brand sponsored. Returns followers, lastSponsoredDate, sponsoredCount, topics, niches per creator. |
get_sponsor_performance | 25 per page | Per-content sponsorship perf. Three stats scopes per creator (creatorTotal, allSponsored lifetime, this-brand-only). YT-only: estimatedCost, CPM. |
get_sponsor_audience | 25 | Aggregated audience demographics across the brand's sponsored creator pool. IG block reserved but null today (backend YT-only). |
get_sponsor_summary | 25 | Cross-platform rollup: totalSponsoredCreators/Content, per-platform creators + performance + growth30d. |
submit_sponsor | 1 (0 if duplicate) | Submit a brand for indexing. Rate-limited 100/day per key. Returns submissionId + status. |
Cost warning β get_sponsor_creators, get_sponsor_performance, get_sponsor_audience, get_sponsor_summary each cost 25 credits per call. Use search_sponsors / list_sponsors / get_sponsor_information for cheap exploration first.
Creator-key: channelId (the UCβ¦ form β @handle / /c/ / /user/ URLs are not accepted; resolve first).
| Tool | Cost | Returns |
|---|---|---|
get_youtube_profile | 2 | Identity, subscribers, country, language, linked socials, channel categories, plus the creator's topics and niches. |
get_youtube_contact | 15 | Email addresses. |
get_youtube_performance | 2 | R20 (last 20 videos) + all-time (up to 800) engagement metrics; consistency scores. |
get_youtube_performance_history | 3 | Daily snapshots over the past N days. Takes pastDayRange (string integer, 1β365). |
get_youtube_audience | 10 | Age buckets, gender split, top countries. |
get_youtube_content_detail | 3 | Recent videos + shorts with per-item engagement. |
get_youtube_sponsorship | 5 | Sponsored content grouped by indexed brand (recent posts only β empty list β "no sponsors"). |
list_youtube_topics | 1 | The full YT TOPIC taxonomy (~470+ entries with channelCount). YouTube-only β IG and TT do not have a topic taxonomy. No parameters. |
list_youtube_niches | 1 | The full YT NICHE taxonomy (~14K entries with channelCount). No parameters. |
search_youtube_content | 2 per page | Search individual VIDEOS/SHORTS/STREAMS by content-level filters (different from search_youtube, which searches creators). Returns title, publishTime, views, isSponsored, partneredBrands, hashtags + nested creator block. Both content-level and creator-level filters supported. |
get_youtube_subtitles_meta | 1 | Per-video subtitle track listing. Takes videoId (not channelId). |
get_youtube_subtitles_download | 3 | Subtitle text for one video. Takes videoId, optional language (ISO 639-3). |
Creator-key: uniqueId (the handle, no @).
| Tool | Cost | Returns |
|---|---|---|
get_instagram_profile | 2 | Identity, followers, country, language, isBusinessAccount, linked socials, hashtags, account categories, plus the creator's niches. |
get_instagram_contact | 15 | Email addresses. |
get_instagram_performance | 2 | First-page image + reels engagement; consistency scores. |
get_instagram_performance_history | 3 | Daily snapshots over the past N days. Takes pastDayRange. |
get_instagram_audience | 10 | Age buckets, gender split, top countries. |
get_instagram_content_detail | 2 | Recent images + reels with per-item engagement. |
get_instagram_sponsorship | 5 | Sponsored content grouped by indexed brand (recent posts only). |
search_instagram_content | 2 per page | Search individual IMAGES/REELS by content-level filters (different from search_instagram, which searches creators). NO views or lengthSec (IG data model). Returns description, publishTime, likes, isSponsored, partneredBrands, hashtags + nested creator block. |
list_instagram_niches | 1 | The full IG NICHE taxonomy. Instagram does NOT have a "topics" taxonomy. No parameters. |
Creator-key: uniqueId (the handle, no @).
| Tool | Cost | Returns |
|---|---|---|
get_tiktok_profile | 2 | Identity, followers, country, language, hashtags, plus the creator's niches. |
get_tiktok_contact | 15 | Email addresses. |
get_tiktok_performance | 2 | Recent videos engagement (views, likes, comments, shares); consistency scores. |
get_tiktok_performance_history | 3 | Daily snapshots over the past N days. Takes pastDayRange. |
get_tiktok_audience | 10 | Age buckets, gender split, top countries. |
get_tiktok_content_detail | 2 | Recent videos with audio metadata, duet/stitch/commerce flags, per-item engagement. |
search_tiktok_content | 2 per page | Search individual VIDEOS by content-level filters (different from search_tiktok, which searches creators). NO isSponsored/partneredBrands (TT brand-attribution not implemented). Filter terminology uses diggs but response normalizes to likes. |
list_tiktok_niches | 1 | The full TT NICHE taxonomy. TikTok does NOT have a topics taxonomy, and does NOT expose a per-brand sponsorship endpoint. No parameters. |
| Dimension | YouTube | TikTok | |
|---|---|---|---|
| Creator parameter | channelId (UCβ¦) | uniqueId (handle) | uniqueId (handle) |
| Follower field | totalSubscribers | totalFollowers | totalFollowers |
| Has a topic taxonomy | β
list_youtube_topics | β | β |
| Has a niche taxonomy | β
list_youtube_niches | β
list_instagram_niches | β
list_tiktok_niches |
Per-creator niches in /profile | β | β | β |
Per-creator topics in /profile | β | β | β |
| Sponsorship per-brand endpoint | β | β | β |
Content types in /content-detail | videos + shorts | images + reels | videos |
/content-detail cost | 3 | 2 | 2 |
| Performance windows | R20 + all-time (up to 800) | First-page | Recent |
| Engagement formula | (L+C+V) / subscribers | (L+C) / followers | (L+C+Shares) / followers |
| Subtitles endpoints | β | β | β |
| Content-search endpoint | β | β | β |
| Brand-side sponsor data | β | β | β |
Niche IDs are not interchangeable across platforms β id_vlog_PeopleBlogs (YT) and id_love_All (IG) live in different namespaces. Niche/topic IDs follow the pattern id_{slug}_{Category}, so you can group by category by splitting on the last _.
These are the fields that aren't obvious from the endpoint name but you'll reach for constantly. All confirmed against live responses.
/profileShared across YT/IG/TT:
subscriberGrowth: { g7, g30, g90 } β % change in subscribers/followers over the last 7/30/90 days. Free trend signal β no need to call performance-history if you only want the headline number.hashtags: [{ name, contentCount }] β hashtags the creator uses (note: name carries the # on IG/TT).niches: ["id_vlog_PeopleBlogs", β¦] β per-creator niche IDs. To resolve the human-readable name + category + channelCount, cross-reference list_{platform}_niches.relatedCreators β discovery vector. YT gives ~50β250 UC channelIds; IG gives ~50 handles. Cheap way to expand a seed list.lastPublishTime / lastDbUpdateTime β Unix-ms; pair them to know how stale the snapshot is vs how recently the creator posted.country β ISO 3166-1 alpha-3 (e.g. "USA", "JPN"). On IG this value is derived from a content classifier rather than a self-declared field, and can occasionally be wrong for creators with multi-country presence β cross-check against audienceLocations and the creator's bio if accuracy matters.YT-only:
topics: ["id_challenges_Comedy", β¦] β coarse topic IDs (~470 universe). Resolve via list_youtube_topics.videoPrice + shortsPrice: { cpmLow, cpmRaw, cpmHigh, priceLow, priceRaw, priceHigh } β sponsored video / shorts CPM and dollar rate bands. YouTube-only; IG/TT do not return pricing in /profile.categoryBreakdown: [{ category, share }] β share of recent content by YouTube native category.hasMemberOnlyContents β boolean.IG-only:
isBusinessAccount, isPrivateAccount β flags worth checking before promising audience data; private accounts can't be scraped.otherLinks β bio links array.TT-only:
otherLinks β bio link (TikTok allows one)./audienceIdentical shape across platforms:
audienceLocations: [{ country, share }] β top 6 countries with shares summing to roughly 1.0.audienceGender: { maleRatio, femaleRatio } β sums to ~1.0; binary split only.audienceAvgAge β integer.audienceAgeBreakdown: [{ ageRange, share }] β fixed buckets 13-17 | 18-24 | 25-34 | 35-44 | 45-54 | 55-64 | 65+. Always 7 entries; placeholder rows are all-zero (see footgun list below)./performanceThe R20-vs-all distinction is YT-only:
videosPerformanceRecent, videosPerformanceAll, shortsPerformanceRecent, shortsPerformanceAll. "Recent" = R20 (last 20). "All" = up to 800. Each has likes/comments/views (with avg/median/min/max/percentile25/percentile75/iqr) and an engagement block.imagesPerformanceRecent + reelsPerformanceRecent. No all-time window.videosPerformanceRecent. No all-time window.engagement block ends with engagementConsistency: { cv, medianVsMean, topBottomRatio, consistencyScore, consistencyLevel }. consistencyScore is 0β100; consistencyLevel is "high" (81β100), "moderate" (51β80), or "low" (0β50). Requires β₯6 content pieces, otherwise the consistency block is absent.ranking block carries global, country, language percentile ranks for totalSubscribers/totalFollowers and avgEngagementRate β useful for "is this creator above average for their country" without separate benchmarking.recentVideosGrowth.g7/g30/g90 β engagement-rate delta over 7/30/90 days. Negative numbers mean engagement is declining.contentCountByDays: { 7d, 30d, 90d } β how many posts in each window (use to detect dormant creators)./content-detailPer-item objects across platforms:
publishTime (Unix-ms), contentId, likes, comments, views (YT/TT only β IG images have no view count), engagementRate (rounded to 4 decimals).hashtags: ["#example", β¦] β already includes # prefix.Platform-specific extras:
length (seconds), isMemberOnly, content mix includes both videos and shorts.mentionedCreators β @-mentions in caption.audioId, audioTitle, audioAuthor, audioAlbum, isDuetEnabled, isAd, length (seconds), shares. The audio block is the cheapest way to find trending sounds.Freshness rule β content published within the last 4 days is excluded from all metric calculations (all platforms). Pinned-post rule β on IG/TT, a pinned post older than 90 days is excluded if it would be the oldest item in the sample.
/sponsorshipYT and IG only β TikTok does not have a per-brand sponsorship endpoint.
sponsorList: [{ brandName, brandId, brandIgIds, sponsoredVideos, sponsoredVideosPerformance }].brandIgIds β the brand's IG handles. Use this to follow a brand from a sponsored creator back to the brand's own profile.sponsoredVideos includes each sponsored content's full per-item engagement (same shape as /content-detail).sponsorList is not proof the creator has no sponsors; it's "we didn't find indexed sponsors in their recent posts."search_{platform} and search_creators_nls)Structured search response:
creatorList: [{ displayName, uniqueId, channelId (YT only), avatarUrl, totalSubscribers | totalFollowers }] β minimal projection; hydrate with get_*_profile for full data.totalResults β total matching the filter set, not just the page.hasNextPage + nextOffset β pagination idiom. Pass nextOffset as the next request's offset to advance.NLS response:
creatorList shape as structured search, plus a platform: "youtube" | "instagram" | "tiktok" field telling you which platform the AI routed to.data: event and returns it as one payload./usagerecords: [{ date (YYYYMMDD), requestCount, totalQuotaUsed, endpoints: { β¦per-endpoint counts }, platforms: { β¦per-platform counts }, quotaByPlatform }].totalQuotaUsed can be fractional (e.g. 4.49 for an NLS call).endpoints keys are camelCase: getYoutubeProfile, getInstagramAudience, searchYoutube, getNLS, etc. Useful for building a spend dashboard./audience returns the all-zero shape (audienceGender: { maleRatio: 0, femaleRatio: 0 }, age buckets all 0.0). Treat any row where male+female=0 as missing, not as "no gender data."sponsorList β no sponsors (see above).relatedCreators is unranked β order is not significance. Don't slice the first N and call them "top related"; sample or rerank by your own metric.lastDbUpdateTime is when CreatorDB last refreshed. If it's older than ~14 days, the profile may not reflect recent breakout content.list_*_niches is updated daily; don't cache it longer than that or your "creators in X niche" count will lag reality.country is classifier-derived β unlike YT/TT (which read from self-declared profile fields), Instagram country is inferred from content. Treat it as a best-effort signal, not ground truth. Cross-check against audienceLocations and bio language when accuracy matters.Common fields across all three platforms:
displayName β string, supports fuzzyuniqueId β string, exactcountry β string, ISO 3166-1 alpha-3 (e.g. "USA", "JPN", "GBR")mainLanguage β string, ISO 639-3 (e.g. "eng", "jpn", "zhs")hashtags β string (with # prefix on IG/TT)niches β string (use IDs from the platform's list_*_niches)mainAudienceLocation / mainAudienceAge / mainAudienceGender β stringhasSponsors β booleanPlatform-specific:
totalSubscribers (number), topics (string from list_youtube_topics)totalFollowers (number)Operators: >, <, = for numbers; =, in for strings; = for booleans. in takes an array of up to 100 values. pageSize max 100; filters max 10 per request.
Every tool returns the underlying CreatorDB V3 envelope:
On error, the envelope carries errorCode, error, message, and details. The MCP layer flattens that into a clean error message with a TraceId: line for support.
Source layout:
MIT
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/creatordb)<a href="https://allmcps.com/mcp/creatordb"><img src="https://allmcps.com/api/badge/creatordb?style=directory" alt="CreatorDB on AllMCPs" /></a>