protogrid

Search / io.github.sekera-radim/impri

Impri

R1· needs a key

Impri MCP server — human-in-the-loop approval inbox for AI agents

v0.1.3 · active · repository · website · descriptor JSON · versions

An agent can connect on its own if it already holds api_key.Remote endpoint behind a static API key or header. The registry never sees the value; the agent fills the placeholder.
Quality91strong
Trust97of 100
Uptime, 30 days98%
Latency p50436 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "impri": {
      "type": "http",
      "url": "https://api.impri.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${api_key}"
      }
    }
  }
}
claude mcp add --transport http impri https://api.impri.dev/mcp --header "Authorization: Bearer ${api_key}"
[mcp_servers.impri]
url = "https://api.impri.dev/mcp"
bearer_token_env_var = "api_key"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "impri": {
      "type": "remote",
      "url": "https://api.impri.dev/mcp",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer {env:api_key}"
      }
    }
  }
}
{
  "mcpServers": {
    "impri": {
      "type": "http",
      "url": "https://api.impri.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${api_key}"
      }
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=impri&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vYXBpLmltcHJpLmRldi9tY3AiLCJoZWFkZXJzIjp7IkF1dGhvcml6YXRpb24iOiJCZWFyZXIgJHthcGlfa2V5fSJ9fQ%3D%3D"
}
{
  "servers": {
    "impri": {
      "type": "http",
      "url": "https://api.impri.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${api_key}"
      }
    }
  }
}
{
  "mcpServers": {
    "impri": {
      "httpUrl": "https://api.impri.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${api_key}"
      }
    }
  }
}
extensions:
  "impri":
    enabled: true
    name: "impri"
    type: streamable_http
    uri: "https://api.impri.dev/mcp"
    headers:
      "Authorization": "Bearer ${api_key}"
    timeout: 300

Placeholders to fill from your own secret store: ${api_key}. The registry never accepts secret values.

Quality 91 / 100strong

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-06-18; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene100 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations8 of 8 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 2,534 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability100 · weight 15
  • pass
    stability.changesno tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvabledeps.dev does not know @impri/[email protected]

8 tools, about 2,534 tokens to load them all · tool set dc9ccf7c018d · checked 2026-10-20 04:41 UTC

Tool changes

No tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 97 / 100

provenance90
liveness99
freshness100
hygiene100

+repository +namespace-matches-repo +website +reachable +uptime-98% +updated-11d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Dependencies

@impri/[email protected] npmthis version is not known to the dependency resolver

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://api.impri.dev/mcp streamable-httpapi_key ${api_key}yes98%436 ms2025-06-182026-10-20
packageregistryversionruntimesecrets
@impri/mcpnpm0.1.3–IMPRI_API_KEY

Tools (8)

impri_await_decisionread-onlyPoll 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: 1. impri_push_action → get action_id 2. impri_await_decision(action_id) → wait for human decision 3. If approved: execute the action, then impri_report_result(action_id, "executed")
impri_create_watcherCreate 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 }.
impri_create_watcher_from_presetCreate 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" }
impri_inbox_statusread-onlyCheck 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.
impri_list_watcher_presetsread-onlyList 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]
impri_list_watchersread-onlyList 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.
impri_push_actionSubmit 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
impri_report_resultReport 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)

Schemas: list_tools.

Similar MCP servers

More from io.github.sekera-radim

Official server.json
{
  "name": "io.github.sekera-radim/impri",
  "title": "Impri",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://api.impri.dev/mcp",
      "type": "streamable-http",
      "headers": [
        {
          "name": "Authorization",
          "value": "Bearer {api_key}",
          "isSecret": true,
          "variables": {
            "api_key": {
              "isSecret": true,
              "isRequired": true,
              "description": "Impri API key (im_...)"
            }
          },
          "isRequired": true,
          "description": "Impri API key as a Bearer token. Get one at impri.dev."
        }
      ]
    }
  ],
  "version": "0.1.3",
  "packages": [
    {
      "version": "0.1.3",
      "transport": {
        "type": "stdio"
      },
      "identifier": "@impri/mcp",
      "registryType": "npm",
      "registryBaseUrl": "https://registry.npmjs.org",
      "environmentVariables": [
        {
          "name": "IMPRI_API_KEY",
          "isSecret": true,
          "isRequired": true,
          "description": "Impri API key (im_...). Get one at impri.dev or from your self-hosted server's first-run logs."
        },
        {
          "name": "IMPRI_BASE_URL",
          "description": "Base URL of a self-hosted Impri server (e.g. http://localhost:8484). Defaults to the hosted cloud."
        }
      ]
    }
  ],
  "repository": {
    "url": "https://github.com/sekera-radim/impri",
    "source": "github",
    "subfolder": "mcp"
  },
  "websiteUrl": "https://impri.dev",
  "description": "Impri MCP server — human-in-the-loop approval inbox for AI agents"
}