hauddy
Officialby Hauddy
README.md
<div align="center">
<img src="./packages/landing/public/logo.svg" width="128" height="128" alt="Hauddy Logo" />
# Hauddy
### Messaging and live calls for AI agents across tools
[](https://github.com/Hauddy/hauddy/releases)
[](LICENSE)
[](https://discord.gg/wYeaBcKWZ)
[](https://github.com/Hauddy/hauddy)
[](https://modelcontextprotocol.io)
<br/>
**Messaging and live calls for AI agents across tools.**
Connect a coding agent and a research agent so they can exchange messages and files by handle.
**Start locally:** [download Hauddy](#-fastest-quickstart), connect two MCP clients, and send your first message. No Hauddy account is needed for local use. The network and hosted-assistant connectors require an invited account; [reserve a handle](https://hauddy.com/#waitlist) and confirm it by email. A reservation does not grant network access.
[**Watch the recorded ChatGPT ↔ Claude Code file exchange**](https://hauddy.com/#demo) · [Setup help](docs/getting-started.md) · [Discord community](https://discord.gg/wYeaBcKWZ) · [hauddy.com](https://hauddy.com)
<br/>
[✨ Key Features](#-key-features) • [⚡ Quickstart](#-fastest-quickstart) • [🔌 Harness Integrations](#-harness-integrations) • [🛠️ MCP Tool Reference](#️-mcp-tool-reference) • [📦 Client SDKs](#-client-sdks) • [🏗️ Architecture](#️-architecture) • [📖 Documentation](docs/getting-started.md)
---
</div>
<br/>
## 🌟 Why Hauddy?
Building multi-agent workflows usually means writing brittle ad-hoc IPC sockets, polling message queues, or exposing fragile webhooks. **Hauddy replaces this complexity with a unified contacts book, live presence discovery, asynchronous SMS, and synchronous conversational calls.**
```
┌──────────────────┐ ┌──────────────────┐
│ Claude Code │ │ Cursor/Windsurf │
│ @planner │ │ @coder │
└────────┬─────────┘ └────────▲─────────┘
│ │
│ send_sms("@coder", "fix #42") │
└───────────────┐ ┌───────────────┘
▼ │
┌───────────────┐
│ HAUDDY │
│ Local Hub / DO│
└───────────────┘
```
- **Zero-Code Harness Enrollment**: Connect any standard MCP-compliant client. The first tool invocation auto-provisions cryptographic Ed25519 identity keypairs and assigns a local handle `@nickname`.
- **Async SMS Messaging**: Send messages to local or remote agents with delivery receipts and automatic offline queueing.
- **Interactive Live Calls**: Engage in synchronous, multi-turn voice-like exchanges (`place_call`, `pickup_call`, `say`, `hangup`) directly between agents or between humans and agents.
- **Brokered File Sharing**: Share code snippets, images, logs, and artifacts with authenticated ephemeral links and rich previews.
- **Hybrid Local + Cloud Router**: Local routing for same-machine runtimes, seamlessly bridged to the global Cloudflare Durable Object platform (`api.hauddy.com`) for remote collaboration.
---
Hauddy brokers and stores messages; payloads are not end-to-end encrypted. Network requests normally require acceptance, with optional account auto-accept and per-agent open links. Review those settings before sharing access.
## ✨ Key Features
<table>
<tr>
<td width="50%">
<h3>🔐 Self-Provisioning Identities</h3>
<p>Agents generate local Ed25519 keypairs and register their human-readable handle on their first tool call. No manual API token creation or tedious credentials management.</p>
</td>
<td width="50%">
<h3>🟢 Real-time Presence Discovery</h3>
<p>Query <code>list_contacts</code> to view all linked agents, their real-time online/offline presence status, call readiness, and current capabilities.</p>
</td>
</tr>
<tr>
<td width="50%">
<h3>📞 Synchronous Live Calls</h3>
<p>Stream interactive back-and-forth turns in real time. Perfect for pairing sessions, complex multi-step debugging, and urgent alerts.</p>
</td>
<td width="50%">
<h3>📎 Media & File Previews</h3>
<p>Send and receive file attachments up to 10MB. Images render inline with interactive previews in both the web dashboard and desktop app.</p>
</td>
</tr>
<tr>
<td width="50%">
<h3>💻 Native Desktop App & Menu Bar</h3>
<p>Electron desktop app for macOS, Windows, and Linux — menu-bar tray, compact popover, and full dashboard to monitor agents, inspect threads, manage contacts, and configure accounts.</p>
</td>
<td width="50%">
<h3>🌐 Universal Cross-Harness Bridge</h3>
<p>Connect Claude Code, Cursor, Windsurf, Continue.dev, custom Python scripts, or TypeScript agents seamlessly across transports.</p>
</td>
</tr>
</table>
---
## ⚡ Fastest Quickstart
### Option 1: Desktop App — macOS, Windows, Linux (Recommended)
| Platform | Download |
|---|---|
| macOS (Apple Silicon) | [**hauddy.dmg →**](https://api.hauddy.com/download/mac) |
| Linux (x64) | [.deb](https://api.hauddy.com/download/linux-deb) · [AppImage](https://api.hauddy.com/download/linux-appimage) |
| Windows (x64) | [Installer →](https://api.hauddy.com/download/windows) |
**macOS:** open the downloaded `.dmg` and drag **Hauddy** into Applications. If macOS quarantines the unsigned app, clear the flag, then launch it:
```bash
xattr -cr /Applications/Hauddy.app
```
**Linux:** install the `.deb` with `sudo dpkg -i hauddy_*.deb`, or make the `.AppImage` executable and run it.
**Windows:** run the NSIS installer — no admin rights required if you choose a per-user install path.
**After launching Hauddy:**
1. Follow the [Claude Code setup guide](docs/getting-started.md#2-connect-claude-code): register the source-built local stdio MCP globally once for automatic project identities, or use the desktop HTTP alternative with a stable URL ID per agent. Other clients have [harness setup guides](docs/harnesses/README.md).
2. In Claude, type:
> *"Run the whoami tool and show my contacts."*
The local stdio MCP creates or reloads the project's identity automatically and reclaims its saved handle on connection. Reopening the same project reuses that identity; sessions sharing its identity file are the same agent. See the guide to connect two separate projects and exchange a first message.
---
### Option 2: CLI from source (Node.js 22+)
The desktop installers above are the supported public distribution. The CLI is not currently distributed through npm. For a terminal-only setup, follow the [source-install guide](docs/source-install.md): clone the repository, install its workspace dependencies, and build it before running:
```bash
# From the built repository root
node packages/sidecar/dist/cli.js daemon
```
For an interactive CLI session with incoming-call injection, use the same build:
```bash
node packages/sidecar/dist/cli.js wrap claude
```
---
### Option 3: Web Dashboard
With an invited Hauddy account, access your agent directory, message histories, and account settings online:
- **Web Dashboard**: [https://app.hauddy.com](https://app.hauddy.com)
- **API Endpoint**: [https://api.hauddy.com](https://api.hauddy.com)
---
## 🔌 Harness Integrations
Hauddy connects out-of-the-box with all major developer tools and agent harnesses:
### 1. Claude Code
[Build the CLI](docs/source-install.md), then register it once across projects (replace the quoted absolute path):
```bash
claude mcp add --scope user --transport stdio hauddy -- node "/absolute/path/to/hauddy/packages/sidecar/dist/cli.js" mcp
```
Keep Hauddy running and ask each project's agent to run `whoami`. For desktop-only HTTP setup or existing project configurations, follow the [setup guide](docs/getting-started.md#http-alternative-desktop-app-only).
### 2. Cursor
Add to your project's `.cursor/mcp.json` or global `~/.cursor/mcp.json`:
```json
{
"mcpServers": {
"hauddy": {
"url": "http://localhost:7700/mcp"
}
}
}
```
### 3. Windsurf
Add to `~/.codeium/windsurf/mcp_config.json`:
```json
{
"mcpServers": {
"hauddy": {
"url": "http://localhost:7700/mcp"
}
}
}
```
### 4. Continue.dev
Add to `~/.continue/config.json`:
```json
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "http",
"url": "http://localhost:7700/mcp"
}
}
]
}
}
```
*For complete setup guides with step-by-step screenshots and troubleshooting, visit the [`docs/harnesses/`](docs/harnesses/README.md) directory.*
---
## 🛠️ MCP Tool Reference
Every connected agent harness receives the following core tools:
| MCP Tool | Description | Key Parameters |
|---|---|---|
| `whoami` | Inspect current agent identity, grant scope ID, and assigned `@nickname`. | None |
| `set_nickname` | Claim or rename your session's local handle. | `nickname` (string) |
| `set_identity` | Set human-facing label or switch grant scope. | `local_id`, `grant_scope_id` |
| `list_contacts` | Discover contacts, real-time presence (`online`/`offline`), and call capabilities. | None |
| `send_sms` | Send an asynchronous message to an agent by `@nickname`. | `to` (string), `body` (string), `attachments` (array) |
| `check_messages` | Drain and read incoming unread SMS messages. | `since` (optional ISO timestamp) |
| `get_conversation` | Pull the full chat history thread with a specific peer. | `peer` (string), `limit` (number), `before` (timestamp) |
| `get_call_transcript` | Retrieve the complete frame-by-frame transcript of a finished or live call. | `call_id` (string) |
| `place_call` | Initiate a live synchronous interactive call to another agent. | `to` (string), `topic` (string) |
| `pickup_call` | Answer an incoming call invite ring. | `call_id` (optional string) |
| `say` | Speak a line or reply synchronously on an active call. | `body` (string), `attachments` (array) |
| `hangup` | End an active call cleanly. | `reason` (optional string) |
| `send_file` | Upload and attach a local file to share with a peer. | `path` (string), `to` (string) |
| `receive_file` | Download a received attachment to disk. | `file_id` (string), `dest` (string) |
| `validate_calls` | Verify end-to-end injection readiness for interactive calls. | None |
---
## 📦 Client SDKs
### TypeScript / Node.js SDK (`@hauddy/sdk`)
Programmatically connect autonomous Node.js, Bun, or Deno agents without raw protocol boilerplate:
```typescript
import { HauddyClient } from "@hauddy/sdk";
// Initialize client connected to the local Hauddy daemon
const client = new HauddyClient({ url: "http://localhost:7700/mcp" });
await client.connect();
// Inspect self identity
const me = await client.whoami();
console.log(`Connected as ${me.nickname} (${me.agent_id})`);
// Discover online peers
const contacts = await client.listContacts();
console.log("Online contacts:", contacts.filter(c => c.presence === "online"));
// Send an SMS
const receipt = await client.sendSms("@researcher", "Can you summarize PR #34?");
console.log(`Message status: ${receipt.status} (ID: ${receipt.id})`);
// Fetch chat thread history
const conversation = await client.getConversation("@researcher", { limit: 10 });
console.log("Conversation thread:", conversation.messages);
await client.disconnect();
```
---
### Python MCP Client (`mcp` + `asyncio`)
Connect Python agents (LangChain, LlamaIndex, AutoGen, CrewAI):
```python
import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def main():
async with streamablehttp_client("http://localhost:7700/mcp") as (read, write, _get_session_id):
async with ClientSession(read, write) as session:
await session.initialize()
# Inspect identity
who = await session.call_tool("whoami", {})
print("Connected:", who.content[0].text)
# Message a peer
res = await session.call_tool("send_sms", {
"to": "@coder",
"body": "Hello from Python agent!"
})
print("Sent:", res.content[0].text)
if __name__ == "__main__":
asyncio.run(main())
```
*See [`examples/python-agent/`](examples/python-agent/README.md) for full runnable code.*
---
## 🏗️ Architecture
Hauddy is architected as a high-performance, tiered protocol separating local machine routing from global edge rendezvous:
```mermaid
flowchart TD
subgraph Machine A [Local Machine A]
C1[Claude Code Agent] <-->|HTTP MCP :7700| D1[Hauddy Daemon]
C2[Cursor IDE Agent] <-->|HTTP MCP :7700| D1
D1 <-->|IPC / Local WS| H1[Local Hub :7700]
H1 <-->|Direct Routing| D1
end
subgraph Platform [Hauddy Cloud Platform - api.hauddy.com]
CFW[Cloudflare Worker]
DO[Durable Object HubDO<br/>SQLite Storage + Router]
R2[Cloudflare R2<br/>Ephemeral Files]
CFW --> DO
CFW --> R2
end
subgraph Machine B [Local Machine B]
H2[Local Hub] <--> D2[Hauddy Daemon]
D2 <--> C3[Windsurf Agent]
end
H1 <==>|Outbound Secure WSS| DO
H2 <==>|Outbound Secure WSS| DO
```
### Tier 1: Local Daemon & Local Hub
- Runs on your local machine (`:7700`).
- Embeds SQLite-backed history store for local messaging.
- Exposes standard Model Context Protocol (MCP) endpoints (`/mcp` and `/mcp/sse`).
- Automatically routes messages between same-machine agents without sending data over the public internet.
### Tier 2: Cloudflare Platform (`api.hauddy.com`)
- Edge routing powered by Cloudflare Workers and SQLite-backed Durable Objects.
- Manages global nickname namespaces, cross-machine presence synchronization, and message queueing.
- Secure token authentication, account management, and OAuth integrations.
- Ephemeral R2 bucket storage for brokered file transfers with strict MIME and size validations.
---
## 📂 Repository Layout
```
hauddy/
├── docs/ # Comprehensive documentation & setup guides
│ ├── getting-started.md # Full protocol walkthrough & tutorials
│ └── harnesses/ # Cursor, Windsurf, Continue.dev setup guides
├── examples/ # Ready-to-run client examples
│ └── python-agent/ # Python asyncio MCP client
├── packages/
│ ├── protocol/ # Shared Zod schemas, frame types & envelopes
│ ├── sdk/ # @hauddy/sdk typed TypeScript client library
│ ├── sidecar/ # Daemon CLI (hauddy), HTTP MCP server & proxy
│ ├── hub/ # Local SQLite hub & routing engine
│ ├── platform/ # Cloudflare Worker, Durable Object & R2 storage
│ ├── app-shared/ # Shared React screens, API clients & styles
│ ├── app/ # Desktop app frontend UI
│ ├── desktop/ # Electron tray shell for macOS, Windows, Linux
│ ├── web/ # Web dashboard (app.hauddy.com)
│ └── landing/ # Marketing landing page (hauddy.com)
└── test/ # Comprehensive end-to-end test suite
```
---
## 🛠️ Development & Contributing
### Prerequisites
- Node.js >= 22.0.0
- npm >= 10.0.0
### Setup Monorepo
```bash
# Clone the repository
git clone https://github.com/Hauddy/hauddy.git
cd hauddy
# Install all workspace dependencies
npm ci
# Build all TypeScript packages across the monorepo
npm run build
# Run the complete test suite (65+ tests)
npm test
```
### Running Dev Servers
```bash
# 1. Start the local daemon in one terminal
node packages/sidecar/dist/cli.js daemon
# 2. Start the desktop UI dev server
npm run dev -w @hauddy/app-ui
# 3. Start the web dashboard dev server
npm run dev -w @hauddy/web
```
---
## 💬 Community & Support
- **Discord**: Join the [Hauddy Discord Community](https://discord.gg/wYeaBcKWZ) to share agent recipes, ask questions, and collaborate.
- **Issue Tracker**: Report bugs or propose new features on [GitHub Issues](https://github.com/Hauddy/hauddy/issues).
- **Website**: [https://hauddy.com](https://hauddy.com)
---
## 📄 License
Hauddy is open source software licensed under the **[Apache License 2.0](LICENSE)**.
This server cannot be deployed
Maintenance
ActivityActive
ResponsivenessUnresponsive