youtube-intel-mcp
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., "@youtube-intel-mcpRank these video candidates by opportunity score and cluster titles"
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.
youtube-intel-mcp
An MCP server that packages the competitor-intelligence scoring engine from yt-competitor-swipe as tools any MCP client — Claude, another agent, a script — can call directly, with no server-side network access and no API key.
You fetch the candidate videos however you like (the YouTube Data API, yt-dlp, an export you already have); this server scores, tags, and clusters them. It never fetches anything itself.
Why package it this way
The source engine's scoring math (a blended Opportunity Score across six signals) and its topic taxonomy are the reusable part — the part worth handing to any agent working on any channel, not just the pipeline it was built inside. An MCP server is the natural packaging for that: the scoring logic becomes a tool call instead of a Python import, callable from inside a Claude conversation, another agent's workflow, or a one-off script, with a typed, documented interface instead of "go read score.py."
Related MCP server: yt-intel MCP Server
Tools
Tool | What it does |
| Blended 0-100 Opportunity Score: views-per-hour percentile, outlier multiple vs a channel baseline, engagement-velocity z-scores, demand gap, title-cluster convergence. Returns the input candidates annotated and sorted. |
| Ranks a keyword list by how under-served it is (strong demand, thin or stale competitor supply) and attaches a |
| Rule-based topic tagging from a title-hint taxonomy you supply, with an optional fallback to labels from an earlier human/model judgment pass. Never guesses; leaves a candidate untagged rather than inventing a label. |
| Groups a list of titles into subtopic clusters by their rarest shared significant token — deterministic, no external model call. |
Full argument shapes and return values are in each tool's docstring in
server.py (also what an MCP client sees when it lists tools).
Quickstart
git clone https://github.com/svx2027/youtube-intel-mcp.git
cd youtube-intel-mcp
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python3 server.pyThat starts the server on stdio, ready for an MCP client to connect. To call a tool without any MCP client at all — every tool is also a plain, directly callable Python function:
from server import score_candidates
result = score_candidates([
{"title": "Best kettlebell for beginners", "vph": 12.0,
"channel_id": "c1", "relation": "direct"},
{"title": "Kettlebell workout for beginners", "vph": 400.0,
"channel_id": "c2", "relation": "direct"},
])
print(result["candidates"][0]["title"], result["candidates"][0]["opportunity_score"])config.example.yaml has the full weights/thresholds/taxonomy shape each
tool accepts — copy the section you need into your own call, or load the
whole file and pass it straight through.
Architecture
flowchart LR
CLIENT["MCP client\n(Claude, an agent, a script)"] -->|"tool call"| SERVER(("server.py\nFastMCP"))
SERVER --> SCORE["src/scoring.py\nz-scores, outlier,\nlocal clustering,\nOpportunity Score"]
SERVER --> DEMAND["src/demand.py\nkeyword supply/demand gap"]
SERVER --> TAX["src/taxonomy.py\nrule-based topic tags"]
SCORE -.->|"demand_gap_score"| DEMAND
CLIENT -.->|"you fetch this yourself\n(YouTube Data API, yt-dlp,\nan export you already have)"| CANDIDATES["candidate videos/posts"]
CANDIDATES --> SERVEREvery tool call is stateless: no cache, no ledger, no config file read from disk inside the server. Everything the source engine read from a file (baselines, the seasonal calendar, a multi-day history ledger) is instead a plain argument here, or a signal this scaffold doesn't expose yet (see below) — a deliberate trade for a server any client can call without first setting up that engine's full repo layout.
Honest scope
This is a scaffold: the four tools above, not the full pipeline.
No fetching. No YouTube Data API call, no yt-dlp, no vidIQ, no Gemini call happens inside this server. You bring the candidate data.
Clustering is local-only. The source engine's optional Gemini-assisted clustering path isn't wired up here —
cluster_titlesalways uses the same deterministic token-anchor method the source engine falls back to when Gemini is unavailable, so behavior here matches its documented, network-independent path.No calendar-tailwind signal. The source engine's sixth signal (does a title match an active seasonal-demand phase) depends on "today's date" and a calendar file; there's no
apply_calendartool yet, so thecalendarweight inscore_candidatesalways contributes 0. It's counted in the weights (so the other five still sum against the same total a caller of the source engine would expect) rather than silently dropped from the config shape.No sleeper / new-format history signals. Both depend on a multi-day ledger this stateless server doesn't keep. Not exposed; not silently half-implemented.
No live deployment. This is a stdio MCP server you run yourself (
python3 server.py), the same as most local MCP servers; no hosted endpoint exists.
Tests
python3 -m unittest discover -s tests -v44 tests, no network calls: the scoring math (z-scores, outlier fallback
order, local clustering, the blended score under custom weights), the
demand-gap signal (including the "alignment alone never flags" rule), rule-
based tagging, and a set of server smoke tests confirming the MCP server
imports cleanly, registers exactly the four tools above, and — the one that
actually proves it works as an MCP server, not just as importable Python —
answers a real call routed through mcp's own call_tool dispatch path.
Related
Drawn from yt-competitor-swipe's
src/score.py, src/keyword_demand.py, and src/taxonomy.py — that repo
runs the full pipeline this engine was built for (fetch, score, report,
dashboard) end to end against a real niche. This repo exists for the case
where you already have the candidate data and just want the scoring and
tagging logic as a callable tool, from any MCP client.
License
MIT, see LICENSE.
Related MCP Connectors
Score, rank and prioritize an existing Italian B2B lead list into explained JSON decisions.
Score a YouTube channel's upload pattern against YouTube's inauthentic-content policy.
Score pages against 11,485 public taxonomy categories by embedding similarity. $0.05/call via MCP.
Agent-callable creator intelligence: 952+ scored YouTube creators across 180 niches.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server for extracting structured intelligence from YouTube channels and videos — transcripts, topics, and competitive signals for AI-powered research workflows.1599 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to query YouTube channel health, diagnose video performance, full-text search transcripts, and vet topics/scripts directly from an editor or chat interface.Apache 2.0

codepawl-video-labofficial
AlicenseNot gradedqualityCmaintenanceEnables Codex to retrieve YouTube video dossiers, compare videos, access channel performance and retention curves, save analysis reports, and manage experiments through a stateless MCP endpoint.MIT- FlicenseNot gradedqualityBmaintenanceEnables MCP clients to score the retention quality of the first three seconds of shortform video hooks using audio/video telemetry and transcript input, returning deterministic JSON results for viral hook optimization.8-