Impri
This server is an MCP interface to Impri, a human-in-the-loop approval inbox for AI agents. It lets agents submit proposed actions for human review, wait for approval/rejection, report execution results, check inbox backlog, and create/list watchers that feed external sources (RSS, Reddit, GitHub, etc.) into the inbox.
Submit actions for human approval —
impri_push_actioncreates a pending action with a title, formatted preview, optional editable fields, target URL, expiry, and idempotency key.Wait for a human decision —
impri_await_decisionpolls until the action is approved, rejected, or expired, with a configurable timeout.Report execution outcome —
impri_report_resultcloses the audit loop by reporting whether an approved action was executed or failed.Check inbox backlog —
impri_inbox_statusreturns the pending action count and titles, useful before starting large batches.Create custom watchers —
impri_create_watchersets up scheduled monitoring of RSS feeds, Reddit searches, URL diffs, etc., with keyword filters and deduplication, delivering matches to the inbox.List watchers —
impri_list_watchersshows all configured watchers, optionally filtered by status (active, paused, degraded).Discover watcher presets —
impri_list_watcher_presetslists ready-made templates (Hacker News, Reddit, GitHub releases, npm, arXiv, etc.) with their parameters.Create watchers from presets —
impri_create_watcher_from_presetinstantiates a watcher by preset id and params, with optional schedule/name overrides.
Provides a watcher preset to monitor arXiv for new papers and request human approval before taking action.
Integrates with CrewAI to incorporate approval steps into multi-agent workflows.
Sends notifications to Discord channels for pending actions requiring approval.
Provides watcher presets to monitor GitHub releases and events, enabling approval-gated actions.
Integrates with LangChain to add human approval gating in AI agent workflows.
Integrates with Make to add human approval steps in automated scenarios.
Integrates with n8n to enable approval-based workflows in automation pipelines.
Provides a watcher preset to monitor npm package releases and request approval for related actions.
Sends push notifications via ntfy for pending actions, enabling quick human review.
Integrates with OpenAI Agents to require human approval before executing agent actions.
Provides watcher presets to monitor Reddit posts and comments, with approval workflows for responses.
Sends notifications to Slack channels and allows approval decisions via Slack integration.
Sends notifications and provides in-chat Approve/Reject buttons via a Telegram bot for fast approvals.
Integrates with Zapier to connect approval workflows with hundreds of other apps.
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
Impri
Human-in-the-loop approval inbox for AI agents.
Your agent wants to send the email, post the reply, run the migration. You want to see it before it happens, from your phone if you're not at a desk. Impri is the inbox in between.
Agent (Claude Code / any MCP client) → Impri inbox → You approve, edit, or reject
↑ |
└──────────────── agent executes, reports result ──────────┘
The problem
Agents that only read and draft are safe by construction. The moment one can send an email, post a reply, or run a write against a database, "ask the user first" becomes a system-prompt instruction — and a instruction is something a capable model can reason its way past, forget under load, or misjudge on an edge case you didn't anticipate.
Impri turns that instruction into a data dependency instead. The agent pushes a proposed action to an inbox and polls for a decision; the execution branch is only reachable once the API actually returns status: "approved". There's nothing to talk the model past — the gate lives outside the model, not inside its prompt.
Related MCP server: MIDAS
60-second install
No install at all — connect straight to the hosted endpoint if your client supports a remote MCP server:
claude mcp add --transport http impri https://api.impri.dev/mcp --header "Authorization: Bearer $IMPRI_API_KEY"codex mcp add impri --url https://api.impri.dev/mcp
# then add to ~/.codex/config.toml under [mcp_servers.impri]:
# bearer_token_env_var = "IMPRI_API_KEY"Or run the local package (needed if you're pointing at a self-hosted server instead of the cloud):
Claude Code:
claude mcp add impri --env IMPRI_API_KEY=im_... --env IMPRI_BASE_URL=https://api.impri.dev -- npx -y @impri/mcpCodex:
codex mcp add impri --env IMPRI_API_KEY=im_... --env IMPRI_BASE_URL=https://api.impri.dev -- npx -y @impri/mcpCursor — add to .cursor/mcp.json:
{
"mcpServers": {
"impri": {
"command": "npx",
"args": ["-y", "@impri/mcp"],
"env": {
"IMPRI_API_KEY": "im_...",
"IMPRI_BASE_URL": "https://api.impri.dev"
}
}
}
}Windsurf — add the same block to mcp_config.json:
{
"mcpServers": {
"impri": {
"command": "npx",
"args": ["-y", "@impri/mcp"],
"env": {
"IMPRI_API_KEY": "im_...",
"IMPRI_BASE_URL": "https://api.impri.dev"
}
}
}
}Get an im_... key with one curl call — no signup form:
curl -s -X POST https://api.impri.dev/v1/signup -H "Content-Type: application/json" -d '{"name":"my-agent"}'IMPRI_BASE_URL defaults to http://localhost:8484 (self-host) if you omit it — set it to https://api.impri.dev for the hosted cloud, as above. Self-hosting instead of the cloud? See Self-host or cloud below.
What the agent can do
Tool | What it does |
| Submit a proposed action — title, formatted preview, optional editable fields |
| Poll until a human approves, rejects, or the timeout elapses |
| Report whether the approved action actually succeeded |
| Check how many actions are waiting, before starting a big batch |
| Create a watcher (RSS / Reddit search / URL diff) that feeds matching items into the inbox |
| List configured watchers, optionally filtered by status |
| List the 18 ready-made watcher templates (Hacker News, GitHub releases, npm, arXiv, …) |
| Create a watcher from a preset by id + params, no config schema to write |
The loop
1. impri_push_action(kind, title, preview) → { action_id, status: "pending", inbox_url }
2. impri_await_decision(action_id) → waits for a human to approve/reject/edit, or times out
3. If approved: execute the real action
4. impri_report_result(action_id, "executed" | "execute_failed")Or in plain REST, the same three calls:
ACTION=$(curl -s -X POST https://api.impri.dev/v1/actions \
-H "Authorization: Bearer $IMPRI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"kind":"email.send","title":"Outreach: Acme","preview":{"format":"markdown","body":"Hi Sarah, ..."}}')
ID=$(echo "$ACTION" | jq -r .id)
# poll (or long-poll) until a human decides
DECISION=$(curl -s "https://api.impri.dev/v1/actions/$ID" -H "Authorization: Bearer $IMPRI_API_KEY")
# only now, and only if approved
[ "$(echo "$DECISION" | jq -r .status)" = "approved" ] && send_email "$(echo "$DECISION" | jq -r '.decision.final_preview.body // .preview.body')"The human doesn't have to be staring at a dashboard: an action can notify Slack, Discord, Telegram, ntfy, email, or a generic webhook, and the reviewer can edit the draft before approving — the agent receives that edited text back.
Why not just a prompt instruction?
"Please ask before sending" in the system prompt | Impri |
The model has to remember, every time | Execution is unreachable without |
No record of who decided what, or when | Every decision is in the audit log |
Can't fix a typo without a new draft | Edit-before-approve — the agent gets the edited version back |
One-off per agent, per project | One inbox, six notification channels, 18 watcher presets, all agents |
The honest caveat: this is a real gate only as long as the approved path is the agent's only path to the side effect — give it the raw credential too and it can route around you.
Self-host or cloud
Cloud — signup above, inbox at app.impri.dev, early beta.
Self-host — full core, MIT, no license key:
git clone https://gitlab.com/sekera.radim/impri.git
cd impri
docker compose upServer on http://localhost:8484, web inbox on http://localhost:8080. The bootstrap admin key prints to the logs on first start. Details: Self-hosting.
Reference
Everything below is unchanged technical detail: CLI, SDKs, integrations, the full doc set, and legal.
CLI, SDKs & integrations
v0.1, pre-release. MCP is published; the CLI and both SDKs are local-install only (pre-npm / pre-PyPI) for now.
Package | Location | Status |
MCP server |
| Published |
CLI ( |
| Local build — see CLI reference |
Python SDK |
| Local install ( |
TypeScript SDK |
| Local install ( |
Framework integrations in integrations/: packages for the Claude Agent SDK, CrewAI, LangChain, and the OpenAI Agents SDK; documented webhook-based patterns for n8n, Make, and Zapier in Integrations.
Notifications
Six channels: Slack, Discord, Telegram, email, ntfy, and generic webhook. See Notification channels and Telegram Approval Bot.
Documentation
Web docs: https://impri.dev/docs?utm_source=github&utm_medium=readme&utm_campaign=impri
Quickstart — signup to first approved action in under 5 minutes
Example agent — dependency-free Node script showing the full loop
Self-hosting — Docker, env vars, backups, reverse proxy
Webhooks — HMAC verification, retries, polling fallback
Watcher presets — all 18 templates, REST + SDK + MCP usage
Audit log — event types, query API, export, retention
llms.txt— machine-readable index for AI assistants
Pricing
Free (3 watchers, 100 approvals/mo) · Indie $9/mo (20 watchers, 2,000 approvals/mo, 5-minute checks) · Team $29/mo (unlimited watchers and approvals, 1-minute checks). Self-host the full core for free — no tier limits apply outside the hosted cloud. Details: impri.dev.
Privacy & legal
License
MIT — see LICENSE. Self-host the full core freely; the hosted cloud and paid tiers are the commercial offering (see MONETIZATION.md).
Made by Radim Sekera. Related project: briefgate.dev — client intake for AI coding agents.
Available Tools
8 toolsimpri_await_decisionAInspect
Poll until the human approves, rejects, or the timeout elapses.
Checks GET /actions/:id every 5 seconds and returns as soon as the action leaves the pending state.
Decision meanings: "approved" — proceed with the action; any reviewer edits are included in preview/payload "rejected" — abort; respect the decision and do not proceed "expired" — the approval window closed; create a new action if the task is still relevant
On timeout the action stays pending in the inbox. Call impri_inbox_status to check queue depth and consider pausing further submissions.
Typical usage:
impri_push_action → get action_id
impri_await_decision(action_id) → wait for human decision
If approved: execute the action, then impri_report_result(action_id, "executed")
Inputs: action_id (required), timeout_s.
impri_create_watcherAInspect
Create a watcher that monitors external sources (RSS feeds, Reddit, URL diffs) and delivers matching items to the approval inbox or a webhook.
The watcher runs on the schedule you specify, deduplicates items by URL/content-hash, and delivers only new matches. The first run establishes a baseline and does not generate alerts.
Example — watch an RSS feed for AI-related news: spec: { name: "AI launches radar", kind: "rss", config: { url: "https://openai.com/news/rss.xml" }, keywords: ["launch", "gpt-", "voice"], keywords_none: ["funding", "benchmark"], min_score: 1, schedule: { every: "8h", jitter: "4h" } }
Returns { watcher_id, name, kind, status, next_run_at }.
Inputs: spec (required).
impri_create_watcher_from_presetAInspect
Create a watcher from a preset template by supplying the preset id and param values.
Presets handle all watcher config construction — URL building, keyword setup, SSRF validation — so you only provide the param values listed by impri_list_watcher_presets.
The schedule defaults to the preset's recommended interval but can be overridden. The name defaults to "{preset title}: {primary param value}" if omitted.
Returns { watcher_id, name, kind, status, next_run_at }.
Examples:
Watch the HN front page (no params needed): preset_id: "hn-front-page" params: {}
Watch a subreddit for new posts: preset_id: "reddit-subreddit" params: { subreddit: "MachineLearning" }
Watch a GitHub repo for new releases, check every 2 hours: preset_id: "github-releases" params: { owner: "fastify", repo: "fastify" } schedule: { every: "2h" }
Watch HN for keyword with a custom min_points threshold: preset_id: "hn-keyword" params: { keyword: "rust programming", min_points: "25" }
Inputs: params (required), preset_id (required), name, schedule.
impri_inbox_statusAInspect
Check how many actions are waiting for human decisions.
Returns the pending count and a brief list of pending action titles. Call this before starting a large batch of tasks — if the inbox is backed up, pause and let the operator catch up to avoid actions expiring before they are reviewed.
Inputs: no named parameters.
impri_list_watcher_presetsAInspect
List all available watcher presets with their parameters.
Presets are pre-configured watcher templates for common sources (Hacker News, Reddit, GitHub, npm, YouTube, arXiv, etc.). Each preset has an id, a human-readable title, required and optional params, and a default schedule.
Call this first to discover which preset fits your monitoring goal, then use impri_create_watcher_from_preset to create the watcher by supplying only the preset_id and param values. No deep knowledge of watcher config schemas is needed.
Example output: Community: - hn-front-page: "Hacker News Front Page" (rss) — no params required - reddit-keyword: "Reddit – Keyword Search" (reddit_search) — params: query, [subreddit]
Inputs: no named parameters.
impri_list_watchersAInspect
List all configured watchers, optionally filtered by status.
Returns the watcher count and a summary line per watcher (id, name, kind, status). Use this to audit what is being monitored, check for degraded watchers, or find a watcher_id for further operations.
Inputs: status.
impri_push_actionAInspect
Submit an action to the Impri human-approval inbox.
The action appears in the operator's web and mobile inbox as a card with a title, formatted preview, and optional tap-to-edit fields. The operator approves or rejects with one tap; you poll for the decision with impri_await_decision.
Returns { action_id, status: "pending", inbox_url }. Save action_id — you need it for all follow-up calls.
Example — send a draft Reddit reply for review: kind: "reddit.comment" title: "Reply: Why is resume advice so conflicting?" preview: { format: "markdown", body: "The advice conflicts because different advisors optimise for different audiences..." } target_url: "https://reddit.com/r/cscareerquestions/comments/..." editable: ["preview.body"] // lets the reviewer tweak wording before approving
Inputs: kind (required), title (required), preview (required), payload, +4 more.
impri_report_resultAInspect
Report whether you successfully executed an approved action.
Closes the audit loop — the operator sees 'executed' or 'execute_failed' in the inbox alongside the original action and decision. Always call this after attempting an approved action, even on failure.
Statuses: "executed" — action was carried out successfully "execute_failed" — execution attempt failed (include the error in detail)
Inputs: status (required), action_id (required), detail.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
Each tool has a clearly distinct purpose: watcher creation (two variants), listing, action pushing, decision awaiting, result reporting, and inbox status. No overlapping functionality.
All tools use the 'impri_' prefix and follow a consistent verb_noun or verb_noun_noun pattern (e.g., create_watcher, push_action, list_watcher_presets). The naming is predictable and uniform.
With 8 tools, the server covers two main domains—watcher management and action approval—without being bloated or sparse. Each tool serves a necessary role in the workflow.
The action lifecycle is well-covered (push, await, report, inbox status). For watchers, creation and listing are present, but missing update/delete operations are minor gaps that agents can work around.
Maintenance
Related MCP Connectors
Governed email for AI agents: a sandbox inbox to read and send from, human approval to go external.
Human approvals, notifications, inbound webhooks, wake-ups for headless agents. Free trial: /try
Human-in-the-loop for AI coding agents — ask questions, get approvals via Slack.
Email inboxes for AI agents: send, receive, search, drafts with owner approval, and webhooks.
Related MCP Servers
- AlicenseAqualityDmaintenanceHuman-in-the-loop approval gate for AI agents. Your agent calls submit_approval before any irreversible action; a human reviews on a branded page; a signed webhook fires back with the decision.11MIT
- AlicenseNot gradedqualityCmaintenanceLocal-first AI agent for approval-gated automation and verifiable LLM workflows.1MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to request human approvals with customizable forms, webhooks, and team features.69 npmMIT
- AlicenseAqualityCmaintenanceHuman-in-the-loop approval gateway for agent tool calls: agents request, policies decide, humans approve via Slack/Discord/web — with an OWASP-LLM-Top-10-tagged audit trail. Self-hostable.1018 npm33MIT