jev-kol-mcp
This server finds and evaluates TikTok/YouTube micro-KOLs for campaign fit and drafts outreach emails.
Search micro-KOLs with
search_kols: filter by platform (TikTok/YouTube), niche keyword, and follower/subscriber range; returns handles, bios, follower counts, locations, verified status, video counts, and more.Label creator niches automatically using Jev (e.g., Beauty_Skincare, Gaming_Esports, Finance_Investing) based on display name and bio.
Cache results locally in SQLite for 7 days to avoid repeated scraping; cached rows are reused without re-labeling.
Score campaign fit with
score_fit: get a 0–100 fit score plus dimensions for niche, tone, price band, outreach likelihood, and mismatch reasons.Draft outreach emails with
draft_email: generates a first collaboration email and a day-3 follow-up using a local template (not written by Jev).Work without keys gracefully: missing Apify token still allows setup guidance; missing Jev key still allows searches but without niche labels or scoring.
Allows searching TikTok creators by keyword and follower range, returning profile details such as handle, followers, bio, location, verified status, and primary niche.
Allows searching YouTube channels by keyword and subscriber range, returning profile details such as handle, followers, bio, location, verified status, and primary niche.
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., "@jev-kol-mcpfind TikTok micro-KOLs in fitness and score fit for our protein powder campaign"
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.
jev-kol-mcp
English · 中文
Find TikTok and YouTube micro-KOLs, label their niche, and score whether they fit a campaign.
MCP server powered by Jev, TypeSafe's System One model. Search and storage stay in this server. Jev answers typed questions. The host model writes the email.
Jev does not write the search results or the emails. It answers typed questions: one choice for the creator's niche, then a score, probabilities, and choices for whether that creator fits a campaign. Search and storage stay in this server. The host model writes the email. An optional skill in skills/draft-outreach tightens that draft.
Quick Install
Paste this into Cursor, Claude Desktop, or Cline. The agent can install from this text alone:
Install jev-kol-mcp for me.
1. Check that Node.js is 18 or newer and that npx is on PATH. Stop if either is missing. Run `command -v npx` and use that absolute path as command. Do not write the bare word npx. Cursor's own Node looks for a missing path inside Cursor.app and the server exits immediately.
2. Ask me for APIFY_API_TOKEN and JEV_API_KEY. If I do not have one yet, still write the config and leave that value as an empty string. Tell me which tool will not work. Do not invent a key, and do not print a key back to me.
3. Detect the client and merge this server into the existing mcpServers object. Do not remove other servers. Create the file if it is missing.
Cursor, this project: .cursor/mcp.json
Cursor, every project: ~/.cursor/mcp.json
Claude Desktop on macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Claude Desktop on Windows: %APPDATA%\Claude\claude_desktop_config.json
Cline: the mcpSettings file I point you to
4. Use this entry. Every env value is a string.
command: the absolute path from `command -v npx`
args: ["-y", "jev-kol-mcp@latest"]
env: APIFY_API_TOKEN, JEV_API_KEY, FETCH_LIMIT "12"
server key: jev-kol
5. Do not commit the config file. Do not run search_kols. Tell me the file you updated, whether each key was set, and that I should reload MCP. After reload the tools are search_kols, score_fit, and draft_email.The process speaks MCP over stdio. It is not an HTTP server, and it does not print a prompt. Logs go to stderr. Leave stdout for the MCP protocol.
Related MCP server: Creator Research MCP
Example
Ask for creators in a follower range. The agent searches, labels each niche, and scores the campaign.


What you can ask
Tool | What it does | Needs |
| Find creators by platform, keyword, and follower range |
|
| Score one creator against one campaign, 0–100 |
|
| First outreach email, plus a follow-up for day 3 |
|
draft_email checks that the Jev key is present, then fills a local English template. The body is not written by Jev. For a draft in the user's own words, copy skills/draft-outreach to ~/.cursor/skills/draft-outreach. The server instructions mention that path once when a user asks for an email. The server does not send mail. The follow-up is a second draft for the same thread, used only after the first email was sent and 3 days passed with no reply. One follow-up, same offer, then stop.
How a search runs
flowchart LR
A[search_kols] --> B{Local SQLite<br/>enough and fresh?}
B -->|yes| Z[Return cached rows]
B -->|no| E[Apify]
E --> G[Jev niche label]
G --> H[Save to ~/.jev-kol-mcp]
H --> ZThe same platform, keyword, and follower range is reused for 7 days. Cached rows are not scraped again and are not re-labeled. There is no ignore-cache flag. Delete ~/.jev-kol-mcp/kols.sqlite to search again; the next search creates an empty database. A failed Jev call does not fail the search: the profile is stored with an empty niche.
Without JEV_API_KEY, search_kols still returns creators and primaryNiche stays empty. It is not filled with Other. score_fit and draft_email return setup guidance instead.
Follower bounds are sent to the scraper. This server still drops anything outside the range before it returns rows.
Platform | Apify actor | What the range filters |
TikTok | followers | |
YouTube | public subscribers |
FETCH_LIMIT is how many matching profiles to request. Default 12. All of them are stored. limit on the tool is how many to return: default 5, maximum 20.
YouTube's countryHint is left at the actor default. It biases ranking. It does not keep only channels from that country.
What comes back
Each stored creator has these fields. Avatars are not stored.
Field | Meaning |
| Account handle, with |
| Name shown on the profile |
| TikTok followers, or YouTube subscribers |
| Public profile text |
| Email read from the public bio with a regex. |
|
|
| Profile page |
| Whether the actor marked the account verified. |
| Number of public videos |
| TikTok likes. Always |
| YouTube views. Always |
| TikTok region code when the actor reports one, or the YouTube channel country. Often empty on TikTok |
| Links in the bio. Empty for the current TikTok actor. YouTube entries are URLs without anchor text |
| One label from the table below. Empty when Jev was not called or the call failed |
Niche label
Jev picks one primary niche from the display name and bio. The label is not an input to score_fit. Campaign fit is a separate Jev call.
Label | What it covers |
| Skincare, makeup, aesthetics, wigs |
| Men's grooming, beard care, fragrance, styling |
| Everyday clothing, shoes, bags, outfits, accessories |
| Accessible luxury, jewelry, watches |
| Consumer electronics, smart home, drones, desk setups |
| AI tools, productivity software, apps, Web3 or crypto products |
| Console or mobile game reviews, streams, esports gear |
| Gym workouts, yoga, supplements, fat loss |
| Camping, hiking, fishing, skiing, extreme sports |
| Home decor, kitchen, appliances, lifestyle vlogs |
| Food, restaurant visits, baking, quick recipes, drinks |
| Parenting, baby products, children's toys |
| Cat and dog products, pet content, exotic pets |
| Cars, EVs, motorcycles, cycling |
| Personal finance, stocks, crypto investing, property |
| Language learning, careers, study abroad, exams |
| Crafts, painting, 3D printing, design |
| Comedy, street interviews, film and anime, music and dance |
| The bio is too thin, or no single niche is clearly primary |
Campaign fit
score_fit sends the handle, bio, and campaign description to https://api.typesafe.ai/v1/systemone. It does not see follower counts, location, or the niche label. The model defaults to jev-latest (JEV_MODEL).
Field | Meaning |
| 0–100, from Jev's 0–3 fit score |
| 0 unrelated · 1 weak · 2 partial · 3 strong |
| Probability that the bio and the product are the same category |
|
|
| Inferred price band, not the creator's rate |
| That band in USD, or |
| Probability that a first email is worth sending now |
|
|
Tone is judged from the bio only. Price bands are food 15–80, everyday 20–100, beauty 25–120, fitness 30–150, home 30–200, tech 80–400, luxury 200–800. unknown means the bio is not enough.
A strong fit requires niche, tone, and price to agree. One clear miss cannot score as a strong fit.
Use
Node.js 18 or newer. Add the server to the MCP client. Cursor reads .cursor/mcp.json in the project, or ~/.cursor/mcp.json for every project. npx downloads the package the first time it starts. You do not clone this repo. command must be the absolute path from command -v npx, not the bare word npx.
{
"mcpServers": {
"jev-kol": {
"command": "/absolute/path/from/command -v npx",
"args": ["-y", "jev-kol-mcp@latest"],
"env": {
"APIFY_API_TOKEN": "your_apify_api_token",
"JEV_API_KEY": "your_jev_api_key",
"FETCH_LIMIT": "12"
}
}
}
}env values are strings, including FETCH_LIMIT. Reload the MCP server after saving the file. The name jev-kol is only the key in this snippet. Cursor shows whatever key you choose.
Install from source
Use this when you are changing the server. The npx config above is enough for normal use.
npm install
cp .env.example .env
npm run buildnpm run watch recompiles into dist/ on save. npm start runs the local build. Point the client at that file instead of npx:
{
"mcpServers": {
"jev-kol": {
"command": "node",
"args": ["/absolute/path/to/jev-kol-mcp/dist/index.js"],
"env": {
"APIFY_API_TOKEN": "your_apify_api_token",
"JEV_API_KEY": "your_jev_api_key",
"FETCH_LIMIT": "12"
}
}
}
}Missing keys return setup instructions. The process stays up. Placeholder values such as your_apify_api_token_here count as missing.
Variable | Required | Default |
| for search | — |
| for niche labels, fit scores, and email drafts | — |
| no |
|
| no |
|
Apify token: https://console.apify.com/account/integrations
Jev key: from TypeSafe, sent as
Authorization: Bearer
Client-injected environment variables win over .env.
The SQLite file lives at ~/.jev-kol-mcp/kols.sqlite. Deleting it creates an empty database on the next search. Clearing an npx cache does not delete it.
Put real keys in env. Do not commit them. To have an agent write the config from a prompt, use skills/jev-kol-mcp-installer.
Example prompts
search_kols takes a platform, a keyword, and a follower range. It does not take a country or a niche label. score_fit needs the creator's bio and the campaign description. The email offer has to come from you.
Use jev-kol search_kols on TikTok for skincare creators with 10,000 to 200,000 followers. Return 5. List handle, followers, location, primary niche, and bio. Do not score them.Use score_fit for @maya.glow. Bio: clean makeup and affordable daily skincare. Campaign: a budget skincare product about real daily use. Do not draft an email.Search YouTube for coffee espresso channels with 5,000 to 200,000 subscribers. Return 3 with handle, subscribers, and bio. Score each bio against a campaign for a manual espresso machine. Draft an outreach email only for the strongest fit. Ask me for the offer before you write it.License
Available Tools
3 toolsdraft_emailDraft outreach emailA
Draft a first collaboration email and a follow-up for day 3. A missing JEV_API_KEY returns setup guidance.
| Name | Required | Description | Default |
|---|---|---|---|
| kolHandle | Yes | KOL handle | |
| offerDetails | Yes | Fee, deliverables, product, or other offer terms | |
| campaignDescription | Yes | Campaign description, inserted into the body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does usefully disclose that a missing JEV_API_KEY triggers setup guidance, but it does not state whether the tool sends emails or only returns drafts, nor any other failure modes or 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 with no filler. The primary action is front-loaded, and the missing-key behavior is conveyed in a single additional sentence. Every word 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?
For a simple 3-parameter drafting tool, the description covers the core output and a key error case. However, since there is no output schema, it could be more explicit about what a successful response contains, though 'Draft... email' strongly implies the returned drafts.
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 the schema already documents all three parameters. The description adds no extra meaning about kolHandle, offerDetails, or campaignDescription beyond what the schema provides, so the baseline score of 3 applies.
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 ('Draft') and the specific deliverable ('a first collaboration email and a follow-up for day 3'). This is distinct from the sibling tools search_kols and score_fit, which perform search and scoring rather than content generation.
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?
There is no guidance about when to choose this tool over search_kols or score_fit, nor any mention of prerequisites or placement in a workflow. The only conditional information is the missing-key behavior, which is not a usage guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_fitScore campaign fitA
Ask Jev System One to judge niche, tone, price band, and whether outreach is worth sending. A missing JEV_API_KEY returns setup guidance.
| Name | Required | Description | Default |
|---|---|---|---|
| kolBio | Yes | KOL bio | |
| kolHandle | Yes | KOL handle, for example @maya.glow | |
| campaignDescription | Yes | Campaign or product description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It usefully notes that a missing JEV_API_KEY returns setup guidance, but it does not disclose the success output format, whether the operation is read-only, or other failure modes. Some context is added, but significant behavioral gaps remain.
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 important API-key edge case is included as a compact second sentence.
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 three-parameter scoring tool, this is fairly complete: it states what the tool judges, implies the output concept, and flags a key environment dependency. It does not detail the return payload, but no output schema exists and the description still gives enough context for correct invocation.
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 the schema already documents all three parameters. The description adds context about evaluation dimensions (niche, tone, price band) but does not map them to specific parameters or add meaning beyond the parameter descriptions. 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's action: ask Jev System One to judge niche, tone, price band, and outreach-worthiness. This is specific and distinct from sibling tools like search_kols and draft_email, so there is no ambiguity about what the tool does.
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 used when a fit judgment is needed, but it does not explicitly say when to use it versus alternatives like search_kols or draft_email, nor does it explain whether it should precede or follow those tools. Usage context is only implied, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_kolsSearch micro-KOLsA
Search micro-KOLs by platform, niche, and follower range. Reads the local SQLite cache first. If that is thin and the community pool is enabled, reads the shared pool next. Otherwise calls Apify and passes the follower range to the actor. Fresh profiles are labeled with Jev before they are stored. They are uploaded only when sharing is on. A missing APIFY_API_TOKEN returns setup guidance and does not exit the process.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many rows to return. Default 5, maximum 20 | |
| niche | Yes | Niche keyword, for example skincare, fitness, or gadgets | |
| platform | Yes | Platform: tiktok or youtube | |
| maxFollowers | Yes | Maximum followers, inclusive | |
| minFollowers | Yes | Minimum followers, inclusive |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and excels. It discloses the read order (local SQLite, then shared pool if enabled and thin, otherwise Apify), the Jev labeling of fresh profiles, upload behavior conditioned on sharing, and the graceful handling of a missing APIFY_API_TOKEN (returns setup guidance without exiting). This is thorough and goes well beyond what the schema could convey.
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 compact paragraph that front-loads the core purpose and then efficiently lists behavioral details. Every sentence contributes new information without redundancy. It is slightly longer than strictly necessary but remains focused and well-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?
Given the tool's complexity (5 parameters, no output schema, multiple data sources), the description is quite complete. It covers the data source selection, labeling, sharing, and error handling. It does not describe the return format or pagination, but no output schema exists, so the agent is left to infer the response shape. Minor gaps exist but are not critical for basic invocation.
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 the baseline is 3. The description adds minimal extra meaning—only that the follower range is passed to the Apify actor, which is already implied by the schema. It does not clarify the limit parameter or other nuances beyond what the schema already states.
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 micro-KOLs by platform, niche, and follower range, with a specific verb and resource. It distinguishes itself from siblings (score_fit, draft_email) by its search-oriented purpose and data sources. The opening sentence is direct and unambiguous.
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 the internal data source fallback logic (cache → pool → Apify) but does not explicitly tell an agent when to choose this tool over siblings or when not to use it. It implies usage through its purpose but lacks direct alternatives or exclusion criteria. The sibling names suggest distinct functions, but no explicit routing guidance is given.
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.
3 tool updates
v0.1.0- First observed
draft_email - First observed
score_fit - First observed
search_kols
TDQS
Scored across 3 tools
Each tool targets a distinct stage of the outreach workflow: searching candidates, scoring their fit, and drafting emails. No two tools could plausibly be confused for one another.
All tool names follow a consistent snake_case verb_noun pattern (search_kols, score_fit, draft_email). The pattern is uniform and predictable.
Three tools is well-scoped for a focused micro-KOL outreach server. Each tool serves a clear purpose in the pipeline without redundancy or bloat.
The search→score→draft workflow covers the core outreach preparation lifecycle. Minor gaps exist such as no tool to manage saved KOLs or actually send emails, but these are outside the apparent scope.
Maintenance
Related MCP Connectors
Agent-callable creator intelligence: 952+ scored YouTube creators across 180 niches.
SKILL-02 (not SKILL-01): AI influencer search on TikTok, Instagram & YouTube. sk_live_ token.
TikTok data for AI agents: videos, creators, sounds, hashtags, trends. Content + creator research.
Find viral outlier posts on TikTok, Instagram and YouTube, pull creator stats, and crawl on demand.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables automated generation and publishing of TikTok Shop Affiliate videos using 7 AI agents. Integrates research, script writing, video production, and publishing through the MCP protocol.26-
- AlicenseNot gradedqualityBmaintenanceFetches content data from YouTube, TikTok, Twitter, LinkedIn, articles, and PDFs so LLM clients can analyze content performance and generate insights.14 npm1MIT
- AlicenseNot gradedqualityBmaintenanceBrings social media analytics and content intelligence into any MCP-compatible AI agent, enabling analysis of your own videos, competitor research, and creator discovery via a hosted OAuth-authenticated server.10MIT
- AlicenseAqualityBmaintenanceEnables AI agents to automate the full affiliate e-commerce workflow across Shopee and TikTok Shop, including product hunting, seller auditing, review mining, and generating video storyboards and VideoFactory projects. It provides nine MCP tools for search, intelligence extraction, database queries, and system health checks.1291MIT