Unix pass

io.github.Neanderthal由 GitHub 帳號 Neanderthal 發布v0.2.1更新於 Nov 4, 2026

本機 MCP 存取 Unix pass/GPG,預設唯讀,支援路徑範圍和 TOTP。

AI 翻譯由 AI 模型根據下方的原文描述翻譯,可能有誤。

原文描述

Local MCP access to Unix pass/GPG with read-only defaults, path scopes, and TOTP.

已驗證STDIO僅桌面

概覽

Unix pass 的本機 MCP 服務;無需登入;STDIO;24 個工具。

暫無 AI 概覽:以下資訊來自註冊中心條目和服務本身。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Unix pass,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

██╗   ██╗███╗   ██╗██╗██╗  ██╗    ██████╗  █████╗ ███████╗███████╗    ███╗   ███╗ ██████╗██████╗██║   ██║████╗  ██║██║╚██╗██╔╝    ██╔══██╗██╔══██╗██╔════╝██╔════╝    ████╗ ████║██╔════╝██╔══██╗██║   ██║██╔██╗ ██║██║ ╚███╔╝     ██████╔╝███████║███████╗███████╗    ██╔████╔██║██║     ██████╔╝██║   ██║██║╚██╗██║██║ ██╔██╗     ██╔═══╝ ██╔══██║╚════██║╚════██║    ██║╚██╔╝██║██║     ██╔═══╝╚██████╔╝██║ ╚████║██║██╔╝ ██╗    ██║     ██║  ██║███████║███████║    ██║ ╚═╝ ██║╚██████╗██║ ╚═════╝ ╚═╝  ╚═══╝╚═╝╚═╝  ╚═╝    ╚═╝     ╚═╝  ╚═╝╚══════╝╚══════╝    ╚═╝     ╚═╝ ╚═════╝╚═╝

Connect your existing Unix pass/GPG store to AI tools.

Read-only by default. Writes, key administration, and network ops behind explicit env opt-ins. Single-chokepoint subprocess. Strict input validation. No shell, no clipboard, no secrets in logs.

[Python 3.11+] [License: MIT] [MCP 2.3] [Tests]


Status — M5 complete. Read · safe-write · key administration · TOTP/OTP · git · hardening surfaces all shipped. 24 tools with unit, real-GPG integration, and stdio protocol regression suites. See installation examples, the demo, and release/publishing instructions.

Demo

[Real MCP calls using a synthetic store]

83-second MP4 · How it was recorded

Trying the beta? Report installation feedback. Launch status tracks package and directory publication separately.

Table of contents


Why this exists

pass is a thin wrapper around gpg(1) and the filesystem. Anything that can shell out can use it — but exposing it raw to an LLM is a recipe for rm -rf regret. This server provides:

  • A typed MCP surface over the safe subset of pass.
  • Read-only by default; writes and destructive ops behind explicit env opt-ins.
  • Strict input validation — no shell, no path escapes, no stdin smuggling of secrets.
  • Sanitized error output, append-only audit log, and gpg-agent preflight.

See .claude/rules/architecture.md for the full design and security model.


Quickstart

Requires Python 3.11+, uv, pass, GnuPG, and an initialized store. Install the published PyPI release:

bash
claude mcp add unix-pass -e 'PASS_MCP_ALLOWED_PATHS=web/*' -- \  uvx --from unix-pass-mcp==0.2.1 unix-pass-mcp

Copy-paste configurations: Codex, Claude Code, Claude Desktop. For source-checkout development and other client setup details, see installation.

That gets you the read-only surface. To enable mutations:

bash
PASS_MCP_ALLOW_WRITES=1 \PASS_MCP_ALLOWED_PATHS=web/* \uv run unix-pass-mcp

Requirements

Required

ComponentWhyNotes
Python ≥ 3.11Runtime3.11 / 3.12 / 3.13 tested in CI
pass on PATHThe wrapped binarypass --version must work
gpg (GnuPG ≥ 2.2) on PATHDecryptionUsed directly only by unlock_agent
gpg-agentPassphrase cachingThe server probes gpg-connect-agent /bye at startup and refuses to decrypt if no agent is reachable. Started automatically by GnuPG on first use.
A configured GPG keyRequired for decryption / pass initMust have its trust level set to "ultimate" — see Arch wiki
An initialized password storeThe thing being managedpass init <gpg-id> if you don't have one

Pinentry — pick one

The server can never serve an interactive passphrase prompt itself — pass/gpg will hang. You need one of:

  1. A GUI pinentry configured in ~/.gnupg/gpg-agent.conf — pinentry-gnome3, pinentry-qt, pinentry-qt5, or pinentry-gtk-2. The first decrypt of each cache window pops a desktop dialog. Recommended.
  2. zenity or kdialog installed — call the unlock_agent MCP tool once per cache window to warm gpg-agent. Use this if you can't change gpg-agent.conf.
  3. A pre-warmed agent — run pass show <name> in a real terminal before talking to the MCP. Cache expires per default-cache-ttl (default 600s).

OS install hints

bash
# Arch / Manjarosudo pacman -S pass gnupg pinentry zenity         # zenity optional, for unlock_agent
# Debian / Ubuntusudo apt install pass gnupg pinentry-gnome3 zenity
# Fedorasudo dnf install pass gnupg2 pinentry-gnome3 zenity
# macOS (Homebrew)brew install pass gnupg pinentry-mac

Optional

ComponentEnables
pass-otpCross-tool compatibility for otp (the server has a native RFC 6238 implementation, no runtime dependency)
gitAuto-commit on writes if your store is a git repo, plus git_status / git_log / git_pull / git_push

Development

ComponentWhy
uvRecommended installer / runner
gpg with key-generation supportIntegration tests mint throwaway keys in an ephemeral GNUPGHOME

Install

bash
uv sync --locked --extra dev # for developmentuv pip install .             # for use

Wire into an MCP host

Claude Desktop

Add to ~/.config/Claude/claude_desktop_config.json (or the platform equivalent):

json
{  "mcpServers": {    "pass": {      "command": "uv",      "args": ["run", "--directory", "/absolute/path/to/unix-pass-mcp", "unix-pass-mcp"],      "env": {        "PASSWORD_STORE_DIR": "/home/you/.password-store"      }    }  }}

Claude Code

bash
# Read-onlyclaude mcp add pass -- uv run --directory /absolute/path/to/unix-pass-mcp unix-pass-mcp
# With writes enabled and path scope (recommended pairing)claude mcp add pass -s user \  -e PASS_MCP_ALLOW_WRITES=1 \  -e PASS_MCP_ALLOWED_PATHS='web/*' \  -- uv run --directory /absolute/path/to/unix-pass-mcp unix-pass-mcp

Each -e KEY=VALUE flag sets one env var on the spawned server. To change env on an existing server, claude mcp remove pass -s user then re-add — the CLI has no in-place edit. Verify with claude mcp get pass.

Driving an autonomous agent

For account creation / profile filling workflows that combine unix-pass-mcp with a browser-controlling MCP, load .claude/rules/agent-workflow.md into the agent's system prompt. It defines the canonical naming convention (web/<domain>/<handle>), body format, and signup/login/rotation loops.


Tools

24 tools, grouped by capability gate.

Read-only — always available

ToolDescription
store_infoInspect the store: path, recipients per subdir, git/agent/pinentry/signing status, warnings. No decryption.
listList pass-names (optionally scoped to a subfolder). No decryption.
findSubstring search over leaf names. No decryption.
showDecrypt and return one line of an entry (default = line 1 = password). Marked sensitive.
show_fieldDecrypt and return one named metadata field (URL, Username, otpauth, …). Case-insensitive.
show_metadataDecrypt and return only the entry shape (field names, password presence, and line count). Password value is never returned.
unlock_agentPop a desktop password dialog (zenity/kdialog) and warm gpg-agent's cache via loopback pinentry. Optional target for multi-recipient stores — pass an explicit pass-name if a no-arg call returns wrong_passphrase_or_decrypt_failed, which can happen on legacy stores where the smallest entry is encrypted to a rotated subkey. The LLM never sees the passphrase.
grepSearch inside the decrypted body of permitted entries. Slow + costly (decrypts permitted entries) — requires confirm_decrypt_all=true. Marked sensitive. Honours PASS_MCP_ALLOWED_PATHS.
otpCompute the current TOTP code from an entry's otpauth:// line. Returns code + seconds_remaining. Marked sensitive. Native RFC 6238 — no pass-otp runtime dependency.
otp_uriReturn the raw otpauth:// URI (contains the secret). Use only when re-enrolling the same secret elsewhere.

Writes — gated behind PASS_MCP_ALLOW_WRITES=1

ToolDescription
insertCreate or overwrite a single-line entry. Password via stdin (never argv). Refuses overwrite without force=true.
insert_multilineCreate or overwrite a full-body entry (line 1 = password, rest = Key: value metadata).
set_fieldUpdate one Key: value field; preserves password and other lines. simulate=true returns the would-be body without writing.
unset_fieldRemove all lines matching a field key (case-insensitive). No-op if absent. simulate=true for dry-run.
generateGenerate a new password (length 1–1024, optional no_symbols). in_place=true keeps metadata; force=true overwrites everything. Returns the generated value (sensitive).
mvRename or move an entry/subfolder. Re-encrypts to the destination subfolder's recipients if they differ.
cpCopy an entry/subfolder, with the same re-encryption semantics.
otp_setAppend or replace the otpauth:// URI on an existing entry. Validates the URI before writing.

Git — git_status and git_log always; git_pull and git_push need PASS_MCP_ALLOW_NETWORK=1

ToolDescription
git_statusStructured status: {clean, branch, upstream, ahead, behind, dirty_files}. Refuses if the store isn't a git repo.
git_logRecent commits as [{hash, subject}, …]. limit defaults to 20 (max 200).
git_pullgit pull --ff-only — refuses divergence, no merge commits, no rebase.
git_pushgit push — never --force.

Destructive — gated behind PASS_MCP_ALLOW_DESTRUCTIVE=1

ToolDescription
initInitialize the store (or a subfolder) with new GPG recipients. Re-encrypts every entry in scope. Refuses if the user has no secret key for any of the new recipients, unless force=true. Empty gpg_ids list removes a subfolder's .gpg-id.
reencryptRe-run init with the current recipients. Useful after subkey rotation. No-op when recipients haven't changed.

Full machine-readable surface — every arg, every error code — lives in .claude/rules/api.md.


Configuration

Server-specific env vars:

VarDefaultEffect
PASS_MCP_ALLOW_WRITESunsetRequired for any mutating tool
PASS_MCP_ALLOW_DESTRUCTIVEunsetRequired for init / reencrypt
PASS_MCP_ALLOW_NETWORKunsetRequired for git_pull / git_push
PASS_MCP_ALLOW_UNSAFEunsetBypass strict startup checks (world-readable store, weak umask). Don't.
PASS_MCP_ALLOWED_PATHSunset (= all)Comma-separated fnmatch globs scoping which entries the server may touch
PASS_MCP_GREP_TIMEOUT_SECONDS120Per-call timeout for grep (decrypts permitted entries)
PASS_MCP_REQUIRE_AGENT1Refuse to decrypt if gpg-agent is not reachable
PASS_MCP_AUDIT_LOG~/.local/state/unix-pass-mcp/audit.logAppend-only JSONL log of actions; set to empty string to disable
PASS_MCP_TIMEOUT_SECONDS15Per-call subprocess timeout

Standard pass env vars are passed through (PASSWORD_STORE_DIR, PASSWORD_STORE_KEY, PASSWORD_STORE_UMASK, …). See .claude/rules/architecture.md §5 for the full list.

Not propagated:

  • PASSWORD_STORE_GPG_OPTS — lets a hostile env inject gpg flags like --recipient (silent re-encryption to attacker) or --output (decryption exfiltration).
  • PASSWORD_STORE_X_SELECTION, PASSWORD_STORE_CLIP_TIME — clipboard tools dropped (meaningless over MCP).

Security posture

No shell.Every pass invocation goes through one chokepoint (pass_cli.run) using argument lists with shell execution disabled. Process launches are centralized in pass_cli.execute.
Strict input validation.Pass-names match ^[A-Za-z0-9._@-][A-Za-z0-9._@/-]*$, ≤256 chars, no .., no leading -, no control chars. gpg-ids match a positive allowlist.
Path allowlist.PASS_MCP_ALLOWED_PATHS lets you scope the server to e.g. "work/*,personal/notes/*" to restrict the entries exposed to the MCP host. Honoured by grep and unlock_agent too.
Sensitive output flagged.show, show_field, generate, otp, otp_uri, grep, and simulated field ops carry meta.sensitive = true so MCP hosts can refuse to log/cache.
Stderr sanitization.Anything between -----BEGIN/-----END markers is stripped before raising errors; output is truncated to 2 KB.
Audit log records names only.Never values, never field contents, never grep patterns.
Stdin isolation.Every subprocess runs with stdin=DEVNULL unless the caller is actively piping content. Protects MCP's stdio JSON-RPC framing from accidental child-process reads.
Strict startup.Refuses to start if PASSWORD_STORE_UMASK is weaker than 077 or the store dir is world-readable. Bypass with PASS_MCP_ALLOW_UNSAFE=1 (don't).

The server instructions tell the model to treat returned secrets as confidential and never repeat them in responses, summaries, logs, or unrelated tool calls. This is guidance for the model, not a technical logging boundary: an MCP client may still store raw tool results in its conversation transcript. Review and configure the host's transcript and logging policy accordingly.


Operational behavior

Scoped search

grep selects allowed entry names before decryption, decrypts each separately, and searches its body with a basic regular expression. Header-like content never changes the entry name. Patterns are operands, including those starting with -; invalid patterns fail before decryption. PASS_MCP_GREP_TIMEOUT_SECONDS is a positive, finite total budget for the entire search. redacted_entries remains zero because excluded entries are never searched.

Filesystem containment

Entry access rejects symlinked files and directory components, including links within the store. Discovery and automatic unlock target selection skip links. Explicit unlock targets are validated before agent probes. Keep the local store under trusted ownership: these CLI checks do not sandbox concurrent filesystem changes by another process running as the same user.

Discovery and git scope

list and find omit excluded entries. Recipient discovery reports only ancestors of visible entries when path scoping is active. Remote URLs omit userinfo, query parameters, and fragments. Git tools operate on the whole repository and require unrestricted access (no path allowlist, or an explicit * grant); partial path grants cannot authorize git history or repository-wide network operations.

Structural metadata and sensitive results

show_metadata returns field_names, password_present, and raw_lines. It never returns field values, passwords, free text, or OTP URIs. This replaces the former fields mapping. Use show_field for an explicitly sensitive field read. Both field-edit tools advertise sensitive output because simulations include the complete decrypted before/after bodies. Custom sensitive metadata is a host hint, not a protocol guarantee against logging or caching. Search queries are not audited.

PASS_MCP_TIMEOUT_SECONDS sets the default subprocess timeout. It must be a positive finite number; invalid values fail before command execution. Explicit operation budgets (search, key administration, and network operations) override it.

Runtime and cancellation

MCP handlers run in worker threads so slow GPG operations do not block protocol processing. Mutating tool calls are serialized to prevent overlapping read/modify/write operations. Cancellation signals the worker and terminates its subprocess group; per-command timeouts still bound execution. Cancellation cannot roll back changes already completed by pass; inspect the entry before retrying a write. Production subprocess launches, including unlock dialogs, are centralized in pass_cli.execute. Local tools advertise openWorldHint: false; network git tools advertise openWorldHint: true.

MCP SDK compatibility

The server uses the official SDK v2 MCPServer API and requires mcp>=2.3,<3. Its stdio transport supports both legacy initialization and July 2026 per-request metadata/discovery. Tests launch real stdio clients in both modes. The lockfile records the tested dependency set; use uv sync --locked --extra dev to reproduce it.


Development

bash
uv run ruff checkuv run ruff format --checkuv run pytest -q tests/unit                                 # fast testsPASS_MCP_INTEGRATION=1 uv run pytest -q tests/integration   # real-GPG tests

The integration suite mints a throwaway RSA key in an ephemeral GNUPGHOME (1-day expiry, no passphrase) and exercises real pass. CI runs both tiers across Python 3.11 / 3.12 / 3.13.


Disclaimer

unix-pass-mcp is a bridge between your password store and a non-deterministic large language model — and, in most realistic deployments, between your password store and every other MCP server that shares the same model session (browser automation, shell execution, web requests). Even with every gate disabled by default, the purpose of installing this server is to grant an LLM access to your secrets. The following are not bugs:

  • An LLM can be prompted (by you, by a hostile webpage your browser MCP loads, by a poisoned tool result) to decrypt any entry within PASS_MCP_ALLOWED_PATHS and forward it to another tool in the same session.
  • With PASS_MCP_ALLOW_WRITES=1, an LLM can overwrite, rename, or generate-over entries in scope.
  • With PASS_MCP_ALLOW_DESTRUCTIVE=1, an LLM can re-encrypt your store to a different recipient set, or remove a subfolder's .gpg-id.
  • With PASS_MCP_ALLOW_NETWORK=1, an LLM can push commits — including credential changes — to your configured git remote.

The capability gates, path allowlist, audit log, sensitive-output flags, and validation hardening reduce the blast radius of mistakes and prompt injection. They do not make it safe to point an unsupervised agent at a production credential store. Treat the security posture documented above as best-effort engineering against a hostile and rapidly-evolving threat model, not a formal guarantee.

You are solely responsible for:

  • Which capability gates you enable, and on which stores.
  • The trust boundary of the MCP host you run this against — what it logs, caches, ships to telemetry, or lets other servers see.
  • Backing up ~/.password-store (and ~/.gnupg) before granting destructive or network access.
  • Reviewing ~/.local/state/unix-pass-mcp/audit.log periodically.
  • Recovering from any mistake an agent makes — there is no undo.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. THE AUTHORS AND CONTRIBUTORS SHALL NOT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY — INCLUDING BUT NOT LIMITED TO DATA LOSS, CREDENTIAL COMPROMISE, STORE LOCK-OUT, UNINTENDED DISCLOSURE OF SECRETS, OR LOSS OF SERVICE — WHETHER ARISING FROM BUGS, PROMPT INJECTION, MISCONFIGURATION, OR ANY OTHER USE OR MISUSE OF THE SOFTWARE. See the LICENSE for the full MIT terms.

This project is not affiliated with, endorsed by, or sponsored by Anthropic, the maintainers of pass(1) (Jason A. Donenfeld and contributors), the GnuPG project, or any MCP host vendor. All trademarks are the property of their respective owners.


License

MIT — see LICENSE.

來源:README.md,提交 886a632

工具

24

store_info

Inspect the configured password store without decrypting anything. Returns store path, recipient keys per subdirectory (from .gpg-id files), git/agent/signing status, and any configuration warnings. Call this first to confirm the store is reachable and healthy.

無需輸入參數。

list

List all pass-names (entries) in the store, optionally scoped to a subfolder. Returns a flat sorted list of names without the .gpg suffix. Does not decrypt.

輸入參數subfolder

find

Find pass-names whose leaf name contains `query` (case-insensitive substring). Mirrors `pass find`. Does not decrypt.

輸入參數query必填subfolder

show

Decrypt and return the password (line 1) for a pass-name. Pass `line` to return a different line (1-indexed). The returned `value` is sensitive. Use it only for the user's explicitly requested task; never quote or repeat it in assistant messages, summaries, logs, or unrelated tool calls. Avoid retrieving it unless necessary. Clients should not log or cache it.

輸入參數linename必填

show_field

Decrypt the entry and return one named metadata field (e.g. `URL`, `Username`, `otpauth`). Field lookup is case-insensitive. Returns null `value` if the field is absent. The password line is never returned. Field values may be secrets: use only for the requested task and never quote or repeat them in assistant messages, summaries, logs, or unrelated tool calls.

輸入參數name必填field必填

unlock_agent

**Call this whenever any other tool returns `agent_unavailable`** — that error means gpg-agent is up but pinentry can't prompt (typically pinentry-curses + no TTY, the default deadlock when an MCP server is spawned by Claude Desktop/Code). This tool resolves it: pops a desktop password dialog (zenity / kdialog) and decrypts one entry via loopback pinentry. After it succeeds, subsequent `show`/`grep`/etc calls work without TTY-bound pinentry until the agent's cache TTL expires (default 600s, set via `default-cache-ttl` in ~/.gnupg/gpg-agent.conf). Do NOT ask the user to paste their GPG passphrase into chat — the passphrase travels desktop dialog → our process → gpg stdin and the LLM never sees it. Optional `target` is a pass-name to decrypt against (useful when the store has multiple `.gpg-id` recipients and you want to warm a specific key); without it, the smallest in-scope entry is used.

輸入參數target

show_metadata

Decrypt the entry but return only its shape: which metadata field names exist, whether a password is present, and the raw line count. Useful to inspect entry structure without surfacing the password.

輸入參數name必填

insert

Create or overwrite a single-line entry. The password is passed via stdin (never argv) so it never appears in /proc/<pid>/cmdline. Refuses if the entry exists unless `force=true`. Requires PASS_MCP_ALLOW_WRITES=1.

輸入參數name必填forcepassword必填

insert_multiline

Create or overwrite a multi-line entry. Line 1 is the password; subsequent lines should follow `Key: value` convention (URL, Username, otpauth, …). Body is passed via stdin. Refuses if the entry exists unless `force=true`. Requires PASS_MCP_ALLOW_WRITES=1.

輸入參數body必填name必填force

set_field

Set or update one `Key: value` metadata field on an existing entry, preserving the password and all other lines. Field lookup is case-insensitive; existing case is preserved on update, new fields are appended in the requested case. Refuses if the entry does not exist (use `insert_multiline` to create). Pass `simulate=true` to compute the would-be body without writing — useful for agent dry-runs. Requires PASS_MCP_ALLOW_WRITES=1 (also for simulate). Simulated bodies contain the password and other entry data; never quote or repeat them in assistant messages, summaries, logs, or unrelated tool calls.

輸入參數name必填field必填value必填simulate

unset_field

Remove all lines matching `field` (case-insensitive) from an existing entry, preserving the password and all other lines. No-op if the field is absent. Pass `simulate=true` for a dry-run. Simulated bodies contain secret entry data; never quote or repeat them in assistant messages, summaries, logs, or unrelated tool calls. Requires PASS_MCP_ALLOW_WRITES=1.

輸入參數name必填field必填simulate

generate

Generate a new password for `name`. `length` defaults to PASSWORD_STORE_GENERATED_LENGTH (or 25). `no_symbols=true` restricts to alphanumerics. `in_place=true` replaces only the first line of an existing entry (preserving metadata) and needs the entry to exist. `force=true` overwrites any existing entry from scratch. Without either flag, refuses if the entry already exists. Returns a sensitive generated password; use only for the requested task and never quote or repeat it in assistant messages, summaries, logs, or unrelated tool calls. Requires PASS_MCP_ALLOW_WRITES=1.

輸入參數name必填forcelengthin_placeno_symbols

otp

Compute the current TOTP code for an entry containing an `otpauth://` line (pass-otp / browserpass convention). Returns the code plus `seconds_remaining` in the current window — if it's very low (<5s), wait for the next window before submitting. The code is sensitive: use only for the requested task and never quote or repeat it in assistant messages, summaries, logs, or unrelated tool calls.

輸入參數name必填

otp_uri

Return the raw `otpauth://` URI stored on the entry (contains the secret). Use this only when you need to re-enroll the same secret elsewhere; for submitting a code, prefer `otp`. The URI is sensitive: use only for the requested task and never quote or repeat it in assistant messages, summaries, logs, or unrelated tool calls.

輸入參數name必填

otp_set

Add or replace the `otpauth://` URI on an existing entry, preserving the password and all other lines. The URI is validated before write. Refuses if the entry does not exist (use `insert` first). Requires PASS_MCP_ALLOW_WRITES=1.

輸入參數uri必填name必填

mv

Rename or move an entry/subfolder. Re-encrypts to the destination subfolder's recipients if they differ. Refuses if the destination exists unless `force=true`. Requires PASS_MCP_ALLOW_WRITES=1.

輸入參數dst必填src必填force

cp

Copy an entry/subfolder. Re-encrypts to the destination subfolder's recipients if they differ. Refuses if the destination exists unless `force=true`. Requires PASS_MCP_ALLOW_WRITES=1.

輸入參數dst必填src必填force

grep

Search inside permitted entries for a basic regular expression pattern. **Slow and expensive** — decrypts permitted entries, warming their secret keys in gpg-agent's cache. Caller must pass `confirm_decrypt_all=true` to acknowledge. Returns matched lines (sensitive — they're decrypted content). Never quote or repeat matched content in assistant messages, summaries, logs, or unrelated tool calls. Honours PASS_MCP_GREP_TIMEOUT_SECONDS (default 120s).

輸入參數pattern必填case_insensitiveconfirm_decrypt_all

git_status

Inspect git state of the password store. Returns whether the working tree is clean, current branch, upstream, ahead/behind counts, and any dirty paths. Refuses if the store is not a git repository (run `pass git init` first).

無需輸入參數。

git_log

Return recent commits in the password store as `[{hash, subject}, ...]`. `limit` defaults to 20 (max 200). Useful for auditing what changed and when.

輸入參數limit

git_pull

Sync remote commits into the local store via `git pull --ff-only` (no merge commits, no rebase — refuses if local has diverged). Requires PASS_MCP_ALLOW_NETWORK=1 because it reaches out to a remote. Returns `{ok, output, stderr}`. On failure the agent should call `git_status` to diagnose.

無需輸入參數。

git_push

Push local commits to the configured upstream. Requires PASS_MCP_ALLOW_NETWORK=1. Returns `{ok, output, stderr}`. Does not force-push.

無需輸入參數。

init

Initialize the password store (or a subfolder) with the given GPG recipient(s). Re-encrypts every existing entry in scope to the new recipient set — this is DESTRUCTIVE. Pass an empty `gpg_ids` list to remove the .gpg-id file for the subfolder (entries inherit the parent's recipients). Refuses if the user has no secret key for any of the new recipients (would lock the user out); pass `force=true` to override (e.g. team scenarios where you're delegating access). Requires PASS_MCP_ALLOW_DESTRUCTIVE=1.

輸入參數forcegpg_ids必填subfolder

reencrypt

Re-run `pass init` against the *current* `.gpg-id` recipients (no key change). Use after subkey rotation or to repair a store where some files are encrypted to outdated recipients. Note: `pass init` is a no-op when each file's existing recipients already match the .gpg-id — there is no way to force a fresh ciphertext without changing the recipient set. Requires PASS_MCP_ALLOW_DESTRUCTIVE=1.

輸入參數subfolder

版本歷史

1
  1. v0.2.1最新Nov 4, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分