Streaming market intelligence: vertical drama, African OTT, piracy, sports, creator economy.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Check what sourced data Streaming Lens holds on a company, market, country or topic — WITHOUT returning the values. Returns how many datapoints match, which reports they sit in, which countries and years they cover, the confidence mix, when the most recent one was updated, and one sample datapoint with its metric name, unit, country, source and confidence but its value withheld. Use this to tell a user whether the answer to their question exists in the database and what it would take to read it. Matching is word-bounded, so short acronyms do not match inside longer words. Free access — no API key required. Read-only: it never returns the values, and the response says which reports hold them.
Company, market, country, platform or topic (e.g. "ReelShort", "mobile money", "Nigeria", "micro-drama").
Restrict to one country as spelled in the data (e.g. "Nigeria").
Restrict to one report silo (e.g. "vertical-invasion-2026", "africa-streaming-2026").
Check what sourced data Streaming Lens holds on a company, market, country or topic — WITHOUT returning the values. Returns how many datapoints match, which reports they sit in, which countries and years they cover, the confidence mix, when the most recent one was updated, and one sample datapoint with its metric name, unit, country, source and confidence but its value withheld. Use this to tell a user whether the answer to their question exists in the database and what it would take to read it. Matching is word-bounded, so short acronyms do not match inside longer words. Free access — no API key required. Read-only: it never returns the values, and the response says which reports hold them.
| Argument | Type | Description |
|---|---|---|
| query* | string | Company, market, country, platform or topic (e.g. "ReelShort", "mobile money", "Nigeria", "micro-drama"). |
| country | string | Restrict to one country as spelled in the data (e.g. "Nigeria"). |
| report_slug | string | Restrict to one report silo (e.g. "vertical-invasion-2026", "africa-streaming-2026"). |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"maxLength": 60,
"minLength": 3,
"description": "Company, market, country, platform or topic (e.g. \"ReelShort\", \"mobile money\", \"Nigeria\", \"micro-drama\")."
},
"country": {
"type": "string",
"description": "Restrict to one country as spelled in the data (e.g. \"Nigeria\")."
},
"report_slug": {
"type": "string",
"description": "Restrict to one report silo (e.g. \"vertical-invasion-2026\", \"africa-streaming-2026\")."
}
},
"additionalProperties": false
}Get chart-ready data for Plotly or any charting library. Report charts require auth. Newsletter charts (expert_network, topic_heatmap, engagement_funnel, geo_coverage, keyword_trends, article_bridge, expert_leaderboard, timeline) are available without signing in.
| Argument | Type | Description |
|---|---|---|
| silo | string | Report slug filter (e.g. "africa-streaming-2026"). Required for export_table. Omit for all active silos on other chart types. |
| limit | number | Max rows (default 20, max 200). For topic_heatmap/keyword_trends: top N keywords. |
| country | string | Country filter — applies to export_table (e.g. "Nigeria", "NG") |
| category | string | Category filter — applies to category_breakdown, top_metrics, coverage, export_table |
| chart_type* | string | Chart type to retrieve |
{
"type": "object",
"required": [
"chart_type"
],
"properties": {
"silo": {
"type": "string",
"description": "Report slug filter (e.g. \"africa-streaming-2026\"). Required for export_table. Omit for all active silos on other chart types."
},
"limit": {
"type": "number",
"maximum": 200,
"minimum": 1,
"description": "Max rows (default 20, max 200). For topic_heatmap/keyword_trends: top N keywords."
},
"country": {
"type": "string",
"description": "Country filter — applies to export_table (e.g. \"Nigeria\", \"NG\")"
},
"category": {
"type": "string",
"description": "Category filter — applies to category_breakdown, top_metrics, coverage, export_table"
},
"chart_type": {
"enum": [
"silo_overview",
"category_breakdown",
"top_metrics",
"coverage",
"confidence",
"country",
"timeline",
"year_distribution",
"export_table",
"citation_graph",
"expert_network",
"topic_heatmap",
"engagement_funnel",
"geo_coverage",
"keyword_trends",
"article_bridge",
"expert_leaderboard"
],
"type": "string",
"description": "Chart type to retrieve"
}
}
}Search the tools available to your account by keyword. Returns matching tools with their names, descriptions and input schemas: the same tools tools/list advertises to you, nothing more. Use it to find which tool fits a request. Keywords can be: a tool name fragment (e.g. "chart"), a domain (africa, vertical, piracy, creator, sports), or an action (list, get, compare).
| Argument | Type | Description |
|---|---|---|
| limit | number | Max tools to return (default 8, max 20). |
| query* | string | Whitespace-separated keywords; case-insensitive. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "number",
"maximum": 20,
"minimum": 1,
"description": "Max tools to return (default 8, max 20)."
},
"query": {
"type": "string",
"description": "Whitespace-separated keywords; case-insensitive."
}
}
}Get a Streaming Radar article by sr_articles ID, published_pieces ID, or edition number. Returns the published body when available; internal briefs return metadata only. Without an admin key only published articles resolve; any other article returns "Article not found". Free access — no API key required.
| Argument | Type | Description |
|---|---|---|
| id | string | Article UUID |
| number | number | Edition number (e.g. 42) |
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Article UUID"
},
"number": {
"type": "number",
"description": "Edition number (e.g. 42)"
}
}
}List Streaming Radar newsletter articles with optional filters. Returns id, number, title, subtitle, status, type, published_at, substack_url and editorial_angle; views and open_rate only with an admin key. Without an admin key only published articles are returned and any other status filter is rejected. Free access — no API key required.
| Argument | Type | Description |
|---|---|---|
| type | string | Filter by content type: edition, analysis, special |
| limit | number | Max results (default 20, max 50) |
| offset | number | Pagination offset (default 0) |
| status | string | Filter by status: published, draft, archived. Non-admin keys may only request published. |
{
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "Filter by content type: edition, analysis, special"
},
"limit": {
"type": "number",
"maximum": 50,
"minimum": 1,
"description": "Max results (default 20, max 50)"
},
"offset": {
"type": "number",
"minimum": 0,
"description": "Pagination offset (default 0)"
},
"status": {
"enum": [
"published",
"draft",
"archived"
],
"type": "string",
"description": "Filter by status: published, draft, archived. Non-admin keys may only request published."
}
}
}Get a single expert by ID or name (partial match), including their linked articles. Free access — no API key required.
| Argument | Type | Description |
|---|---|---|
| id | string | Expert UUID |
| name | string | Expert name (partial match, e.g. "Ludovic") |
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Expert UUID"
},
"name": {
"type": "string",
"description": "Expert name (partial match, e.g. \"Ludovic\")"
}
}
}List experts cited in the Streaming Radar newsletter with optional filters by tier or country. Free access — no API key required.
| Argument | Type | Description |
|---|---|---|
| tier | number | Expert tier (1 = top, 2 = mid, 3 = emerging) |
| limit | number | Max results (default 20, max 50) |
| country | string | ISO 3166-1 alpha-2 country code (e.g. "NG", "KE", "ZA") |
{
"type": "object",
"properties": {
"tier": {
"enum": [
1,
2,
3
],
"type": "number",
"description": "Expert tier (1 = top, 2 = mid, 3 = emerging)"
},
"limit": {
"type": "number",
"maximum": 50,
"minimum": 1,
"description": "Max results (default 20, max 50)"
},
"country": {
"type": "string",
"description": "ISO 3166-1 alpha-2 country code (e.g. \"NG\", \"KE\", \"ZA\")"
}
}
}Get published articles since a given date, ordered by publication date descending. Only published articles are returned. Free access — no API key required; the views and open_rate fields are returned only with an admin key.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max results (default 20, max 50) |
| since_date* | string | ISO 8601 date or datetime (e.g. "2026-02-01" or "2026-02-01T00:00:00Z") |
{
"type": "object",
"required": [
"since_date"
],
"properties": {
"limit": {
"type": "number",
"maximum": 50,
"minimum": 1,
"description": "Max results (default 20, max 50)"
},
"since_date": {
"type": "string",
"description": "ISO 8601 date or datetime (e.g. \"2026-02-01\" or \"2026-02-01T00:00:00Z\")"
}
}
}List tags used in the Streaming Radar newsletter, optionally filtered by category. Free access — no API key required.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max results (default 50) |
| category | string | Tag category (e.g. "company", "country", "topic", "format") |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"maximum": 200,
"minimum": 1,
"description": "Max results (default 50)"
},
"category": {
"type": "string",
"description": "Tag category (e.g. \"company\", \"country\", \"topic\", \"format\")"
}
}
}Search Streaming Radar articles, or — with mode=coverage — check whether a topic is already covered in the published corpus using semantic similarity. mode=search (default): case-insensitive whole-query substring match on article metadata, plus indexed full-text search of published piece bodies. Multi-word body queries require all terms. Use short queries for names. Free access, no API key required. mode=coverage: semantic anti-redite + auto-citation check over the published corpus. Returns a channel-weighted verdict (DÉJÀ TRAITÉ / EFFLEURÉ / NEUF — only PUBLISHED pieces can block; briefs are non-blocking signals), plus citable hits (url + excerpt) for self-citation. Also returns a facts array: passages already published in the body of a piece that carry the same rare terms as the query (non-blocking). Free access.
| Argument | Type | Description |
|---|---|---|
| mode | string | search (default) = case-insensitive substring match on title, subtitle and editorial angle of SR articles, plus full-text match on the bodies of published pieces | coverage = semantic corpus coverage check |
| limit | number | Max results (default 10, max 30) — mode=search only |
| query* | string | mode=search: short name or phrase; metadata matches a contiguous substring, published bodies match all search terms. mode=coverage: free-text description of the angle or topic to check. |
| top_k | number | Number of vector neighbours to retrieve (default 10, max 30) — mode=coverage only |
| channels |
List all available genre tiers (Proven / Growing / Emerging) and hybrid combinations for the vertical drama story bible generator.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}List all target markets with audience profiles and top genres for the vertical drama story bible generator.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}| array |
| mode=coverage only — restrict to channels (substack, linkedin_story, linkedin_post, guest_article, vdtv, brief). Default: all. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"mode": {
"enum": [
"search",
"coverage"
],
"type": "string",
"description": "search (default) = case-insensitive substring match on title, subtitle and editorial angle of SR articles, plus full-text match on the bodies of published pieces | coverage = semantic corpus coverage check"
},
"limit": {
"type": "number",
"maximum": 30,
"minimum": 1,
"description": "Max results (default 10, max 30) — mode=search only"
},
"query": {
"type": "string",
"minLength": 2,
"description": "mode=search: short name or phrase; metadata matches a contiguous substring, published bodies match all search terms. mode=coverage: free-text description of the angle or topic to check."
},
"top_k": {
"type": "number",
"maximum": 30,
"minimum": 1,
"description": "Number of vector neighbours to retrieve (default 10, max 30) — mode=coverage only"
},
"channels": {
"type": "array",
"items": {
"type": "string"
},
"description": "mode=coverage only — restrict to channels (substack, linkedin_story, linkedin_post, guest_article, vdtv, brief). Default: all."
}
}
}