sekera-radim/impri
šļø š āļø š - Human-in-the-loop approval inbox for AI agents. An agent submits a proposed action (send email, post comment, run a command) via impripushaction, a human approves, rejects, or edits it from a web, mobile, or Slack/Discord/Telegram inbox, and the agent only proceeds on an approved decision. The gate is a data dependency, not a prompt. Full audit trail, self-hostable (MIT, Docker Compose). npx @impri/mcp
Quick Install
{
"mcpServers": {
"sekera-radim-impri": {
"command": "npx",
"args": [
"-y",
"sekera-radim-impri"
]
}
}
}Using an AI coding agent (Claude Code, Cursor, etc.)? Copy a ready-made prompt that tells it to fetch the setup instructions and install this server for you.
Documentation Overview
Impri ā Approval Inbox for AI Agents
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).