Impri
FreeNot checkedHuman-in-the-loop approval inbox for AI agents: an agent proposes an action (send email, post comment, run a command), a human approves, rejects, or edits it fr
About
Human-in-the-loop approval inbox for AI agents: an agent proposes an action (send email, post comment, run a command), a human approves, rejects, or edits it from a web, mobile, or Slack/Discord/Telegram inbox, and the agent only runs on approval. Full audit trail, self-hostable (MIT).
README
The imprimatur for your AI agents. Watchers watch the world, the Approval Inbox holds the agent's hands until a human says yes.
Quickstart
Two ways to run Impri — pick one. Both give you an API key and an inbox URL in under 5 minutes.
Cloud (no install)
curl -s -X POST https://api.impri.dev/v1/signup \
-H "Content-Type: application/json" \
-d '{"name": "my-agent"}'
# → { "key": "im_...", "project_id": "proj_...", ... }
Or skip curl and click Create an API key at app.impri.dev — same result. Your inbox is at app.impri.dev, the API base URL is https://api.impri.dev/v1. It's early beta but is the fastest way to try Impri with no Docker required.
Docker Compose (self-host, < 5 minutes)
git clone https://gitlab.com/sekera.radim/impri.git
cd impri
docker compose up
Open http://localhost:8080 in your browser.
On first start the server prints the bootstrap Admin API key to the logs:
╔══════════════════════════════════════════════════════╗
║ IMPRI — FIRST RUN BOOTSTRAP ║
╠══════════════════════════════════════════════════════╣
║ Admin API Key: im_... ║
║ Project ID: proj_... ║
║ Store this key securely — it will not be shown again.║
╚══════════════════════════════════════════════════════╝
Copy the key, paste it into the login screen, and you're in.
Dev mode (hot-reload, self-host)
Terminal 1 — server:
cd server
npm install
npm run dev
# Server starts on http://localhost:8484
Terminal 2 — UI:
cd ui
npm install
npm run dev
# UI starts on http://localhost:5173
# /v1 requests are proxied to localhost:8484
API at a glance
Base URL: https://api.impri.dev/v1 (cloud) or http://localhost:8484/v1 (self-host)
Auth: Authorization: Bearer im_<key>
| Method | Path | Description |
|---|---|---|
| POST | /v1/actions |
Push a new action for approval |
| GET | /v1/actions |
List actions (?status=pending&q=…&kind=…&since=…) |
| GET | /v1/actions/:id |
Get action detail + decision |
| POST | /v1/actions/:id/decision |
Approve or reject (single) |
| POST | /v1/actions/bulk-decision |
Approve or reject up to 50 actions at once |
| POST | /v1/actions/:id/result |
Report execution result |
| GET | /v1/openapi.json |
OpenAPI spec |
Push an action (curl example)
curl -X POST https://api.impri.dev/v1/actions \
-H "Authorization: Bearer im_..." \
-H "Content-Type: application/json" \
-d '{
"kind": "reddit.comment",
"title": "Reply to: Why is resume advice so conflicting?",
"preview": {
"format": "markdown",
"body": "The advice conflicts because..."
},
"target_url": "https://reddit.com/r/jobs/comments/...",
"expires_in": 86400,
"editable": ["preview.body"]
}'
Self-hosting instead? Swap the URL for http://localhost:8484/v1/actions.
MCP server (Claude Code / agents)
npx @impri/mcp
# cloud: IMPRI_API_KEY=im_... IMPRI_BASE_URL=https://api.impri.dev
# self-host: IMPRI_API_KEY=im_... IMPRI_BASE_URL=http://localhost:8484
Project structure
server/ TypeScript + Fastify + SQLite — REST API (port 8484)
mcp/ MCP server (stdio) — thin wrapper over the REST API
ui/ Vue 3 + Vuetify — web inbox (port 5173 dev / 8080 Docker)
docker/ Dockerfiles (server.Dockerfile)
docs/ Research, ADRs
CLI
The impri CLI lets humans manage the inbox from a terminal — approve, reject, tail pending actions, add watchers, and manage keys — without writing any code.
# Build and install (local, pre-npm)
cd sdk/typescript && npm install && npm run build
cd ../cli && npm install && npm run build
npm install -g ./cli
# Connect to your instance
impri init --cloud --signup # or: impri init (self-hosted)
# Common commands
impri inbox # pending actions
impri tail # live-tail new actions
impri approve act_abc123
impri watch add github-releases --param owner=fastify --param repo=fastify
SDKs & integrations
v0.1, pre-release — both cloud and self-host work today; expect rough edges either way.
| Package | Location | Language |
|---|---|---|
| CLI | cli/ |
Node 18+ |
| Python SDK | sdk/python/ |
Python 3.10+ |
| TypeScript SDK | sdk/typescript/ |
Node 18+ (native fetch) |
| MCP server | mcp/ / npx @impri/mcp |
Any MCP client |
pip install -e sdk/python # Python SDK (local, pre-PyPI)
npm install ./sdk/typescript # TS SDK (local, pre-npm)
npx @impri/mcp # MCP server (published)
- Python SDK reference
- TypeScript SDK reference
- Integrations — LangChain, OpenAI Agents, CrewAI, n8n, Make, Zapier, webhook receivers
- Cookbook — recipes for email approval, SQL gating, social posts, idempotent batches, webhook verification, key rotation
Documentation
- Web docs: https://impri.dev/docs
- CLI reference — install,
impri init, every command with examples, config + env precedence - Quickstart — signup → first approved action in < 5 min
- Example agent — a complete, dependency-free agent that proposes an action, waits for approval, then acts and reports back
- How to add human approval to an AI agent
- Self-hosting — Docker, env vars, backups, reverse proxy
- Webhooks — HMAC verification, retries, polling fallback
- Inbox UX & Bulk API — keyboard shortcuts, bulk approve/reject, search/filter parameters,
POST /v1/actions/bulk-decisionreference - Watcher presets — 18 ready-to-use templates (HN, Reddit, GitHub, npm, arXiv, …); REST + SDK + MCP usage
- Notification channels — Slack, Discord, Telegram, ntfy, email, and generic webhook; digest window, auto-disable, SSRF protection
- Telegram Approval Bot — in-chat Approve / Reject buttons; setup, security model, troubleshooting
- Audit log — event types, query API (
GET /v1/audit), export (NDJSON/CSV), retention, and security model - llms.txt — machine-readable index for AI assistants
Self-hosting notes
- SQLite data is persisted in a Docker volume (
impri-data). - Set
WEBHOOK_SECRETenv var to a random string for HMAC webhook signing. BASE_URLshould match the public URL of your deployment (used in inbox_url links).
License
MIT — see LICENSE. Self-host the full core freely; the hosted cloud
and team features are the paid offering (see MONETIZATION.md).
Install Impri in Claude Desktop, Claude Code & Cursor
unyly install impriInstalls into Claude Desktop, Claude Code, Cursor & VS Code — handles npx, uvx and build-from-source repos for you.
First time? Get the CLI: curl -fsSL https://unyly.org/install | sh
Or configure manually
Run in your terminal:
claude mcp add impri -- npx -y @impri/mcpFAQ
Is Impri MCP free?
Yes, Impri MCP is free — one-click install via Unyly at no cost.
Does Impri need an API key?
No, Impri runs without API keys or environment variables.
Is Impri hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Impri in Claude Desktop, Claude Code or Cursor?
Open Impri on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
Gmail
Read, send and search emails from Claude
by GoogleSlack
Send, search and summarize Slack messages
by SlackRunbear
No-code MCP client for team chat platforms, such as Slack, Microsoft Teams, and Discord.
Discord Server
A community discord server dedicated to MCP by [Frank Fiegel](https://github.com/punkpeye)
Compare Impri with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All communication MCPs
