three.ws Herald

io.github.nirholasPublished by GitHub account nirholasv0.1.0Updated Oct 24, 2026

Tell your human in person: a 3D character walks onto their open browser tab and says it out loud.

Overview

AI-generated overview

A local MCP server that lets an agent announce a short spoken line through a 3D companion in the user's open browser tab.

What you can do
Send a one-line announcement with importance, tone, gesture and an optional link, delivered by a 3D avatar in an open browser tab and spoken aloud, with a clickable link. Report a finished task with its outcome and duration, letting urgency follow the result so failures cut through quiet hours and successes do not. Verify the API key and delivery rail without interrupting anyone by queuing a test at importance 0.
When to use it
Use it when an agent finishes a long job, a job fails, a decision is needed, something breaks, or money moves, and the user should be told in person rather than in a log. It is not meant for progress updates or anything the person can read later; those belong in a notification inbox.
Requirements
Runs locally via npx, so Node.js is needed. Requires a three.ws API key with the herald:announce scope, or an OAuth access token for the same account, supplied in THREE_WS_API_KEY. Optional THREE_WS_BASE overrides the API base URL and THREE_WS_TIMEOUT_MS sets the per-request timeout. The user must have a browser tab open to receive announcements.
Before you install
The API key is a secret passed by environment variable; revoke it in the three.ws dashboard if leaked. Announcements always go to the key owner's own live sessions, with no recipient parameter, so a leaked key can only disturb that person. Announcements are sent to the three.ws service and expire in about five minutes if no tab is listening. The receiving client applies importance floors, rate limits, dedupe and quiet hours, so low-priority lines are dropped.

Installation

In SourceWeft

  1. Open three.ws Herald in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

@three-ws/herald-mcp

Let your agent tell you something in person.

An MCP server with one idea behind it: when an agent finishes something that mattered, or gets stuck, it should not add a line to a log you will never scroll back to. It should walk up to you and say so.

Wire this in, and it does. Your own 3D companion appears in the corner of whatever browser tab you have open, gestures, and says the line out loud, with a link to click through.

you: run the migration, then the backfill, and tell me when it's doneagent: [runs for 22 minutes]       [calls announce_result: task "the backfill", outcome succeeded, 1320s]your browser: your avatar walks on: "the backfill finished in 22m"

Tools

ToolWhat it does
announceSay one line, with importance (0-100), tone, a gesture, and an optional link.
announce_resultReport a finished task. The urgency is chosen from the outcome, so a failure cuts through quiet hours and a success does not.
check_railProve the key and the rail work, without interrupting anybody (queues at importance 0, which every client drops).

Install

sh
npx -y @three-ws/herald-mcp

Claude Code:

sh
claude mcp add herald -e THREE_WS_API_KEY=sk_live_... -- npx -y @three-ws/herald-mcp

Claude Desktop / Cursor (mcp.json):

json
{  "mcpServers": {    "herald": {      "command": "npx",      "args": ["-y", "@three-ws/herald-mcp"],      "env": { "THREE_WS_API_KEY": "sk_live_..." }    }  }}

The key

Create one at three.ws/dashboard/developers with the herald:announce scope, and put it in THREE_WS_API_KEY.

An announcement is always delivered to the key owner's own live sessions. There is no recipient parameter: this server cannot be pointed at anybody else, so the worst a leaked key can do is annoy the person who leaked it. Revoke it in the same place.

VariableRequiredDefaultNotes
THREE_WS_API_KEYyesAPI key with herald:announce, or an OAuth access token. Aliases: THREE_WS_TOKEN, THREE_WS_BEARER.
THREE_WS_BASEnohttps://three.wsOverride for self-hosting or a preview deployment.
THREE_WS_TIMEOUT_MSno20000Per-request timeout.

When to use it (and when not to)

Announcements are scarce on purpose. The receiving client applies an importance floor, a rate limit, dedupe, quiet hours, and a freshness window, so anything that does not clear the bar is dropped rather than queued. That is the feature: an interruption only works while it is rare.

Good: a long job finished, a job failed, a decision is needed, something broke, money moved.

Bad: progress updates, "starting step 3 of 7", anything the person can read later. Those belong in the notification inbox (@three-ws/notifications-mcp).

If nothing is open to hear it, the line expires in about five minutes. The rail is a live channel, not an archive.

Example calls

jsonc
// something broke, and it should wake somebody up{ "name": "announce", "arguments": {    "text": "The payments worker has been failing for 10 minutes",    "from": "watchdog", "importance": 95, "tone": "error",    "url": "https://three.ws/dashboard", "key": "payments-worker-down" } }
// a long task finished, and it should not{ "name": "announce_result", "arguments": {    "task": "the nightly backfill", "outcome": "succeeded", "seconds": 1320 } }
// wiring check{ "name": "check_rail", "arguments": { "note": "claude-code" } }

How it reaches a browser

POST /api/herald/announce queues the line on the account's rail; the page listens over SSE and hands it to @three-ws/herald, which decides whether it clears the person's own rules and then delivers it through the 3D companion (or an accessible card when there is no GPU).

Try the whole loop, including the rules engine, at three.ws/herald.

License

Apache-2.0.

Source: packages/herald-mcp/README.md at commit 8a1fd5d

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.0LatestSep 30, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts