← The evidence ledger
Evidence row 1026865
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint e07b5b32-483c-4dd6-8f94-a4dda741cd56
- Recorded
- Previous row
- None: the first of its kind about this subject
- Body SHA-256
- 1072ecbe33df984fa2e2e3f3fd36cfb75dd342b2326044bc63b4b8fe01c7c5f9
- Leaf
- 0xdfab09f1f05efe002e91527c023dc6311bc6036e5a58762b26a5e3d54d977764
What was observed
{
"count": 20,
"tools": [
{
"description": "Tell Lunara the bytes are uploaded so the pipeline can start. Returns the job id to poll with lunara_get_job.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"durationMs": {
"description": "Media duration in milliseconds.",
"minimum": 1,
"type": "integer"
},
"key": {
"description": "The object key.",
"type": "string"
},
"parts": {
"description": "Uploaded parts, each { PartNumber, ETag }.",
"items": {
"additionalProperties": false,
"properties": {
"ETag": {
"type": "string"
},
"PartNumber": {
"minimum": 1,
"type": "integer"
}
},
"required": [
"PartNumber",
"ETag"
],
"type": "object"
},
"type": "array"
},
"uploadId": {
"description": "The multipart upload id.",
"type": "string"
},
"videoId": {
"description": "The video id from lunara_upload_video.",
"type": "string"
}
},
"required": [
"videoId",
"uploadId",
"key",
"durationMs",
"parts"
],
"type": "object"
},
"name": "lunara_finish_upload"
},
{
"description": "Report how much of the source timeline the subtitles cover, and list suspicious gaps longer than a second. Use before shipping a long video.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"jobId": {
"description": "The job to inspect.",
"type": "string"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "lunara_get_coverage"
},
{
"description": "Return the proper nouns Lunara has learned for this org, so names are spelled consistently across tracks.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"description": "Default 100.",
"maximum": 500,
"minimum": 1,
"type": "integer"
}
},
"type": "object"
},
"name": "lunara_get_glossary"
},
{
"description": "Return the state of a subtitle job: status, progress, whether the SRT is ready, and how many cues it has. Poll this after lunara_upload_video.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"jobId": {
"description": "The job id returned by lunara_upload_video.",
"type": "string"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "lunara_get_job"
},
{
"description": "How many transcription jobs are running and whether a new one can be accepted. Call this before lunara_start_subtitle_job or lunara_subtitle_from_url if you are submitting several jobs — when saturated, wait the retryAfterSeconds rather than retrying immediately.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "lunara_get_queue"
},
{
"description": "Return the subtitle file for a finished job. One line per cue. Use track=\"secondary\" for the translated track (English by default).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"jobId": {
"description": "The job id.",
"type": "string"
},
"track": {
"description": "primary = the written-language track; secondary = the translation.",
"enum": [
"primary",
"secondary"
],
"type": "string"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "lunara_get_srt"
},
{
"description": "Find candidate proper nouns in a job’s cues, ranked by frequency, with the first cue they appear in. Suggestions for a glossary, not corrections — nothing is rewritten.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"jobId": {
"description": "The job whose cues to scan.",
"type": "string"
},
"limit": {
"description": "Maximum terms to return. Default 50.",
"maximum": 200,
"minimum": 1,
"type": "integer"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "lunara_glossary_extract"
},
{
"description": "Returns a step-by-step guide written to be read by a human, not by you. Call this when someone asks \"how do I use this\", \"what can it do\", \"how do I get started\", or when you need to explain the workflow rather than execute it. Pass journey=\"first_subtitle\" for the end-to-end path, \"api_key\" for credential setup, \"languages\" for what is supported, or \"limits\" for what it cannot do. Answer the person with this text rather than paraphrasing from memory.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"journey": {
"description": "Which journey to explain. first_subtitle: upload to finished file. api_key: getting a credential. languages: what it does and does not handle. limits: honest boundaries. edit_subtitles: fixing a line after the fact. agent: putting this on an AI agent rather than doing it by hand.",
"enum": [
"first_subtitle",
"api_key",
"languages",
"limits",
"edit_subtitles",
"agent"
],
"type": "string"
}
},
"required": [],
"type": "object"
},
"name": "lunara_guide"
},
{
"description": "Return subtitle cues for a job as timestamps plus text, so you can inspect or reference individual lines before proposing edits.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"jobId": {
"description": "The job id.",
"type": "string"
},
"limit": {
"description": "How many cues to return. Default 100.",
"maximum": 500,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Skip this many cues. Default 0.",
"minimum": 0,
"type": "integer"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "lunara_list_cues"
},
{
"description": "Return every subtitle tool Lunara exposes, with the minutes each one costs. Call this first when you are unsure which tool fits.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "lunara_list_tools"
},
{
"description": "Return duration, dimensions, codecs and container for a URL, plus whether the audio is mono 16 kHz already. Call this before choosing an ASR engine.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"mediaUrl": {
"description": "URL to probe.",
"type": "string"
}
},
"required": [
"mediaUrl"
],
"type": "object"
},
"name": "lunara_probe_media"
},
{
"description": "Run the contract gate over both tracks: ASR text and timings byte-exact, cue length bounds, no empty cues. Returns pass/fail per rule. Free, because refusing a broken track should never cost the caller money.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"jobId": {
"description": "The job to validate.",
"type": "string"
},
"track": {
"description": "Which track to check. Default both.",
"enum": [
"primary",
"secondary",
"both"
],
"type": "string"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "lunara_qa_contract"
},
{
"description": "Per-cue reading speed, displayed length and characters-per-second, with the cues that exceed comfortable limits. Mirrors the metrics shown in the editor.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"jobId": {
"description": "The job to measure.",
"type": "string"
},
"track": {
"description": "Default primary.",
"enum": [
"primary",
"secondary"
],
"type": "string"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "lunara_readability"
},
{
"description": "Turn spoken Cantonese cue text into written Chinese. Every cue boundary and timestamp is preserved. Deliberate mispronunciations are never corrected, and proper nouns are protected.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"jobId": {
"description": "The job whose cues to rewrite.",
"type": "string"
},
"track": {
"description": "Which track to read. Default primary.",
"enum": [
"primary",
"secondary"
],
"type": "string"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "lunara_rewrite"
},
{
"description": "Approximate split, not audio-grounded segmentation: cue text is divided at clause punctuation and each piece receives a share of the original span proportional to its character count. The words are not changed. Timings are estimated, so treat them as a reading aid rather than a re-alignment — use lunara_start_subtitle_job if you need timing derived from the audio.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"jobId": {
"description": "The job whose cues to re-cut.",
"type": "string"
},
"maxCueMs": {
"description": "Duration ceiling per cue in ms. Default 7000.",
"maximum": 15000,
"minimum": 500,
"type": "integer"
},
"track": {
"description": "Which track to read. Default primary.",
"enum": [
"primary",
"secondary"
],
"type": "string"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "lunara_segment"
},
{
"description": "Run the full eight-layer subtitle pipeline on an audio or video URL you can already host. Produces a written-language track and a translated track. Prefer lunara_upload_video when the file is local.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"audioUrl": {
"description": "A URL Lunara can download (public or pre-signed).",
"type": "string"
},
"primaryLang": {
"description": "Language of the written track. Default yue-Hant.",
"enum": [
"zh-Hant",
"yue-Hant",
"zh-CN",
"en",
"ja",
"ko"
],
"type": "string"
},
"secondaryLang": {
"description": "Language of the translated track. Default en.",
"enum": [
"zh-Hant",
"yue-Hant",
"zh-CN",
"en",
"ja",
"ko"
],
"type": "string"
},
"spokenLang": {
"description": "What the speaker is speaking, e.g. yue-Hant-HK. Defaults to primaryLang.",
"type": "string"
}
},
"required": [
"audioUrl"
],
"type": "object"
},
"name": "lunara_start_subtitle_job"
},
{
"description": "Start a persisted subtitle job from a URL you already host — no upload needed. Returns a job id; poll lunara_get_job every 15–30 s until status is \"completed\", then call lunara_get_srt. Prefer this over lunara_upload_video whenever the media is reachable by URL.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"audioUrl": {
"description": "Direct HTTP(S) URL to the audio or video file. Must be downloadable by our server.",
"type": "string"
},
"filename": {
"description": "Display name for the result. Defaults to the URL basename.",
"type": "string"
},
"primaryLang": {
"description": "Language of the written track. Default yue-Hant.",
"enum": [
"zh-Hant",
"yue-Hant",
"zh-CN",
"en",
"ja",
"ko"
],
"type": "string"
},
"secondaryLang": {
"description": "Language of the translated track. Default en.",
"enum": [
"zh-Hant",
"yue-Hant",
"zh-CN",
"en",
"ja",
"ko"
],
"type": "string"
},
"spokenLang": {
"description": "What the speaker is speaking, e.g. yue-Hant-HK. Defaults to auto-detect.",
"type": "string"
}
},
"required": [
"audioUrl"
],
"type": "object"
},
"name": "lunara_subtitle_from_url"
},
{
"description": "Run speech recognition only — no rewrite, no translation. Returns timed segments. Use this when you want the transcript itself, or when you plan to pick a later stage yourself.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"audioUrl": {
"description": "Direct HTTP(S) URL to the audio or video file.",
"type": "string"
},
"spokenLang": {
"description": "What the speaker is speaking, e.g. yue-Hant-HK. Defaults to auto-detect.",
"type": "string"
}
},
"required": [
"audioUrl"
],
"type": "object"
},
"name": "lunara_transcribe"
},
{
"description": "Translate the text of an existing job’s cues into another language. Every cue boundary and timestamp is preserved; only the text changes. Use this instead of translating yourself so the timing contract holds.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"jobId": {
"description": "The job whose cues to translate.",
"type": "string"
},
"targetLang": {
"description": "Target language.",
"enum": [
"zh-Hant",
"en",
"ja",
"ko"
],
"type": "string"
},
"track": {
"description": "Which track to read. Default primary.",
"enum": [
"primary",
"secondary"
],
"type": "string"
}
},
"required": [
"jobId",
"targetLang"
],
"type": "object"
},
"name": "lunara_translate"
},
{
"description": "Reserve an upload slot and return the object key plus a signed URL per part. After uploading the bytes call lunara_finish_upload. Use this for a file you hold locally.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"clientOperationId": {
"description": "Idempotency key. Reuse the same value to retry without creating a second upload.",
"type": "string"
},
"filename": {
"description": "Original filename, used for the download name.",
"type": "string"
},
"mime": {
"description": "MIME type, e.g. audio/mpeg, video/mp4.",
"type": "string"
},
"primaryLang": {
"description": "Written-track language. Default yue-Hant.",
"enum": [
"zh-Hant",
"yue-Hant",
"zh-CN",
"en",
"ja",
"ko"
],
"type": "string"
},
"projectId": {
"description": "Project to upload into. Omit to let Lunara reuse the most recent project for this organisation.",
"type": "string"
},
"secondaryLang": {
"description": "Translated-track language. Default en.",
"enum": [
"zh-Hant",
"yue-Hant",
"zh-CN",
"en",
"ja",
"ko"
],
"type": "string"
},
"sizeBytes": {
"description": "Exact file size in bytes.",
"minimum": 1,
"type": "integer"
}
},
"required": [
"filename",
"mime",
"sizeBytes"
],
"type": "object"
},
"name": "lunara_upload_video"
}
]
}What the leaf hashes
{"body":"1072ecbe33df984fa2e2e3f3fd36cfb75dd342b2326044bc63b4b8fe01c7c5f9","id":1026865,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793280415852209,"prev":null,"subject":"e07b5b32-483c-4dd6-8f94-a4dda741cd56","subject_kind":"endpoint"}Proof
Its day has not closed yet. A day closes ten minutes after midnight UTC; the proof appears here then.