ottoport
v1.9.0
Published
Claude Code plugin, CLI and MCP server for OttoPort — one OpenAI-compatible API for every LLM, image, video, and speech model.
Maintainers
Readme
OttoPort
One API for every model. This package is three things over the same gateway: a CLI, an MCP server, and a Claude Code plugin — chat, image, video, speech, and music, on one key and one prepaid balance.
Get a key at https://ottoport.ai/api-keys (they look like op-…), then pick
whichever surface fits.
CLI
npm install -g ottoport # or run any command below through `npx ottoport …`
export OTTOPORT_API_KEY=op-...ottoport models [--modality chat|image|video|tts|music] [--json]
ottoport chat "<prompt>" [--model claude-sonnet-5] [--system "..."] [--no-stream]
[--temperature 0.7] [--max-tokens 512]
ottoport image "<prompt>" [--model gpt-image-2] [--size 1024x1024 | --resolution 2k]
[--quality high] [--aspect-ratio 16:9] [--n 1] [--seed 7]
[--image <url>] [--ref <url>[,<url>…]] [--out file.png]
ottoport image --model qwen-image-layered --image <url> [--layers 4]
ottoport video "<prompt>" [--model kling-3.0] [--duration 5] [--resolution 1080p]
[--aspect-ratio 16:9] [--image <url>] [--last-frame <url>]
[--ref <url>[,<url>…]] [--out clip.mp4]
[--webhook-url https://…] [--no-wait]
ottoport webhook status|retry <job-id> # delivery attempts / redeliver now
ottoport speech "<text>" [--model gpt-4o-mini-tts] [--voice alloy] [--out speech.mp3]
ottoport music "<prompt>" [--model suno-v5] [--duration 15] [--out song.mp3]
ottoport install <host> # wire the MCP server into an agent
ottoport mcp # run the MCP server on stdioChat streams by default. Image, video and audio commands print the result URL;
--out downloads it. --url and --key override the environment for a single
call.
Every command is a thin client over the public REST API, so anything the CLI
does is available to your own code — the gateway is OpenAI-compatible, and any
OpenAI SDK works by pointing baseURL at https://ottoport.ai/api/v1.
Claude Code plugin
Brings the MCP server, the ottoport skill, and six slash commands in one
install:
/plugin marketplace add https://ottoport.ai/plugin/marketplace.json
/plugin install ottoport@ottoport| Command | What it does |
| --- | --- |
| /ottoport:models | The catalog with live pricing, filterable by modality. |
| /ottoport:chat | Send a prompt to any chat model (GPT, Claude, Gemini, Kimi, GLM …). |
| /ottoport:image | Generate or edit an image. |
| /ottoport:video | Submit a video job and wait for the URL. |
| /ottoport:speech | Read text aloud, or generate music. |
| /ottoport:setup | Diagnose key / gateway / MCP wiring. |
Other agents
Claude Code is the only host with a plugin format. Everywhere else, one command registers the MCP server by writing that agent's own config:
npx ottoport install codex # or hermes, cursor, windsurf, claude-desktop, claudeCodex also gets the OttoPort skill copied into ~/.codex/skills/. Your key is
forwarded from the environment rather than written into any config file.
MCP tools
ottoport_list_models, ottoport_chat, ottoport_generate_image,
ottoport_generate_video, ottoport_video_webhook, ottoport_generate_speech,
ottoport_generate_music.
The server speaks stdio JSON-RPC and is launched by the host as a subprocess, so
it needs Node 20+ on the PATH of whatever starts that host.
Modes and resolution
Video takes four modes — text-to-video, image-to-video (image_url),
first-and-last-frame (image_url + last_frame_url), and reference-to-video
(reference_image_urls). Images take one reference (image_url) or several
(reference_image_urls). Both take a resolution: 480p…4k for video,
1k/2k/4k for images, and a tier above a model's base rate costs more.
The GPT Image family reads a quality on top of that — low, medium (the
default every catalog rate is measured at), high, and on gpt-image-2.5 and
gpt-image-2.5-flare also xhigh and max. It is how much compute the model
spends, and the ladder is steep: max bills sixteen times medium.
Two image models take a picture apart instead: qwen-image-layered and
seedream-5.0-layers split image_url into RGBA layers and return one URL per
layer, bottom first (the prompt is an optional caption; num_layers, 2–10, is
honoured by Qwen only). Each layer returned bills separately.
Which modes and tiers a model accepts differs per model, so
ottoport_list_models — and ottoport models in the CLI — prints each one's
menu beside its price. For one model in full, including every parameter it
reads, pass model to that tool or run ottoport models <model-id>. Asking
for something a model does not offer is refused with its actual list, before a
generation is spent.
Webhooks
Pass webhook_url (MCP) or --webhook-url (CLI) with a video to have OttoPort
POST the finished job to that HTTPS endpoint as video.completed or
video.failed. Deliveries are signed:
x-ottoport-signature: t=<unix>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>.
Failed deliveries are retried after 1, 5, 30 and 120 minutes, 5 attempts in
all (redirects are not followed); ottoport webhook retry <job-id> or ottoport_video_webhook sends
one again at any time. Verification examples are at
https://ottoport.ai/docs#webhooks.
Configuration
OTTOPORT_API_KEY— yourop-…key. Export it from your shell profile: the MCP server reads the environment its host was launched in, so a key exported inside a running session arrives too late.- The CLI always targets
https://ottoport.ai. Use the explicit--urlflag only for local development or a self-hosted gateway. OTTOPORT_BASE_URLconfigures the MCP server only; it does not silently redirect CLI traffic.OTTOPORT_WEBHOOK_SECRET— the secret video webhooks are signed with, used when a webhook URL is given without an explicit secret. Keep it in the environment rather than on the command line.
Notes
- Image, video, and audio calls return URLs, and provider URLs expire. Download anything worth keeping.
- Video generation takes a minute or more and the call blocks until the job is
terminal, unless a webhook is given or
--no-waitis passed. A retry is a second billable generation, not a resumption. resolutionandqualityare price multipliers, not formatting hints. Leave them unset to bill at the model's base tier.- Requests are billed against the prepaid balance on your OttoPort account.
Docs: https://ottoport.ai/docs · Support: [email protected]
MIT © LITBOX LLC
