{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "name": "app.cnvs/whiteboard",
  "title": "cnvs.app",
  "description": "Real-time collaborative whiteboard — AI agents and humans edit the same board live over MCP.",
  "version": "1.0.2",
  "websiteUrl": "https://cnvs.app",
  "repository": {
    "url": "https://github.com/lksrz/cnvs-whiteboard-skills",
    "source": "github"
  },
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://cnvs.app/mcp"
    }
  ],
  "_meta": {
    "io.modelcontextprotocol.registry/publisher-provided": {
      "protocolVersion": "2025-06-18",
      "authentication": {
        "default": "none — the board ID is the access credential.",
        "perBoardLock": {
          "modes": ["write", "all"],
          "keyFormat": "8 chars [a-z0-9] (6-char legacy keys also accepted)",
          "channels": {
            "header": "X-Board-Key",
            "argument": "access_key on the tool / resource params"
          },
          "errorCode": -32001,
          "noRecovery": true,
          "endpoints": {
            "lock": "POST https://cnvs.app/api/boards/<id>/lock",
            "unlock": "POST https://cnvs.app/api/boards/<id>/unlock",
            "verify": "POST https://cnvs.app/api/boards/<id>/verify-key"
          }
        }
      },
      "subscribe": true,
      "tools": [
        "open_board",
        "create_board",
        "get_board",
        "get_preview",
        "add_text",
        "add_link",
        "add_image",
        "draw_stroke",
        "move",
        "erase",
        "wait_for_update"
      ],
      "resources": [
        "cnvs://board/{id}/state.json",
        "cnvs://board/{id}/preview.svg"
      ],
      "documentation": "https://cnvs.app/llms.txt",
      "openapi": "https://cnvs.app/openapi.json",
      "quotasManifest": "https://cnvs.app/quotas.json",
      "boardImport": {
        "maxItems": 40,
        "maxBatchStatements": 45,
        "maxLaneTitles": 10,
        "limits": "https://cnvs.app/quotas.json",
        "infrastructureToken": "X-Import-Token is server-to-server and selects the 10x infrastructure REST/MCP rate tier; hard caps and board access locks still apply."
      },
      "rateLimits": {
        "standard": {
          "restMcpPerBoard": { "requests": 60, "windowSeconds": 10 },
          "boardCreatePerClientIp": { "requests": 5, "windowSeconds": 60, "enforcement": "Cloudflare Rate Limiting binding; permissive and eventually consistent per edge location" }
        },
        "infrastructure": {
          "restMcpPerBoard": { "requests": 600, "windowSeconds": 10 },
          "boardCreatePerToken": { "requests": 50, "windowSeconds": 60, "perNote": "One shared bucket per token value; a single import-token secret exists, so this is not a per-integration allowance.", "enforcement": "Cloudflare Rate Limiting binding; permissive and eventually consistent per edge location" }
        },
        "unchanged": {
          "webSocketPerBoard": { "requests": 60, "windowSeconds": 10 },
          "lockUnlockVerifyPerClientIp": { "requests": 5, "windowSeconds": 60 }
        }
      },
      "fieldLimits": {
        "maxAuthorChars": 80,
        "maxThumbnailBytes": 8000,
        "textWidth": { "min": 160, "max": 4096 },
        "columnWidth": { "min": 200, "max": 480, "default": 280 },
        "maxLaneTitleChars": 200,
        "maxColumnTitleChars": 200,
        "maxTaskNameChars": 500,
        "maxAssigneeChars": 200
      },
      "operationLimits": {
        "maxRecolorItems": 500,
        "maxBatchOps": 500,
        "wsContinuation": { "maxFrames": 500, "idleMs": 500 }
      },
      "skills": [
        {
          "name": "cnvs-whiteboard",
          "canonical": "https://cnvs.app/cnvs-whiteboard/SKILL.md",
          "description": "How to collaborate on a cnvs.app board as an AI agent — read state, mutate via REST, subscribe via MCP."
        },
        {
          "name": "mcp-listen",
          "canonical": "https://cnvs.app/mcp-listen/SKILL.md",
          "description": "Generic Streamable-HTTP MCP notification pump — wraps cleanly under Claude Code's Monitor tool."
        }
      ]
    }
  }
}
