{
  "schema_version": "2026-03-01",
  "name": "maxjam",
  "display_name": "MaxJam",
  "description": "The editable taste brain + aimed discovery. Watches listening, models taste (editable, queryable), curates situational playlists into your real library, and surfaces aimed discovery — every pick grounded against a real catalog, behind a dual-LLM quarantine boundary.",
  "version": "0.1.0",
  "operator": "Capital Thought, LLC",
  "homepage": "https://maxjam.ai",
  "contract": "https://maxjam.ai/AGENTS.md",
  "tenancy": "single-tenant",
  "audience": "owner-operated (single user); not a public multi-tenant service",
  "endpoint": {
    "base_url": "https://maxjam-mcp.capitalfactory.workers.dev",
    "transport": "http-json",
    "notes": "Read verbs run synchronously; create_playlist/discover_music run async via a Cloudflare Queue + Durable Object and return a job handle polled at GET /jobs/:id. Standards-compliant MCP streamable-http transport is planned."
  },
  "auth": {
    "type": "owner-scoped",
    "notes": "Auth-gated and scoped to the owner's own Spotify/Apple/Last.fm accounts. Mutating verbs require a planner-issued, single-use, capability-scoped intent token enforced by the dispatcher."
  },
  "tools": [
    { "name": "sync_listening", "mutating": false, "summary": "Ingest recent play history into the durable telemetry store (idempotent)." },
    { "name": "get_taste_profile", "mutating": false, "summary": "The current, human-readable, queryable taste model." },
    { "name": "create_playlist", "mutating": true, "summary": "Generate a situational playlist and write it to the real library." },
    { "name": "discover_music", "mutating": true, "summary": "Fresh, unfamiliar picks tuned for novelty + serendipity; never returns a familiar track." },
    { "name": "feedback", "mutating": true, "summary": "Record a reaction; writes the taste store and scrobbles to Last.fm." },
    { "name": "set_preference", "mutating": true, "summary": "A standing rule that overrides the implicit model immediately; reversible." },
    { "name": "explain_pick", "mutating": false, "summary": "Why this track? The transparency primitive." },
    { "name": "overview", "mutating": false, "summary": "Inspectable State — one no-input call returning health + recent activity." }
  ]
}
