{"id":1026865,"recorded_at":"2026-10-29T13:26:55.852369Z","observed_at":"2026-10-29T13:26:55.852209Z","subject_kind":"endpoint","subject":"e07b5b32-483c-4dd6-8f94-a4dda741cd56","kind":"mcp.tools","method":"probe.mcp/1","body":{"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"}]},"body_sha256":"1072ecbe33df984fa2e2e3f3fd36cfb75dd342b2326044bc63b4b8fe01c7c5f9","prev_id":null,"leaf":"0xdfab09f1f05efe002e91527c023dc6311bc6036e5a58762b26a5e3d54d977764","leaf_text":"{\"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\"}","day":{"day":"2026-10-29","leaves":242798,"root":"0xc050555c6b023f2aefb6536efb9f0760b92c30a0d06c572b7daf63db259ea17c","chained":"0x4cde8bae2042512e1bec11650628f0293556311cc4ea74d99ffddf02b671a7d6","anchor_chain":"eip155:5042002","anchor_tx":"0x9e85c340732f416e431b111fae72f7624870125f7f379af2732eb6c2ba8cf6a1","anchor_block":69753317},"proof":["0xdfaaef5e679b13f918864d67f3f3e5a75f45f8cacfdb84bd9ea02dfcbe1566f7","0x14ecd2b9d139bc20e570980a2e9b433e4f0c565b7956a96233eedafd9ce99c8d","0xe591d5d0a3495959931e922c6e9706195a952ff9f18d717e1a5cfe223b4fed1e","0x29f1211a5b919d035bfaa8b2464720dcb1d1ed40f1c27684c02f921089d24334","0x2613191730076df696e1a75130ff252bb84d40bd9b140aea4a54675c500ea40d","0x74ef586c7ca84ad802e151db3a819e374d26f21ce7be9a5ad84194714c901041","0x29b13037f5db5c3adadb9b42ebf1cf3bb52160faf41d62eed8a3d6618bc59e83","0x2da7f7974ba0647191a30884a430cd75d68bb130e97267fbb70eff6549243339","0xe7c9a0fb388bcc520e7cfa50cdab4194b107c22ce9d7804a7bcbec291a9609e7","0x4ce6c975b8e43724b0990c59ae8acce868d51db7a0f438c95a257358ed05a115","0x17888067c344707222a1a35c7975de2c75848c487d3756a917c9a45f255c01a9","0x0a1e9d152c6b62d40c58741a87f85f3868a66ce64462c44c61e6461da548462a","0x064aad02bfe6e55281a4da30da2a91a289f618df1d6a346db244682ddd6c8d93","0xb75e183026f9112474e3710d846b63188d3bba750c3ad3feabd9a22ee7d080fc","0xa7d3fa0a08edea990614977b51a6b3289c357a88d8ca06dcbfe67415a017c0e7","0xa034ebc8d117fbf1ed466b70baa0478bf213b743e1a41cba1d2da7a9f310184d","0x1597ec94933260048e5e583aff1ad0fd44cc49efcd0a994091ed5db4924d7b02","0xe01539ac4c9f9cdf265a9e5c6d99c8da11e70ff0c7175fb23e402d33b9d79785"]}