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
| Tool | Scope | Status |
|---|---|---|
items.list | items:read | Live — real inventory reads. |
items.get | items:read | Live — real inventory reads. |
items.create | items:write | Live — real inventory writes. |
items.update | items:write | Live — real inventory writes. |
comps.run | comps | Accepts the job, completes as not_configured — provider credentials aren't wired up yet. Never returns fake numbers. |
script.generate | script | Live — deterministic template generator (source: template-v1). |
narrate.run | narrate | Accepts the job, completes as pending_model — TTS worker not provisioned. |
video.render | video | Live — 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.get | jobs:read | Live — 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
- Rate limits: 120 requests/min per API key, 200/min per IP (HTTP 429 with
Retry-After). - Request bodies: 2MB default, 12MB on the voice-upload route, 500MB on
/api/uploads. - Scopes per key:
items:read,items:write,comps,script,narrate,video,jobs:read.
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.