Self-hostable MCP server for Roshan AI's Harf (حرف) Persian speech service: transcription (ASR), forced alignment, real-time streaming, and speaker tasks (verification, identification, diarization, indexing).
Strong foundation with 15 well-named tools, all with descriptions and input schemas. Naming follows verb_noun convention (harf_transcribe, harf_tts, harf_align). Descriptions are substantive (50-150 chars typical), explaining WHAT and WHEN. All parameters have type declarations and descriptions. However, output schemas are not documented in the source code provided, only input schemas are visible. Error handling guidance is minimal. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being READ_ONLY. Parameter descriptions could be more prescriptive about formats and constraints.
Force-align a known transcript to its audio and return per-segment timestamps.
Get a short-lived signed download link for an original media file (expires ~30s).
Describe the live streaming protocol and how to use it.
Stream a local WAV file over a WebSocket for real-time transcription segments.
Segment audio by speaker ('who spoke when') with text per segment.
Identify which known speaker a probe most resembles.
Output schemas not documented. Input schemas are visible and well-typed, but return types for all 15 tools are not specified in the provided source. LLMs cannot plan downstream tool calls or extract required fields without knowing what each tool returns.
No tool annotations despite all tools being READ_ONLY. The server declares all tools as READ_ONLY risk, but does not use readOnlyHint in tool definitions. This prevents clients from optimizing caching and retry logic.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
Index a media file against known speakers, returning labelled, timestamped, transcribed segments.
Verify whether a probe speaker matches reference audio (threshold 0.65).
Transcribe Persian audio/video by URL. Blocks when wait=true; with wait=false returns {state, task_ids} to poll later.
Transcribe a local audio/video file uploaded via multipart.
Poll the state (PENDING/FAILURE/TIMEOUT/...) of async transcription tasks created with wait=false.
Synthesize Persian speech from text (voice=female|male); returns samplerate + waveform (+ optional WAV via save_path).
Check that a Harf (حرف) instance is up and ready.
List configured Harf instances (names + base URLs only).
Return documentation about Harf and this server's tools.
Parameter descriptions lack prescriptive format guidance. E.g., 'media_urls' says 'List of HTTP(S) URLs' but does not specify max array length, URL format validation, or timeout behavior. 'text' in harf_align does not specify language (Persian only?), encoding, or length limits.
No error handling guidance in tool descriptions. Tools that call external services (Harf API) may timeout, fail, or return partial results, but descriptions do not explain recovery steps or retryability. E.g., harf_transcribe with wait=true could hang, no guidance on timeout behavior.
Async polling pattern (harf_transcribe with wait=false) requires manual state tracking. Descriptions mention returning {state, task_ids} but do not explain the polling loop, state transitions (PENDING→FAILURE→TIMEOUT), or when to give up. LLMs may not know when to call harf_transcription_status or how to interpret results.