What you can do where

Herald has four ways in: the app's own windows, the local HTTP API, the herald command-line tool and the MCP server for agents. This page answers one question: "I can do this in the app; how do I do it over HTTP, from the command line and through MCP?" Find the thing you do in the app in the first column, then follow the link in the column you want.

Every MCP tool wraps one HTTP route, and every CLI command is one or two HTTP requests, so a capability that exists in MCP exists in HTTP. The CLI covers the routes that are natural at a prompt, so it has the fewest. A cell reads none when that way in cannot do it, and UI only when it is a view state such as a selection or a zoom level, with nothing stored to read or set. A task that must stay with a person at the Mac is listed under the table of its area and in What only a person can do.

Way inWho uses itNeeds
The app's windowsA person at the Mac.Herald running.
HTTP APIAny program on the Mac.The bearer token.
CLIA person or script at a terminal.Herald running.
MCP serverAn agent.An MCP client with herald-mcp installed.

Notifications and banners#

Show, close and snooze banners, and read what the user typed into them. The app column names the menu, the Quick send window or the Designer.

What you do in the appHTTPCLIMCP
Compose... (Quick send), then sendPOST /v1/notifyherald notifysend_notification
Send test in the DesignerPOST /v1/notifyherald notifysend_test
Speak in Settings > VoicePOST /v1/speakherald speakspeak
Close button on a bannerPOST /v1/dismissherald dismissdismiss
Dismiss AllPOST /v1/dismissAllherald dismiss-alldismiss
Clock menu on a bannerPOST /v1/snoozeherald snoozesnooze
Bring a snoozed banner backPOST /v1/unsnoozeherald unsnoozesnooze
Click a stack to see its listGET /v1/stacksherald stackslist_stacks
Click a stack to open or close itPOST /v1/stacks/expandnoneexpand_stack
Read a reply in HistoryGET /v1/repliesnoneget_replies
Wait for a reply to one bannerGET /v1/replies/waitnonewait_for_reply
Menu: Compose...POST /v1/composeherald composenone

Only in some places:

  • Press a banner button exists only in the app. A button runs code or sends data on the user's behalf, so no API, command or tool presses one. An agent can send a button and read the answer.

Templates#

A template is one JSON document, and every edit the Designer makes rewrites it. Saving a template therefore covers every edit, and the same validation runs on both sides.

Only in some places:

  • Problems button: the app and MCP check a draft without saving it. Over HTTP and the CLI, PUT /v1/templates validates as it saves.
  • Selection, undo, redo, zoom and drag are view state of the Designer window. A saved template holds the result.

Previews and checks#

See what a banner looks like, and check that Herald is up, without opening a window.

What you do in the appHTTPCLIMCP
Live preview, light or darkPOST /v1/previewnonerender_preview
Last real in the preview headerPOST /v1/previewnonerender_preview
Preview a stack or a confirmationPOST /v1/previewnonerender_preview
Look at the whole DesignerGET /v1/designer/snapshotnonedesigner_snapshot
Rive details in the Cell tabPOST /v1/rive/checknonerive_check
The bell in the menu barGET /v1/healthherald healthherald_status

Manifests and assets#

What a manifest holds is in Manifests.

What you do in the appHTTPCLIMCP
Fields in the Designer paletteGET /v1/manifestsnonelist_manifests
Open one app's fieldsGET /v1/manifestnoneget_manifest
Apps send a manifest themselvesPUT /v1/manifestnoneput_manifest
Remove an app's manifestDELETE /v1/manifestherald manifest deletedelete_manifest
Assets in the Designer paletteGET /v1/assetsherald assets listlist_assets
Add... under AssetsPOST /v1/assetsherald assets addupload_asset
Remove... under AssetsDELETE /v1/assetsherald assets rmdelete_asset

Only in some places:

  • Saving a manifest has no app window and no CLI command: a manifest comes from the app that sends it. Use PUT /v1/manifest or put_manifest.

History#

Past notifications, kept per app.

Settings and apps#

The app column names the Settings tab. The keys and their values are in the settings API and the apps API.

What you do in the appHTTPCLIMCP
Settings > GeneralGET /v1/settingsherald settingsget_settings
Change a general or voice settingPUT /v1/settingsherald settings setset_settings
Quiet hours, Settings > VoiceGET /v1/settings/quiet-hoursherald quietget_quiet_hours
Change quiet hours or silence for a whilePUT /v1/settings/quiet-hoursherald quietset_quiet_hours
Menu: Stack NotificationsPUT /v1/settings/stackingherald settings setset_settings
Kokoro voice, Settings > VoiceGET /v1/voiceherald voicevoice_status
Install the Kokoro voicePOST /v1/voice/installherald voiceinstall_voice
Settings > MCP, install in a clientPOST /v1/mcp/installherald mcpinstall_mcp
Apps register themselvesPOST /v1/registerherald registerregister_app
Settings > Apps, the listGET /v1/appsherald appslist_apps
Settings > Apps, one appGET /v1/apps/settingsherald apps settingslist_apps
Change an app's sound, timeout, corner or voicePUT /v1/apps/settingsherald apps setupdate_app_settings
Remove NAME... in Settings > AppsDELETE /v1/apps/{id}nonedelete_app
Reveal the token file or the log in FindernonenoneUI only

Only in some places:

  • Registering an app has no window: an app registers itself, and Settings > Apps then lists it.
  • Removing an app has no CLI command. Use DELETE /v1/apps/{id} or delete_app.
  • Revealing a file in Finder is a button in the app. The files are plain paths in ~/Library/Application Support/Herald/.

Approvals#

An approval is the user's permission for something that runs code or sends data off the Mac. What each one covers is in Approvals.

What you do in the appHTTPCLIMCP
See an app's command and callback approvalsGET /v1/apps/settingsherald apps settingslist_apps
Revoke with Allow this app to run commands, scripts and ShortcutsPUT /v1/apps/settingsherald apps setupdate_app_settings
See a follow-up's approval stateGET /v1/actions/approvalsherald approvalslist_approvals
See a template's code approvals, Settings > ActionsGET /v1/actions/approvalsherald approvalslist_approvals
Revoke a template's approvalDELETE /v1/actions/approvalsherald approvals revokerevoke_approval
Grant any approvalnonenonenone

Only in some places:

  • Granting an approval exists only in the app, by design: the program that holds the token is the one the approval protects against, so it must not approve itself. Reading and revoking are open.

Cloud relay#

The relay lets agents that run elsewhere send notifications to this Mac. The app window is Settings > Cloud. Cloud explains the relay and these controls. The CLI has no relay commands.

What you do in the appHTTPCLIMCP
Settings > Cloud, status and Update the relayGET /v1/relay/statusnonerelay_status
Open Cloudflare... in the deploy sheetGET /v1/relay/token-urlnonerelay_token_url
Enter the Cloudflare API token in the deploy sheetPOST /v1/relay/tokennonerelay_set_cloudflare_token
Enable relay, RedeployPOST /v1/relay/deploynonerelay_deploy
Pair with a codePOST /v1/relay/pairnonerelay_pair
UnpairPOST /v1/relay/unpairnonerelay_unpair
Advanced fieldsGET /v1/relay/settingsnonerelay_settings
Apply settingsPUT /v1/relay/settingsnonerelay_settings
Load zonesGET /v1/relay/zonesnonerelay_zones
Test connectionPOST /v1/relay/testnonerelay_test
Delete relay from Cloudflare...POST /v1/relay/deletenonerelay_delete
Copy instructionsGET /v1/relay/instructionsnonerelay_instructions
Connected agentsGET /v1/relay/connectorsnonelist_connectors
Create keyPOST /v1/relay/keysnonecreate_agent_key
Revoke a keyDELETE /v1/relay/keys/{id}nonerevoke_agent_key
Reply subscriptionsGET /v1/relay/eventsnonerelay_events
End a subscriptionDELETE /v1/relay/events/subscriptions/{id}nonerelay_remove_event_subscription
Today's usageGET /v1/relay/usagenonerelay_usage

Only in some places:

  • Approving a connector happens only on the Mac, by design: the connector's request is answered in the app with the code the agent printed.
  • Reading the stored Cloudflare token is not possible anywhere. It is written once and never read back.

What only a person can do#

These are left out of the API, the CLI and MCP on purpose.

TaskWhy it stays with the user
Grant an approval: an app's command permission, a callback host, a template's code.The program that holds the token is the one the approval protects against, so it must not approve itself. Reading and revoking are open.
Press a banner button.A button runs code or sends data on the user's behalf.
Approve a connector's request to use the relay.The request is answered on the Mac, with the code the agent printed.
Read the stored Cloudflare token.The token is a secret that is written once and never read back.
Open the Designer, Quick send, History or Settings windows.The API never activates a window or takes focus. Previews and snapshots give an agent what a person would look at.
Mark a notification as opened, as a banner click does.It would act as a click the user did not make.

Settings are validated against one table#

Every general setting is one row in a single table. An unknown key, a wrong type or a value out of range gets 400, and nothing is changed. GET /v1/settings returns the same table as schema, so an agent can discover the keys and their limits without a document.

  • HTTP API: the endpoint blocks every row links to.
  • MCP tools: the tool blocks.
  • CLI: the command blocks.
  • The app: the menu, History and every Settings tab.
  • Actions: the approvals only a person can grant.

Edit this page on GitHub

Esc
Getting started
Guides