An agent that hits the same paper cut ten times normally leaves ten sentences in ten transcripts nobody reads. This turns each of those into a line in a JSONL file or a message in the channel where you would have wanted it. Note that the event id is a trace id, not a deduplication key — nothing stops an agent venting the same issue twice.
A small Rust STDIO server. When an agent hits blocked work, a repeated failure, a missing capability or a confusing workflow, it sends a short message to a channel; the server routes that channel to its configured sinks. The crate is `vent-mcp` and the binary it installs is named `vent`.
- `vent` — send one piece of feedback to the default channel or a named one; the reply is an acknowledgement with an event id
- `list_channels` — list the configured channels and their descriptions
- A tool surface that shrinks itself: with only the default channel configured, `list_channels` is hidden and `vent` accepts nothing but a message
- Sinks per channel — a local JSONL file, a webhook, or both at once
- Built-in webhook payload shapes for Slack, Discord, Microsoft Teams, Google Chat, Webex, Mattermost, IFTTT, Zapier, Make, n8n, Pipedream and Workato, plus a raw mode
- The same binary works from a shell, so you can file a vent by hand
Rust 1.88 or newer and Cargo for `cargo install vent-mcp`, or a prebuilt archive from the releases page. Any MCP client that runs a local STDIO server — `claude mcp add --transport stdio vent -- vent`. A default config is written to `~/.config/vent-mcp/config.toml` on first run with one channel and one JSONL sink; webhook sinks read their auth headers from environment variables you export before the client starts. MIT licensed.
One command — cargo install vent-mcp
