{
  "schema": "snappy-card/1",
  "skill": "snappy-docs",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are operating the canonical Notion automation primitive for the Snappy stack. All Notion reads and writes go through the REST API (`api.notion.com/v1`). Notion is the documentation layer: SOPs, runbooks, client deliverables, KB articles, project trackers, meeting notes. For UI-only tasks (covers, custom views, drag-drop) hand off to snappy-browse.",
  "verbs": [
    {
      "name": "children",
      "args": [
        "block-id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-docs/api.ts children <block-id>"
    },
    {
      "name": "me",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-docs/api.ts me"
    },
    {
      "name": "page",
      "args": [
        "page-id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-docs/api.ts page <page-id>"
    },
    {
      "name": "query",
      "args": [
        "database-id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-docs/api.ts query <database-id>"
    },
    {
      "name": "search",
      "args": [
        "query"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-docs/api.ts search \"<query>\""
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [],
  "checks": {
    "pass": 37,
    "fail": 8,
    "defer": 16,
    "line": "37 of 45 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-client-feisst"
      },
      {
        "id": 9,
        "rule": "Time-sensitive prose is isolated under Old patterns",
        "says": "5 time-sensitive instruction line(s) outside Old patterns"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path, field/box/element"
      },
      {
        "id": 11,
        "rule": "Each task presents one default, not a menu",
        "says": "2 line(s) present three-way alternative menus"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~203 tokens; body ~4783 tokens"
      },
      {
        "id": 54,
        "rule": "At least three eval scenarios precede ready status",
        "says": "0 eval scenario(s); ready=true"
      },
      {
        "id": 55,
        "rule": "Eval scenarios are multi-call with ground truth",
        "says": "eval manifest missing"
      },
      {
        "id": 57,
        "rule": "Eval manifest contains a disjoint holdout",
        "says": "0 disjoint holdout scenario(s)"
      }
    ]
  },
  "coverage": null,
  "spec": null,
  "evals": null,
  "files": [
    "AGENTS.md",
    "SKILL.md",
    "api-reference.md",
    "api.ts",
    "block-types.md",
    "contract.test.ts",
    "doc-card.test.ts",
    "evidence.test.ts",
    "image-workflows.md",
    "page-recipes.md"
  ],
  "total_size": 90085,
  "checksum": "sha256:3e2c935f87b21ec6faa1cdf63cb5d00494087b6184a5a9d33f2d39657331d47a",
  "built_at": "2026-09-09T22:08:52.295Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-docs",
      "version": "0.0.0",
      "description": "THE DEFAULT for writing to Notion -- the Snappy stack's Notion primitive over the REST API (api.notion.com/v1). Create pages, append blocks, query databases, search workspace, insert images at exact positions, plus the document recipes (meeting notes, kb article, project tracker, sop, runbook). NEVER use Charlotte MCP browser tools to drive Notion -- use the API. NEVER hardcode the Notion token -- load via `env(\"NOTION_TOKEN\")` from `snappy-settings/load.ts`. NOT for generating diagram or whiteboard IMAGES (see snappy-notion). NOT the generic vendor API reference (see notion-api). Triggers on notion, create notion page, update notion, append notion block, snappy docs, notion search, notion database, notion page, build notion doc, page recipe, meeting notes, kb article, project tracker, sop, runbook."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-docs/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/children": {
        "get": {
          "operationId": "snappy_docs_children",
          "summary": "snappy-docs children",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "block-id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Notion block whose children are listed",
                "x-snappy-position": 0
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/me": {
        "get": {
          "operationId": "snappy_docs_me",
          "summary": "snappy-docs me",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/page": {
        "get": {
          "operationId": "snappy_docs_page",
          "summary": "snappy-docs page",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "page-id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Notion page to read",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/query": {
        "get": {
          "operationId": "snappy_docs_query",
          "summary": "snappy-docs query",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "database-id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Notion database to query",
                "x-snappy-position": 0
              }
            },
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many matches to return. The count is the FLAG --limit, never a positional word; default 20, ceiling 100",
                "default": 20,
                "minimum": 1,
                "maximum": 100,
                "x-snappy-flag": "--limit"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/search": {
        "get": {
          "operationId": "snappy_docs_search",
          "summary": "snappy-docs search",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "query",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Text searched for across the workspace",
                "x-snappy-position": 0
              }
            },
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many matches to return. The count is the FLAG --limit, never a positional word; default 20, ceiling 200",
                "default": 20,
                "minimum": 1,
                "maximum": 200,
                "x-snappy-flag": "--limit"
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      }
    },
    "components": {
      "schemas": {
        "SnappyRefusal": {
          "type": "object",
          "required": [
            "outcome",
            "code",
            "message"
          ],
          "properties": {
            "outcome": {
              "type": "string",
              "const": "refused"
            },
            "code": {
              "type": "string",
              "description": "A row of the closed refusal table."
            },
            "message": {
              "type": "string"
            },
            "fix": {
              "type": "string"
            }
          }
        }
      }
    },
    "x-snappy-requires": [
      "NOTION_TOKEN"
    ]
  }
}