addrbookFor publishers
← 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.

How to check it · This row as JSON