Capability list — honest edition

This page says exactly what v1 does. Nothing here is aspirational.

MCP endpoint

https://asparrow-mcp.aetherneural.com/mcp — Streamable HTTP, JSON-RPC 2.0. Every call needs Authorization: Bearer sk_live_…. Supports initialize, notifications/initialized, ping, tools/list, tools/call. tools/list only shows tools your key's scopes allow.

Tools

ToolScopeStatus
items.listitems:readLive — real inventory reads.
items.getitems:readLive — real inventory reads.
items.createitems:writeLive — real inventory writes.
items.updateitems:writeLive — real inventory writes.
comps.runcompsAccepts the job, completes as not_configured — provider credentials aren't wired up yet. Never returns fake numbers.
script.generatescriptLive — deterministic template generator (source: template-v1).
narrate.runnarrateAccepts the job, completes as pending_model — TTS worker not provisioned.
video.rendervideoLive — CPU-assembled 1280×720 auction video: clips and/or a Ken Burns photo slideshow under the narration (the master clock), scrolling gold price marquee, tenant logo bug, sidechain-ducked ambient bed. Narration defaults to the item's template-v1 auction script; media defaults to the tenant's uploads. No GPU, no placeholders — failures fail honestly.
jobs.getjobs:readLive — poll any async job's status/result.

Uploads & downloads

POST /api/uploads (session cookie, multipart, 500MB cap) — upload render media: clips (mp4/mov), images (png/jpg/jpeg/webp/gif), narration and ambient audio (wav/mp3). Files are extension-allowlisted and magic-byte sniffed; stored under your tenant's uploads and referenced by the video.render params.

GET /media/<job_id>/<filename> (session cookie) — download a file a completed job produced (narration audio or rendered video). Tenant-scoped: only the job's own result paths are served, and only to that job's tenant. 401 anonymous, 403 cross-tenant, 404 unknown job or unmatched file.

Async flow

tools/call for an async tool returns {"job_id": "…", "status": "queued"} immediately. Poll jobs.get for queued → running → done | failed | not_configured | pending_model. Replaying the same parameters returns the existing job — no duplicates.

Limits

Not in v1

OAuth 2.1, Stripe billing, GPU/Modal workers, shows management, research runs. They don't exist yet, so they aren't listed as tools.