API keys are limited to the scopes granted to their service. Requests outside those scopes return a 403.
Use the current endpoint instead.
Fixed encoding of analytics distinct IDs so segments with special characters are handled correctly.
What's New
Updates across the MAJR Agent Services, drafted from each service's own release notes. Refreshed Jul 18, 2026.
API keys are limited to the scopes granted to their service. Requests outside those scopes return a 403.
Use the current endpoint instead.
Fixed encoding of analytics distinct IDs so segments with special characters are handled correctly.
Some features here work best-effort, but the changelog is quite sparse. Let me assess what's user-facing.
API keys now carry scopes. When a key lacks the required scope for a request, the service returns a clear 403 instead of proceeding.
The served quickstart reflects the 403 scope verdict, so you can see scope failures without guesswork.
The legacy shared token has been retired. Use API keys to authenticate with MAJR SEO.
Usage analytics for release notes. We now track how the release-notes service is used, including request counts and outcomes. We record counts and metadata only, never the content of your logs or the notes we generate.
The full /v1 surface is now available as MCP tools. You can drive robots.txt, sitemaps, page metadata, llms.txt, and the page-readiness audit directly from MCP clients.
- The concurrency meter slot is now released when thread creation fails, so a failed start no longer holds capacity.
Callback URLs are validated before we send to them, including blocking internal IPv6 address ranges.
When something goes wrong in any of the six SEO tools, we now capture more useful context to diagnose and fix it faster. Errors from release notes and SEO now report to Sentry.
The complete /v1 surface is now available as MCP tools, so you can call it directly from MCP-compatible clients.
The release-notes service is now MAJR Dispatch. Existing paths continue to work alongside the new ones during this transition.
Corrected the API title, catalog revision, and what's-new path.
Requests that arrived while the service was scaling up from zero no longer hit a 503 window. The cold-start path now fetches complete responses and handles the scale-to-zero race directly.
warm() now does what its contract says: it sets a bound on how many starts kick off, not a cap on total requests. Warm overrun is bounded, and Retry-After is derived from real timing so clients back off with accurate values.
Every documented surface now matches the shipped implementation. MCP is described protocol-first, with the vendor CLI shown as one labelled example rather than the only path.
Added an example-driven guide to connecting over MCP. The docs now describe the protocol first, with a vendor CLI shown as one labelled example rather than the only path.
We also carried over cold-start handling from release-notes so both tools behave the same way on first run.
Requests that arrive while the encoder is scaling up from zero no longer hit a 503 window. The cold-start race is fixed, so uploads submitted during that window are handled instead of rejected.
When a source fetch fails, the cooldown now starts at the moment of failure rather than later. Retry timing is enforced as a hard bound, and nonsensical retry values are rejected.
Canonical URLs now default correctly, so search engines see a single authoritative version of each page.
Parity claims and catalog markers report the true state of each surface, keeping your metadata honest and aligned.
Setting an origin override now applies to robots.txt, sitemaps, and page metadata alike, so every surface reflects the same source.
now default sensibly, so pages point to a clear preferred address out of the box.
for size limits, so what you set matches what you get.
MAJR SEO now exposes an MCP surface at /mcp with a single tool, audit_page. Point your MCP client at it to run a page-readiness audit.
Failed checks now come with an explanation of what went wrong, and audits can return the page HTML so you can verify findings directly against the source.
When key authentication isn't configured, the MCP surface now returns a 503 instead of a 401, so you can tell "not set up yet" apart from "not authorized."
Also: audit_html is now capped by byte size, and non-string URL labels are rejected rather than silently accepted.
URLs containing ASCII control characters no longer trigger a 500 error, and redirect (3xx) responses are now handled during ingest.
Each served surface now advertises the authentication method that actually works, so there's less guesswork about how to connect.
You can now authenticate with platform API keys. Legacy credentials are still accepted during the transition, so existing integrations keep working.
You can now hand off uploads to managed storage and let encoding pick them up, with durable poll snapshots so in-progress work survives restarts.
Drive encoding operations through an MCP interface built on the shared operations layer. Omitted arguments and error messages are handled cleanly.
The four rules for beta callers are now documented in llms.txt.
WebP output now runs on an updated toolchain with improved verification, so encoded images match their sources more reliably.
The Control Plane now appears in /catalog.json, so you can discover it alongside other platform services.
keep unfinished and internal content out of published notes.
Drafts that carry the no-news marker are no longer published by mistake.
Internal deliberation text is prevented from leaking into published output.
now fails fast when voice drifts on brand pushes, so mismatches surface early instead of shipping.
The Control Plane is now a standalone part of the platform, extracted from release notes so it can grow on its own.
New endpoints give you a key map for your services and a path to ingest usage directly. This is phase 3 of the service-plane work.
Ingest now rejects reserved names, drops echo-free locations, and requires exact integers so your submitted usage lands cleanly. Ingest identities are validated on the way in.
Service events no longer count toward draft totals, so the numbers you see reflect actual usage.
- A defined error contract, so failures return predictable, actionable responses. - MCP services now have full parity across the plane. - Documentation for plane secrets. - Oversized integers now return a clear 422 instead of failing silently.
The media-encoding service now publishes a service card, an llms.txt, and an OpenAPI 3.1 spec so agents can discover and call it.
Authenticate with keys scoped to each product through the shared service-plane key map. During the transition, both new and legacy keys are accepted, and legacy keys are tried first so existing setups keep working.
The same job ID in different products no longer collides. Use a / separator in IDs, with idempotency scoped to the rollout window.
Encoding usage is recorded to the platform ledger with one event per terminal outcome. Failed encodes now meter their partial costs, and failed downloads meter the bytes actually transferred, so your usage reflects real work done.
Retry-After values now reflect the actual wait. The retryable auth 503 response is documented so you can handle it correctly.
New service card, llms.txt, and OpenAPI 3.1 description make the encoding API easier to discover and integrate.
Query the catalog to see the available agent surfaces programmatically.
Documented the SEO agent surface and full fleet catalog in the CATALOG file and READMEs.
MAJR SEO now publishes a machine-readable service card and an llms.txt so agents can discover what the service does and how to use it.
makes the API easier to read and integrate against.
follow the problem+json format, so failures come back in a consistent, parseable shape.
You can now add and manage API keys under your account, organized by product. Set which keys are active so each product uses the credentials you intend.
Release notes are now composed against a shared voice floor on the server — the same honest, plain-spoken foundation applies no matter which product you're using.
We've also updated the documentation to match.
There's now an MCP endpoint at /mcp (streamable HTTP) that uses the same API keys you already have, so agents can generate release notes without a separate setup.
We've polished the OpenAPI spec and added discovery endpoints at / and /llms.txt, making it simpler for both people and agents to find their way around.
A new GET /v1/usage endpoint lets you check your usage directly.
Tenants are now backed by Postgres, with support for two authentication methods.
We've also expanded the agent documentation and runbook to help you get started.
We've added optional error reporting so encoding problems get caught and diagnosed faster, on both the server and worker side.
The encoding API now stays warm and ready, so your jobs kick off without waiting on a cold start.
AAC uploads sent as audio/x-aac are now recognized and encoded.
When you re-submit a job that's already in progress, we now report its real, current status instead of a stale one.
URLs with non-ASCII hostnames are handled using IDNA2008 encoding, and any authentication details in a URL are preserved as you entered them.
The page-readiness audit now handles DNS failover gracefully and won't reuse connections across hosts, so results reflect the site you actually asked about.
We tightened the audit so it reports what it genuinely found — no overstated pass/fail claims.
The audit and other outbound fetches use a default-deny guard that blocks requests to internal and private addresses, including embedded-IPv4 and NAT64 edge cases. This is a best-effort protection against server-side request forgery.
llms.txt output is sanitized, and robots handling is hardened against injection.
MAJR Release Notes is our first agent services capability — point it at a raw development log and get back concise, customer-facing notes.
A new render target lets you pick the output format that fits your workflow.
Draft with any model from the supported allowlist.
When something goes wrong, the service now returns structured, standards-based error responses (problem+json) so failures are easier to diagnose.