AlphornAlphorn Docs

MCP Server

Alphorn MCP server: give Claude Code, Claude Desktop, Cursor, Codex, and other MCP clients a send_notification tool that reaches Slack, Telegram, email, or SMS.

The Alphorn MCP server gives any MCP client a send_notification tool. Unlike hooks, which fire on fixed events, the agent decides when a notification is worth sending: when a long task finishes, when it is blocked on a decision, or when you ask it to ping you.

The package is @alphorn/mcp and runs locally with npx (Node.js 20 or later).

Configuration

Create a webhook (see Webhooks) and pass its Endpoint URL (plus its API key, if you switched on Require API key) as environment variables:

VariableValue
ALPHORN_WEBHOOK_URLEndpoint URL, for example https://app.alphorn.dev/n/V1StGXR8_Z5jdHi6B-myT. Self-hosted instances use their own base URL.
ALPHORN_API_KEYWebhook API key (alp_...). Leave it unset if the webhook does not require a key.

Claude Code

claude mcp add alphorn -s user \
  -e ALPHORN_WEBHOOK_URL=https://app.alphorn.dev/n/V1StGXR8_Z5jdHi6B-myT \
  -e ALPHORN_API_KEY=alp_... \
  -- npx -y @alphorn/mcp

Claude Desktop (one-click bundle)

Download alphorn.mcpb from the latest release and open it. Claude Desktop asks for the Endpoint URL and API key and installs the server.

Claude Desktop, Cursor, and other clients

Add to claude_desktop_config.json, ~/.cursor/mcp.json, or your client's MCP config:

{
  "mcpServers": {
    "alphorn": {
      "command": "npx",
      "args": ["-y", "@alphorn/mcp"],
      "env": {
        "ALPHORN_WEBHOOK_URL": "https://app.alphorn.dev/n/V1StGXR8_Z5jdHi6B-myT",
        "ALPHORN_API_KEY": "alp_..."
      }
    }
  }
}

OpenAI Codex CLI

# ~/.codex/config.toml
[mcp_servers.alphorn]
command = "npx"
args = ["-y", "@alphorn/mcp"]
env = { ALPHORN_WEBHOOK_URL = "https://app.alphorn.dev/n/V1StGXR8_Z5jdHi6B-myT", ALPHORN_API_KEY = "alp_..." }

The send_notification tool

ArgumentTypeRequiredDescription
messagestringyesWhat happened and what the agent needs from you (max 4,000 characters)
titlestringnoShort title, e.g. my-app - tests passing (max 200 characters)
priorityinteger 1-5no2 = finished, 3 = needs input, 4 = blocked or failed, 5 = urgent
tagsstring[]noTags to filter and route on in Alphorn, e.g. ["ai-agent", "completed"]

Use Alphorn's filters to decide where each notification goes, for example SMS only for priority 4 and above.

The tool returns the messageId on success. On errors it tells the agent what went wrong in plain words (for example an invalid API key, a disabled webhook, or an exhausted quota), so the agent can report it instead of retrying.

Route notifications with filters, for example Priority greater than 3 to SMS and Tags has any of completed to Slack. See AI Agent Notifications for the recommended priorities and tags.

On this page