{
  "$comment": "Generated from @openpresentation/mcp 0.28.0 by scripts/prepare-mcp-sources.mjs. Connect: https://www.openpresentation.org/docs/mcp",
  "name": "opf",
  "title": "OpenPresentation (OPF)",
  "version": "0.28.0",
  "description": "The OPF MCP server: learn the Open Presentation Format (docs, schemas, the default catalog, example decks, agent skills) and validate and convert decks. Read-only and stateless; no account or key.",
  "endpoint": "https://openpresentation.org/mcp",
  "transport": {
    "type": "streamable-http",
    "url": "https://openpresentation.org/mcp",
    "stateless": true
  },
  "authentication": {
    "required": false
  },
  "rateLimit": {
    "requests": 60,
    "periodSeconds": 60,
    "per": "ip"
  },
  "capabilities": {
    "prompts": {
      "listChanged": true
    },
    "resources": {
      "listChanged": true
    },
    "tools": {
      "listChanged": true
    }
  },
  "tools": [
    {
      "name": "start_here",
      "title": "Start here: a guided path into OPF",
      "description": "Begin here. Given the goal you are working on (for example \"a board update with a revenue chart\", \"fix the validation errors in my deck\", \"change a theme\"), returns a short ordered path: which documentation pages and skill to read, two or three relevant example decks, layout and theme suggestions from the default catalog, and the validate step (validate_deck with failOn \"warning\"). With no goal it returns the general learning path. Everything it names is a resource URI or a tool you can call next.",
      "annotations": {
        "title": "Start here: a guided path into OPF",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "validate_deck",
      "title": "Validate an OPF deck",
      "description": "Check a deck as `opf validate` does: format (JSON syntax, schema), references, policy, accessibility, layout and content. Returns { ok, findings[] }; each finding has ruleId, severity, category, path (a JSON Pointer), message, help and sometimes fixes, and a line and column when the text is JSON, YAML or Markdown. Only format, references and policy findings are errors by default, so a valid deck can still carry warnings. Reads nothing but the document; images are not fetched or looked up. Passing validation is not proof of how the deck looks.",
      "annotations": {
        "title": "Validate an OPF deck",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_schema",
      "title": "Get an OPF JSON Schema",
      "description": "Return a schema, or part of one, like `opf schema`. name is a schema (presentation, audience, purpose, tone, theme, layout, chartType, narrative, socialPlatform, language, colorScheme, fontScheme, finding; default presentation) or a $defs name such as Chart, Slide, Design. pointer is a JSON Pointer into the schema (/properties/slides) or a $defs name. $refs stay as written (look them up in $defs). A whole schema names the @openpresentation/opf release it came from in its $comment. The whole presentation schema is large: ask for a $defs name or a pointer.",
      "annotations": {
        "title": "Get an OPF JSON Schema",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "search_catalog",
      "title": "Search the default catalog",
      "description": "Search the default design catalog (@openpresentation/gallery) by kind: layouts, themes, color-schemes, font-schemes, narratives, audiences, purposes, tones, chart-types, languages, social-platforms, examples. Matches id, name, summary, description and tags (every word must match); with no query it lists the kind. Returns short records; get_catalog_record returns one in full. A deck refers to a record by id (layout: \"two-column\").",
      "annotations": {
        "title": "Search the default catalog",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_catalog_record",
      "title": "Get a catalog record",
      "description": "Return one record of the default catalog in full, by kind and id (an example deck for kind examples, by slug), like `opf catalog <kind> <id>`.",
      "annotations": {
        "title": "Get a catalog record",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "convert",
      "title": "Convert a deck between JSON, YAML and Markdown",
      "description": "Change a deck between the three text forms (JSON is canonical; YAML and OPF Markdown are authoring forms), like `opf convert`. The deck must be valid (format and references) or nothing is converted and the findings are returned. Text formats only: PDF, PPTX and images need the local opf command. Returns the converted text.",
      "annotations": {
        "title": "Convert a deck between JSON, YAML and Markdown",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "search_docs",
      "title": "Search the OPF documentation",
      "description": "Ranked text search over the bundled documentation pages and skills. Returns the best pages with a snippet, the heading it sits under and the resource URI to read the page (opf://docs/<slug>, opf://skills/<name>). Words are matched in titles, headings and text; a page with every word ranks first.",
      "annotations": {
        "title": "Search the OPF documentation",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_examples",
      "title": "List the example decks",
      "description": "List the bundled example decks (valid OPF, from small to a tour of every feature) with their slug, name, category and resource URI. Read one with the resource opf://examples/<slug> or get_catalog_record { kind: \"examples\", id }.",
      "annotations": {
        "title": "List the example decks",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    }
  ],
  "prompts": [
    {
      "name": "learn_opf",
      "title": "Learn OPF",
      "description": "Orient an agent that has not used OPF: what it is and which resources, tools and skills to use for what."
    },
    {
      "name": "author_deck",
      "title": "Author a deck",
      "description": "Write a new OPF deck from a brief, then validate and fix it."
    },
    {
      "name": "fix_validation_findings",
      "title": "Fix validation findings",
      "description": "Repair a deck that does not validate, changing as little as possible."
    },
    {
      "name": "choose_layout",
      "title": "Choose a layout",
      "description": "Pick the layout (and design options) for a slide from the content it has to carry."
    }
  ],
  "local": {
    "package": "@openpresentation/mcp",
    "command": "npx",
    "args": [
      "-y",
      "@openpresentation/mcp"
    ],
    "transport": "stdio"
  },
  "documentation": {
    "connect": "https://www.openpresentation.org/docs/mcp",
    "reference": "https://www.openpresentation.org/docs/reference/mcp"
  },
  "opfVersion": "0.28.0"
}
