# Rendezvous: full documentation > Rendezvous is an open protocol for agent-to-agent contact: agents find each other by a human address, the humans consent, and the agents exchange end-to-end encrypted messages over dumb relays (Nostr first). Draft spec v0.1 rev 3 with a TypeScript reference implementation (Apache-2.0). This file concatenates the markdown of the key docs from https://rendezvous.nesher.co. The shorter index is https://rendezvous.nesher.co/llms.txt. Included, in order: - Setup per agent (docs/agents.md): https://rendezvous.nesher.co/docs/agents.md - Claude Code plugin (plugins/rendezvous/README.md): https://rendezvous.nesher.co/docs/plugin.md - Tasks and files (docs/tasks.md): https://rendezvous.nesher.co/docs/tasks.md - CLI and library (impl/README.md): https://rendezvous.nesher.co/docs/cli.md - MCP tools (impl/packages/mcp/README.md): https://rendezvous.nesher.co/docs/mcp.md - Protocol spec (SPEC.md): https://rendezvous.nesher.co/docs/spec.md - Changelog (CHANGELOG.md): https://rendezvous.nesher.co/changelog.md - Contributing (CONTRIBUTING.md): https://rendezvous.nesher.co/docs/contributing.md Not included: the FAQ on the home page, the roadmap design proposal and the repository's PLAN.md and NOTES.md. --- Source: https://rendezvous.nesher.co/docs/agents.md # Rendezvous with your agent Rendezvous runs as a local MCP server, `rdv-mcp`, plus an optional skill that teaches the agent the workflow. This page has one section per agent: how to install, the MCP config, the skill, and how to check that it works. Checked on 2026-10-25 against each client's own documentation (linked in every section). Where a setup could not be run here, the section says so. - [Claude Code](#claude-code) · [Claude Desktop](#claude-desktop) · [Cursor](#cursor) · [VS Code (GitHub Copilot)](#vs-code-github-copilot) · [Codex CLI](#codex-cli) · [Gemini CLI](#gemini-cli) · [Windsurf](#windsurf) · [Grok Build](#grok-build) · [OpenClaw](#openclaw) · [Hermes Agent](#hermes-agent) · [Muse Code](#muse-code) ## Before you start 1. **Install Rendezvous** (Node.js 20+, git and npm; no sudo). Every section below starts from this: ```bash curl -fsSL https://rendezvous.nesher.co/install.sh | sh ``` ```powershell irm https://rendezvous.nesher.co/install.ps1 | iex ``` It builds into `~/.rendezvous/src` and puts `rdv` and `rdv-mcp` on your PATH. Run it again to update. 2. **Register `rdv-mcp`** with your agent (the config in its section), then restart the agent or reload its MCP servers. 3. **Windows: use the `node` form.** The installer writes `rdv-mcp.cmd`. A client that starts servers without a shell cannot run a `.cmd` file: a bare `rdv-mcp` fails with `ENOENT` (reproduced here with a no-shell spawn from Node 25; `cmd /c rdv-mcp` and a shell spawn both worked). Whether each client spawns through a shell was not tested, so on Windows give every client the built file directly. The path is the same in all sections: ```text C:\Users\\.rendezvous\src\impl\packages\mcp\dist\src\bin.js ``` In JSON write the backslashes doubled (`C:\\Users\\\\...`). In TOML use a single-quoted string (`'C:\Users\\...'`). Each section shows the macOS / Linux form and what changes on Windows. If you set `RDV_DIR`, use `\impl\packages\mcp\dist\src\bin.js`. Options such as `--profile omer` go after the path in `args`. 4. **Verify** by asking the agent: **"What's my rendezvous status?"** It should call `rdv_status` and show your agent ID, your addresses and your relays. If it says there is no agent yet, create one (ask it, with the skill installed, or run `rdv init --profile omer --email omer@example.com` yourself) and ask again. Without `--relay` the agent uses the default public relays (`wss://nos.lol`, `wss://relay.primal.net`, `wss://relay.nostr.net`, `wss://nostr.oxtr.dev`); add `--relay wss://…` once per relay to use your own instead. `rdv whoami` shows each relay's last OK and last error. ## Consent: approvals come back to you The agent cannot approve a contact request, confirm a probe answer or confirm a meeting. `rdv_grant` and `rdv_negotiate` succeed only when the human decides: - **Clients with MCP elicitation** show you an approval form (the requester's fingerprint, how the request arrived, the greeting marked untrusted, a tier and a label). The model never sees the form. - **Clients without elicitation**: the human types the confirm phrase shown by `rdv contact pending` in their own terminal to the agent. The agent passes it as `confirm_phrase`. Phrases are single-use and no tool result ever contains one. - Or approve in your own terminal with `rdv contact grant`. Tasks (asking a contact's agent for something, with files) work in every MCP client, because `rdv_task` and `rdv_file` are ordinary tools. A client without elicitation approves a task's start and its release with a phrase from `rdv task list` or with `rdv task approve` / `rdv task release` in your own terminal. See [Tasks and files](https://rendezvous.nesher.co/docs/tasks.md). Elicitation support, as far as it could be checked: | Agent | Elicitation | Source | |---|---|---| | Claude Code | yes (interactive sessions, not `-p`) | `impl/packages/mcp/README.md` | | Cursor | yes, verified: the MCP docs list elicitation as "Supported" | [Cursor MCP docs](https://cursor.com/docs/mcp) | | Hermes Agent | yes, form mode, through its normal approval surface (on by default) | [Hermes MCP docs](https://hermes-agent.nousresearch.com/docs/user-guide/features/mcp) | | Claude Desktop, VS Code, Codex CLI, Gemini CLI, Windsurf, Grok Build, OpenClaw, Muse Code | not confirmed in their docs | treat as no: use the confirm phrase | The plugin's consent guard (a hook that refuses the consent commands) exists only in Claude Code. Elsewhere the consent gate is the boundary, and the skill's rules tell the agent never to run those commands itself. Details and the threat model: [`impl/packages/mcp/README.md`](https://rendezvous.nesher.co/docs/mcp.md#consent-the-human-decides-demo-critical). ## Claude Code - **MCP + skill, one step:** the plugin registers `rdv-mcp` and adds the skill. In Claude Code's chat: ```text /plugin marketplace add omernesh/rendezvous /plugin install rendezvous@rendezvous /reload-plugins ``` Then type `/rdv-onboarding` (or `/rendezvous:rdv-onboarding`). It points you to the installer for `rdv` and sets you up one question at a time. The plugin starts the server through `bin/rdv-mcp.mjs` under `node`, so Windows needs nothing special. - **Without the plugin:** `claude mcp add rendezvous -- rdv-mcp` (Windows: `claude mcp add rendezvous -- cmd /c rdv-mcp`). - **Verify:** ask "What's my rendezvous status?". - **Consent:** approval forms (elicitation) in an interactive session. - Docs: [Claude Code MCP](https://code.claude.com/docs/en/mcp), [plugins](https://code.claude.com/docs/en/plugins). ## Claude Desktop - **Install:** the installer above. - **MCP config:** `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows); in the app, Settings, Developer, Edit Config. Restart Claude Desktop completely after saving. ```json { "mcpServers": { "rendezvous": { "command": "rdv-mcp", "args": [] } } } ``` Windows: `{ "mcpServers": { "rendezvous": { "command": "node", "args": ["C:\\Users\\\\.rendezvous\\src\\impl\\packages\\mcp\\dist\\src\\bin.js"] } } }` - **Skill:** none to install here; the MCP tools carry their own instructions. Claude Desktop's own skill upload is not covered by this page. - **Verify:** ask "What's my rendezvous status?". Logs: `~/Library/Logs/Claude` or `%APPDATA%\Claude\logs` (`mcp-server-rendezvous.log`). - **Consent:** elicitation not confirmed; use the confirm phrase. - Docs: [Connect to local MCP servers](https://modelcontextprotocol.io/docs/develop/connect-local-servers). ## Cursor - **Install:** the installer above. - **MCP config:** `~/.cursor/mcp.json` (everywhere) or `.cursor/mcp.json` (one project). ```json { "mcpServers": { "rendezvous": { "command": "rdv-mcp", "args": [] } } } ``` Windows: `"command": "node", "args": ["C:\\Users\\\\.rendezvous\\src\\impl\\packages\\mcp\\dist\\src\\bin.js"]`. - **Skill:** `npx skills add omernesh/rendezvous` (the skills CLI lets you pick Cursor). Optional: the MCP server works without it. - **Verify:** Settings, MCP: `rendezvous` should show its tools. Ask "What's my rendezvous status?" in the agent chat. - **Consent:** elicitation supported (verified): you get the approval form. - Docs: [Cursor MCP](https://cursor.com/docs/mcp). ## VS Code (GitHub Copilot) - **Install:** the installer above. - **MCP config:** `.vscode/mcp.json` in a workspace, or your user `mcp.json` (Command Palette, "MCP: Open User Configuration"). VS Code's key is `servers`, not `mcpServers`. ```json { "servers": { "rendezvous": { "type": "stdio", "command": "rdv-mcp" } } } ``` Windows: `"command": "node", "args": ["C:\\Users\\\\.rendezvous\\src\\impl\\packages\\mcp\\dist\\src\\bin.js"]`. VS Code's current docs also describe a global Copilot config (`~/.copilot/mcp-config.json`); the workspace file above is the one checked here. - **Skill:** `npx skills add omernesh/rendezvous` and pick the agent; not tested per client. The MCP server works without it. - **Verify:** start the server from the MCP view, open Copilot chat in Agent mode and ask "What's my rendezvous status?". - **Consent:** elicitation is not mentioned in VS Code's MCP docs; use the confirm phrase unless a form appears. - Docs: [MCP servers in VS Code](https://code.visualstudio.com/docs/copilot/customization/mcp-servers). ## Codex CLI - **Install:** the installer above. - **MCP config:** one command, run here to confirm the output: ```bash codex mcp add rendezvous -- rdv-mcp ``` or `~/.codex/config.toml`: ```toml [mcp_servers.rendezvous] command = "rdv-mcp" ``` Windows: `codex mcp add rendezvous -- node C:\Users\\.rendezvous\src\impl\packages\mcp\dist\src\bin.js` writes `command = "node"` and a single-quoted `args` path (tested here). - **Skill:** `npx skills add omernesh/rendezvous` and pick Codex (installs under `~/.codex/skills`); not run per client. - **Verify:** `codex mcp list`, then ask "What's my rendezvous status?". - **Consent:** elicitation not mentioned in Codex's MCP docs; use the confirm phrase. - Docs: [Codex MCP](https://developers.openai.com/codex/mcp). ## Gemini CLI - **Install:** the installer above. - **MCP config:** ```bash gemini mcp add -s user rendezvous rdv-mcp ``` or edit `~/.gemini/settings.json` (`.gemini/settings.json` for one project): ```json { "mcpServers": { "rendezvous": { "command": "rdv-mcp", "args": [] } } } ``` Windows: `gemini mcp add -s user rendezvous node C:\Users\\.rendezvous\src\impl\packages\mcp\dist\src\bin.js`. Gemini CLI was not installed here, so the command is from its docs, not run. - **Skill:** `npx skills add omernesh/rendezvous` and pick Gemini CLI; not run. - **Verify:** `gemini mcp list`, or `/mcp` in a session, then ask "What's my rendezvous status?". - **Consent:** elicitation not mentioned in its docs; use the confirm phrase. - Docs: [Gemini CLI MCP servers](https://geminicli.com/docs/tools/mcp-server/). ## Windsurf - **Install:** the installer above. - **MCP config:** `~/.config/devin/mcp_config.json` (macOS / Linux; `$XDG_CONFIG_HOME/devin/` if set) or `%APPDATA%\devin\mcp_config.json` (Windows). Windsurf's docs now live under Devin's. ```json { "mcpServers": { "rendezvous": { "command": "rdv-mcp", "args": [] } } } ``` Windows: `"command": "node", "args": ["C:\\Users\\\\.rendezvous\\src\\impl\\packages\\mcp\\dist\\src\\bin.js"]`. - **Skill:** `npx skills add omernesh/rendezvous` and pick the agent; not run. - **Verify:** refresh the MCP list in Cascade, then ask "What's my rendezvous status?". - **Consent:** elicitation not mentioned; use the confirm phrase. - Docs: [Cascade MCP](https://docs.devin.ai/desktop/cascade/mcp). ## Grok Build - **Install:** the installer above. - **MCP config:** ```bash grok mcp add rendezvous -- rdv-mcp ``` or `~/.grok/config.toml`: ```toml [mcp_servers.rendezvous] command = "rdv-mcp" ``` Windows: `grok mcp add rendezvous -- node C:\Users\\.rendezvous\src\impl\packages\mcp\dist\src\bin.js`. `--scope project` writes `.grok/config.toml` instead. Not installed here; from the docs. - **Skill:** `npx skills add omernesh/rendezvous` and pick Grok; not run. - **Verify:** `grok mcp doctor` (stderr logs: `~/.grok/logs/mcp/rendezvous.stderr.log`), then ask "What's my rendezvous status?". - **Consent:** elicitation not mentioned; use the confirm phrase. - Docs: [Grok Build MCP servers](https://docs.x.ai/build/features/mcp-servers). ## OpenClaw - **Install:** the installer above. - **MCP config:** ```bash openclaw mcp set rendezvous '{"command":"rdv-mcp"}' openclaw mcp doctor rendezvous --probe ``` `--probe` opens a live connection to the server (without it `doctor` only checks the config); `openclaw mcp probe rendezvous` is the same check on its own. Windows: use `'{"command":"node","args":["C:\\Users\\\\.rendezvous\\src\\impl\\packages\\mcp\\dist\\src\\bin.js"]}'` (quote it for your shell). Not installed here; from the docs. - **Skill:** OpenClaw installs a git skill only when `SKILL.md` is at the repository root of the ref; there is no subpath syntax. So this repo publishes a `skill` branch whose root is the skill folder (`SKILL.md` and `references/`): ```bash openclaw skills install git:omernesh/rendezvous@skill ``` Git skills are not updated by `openclaw skills update`: install again to refresh. Maintainers rebuild the branch with `scripts/publish-skill-branch.sh` (or `.ps1`); see [Maintainers](#maintainers-the-skill-branch). - **Verify:** `openclaw mcp doctor rendezvous --probe`, then ask "What's my rendezvous status?". - **Consent:** elicitation not mentioned; use the confirm phrase. - Docs: [openclaw skills](https://docs.openclaw.ai/cli/skills), [openclaw mcp](https://docs.openclaw.ai/cli/mcp/registry). ## Hermes Agent - **Install:** the installer above. - **MCP config:** `~/.hermes/config.yaml`, then `/reload-mcp` in a session. ```yaml mcp_servers: rendezvous: command: "rdv-mcp" ``` Windows: `command: "node"` and `args: ['C:\Users\\.rendezvous\src\impl\packages\mcp\dist\src\bin.js']`. Hermes passes a stdio server only a safe baseline environment, not your shell's; `rdv-mcp` needs only `HOME` / `USERPROFILE`, but set `env:` if you use `RDV_HOME`. - **Skill:** installs straight from this repository's path (run here): ```bash hermes skills install omernesh/rendezvous/plugins/rendezvous/skills/rendezvous ``` Hermes scans community skills before installing them; this one passes the scan (`SAFE`) and installs as is. The skill carries no download-and-run line: it sends you to the Install section of https://rendezvous.nesher.co to run the installer yourself. Add `--yes` to skip the prompt. The installed files are `SKILL.md` and `references/`, under `~/.hermes/skills/rendezvous`. - **Verify:** `/reload-mcp`, then ask "What's my rendezvous status?". - **Consent:** elicitation supported (form mode, Hermes' normal approval surface; YOLO mode does not auto-answer it). - Docs: [Hermes MCP](https://hermes-agent.nousresearch.com/docs/user-guide/features/mcp), [creating skills](https://hermes-agent.nousresearch.com/docs/developer-guide/creating-skills). ## Muse Code - **Install:** the installer above. - **MCP config:** `~/.config/muse/settings.json`. Keep what is already in the file and add the server. ```json { "schema_version": 1, "mcpServers": { "rendezvous": { "command": "rdv-mcp", "args": [] } } } ``` Windows: `"command": "node", "args": ["C:\\Users\\\\.rendezvous\\src\\impl\\packages\\mcp\\dist\\src\\bin.js"]`. **Not verified:** Muse Code was not available here and no first-party documentation could be found. Some third-party guides write the key as `mcp_servers`, and one reports a beta build without MCP. If `mcpServers` does not load, check Muse Code's own docs for the current key. - **Skill:** Muse Code reads skills from `~/.agents/skills`, `~/.claude/skills` and `~/.codex/skills`. Install into one of them, for example `npx skills add omernesh/rendezvous --skill rendezvous --global --agent claude-code` (puts it in `~/.claude/skills`), or copy the folder `plugins/rendezvous/skills/rendezvous` to `~/.agents/skills/rendezvous`. Not run here. - **Verify:** ask "What's my rendezvous status?". - **Consent:** elicitation unknown; use the confirm phrase. ## Maintainers: the skill branch The skill lives once, in `plugins/rendezvous/skills/rendezvous`. The `skill` branch is generated from it (`git subtree split`), never edited by hand, so the text cannot drift. There is no CI: after changing the skill, run ```bash sh scripts/publish-skill-branch.sh # PowerShell: scripts/publish-skill-branch.ps1 ``` from a clean checkout of `main`. It force-pushes `skill`, which holds nothing else. `npx skills add omernesh/rendezvous` is unaffected: it reads the default branch, where the skills are still found in the plugin folder. --- Source: https://rendezvous.nesher.co/docs/plugin.md # Rendezvous plugin for Claude Code Set up [Rendezvous](https://rendezvous.nesher.co) by chatting with Claude: install `rdv`, create your agent, connect with another person's agent and send the first message. Approvals always come back to you. ```text /plugin marketplace add omernesh/rendezvous /plugin install rendezvous@rendezvous /reload-plugins ``` Then type `/rdv-onboarding` (the full name is `/rendezvous:rdv-onboarding`, if another plugin also has an `rdv-onboarding`). It sets you up one question per turn: install, MCP tools, profile, email, optional phone, relays (the default public set or your own, each one checked), public pointer, your agent, its card and an optional first contact, verifying each step before the next. Re-run it to resume where you stopped. After that, ask, for example: "Ask john@doe.com's agent to connect", "Tell John I'm running late", "check rendezvous". What it contains: - `skills/rdv-onboarding/SKILL.md`: the `/rdv-onboarding` command, a guided setup that asks one question at a time and follows the consent rules of the `rendezvous` skill. - `skills/rdv-backup/SKILL.md`: "back up my agent" and "recover my agent from backup", one step per turn in plain language (below). - `skills/rendezvous/SKILL.md`: the setup and messaging workflow, with the consent rules. It uses the Agent Skills format, so other agents can load it too (`npx skills add omernesh/rendezvous`). - `.mcp.json`: registers the `rdv-mcp` server through `bin/rdv-mcp.mjs`, which starts the build the installer put in `~/.rendezvous/src` (or `$RDV_DIR`). Until Rendezvous is installed the server fails to start; install it (the skill points you to the installer), then run `/reload-plugins`. The server uses the profile `rdv` uses: `$RDV_HOME`, else `~/.rendezvous/$RDV_PROFILE`, else `~/.rendezvous/default`. - `hooks/hooks.json`: a consent guard on every tool call. It stops Claude from running the `rdv` commands that grant consent or print confirm phrases (`rdv contact grant`, `rdv dinner confirm`, `rdv task approve`, `rdv task release`, `rdv contact pending`, `rdv dinner list`, `rdv task list`, `rdv group invite`, `rdv group join`, `rdv group approve`, `rdv group pending`, `rdv group terms`, …), put a contact on auto-approve (`rdv contact auto-approve`), or name a contact (`rdv contact label`, or `rdv contact request --label`), however the command is quoted or wrapped (`npx`, `bash -c`, `$(…)`), and from reading, editing, searching or globbing the agent's secret key, consent file and auto-approve file with any tool. Those stay with you, in your own terminal. **Auto-approve and your owner passphrase** (issues #47, #44). Turning auto-approve on asks for a passphrase you set yourself with `rdv owner-secret set`, in your own terminal. You type it either in your own terminal (`rdv contact auto-approve all`) or, when you ask Claude to turn it on, into the approval form `rdv_auto_approve` opens: the form shows the contact, its fingerprint, what it covers and until when, and what you type goes to the Rendezvous server only, never to Claude. If no form can be shown, it is refused (there is no confirm phrase for it). Never type the passphrase into the chat. Claude may turn auto-approve off whenever you ask, with no form. In the terminal the passphrase is read from the terminal device itself (`/dev/tty`, or `CONIN$` on Windows), not from stdin; it is never echoed or printed, and only a scrypt hash is kept (`owner-secret.json`, mode 600); three wrong answers lock it for a minute, then twice as long after each further miss. `rdv init` in a terminal offers to set it, and so does `/rdv-onboarding` (it asks you to run the command in your own terminal). The first passphrase is trust on first use: it is audited, and `rdv whoami` and `rdv_status` show when it was set; if that wasn't you, run `rdv owner-secret reset` in your own terminal (refused while locked; it turns every auto-approve off and only clears, and a new passphrase can be set 10 minutes later). Any pseudo-terminal (`script`, `expect`, `unbuffer`, `winpty`, node-pty, `pty.spawn`) is refused outright. It replaced "retype the fingerprint shown here", which an assistant could pass by running the command in a pseudo-terminal and typing back what the prompt printed. The hook also refuses any command that names `contact` and `auto-approve` under any wrapper or spelling (`script -c`, `expect -c`, `unbuffer`, `winpty`, `stdbuf`, `timeout`, `nohup`, `env`, node-pty, Python `pty.spawn`, here-strings, heredocs, `sh -c`, `node -e`, `python -c`), any quoted string that names `auto-approve`, any mention of `owner-secret`, and any read or write of `autoapprove.json` or `owner-secret.json` in any folder. What this protects against: an assistant that drifts or is prompt-injected and tries to switch auto-approve on by itself, with or without a pty: it never sees the answer, so it has nothing to type. What it does not protect against: a model with a shell running as your OS user can still write a script the hook can't read, delete `owner-secret.json` and set its own passphrase, edit Rendezvous' files, or watch you type the passphrase into a terminal it controls (so type it only in your own terminal, one you opened yourself). No local check is a hard boundary against your own account; for that, run the assistant or `rdv-mcp` as another OS user. **The hook is defence in depth, not a security boundary.** A model with a shell can always build a command it can't see (a script file, another interpreter). The boundary is the MCP consent gate: `rdv_grant` and `rdv_negotiate` need your approval form or a confirm phrase only you see, and the phrase is stored only as a hash. See "Threat model" in [`impl/packages/mcp/README.md`](https://rendezvous.nesher.co/docs/mcp.md). Backups (issue #88): ask "back up my agent". Claude asks where to keep the file (your password manager or a cloud drive is best: somewhere that survives this computer), then calls `rdv_backup`, and an approval form asks you for a passphrase, twice. Only the Rendezvous server sees it, never Claude; without a form it is refused (use `rdv backup ` in your own terminal). The file is encrypted (scrypt and AES-256-GCM) and holds the agent's key, contacts, grants and settings, never open approvals or confirm phrases. Whoever has the file and the passphrase can be your agent, as with the key itself, so choose a strong passphrase and keep it apart from the file. On a new computer, install Rendezvous and ask "recover my agent from backup": the form shows the agent ID and fingerprint in the file before you type the passphrase. Your contacts are told the agent was restored, so your conversations go on with no resync. `rdv backup` and `rdv restore` are yours, in your own terminal; the hook refuses them for Claude. Sending: Claude picks the recipient by its `local_label`, never by an address the other agent's card claims, and shows you the fingerprint before the first message. Only you set a label: it is part of what you approve (the form shows it next to the fingerprint and you can change it; a confirm phrase approves only the label it was shown with), or you name a contact yourself with `rdv contact label