Quickstart · Dispatch · 10 minutes
Add Dispatch to your Lovable, Replit, or Cursor app in 10 minutes.
Commit subjects and merged PR titles in, release-notes Markdown out — written for your customers, not your engineers. The MAJR house voice is composed beneath your own, server-side.
1 — Get a key · 1 minute
Sign in with your email at majr.app/keys, name your product, copy the key. It is shown once. One key works on every MAJR Agent Service. Free during beta, no card.
export MAJR_API_KEY=rn_... # the key from majr.app/keys
2 — Connect your agent · 2 minutes
The service speaks MCP over Streamable HTTP at https://dispatch.majr.app/mcp, so any MCP client connects with the same URL and header. Pick your tool:
Cursor
Add to Cursorinstalls the server below; it reads MAJR_API_KEY from your environment.
Or add it to .cursor/mcp.json yourself:
{
"mcpServers": {
"majr-dispatch": {
"url": "https://dispatch.majr.app/mcp",
"headers": {
"Authorization": "Bearer ${env:MAJR_API_KEY}"
}
}
}
}Claude Code
The plugin brings all three services and a skill that knows how to use them:
/plugin marketplace add majrdotapp/agent-services /plugin install majr-services@agent-services
Or register just this server:
claude mcp add --transport http majr-dispatch https://dispatch.majr.app/mcp \ --header "Authorization: Bearer $MAJR_API_KEY"
Lovable, Replit, or any chat-driven builder
No MCP needed. Put the key in your project's secrets as MAJR_API_KEY, then paste this prompt into the chat. The agent reads the contract and writes the integration in your app's own language.
Add a release-notes step to this app's release process using MAJR Dispatch. Read the contract first: https://dispatch.majr.app/llms.txt. Auth: send "Authorization: Bearer <key>" with the key from the MAJR_API_KEY secret. Never hardcode it. 1. Collect the commit subjects and merged PR titles since the last release tag into a plain-text list, one "- " line each. 2. POST them as "changes" to https://dispatch.majr.app/v1/draft-dispatch with "product" set to our app's name. Use "render_target": "embedded_fragment" for a section inside our What's New page, or "standalone_document" for a whole page. 3. Write the returned "markdown" to our changelog / What's New page. When "no_news" is true, skip the step: nothing user-facing shipped, so do not invent notes. 4. Keep human approval: open the notes for review before they publish.
3 — Draft your first notes · 2 minutes
Over MCP the tool is draft_dispatch; over HTTP:
curl -sS -X POST https://dispatch.majr.app/v1/draft-dispatch \
-H "Authorization: Bearer $MAJR_API_KEY" -H "Content-Type: application/json" \
-d '{"changes": "- add CSV export\n- fix crash when login token expires", "product": "Your App"}'You get Markdown a customer can read:
{
"markdown": "- Export any table to CSV from the toolbar.\n- Signing in after a long idle no longer crashes the app.",
"no_news": false
}no_news: true with empty markdown means nothing user-facing shipped. Trust it; never string-match for it yourself.
4 — Wire it into your release · 4 minutes
The raw log is whatever your repo already has. One script, run when you cut a release:
# The change log is your git log since the last release tag — every commit subject, merges
# skipped (a merge commit's subject is "Merge pull request #79 ...", not the change). No tag yet
# (a first release) means every commit.
since=$(git describe --tags --abbrev=0 2>/dev/null || true) # nonfatal under bash -e
changes=$(git log ${since:+$since..}HEAD --no-merges --format='- %s' | jq -Rs .)
# Replace the notes only when a draft came back: curl -f turns an HTTP error (a 503 with
# Retry-After, say) into a failed pipe, and jq -e exits non-zero on no_news or a body with no
# markdown, so the mv never runs on an error and the current notes stay in place.
curl -fsS -X POST https://dispatch.majr.app/v1/draft-dispatch \
-H "Authorization: Bearer $MAJR_API_KEY" -H "Content-Type: application/json" \
-d "{\"changes\": $changes, \"product\": \"Your App\", \"render_target\": \"standalone_document\"}" \
| jq -er 'if .no_news then empty else .markdown end' > release-notes.new \
&& mv release-notes.new release-notes.mdrender_target picks the shape: embedded_fragment (default; no headings, you own the page) or standalone_document (headings allowed; the notes are the whole page). voice is persona only: your account's brand floor is composed beneath it and cannot be skipped.
5 — Review and publish · 1 minute
Open the draft for a human look, then post it to your changelog or What's New page. Drafting is the service's whole job; approval and distribution stay yours. Your drafts show up under your product at majr.app/keys.
Reference
- Contract for agents (llms.txt)
- https://dispatch.majr.app/llms.txt
- MCP endpoint
- https://dispatch.majr.app/mcp
- Your keys and usage
- majr.app/keys
Errors are RFC 7807 problem+json. A 401 means the key is wrong. A 503 with Retry-After is never a verdict on your key: wait and retry, do not rotate it.