{
  "schemaVersion": "0.2",
  "name": "Jake Handy",
  "description": "Jake Handy is a Staff Product Manager at The MLC (music-industry automation), author of the Handy AI newsletter, and organizer of Cursor Nashville. jakehandy.com collects his essays and reference pages on AI product work, AI music generation and detection, agentic engineering, and the tools he builds on the side. Every page is readable as Markdown, the whole catalog is queryable over MCP, and the editorial section is writable: any reader, human or agent, can react to a passage.",
  "url": "https://jakehandy.com/",
  "lang": "en",
  "topics": [
    "AI product management",
    "AI music generation",
    "AI music detection",
    "agentic engineering",
    "Cursor and AI coding tools",
    "music-industry automation"
  ],
  "publisher": {
    "name": "Jake Handy",
    "url": "https://jakehandy.com/",
    "sameAs": [
      "https://handyai.substack.com",
      "https://handyai.news",
      "https://cursornashville.com",
      "https://handyco.dev",
      "https://www.linkedin.com/in/jakehandy/"
    ]
  },
  "contact": {
    "email": "hello@jakehandy.com",
    "url": "https://jakehandy.com/"
  },
  "mcp": {
    "transport": "streamable-http",
    "url": "https://jakehandy.com/mcp",
    "serverCard": "https://jakehandy.com/.well-known/mcp/server-cards.json",
    "authentication": "none",
    "tools": [
      "list_pages",
      "get_page",
      "search_site",
      "list_editorials",
      "get_editorial",
      "list_highlights",
      "highlight_passage",
      "react_to_highlight",
      "about_jake",
      "site_guide"
    ]
  },
  "capabilities": [
    "mcp-server",
    "webmcp",
    "read-pages",
    "read-markdown",
    "read-json",
    "search-site",
    "read-editorials",
    "read-highlights",
    "highlight-passage",
    "react-to-highlight"
  ],
  "guide": "https://jakehandy.com/for-agents",
  "endpoints": {
    "mcp": {
      "url": "https://jakehandy.com/mcp",
      "method": "POST",
      "format": "application/json",
      "description": "Remote MCP server (Streamable HTTP, no auth, stateless). Tools: list_pages, get_page, search_site, list_editorials, get_editorial, list_highlights, highlight_passage, react_to_highlight, about_jake, site_guide."
    },
    "guide": {
      "url": "https://jakehandy.com/for-agents",
      "method": "GET",
      "format": "text/html",
      "description": "The agent front door: what this site is, how to cite it, every machine endpoint in one table, and how to react to a passage. Append .md or send Accept: text/markdown for Markdown."
    },
    "whoami": {
      "url": "https://jakehandy.com/api/whoami",
      "method": "GET",
      "format": "application/json",
      "description": "Reflects what this site sees about your request and exactly what you may do next, with current limits. A good first call."
    },
    "pages": {
      "url": "https://jakehandy.com/api/pages",
      "method": "GET",
      "format": "application/json",
      "description": "Every page on the site with metadata and a ready-made citation string."
    },
    "page": {
      "urlTemplate": "https://jakehandy.com/{slug}.md",
      "method": "GET",
      "format": "text/markdown",
      "description": "Any page as Markdown with YAML front matter. Every page URL also honours Accept: text/markdown."
    },
    "search": {
      "urlTemplate": "https://jakehandy.com/api/search?q={query}",
      "method": "GET",
      "format": "application/json",
      "description": "Keyword search across every page body and every editorial."
    },
    "editorials": {
      "url": "https://jakehandy.com/ai",
      "method": "GET",
      "format": "text/html",
      "description": "Jake on AI: the editorial feed. https://jakehandy.com/ai/llms.txt indexes it; each post takes a .md suffix."
    },
    "articleHighlights": {
      "urlTemplate": "https://jakehandy.com/api/ai/{slug}/highlights",
      "method": "GET",
      "format": "application/json",
      "description": "The passages of one editorial that readers and agents gave a thumbs up or down, each with who reacted. Append .md for Markdown."
    },
    "highlightPassage": {
      "urlTemplate": "https://jakehandy.com/api/ai/{slug}/highlights",
      "method": "POST",
      "accepts": [
        "application/json",
        "application/x-www-form-urlencoded"
      ],
      "auth": "none",
      "body": {
        "exact": "string (required): the passage verbatim, 3 to 1000 characters",
        "prefix": "string (optional): up to 48 characters immediately before it",
        "suffix": "string (optional): up to 48 characters immediately after it",
        "reaction": "1 (thumbs up) or -1 (thumbs down)",
        "kind": "\"human\" | \"agent\" (optional, default \"human\"): self-declared",
        "name": "string (optional): display name shown on the hover card",
        "model": "string (optional): your model id, shown next to the agent tag",
        "token": "string (optional, recommended): a stable opaque id, 8+ characters"
      },
      "description": "Mark one sentence of an editorial and thumbs it. Identical passages merge so reactions accumulate. A passage with 3+ reactions is highlighted in the post for every reader, with your name or model on the hover card."
    },
    "reactToHighlight": {
      "urlTemplate": "https://jakehandy.com/api/ai/highlights/{highlight_id}/react",
      "method": "POST",
      "accepts": [
        "application/json",
        "application/x-www-form-urlencoded"
      ],
      "auth": "none",
      "body": {
        "value": "1 up, -1 down, 0 withdraw",
        "token": "string (optional, recommended)"
      },
      "description": "Thumbs an existing passage. Idempotent per token."
    },
    "llmsIndex": {
      "url": "https://jakehandy.com/llms.txt",
      "method": "GET",
      "format": "text/plain"
    },
    "llmsFullDump": {
      "url": "https://jakehandy.com/llms-full.txt",
      "method": "GET",
      "format": "text/plain"
    },
    "sitemap": {
      "url": "https://jakehandy.com/sitemap.xml",
      "method": "GET",
      "format": "application/xml"
    },
    "jsonFeed": {
      "url": "https://jakehandy.com/feed.json",
      "method": "GET",
      "format": "application/feed+json",
      "description": "JSON Feed 1.1 of the Jake on AI editorials."
    }
  },
  "writeActions": {
    "openToAgents": true,
    "requiresAccount": false,
    "requiresApiKey": false,
    "scope": "Reacting to passages of a Jake on AI post. There is no comment system here by design.",
    "identity": "Self-declared. Send kind=\"agent\" and an optional model id. Send a stable opaque token (8+ chars) to keep your reactions de-duplicated and see your own flagged on read.",
    "houseRules": [
      "React to the specific sentence you mean, not the whole post.",
      "A thumbs down on a claim you think is wrong is more useful than agreement.",
      "Put something in the name or model field. An unattributed reaction says nothing."
    ]
  },
  "discoveryFiles": [
    "https://jakehandy.com/for-agents",
    "https://jakehandy.com/for-agents.md",
    "https://jakehandy.com/robots.txt",
    "https://jakehandy.com/sitemap.xml",
    "https://jakehandy.com/llms.txt",
    "https://jakehandy.com/llms-full.txt",
    "https://jakehandy.com/ai.txt",
    "https://jakehandy.com/agents.md",
    "https://jakehandy.com/feed.json",
    "https://jakehandy.com/.well-known/security.txt",
    "https://jakehandy.com/.well-known/mcp/server-cards.json",
    "https://jakehandy.com/manifest.webmanifest"
  ],
  "permissions": {
    "ai-input": true,
    "ai-train": true,
    "ai-react": true,
    "search": true,
    "citation": "required"
  }
}