Holster MCP

com.nautaaiPublished by nautaai.comv0.1.1Updated Oct 24, 2026

Local-first secret scanning, rotation, vault, and audit-log tools for AI agents.

VerifiedSTDIODesktop onlyDeveloper ToolsSecurity & Monitoring

Overview

AI-generated overview

Local-first MCP server that lets an AI assistant scan repositories for secrets, check gitignore coverage, get rotation playbooks, and manage a local credential.

What you can do
Scan a repository path for exposed secrets and report file, line, secret kind and severity, with a depth limit on the scan. Check a repository's gitignore for missing or unsafe patterns and get a suggested append. Retrieve provider-specific credential rotation playbooks with steps, time estimates and warnings. Add secrets to a local vault and rotate vault entries for supported providers, with the old entry marked superseded. Query the local audit log of vault actions by provider, account and time window.
When to use it
Useful when you want an assistant to audit a codebase for leaked credentials before committing or publishing, tighten gitignore rules, or walk through rotating a compromised key while keeping secrets in a local vault rather than in chat or shell history.
Requirements
Runs as a local process on the user's machine, installed from PyPI (holster-mcp) and started with the holster-mcp command or via uvx. Needs a bundled or discoverable holster-doctor binary; platform wheels are provided for macOS ARM and Linux x86_64 only. Paid vault and audit tools require a Holster license and a local vault configured by argument, HOLSTER_VAULT_PATH or a config file.
Before you install
The vault tools accept secret values as tool input, so pasted credentials pass through the assistant conversation; the README states values are kept out of CLI arguments, logs and error output, but review this before use. Vault and audit tools are paid and gated by a license. Vault operations write to and supersede entries in the local vault. Free scanning tools are described as local-only and not sending repository contents to a network service.

Installation

In SourceWeft

  1. Open Holster MCP in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Holster MCP

Holster MCP exposes local Holster Doctor checks to MCP-compatible agents. The server is local-first: free tools shell out to the bundled holster-doctor binary and never send repository contents to a network service.

Install

From PyPI:

bash
pip install holster-mcp

Development install:

bash
cd /path/to/holster/mcppython3.11 -m pip install -e '.[dev]'

Runtime command:

bash
holster-mcp

MCP client config:

json
{  "mcpServers": {    "holster": {      "command": "uvx",      "args": ["holster-mcp"]    }  }}

See the main Holster README for vault and holster-cli release binary installation.

License: MIT for the MCP package.

Binary Resolution

The server locates holster-doctor in this order:

  1. HOLSTER_DOCTOR_BIN
  2. Packaged wheel binary at holster_mcp/bin/holster-doctor
  3. holster-doctor on PATH
  4. Repo-local target/release/holster-doctor
  5. Repo-local target/debug/holster-doctor

Free Tools

holster.scan_repo

Input:

json
{"path": "/absolute/repo/path", "depth": 3}

Output:

json
{  "ok": true,  "scanned_files": 15,  "findings": [    {      "file": "src/main.py",      "line": 12,      "secret_kind": "openai_api_key",      "severity": "error",      "suggestion": "Rotate this key and move it into a local vault."    }  ]}

holster.check_gitignore

Input:

json
{"path": "/absolute/repo/path"}

Output:

json
{  "ok": true,  "missing_patterns": [".env.local"],  "existing_safe": [".env"],  "existing_unsafe": [],  "suggested_append": ".env.local\n*.pem"}

holster.rotation_playbook

Input:

json
{"provider": "github"}

Output:

json
{  "ok": true,  "provider": "github",  "steps": ["Create a replacement token...", "Update local consumers...", "Revoke the old token..."],  "estimated_minutes": 15,  "warnings": ["Do not revoke the old credential until the replacement has been verified."]}

Platform Wheels

Day 1 wheels are built for:

  • macOS ARM (aarch64-apple-darwin)
  • Linux x86_64 (x86_64-unknown-linux-gnu)

The wheels bundle the platform's holster-doctor binary and are intentionally not universal.

Paid Tools

Paid tools are local-only wrappers around holster-cli and are gated by a Holster license.

License Configuration

License lookup order:

  1. license_key argument passed to a paid MCP tool
  2. HOLSTER_LICENSE_KEY
  3. ~/.holster/config.toml

Supported config.toml shapes:

toml
license_key = "holster_live_ABCDEFGHIJKLMNOPQRSTUVWX"vault_path = "/absolute/path/to/holster-vault.db"

or:

toml
[license]key = "holster_live_ABCDEFGHIJKLMNOPQRSTUVWX"
[vault]path = "/absolute/path/to/holster-vault.db"

License cache:

text
~/.holster/licenses.db

If no license is configured, the first paid-tool call creates a local 7-day trial key with prefix holster_trial_.

Vault Configuration

Vault path lookup order:

  1. explicit tool argument where supported
  2. HOLSTER_VAULT_PATH
  3. ~/.holster/config.toml

holster.vault_add

Input:

json
{  "provider": "github",  "account": "nauta-ai",  "secret": "user-pasted-secret",  "label": "primary"}

Output:

json
{"ok": true, "vault_entry_id": "123e4567-e89b-12d3-a456-426614174000", "error": null}

The secret value is never placed in CLI argv, logs, or structured error output.

holster.vault_rotate

Day 2 supports github and stripe.

Without new_secret, the tool returns the provider playbook and waits for the human to rotate/paste the replacement:

json
{  "provider": "github",  "account": "nauta-ai",  "vault_entry_id": "old-id"}

With new_secret, the replacement is added to the local vault and the old entry is marked superseded when the installed CLI supports that command.

holster.audit_log

Input:

json
{"provider": "github", "account": "nauta-ai", "since_days": 30}

Output:

json
{"ok": true, "events": [{"ts": "...", "action": "add", "provider": "github", "account": "nauta-ai", "ok": true}]}

License Architecture

mermaid
flowchart TD  A["Paid MCP tool call"] --> B["Resolve license key from arg/env/config"]  B --> C{"Key present?"}  C -- "No" --> D["Create local 7-day trial in ~/.holster/licenses.db"]  C -- "Yes" --> E["Read ~/.holster/licenses.db"]  D --> F{"Trial valid?"}  E --> G{"Cached license valid?"}  G -- "Valid" --> H["Dispatch paid tool"]  G -- "Expired but within 7-day grace" --> I["Dispatch with license_warning"]  G -- "Missing/stale live key" --> J["Stripe refresh: Customer.retrieve + Subscription.list"]  J -- "Active" --> K["Update cache valid_until + last_checked"]  J -- "Inactive/error/no API key" --> L["Return license_required_or_expired"]  F -- "Valid" --> H  F -- "Expired" --> L  K --> H  I --> H  H --> M["Local holster-cli subprocess"]

The background poller refreshes cached live licenses every 10 minutes after a paid tool validates. There is no webhook receiver in Day 2 and no telemetry in V1.

Source: mcp/README.md at commit bd70dbf

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.1LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts