{
  "openapi": "3.1.0",
  "info": {
    "title": "ethanchang.io",
    "summary": "Personal blog machine-readable surface",
    "description": "Read-only discovery plus an email-bound comment inbox. There is no public MCP server and no write API for third-party apps.",
    "version": "1.0.0",
    "contact": {
      "name": "Ethan Chang",
      "email": "hey@ethanchang.io",
      "url": "https://ethanchang.io"
    }
  },
  "servers": [
    {
      "url": "https://ethanchang.io"
    }
  ],
  "paths": {
    "/llms.txt": {
      "get": {
        "summary": "Agent instructions and catalog",
        "operationId": "getLlmsTxt",
        "responses": {
          "200": {
            "description": "text/plain catalog"
          }
        }
      }
    },
    "/rss.xml": {
      "get": {
        "summary": "Article feed",
        "operationId": "getRss",
        "responses": {
          "200": {
            "description": "application/rss+xml"
          }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "summary": "XML sitemap",
        "operationId": "getSitemap",
        "responses": {
          "200": {
            "description": "application/xml"
          }
        }
      }
    },
    "/api/comments": {
      "post": {
        "summary": "Email a comment on an article; not published on the page",
        "operationId": "postComment",
        "responses": {
          "200": {
            "description": "Accepted"
          },
          "400": {
            "description": "Invalid body"
          }
        }
      }
    },
    "/api/me": {
      "get": {
        "summary": "Current session, or user: null",
        "operationId": "getMe",
        "responses": {
          "200": {
            "description": "Session JSON"
          }
        }
      }
    }
  }
}