{
  "markdown": "# Impri — Approval Inbox for AI Agents\n\n> The imprimatur for your AI agents. Watchers watch the world, the Approval\n> Inbox holds the agent's hands until a human says yes.\n\n## Quickstart\n\nTwo ways to run Impri — pick one. Both give you an API key and an inbox URL in under 5 minutes.\n\n### Cloud (no install)\n\n```bash\ncurl -s -X POST https://api.impri.dev/v1/signup \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"name\": \"my-agent\"}'\n# → { \"key\": \"im_...\", \"project_id\": \"proj_...\", ... }\n```\n\nOr skip curl and click **Create an API key** at [app.impri.dev](https://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.\n\n### Docker Compose (self-host, < 5 minutes)\n\n```bash\ngit clone https://gitlab.com/sekera.radim/impri.git\ncd impri\ndocker compose up\n```\n\nOpen **http://localhost:8080** in your browser.\n\nOn first start the server prints the bootstrap Admin API key to the logs:\n\n```\n╔══════════════════════════════════════════════════════╗\n║            IMPRI — FIRST RUN BOOTSTRAP               ║\n╠══════════════════════════════════════════════════════╣\n║  Admin API Key: im_...                               ║\n║  Project ID:    proj_...                             ║\n║  Store this key securely — it will not be shown again.║\n╚══════════════════════════════════════════════════════╝\n```\n\nCopy the key, paste it into the login screen, and you're in.\n\n### Dev mode (hot-reload, self-host)\n\n**Terminal 1 — server:**\n\n```bash\ncd server\nnpm install\nnpm run dev\n# Server starts on http://localhost:8484\n```\n\n**Terminal 2 — UI:**\n\n```bash\ncd ui\nnpm install\nnpm run dev\n# UI starts on http://localhost:5173\n# /v1 requests are proxied to localhost:8484\n```\n\n## API at a glance\n\nBase URL: `https://api.impri.dev/v1` (cloud) or `http://localhost:8484/v1` (self-host)  \nAuth: `Authorization: Bearer im_<key>`\n\n| Method | Path | Description |\n|--------|------|-------------|\n| POST | `/v1/actions` | Push a new action for approval |\n| GET | `/v1/actions` | List actions (`?status=pending&q=…&kind=…&since=…`) |\n| GET | `/v1/actions/:id` | Get action detail + decision |\n| POST | `/v1/actions/:id/decision` | Approve or reject (single) |\n| POST | `/v1/actions/bulk-decision` | Approve or reject up to 50 actions at once |\n| POST | `/v1/actions/:id/result` | Report execution result |\n| GET | `/v1/openapi.json` | OpenAPI spec |\n\n### Push an action (curl example)\n\n```bash\ncurl -X POST https://api.impri.dev/v1/actions \\\n  -H \"Authorization: Bearer im_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"kind\": \"reddit.comment\",\n    \"title\": \"Reply to: Why is resume advice so conflicting?\",\n    \"preview\": {\n      \"format\": \"markdown\",\n      \"body\": \"The advice conflicts because...\"\n    },\n    \"target_url\": \"https://reddit.com/r/jobs/comments/...\",\n    \"expires_in\": 86400,\n    \"editable\": [\"preview.body\"]\n  }'\n```\n\nSelf-hosting instead? Swap the URL for `http://localhost:8484/v1/actions`.\n\n## MCP server (Claude Code / agents)\n\n```bash\nnpx @impri/mcp\n# cloud:      IMPRI_API_KEY=im_...  IMPRI_BASE_URL=https://api.impri.dev\n# self-host:  IMPRI_API_KEY=im_...  IMPRI_BASE_URL=http://localhost:8484\n```\n\n## Project structure\n\n```\nserver/   TypeScript + Fastify + SQLite — REST API (port 8484)\nmcp/      MCP server (stdio) — thin wrapper over the REST API\nui/       Vue 3 + Vuetify — web inbox (port 5173 dev / 8080 Docker)\ndocker/   Dockerfiles (server.Dockerfile)\ndocs/     Research, ADRs\n```\n\n## CLI\n\nThe `impri` CLI lets humans manage the inbox from a terminal — approve, reject, tail pending actions, add watchers, and manage keys — without writing any code.\n\n```bash\n# Build and install (local, pre-npm)\ncd sdk/typescript && npm install && npm run build\ncd ../cli && npm install && npm run build\nnpm install -g ./cli\n\n# Connect to your instance\nimpri init --cloud --signup   # or: impri init (self-hosted)\n\n# Common commands\nimpri inbox                   # pending actions\nimpri tail                    # live-tail new actions\nimpri approve act_abc123\nimpri watch add github-releases --param owner=fastify --param repo=fastify\n```\n\n- [CLI reference](docs/cli.md)\n\n## SDKs & integrations\n\n> v0.1, pre-release — both cloud and self-host work today; expect rough edges either way.\n\n| Package | Location | Language |\n|---------|----------|----------|\n| CLI | `cli/` | Node 18+ |\n| Python SDK | `sdk/python/` | Python 3.10+ |\n| TypeScript SDK | `sdk/typescript/` | Node 18+ (native fetch) |\n| MCP server | `mcp/` / `npx @impri/mcp` | Any MCP client |\n\n```bash\npip install -e sdk/python          # Python SDK (local, pre-PyPI)\nnpm install ./sdk/typescript       # TS SDK (local, pre-npm)\nnpx @impri/mcp                     # MCP server (published)\n```\n\n- [Python SDK reference](docs/sdk-python.md)\n- [TypeScript SDK reference](docs/sdk-typescript.md)\n- [Integrations](docs/integrations.md) — LangChain, OpenAI Agents, CrewAI, n8n, Make, Zapier, webhook receivers\n- [Cookbook](docs/cookbook.md) — recipes for email approval, SQL gating, social posts, idempotent batches, webhook verification, key rotation\n\n## Documentation\n\n- **Web docs:** <https://impri.dev/docs>\n- [CLI reference](docs/cli.md) — install, `impri init`, every command with examples, config + env precedence\n- [Quickstart](docs/quickstart.md) — signup → first approved action in < 5 min\n- [Example agent](examples/approval-gated-agent.mjs) — a complete, dependency-free\n  agent that proposes an action, waits for approval, then acts and reports back\n- [How to add human approval to an AI agent](docs/how-to-add-human-approval-to-an-ai-agent.md)\n- [Self-hosting](docs/self-hosting.md) — Docker, env vars, backups, reverse proxy\n- [Webhooks](docs/webhooks.md) — HMAC verification, retries, polling fallback\n- [Inbox UX & Bulk API](docs/inbox.md) — keyboard shortcuts, bulk approve/reject, search/filter parameters, `POST /v1/actions/bulk-decision` reference\n- [Watcher presets](docs/watcher-presets.md) — 18 ready-to-use templates (HN, Reddit, GitHub, npm, arXiv, …); REST + SDK + MCP usage\n- [Notification channels](docs/notifications.md) — Slack, Discord, Telegram, ntfy, email, and generic webhook; digest window, auto-disable, SSRF protection\n- [Telegram Approval Bot](docs/telegram-approval.md) — in-chat Approve / Reject buttons; setup, security model, troubleshooting\n- [Audit log](docs/audit-log.md) — event types, query API (`GET /v1/audit`), export (NDJSON/CSV), retention, and security model\n- [`llms.txt`](docs/llms.txt) — machine-readable index for AI assistants\n\n## Self-hosting notes\n\n- SQLite data is persisted in a Docker volume (`impri-data`).\n- Set `WEBHOOK_SECRET` env var to a random string for HMAC webhook signing.\n- `BASE_URL` should match the public URL of your deployment (used in inbox_url links).\n\n## License\n\nMIT — see [LICENSE](LICENSE). Self-host the full core freely; the hosted cloud\nand team features are the paid offering (see `MONETIZATION.md`).\n",
  "bytes": 6983,
  "sha": "ec3560b478f1757e0d45e3b7c9f74bed4b23c10042ec6a45e001f7917098107b",
  "repo_slug": "sekera-radim/impri",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_sekera_radim_impri_eda9db67/readme"
}