{
  "openapi": "3.1.0",
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "info": {
    "title": "Texuli public API (texuli.com)",
    "version": "0.18.0",
    "summary": "Read-only JSON files of texuli.com (the component catalog, themes, the Markdown twins manifest) and the remote MCP server.",
    "description": "**Released in 0.18.0 (first released in 0.9.0): published on npm and served by texuli.com, deployed from main.**\n\ntexuli.com is a static site on Cloudflare Pages: every GET endpoint is a file the build writes, fronted by an edge middleware. The endpoints under /api/v1/ are served by that middleware: each reads the file the site itself fetches, byte for byte, under a versioned prefix.\n\n## Authentication\n\nNone. Every endpoint is public, anonymous and read-only. See https://texuli.com/auth.md.\n\n## Limits\n\n/api/: 300 requests per client per 60 seconds (`RateLimit-Policy: \"api\";q=300;w=60`), and /mcp: 60 messages per client per 60 seconds. Both are best-effort per edge isolate. Past a limit the answer is 429 with Retry-After. The RateLimit fields and the 429 come from the Pages middleware; a static file served without it carries X-API-Version and CORS from _headers, and no rate-limit fields.\n\n## Versioning and deprecation\n\nEvery /api/ response carries X-API-Version (0.18.0, the release line). Paths under /api/v1/ only change additively: new endpoints and new optional fields. A breaking change ships under /api/v2/, and /api/v1/ keeps serving for at least one release line (0.x minor) after that, with Deprecation (RFC 9745) and Sunset (RFC 8594) headers on every affected response. The unversioned paths are the files the site itself fetches: they follow the site and may change in any release, so pin /api/v1/.\n\n## Errors\n\nFailed /api/ requests return RFC 9457 `application/problem+json` (type, title, status, detail, instance) plus an `error` object with a stable code, a message, a hint and the documentation URL. HTML is never returned under /api/.",
    "contact": {
      "name": "Dailybot, Inc.",
      "url": "https://github.com/DailybotHQ/texuli"
    },
    "license": {
      "name": "MIT",
      "identifier": "MIT"
    }
  },
  "externalDocs": {
    "description": "The Texuli developer portal",
    "url": "https://texuli.com/developers/"
  },
  "servers": [
    {
      "url": "https://texuli.com",
      "description": "texuli.com (Cloudflare Pages, deployed from main)"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "api",
      "description": "The index and the health file."
    },
    {
      "name": "catalog",
      "description": "The agent component catalog."
    },
    {
      "name": "themes",
      "description": "The theme library."
    },
    {
      "name": "twins",
      "description": "The Markdown twin of every page."
    },
    {
      "name": "mcp",
      "description": "The remote MCP server.",
      "externalDocs": {
        "url": "https://github.com/DailybotHQ/texuli/blob/main/packages/tools/docs/mcp.md"
      }
    }
  ],
  "x-versioning": {
    "strategy": [
      "url-prefix",
      "response-header"
    ],
    "current": "0.18.0",
    "prefix": "/api/v1/",
    "header": "X-API-Version",
    "deprecation": {
      "headers": [
        "Deprecation",
        "Sunset"
      ],
      "specification": [
        "RFC 9745",
        "RFC 8594"
      ],
      "policy": "Paths under /api/v1/ only change additively: new endpoints and new optional fields. A breaking change ships under /api/v2/, and /api/v1/ keeps serving for at least one release line (0.x minor) after that, with Deprecation (RFC 9745) and Sunset (RFC 8594) headers on every affected response. The unversioned paths are the files the site itself fetches: they follow the site and may change in any release, so pin /api/v1/."
    }
  },
  "paths": {
    "/api/v1/index.json": {
      "get": {
        "operationId": "getApiIndexV1",
        "tags": [
          "api"
        ],
        "summary": "API index",
        "description": "The version, the limits, the deprecation policy and every endpoint with its operationId. The same bytes as /api/index.json, under the versioned prefix: pin this path.",
        "responses": {
          "200": {
            "description": "API index",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/ApiIndex"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No resource at this path. Under /api/ every miss is problem details, never HTML.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "No API resource exists at /api/v1/no-such-file.json.",
                      "instance": "/api/v1/no-such-file.json",
                      "error": {
                        "code": "resource_not_found",
                        "message": "No API resource exists at /api/v1/no-such-file.json.",
                        "hint": "Fetch https://texuli.com/api/v1/index.json for every endpoint, or https://texuli.com/openapi.json for the OpenAPI description. Endpoint paths end in \".json\".",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "A method other than GET, HEAD or OPTIONS.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Method Not Allowed",
                      "status": 405,
                      "detail": "/api/v1/index.json is read-only: it accepts GET, HEAD and OPTIONS.",
                      "instance": "/api/v1/index.json",
                      "error": {
                        "code": "method_not_allowed",
                        "message": "/api/v1/index.json is read-only: it accepts GET, HEAD and OPTIONS.",
                        "hint": "Retry the same URL with GET.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "More than 300 requests per 60 seconds from one client. Wait the Retry-After delay.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Too many requests to /api/v1/index.json. The limit is in the RateLimit-Policy header.",
                      "instance": "/api/v1/index.json",
                      "error": {
                        "code": "rate_limited",
                        "message": "Too many requests to /api/v1/index.json. The limit is in the RateLimit-Policy header.",
                        "hint": "Wait the number of seconds in the Retry-After header, then retry; see https://texuli.com/developers/#limits.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/index.json": {
      "get": {
        "operationId": "getApiIndex",
        "tags": [
          "api"
        ],
        "summary": "API index",
        "description": "The version, the limits, the deprecation policy and every endpoint with its operationId. Also served as /api/v1/index.json.",
        "responses": {
          "200": {
            "description": "API index",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/ApiIndex"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No resource at this path. Under /api/ every miss is problem details, never HTML.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "No API resource exists at /api/v1/no-such-file.json.",
                      "instance": "/api/v1/no-such-file.json",
                      "error": {
                        "code": "resource_not_found",
                        "message": "No API resource exists at /api/v1/no-such-file.json.",
                        "hint": "Fetch https://texuli.com/api/v1/index.json for every endpoint, or https://texuli.com/openapi.json for the OpenAPI description. Endpoint paths end in \".json\".",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "A method other than GET, HEAD or OPTIONS.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Method Not Allowed",
                      "status": 405,
                      "detail": "/api/index.json is read-only: it accepts GET, HEAD and OPTIONS.",
                      "instance": "/api/index.json",
                      "error": {
                        "code": "method_not_allowed",
                        "message": "/api/index.json is read-only: it accepts GET, HEAD and OPTIONS.",
                        "hint": "Retry the same URL with GET.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "More than 300 requests per 60 seconds from one client. Wait the Retry-After delay.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Too many requests to /api/index.json. The limit is in the RateLimit-Policy header.",
                      "instance": "/api/index.json",
                      "error": {
                        "code": "rate_limited",
                        "message": "Too many requests to /api/index.json. The limit is in the RateLimit-Policy header.",
                        "hint": "Wait the number of seconds in the Retry-After header, then retry; see https://texuli.com/developers/#limits.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/health.json": {
      "get": {
        "operationId": "getHealthV1",
        "tags": [
          "api"
        ],
        "summary": "Health",
        "description": "A static file written by the build: status, release line and build time. It proves the build is served, not that a Function runs. The same bytes as /api/health.json, under the versioned prefix: pin this path.",
        "responses": {
          "200": {
            "description": "Health",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/Health"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No resource at this path. Under /api/ every miss is problem details, never HTML.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "No API resource exists at /api/v1/no-such-file.json.",
                      "instance": "/api/v1/no-such-file.json",
                      "error": {
                        "code": "resource_not_found",
                        "message": "No API resource exists at /api/v1/no-such-file.json.",
                        "hint": "Fetch https://texuli.com/api/v1/index.json for every endpoint, or https://texuli.com/openapi.json for the OpenAPI description. Endpoint paths end in \".json\".",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "A method other than GET, HEAD or OPTIONS.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Method Not Allowed",
                      "status": 405,
                      "detail": "/api/v1/health.json is read-only: it accepts GET, HEAD and OPTIONS.",
                      "instance": "/api/v1/health.json",
                      "error": {
                        "code": "method_not_allowed",
                        "message": "/api/v1/health.json is read-only: it accepts GET, HEAD and OPTIONS.",
                        "hint": "Retry the same URL with GET.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "More than 300 requests per 60 seconds from one client. Wait the Retry-After delay.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Too many requests to /api/v1/health.json. The limit is in the RateLimit-Policy header.",
                      "instance": "/api/v1/health.json",
                      "error": {
                        "code": "rate_limited",
                        "message": "Too many requests to /api/v1/health.json. The limit is in the RateLimit-Policy header.",
                        "hint": "Wait the number of seconds in the Retry-After header, then retry; see https://texuli.com/developers/#limits.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/health.json": {
      "get": {
        "operationId": "getHealth",
        "tags": [
          "api"
        ],
        "summary": "Health",
        "description": "A static file written by the build: status, release line and build time. It proves the build is served, not that a Function runs. Also served as /api/v1/health.json.",
        "responses": {
          "200": {
            "description": "Health",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/Health"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No resource at this path. Under /api/ every miss is problem details, never HTML.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "No API resource exists at /api/v1/no-such-file.json.",
                      "instance": "/api/v1/no-such-file.json",
                      "error": {
                        "code": "resource_not_found",
                        "message": "No API resource exists at /api/v1/no-such-file.json.",
                        "hint": "Fetch https://texuli.com/api/v1/index.json for every endpoint, or https://texuli.com/openapi.json for the OpenAPI description. Endpoint paths end in \".json\".",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "A method other than GET, HEAD or OPTIONS.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Method Not Allowed",
                      "status": 405,
                      "detail": "/api/health.json is read-only: it accepts GET, HEAD and OPTIONS.",
                      "instance": "/api/health.json",
                      "error": {
                        "code": "method_not_allowed",
                        "message": "/api/health.json is read-only: it accepts GET, HEAD and OPTIONS.",
                        "hint": "Retry the same URL with GET.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "More than 300 requests per 60 seconds from one client. Wait the Retry-After delay.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Too many requests to /api/health.json. The limit is in the RateLimit-Policy header.",
                      "instance": "/api/health.json",
                      "error": {
                        "code": "rate_limited",
                        "message": "Too many requests to /api/health.json. The limit is in the RateLimit-Policy header.",
                        "hint": "Wait the number of seconds in the Retry-After header, then retry; see https://texuli.com/developers/#limits.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/catalog.json": {
      "get": {
        "operationId": "getCatalogV1",
        "tags": [
          "catalog"
        ],
        "summary": "Component catalog",
        "description": "The agent catalog snapshot: every component manifest with props, examples, accessibility notes and the emit tiers that may place it. The same bytes as /catalog/catalog.json, under the versioned prefix: pin this path.",
        "responses": {
          "200": {
            "description": "Component catalog",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Catalog"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/Catalog"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No resource at this path. Under /api/ every miss is problem details, never HTML.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "No API resource exists at /api/v1/no-such-file.json.",
                      "instance": "/api/v1/no-such-file.json",
                      "error": {
                        "code": "resource_not_found",
                        "message": "No API resource exists at /api/v1/no-such-file.json.",
                        "hint": "Fetch https://texuli.com/api/v1/index.json for every endpoint, or https://texuli.com/openapi.json for the OpenAPI description. Endpoint paths end in \".json\".",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "A method other than GET, HEAD or OPTIONS.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Method Not Allowed",
                      "status": 405,
                      "detail": "/api/v1/catalog.json is read-only: it accepts GET, HEAD and OPTIONS.",
                      "instance": "/api/v1/catalog.json",
                      "error": {
                        "code": "method_not_allowed",
                        "message": "/api/v1/catalog.json is read-only: it accepts GET, HEAD and OPTIONS.",
                        "hint": "Retry the same URL with GET.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "More than 300 requests per 60 seconds from one client. Wait the Retry-After delay.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Too many requests to /api/v1/catalog.json. The limit is in the RateLimit-Policy header.",
                      "instance": "/api/v1/catalog.json",
                      "error": {
                        "code": "rate_limited",
                        "message": "Too many requests to /api/v1/catalog.json. The limit is in the RateLimit-Policy header.",
                        "hint": "Wait the number of seconds in the Retry-After header, then retry; see https://texuli.com/developers/#limits.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/catalog/catalog.json": {
      "get": {
        "operationId": "getCatalog",
        "tags": [
          "catalog"
        ],
        "summary": "Component catalog",
        "description": "The agent catalog snapshot: every component manifest with props, examples, accessibility notes and the emit tiers that may place it. A file the site's own pages fetch; it follows the site and may change in any release. The same bytes are served as /api/v1/catalog.json, which is versioned.",
        "responses": {
          "200": {
            "description": "Component catalog",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Catalog"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/Catalog"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No file at this path. Agent clients and JSON clients get problem details; browsers get the HTML 404 page.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteProblem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/themes.json": {
      "get": {
        "operationId": "listThemesV1",
        "tags": [
          "themes"
        ],
        "summary": "Theme catalog",
        "description": "Every library theme: id, name, description, category, collection, tags and its light swatches. The same bytes as /theme-catalog.json, under the versioned prefix: pin this path.",
        "responses": {
          "200": {
            "description": "Theme catalog",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThemeCatalog"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/ThemeCatalog"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No resource at this path. Under /api/ every miss is problem details, never HTML.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "No API resource exists at /api/v1/no-such-file.json.",
                      "instance": "/api/v1/no-such-file.json",
                      "error": {
                        "code": "resource_not_found",
                        "message": "No API resource exists at /api/v1/no-such-file.json.",
                        "hint": "Fetch https://texuli.com/api/v1/index.json for every endpoint, or https://texuli.com/openapi.json for the OpenAPI description. Endpoint paths end in \".json\".",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "A method other than GET, HEAD or OPTIONS.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Method Not Allowed",
                      "status": 405,
                      "detail": "/api/v1/themes.json is read-only: it accepts GET, HEAD and OPTIONS.",
                      "instance": "/api/v1/themes.json",
                      "error": {
                        "code": "method_not_allowed",
                        "message": "/api/v1/themes.json is read-only: it accepts GET, HEAD and OPTIONS.",
                        "hint": "Retry the same URL with GET.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "More than 300 requests per 60 seconds from one client. Wait the Retry-After delay.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Too many requests to /api/v1/themes.json. The limit is in the RateLimit-Policy header.",
                      "instance": "/api/v1/themes.json",
                      "error": {
                        "code": "rate_limited",
                        "message": "Too many requests to /api/v1/themes.json. The limit is in the RateLimit-Policy header.",
                        "hint": "Wait the number of seconds in the Retry-After header, then retry; see https://texuli.com/developers/#limits.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/theme-catalog.json": {
      "get": {
        "operationId": "listThemes",
        "tags": [
          "themes"
        ],
        "summary": "Theme catalog",
        "description": "Every library theme: id, name, description, category, collection, tags and its light swatches. A file the site's own pages fetch; it follows the site and may change in any release. The same bytes are served as /api/v1/themes.json, which is versioned.",
        "responses": {
          "200": {
            "description": "Theme catalog",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThemeCatalog"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/ThemeCatalog"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No file at this path. Agent clients and JSON clients get problem details; browsers get the HTML 404 page.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteProblem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/themes-dark.json": {
      "get": {
        "operationId": "listThemeDarkSwatchesV1",
        "tags": [
          "themes"
        ],
        "summary": "Dark swatches",
        "description": "The dark-mode swatches of every theme that has a dark palette. The same bytes as /theme-catalog-dark.json, under the versioned prefix: pin this path.",
        "responses": {
          "200": {
            "description": "Dark swatches",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThemeDarkSwatchList"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/ThemeDarkSwatchList"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No resource at this path. Under /api/ every miss is problem details, never HTML.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "No API resource exists at /api/v1/no-such-file.json.",
                      "instance": "/api/v1/no-such-file.json",
                      "error": {
                        "code": "resource_not_found",
                        "message": "No API resource exists at /api/v1/no-such-file.json.",
                        "hint": "Fetch https://texuli.com/api/v1/index.json for every endpoint, or https://texuli.com/openapi.json for the OpenAPI description. Endpoint paths end in \".json\".",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "A method other than GET, HEAD or OPTIONS.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Method Not Allowed",
                      "status": 405,
                      "detail": "/api/v1/themes-dark.json is read-only: it accepts GET, HEAD and OPTIONS.",
                      "instance": "/api/v1/themes-dark.json",
                      "error": {
                        "code": "method_not_allowed",
                        "message": "/api/v1/themes-dark.json is read-only: it accepts GET, HEAD and OPTIONS.",
                        "hint": "Retry the same URL with GET.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "More than 300 requests per 60 seconds from one client. Wait the Retry-After delay.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Too many requests to /api/v1/themes-dark.json. The limit is in the RateLimit-Policy header.",
                      "instance": "/api/v1/themes-dark.json",
                      "error": {
                        "code": "rate_limited",
                        "message": "Too many requests to /api/v1/themes-dark.json. The limit is in the RateLimit-Policy header.",
                        "hint": "Wait the number of seconds in the Retry-After header, then retry; see https://texuli.com/developers/#limits.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/theme-catalog-dark.json": {
      "get": {
        "operationId": "listThemeDarkSwatches",
        "tags": [
          "themes"
        ],
        "summary": "Dark swatches",
        "description": "The dark-mode swatches of every theme that has a dark palette. A file the site's own pages fetch; it follows the site and may change in any release. The same bytes are served as /api/v1/themes-dark.json, which is versioned.",
        "responses": {
          "200": {
            "description": "Dark swatches",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThemeDarkSwatchList"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/ThemeDarkSwatchList"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No file at this path. Agent clients and JSON clients get problem details; browsers get the HTML 404 page.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteProblem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/theme-gallery.json": {
      "get": {
        "operationId": "listThemeGalleryCardsV1",
        "tags": [
          "themes"
        ],
        "summary": "Theme gallery cards",
        "description": "Every theme with its WCAG AA contrast summary per mode and the key colors of each mode. The same bytes as /theme-gallery.json, under the versioned prefix: pin this path.",
        "responses": {
          "200": {
            "description": "Theme gallery cards",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThemeGalleryCardList"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/ThemeGalleryCardList"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No resource at this path. Under /api/ every miss is problem details, never HTML.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "No API resource exists at /api/v1/no-such-file.json.",
                      "instance": "/api/v1/no-such-file.json",
                      "error": {
                        "code": "resource_not_found",
                        "message": "No API resource exists at /api/v1/no-such-file.json.",
                        "hint": "Fetch https://texuli.com/api/v1/index.json for every endpoint, or https://texuli.com/openapi.json for the OpenAPI description. Endpoint paths end in \".json\".",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "A method other than GET, HEAD or OPTIONS.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Method Not Allowed",
                      "status": 405,
                      "detail": "/api/v1/theme-gallery.json is read-only: it accepts GET, HEAD and OPTIONS.",
                      "instance": "/api/v1/theme-gallery.json",
                      "error": {
                        "code": "method_not_allowed",
                        "message": "/api/v1/theme-gallery.json is read-only: it accepts GET, HEAD and OPTIONS.",
                        "hint": "Retry the same URL with GET.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "More than 300 requests per 60 seconds from one client. Wait the Retry-After delay.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Too many requests to /api/v1/theme-gallery.json. The limit is in the RateLimit-Policy header.",
                      "instance": "/api/v1/theme-gallery.json",
                      "error": {
                        "code": "rate_limited",
                        "message": "Too many requests to /api/v1/theme-gallery.json. The limit is in the RateLimit-Policy header.",
                        "hint": "Wait the number of seconds in the Retry-After header, then retry; see https://texuli.com/developers/#limits.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/theme-gallery.json": {
      "get": {
        "operationId": "listThemeGalleryCards",
        "tags": [
          "themes"
        ],
        "summary": "Theme gallery cards",
        "description": "Every theme with its WCAG AA contrast summary per mode and the key colors of each mode. A file the site's own pages fetch; it follows the site and may change in any release. The same bytes are served as /api/v1/theme-gallery.json, which is versioned.",
        "responses": {
          "200": {
            "description": "Theme gallery cards",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThemeGalleryCardList"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/ThemeGalleryCardList"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No file at this path. Agent clients and JSON clients get problem details; browsers get the HTML 404 page.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteProblem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/themes/{id}.json": {
      "get": {
        "operationId": "getThemeV1",
        "tags": [
          "themes"
        ],
        "summary": "One theme",
        "description": "One theme's color explorer payload: its metadata and every color of each mode. The same bytes as /theme-data/{id}.json, under the versioned prefix: pin this path.",
        "parameters": [
          {
            "$ref": "#/components/parameters/ThemeId"
          }
        ],
        "responses": {
          "200": {
            "description": "One theme",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThemeData"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/ThemeData"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No resource at this path. Under /api/ every miss is problem details, never HTML.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "No API resource exists at /api/v1/no-such-file.json.",
                      "instance": "/api/v1/no-such-file.json",
                      "error": {
                        "code": "resource_not_found",
                        "message": "No API resource exists at /api/v1/no-such-file.json.",
                        "hint": "Fetch https://texuli.com/api/v1/index.json for every endpoint, or https://texuli.com/openapi.json for the OpenAPI description. Endpoint paths end in \".json\".",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "A method other than GET, HEAD or OPTIONS.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Method Not Allowed",
                      "status": 405,
                      "detail": "/api/v1/themes/ocean.json is read-only: it accepts GET, HEAD and OPTIONS.",
                      "instance": "/api/v1/themes/ocean.json",
                      "error": {
                        "code": "method_not_allowed",
                        "message": "/api/v1/themes/ocean.json is read-only: it accepts GET, HEAD and OPTIONS.",
                        "hint": "Retry the same URL with GET.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "More than 300 requests per 60 seconds from one client. Wait the Retry-After delay.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Too many requests to /api/v1/themes/ocean.json. The limit is in the RateLimit-Policy header.",
                      "instance": "/api/v1/themes/ocean.json",
                      "error": {
                        "code": "rate_limited",
                        "message": "Too many requests to /api/v1/themes/ocean.json. The limit is in the RateLimit-Policy header.",
                        "hint": "Wait the number of seconds in the Retry-After header, then retry; see https://texuli.com/developers/#limits.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/theme-data/{id}.json": {
      "get": {
        "operationId": "getTheme",
        "tags": [
          "themes"
        ],
        "summary": "One theme",
        "description": "One theme's color explorer payload: its metadata and every color of each mode. A file the site's own pages fetch; it follows the site and may change in any release. The same bytes are served as /api/v1/themes/{id}.json, which is versioned.",
        "parameters": [
          {
            "$ref": "#/components/parameters/ThemeId"
          }
        ],
        "responses": {
          "200": {
            "description": "One theme",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThemeData"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/ThemeData"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No file at this path. Agent clients and JSON clients get problem details; browsers get the HTML 404 page.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteProblem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/twins.json": {
      "get": {
        "operationId": "getTwinsManifestV1",
        "tags": [
          "twins"
        ],
        "summary": "Markdown twins manifest",
        "description": "Every page route mapped to its Markdown twin (the page URL plus .md). The same bytes as /md-manifest.json, under the versioned prefix: pin this path.",
        "responses": {
          "200": {
            "description": "Markdown twins manifest",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TwinsManifest"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/TwinsManifest"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No resource at this path. Under /api/ every miss is problem details, never HTML.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "No API resource exists at /api/v1/no-such-file.json.",
                      "instance": "/api/v1/no-such-file.json",
                      "error": {
                        "code": "resource_not_found",
                        "message": "No API resource exists at /api/v1/no-such-file.json.",
                        "hint": "Fetch https://texuli.com/api/v1/index.json for every endpoint, or https://texuli.com/openapi.json for the OpenAPI description. Endpoint paths end in \".json\".",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "405": {
            "description": "A method other than GET, HEAD or OPTIONS.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Method Not Allowed",
                      "status": 405,
                      "detail": "/api/v1/twins.json is read-only: it accepts GET, HEAD and OPTIONS.",
                      "instance": "/api/v1/twins.json",
                      "error": {
                        "code": "method_not_allowed",
                        "message": "/api/v1/twins.json is read-only: it accepts GET, HEAD and OPTIONS.",
                        "hint": "Retry the same URL with GET.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "More than 300 requests per 60 seconds from one client. Wait the Retry-After delay.",
            "headers": {
              "X-API-Version": {
                "$ref": "#/components/headers/XApiVersion"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "ETag": {
                "$ref": "#/components/headers/ETag"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "default": {
                    "value": {
                      "type": "https://texuli.com/developers/#errors",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "Too many requests to /api/v1/twins.json. The limit is in the RateLimit-Policy header.",
                      "instance": "/api/v1/twins.json",
                      "error": {
                        "code": "rate_limited",
                        "message": "Too many requests to /api/v1/twins.json. The limit is in the RateLimit-Policy header.",
                        "hint": "Wait the number of seconds in the Retry-After header, then retry; see https://texuli.com/developers/#limits.",
                        "documentation_url": "https://texuli.com/developers/"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/md-manifest.json": {
      "get": {
        "operationId": "getTwinsManifest",
        "tags": [
          "twins"
        ],
        "summary": "Markdown twins manifest",
        "description": "Every page route mapped to its Markdown twin (the page URL plus .md). A file the site's own pages fetch; it follows the site and may change in any release. The same bytes are served as /api/v1/twins.json, which is versioned.",
        "responses": {
          "200": {
            "description": "Markdown twins manifest",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TwinsManifest"
                },
                "examples": {
                  "default": {
                    "$ref": "#/components/examples/TwinsManifest"
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (the `If-None-Match` validator matched).",
            "headers": {
              "ETag": {
                "$ref": "#/components/headers/ETag"
              }
            }
          },
          "404": {
            "description": "No file at this path. Agent clients and JSON clients get problem details; browsers get the HTML 404 page.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteProblem"
                }
              }
            }
          }
        }
      }
    },
    "/mcp": {
      "post": {
        "operationId": "callMcp",
        "tags": [
          "mcp"
        ],
        "summary": "Call the remote MCP server (JSON-RPC)",
        "description": "The read-only Texuli MCP server over stateless Streamable HTTP, protocol 2025-11-25 (also 2025-06-18, 2025-03-26, 2024-11-05). POST one JSON-RPC message or a batch; responses are JSON (no SSE stream, no session). A notification gets 202 with no body. Tools (`tools/call` names): catalog.search, catalog.validate, component.get, example.search, blueprint.validate, blueprint.theme, block.list, block.schema, theme.search, theme.get, theme.preview, ds.validate, ds.compile, ds.contrast, ds.suggest, ds.import, ds.generate, ds.allow, ds.bundle, ds.diff, ds.preview, deck.run, document.run, md.convert, md.render, site.pages, site.read, site.search. Their argument and result schemas are the McpTool_* components and `x-mcp-tools` below. Limits: 60 messages per client per 60 seconds (each message of a batch counts), batches of at most 10, bodies of at most 262144 bytes. Browsers may call it only from texuli.com; a server-side agent sends no Origin header and is allowed.",
        "externalDocs": {
          "description": "The MCP server: tools, resources, prompts",
          "url": "https://github.com/DailybotHQ/texuli/blob/main/packages/tools/docs/mcp.md"
        },
        "parameters": [
          {
            "name": "MCP-Protocol-Version",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "2025-11-25",
                "2025-06-18",
                "2025-03-26",
                "2024-11-05"
              ]
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/JsonRpcRequest"
                  },
                  {
                    "$ref": "#/components/schemas/JsonRpcBatch"
                  }
                ]
              },
              "examples": {
                "initialize": {
                  "value": {
                    "jsonrpc": "2.0",
                    "id": 1,
                    "method": "initialize",
                    "params": {
                      "protocolVersion": "2025-11-25",
                      "capabilities": {},
                      "clientInfo": {
                        "name": "example-agent",
                        "version": "1.0.0"
                      }
                    }
                  }
                },
                "toolsList": {
                  "value": {
                    "jsonrpc": "2.0",
                    "id": 2,
                    "method": "tools/list"
                  }
                },
                "toolsCall": {
                  "value": {
                    "jsonrpc": "2.0",
                    "id": 3,
                    "method": "tools/call",
                    "params": {
                      "name": "catalog.search",
                      "arguments": {}
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The JSON-RPC response (an array for a batch).",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/JsonRpcResponse"
                    },
                    {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/JsonRpcResponse"
                      }
                    }
                  ]
                },
                "examples": {
                  "toolsList": {
                    "value": {
                      "jsonrpc": "2.0",
                      "id": 2,
                      "result": {
                        "tools": [
                          {
                            "name": "catalog.search",
                            "title": "Search the component catalog",
                            "description": "Search the built, content-addressed Texuli component catalog by text, group and emit tier. Returns the catalog hash and file name, the match count and one summary per component (id, package, label, summary, tier, group, emit tiers)."
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "202": {
            "description": "Only notifications or client responses were sent.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            }
          },
          "400": {
            "description": "Parse error, an invalid request or batch, or an unsupported MCP-Protocol-Version (a JSON-RPC error with id null).",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonRpcResponse"
                }
              }
            }
          },
          "403": {
            "description": "The Host or the browser Origin is not allowed.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/McpProblem"
                }
              }
            }
          },
          "405": {
            "description": "Any method but POST and OPTIONS.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/McpProblem"
                }
              }
            }
          },
          "406": {
            "description": "The Accept header does not allow application/json.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/McpProblem"
                }
              }
            }
          },
          "413": {
            "description": "The body is over 262144 bytes.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/McpProblem"
                }
              }
            }
          },
          "415": {
            "description": "The Content-Type is not application/json.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/McpProblem"
                }
              }
            }
          },
          "429": {
            "description": "Over the rate limit; wait the Retry-After delay.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/McpProblem"
                }
              }
            }
          }
        },
        "x-mcp-server-card": "https://texuli.com/.well-known/mcp/server-card.json",
        "x-mcp-tools": [
          {
            "name": "catalog.search",
            "title": "Search the component catalog",
            "summary": "Search the built, content-addressed Texuli component catalog by text, group and emit tier. Returns the catalog hash and file name, the match count and one summary per component (id, package, label, summary, tier, group, emit tiers).",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_catalog_search_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_catalog_search_Output"
            }
          },
          {
            "name": "catalog.validate",
            "title": "Validate catalog manifests",
            "summary": "Validate one candidate catalog manifest, or a set (which also catches duplicate ids), without writing files. Returns valid and a list of diagnostics, each with a code, a JSONPath, a message and a hint.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_catalog_validate_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_catalog_validate_Output"
            }
          },
          {
            "name": "component.get",
            "title": "Read a component manifest",
            "summary": "Read one component manifest from the catalog by id. Returns { component }: its props with kinds and schemas, events, worked examples, useWhen and dontUseWhen guidance, accessibility notes and the emit tiers that may place it (an empty emit list means agent output may not).",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_component_get_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_component_get_Output"
            }
          },
          {
            "name": "example.search",
            "title": "Find component examples",
            "summary": "Find worked manifest examples (props an agent can copy) by component id and/or example id, or search their titles and descriptions. Returns the match count and each example with its component id and package.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_example_search_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_example_search_Output"
            }
          },
          {
            "name": "blueprint.validate",
            "title": "Validate a blueprint draft",
            "summary": "Validate a blueprint draft (a catalog tree, an array of trees, or a texuli-blueprint envelope, migrated first) with the catalog's checks: structure, sinks, tree limits, component ids, tiers, prop, block and document schemas, the envelope's designSystem (codes under $.designSystem), grammar and the frame root. Returns valid, status, tier, migratedFrom and diagnostics with stable codes.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_blueprint_validate_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_blueprint_validate_Output"
            }
          },
          {
            "name": "blueprint.theme",
            "title": "Apply a design system to a blueprint",
            "summary": "Set a blueprint envelope's designSystem to a reference ({ ref: \"acme@2.1.0\" } or a library theme \"texuli:ocean\") or an inline document, wrapping a bare tree in a draft envelope first, then validate the result as blueprint.validate does; an inline document is also compiled for the contrast, focus and target guarantees. Returns valid, the themed blueprint and diagnostics with stable codes.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_blueprint_theme_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_blueprint_theme_Output"
            }
          },
          {
            "name": "block.list",
            "title": "List block types",
            "summary": "List the content block types the blocks-* components render (table, stat, cta, poll …), optionally for one component or matching words. Returns the match count and, per type, the component that renders it, a label and when to use it; read one shape with block.schema.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_block_list_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_block_list_Output"
            }
          },
          {
            "name": "block.schema",
            "title": "Read a block shape",
            "summary": "Read the shape of one content block type: the component that renders it, its fields as compact text and as a JSON Schema (required fields are the ones the validator refuses a block without), examples that validate in a blueprint, limits, when to use it and whether it can pass blueprint.validate today. Returns what a blocks-* node’s block prop needs.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_block_schema_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_block_schema_Output"
            }
          },
          {
            "name": "theme.search",
            "title": "Search the theme library",
            "summary": "Search the Texuli theme library (200+ offline themes) by words, category, collection, mood or tag. Returns the match count and each theme’s metadata: id, name, description, category, collection, mood, tags, contrast level and whether it is dark-first.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_theme_search_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_theme_search_Output"
            }
          },
          {
            "name": "theme.get",
            "title": "Read a full theme",
            "summary": "Read the full token definition of one library theme by id. Returns { theme }: its id, name, description and every light and dark color, radius, font and chart token, ready to compile or apply.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_theme_get_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_theme_get_Output"
            }
          },
          {
            "name": "theme.preview",
            "title": "Preview a theme",
            "summary": "Preview one library theme in light or dark mode. Returns its summary, the key tokens of that mode (background, foreground, primary, border, radius, font …) and the WCAG 2.x AA contrast report for both modes (aa.pass and issue counts).",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_theme_preview_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_theme_preview_Output"
            }
          },
          {
            "name": "ds.validate",
            "title": "Validate a design system",
            "summary": "Validate a design-system document. Set full to run the complete locked-design-system validator, including catalog allow sets, extensions and an optional prototype's component and CSS policy checks. Returns every finding with stable code, severity, area, path and fix hint; the full mode is read-only and does not execute prototype sources.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_validate_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_validate_Output"
            }
          },
          {
            "name": "ds.compile",
            "title": "Compile a design system",
            "summary": "Compile a design-system document to concrete --tx-* variables per mode and emit one format: compiled JSON, scoped CSS, a Tailwind preset, DTCG or Tokens Studio. Returns valid, the format, its media type, the content as text, the hash and warnings; a refused document returns errors with stable codes instead.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_compile_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_compile_Output"
            }
          },
          {
            "name": "ds.contrast",
            "title": "Report design-system contrast",
            "summary": "Compile a design-system document and report every contrast pair the guarantees check, per mode: foreground and background roles, kind (text, ui, focus), ratio, requirement and pass, plus the solver adjustments. Returns valid, the target (AA or AAA), targetMin and the per-mode pairs, or errors with stable codes.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_contrast_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_contrast_Output"
            }
          },
          {
            "name": "ds.suggest",
            "title": "Suggest a design system",
            "summary": "Suggest a starting design-system document from one seed color, up to three brand colors (seed, secondary, accent) or a logo as RGBA pixels (the dominant colors pick the seed). Returns valid, the document, the dominant palette for pixels, the key tokens of each mode and warnings.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_suggest_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_suggest_Output"
            }
          },
          {
            "name": "ds.import",
            "title": "Import a design system",
            "summary": "Turn what a team already has into a valid design-system document: a brand one-liner (\"brand #4f46e5, font Inter, rounded, compact\"), a W3C DTCG file, a Tokens Studio file, a flat role palette or a Texuli theme (an object, or a library theme id). Returns valid, the document and warnings for every value it dropped, or errors with stable codes.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_import_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_import_Output"
            }
          },
          {
            "name": "ds.generate",
            "title": "Generate a design-system draft",
            "summary": "Combine a brand brief, token JSON, site CSS, logo pixels and/or a Texuli theme into a validated design-system draft. Returns the document, every reported loss, automatic AA repairs and guarantee results; it never saves or approves the draft.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_generate_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_generate_Output"
            }
          },
          {
            "name": "ds.allow",
            "title": "List allowed components for a locked design system",
            "summary": "Build the allow section of a locked design system from the catalog: a preset (minimal, a documented core; all, every component) or the ids you name, each with every variant, size, tone, density, color and state the catalog declares. Narrow it, put it under \"allow\" and run ds.validate. Returns allow, count, unknown ids and the minimal preset ids.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_allow_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_allow_Output"
            }
          },
          {
            "name": "ds.bundle",
            "title": "Pack or unpack a portable design-system bundle",
            "summary": "Pack a design-system document with its library sources and release history into one JSON bundle, or unpack a bundle and return those parts. Returns ok, the bundle or the document, allowManifest, librarySources and history; hash mismatches, oversized sources and path-traversing ids are refused with stable codes. Sources are never executed.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_bundle_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_bundle_Output"
            }
          },
          {
            "name": "ds.diff",
            "title": "Diff two design systems",
            "summary": "Compile two design-system documents (before is the baseline) and compare them: every added, removed or changed --tx-* variable per mode, contrast pairs that regressed below the target, changed component defaults and attributes. Returns valid, identical, the summary counts and each list, or errors tagged with their side.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_diff_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_diff_Output"
            }
          },
          {
            "name": "ds.preview",
            "title": "Preview a design system",
            "summary": "Render a static, deterministic snapshot of a compiled design system: svg (swatches, a button and a card per mode) or html (the review report: swatches, type ramp, component sheet, contrast table and adjustments). Fixed fonts, no time, no scripts; every value escaped. Returns valid, the format, media type, content and hash.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_preview_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_ds_preview_Output"
            }
          },
          {
            "name": "deck.run",
            "title": "Run a deck command",
            "summary": "Inspect, lint and convert a Texuli deck on the shared v2 model: capabilities, the JSON Schema, layouts, lint, inspect, from-markdown and to-markdown. Pure compute; returns { result } with the command output (ok, issues, deck, markdown …).",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_deck_run_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_deck_run_Output"
            }
          },
          {
            "name": "document.run",
            "title": "Run a document command",
            "summary": "Create, validate, inspect, patch and convert a Texuli document (spec 0.7.0): capabilities, the JSON Schema, validate, inspect, a bounded RFC 6902 patch (at most 1000 operations), from-markdown, to-markdown and to-blueprint. Returns { result } with the command output; PDF and DOCX are document.export.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_document_run_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_document_run_Output"
            }
          },
          {
            "name": "md.convert",
            "title": "Convert Markdown, HTML or a chat dialect",
            "summary": "Convert untrusted Markdown, HTML or a chat dialect (Slack, Discord, WhatsApp, Telegram MarkdownV2 and HTML, Teams, Google Chat, Mattermost, plain text) through the texuli-md/v1 AST. URLs use the untrusted policy. Returns { value, diagnostics }.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_md_convert_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_md_convert_Output"
            }
          },
          {
            "name": "md.render",
            "title": "Render Markdown to safe HTML",
            "summary": "Parse untrusted Markdown (GFM by default; gfm: false for strict CommonMark 0.31.2) and write a safe HTML fragment through the markup allowlist. Every href and src uses the untrusted URL policy; raw HTML is dropped. Returns { html, diagnostics }.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_md_render_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_md_render_Output"
            }
          },
          {
            "name": "site.pages",
            "title": "List texuli.com pages",
            "summary": "List the pages of texuli.com from its Markdown twin manifest, in path order, optionally under a path prefix, a page at a time. Returns the total, the offset, the next offset when more follow, and each page’s path, twin path, URL, title and description.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_site_pages_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_site_pages_Output"
            }
          },
          {
            "name": "site.read",
            "title": "Read a texuli.com page as Markdown",
            "summary": "Read one texuli.com page as its Markdown twin: the page’s own content with a header block (title, description, canonical URL, last updated). Accepts a route, its .md twin path or a texuli.com URL. Returns the path, twin, URL, title, the Markdown, its size and whether it was cut at the size cap.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_site_read_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_site_read_Output"
            }
          },
          {
            "name": "site.search",
            "title": "Search texuli.com pages",
            "summary": "Search texuli.com pages by words in their titles, headings, descriptions and paths, ranked deterministically (more matched words first, then title over path over heading over description). Returns the total and, per hit, the path, twin, URL, title, description, score and up to three matching headings.",
            "inputSchema": {
              "$ref": "#/components/schemas/McpTool_site_search_Input"
            },
            "outputSchema": {
              "$ref": "#/components/schemas/McpTool_site_search_Output"
            }
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details, plus an `error` object with a stable code, a message, a recovery hint and the documentation URL.",
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "instance",
          "error"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer",
            "minimum": 400,
            "maximum": 599
          },
          "detail": {
            "type": "string"
          },
          "instance": {
            "type": "string"
          },
          "error": {
            "$ref": "#/components/schemas/ProblemError"
          }
        }
      },
      "ProblemError": {
        "type": "object",
        "required": [
          "code",
          "message",
          "hint",
          "documentation_url"
        ],
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "resource_not_found",
              "method_not_allowed",
              "rate_limited",
              "internal_error"
            ]
          },
          "message": {
            "type": "string"
          },
          "hint": {
            "type": "string"
          },
          "documentation_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "SiteProblem": {
        "type": "object",
        "description": "The 404 an agent or JSON client gets for a missed site file (RFC 9457, `type: about:blank`, with the llms.txt guide).",
        "required": [
          "type",
          "title",
          "status",
          "instance"
        ],
        "properties": {
          "type": {
            "type": "string",
            "const": "about:blank"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer",
            "const": 404
          },
          "instance": {
            "type": "string"
          },
          "guide": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "McpProblem": {
        "type": "object",
        "description": "An HTTP-level refusal of the MCP endpoint (RFC 9457, `type: about:blank`).",
        "required": [
          "type",
          "title",
          "status"
        ],
        "properties": {
          "type": {
            "type": "string",
            "const": "about:blank"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "serverCard": {
            "type": "string"
          }
        }
      },
      "ApiIndex": {
        "type": "object",
        "required": [
          "name",
          "version",
          "status",
          "documentation",
          "openapi",
          "endpoints"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "in-development",
              "released"
            ]
          },
          "statusNote": {
            "type": "string"
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "health": {
            "type": "string",
            "format": "uri"
          },
          "authentication": {
            "type": "string",
            "const": "none"
          },
          "rateLimit": {
            "type": "object",
            "properties": {
              "policy": {
                "type": "string"
              },
              "quota": {
                "type": "integer"
              },
              "windowSeconds": {
                "type": "integer"
              },
              "scope": {
                "type": "string"
              }
            }
          },
          "versioning": {
            "type": "object"
          },
          "license": {
            "type": "string"
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "operationId",
                "method",
                "path",
                "url",
                "title",
                "summary"
              ],
              "properties": {
                "operationId": {
                  "type": "string"
                },
                "method": {
                  "type": "string",
                  "enum": [
                    "GET",
                    "POST"
                  ]
                },
                "path": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "title": {
                  "type": "string"
                },
                "summary": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "Health": {
        "type": "object",
        "required": [
          "status",
          "service",
          "version",
          "release",
          "builtAt",
          "endpoints"
        ],
        "properties": {
          "status": {
            "type": "string",
            "const": "ok"
          },
          "service": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "release": {
            "type": "string",
            "enum": [
              "in-development",
              "released"
            ]
          },
          "builtAt": {
            "type": "string",
            "format": "date-time"
          },
          "endpoints": {
            "type": "integer",
            "minimum": 0
          },
          "note": {
            "type": "string"
          }
        }
      },
      "Catalog": {
        "type": "object",
        "description": "The catalog snapshot `@texuli/catalog` validates against.",
        "required": [
          "format",
          "version",
          "groups",
          "tiers",
          "entries"
        ],
        "properties": {
          "format": {
            "type": "string"
          },
          "version": {
            "type": "integer"
          },
          "groups": {
            "type": "object",
            "additionalProperties": true
          },
          "tiers": {
            "type": "object",
            "additionalProperties": true
          },
          "entries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CatalogEntry"
            }
          }
        }
      },
      "CatalogEntry": {
        "type": "object",
        "required": [
          "id",
          "label",
          "package",
          "summary",
          "group",
          "tier",
          "emit",
          "props"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "package": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "group": {
            "type": "string"
          },
          "tier": {
            "type": "string"
          },
          "emit": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "developer",
                "untrusted"
              ]
            }
          },
          "agentEmittable": {
            "type": "boolean"
          },
          "props": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "events": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "examples": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "useWhen": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "dontUseWhen": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "related": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": true
      },
      "ThemeSwatches": {
        "type": "object",
        "required": [
          "background",
          "foreground",
          "primary",
          "accent",
          "surface"
        ],
        "properties": {
          "background": {
            "type": "string",
            "description": "A CSS color, usually #rrggbb."
          },
          "foreground": {
            "type": "string",
            "description": "A CSS color, usually #rrggbb."
          },
          "primary": {
            "type": "string",
            "description": "A CSS color, usually #rrggbb."
          },
          "accent": {
            "type": "string",
            "description": "A CSS color, usually #rrggbb."
          },
          "surface": {
            "type": "string",
            "description": "A CSS color, usually #rrggbb."
          }
        },
        "additionalProperties": {
          "type": "string",
          "description": "A CSS color, usually #rrggbb."
        }
      },
      "ThemeCatalogEntry": {
        "type": "object",
        "required": [
          "id",
          "name",
          "description",
          "category",
          "collection",
          "tags",
          "swatches"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "collection": {
            "type": "string"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "swatches": {
            "$ref": "#/components/schemas/ThemeSwatches"
          }
        },
        "additionalProperties": true
      },
      "ThemeCatalog": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/ThemeCatalogEntry"
        }
      },
      "ThemeDarkSwatches": {
        "type": "object",
        "required": [
          "id",
          "swatches"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "swatches": {
            "$ref": "#/components/schemas/ThemeSwatches"
          }
        }
      },
      "ThemeDarkSwatchList": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/ThemeDarkSwatches"
        }
      },
      "ThemeGalleryCard": {
        "type": "object",
        "required": [
          "id",
          "name",
          "category",
          "contrastLevel",
          "pass",
          "issueCount",
          "swatches"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "collection": {
            "type": "string"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "darkFirst": {
            "type": "boolean"
          },
          "contrastLevel": {
            "type": "string"
          },
          "pass": {
            "type": "boolean",
            "description": "WCAG 2.x AA passes in light and dark."
          },
          "issueCount": {
            "type": "integer",
            "minimum": 0
          },
          "scores": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "swatches": {
            "type": "object",
            "description": "Key colors per preview mode.",
            "additionalProperties": {
              "type": "object",
              "required": [
                "background",
                "foreground",
                "primary",
                "primaryForeground",
                "accent",
                "muted",
                "border"
              ],
              "properties": {
                "background": {
                  "type": "string",
                  "description": "A CSS color, usually #rrggbb."
                },
                "foreground": {
                  "type": "string",
                  "description": "A CSS color, usually #rrggbb."
                },
                "primary": {
                  "type": "string",
                  "description": "A CSS color, usually #rrggbb."
                },
                "primaryForeground": {
                  "type": "string",
                  "description": "A CSS color, usually #rrggbb."
                },
                "accent": {
                  "type": "string",
                  "description": "A CSS color, usually #rrggbb."
                },
                "muted": {
                  "type": "string",
                  "description": "A CSS color, usually #rrggbb."
                },
                "border": {
                  "type": "string",
                  "description": "A CSS color, usually #rrggbb."
                }
              },
              "additionalProperties": {
                "type": "string",
                "description": "A CSS color, usually #rrggbb."
              }
            }
          }
        },
        "additionalProperties": true
      },
      "ThemeGalleryCardList": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/ThemeGalleryCard"
        }
      },
      "ThemeData": {
        "type": "object",
        "description": "The color explorer's payload for one theme.",
        "required": [
          "id",
          "name"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "contrastLevel": {
            "type": "string"
          }
        },
        "additionalProperties": true
      },
      "TwinsManifest": {
        "type": "object",
        "required": [
          "twins"
        ],
        "properties": {
          "twins": {
            "type": "object",
            "description": "Page route → Markdown twin path.",
            "additionalProperties": {
              "type": "string",
              "pattern": "^/.*\\.md$"
            }
          }
        }
      },
      "JsonRpcRequest": {
        "type": "object",
        "description": "One JSON-RPC 2.0 message: a request (with `id`) or a notification.",
        "required": [
          "jsonrpc",
          "method"
        ],
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "type": [
              "string",
              "integer"
            ]
          },
          "method": {
            "type": "string",
            "examples": [
              "initialize",
              "tools/list",
              "tools/call",
              "resources/read"
            ]
          },
          "params": {
            "type": "object",
            "additionalProperties": true
          }
        }
      },
      "JsonRpcBatch": {
        "type": "array",
        "minItems": 1,
        "maxItems": 10,
        "items": {
          "$ref": "#/components/schemas/JsonRpcRequest"
        }
      },
      "ToolsCallParams": {
        "type": "object",
        "description": "The `params` of `tools/call`: an operation name and its arguments (the McpTool_*_Input schemas).",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "enum": [
              "catalog.search",
              "catalog.validate",
              "component.get",
              "example.search",
              "blueprint.validate",
              "blueprint.theme",
              "block.list",
              "block.schema",
              "theme.search",
              "theme.get",
              "theme.preview",
              "ds.validate",
              "ds.compile",
              "ds.contrast",
              "ds.suggest",
              "ds.import",
              "ds.generate",
              "ds.allow",
              "ds.bundle",
              "ds.diff",
              "ds.preview",
              "deck.run",
              "document.run",
              "md.convert",
              "md.render",
              "site.pages",
              "site.read",
              "site.search"
            ]
          },
          "arguments": {
            "type": "object",
            "additionalProperties": true
          }
        }
      },
      "JsonRpcError": {
        "type": "object",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "integer"
          },
          "message": {
            "type": "string"
          },
          "data": {}
        }
      },
      "JsonRpcResponse": {
        "type": "object",
        "required": [
          "jsonrpc",
          "id"
        ],
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "type": [
              "string",
              "integer",
              "null"
            ]
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "error": {
            "$ref": "#/components/schemas/JsonRpcError"
          }
        }
      },
      "McpTool_catalog_search_Input": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 200,
            "description": "Text to match against component ids, labels and summaries."
          },
          "group": {
            "type": "string",
            "maxLength": 64,
            "description": "An exact manifest group id, e.g. \"display\" or \"forms\"."
          },
          "tier": {
            "type": "string",
            "enum": [
              "developer",
              "untrusted"
            ],
            "description": "Keep only components this emit tier may place: untrusted is what agent output may use; developer is app-authored code."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 50,
            "description": "How many results to return (1 to 100, default 50)."
          }
        },
        "additionalProperties": false
      },
      "McpTool_catalog_search_Output": {
        "type": "object",
        "properties": {
          "hash": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          },
          "fileName": {
            "type": "string"
          },
          "total": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer"
          },
          "entries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "package": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "summary": {
                  "type": "string"
                },
                "tier": {
                  "type": "string"
                },
                "group": {
                  "type": "string"
                },
                "emit": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "id",
                "package",
                "label",
                "summary",
                "tier",
                "group",
                "emit"
              ]
            }
          }
        },
        "required": [
          "hash",
          "fileName",
          "total",
          "entries",
          "limit"
        ]
      },
      "McpTool_catalog_validate_Input": {
        "type": "object",
        "properties": {
          "manifest": {
            "type": "object",
            "description": "A candidate catalog manifest (id, package, label, summary, tier, props, examples …)."
          },
          "manifests": {
            "type": "array",
            "maxItems": 500,
            "items": {
              "type": "object",
              "description": "A candidate catalog manifest (id, package, label, summary, tier, props, examples …)."
            },
            "description": "A candidate manifest set (at most 500)."
          }
        },
        "additionalProperties": false,
        "$comment": "Exactly one of manifest or manifests."
      },
      "McpTool_catalog_validate_Output": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "diagnostics": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "jsonPath": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "code",
                "jsonPath",
                "message"
              ]
            }
          }
        },
        "required": [
          "valid",
          "diagnostics"
        ]
      },
      "McpTool_component_get_Input": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "pattern": "^[a-z0-9][a-z0-9-]*$",
            "description": "A catalog component id, e.g. \"card\" (find ids with catalog.search)."
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "McpTool_component_get_Output": {
        "type": "object",
        "properties": {
          "component": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "package": {
                "type": "string"
              },
              "group": {
                "type": "string"
              },
              "emit": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "props": {
                "type": "array"
              },
              "examples": {
                "type": "array"
              }
            },
            "required": [
              "id",
              "package",
              "group",
              "emit",
              "props",
              "examples"
            ]
          }
        },
        "required": [
          "component"
        ]
      },
      "McpTool_example_search_Input": {
        "type": "object",
        "properties": {
          "componentId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "pattern": "^[a-z0-9][a-z0-9-]*$",
            "description": "A catalog component id, e.g. \"card\" (find ids with catalog.search)."
          },
          "exampleId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128,
            "description": "An exact example id within the component, e.g. \"basic\"."
          },
          "query": {
            "type": "string",
            "maxLength": 200,
            "description": "Text to match against example ids, titles and descriptions."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 50,
            "description": "How many results to return (1 to 100, default 50)."
          }
        },
        "additionalProperties": false
      },
      "McpTool_example_search_Output": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer"
          },
          "examples": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "componentId": {
                  "type": "string"
                },
                "package": {
                  "type": "string"
                },
                "example": {
                  "type": "object"
                }
              },
              "required": [
                "componentId",
                "package",
                "example"
              ]
            }
          }
        },
        "required": [
          "total",
          "examples",
          "limit"
        ]
      },
      "McpTool_blueprint_validate_Input": {
        "type": "object",
        "properties": {
          "draft": {
            "type": [
              "object",
              "array"
            ],
            "maxItems": 512,
            "description": "The blueprint: a catalog tree { id, props, children }, an array of trees, or a texuli-blueprint envelope (format, version, id, catalog hash from catalog.search, status, createdAt, updatedAt, generator, tree). At most 512 nodes. schema-form, canvas and spreadsheet nodes and data-source bindings are refused: this server has no validator for them."
          },
          "tier": {
            "type": "string",
            "enum": [
              "untrusted",
              "developer"
            ],
            "default": "untrusted",
            "description": "The tier to validate at: untrusted (agent output, the default) or developer (app-authored). A tier the draft declares is ignored."
          },
          "fragment": {
            "type": "boolean",
            "default": false,
            "description": "Accept any roots (a fragment). Default false: one frame root (layout-page, layout-doc, layout-deck, document, canvas or data-dashboard)."
          }
        },
        "required": [
          "draft"
        ],
        "additionalProperties": false
      },
      "McpTool_blueprint_validate_Output": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "status": {
            "type": "string",
            "enum": [
              "valid",
              "invalid",
              "parse",
              "over-limits"
            ]
          },
          "tier": {
            "type": "string",
            "enum": [
              "untrusted",
              "developer"
            ]
          },
          "migratedFrom": {
            "type": "string"
          },
          "diagnostics": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "check": {
                  "type": "string"
                },
                "code": {
                  "type": "string"
                },
                "severity": {
                  "type": "string",
                  "enum": [
                    "error",
                    "warning"
                  ]
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "id": {
                  "type": "string"
                }
              },
              "required": [
                "check",
                "code",
                "severity",
                "path",
                "message"
              ]
            }
          }
        },
        "required": [
          "valid",
          "status",
          "tier",
          "diagnostics"
        ]
      },
      "McpTool_blueprint_theme_Input": {
        "type": "object",
        "properties": {
          "blueprint": {
            "type": [
              "object",
              "array"
            ],
            "maxItems": 512,
            "description": "A texuli-blueprint envelope, or a catalog tree (or array of trees) to wrap in a draft envelope for the current catalog."
          },
          "designSystem": {
            "type": "object",
            "properties": {
              "ref": {
                "type": "string",
                "maxLength": 140,
                "pattern": "^(texuli:[a-z][a-z0-9]*(-[a-z0-9]+)*|[a-z][a-z0-9]*(-[a-z0-9]+)*@(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*))$",
                "description": "An exact id@x.y.z the host resolves, or texuli:<theme> for a library theme; never a range, URL or path."
              },
              "inline": {
                "type": "object",
                "description": "A whole design-system document carried in the blueprint."
              }
            },
            "additionalProperties": false,
            "description": "Exactly one of ref and inline."
          },
          "tier": {
            "type": "string",
            "enum": [
              "untrusted",
              "developer"
            ],
            "default": "untrusted",
            "description": "The tier to validate at: untrusted (agent output, the default; refuses data: URLs in an inline document) or developer."
          },
          "id": {
            "type": "string",
            "maxLength": 128,
            "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$",
            "description": "A wrapped tree only: the envelope id (default \"draft\")."
          }
        },
        "required": [
          "blueprint",
          "designSystem"
        ],
        "additionalProperties": false
      },
      "McpTool_blueprint_theme_Output": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "status": {
            "type": "string",
            "enum": [
              "valid",
              "invalid",
              "parse",
              "over-limits"
            ]
          },
          "tier": {
            "type": "string",
            "enum": [
              "untrusted",
              "developer"
            ]
          },
          "blueprint": {
            "type": "object"
          },
          "diagnostics": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "check": {
                  "type": "string"
                },
                "code": {
                  "type": "string"
                },
                "severity": {
                  "type": "string",
                  "enum": [
                    "error",
                    "warning"
                  ]
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "id": {
                  "type": "string"
                }
              },
              "required": [
                "check",
                "code",
                "severity",
                "path",
                "message"
              ]
            }
          }
        },
        "required": [
          "valid",
          "status",
          "tier",
          "blueprint",
          "diagnostics"
        ]
      },
      "McpTool_block_list_Input": {
        "type": "object",
        "properties": {
          "component": {
            "type": "string",
            "enum": [
              "blocks-text",
              "blocks-data",
              "blocks-media",
              "blocks-diagram",
              "blocks-embed",
              "blocks-structure",
              "blocks-code",
              "blocks-interactive",
              "blocks-map"
            ],
            "description": "Only the types this blocks-* component renders, e.g. \"blocks-data\"."
          },
          "query": {
            "type": "string",
            "maxLength": 200,
            "description": "Words to match against the type, its label and its useWhen notes."
          }
        },
        "additionalProperties": false
      },
      "McpTool_block_list_Output": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "minimum": 0
          },
          "blocks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string"
                },
                "component": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "useWhen": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "type",
                "component",
                "label",
                "useWhen"
              ]
            }
          }
        },
        "required": [
          "total",
          "blocks"
        ]
      },
      "McpTool_block_schema_Input": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "heading",
              "text",
              "list",
              "quote",
              "callout",
              "table",
              "stat",
              "kpi",
              "chart",
              "image",
              "figure",
              "video",
              "gallery",
              "flow",
              "tree",
              "board",
              "terminal",
              "embed-app",
              "link-preview",
              "columns",
              "grid",
              "tabs",
              "accordion",
              "cards",
              "divider",
              "cta",
              "code",
              "poll",
              "quiz",
              "calculator",
              "checklist",
              "map"
            ],
            "description": "A block type from block.list, e.g. \"table\" or \"cta\"."
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false
      },
      "McpTool_block_schema_Output": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string"
          },
          "component": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "shape": {
            "type": "string"
          },
          "schema": {
            "type": "object"
          },
          "examples": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "useWhen": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "dontUseWhen": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "limits": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "a11y": {
            "type": "string"
          },
          "usableInBlueprint": {
            "type": "boolean"
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "source": {
            "type": "string",
            "enum": [
              "block-catalog",
              "tools-fixture"
            ]
          }
        },
        "required": [
          "type",
          "component",
          "label",
          "shape",
          "schema",
          "examples",
          "limits",
          "usableInBlueprint",
          "notes"
        ]
      },
      "McpTool_theme_search_Input": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 200,
            "description": "Words that must all match the id, name, tags, mood, category, collection or description; results are ranked."
          },
          "category": {
            "type": "string",
            "maxLength": 200,
            "description": "An exact category, e.g. \"Technology\"."
          },
          "collection": {
            "type": "string",
            "enum": [
              "industry",
              "brand-like",
              "high-contrast",
              "colorblind-safe",
              "seasonal",
              "mono"
            ],
            "description": "One theme collection."
          },
          "mood": {
            "type": "string",
            "enum": [
              "calm",
              "bold",
              "playful",
              "corporate",
              "editorial",
              "technical",
              "warm",
              "fresh",
              "luxurious",
              "minimal"
            ],
            "description": "One mood the theme must have."
          },
          "tag": {
            "type": "string",
            "maxLength": 200,
            "description": "An exact tag."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 500,
            "default": 50,
            "description": "How many themes to return (1 to 500, default 50)."
          }
        },
        "additionalProperties": false
      },
      "McpTool_theme_search_Output": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer"
          },
          "themes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "collection": {
                  "type": "string"
                },
                "contrastLevel": {
                  "type": "string"
                },
                "darkFirst": {
                  "type": "boolean"
                },
                "description": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "mood": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "tags": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "id",
                "name",
                "description",
                "category",
                "collection",
                "mood",
                "tags"
              ]
            }
          }
        },
        "required": [
          "total",
          "themes",
          "limit"
        ]
      },
      "McpTool_theme_get_Input": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "pattern": "^[a-z0-9][a-z0-9-]*$",
            "description": "A theme id from theme.search, e.g. \"violet\" or \"enterprise-neutral\"."
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "McpTool_theme_get_Output": {
        "type": "object",
        "properties": {
          "theme": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "light": {
                "type": "object"
              },
              "dark": {
                "type": "object"
              }
            },
            "required": [
              "id",
              "light",
              "dark"
            ]
          }
        },
        "required": [
          "theme"
        ]
      },
      "McpTool_theme_preview_Input": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64,
            "pattern": "^[a-z0-9][a-z0-9-]*$",
            "description": "A theme id from theme.search, e.g. \"violet\" or \"enterprise-neutral\"."
          },
          "mode": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ],
            "default": "light",
            "description": "The mode whose tokens to show (default light); the AA report covers both."
          }
        },
        "required": [
          "id"
        ],
        "additionalProperties": false
      },
      "McpTool_theme_preview_Output": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "collection": {
            "type": "string"
          },
          "contrastLevel": {
            "type": "string"
          },
          "darkFirst": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          },
          "mode": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ]
          },
          "tokens": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "aa": {
            "type": "object",
            "properties": {
              "pass": {
                "type": "boolean"
              },
              "issues": {
                "type": "integer",
                "minimum": 0
              },
              "modes": {
                "type": "array"
              }
            },
            "required": [
              "pass",
              "issues",
              "modes"
            ]
          }
        },
        "required": [
          "id",
          "name",
          "mode",
          "tokens",
          "aa"
        ]
      },
      "McpTool_ds_validate_Input": {
        "type": "object",
        "properties": {
          "document": {
            "type": "object",
            "description": "A design-system document: format \"texuli/design-system\", formatVersion 1, id, version, name, and optional sections (extends, color, typography, shape, space, elevation, surface, motion, layout, icons, components, assets, voice, accessibility, variants). texuli://design-system/acme is a full example."
          },
          "trust": {
            "type": "string",
            "enum": [
              "untrusted",
              "developer"
            ],
            "default": "untrusted",
            "description": "untrusted (agent or user documents, the default) refuses every data: URL; developer accepts capped data: fonts and images."
          },
          "variant": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
            "description": "A variant the document declares under variants (e.g. \"high-contrast\")."
          },
          "bases": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            },
            "description": "Documents for extends: \"id@x.y.z\", keyed by \"id@version\". \"texuli:<theme>\" bases load from the theme library; nothing is fetched."
          },
          "full": {
            "type": "boolean",
            "default": false,
            "description": "Run the full locked-design-system validator. Static only; use a local CLI --render for browser runtime checks."
          },
          "report": {
            "type": "boolean",
            "default": false,
            "description": "Mark this as report-only progress tracking. The operation always returns findings as data; valid still reflects the validator verdict."
          },
          "strict": {
            "type": "boolean",
            "default": false,
            "description": "In full mode, treat warnings as failures in the valid verdict."
          },
          "catalog": {
            "type": "object",
            "description": "Optional spec catalog object; defaults to the bundled Texuli catalog."
          },
          "extensions": {
            "type": "array",
            "maxItems": 16,
            "items": {
              "type": "object"
            },
            "description": "Optional host catalog extensions to check and merge."
          },
          "prototype": {
            "type": "object",
            "description": "Optional bounded prototype data: { files: { path: sourceText }, blueprints: { name: blueprint } }. Sources are scanned as text and never executed."
          }
        },
        "required": [
          "document"
        ],
        "additionalProperties": false
      },
      "McpTool_ds_validate_Output": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "version": {
            "type": [
              "string",
              "number"
            ]
          },
          "name": {
            "type": "string"
          },
          "hash": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          },
          "codes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "hint": {
                  "type": "string"
                },
                "source": {
                  "type": "string"
                },
                "variant": {
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                },
                "pairs": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              },
              "required": [
                "code",
                "path",
                "message"
              ]
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              },
              "required": [
                "path",
                "message"
              ]
            }
          },
          "variants": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "ok": {
            "type": "boolean"
          },
          "document": {
            "type": "object"
          },
          "summary": {
            "type": "object",
            "additionalProperties": true
          },
          "findings": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "check": {
            "type": "object",
            "additionalProperties": true
          },
          "prototype": {
            "type": "object",
            "additionalProperties": true
          },
          "reportOnly": {
            "type": "boolean"
          }
        },
        "required": [
          "valid"
        ]
      },
      "McpTool_ds_compile_Input": {
        "type": "object",
        "properties": {
          "document": {
            "type": "object",
            "description": "A design-system document: format \"texuli/design-system\", formatVersion 1, id, version, name, and optional sections (extends, color, typography, shape, space, elevation, surface, motion, layout, icons, components, assets, voice, accessibility, variants). texuli://design-system/acme is a full example."
          },
          "format": {
            "type": "string",
            "enum": [
              "json",
              "css",
              "tailwind",
              "dtcg",
              "tokens-studio"
            ],
            "default": "json",
            "description": "json (the compiled design system, keys sorted), css (scoped custom properties, light and dark; a single compiled mode goes on the selector), tailwind (a preset), dtcg or tokens-studio (the resolved document as token files: extends merged and the variant applied, so the content matches the reported variant and hash)."
          },
          "selector": {
            "type": "string",
            "maxLength": 200,
            "description": "css only: the scope selector (default [data-tx-ds=\"<id>\"], or :root)."
          },
          "dark": {
            "type": "string",
            "enum": [
              "class",
              "attribute",
              "media"
            ],
            "description": "css only: dark mode through the .dark class (default), [data-tx-mode=\"dark\"] or prefers-color-scheme."
          },
          "mode": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ],
            "description": "Compile one mode only (default: every mode the document declares)."
          },
          "trust": {
            "type": "string",
            "enum": [
              "untrusted",
              "developer"
            ],
            "default": "untrusted",
            "description": "untrusted (agent or user documents, the default) refuses every data: URL; developer accepts capped data: fonts and images."
          },
          "variant": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
            "description": "A variant the document declares under variants (e.g. \"high-contrast\")."
          },
          "bases": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            },
            "description": "Documents for extends: \"id@x.y.z\", keyed by \"id@version\". \"texuli:<theme>\" bases load from the theme library; nothing is fetched."
          }
        },
        "required": [
          "document"
        ],
        "additionalProperties": false
      },
      "McpTool_ds_compile_Output": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "format": {
            "type": "string"
          },
          "mediaType": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "version": {
            "type": [
              "string",
              "number"
            ]
          },
          "name": {
            "type": "string"
          },
          "hash": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          },
          "variant": {
            "type": "string"
          },
          "bytes": {
            "type": "integer",
            "minimum": 0
          },
          "content": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "hint": {
                  "type": "string"
                },
                "source": {
                  "type": "string"
                },
                "variant": {
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                },
                "pairs": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              },
              "required": [
                "code",
                "path",
                "message"
              ]
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              },
              "required": [
                "path",
                "message"
              ]
            }
          }
        },
        "required": [
          "valid",
          "format",
          "errors",
          "warnings"
        ]
      },
      "McpTool_ds_contrast_Input": {
        "type": "object",
        "properties": {
          "document": {
            "type": "object",
            "description": "A design-system document: format \"texuli/design-system\", formatVersion 1, id, version, name, and optional sections (extends, color, typography, shape, space, elevation, surface, motion, layout, icons, components, assets, voice, accessibility, variants). texuli://design-system/acme is a full example."
          },
          "mode": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ],
            "description": "Compile one mode only (default: every mode the document declares)."
          },
          "trust": {
            "type": "string",
            "enum": [
              "untrusted",
              "developer"
            ],
            "default": "untrusted",
            "description": "untrusted (agent or user documents, the default) refuses every data: URL; developer accepts capped data: fonts and images."
          },
          "variant": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
            "description": "A variant the document declares under variants (e.g. \"high-contrast\")."
          },
          "bases": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            },
            "description": "Documents for extends: \"id@x.y.z\", keyed by \"id@version\". \"texuli:<theme>\" bases load from the theme library; nothing is fetched."
          }
        },
        "required": [
          "document"
        ],
        "additionalProperties": false
      },
      "McpTool_ds_contrast_Output": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "id": {
            "type": "string"
          },
          "version": {
            "type": [
              "string",
              "number"
            ]
          },
          "name": {
            "type": "string"
          },
          "hash": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          },
          "contrast": {
            "type": "string",
            "enum": [
              "AA",
              "AAA"
            ]
          },
          "targetMin": {
            "type": "number"
          },
          "modes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "mode": {
                  "type": "string"
                },
                "total": {
                  "type": "integer",
                  "minimum": 0
                },
                "failing": {
                  "type": "integer",
                  "minimum": 0
                },
                "pairs": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              },
              "required": [
                "mode",
                "total",
                "failing",
                "pairs"
              ]
            }
          },
          "adjustments": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "hint": {
                  "type": "string"
                },
                "source": {
                  "type": "string"
                },
                "variant": {
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                },
                "pairs": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              },
              "required": [
                "code",
                "path",
                "message"
              ]
            }
          }
        },
        "required": [
          "valid",
          "modes",
          "adjustments",
          "errors"
        ]
      },
      "McpTool_ds_suggest_Input": {
        "type": "object",
        "properties": {
          "seed": {
            "type": "string",
            "maxLength": 32,
            "pattern": "^(#[0-9a-fA-F]{3}|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{8}|oklch\\([0-9. %/]+\\))$",
            "description": "A color: #rgb, #rrggbb, #rrggbbaa or a numeric oklch(L C H)."
          },
          "colors": {
            "type": "array",
            "minItems": 1,
            "maxItems": 3,
            "items": {
              "type": "string",
              "maxLength": 32,
              "pattern": "^(#[0-9a-fA-F]{3}|#[0-9a-fA-F]{6}|#[0-9a-fA-F]{8}|oklch\\([0-9. %/]+\\))$",
              "description": "A color: #rgb, #rrggbb, #rrggbbaa or a numeric oklch(L C H)."
            },
            "description": "Up to 3 brand colors: the seed, then the secondary, then the accent."
          },
          "pixels": {
            "type": "array",
            "maxItems": 65536,
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 255
            },
            "description": "A logo as RGBA values 0 to 255, 4 per pixel, row by row (at most 65536 values, 128 × 128 pixels); transparent pixels are ignored."
          },
          "count": {
            "type": "integer",
            "minimum": 2,
            "maximum": 12,
            "default": 6,
            "description": "pixels only: how many dominant colors to report (2 to 12, default 6)."
          },
          "id": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
            "description": "The id of the resulting document (lowercase words joined by hyphens)."
          },
          "version": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$",
            "description": "The semver version of the resulting document (default 1.0.0)."
          },
          "name": {
            "type": "string",
            "maxLength": 80,
            "description": "The display name of the resulting document."
          },
          "trust": {
            "type": "string",
            "enum": [
              "untrusted",
              "developer"
            ],
            "default": "untrusted",
            "description": "untrusted (agent or user documents, the default) refuses every data: URL; developer accepts capped data: fonts and images."
          }
        },
        "additionalProperties": false
      },
      "McpTool_ds_suggest_Output": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "document": {
            "type": "object"
          },
          "palette": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "color": {
                  "type": "string"
                },
                "weight": {
                  "type": "number"
                }
              },
              "required": [
                "color",
                "weight"
              ]
            }
          },
          "roles": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            }
          },
          "hash": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "hint": {
                  "type": "string"
                },
                "source": {
                  "type": "string"
                },
                "variant": {
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                },
                "pairs": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              },
              "required": [
                "code",
                "path",
                "message"
              ]
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              },
              "required": [
                "path",
                "message"
              ]
            }
          }
        },
        "required": [
          "valid",
          "palette",
          "errors",
          "warnings"
        ]
      },
      "McpTool_ds_import_Input": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "enum": [
              "brand",
              "dtcg",
              "tokens-studio",
              "role-palette",
              "theme"
            ],
            "description": "The source format: brand (text), dtcg, tokens-studio, role-palette (objects or JSON text) or theme (a Theme object or a library theme id)."
          },
          "input": {
            "type": [
              "string",
              "object"
            ],
            "maxLength": 1048576,
            "description": "The source: the one-liner for brand, a library theme id or Theme for theme, else the token file as an object or JSON text."
          },
          "id": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
            "description": "The id of the resulting document (lowercase words joined by hyphens)."
          },
          "version": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$",
            "description": "The semver version of the resulting document (default 1.0.0)."
          },
          "name": {
            "type": "string",
            "maxLength": 80,
            "description": "The display name of the resulting document."
          },
          "trust": {
            "type": "string",
            "enum": [
              "untrusted",
              "developer"
            ],
            "default": "untrusted",
            "description": "untrusted (agent or user documents, the default) refuses every data: URL; developer accepts capped data: fonts and images."
          }
        },
        "required": [
          "from",
          "input"
        ],
        "additionalProperties": false
      },
      "McpTool_ds_import_Output": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "from": {
            "type": "string"
          },
          "document": {
            "type": "object"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "hint": {
                  "type": "string"
                },
                "source": {
                  "type": "string"
                },
                "variant": {
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                },
                "pairs": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              },
              "required": [
                "code",
                "path",
                "message"
              ]
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              },
              "required": [
                "path",
                "message"
              ]
            }
          }
        },
        "required": [
          "valid",
          "from",
          "errors",
          "warnings"
        ]
      },
      "McpTool_ds_generate_Input": {
        "type": "object",
        "properties": {
          "brief": {
            "type": "string",
            "maxLength": 32768,
            "description": "A short brand brief in plain language (at most 32768 characters)."
          },
          "tokens": {
            "type": [
              "string",
              "object"
            ],
            "maxLength": 262144,
            "description": "Token JSON or a JSON string of tokens (at most 262144 characters)."
          },
          "css": {
            "type": "string",
            "maxLength": 262144,
            "description": "Site CSS whose custom properties feed the draft (at most 262144 characters)."
          },
          "logoPixels": {
            "type": "object",
            "description": "A logo as RGBA pixels; at most 65536 numbers in data.",
            "properties": {
              "data": {
                "type": "array",
                "items": {
                  "type": "number"
                },
                "maxItems": 65536,
                "description": "RGBA samples packed as numbers, at most 65536 items."
              }
            },
            "required": [
              "data"
            ],
            "additionalProperties": false
          },
          "theme": {
            "type": [
              "string",
              "object"
            ],
            "maxLength": 262144,
            "description": "A Texuli theme id or theme JSON (at most 262144 characters)."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "McpTool_ds_generate_Output": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "document": {
            "type": "object",
            "additionalProperties": true
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              },
              "required": [
                "code",
                "path",
                "message"
              ],
              "additionalProperties": true
            }
          },
          "report": {
            "type": "object",
            "properties": {
              "losses": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": true
                }
              },
              "repairs": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": true
                }
              },
              "guarantees": {
                "type": "object",
                "additionalProperties": true
              }
            },
            "required": [
              "losses",
              "repairs",
              "guarantees"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "ok",
          "report"
        ],
        "additionalProperties": false
      },
      "McpTool_ds_allow_Input": {
        "type": "object",
        "properties": {
          "preset": {
            "type": "string",
            "enum": [
              "all",
              "minimal"
            ],
            "default": "minimal",
            "description": "minimal (a documented core: actions, form controls, text and status, containers, overlays and page layouts) or all (every catalog component). Ignored when components is set."
          },
          "components": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 48
            },
            "maxItems": 256,
            "description": "Catalog component ids to allow, e.g. [\"button\", \"card\", \"data-grid\"] (find ids with catalog.search)."
          }
        },
        "additionalProperties": false
      },
      "McpTool_ds_allow_Output": {
        "type": "object",
        "properties": {
          "allow": {
            "type": "object",
            "description": "Catalog id → { variants?, sizes?, tones?, densities?, colors?, states? }."
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "unknown": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "minimal": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "allow",
          "count",
          "unknown",
          "minimal"
        ]
      },
      "McpTool_ds_bundle_Input": {
        "type": "object",
        "properties": {
          "bundle": {
            "type": "object",
            "description": "A texuli/design-system-bundle object to unpack (format, version 1, document, allowManifest, librarySources, history)."
          },
          "document": {
            "type": "object",
            "description": "A texuli/design-system document to pack. Ignored when bundle is set."
          },
          "librarySources": {
            "type": "array",
            "maxItems": 64,
            "items": {
              "type": "object"
            },
            "description": "Library component sources as text: { id, version, source, language? }. Ignored when bundle is set."
          },
          "history": {
            "type": "array",
            "maxItems": 32,
            "items": {
              "type": "object"
            },
            "description": "Approved versions with changelog entries: { version, contentHash, changelog?, status?, approvedBy?, approvedAt? }. Ignored when bundle is set."
          }
        },
        "additionalProperties": false
      },
      "McpTool_ds_bundle_Output": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "bundle": {
            "type": "object"
          },
          "document": {
            "type": "object"
          },
          "allowManifest": {
            "type": "object"
          },
          "librarySources": {
            "type": "array"
          },
          "history": {
            "type": "array"
          },
          "errors": {
            "type": "array"
          }
        },
        "required": [
          "ok"
        ]
      },
      "McpTool_ds_diff_Input": {
        "type": "object",
        "properties": {
          "before": {
            "type": "object",
            "description": "The baseline design-system document."
          },
          "after": {
            "type": "object",
            "description": "The changed design-system document."
          },
          "mode": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ],
            "description": "Compile one mode only (default: every mode the document declares)."
          },
          "trust": {
            "type": "string",
            "enum": [
              "untrusted",
              "developer"
            ],
            "default": "untrusted",
            "description": "untrusted (agent or user documents, the default) refuses every data: URL; developer accepts capped data: fonts and images."
          },
          "variant": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
            "description": "A variant the document declares under variants (e.g. \"high-contrast\")."
          },
          "bases": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            },
            "description": "Documents for extends: \"id@x.y.z\", keyed by \"id@version\". \"texuli:<theme>\" bases load from the theme library; nothing is fetched."
          }
        },
        "required": [
          "before",
          "after"
        ],
        "additionalProperties": false
      },
      "McpTool_ds_diff_Output": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "before": {
            "type": "object"
          },
          "after": {
            "type": "object"
          },
          "identical": {
            "type": "boolean"
          },
          "summary": {
            "type": "object"
          },
          "tokens": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "contrast": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "defaults": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "attrs": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "hint": {
                  "type": "string"
                },
                "source": {
                  "type": "string"
                },
                "variant": {
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                },
                "pairs": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              },
              "required": [
                "code",
                "path",
                "message"
              ]
            }
          }
        },
        "required": [
          "valid",
          "errors"
        ]
      },
      "McpTool_ds_preview_Input": {
        "type": "object",
        "properties": {
          "document": {
            "type": "object",
            "description": "A design-system document: format \"texuli/design-system\", formatVersion 1, id, version, name, and optional sections (extends, color, typography, shape, space, elevation, surface, motion, layout, icons, components, assets, voice, accessibility, variants). texuli://design-system/acme is a full example."
          },
          "format": {
            "type": "string",
            "enum": [
              "svg",
              "html"
            ],
            "default": "svg",
            "description": "svg (a compact image, the default) or html (the full review report page)."
          },
          "title": {
            "type": "string",
            "maxLength": 120,
            "description": "html only: the page title."
          },
          "mode": {
            "type": "string",
            "enum": [
              "light",
              "dark"
            ],
            "description": "Compile one mode only (default: every mode the document declares)."
          },
          "trust": {
            "type": "string",
            "enum": [
              "untrusted",
              "developer"
            ],
            "default": "untrusted",
            "description": "untrusted (agent or user documents, the default) refuses every data: URL; developer accepts capped data: fonts and images."
          },
          "variant": {
            "type": "string",
            "maxLength": 64,
            "pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*$",
            "description": "A variant the document declares under variants (e.g. \"high-contrast\")."
          },
          "bases": {
            "type": "object",
            "additionalProperties": {
              "type": "object"
            },
            "description": "Documents for extends: \"id@x.y.z\", keyed by \"id@version\". \"texuli:<theme>\" bases load from the theme library; nothing is fetched."
          }
        },
        "required": [
          "document"
        ],
        "additionalProperties": false
      },
      "McpTool_ds_preview_Output": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "format": {
            "type": "string",
            "enum": [
              "svg",
              "html"
            ]
          },
          "mediaType": {
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "version": {
            "type": [
              "string",
              "number"
            ]
          },
          "name": {
            "type": "string"
          },
          "hash": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          },
          "bytes": {
            "type": "integer",
            "minimum": 0
          },
          "content": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                },
                "hint": {
                  "type": "string"
                },
                "source": {
                  "type": "string"
                },
                "variant": {
                  "type": "string"
                },
                "mode": {
                  "type": "string"
                },
                "pairs": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              },
              "required": [
                "code",
                "path",
                "message"
              ]
            }
          }
        },
        "required": [
          "valid",
          "format",
          "errors"
        ]
      },
      "McpTool_deck_run_Input": {
        "type": "object",
        "properties": {
          "command": {
            "type": "string",
            "enum": [
              "capabilities",
              "schema",
              "layouts",
              "lint",
              "inspect",
              "from-markdown",
              "to-markdown"
            ],
            "description": "capabilities, schema and layouts take nothing; lint, inspect and to-markdown take deck; from-markdown takes markdown."
          },
          "deck": {
            "type": "object",
            "description": "A JSON deck (formatVersion 2) for lint, inspect or to-markdown."
          },
          "markdown": {
            "type": "string",
            "maxLength": 2000000,
            "description": "Deck Markdown (front matter, one section per slide) for from-markdown."
          }
        },
        "required": [
          "command"
        ],
        "additionalProperties": false
      },
      "McpTool_deck_run_Output": {
        "type": "object",
        "properties": {
          "result": {
            "type": "object"
          }
        },
        "required": [
          "result"
        ]
      },
      "McpTool_document_run_Input": {
        "type": "object",
        "properties": {
          "command": {
            "type": "string",
            "enum": [
              "capabilities",
              "schema",
              "validate",
              "inspect",
              "patch",
              "from-markdown",
              "to-markdown",
              "to-blueprint"
            ],
            "description": "capabilities and schema take nothing; from-markdown takes markdown; every other command takes document."
          },
          "document": {
            "type": "object",
            "description": "A Texuli document (format texuli-document, formatVersion 1)."
          },
          "markdown": {
            "type": "string",
            "maxLength": 2000000,
            "description": "Markdown text for from-markdown."
          },
          "patch": {
            "type": "array",
            "maxItems": 1000,
            "items": {
              "type": "object"
            },
            "description": "RFC 6902 operations for patch (add, remove, replace, move, copy, test)."
          },
          "tier": {
            "type": "string",
            "enum": [
              "developer",
              "untrusted"
            ],
            "default": "untrusted",
            "description": "The URL policy tier links and media are checked at (default untrusted)."
          },
          "key": {
            "type": "string",
            "pattern": "^[A-Za-z0-9._:-]{1,64}$",
            "description": "The node key for to-blueprint (default \"document\")."
          }
        },
        "required": [
          "command"
        ],
        "additionalProperties": false
      },
      "McpTool_document_run_Output": {
        "type": "object",
        "properties": {
          "result": {
            "type": "object"
          }
        },
        "required": [
          "result"
        ]
      },
      "McpTool_md_convert_Input": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "maxLength": 1000000,
            "description": "The untrusted source text to convert (at most 1000000 characters)."
          },
          "from": {
            "type": "string",
            "enum": [
              "markdown",
              "commonmark",
              "html",
              "slack",
              "discord",
              "whatsapp",
              "telegram-markdown-v2",
              "telegram-html",
              "teams",
              "google-chat",
              "mattermost",
              "plain-text"
            ],
            "description": "markdown (GitHub Flavored Markdown: tables, task lists, strikethrough, autolinks, footnotes), commonmark (strict CommonMark 0.31.2), html, or a chat dialect (slack, discord, whatsapp, telegram-markdown-v2, telegram-html, teams, google-chat, mattermost, plain-text)."
          },
          "to": {
            "type": "string",
            "enum": [
              "markdown",
              "commonmark",
              "html",
              "slack",
              "discord",
              "whatsapp",
              "telegram-markdown-v2",
              "telegram-html",
              "teams",
              "google-chat",
              "mattermost",
              "plain-text"
            ],
            "description": "markdown (GitHub Flavored Markdown: tables, task lists, strikethrough, autolinks, footnotes), commonmark (strict CommonMark 0.31.2), html, or a chat dialect (slack, discord, whatsapp, telegram-markdown-v2, telegram-html, teams, google-chat, mattermost, plain-text)."
          }
        },
        "required": [
          "source",
          "from",
          "to"
        ],
        "additionalProperties": false
      },
      "McpTool_md_convert_Output": {
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "description": "The converted text."
          },
          "diagnostics": {
            "type": "array",
            "maxItems": 200,
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "maxLength": 64,
                  "description": "A stable diagnostic code."
                },
                "message": {
                  "type": "string",
                  "maxLength": 2000,
                  "description": "What was dropped or rewritten."
                }
              },
              "required": [
                "code",
                "message"
              ],
              "additionalProperties": false
            },
            "description": "What the reader or writer dropped, refused or approximated."
          }
        },
        "required": [
          "value",
          "diagnostics"
        ],
        "additionalProperties": false
      },
      "McpTool_md_render_Input": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "maxLength": 1000000,
            "description": "Untrusted Markdown source (at most 1000000 characters)."
          },
          "gfm": {
            "type": "boolean",
            "description": "GitHub Flavored Markdown extensions (default true); false for strict CommonMark."
          }
        },
        "required": [
          "source"
        ],
        "additionalProperties": false
      },
      "McpTool_md_render_Output": {
        "type": "object",
        "properties": {
          "html": {
            "type": "string",
            "description": "The safe HTML fragment."
          },
          "diagnostics": {
            "type": "array",
            "maxItems": 200,
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "maxLength": 64,
                  "description": "A stable diagnostic code."
                },
                "message": {
                  "type": "string",
                  "maxLength": 2000,
                  "description": "What was dropped or rewritten."
                }
              },
              "required": [
                "code",
                "message"
              ],
              "additionalProperties": false
            },
            "description": "What the reader or writer dropped, refused or approximated."
          }
        },
        "required": [
          "html",
          "diagnostics"
        ],
        "additionalProperties": false
      },
      "McpTool_site_pages_Input": {
        "type": "object",
        "properties": {
          "prefix": {
            "type": "string",
            "maxLength": 200,
            "pattern": "^/[A-Za-z0-9._~/-]*$",
            "description": "Keep only pages whose path starts with this, e.g. \"/guides/\" or \"/component-pages/\"."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "maximum": 10000,
            "default": 0,
            "description": "How many pages to skip (0 to 10000); pass the previous answer's nextOffset."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 200,
            "default": 50,
            "description": "How many pages to return (1 to 200, default 50)."
          }
        },
        "additionalProperties": false
      },
      "McpTool_site_pages_Output": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "minimum": 0
          },
          "offset": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1
          },
          "nextOffset": {
            "type": "integer",
            "minimum": 1
          },
          "pages": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "twin": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                }
              },
              "required": [
                "path",
                "twin",
                "url",
                "title",
                "description"
              ]
            }
          }
        },
        "required": [
          "total",
          "offset",
          "limit",
          "pages"
        ]
      },
      "McpTool_site_read_Input": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "minLength": 1,
            "maxLength": 512,
            "description": "The page: a route such as \"/guides/theming/\" or \"/\", its twin \"/guides/theming.md\", or \"https://texuli.com/guides/theming/\". Find paths with site.pages or site.search."
          }
        },
        "required": [
          "path"
        ],
        "additionalProperties": false
      },
      "McpTool_site_read_Output": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          },
          "twin": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "markdown": {
            "type": "string"
          },
          "bytes": {
            "type": "integer",
            "minimum": 0
          },
          "truncated": {
            "type": "boolean"
          }
        },
        "required": [
          "path",
          "twin",
          "url",
          "title",
          "markdown",
          "bytes",
          "truncated"
        ]
      },
      "McpTool_site_search_Input": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Words to look for, e.g. \"theming dark mode\"; case-insensitive, at most 12 words are used."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 10,
            "description": "How many hits to return (1 to 50, default 10)."
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      },
      "McpTool_site_search_Output": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          },
          "total": {
            "type": "integer",
            "minimum": 0
          },
          "limit": {
            "type": "integer",
            "minimum": 1
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "twin": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "score": {
                  "type": "integer",
                  "minimum": 1
                },
                "headings": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "path",
                "twin",
                "url",
                "title",
                "description",
                "score",
                "headings"
              ]
            }
          }
        },
        "required": [
          "query",
          "total",
          "limit",
          "results"
        ]
      }
    },
    "examples": {
      "Catalog": {
        "summary": "A real Catalog body from the build, every list and keyed record cut to its first 2 entries",
        "value": {
          "entries": [
            {
              "a11y": [
                "Each header is a button that names its panel; expanded state is exposed",
                "Heading level is set so the outline stays valid"
              ],
              "agentEmittable": false,
              "axes": {
                "variant": "variant"
              },
              "dontUseWhen": [
                "Peer views of one page (use tabs)",
                "A multi-step flow (use wizard)"
              ],
              "emit": [],
              "events": [
                "collapse"
              ],
              "examples": [
                {
                  "id": "faq",
                  "props": {
                    "headingLevel": 3,
                    "items": [
                      {
                        "content": "Weekdays 9–17.",
                        "title": "Hours",
                        "value": "hours"
                      },
                      {
                        "content": "No booking fee.",
                        "title": "Fees",
                        "value": "fees"
                      }
                    ]
                  },
                  "title": "FAQ"
                }
              ],
              "group": "display",
              "id": "accordion",
              "imports": [
                {
                  "exports": [
                    "Accordion"
                  ],
                  "module": "texuli"
                },
                {
                  "exports": [
                    "Accordion"
                  ],
                  "module": "texuli/tabs-accordion"
                }
              ],
              "label": "Accordion",
              "package": "texuli",
              "props": [
                {
                  "description": "Sections: value, title, optional content",
                  "kind": "array",
                  "name": "items",
                  "required": true
                },
                {
                  "default": "single",
                  "enumValues": [
                    "single",
                    "multiple"
                  ],
                  "kind": "enum",
                  "name": "type"
                }
              ],
              "related": [
                "tabs",
                "stepper"
              ],
              "states": [
                "hover",
                "focus-visible"
              ],
              "summary": "Stacked sections that expand and collapse one or more panels.",
              "tier": "app",
              "useWhen": [
                "FAQs and grouped detail the reader opens on demand"
              ]
            },
            {
              "a11y": [
                "A labelled form; invalid fields are marked and focused; the receipt is announced"
              ],
              "agentEmittable": true,
              "dontUseWhen": [
                "Payment or sign-in: those are host regions"
              ],
              "emit": [
                "developer",
                "untrusted"
              ],
              "events": [
                "submit"
              ],
              "examples": [
                {
                  "id": "request",
                  "props": {
                    "action": "request-access",
                    "label": "Request access"
                  },
                  "title": "Request access"
                }
              ],
              "group": "state",
              "id": "action-form",
              "label": "Action form",
              "package": "@texuli/player",
              "props": [
                {
                  "description": "The action name the host receives.",
                  "kind": "string",
                  "name": "action",
                  "required": true
                },
                {
                  "kind": "string",
                  "name": "label",
                  "required": true,
                  "trust": "untrusted"
                }
              ],
              "related": [
                "form-field",
                "form-submit"
              ],
              "summary": "Groups fields whose submit proposes one named action intent to the host.",
              "tier": "content",
              "useWhen": [
                "Ask the host to do something with a few named values, such as a request"
              ]
            }
          ],
          "format": "texuli-catalog",
          "groups": {
            "canvas": [
              "canvas"
            ],
            "chat": [
              "chat-message",
              "chat-thread"
            ],
            "composition": [
              "layout-row",
              "layout-split"
            ],
            "content": [
              "blocks-code",
              "blocks-data"
            ],
            "data": [
              "data-board",
              "data-calendar"
            ],
            "display": [
              "accordion",
              "alert"
            ],
            "documents": [
              "document"
            ],
            "forms": [
              "button",
              "button-group"
            ],
            "layouts": [
              "analytics-grid",
              "bottom-nav"
            ],
            "overlays": [
              "alert-dialog",
              "app-nav"
            ],
            "schema-forms": [
              "schema-form"
            ],
            "sheets": [
              "spreadsheet"
            ],
            "state": [
              "action-form",
              "control-choice"
            ],
            "workflows": [
              "workflow-graph"
            ]
          },
          "tiers": {
            "developer": [
              "action-form",
              "blocks-code"
            ],
            "untrusted": [
              "action-form",
              "blocks-code"
            ]
          },
          "version": 1
        }
      },
      "ThemeCatalog": {
        "summary": "A real ThemeCatalog body from the build, every list and keyed record cut to its first 2 entries",
        "value": [
          {
            "id": "fintech-ledger",
            "name": "Fintech Ledger",
            "description": "Trustworthy teal on cool grays — banking and payments.",
            "category": "fintech",
            "collection": "industry",
            "tags": [
              "finance",
              "banking"
            ],
            "swatches": {
              "background": "#fbfbff",
              "foreground": "#15151b",
              "primary": "#0f766e",
              "accent": "#c1fcf5",
              "surface": "#ffffff"
            }
          },
          {
            "id": "health-clinic",
            "name": "Health Clinic",
            "description": "Calm medical green with airy surfaces.",
            "category": "health",
            "collection": "industry",
            "tags": [
              "health",
              "care"
            ],
            "swatches": {
              "background": "#fbfbff",
              "foreground": "#15151b",
              "primary": "#007e58",
              "accent": "#cbfce3",
              "surface": "#ffffff"
            }
          }
        ]
      },
      "ThemeDarkSwatchList": {
        "summary": "A real ThemeDarkSwatchList body from the build, every list and keyed record cut to its first 2 entries",
        "value": [
          {
            "id": "fintech-ledger",
            "swatches": {
              "background": "#0b0b0e",
              "foreground": "#f4f4fd",
              "primary": "#3e978e",
              "accent": "#002e2a",
              "surface": "#161619"
            }
          },
          {
            "id": "health-clinic",
            "swatches": {
              "background": "#0b0b0e",
              "foreground": "#f4f4fd",
              "primary": "#179c6f",
              "accent": "#002f1e",
              "surface": "#161619"
            }
          }
        ]
      },
      "ThemeGalleryCardList": {
        "summary": "A real ThemeGalleryCardList body from the build, every list and keyed record cut to its first 2 entries",
        "value": [
          {
            "id": "fintech-ledger",
            "name": "Fintech Ledger",
            "description": "Trustworthy teal on cool grays — banking and payments.",
            "category": "fintech",
            "collection": "industry",
            "tags": [
              "finance",
              "banking"
            ],
            "darkFirst": false,
            "contrastLevel": "AA",
            "pass": true,
            "issueCount": 0,
            "scores": [
              {
                "mode": "light",
                "pass": true,
                "issueCount": 0,
                "checkedCount": 64,
                "skippedCount": 0,
                "worstTextRatio": 5.1,
                "worstUiRatio": 3
              },
              {
                "mode": "dark",
                "pass": true,
                "issueCount": 0,
                "checkedCount": 64,
                "skippedCount": 0,
                "worstTextRatio": 5.7,
                "worstUiRatio": 3.3
              }
            ],
            "swatches": {
              "light": {
                "background": "#fbfbff",
                "foreground": "#15151b",
                "primary": "#0f766e",
                "primaryForeground": "#ffffff",
                "accent": "#c1fcf5",
                "muted": "#f3f3f7",
                "border": "#e1e1e5"
              },
              "dark": {
                "background": "#0b0b0e",
                "foreground": "#f4f4fd",
                "primary": "#3e978e",
                "primaryForeground": "#0a0a0a",
                "accent": "#002e2a",
                "muted": "#212124",
                "border": "#323236"
              },
              "high-contrast": {
                "background": "Canvas",
                "foreground": "CanvasText",
                "primary": "Highlight",
                "primaryForeground": "HighlightText",
                "accent": "Highlight",
                "muted": "Canvas",
                "border": "CanvasText"
              }
            }
          },
          {
            "id": "health-clinic",
            "name": "Health Clinic",
            "description": "Calm medical green with airy surfaces.",
            "category": "health",
            "collection": "industry",
            "tags": [
              "health",
              "care"
            ],
            "darkFirst": false,
            "contrastLevel": "AA",
            "pass": true,
            "issueCount": 0,
            "scores": [
              {
                "mode": "light",
                "pass": true,
                "issueCount": 0,
                "checkedCount": 64,
                "skippedCount": 0,
                "worstTextRatio": 5.1,
                "worstUiRatio": 3
              },
              {
                "mode": "dark",
                "pass": true,
                "issueCount": 0,
                "checkedCount": 64,
                "skippedCount": 0,
                "worstTextRatio": 5.7,
                "worstUiRatio": 3.7
              }
            ],
            "swatches": {
              "light": {
                "background": "#fbfbff",
                "foreground": "#15151b",
                "primary": "#007e58",
                "primaryForeground": "#ffffff",
                "accent": "#cbfce3",
                "muted": "#f3f3f7",
                "border": "#e1e1e5"
              },
              "dark": {
                "background": "#0b0b0e",
                "foreground": "#f4f4fd",
                "primary": "#179c6f",
                "primaryForeground": "#0a0a0a",
                "accent": "#002f1e",
                "muted": "#212124",
                "border": "#323236"
              },
              "high-contrast": {
                "background": "Canvas",
                "foreground": "CanvasText",
                "primary": "Highlight",
                "primaryForeground": "HighlightText",
                "accent": "Highlight",
                "muted": "Canvas",
                "border": "CanvasText"
              }
            }
          }
        ]
      },
      "ThemeData": {
        "summary": "A real ThemeData body from the build, every list and keyed record cut to its first 2 entries",
        "value": {
          "id": "ocean",
          "name": "Ocean",
          "description": "Cool slate surfaces and a confident blue — classic SaaS (Protoyard built-in port).",
          "category": "builtin",
          "contrastLevel": "AA",
          "light": {
            "mode": "light",
            "roles": [
              {
                "role": "background",
                "default": "#fafcff"
              },
              {
                "role": "foreground",
                "default": "#0a1628"
              }
            ],
            "pairs": [
              {
                "id": "text:foreground/canvas",
                "kind": "text",
                "foreground": "foreground",
                "background": "canvas",
                "fg": "#0a1628",
                "bg": "#eff6ff",
                "ratio": 16.66,
                "minimum": 4.5,
                "pass": true
              },
              {
                "id": "text:foreground/background",
                "kind": "text",
                "foreground": "foreground",
                "background": "background",
                "fg": "#0a1628",
                "bg": "#fafcff",
                "ratio": 17.64,
                "minimum": 4.5,
                "pass": true
              }
            ],
            "scales": {
              "primary": {
                "50": "#f5f9ff",
                "100": "#e6efff"
              },
              "accent": {
                "50": "#f5f9ff",
                "100": "#e6efff"
              },
              "secondary": {
                "50": "#effbff",
                "100": "#d6f5ff"
              }
            },
            "cssVars": {
              "--tx-background": "#fafcff",
              "--tx-foreground": "#0a1628"
            }
          },
          "dark": {
            "mode": "dark",
            "roles": [
              {
                "role": "background",
                "default": "#060b14"
              },
              {
                "role": "foreground",
                "default": "#eff6ff"
              }
            ],
            "pairs": [
              {
                "id": "text:foreground/canvas",
                "kind": "text",
                "foreground": "foreground",
                "background": "canvas",
                "fg": "#eff6ff",
                "bg": "#03060d",
                "ratio": 18.63,
                "minimum": 4.5,
                "pass": true
              },
              {
                "id": "text:foreground/background",
                "kind": "text",
                "foreground": "foreground",
                "background": "background",
                "fg": "#eff6ff",
                "bg": "#060b14",
                "ratio": 18.11,
                "minimum": 4.5,
                "pass": true
              }
            ],
            "scales": {
              "primary": {
                "50": "#f5f9ff",
                "100": "#e6efff"
              },
              "accent": {
                "50": "#f5f9ff",
                "100": "#e6efff"
              },
              "secondary": {
                "50": "#effbff",
                "100": "#d7f4ff"
              }
            },
            "cssVars": {
              "--tx-background": "#060b14",
              "--tx-foreground": "#eff6ff"
            }
          }
        }
      },
      "TwinsManifest": {
        "summary": "A real TwinsManifest body from the build, every list and keyed record cut to its first 2 entries",
        "value": {
          "twins": {
            "/agent-chat/": "/agent-chat.md",
            "/agents-page/": "/agents-page.md"
          },
          "pages": [
            {
              "path": "/agent-chat/",
              "twin": "/agent-chat.md",
              "title": "Agent chat",
              "description": "Ask the Texuli agent for a report, dashboard or deck and get back a validated, untrusted blueprint draft.",
              "headings": [
                "Conversation",
                "Draft preview"
              ]
            },
            {
              "path": "/agents-page/",
              "twin": "/agents-page.md",
              "title": "Texuli for agents",
              "description": "How coding agents build with Texuli: closed catalog, emit tiers, sink-free renderer, MCP, CLI, golden set, llms.txt and catalog JSON.",
              "headings": [
                "How agents build with Texuli",
                "Closed catalog"
              ]
            }
          ]
        }
      },
      "ApiIndex": {
        "summary": "A real ApiIndex body from the build, every list and keyed record cut to its first 2 entries",
        "value": {
          "name": "Texuli public API",
          "version": "0.18.0",
          "status": "released",
          "statusNote": "Released in 0.18.0 (first released in 0.9.0): published on npm and served by texuli.com, deployed from main.",
          "documentation": "https://texuli.com/developers/",
          "openapi": "https://texuli.com/openapi.json",
          "health": "https://texuli.com/api/health.json",
          "authentication": "none",
          "rateLimit": {
            "policy": "api",
            "quota": 300,
            "windowSeconds": 60,
            "scope": "per client IP, per edge isolate (best-effort)"
          },
          "versioning": {
            "current": "0.18.0",
            "prefix": "/api/v1/",
            "header": "X-API-Version",
            "policy": "Paths under /api/v1/ only change additively: new endpoints and new optional fields. A breaking change ships under /api/v2/, and /api/v1/ keeps serving for at least one release line (0.x minor) after that, with Deprecation (RFC 9745) and Sunset (RFC 8594) headers on every affected response. The unversioned paths are the files the site itself fetches: they follow the site and may change in any release, so pin /api/v1/.",
            "deprecationHeaders": [
              "Deprecation",
              "Sunset"
            ]
          },
          "license": "MIT",
          "endpoints": [
            {
              "operationId": "getApiIndexV1",
              "method": "GET",
              "path": "/api/v1/index.json",
              "title": "API index",
              "summary": "The version, the limits, the deprecation policy and every endpoint with its operationId.",
              "url": "https://texuli.com/api/v1/index.json"
            },
            {
              "operationId": "getApiIndex",
              "method": "GET",
              "path": "/api/index.json",
              "title": "API index",
              "summary": "The version, the limits, the deprecation policy and every endpoint with its operationId. Unversioned; prefer /api/v1/index.json.",
              "url": "https://texuli.com/api/index.json"
            }
          ]
        }
      },
      "Health": {
        "summary": "A real Health body from the build, every list and keyed record cut to its first 2 entries",
        "value": {
          "status": "ok",
          "service": "texuli.com",
          "version": "0.18.0",
          "release": "released",
          "builtAt": "1970-01-01T00:00:00.000Z",
          "endpoints": 17,
          "note": "A static file written by the build: a 200 means the build is served. X-API-Version and the RateLimit fields on the response mean the edge middleware answered."
        }
      }
    },
    "parameters": {
      "ThemeId": {
        "name": "id",
        "in": "path",
        "required": true,
        "description": "A library theme id, as listed by listThemes.",
        "schema": {
          "type": "string",
          "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
        },
        "example": "ocean"
      }
    },
    "headers": {
      "XApiVersion": {
        "description": "The release line that built the response.",
        "schema": {
          "type": "string",
          "example": "0.18.0"
        }
      },
      "RateLimitPolicy": {
        "description": "The quota (draft-ietf-httpapi-ratelimit-headers): `\"name\";q=<requests>;w=<seconds>`.",
        "schema": {
          "type": "string",
          "example": "\"api\";q=300;w=60"
        }
      },
      "RateLimit": {
        "description": "What is left: `\"name\";r=<remaining>;t=<seconds until full>`.",
        "schema": {
          "type": "string",
          "example": "\"api\";r=299;t=1"
        }
      },
      "RetryAfter": {
        "description": "Seconds to wait before retrying (RFC 9110).",
        "schema": {
          "type": "integer",
          "minimum": 1
        }
      },
      "Deprecation": {
        "description": "Sent only on a deprecated endpoint (RFC 9745). None is deprecated today.",
        "schema": {
          "type": "string"
        }
      },
      "Sunset": {
        "description": "Sent only on a deprecated endpoint: when it stops serving (RFC 8594).",
        "schema": {
          "type": "string"
        }
      },
      "ETag": {
        "description": "The validator for If-None-Match.",
        "schema": {
          "type": "string"
        }
      }
    }
  }
}
