jev-av-analysis-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., "@jev-av-analysis-mcpTranscribe and analyze this video for sensitivity flags and publish gate"
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-av-analysis-mcp
π¨π³ δΈζζζ‘£
Local-first, zero-key structured audio/video analysis: download β transcribe β decide in one pipeline. Transcription runs on your own machine with yt-dlp + whisper.cpp; analysis uses TypeSafe Jev (System One decision model) to emit structured labels, not prose.
An MCP server that turns any video/audio into "transcript + structured analysis": topic tags, sentiment tone, sensitivity flags (profanity / violence / medical advice / financial advice / politics / copyrighted music / harassment), and a publish gate (publish / review / block). Built for podcasters, video creators, YouTubers β anyone who wants an agent to auto-tag and screen their content.
npm install && npm run build
node dist/index.js doctor # print transcription deps + Jev mode diagnosticsConnect node dist/index.js in your MCP client and use the four tools below.
The four tools
Tool | Purpose |
| URL or local file β transcript (URL via yt-dlp, local/downloaded via whisper.cpp) |
| Use yt-dlp to pull the best audio track of a video/audio to local; returns path + title + duration |
| Local audio/video file β transcript |
| Transcript β Jev structured analysis (see below) |
analyze_transcript takes a piece of text (usually from the three transcription tools above) and returns:
{
"topics": { "tech": 0.9, "business": 0.1, "education": 0.3, "...": 0.0 },
"dominant_topics": ["tech"],
"sentiment": { "score": 3, "label": "positive", "confidence": 0.8, "probabilities": {"0":0,"1":0,"2":0.1,"3":0.8,"4":0.1} },
"sensitivity": { "profanity": 0.1, "violence": 0.0, "medical_advice": 0.2, "financial_advice": 0.9, "...": 0.0 },
"flagged_sensitivity": ["financial_advice"],
"has_key_claims": 0.8,
"has_engagement_hook": 0.4,
"publish_gate": "review",
"confidence": 0.8,
"mocked": false
}Fields
Field | Meaning |
| Membership probabilities over 8 default topics (>0.5 β dominant); override via |
| 5-level ordinal: very_negative β very_positive, with distribution and confidence |
| Probabilities over 7 sensitivity classes; >0.7 β flagged |
| Whether it contains factual claims that need verification (noul probability) |
| Whether the opening has a strong hook (good for short-form clips) |
|
|
| Calibrated confidence of the sentiment dimension |
publish_gate gate logic
publish: no sensitivity class > 0.7review: a sensitivity class in 0.7β0.9 β human review before publishingblock: any sensitivity class > 0.9 β high risk, block
β οΈ Capability boundary (important): Jev is a decision model β it labels / scores, it does not write section headings or summaries. Do chapter segmentation and summarization yourself based on the transcript
segments(or plug in a separate generative model). Before any publishing action, checkpublish_gate+confidencefirst β do not auto-publish just because one probability is high.
Related MCP server: VideoContext MCP
Zero-key / local-first
Transcription layer:
MEDIA_MCP_MOCK=1β skip yt-dlp/whisper and return an offline stub (zero-config for CI/demos). Real mode requiresyt-dlpand a compiledwhisper.cppon your machine, plusWHISPER_MODEL_PATHconfigured.Decision layer: no
TYPESAFE_API_KEYβ automatic Jev mock mode (deterministic offline stub); set it β call the real API.
Environment variables
Variable | Default | Description |
| β | Required for real Jev calls; blank falls back to mock |
|
|
|
|
|
|
|
| Binary paths |
| β | Absolute path to the |
|
| Model name hint |
|
| Transcription timeout |
Install engines locally (real transcription)
pip install yt-dlp
git clone https://github.com/ggerganov/whisper.cpp && cd whisper.cpp && make
# download a small model, e.g.:
bash ./models/download-ggml-model.sh base.en
export WHISPER_MODEL_PATH="$PWD/models/ggml-base.en.bin"Extremely low cost
Transcription runs on your own machine (CPU/GPU, zero call fees); decisions are a single Jev call, tens of thousands of tokens per call. There's no token-usage chart because it's already cheap β think of it as "one cheap gate in your content pipeline".
Tests
npm test # smoke + MCP protocol handshake (dual mock mode, no key needed)License
MIT
Available Tools
4 toolsanalyze_transcriptA
Run a transcript through Jev (System One decision model) for structured analysis: topic membership, sentiment, sensitivity flags (profanity/violence/medical-advice/financial-advice/β¦), and a publish gate (publish / review / block). The agent gets typed labels, not prose. Always check publish_gate + confidence before publishing.
| Name | Required | Description | Default |
|---|---|---|---|
| categories | No | Optional custom topic categories. Defaults to tech/business/education/entertainment/news/health/politics/sports. | |
| transcript | Yes | The transcript text to analyze (output of transcribe_media / transcribe_file). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full burden. It discloses that the tool returns typed labels rather than prose, lists the dimensions analyzed, and explicitly warns to check publish_gate and confidence, which is a behavioral expectation. It also implies a decision model ('Jev') and its outputs. While it doesn't mention side effects or determinism, it provides substantial behavioral context beyond the schema, earning a 4.
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 first sentence front-loads the purpose and outputs; the second is a crisp actionable instruction. 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?
Given no output schema and no annotations, the description covers the key output dimensions (topic, sentiment, sensitivity, publish gate) and the critical follow-up action. It doesn't detail the exact structure of the result, but for an analysis tool returning typed labels, this is reasonably complete. The reference to confidence and publish_gate gives the agent enough to act on. A 4 is appropriate; a 5 would require more explicit return structure.
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% (both parameters have descriptions). The description adds value by clarifying the transcript's provenance ('output of transcribe_media / transcribe_file'), which is not in the schema description. It also frames the analysis outputs that relate to the categories parameter, though it doesn't explicitly explain how categories affect output. This added context elevates it above the baseline 3.
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 states a specific verb ('Run a transcript through Jev') and a concrete resource (transcript analysis), and enumerates the exact outputs: topic membership, sentiment, sensitivity flags, and a publish gate. It clearly distinguishes from siblings (transcribe_media/fetch_media/transcribe_file) which are about obtaining media, not analyzing it.
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 gives clear context for when to use it: after transcription ('output of transcribe_media / transcribe_file' is mentioned in the schema, and the description implies this is the analysis step). It also provides a directive on how to use the output ('Always check publish_gate + confidence before publishing'). However, it doesn't explicitly state when NOT to use it or name alternative analysis tools, but given the sibling set, the usage context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_mediaA
Download the best audio from a video/audio URL to a local file using yt-dlp. Returns the local path plus title and duration. No API key required.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The media URL to download (any site yt-dlp supports). | |
| format | No | Output audio format (default: wav, which whisper.cpp prefers). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It reveals key traits: it uses yt-dlp, requires no API key, writes to a local file, and returns the local path plus title and duration. It does not warn about potentially long download times, network failures, or unsupported URLs, but the core side effects and return contract are disclosed.
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 two sentences with no filler. The primary action is front-loaded, followed by the return payload and a practical prerequisite (no API key), which are both useful and directly relevant to tool invocation.
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?
The description covers the tool's purpose, return values, and a key prerequisite, and the schema handles parameters well. It is complete enough for typical use, but due to the absence of an output schema and annotations, additional context about failure modes, long-running operations, or unsupported URL categories would make it more robust.
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 both parameters fully, including the format enum and the default of wav. The description adds little parameter-specific detail beyond mentioning 'best audio,' which is adequate given the high schema coverage.
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 uses a specific verb ('Download'), names the resource ('best audio from a video/audio URL'), and specifies the delivery mechanism ('to a local file using yt-dlp'). It is clearly distinguishable from sibling tools like transcribe_media and analyze_transcript, whose purposes center on transcription and analysis rather than fetching media.
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 makes the intended context clear: use this tool when you need to download audio from a media URL for local use, and the sibling names imply downstream transcription/analysis. However, it does not explicitly state when not to use it or name an alternative tool directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribe_fileC
Transcribe a local audio/video file with whisper.cpp. Returns the transcript text and optional segments.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Local path to the audio/video file. | |
| model | No | Path to a .ggml whisper model, or a name hint. | |
| language | No | Language code: 'en', 'zh', 'auto' (default: auto). | |
| translate | No | Translate non-English speech into English. | |
| timestamps | No | Include [start --> end] segment boundaries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavioral traits. It mentions that it uses whisper.cpp and returns transcript text and optional segments, but does not disclose potential side effects (e.g., model downloading), resource usage, or limitations (e.g., file size, format support). It does not describe the structure of the return or whether the operation is read-only or performs writes. This is a minimal disclosure that fails to cover important behavioral aspects.
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 single sentence that front-loads the main action and resource. It is concise and avoids verbosity. It mentions the return type in a compact way, though it could be more structured. It earns a high score for efficiency and clarity, but loses a point for not fully leveraging the space to provide more guidance.
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 tool with 5 parameters, no output schema, and no annotations, the description is insufficient. It does not explain how the optional segments relate to the 'timestamps' parameter, does not clarify the behavior of 'translate' or 'language', and does not describe the output format beyond 'transcript text and optional segments'. An agent would need to infer the return structure and the exact effects of parameters, which is risky. The description should provide more operational detail, such as whether the model must be pre-downloaded, the expected input formats, and the exact structure of the return.
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?
The schema description coverage is 100%, meaning all parameters are documented in the schema. The description adds little beyond that: it restates that the file is local, which is already in the schema. It does not clarify the semantics of 'model', 'translate', or 'timestamps' beyond what the schema provides. Since the schema already covers the parameters well, the description's marginal contribution warrants the baseline score of 3.
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 verb 'Transcribe' and the resource 'local audio/video file', and mentions the engine (whisper.cpp) and the return of transcript text and optional segments. It is specific but does not explicitly differentiate from the sibling 'transcribe_media', leaving ambiguity about when to use which. Thus it is clear but not fully distinguishing.
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 on when to use this tool versus the sibling 'transcribe_media' or 'fetch_media'. The description only states that it works on local files, implying a distinction from remote media, but does not explicitly state when to choose this tool or what the alternatives are. This leaves the agent without clear decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribe_mediaA
Turn any video/audio URL or local file into a transcript, locally and key-free. URLs are fetched with yt-dlp; local files and fetched audio are transcribed with whisper.cpp. Returns the full transcript text plus optional [start --> end] segments.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | Path to a .ggml whisper model, or a model name hint. Falls back to WHISPER_MODEL_PATH. | |
| language | No | Language code: 'en', 'zh', 'auto' (default: auto-detect). | |
| translate | No | Translate non-English speech into English (whisper -tr). | |
| timestamps | No | Include [start --> end] segment boundaries (default: false). | |
| url_or_path | Yes | A http(s) URL to fetch, or a local path to an audio/video file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behaviors: operations occur locally and require no API key, URLs are fetched via yt-dlp, transcription is done via whisper.cpp, and output includes full transcript text plus optional timestamps. This is substantive and gives the agent realistic expectations, though it omits potential failure modes or side effects like temporary downloads.
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?
Three sentences with no fluff: the main purpose is first, then the underlying mechanism, then the return value. Each sentence adds a distinct piece of information an agent needs, making it efficient 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?
There is no output schema, so the description must explain return values, which it does ('full transcript text plus optional [start --> end] segments'). Combined with full parameter coverage in the schema, the agent has enough to invoke the tool correctly. The only gap is lack of guidance on error conditions or limitations, but this is not critical for a straightforward transcription tool.
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?
The schema documents all 5 parameters with 100% coverage, so the baseline is 3. The description only indirectly references the timestamps parameter via 'optional [start --> end] segments' and otherwise adds no meaning beyond the schema. That meets the baseline but does not exceed it.
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 a specific action ('Turn any video/audio URL or local file into a transcript') with a concrete resource and scope. It also differentiates itself by noting it is local and key-free, and the mention of yt-dlp and whisper.cpp distinguishes it from generic siblings by conveying the exact pipeline.
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 clearly defines when to use this tool: for any video/audio URL or local file. It does not explicitly name alternatives or exclusions, but the input scope is precise enough for an agent to recognize this is the transcription tool for both remote and local media, leaving little ambiguity.
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.
4 tool updates
v0.1.0- First observed
analyze_transcript - First observed
fetch_media - First observed
transcribe_file - First observed
transcribe_media
TDQS
Scored across 4 tools
transcribe_media and transcribe_file overlap for local files, and transcribe_media already handles URL fetching that fetch_media also provides. However, the descriptions make each tool's primary role fairly clear: fetch_media is download-only, transcribe_file is local-only, and transcribe_media is the all-in-one path.
All tool names follow a consistent verb_noun snake_case pattern: transcribe_media, fetch_media, transcribe_file, analyze_transcript. The naming is predictable and easy to navigate.
Four tools is a reasonable size for this audio/video analysis pipeline. The count is only slightly higher than necessary because transcribe_file is mostly redundant with transcribe_media, but it is not bloated.
The server covers the full workflow: fetch media, transcribe it, and analyze the transcript with the Jev model. There are no obvious missing operations for the stated AV-analysis purpose.
Maintenance
Related MCP Connectors
Podcast and media analysis: transcripts, captions, chapters, ad markers and show notes.
- mcpOAuthso.transcribe
Transcribe audio and video into speaker-labelled transcripts, subtitles, clips, and cited Q&A.
- RendobarOAuthcom.rendobar
Transform video, audio and images, and generate media from prompts. FFmpeg, captions, models.
Media intelligence analysis for audio, video, and images via the Echosaw MCP server.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceDownloads and analyzes videos from platforms like Instagram, YouTube, and TikTok locally, returning keyframes and optional transcripts.MIT
- AlicenseNot gradedqualityAmaintenanceTurns a YouTube video or allowlisted local video into a timestamped transcript, chronological timeline, and retrievable image resources for transparent media preprocessing.1MIT
- AlicenseAqualityCmaintenanceEnables local video inspection and offline transcription with timestamped JSON and Markdown output, enforced filesystem boundaries, and reproducible content-addressed caching.2MIT
- AlicenseNot gradedqualityAmaintenanceProvides local, offline transcription, keyframe extraction, OCR, and pre-publish review of audio, video, and image files, enabling AI agents to see and hear media without cloud or API keys.Apache 2.0