Lunara

io.github.DarkMatterosPublished by GitHub account DarkMatterosv1.0.1Updated Oct 29, 2026

Subtitle engine for AI agents: one upload gives a written track and a translation, timings exact.

VerifiedStreamable HTTPWeb executableMedia & DesignAI & ML

Overview

AI-generated overview

Lunara is a hosted subtitle engine that lets an assistant turn audio or video into a written-language track plus a translation, with exact timings.

What you can do
  • Submit media for subtitling from a hosted URL or by uploading a local file, then poll job status and fetch the finished SRT or individual cues.
  • Run single stages on existing jobs: speech recognition only, translation of cue text, Cantonese-to-written-Chinese rewriting, and approximate cue splitting.
  • Inspect quality: media probe for duration and codecs, timeline coverage and gaps, per-cue reading speed, and a free contract check on both tracks.
  • Manage terminology: read the organization glossary and extract candidate proper nouns from a job's cues.
  • List available tools with their minute costs, check worker queue capacity, and get a human-oriented usage guide.
When to use it
Useful when an assistant needs to produce or translate subtitles for audio and video, or to inspect and quality-check existing subtitle tracks without re-timing them. Also handy for checking media properties before choosing a recognition engine, or for explaining the workflow to a person.
Requirements
A remote endpoint at lunaraai.cc over streamable HTTP, with a required bearer token in the Authorization header: either an OAuth 2.1 access token or a static API key created in the account settings. A Lunara account with a minute balance is needed for the tools that produce subtitles.
Before you install
The Authorization bearer token is a secret and grants access to the account balance. Subtitle-producing tools spend minutes from that balance, while ten listed tools are free. Uploading media and starting jobs sends your audio or video to a third-party service, and jobs persist on the server. Submitting several jobs at once can be refused when workers are saturated.

Installation

In SourceWeft

  1. Open Lunara in the dashboard and add it to a workspace.
  2. Connect Authorization token credentials. They are stored privately and never shown on public pages.
  3. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.DarkMatteros%2Flunara/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "lunara": {
      "type": "http",
      "url": "https://lunaraai.cc/mcp",
      "headers": {
        "Authorization": "Bearer <YOUR_TOKEN>"
      }
    }
  }
}

README

This repository has no README.

Tools

20

lunara_list_tools

List Lunara tools

Return every subtitle tool Lunara exposes, with the minutes each one costs. Call this first when you are unsure which tool fits.

Takes no parameters.

lunara_get_job

Get subtitle job

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.

ParametersjobIdrequired

lunara_get_srt

Download SRT

Return the subtitle file for a finished job. One line per cue. Use track="secondary" for the translated track (English by default).

ParametersjobIdrequiredtrack

lunara_list_cues

List cues

Return subtitle cues for a job as timestamps plus text, so you can inspect or reference individual lines before proposing edits.

ParametersjobIdrequiredlimitoffset

lunara_start_subtitle_job

Start a subtitle job from a URL

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.

ParametersaudioUrlrequiredspokenLangprimaryLangsecondaryLang

lunara_subtitle_from_url

Subtitles from a URL

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.

ParametersaudioUrlrequiredfilenamespokenLangprimaryLangsecondaryLang

lunara_upload_video

Upload a video for subtitling

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.

ParametersmimerequiredfilenamerequiredprojectIdsizeBytesrequiredprimaryLangsecondaryLangclientOperationId

lunara_finish_upload

Finish an upload

Tell Lunara the bytes are uploaded so the pipeline can start. Returns the job id to poll with lunara_get_job.

ParameterskeyrequiredpartsrequiredvideoIdrequireduploadIdrequireddurationMsrequired

lunara_get_glossary

Get the project glossary

Return the proper nouns Lunara has learned for this org, so names are spelled consistently across tracks.

Parameterslimit

lunara_transcribe

Transcribe audio

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.

ParametersaudioUrlrequiredspokenLang

lunara_translate

Translate a cue list

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.

ParametersjobIdrequiredtracktargetLangrequired

lunara_rewrite

Rewrite spoken → written

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.

ParametersjobIdrequiredtrack

lunara_segment

Split cues at punctuation

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.

ParametersjobIdrequiredtrackmaxCueMs

lunara_glossary_extract

Extract proper nouns

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.

ParametersjobIdrequiredlimit

lunara_guide

How to use Lunara — a guide you can relay to a person

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.

Parametersjourney

lunara_get_queue

Pipeline queue depth

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.

Takes no parameters.

lunara_qa_contract

Check the subtitle contract

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.

ParametersjobIdrequiredtrack

lunara_probe_media

Probe media

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.

ParametersmediaUrlrequired

lunara_get_coverage

Delivery coverage

Report how much of the source timeline the subtitles cover, and list suspicious gaps longer than a second. Use before shipping a long video.

ParametersjobIdrequired

lunara_readability

Readability report

Per-cue reading speed, displayed length and characters-per-second, with the cues that exceed comfortable limits. Mirrors the metrics shown in the editor.

ParametersjobIdrequiredtrack

Version history

1
  1. v1.0.1LatestOct 29, 2026

Score

75% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts

    Declare a GitHub repository with a README, or serve resource_documentation in the OAuth protected-resource metadata.

  • License10 pts

    Declare a license in the repository or the registry entry.