{
  "platform": "MAJR Agent Services",
  "description": "Shared, product-neutral SOA capabilities: independent services, versioned HTTP contracts, one bearer-auth convention, RFC 7807 problem+json errors.",
  "revision": 4,
  "updated": "2026-08-10",
  "source": "https://release-notes.majr.app/catalog.json",
  "services": [
    {
      "name": "dispatch",
      "display_name": "Dispatch",
      "visibility": "public",
      "summary": "Turn a raw dev log into release notes a customer can read.",
      "description": "Post the commits, tickets, and notes from a release. Get back customer-facing Markdown, ready to publish or to edit first.\n\nDrafting only: request and response bodies are never persisted.",
      "base_url": "https://dispatch.majr.app",
      "status": "live",
      "archetype": "sync-http",
      "auth": "Authorization: Bearer <api key> (per-product keys)",
      "links": {
        "card": "https://dispatch.majr.app/",
        "openapi": "https://dispatch.majr.app/openapi.json",
        "mcp": "https://dispatch.majr.app/mcp",
        "llms_txt": "https://dispatch.majr.app/llms.txt",
        "playground": "https://dispatch.majr.app/docs"
      }
    },
    {
      "name": "seo",
      "display_name": "AI SEO",
      "visibility": "public",
      "summary": "Make a page ready for search engines to index and AI answer engines to quote.",
      "description": "Generate the machinery a page needs to be read by both: robots.txt that welcomes AI crawlers by default, sitemap.xml, a page <head> with JSON-LD, and llms.txt.\n\nAudit a live page and get two scores instead of one. Findable asks whether an engine can reach and index the URL. Citable asks whether, once reached, the page can be extracted and attributed. Two scores mean the result tells you which problem you have, not only that you have one.\n\nThe audit reports what it observes on one pass: the page's robots meta tags, the X-Robots-Tag header, an expired unavailable_after, the origin's robots.txt, and whether the canonical target answers. It cannot know which crawlers honor a directive aimed at one of them, so it reports the block it saw and never reports who is still indexing you. audit_html scores markup before deploy, so it checks a template, not a deployment.\n\nAll six operations run over MCP: audit_page, audit_html, generate_head, generate_robots, generate_sitemap, generate_llms_txt.",
      "base_url": "https://seo.majr.app",
      "status": "live",
      "archetype": "sync-http",
      "auth": "Authorization: Bearer <api key> (per-product keys)",
      "links": {
        "card": "https://seo.majr.app/",
        "openapi": "https://seo.majr.app/openapi.json",
        "mcp": "https://seo.majr.app/mcp",
        "llms_txt": "https://seo.majr.app/llms.txt",
        "playground": "https://seo.majr.app/docs"
      }
    },
    {
      "name": "media-encoding",
      "display_name": "Media Encoding",
      "visibility": "public",
      "summary": "Take what a user uploaded and get back web-ready video, audio, and images.",
      "description": "Video becomes HLS with multiple renditions and a poster frame. Audio becomes AAC. Images become WebP.\n\nUse the managed temporary storage, presigned upload in and presigned outputs out, or bring your own bucket. Poll for the result, or take a signed callback when it is done.",
      "base_url": "https://encoding.majr.app",
      "status": "live",
      "archetype": "async-queue",
      "auth": "Authorization: Bearer <api key> (per-product keys)",
      "contract": "POST /v1/uploads -> 201; POST /v1/encode -> 202 {jobId}; GET /v1/jobs/{id}; or the same operations over MCP at /mcp",
      "links": {
        "card": "https://encoding.majr.app/",
        "openapi": "https://encoding.majr.app/openapi.json",
        "mcp": "https://encoding.majr.app/mcp",
        "llms_txt": "https://encoding.majr.app/llms.txt"
      }
    }
  ]
}