{
  "name": "PinePaper Studio Cloud",
  "version": "1.0.0",
  "description": "Generates animated vector graphics from a declarative design graph. Agents create items, relate them, animate them and render to MP4, WebM, GIF, animated SVG, PNG or PDF, billed per second of output.",
  "url": "https://cloud.pinepaper.studio",
  "documentationUrl": "https://cloud.pinepaper.studio/docs",
  "provider": {
    "organization": "PinePaper Studio",
    "url": "https://cloud.pinepaper.studio"
  },
  "supportedInterfaces": [
    {
      "url": "https://cloud.pinepaper.studio/mcp",
      "transport": "mcp-streamable-http",
      "preferred": true
    },
    {
      "url": "https://cloud.pinepaper.studio/rpc",
      "transport": "json-rpc"
    }
  ],
  "capabilities": {
    "streaming": true,
    "pushNotifications": false,
    "stateTransitionHistory": true,
    "extensions": [
      {
        "uri": "https://github.com/google-agentic-commerce/AP2/tree/v0.1.0",
        "description": "Agent Payments Protocol — renders are sold against a credit balance.",
        "required": false,
        "params": {
          "roles": [
            "merchant"
          ]
        }
      }
    ]
  },
  "defaultInputModes": [
    "text/plain",
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json",
    "video/mp4",
    "image/svg+xml",
    "image/png"
  ],
  "limits": {
    "render": {
      "maxDurationSeconds": 600,
      "minDurationSeconds": 0.1,
      "minFps": 1,
      "maxFps": 120,
      "maxItems": 5000,
      "resolutions": [
        "720p",
        "1080p",
        "4k"
      ],
      "formats": [
        "mp4",
        "webm",
        "gif",
        "svg",
        "png",
        "pdf"
      ],
      "note": "Frames are budgeted, not just seconds: duration x fps x resolution has a ceiling. POST /v1/renders:estimate is free and AUTHORITATIVE — it returns the exact price, or a diagnostic naming the lever to change (usually fps, not duration). Quote before you commit."
    },
    "pricing": {
      "creditUsd": 0.015,
      "formula": "ceil(seconds * fps/30 * resolutionFactor * formatFactor)",
      "resolutionFactor": {
        "720p": 0.5,
        "1080p": 1,
        "4k": 4
      },
      "formatFactor": {
        "mp4": 1,
        "webm": 1,
        "gif": 1.5,
        "svg": 0.25
      },
      "stills": "PNG and PDF are one frame: 1 credit at any resolution.",
      "free": [
        "/v1/renders:estimate",
        "/v1/scenes:validate"
      ]
    },
    "rateLimits": {
      "tiers": [
        {
          "surface": "/mcp, /mcp/v1, /rpc",
          "limit": 60,
          "windowSeconds": 60,
          "per": "verified principal (service account or user)"
        },
        {
          "surface": "/mcp, /mcp/v1, /rpc (credentials that fail to verify)",
          "limit": 30,
          "windowSeconds": 60,
          "per": "address"
        },
        {
          "surface": "/v1/assets/:id/edit, /v1/assets/batch-edit, transcripts",
          "limit": 20,
          "windowSeconds": 60,
          "per": "organisation (plus a daily cap)"
        },
        {
          "surface": "/v1/provenance/detect",
          "limit": 10,
          "windowSeconds": 60,
          "per": "address"
        },
        {
          "surface": "/v1/inference",
          "limit": 30,
          "windowSeconds": 60,
          "per": "user"
        },
        {
          "surface": "/api/*",
          "limit": 120,
          "windowSeconds": 60,
          "per": "address"
        },
        {
          "surface": "/auth/*, /oauth/token, /oauth/revoke",
          "limit": 60,
          "windowSeconds": 60,
          "per": "address"
        },
        {
          "surface": "/oauth/register (verified-email agent registration)",
          "limit": 10,
          "windowSeconds": 3600,
          "per": "address"
        },
        {
          "surface": "/oauth/register (verified-email agent registration)",
          "limit": 3,
          "windowSeconds": 86400,
          "per": "email address registered"
        },
        {
          "surface": "/api/checkout",
          "limit": 10,
          "windowSeconds": 60,
          "per": "address"
        }
      ],
      "onRefusal": "429 with Retry-After, plus X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset on every response. Back off on Retry-After rather than retrying immediately."
    },
    "longForm": {
      "guidance": "Do not attempt a long piece in one turn. A model's output window cannot hold minutes of scene, and an attempt produces a few oversized code blocks and almost no items. Build long-form by CHAINING: create the scene once, then add each shot's cast with its own lifetime (bornAt/ttl) across several turns, keeping only the ids you need in context. The scene is a persistent graph on the server, not a document you must resend.",
      "practicalCeilingPerTurn": "Roughly one shot — tens of items — per turn. Query back what you need instead of re-serialising the whole scene."
    }
  },
  "skills": [
    {
      "id": "create-animation",
      "name": "Create an animated graphic",
      "description": "Build a scene from typed items, relations and keyframes, then render it to video or animated SVG.",
      "tags": [
        "animation",
        "vector",
        "video",
        "svg"
      ],
      "examples": [
        "a red pulsing title over drifting motes",
        "a bar chart that grows, 10 seconds"
      ]
    },
    {
      "id": "render-scene",
      "name": "Render a scene",
      "description": "Render an existing scene to MP4, WebM, GIF, animated SVG, PNG or PDF. Priced per second; POST /v1/renders:estimate quotes free.",
      "tags": [
        "render",
        "export",
        "mp4",
        "svg"
      ]
    },
    {
      "id": "estimate-render",
      "name": "Estimate render cost",
      "description": "Return the exact credit cost of a render profile before committing to it. Free, and authoritative.",
      "tags": [
        "pricing",
        "estimate"
      ]
    }
  ]
}