Local MCP capabilities provider for Expo
Portunus is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Secret broker for agents: reference secrets by name; values injected only at the execution boundary.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user portunus-mcp '--' docker run -i --rm ghcr.io/mdostal/portunus:0.34.0 mcp
# 2 — ask your agent for something these tools do
# portunus_health, portunus_list, portunus_search and 25 more
Portunus costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts Portunus as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. It has not been scanned here, so read the surface, and its source, before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. You need Docker installed and running. Claude Code registers it in one command; --scope user makes it available in every project. The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user portunus-mcp '--' docker run -i --rm ghcr.io/mdostal/portunus:0.34.0 mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
28 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Read from its source code. A server that builds its tool list when it starts can list more tools than this.
Health of this Portunus install -- the same read-only deep self-check as portunus health --json: {status: ok|degraded|down, checks: [{name, ok, detail}]}. Checks PORTUNUS_HOME permissions, that the registry parses, the audit chain and clock, and backend reachability. Never resolves a secret…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| shallow | boolean | no | — |
List every secret registered for project -- metadata only
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project | string | yes | — |
Free-text search across all registered secrets -- metadata only, never a value. Matches case-insensitively against each reference's name, sm_name, description, purpose, tags (keys and values), and group path.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | — |
| project | string | no | — |
| provider | string | no | — |
| env | string | no | — |
| state | string | no | — |
Render secrets by group hierarchy + related links -- metadata only, never a value. Same shape as portunus tree --json: {ungrouped, tree, refs}. A reference with no value for the active facet appears in ungrouped, never dropped. by is "group" (default, unchanged) or "repo" -- same nesting…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project | string | no | — |
| by | string | no | — |
Blast radius of one reference -- "if this rotates, what breaks?".
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
| max_depth | integer | no | — |
| suggest | boolean | no | — |
Preview what secret a plain-language request would resolve to -- metadata only, never a value, never injects anything. Only handles fetch requests (e.g. "the vercel secret for mdostal.com in prod"); a request that reads as an add/rotate/list request is rejected with a clear message rather than…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| request | string | yes | — |
Show configured per-project vault bindings (backend/sync_mode/ account/WIF audience) -- one project or all. Same values as
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project | string | no | — |
Show configured per-provider rotation bindings (status/account) -- one provider or all. Metadata only, never a credential -- rotation adapters resolve their own admin token via the normal boundary-only resolver, never a value this tool could see. Same values as
| Parameter | Type | Required | Notes |
|---|---|---|---|
| provider | string | no | — |
Inventory what is stored vs. what can actually be rotated: group all registry references and OAuth credentials by provider, join each to its rotation capability (auto/manual/unknown), and report counts per capability with the specific reference names and any un-retired superseded key IDs. Metadata…
Takes no parameters.
Probe stored credentials against their provider's own API with one cheap, read-only authenticated call -- the same as portunus liveness check --json. Each result is live / dead (provider rejected the key) / unknown (no adapter, not resolvable, network error, unexpected status).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| names | array | no | — |
| all | boolean | no | — |
Last recorded liveness verdict per reference (portunus liveness status --json). A non-live reference keeps first_failed_at until a live check clears it, so the age of a dead key is visible. Metadata only -- never touches a backend or a value. failing=True lists only non-live references,…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| failing | boolean | no | — |
Compare one reference's value across the places it is supposed to live -- the same as portunus parity check --json. Each result groups target names by equal value (in_sync when there is one group and no unreadable target); values are compared as per-call HMACs inside the resolver boundary, so…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| names | array | no | — |
| all | boolean | no | — |
| targets | array | no | — |
Read-only: list what already exists in a live GCP Secret Manager project (names + labels + create-time only, never a value). With register=True, writes not-yet-registered secrets as state=requested placeholders (never overwrites an existing reference -- a naming collision is reported, not silently…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project | string | yes | — |
| register | boolean | no | — |
Discovery only -- bundles known context (sm_name, group, project, org, repo, its project's VaultBinding, its provider's RotationBinding) for every reference still missing description/purpose/org, optionally scoped by org/project. Never a value, never a mutation. Read this bundle, then call…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| org | string | no | — |
| project | string | no | — |
Read-only leak-scan status: severity (warn/urgent/critical), finding count, and first/last-detected timestamps for one reference (name set) or every reference with active findings (name omitted).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | — |
| detail | boolean | no | — |
Runs a real leak-scan over the CURRENTLY CONFIGURED scan paths (see portunus_leak_scan_config_show) and persists any new findings -- the same operation portunus leak-scan performs from the CLI.
Takes no parameters.
Read-only: the currently configured leak-scan path globs. Empty by default -- nothing is scanned until a human or agent explicitly adds a path.
Takes no parameters.
Add a path glob to the leak-scan configuration (e.g.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| glob | string | yes | — |
Remove a path glob from the leak-scan configuration. Idempotent -- removing an unconfigured path is a harmless no-op. Returns the full resulting path list.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| glob | string | yes | — |
A human or agent's own assertion that reference name has been rotated at its provider -- Portunus cannot independently verify this.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
Propose description/purpose/group/tags for a reference -- lands in a provenance sidecar, NEVER the live field. A human must explicitly confirm (portunus metadata confirm <name> <field>, or the UI's accept/reject control) before it takes effect on the real reference.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
| description | string | no | — |
| purpose | string | no | — |
| group | string | no | — |
| tags | object | no | — |
Resolve one secret to a 0600 temp file and return its PATH -- never the value. Address it by exact reference name (from a prior portunus_list/portunus_tree/portunus_ask_preview call) OR by tags (e.g. {"provider": "gcp", "project": "demo"}) -- give one, not both.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | no | — |
| tags | object | no | — |
Run a command with one secret substituted in, and return only the command's result -- never the secret or the resolved command line.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| argv | array | yes | — |
| name | string | no | — |
| tags | object | no | — |
Create a new LOCAL-VAULT secret -- the harness-side counterpart to portunus drop. Restricted to the local-encrypted backend only, same as the CLI (fails closed with the identical message if PORTUNUS_BACKEND is gcloud/aws -- Portunus has no write path into GCP Secret Manager or AWS yet, that's a…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
| sm_name | string | yes | — |
| value | string | yes | — |
| scope | string | no | — |
| kind | string | no | — |
| provider | string | no | — |
| project | string | no | — |
| env | string | no | — |
| tags | object | no | — |
| description | string | no | — |
| purpose | string | no | — |
| injected_as | object | no | — |
| group | string | no | — |
| related | array | no | — |
| backend | string | no | — |
| repo | string | no | — |
| source_files | array | no | — |
Ask the HUMAN to type a secret into Portunus directly -- use this instead of portunus_drop whenever the human hasn't already pasted the value to you (a sudo password, a master credential). Opens a human-facing surface on their desktop (password dialog, then a fresh terminal window as fallback) and…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
| sm_name | string | yes | — |
| provider | string | no | — |
| project | string | no | — |
| org | string | no | — |
| env | string | no | — |
| kind | string | no | — |
| tags | object | no | — |
| description | string | no | — |
| purpose | string | no | — |
| group | string | no | — |
| enable | boolean | no | — |
| gate | boolean | no | — |
| confirm | boolean | no | — |
| surface | string | no | — |
| timeout | integer | no | — |
Create many LOCAL-VAULT secrets in one call -- the bulk counterpart to portunus_drop, for cases like importing ~100 candidate passwords/ keys at once (e.g. trying each one against a wallet-unlock operation via portunus_resolve_exec later, without ever seeing which one worked until you check the…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| entries | array | yes | — |
Change a reference's lifecycle state -- the harness-side counterpart to portunus state <name> <state>. Valid states: enabled, locked, dropped, revoked, requested. Typically used to promote a freshly portunus_drop-ped secret (state=dropped) to state=enabled so it becomes injectable. Pure metadata…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | — |
| state | string | yes | — |
Force a recency check (and re-fetch if stale) for every cached-mode reference in a project -- the harness-side counterpart to
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project | string | yes | — |
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under MIT
- Runs on your machine — nothing of it reaches our gateway
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Portunus or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing ships as a container image. The scanner reads packages on npm and PyPI and public source; an image is neither, so there is no grade here — not a withheld one, an unmeasured one.
Release history
It installs from a container image rather than from a versioned package, so the command cannot be pinned to a release. The history below is for reading; the current release on file is 0.34.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Portunus can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.