{
  "openapi": "3.1.0",
  "info": {
    "title": "Squatch Stack read-only API",
    "version": "1.0.0",
    "summary": "Squatch Stack's goods and the studio as JSON. No sign-in.",
    "description": "The same answers as the Squatch Stack MCP tools, as GET requests that return JSON. No sign-in, no key. Add ?output=md for the Markdown a person would read. Reading only. Making a checkout link, sending the studio a request, checking a request and drafting an email are on the MCP server. MCP server: https://mcp.squatch.cc/mcp",
    "contact": {
      "name": "Squatch Stack",
      "email": "hello@squatch.cc",
      "url": "https://squatch.cc/"
    }
  },
  "servers": [
    {
      "url": "https://mcp.squatch.cc"
    }
  ],
  "externalDocs": {
    "description": "Guide, and the MCP server this mirrors",
    "url": "https://mcp.squatch.cc/"
  },
  "paths": {
    "/api/v1/studio": {
      "get": {
        "operationId": "studio_info",
        "summary": "What Squatch Stack builds, its links and contact.",
        "description": "Same data as the MCP tool studio_info.",
        "parameters": [
          {
            "$ref": "#/components/parameters/output"
          }
        ],
        "responses": {
          "200": {
            "description": "The answer as JSON (the MCP tool's structuredContent), or Markdown with output=md.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              },
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/error"
          },
          "429": {
            "$ref": "#/components/responses/error"
          }
        }
      }
    },
    "/api/v1/goods": {
      "get": {
        "operationId": "list_goods",
        "summary": "The goods in the shop, with prices, colours, sizes, photo and link. Optional search.",
        "description": "Same data as the MCP tool list_goods.",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Words to match in the product name, e.g. founder or mug",
            "schema": {
              "type": "string",
              "maxLength": 60
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "Only this kind of thing",
            "schema": {
              "type": "string",
              "enum": [
                "tee",
                "mug",
                "hat",
                "sticker",
                "poster",
                "tote",
                "desk mat"
              ]
            }
          },
          {
            "$ref": "#/components/parameters/output"
          }
        ],
        "responses": {
          "200": {
            "description": "The answer as JSON (the MCP tool's structuredContent), or Markdown with output=md.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              },
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/error"
          },
          "429": {
            "$ref": "#/components/responses/error"
          }
        }
      }
    },
    "/api/v1/goods/{slug}": {
      "get": {
        "operationId": "get_good",
        "summary": "One product: description, photos, and every colour and size with its price and stock.",
        "description": "Same data as the MCP tool get_good.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The product's slug, from /api/v1/goods",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]{1,80}$"
            }
          },
          {
            "$ref": "#/components/parameters/output"
          }
        ],
        "responses": {
          "200": {
            "description": "The answer as JSON (the MCP tool's structuredContent), or Markdown with output=md.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              },
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/error"
          },
          "404": {
            "$ref": "#/components/responses/error"
          },
          "429": {
            "$ref": "#/components/responses/error"
          }
        }
      }
    },
    "/api/v1/buffalo": {
      "get": {
        "operationId": "parse_buffalo",
        "summary": "Tag each word of a Buffalo buffalo sentence as city, animal or verb.",
        "description": "Same data as the MCP tool parse_buffalo.",
        "parameters": [
          {
            "name": "sentence",
            "in": "query",
            "required": true,
            "description": "Buffalo, as many as you like",
            "schema": {
              "type": "string",
              "maxLength": 400
            }
          },
          {
            "$ref": "#/components/parameters/output"
          }
        ],
        "responses": {
          "200": {
            "description": "The answer as JSON (the MCP tool's structuredContent), or Markdown with output=md.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              },
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/error"
          },
          "429": {
            "$ref": "#/components/responses/error"
          }
        }
      }
    },
    "/api/v1/support": {
      "get": {
        "operationId": "support_options",
        "summary": "Ways to support the studio's open work: tiers, prices, what each gets, and a checkout link where card checkout is live. Not tax-deductible (for-profit LLC).",
        "description": "Same data as the MCP tool support_options.",
        "parameters": [
          {
            "$ref": "#/components/parameters/output"
          }
        ],
        "responses": {
          "200": {
            "description": "The answer as JSON (the MCP tool's structuredContent), or Markdown with output=md.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              },
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/error"
          },
          "429": {
            "$ref": "#/components/responses/error"
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "output": {
        "name": "output",
        "in": "query",
        "required": false,
        "description": "md for Markdown instead of JSON",
        "schema": {
          "type": "string",
          "enum": [
            "json",
            "md"
          ]
        }
      }
    },
    "responses": {
      "error": {
        "description": "What went wrong, in a sentence",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "error": {
                  "type": "string"
                }
              },
              "required": [
                "error"
              ]
            }
          }
        }
      }
    }
  }
}
