From 03536b0ab60f1989a6a6e5efd7ef3c33756ad041 Mon Sep 17 00:00:00 2001 From: loic wernert Date: Fri, 19 Jun 2026 01:18:16 +0200 Subject: [PATCH 1/4] feat(plugin): enrich skill descriptions for reliable auto-trigger (plugin 1.19.1) Add concrete trigger phrases to the bridge/discover skill descriptions (docker, kubernetes, systemd, logs, metrics, ports, hostnames) per Anthropic's skill-authoring guidance, so Claude auto-invokes them across more intents. Fix stale counts in discover (75 groups, 9 protocols; drop the removed ZeroMQ/NATS/MQTT/SNMP/NETCONF stubs). Plugin manifest -> 1.19.1; binary/crate unchanged at 1.19.0. Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude-plugin/marketplace.json | 2 +- CHANGELOG.md | 9 +++++++++ plugin/.claude-plugin/plugin.json | 2 +- plugin/skills/bridge/SKILL.md | 11 ++++++++--- plugin/skills/discover/SKILL.md | 12 ++++++++---- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 6cdfd86..cc6ea98 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -11,7 +11,7 @@ "name": "bridge-mcp", "source": "./plugin", "description": "Secure SSH bridge for remote server management — 357 tools across 75 groups (Linux, Windows, Docker, Kubernetes, cloud) over one SSH connection. CLI-first for 10-32x token savings vs MCP; MCP transport also available.", - "version": "1.19.0", + "version": "1.19.1", "category": "devops", "author": { "name": "muchiny", diff --git a/CHANGELOG.md b/CHANGELOG.md index 58e6a9d..3156034 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- **Plugin 1.19.1** (binary unchanged): enriched the `bridge` and `discover` + skill `description` frontmatter with concrete trigger phrases (docker, + kubernetes, systemd, logs, metrics, ports, host names) so Claude auto-invokes + them more reliably, per Anthropic's skill-authoring guidance. Fixed stale + counts in the `discover` skill (75 groups, 9 protocols — dropped the removed + ZeroMQ/NATS/MQTT/SNMP/NETCONF stubs). + ## [1.19.0] - 2026-06-19 ### Added diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json index d56d797..43e2197 100644 --- a/plugin/.claude-plugin/plugin.json +++ b/plugin/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "bridge-mcp", - "version": "1.19.0", + "version": "1.19.1", "description": "357-tool SSH bridge for secure remote server management. Execute commands on air-gapped Linux, Windows, Docker, Kubernetes hosts via SSH from Claude Code.", "author": { "name": "muchiny", diff --git a/plugin/skills/bridge/SKILL.md b/plugin/skills/bridge/SKILL.md index 94788c5..7e88aa4 100644 --- a/plugin/skills/bridge/SKILL.md +++ b/plugin/skills/bridge/SKILL.md @@ -1,9 +1,14 @@ --- name: bridge description: | - Use when the user says "bridge", "remote", "ssh", "run on host", "check host", - "configure host", "setup bridge", or wants to manage remote servers via CLI. - Provides guided SSH bridge setup, status checks, and tool execution. + Use when the user wants to run a command on or manage a remote host over SSH — + a server, Raspberry Pi, VM, NAS, network switch, or air-gapped machine. + Triggers: "check/manage my server", "run X on host Y", "ssh into / exec on + host", "restart nginx on prod", "docker ps / containers on", "kubectl / k8s + pods / helm on the cluster", "tail the logs on", "disk usage / cpu / memory / + processes on host", "what's listening on port", "is host reachable", "service + status", "configure / validate the bridge". Drives the bridge-mcp CLI (357 SSH + tools) — guided setup, status checks, and tool execution. user-invocable: true argument-hint: "[status|config|tool-name] [args...]" --- diff --git a/plugin/skills/discover/SKILL.md b/plugin/skills/discover/SKILL.md index 2d42473..447f75c 100644 --- a/plugin/skills/discover/SKILL.md +++ b/plugin/skills/discover/SKILL.md @@ -1,8 +1,12 @@ --- name: discover description: | - Use when the user wants to explore available tools, find tools by category, - or learn what bridge-mcp can do. Progressive discovery workflow. + Use when the user wants to explore, search, or learn what bridge-mcp can do: + "what tools are available", "list bridge tools", "find a tool for X", "show + docker / kubernetes / systemd / network tools", "search tools for logs / + firewall / packages / databases", "which tool groups exist", "what can the + bridge do". Progressive discovery across the 357 tools and 75 groups, with + token-efficient describe-tool output. user-invocable: true argument-hint: "[group-name|search-term]" --- @@ -33,6 +37,6 @@ telling you which params (jq_filter, columns, limit, etc.) apply for token-effic ## Tips for the user -- **74 groups**: docker, kubernetes, systemd, networking, firewall, packages, users, cron, logs, files, etc. +- **75 groups**: docker, kubernetes, systemd, networking, firewall, packages, users, cron, logs, files, etc. - **Token-efficient**: always use `columns`, `limit`, or `jq_filter` params to reduce output -- **13 protocols**: SSH, WinRM, Telnet, K8s Exec, Serial, AWS SSM, Azure, GCP, ZeroMQ, NATS, MQTT, SNMP, NETCONF +- **9 protocols**: SSH, WinRM, PSRP, Telnet, K8s Exec, Serial, AWS SSM, Azure, GCP From 648e4a771c9ec24376364aa736635b0ae1646450 Mon Sep 17 00:00:00 2001 From: loic wernert Date: Fri, 19 Jun 2026 01:27:21 +0200 Subject: [PATCH 2/4] docs: README marketplace install + rebrand to Bridge MCP; add version to skills Add a 'Claude Code plugin (one command)' install block to the README (marketplace add + plugin install + cargo --git bootstrap) and rebrand the top-level README title/branding 'MCP SSH Bridge' -> 'Bridge MCP' (it was missed by the earlier rebrand). Add the optional 'version' frontmatter field to the bridge/discover skills (1.19.1) for completeness per Anthropic's skill spec. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 20 +++++++++++++++----- plugin/skills/bridge/SKILL.md | 1 + plugin/skills/discover/SKILL.md | 1 + 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 5fb4708..5c18487 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -# MCP SSH Bridge +# Bridge MCP
-MCP SSH Bridge +Bridge MCP [![CI](https://github.com/muchiny/bridge-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/muchiny/bridge-mcp/actions/workflows/ci.yml) [![Crates.io](https://img.shields.io/crates/v/bridge-mcp?style=flat-square&logo=rust)](https://crates.io/crates/bridge-mcp) @@ -15,7 +15,7 @@ **A Rust MCP server for secure remote infrastructure management — 357 tools, 9 protocols.** ``` -Claude Code ◄──JSON-RPC──► MCP SSH Bridge ◄──9 protocols──► Your Infrastructure +Claude Code ◄──JSON-RPC──► Bridge MCP ◄──9 protocols──► Your Infrastructure ```
@@ -151,6 +151,16 @@ git clone https://github.com/muchiny/bridge-mcp && cd bridge-mcp && make release +> **Claude Code plugin (one command).** Install the plugin from the marketplace — it registers the `/bridge-mcp:bridge` and `/bridge-mcp:discover` skills, the MCP server, and a binary-bootstrap hook: +> +> ```bash +> claude plugin marketplace add muchiny/bridge-mcp +> claude plugin install bridge-mcp@muchiny +> cargo install --git https://github.com/muchiny/bridge-mcp --features full # the binary the plugin drives +> ``` +> +> The skills auto-trigger when you mention a remote host, Docker, Kubernetes, services, logs, ports, etc. + ### 2. Configure ```bash @@ -200,11 +210,11 @@ bridge-mcp status ## Architecture -MCP SSH Bridge sits between Claude Code and your infrastructure. It routes commands through 9 protocol adapters with built-in security validation, output sanitization, and audit logging. +Bridge MCP sits between Claude Code and your infrastructure. It routes commands through 9 protocol adapters with built-in security validation, output sanitization, and audit logging. ```mermaid graph LR - CC[Claude Code] -->|JSON-RPC stdio or Unix socket| BR[MCP SSH Bridge] + CC[Claude Code] -->|JSON-RPC stdio or Unix socket| BR[Bridge MCP] BR --> SEC[Security
Validator · Sanitizer · Audit] SEC --> ER[Executor Router] diff --git a/plugin/skills/bridge/SKILL.md b/plugin/skills/bridge/SKILL.md index 7e88aa4..f7d9b59 100644 --- a/plugin/skills/bridge/SKILL.md +++ b/plugin/skills/bridge/SKILL.md @@ -1,5 +1,6 @@ --- name: bridge +version: 1.19.1 description: | Use when the user wants to run a command on or manage a remote host over SSH — a server, Raspberry Pi, VM, NAS, network switch, or air-gapped machine. diff --git a/plugin/skills/discover/SKILL.md b/plugin/skills/discover/SKILL.md index 447f75c..ebbabb7 100644 --- a/plugin/skills/discover/SKILL.md +++ b/plugin/skills/discover/SKILL.md @@ -1,5 +1,6 @@ --- name: discover +version: 1.19.1 description: | Use when the user wants to explore, search, or learn what bridge-mcp can do: "what tools are available", "list bridge tools", "find a tool for X", "show From 5b90ed4c814e8b5a2197dcbc1e891799aaeae889 Mon Sep 17 00:00:00 2001 From: loic wernert Date: Fri, 19 Jun 2026 01:40:26 +0200 Subject: [PATCH 3/4] =?UTF-8?q?feat(plugin):=20binary=20bootstrap=20script?= =?UTF-8?q?=20=E2=80=94=20prebuilt=20download,=20cargo=20fallback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add plugin/scripts/install.sh: detects platform, downloads the matching prebuilt release asset (bridge-mcp-{linux-x86_64,linux-arm64,macos-arm64}.tar.gz, sha256-verified) — fast, no Rust toolchain — and falls back to 'cargo install --git' when no prebuilt matches. The SessionStart hook now points at it via ${CLAUDE_PLUGIN_ROOT} instead of the bare cargo command, so a user without the binary runs one platform-agnostic command. shellcheck-clean; prebuilt URLs verified reachable. Co-Authored-By: Claude Opus 4.8 (1M context) --- plugin/hooks/hooks.json | 2 +- plugin/scripts/install.sh | 94 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100755 plugin/scripts/install.sh diff --git a/plugin/hooks/hooks.json b/plugin/hooks/hooks.json index 18372e6..9499628 100644 --- a/plugin/hooks/hooks.json +++ b/plugin/hooks/hooks.json @@ -6,7 +6,7 @@ "hooks": [ { "type": "command", - "command": "command -v bridge-mcp >/dev/null 2>&1 && echo 'Bridge MCP ready. Use /bridge-mcp:bridge to manage remote hosts, or /bridge-mcp:discover to explore 357 tools.' || echo '⚠️ Bridge MCP plugin loaded, but the bridge-mcp binary was not found on PATH. Install it: cargo install --git https://github.com/muchiny/bridge-mcp --features full'" + "command": "command -v bridge-mcp >/dev/null 2>&1 && echo 'Bridge MCP ready. Use /bridge-mcp:bridge to manage remote hosts, or /bridge-mcp:discover to explore 357 tools.' || echo \"⚠️ Bridge MCP plugin loaded, but the bridge-mcp binary was not found on PATH. Install it (downloads a prebuilt binary, falls back to cargo): bash '${CLAUDE_PLUGIN_ROOT}/scripts/install.sh'\"" } ] } diff --git a/plugin/scripts/install.sh b/plugin/scripts/install.sh new file mode 100755 index 0000000..c181ae3 --- /dev/null +++ b/plugin/scripts/install.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash +# Bridge MCP binary bootstrap. +# +# Installs the `bridge-mcp` binary that the plugin drives. Strategy: +# 1. already on PATH -> nothing to do +# 2. prebuilt release asset -> download + extract (fast, no Rust toolchain) +# 3. cargo install --git -> build from source (fallback; needs Rust) +# +# Safe to re-run (idempotent). Installs to ~/.local/bin. +set -euo pipefail + +REPO="muchiny/bridge-mcp" +BIN="bridge-mcp" +DEST="${HOME}/.local/bin" + +if command -v "${BIN}" >/dev/null 2>&1; then + echo "✔ ${BIN} already installed: $("${BIN}" --version 2>/dev/null || echo present)" + exit 0 +fi + +mkdir -p "${DEST}" + +# Map the current platform to a release asset name. +os="$(uname -s)" +arch="$(uname -m)" +asset="" +case "${os}" in + Linux) + case "${arch}" in + x86_64 | amd64) asset="${BIN}-linux-x86_64.tar.gz" ;; + aarch64 | arm64) asset="${BIN}-linux-arm64.tar.gz" ;; + esac + ;; + Darwin) + case "${arch}" in + arm64) asset="${BIN}-macos-arm64.tar.gz" ;; + esac + ;; +esac + +install_prebuilt() { + [ -n "${asset}" ] || return 1 + command -v curl >/dev/null 2>&1 || return 1 + local url="https://github.com/${REPO}/releases/latest/download/${asset}" + local tmp + tmp="$(mktemp -d)" + echo "↓ Downloading prebuilt binary: ${url}" + if ! curl -fsSL "${url}" -o "${tmp}/bin.tar.gz"; then + rm -rf "${tmp}" + return 1 + fi + # Verify the checksum when available (and sha256sum exists). + if command -v sha256sum >/dev/null 2>&1 && + curl -fsSL "${url}.sha256" -o "${tmp}/bin.sha256" 2>/dev/null; then + local want got + want="$(awk '{print $1}' "${tmp}/bin.sha256")" + got="$(sha256sum "${tmp}/bin.tar.gz" | awk '{print $1}')" + if [ "${want}" != "${got}" ]; then + echo "✗ checksum mismatch (expected ${want}, got ${got})" + rm -rf "${tmp}" + return 1 + fi + fi + tar -xzf "${tmp}/bin.tar.gz" -C "${tmp}" + install -m 0755 "${tmp}/${BIN}" "${DEST}/${BIN}" + rm -rf "${tmp}" +} + +install_cargo() { + if ! command -v cargo >/dev/null 2>&1; then + echo "✗ No prebuilt for ${os}/${arch} and cargo is not installed." + echo " Install Rust (https://rustup.rs) or grab a binary from:" + echo " https://github.com/${REPO}/releases/latest" + return 1 + fi + echo "⚙ No prebuilt for ${os}/${arch}; building from source (a few minutes)…" + cargo install --git "https://github.com/${REPO}" --features full +} + +if install_prebuilt; then + echo "✔ Installed ${BIN} -> ${DEST}/${BIN}" +elif install_cargo; then + echo "✔ Installed ${BIN} via cargo" +else + echo "✗ bridge-mcp install failed. See https://github.com/${REPO}#install" + exit 1 +fi + +case ":${PATH}:" in + *":${DEST}:"*) ;; + *) echo "⚠ ${DEST} is not on your PATH — add: export PATH=\"${DEST}:\$PATH\"" ;; +esac + +"${DEST}/${BIN}" --version 2>/dev/null || "${BIN}" --version 2>/dev/null || true From 510725f0297399fd328a160cd9c18c4805b70e50 Mon Sep 17 00:00:00 2001 From: loic wernert Date: Fri, 19 Jun 2026 01:46:15 +0200 Subject: [PATCH 4/4] feat(plugin): auto-install the binary on SessionStart (prebuilt download) The SessionStart hook now auto-runs scripts/install.sh (BRIDGE_MCP_BOOTSTRAP_AUTO=1, timeout 90s) when the binary is missing, instead of only printing the command. Auto mode downloads the platform's prebuilt release asset (fast, fits the hook timeout); when no prebuilt matches the platform it prints the 'cargo install' command rather than blocking session start on a multi-minute build. Co-Authored-By: Claude Opus 4.8 (1M context) --- plugin/hooks/hooks.json | 3 ++- plugin/scripts/install.sh | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/plugin/hooks/hooks.json b/plugin/hooks/hooks.json index 9499628..9b475c9 100644 --- a/plugin/hooks/hooks.json +++ b/plugin/hooks/hooks.json @@ -6,7 +6,8 @@ "hooks": [ { "type": "command", - "command": "command -v bridge-mcp >/dev/null 2>&1 && echo 'Bridge MCP ready. Use /bridge-mcp:bridge to manage remote hosts, or /bridge-mcp:discover to explore 357 tools.' || echo \"⚠️ Bridge MCP plugin loaded, but the bridge-mcp binary was not found on PATH. Install it (downloads a prebuilt binary, falls back to cargo): bash '${CLAUDE_PLUGIN_ROOT}/scripts/install.sh'\"" + "command": "command -v bridge-mcp >/dev/null 2>&1 && echo 'Bridge MCP ready. Use /bridge-mcp:bridge to manage remote hosts, or /bridge-mcp:discover to explore 357 tools.' || { echo '⚠️ bridge-mcp binary not found — auto-installing (prebuilt download)…'; BRIDGE_MCP_BOOTSTRAP_AUTO=1 bash \"${CLAUDE_PLUGIN_ROOT}/scripts/install.sh\"; }", + "timeout": 90 } ] } diff --git a/plugin/scripts/install.sh b/plugin/scripts/install.sh index c181ae3..214bf14 100755 --- a/plugin/scripts/install.sh +++ b/plugin/scripts/install.sh @@ -12,6 +12,9 @@ set -euo pipefail REPO="muchiny/bridge-mcp" BIN="bridge-mcp" DEST="${HOME}/.local/bin" +# When set (e.g. auto-run from the SessionStart hook), never block on a +# multi-minute `cargo` build — print the manual command instead. +AUTO="${BRIDGE_MCP_BOOTSTRAP_AUTO:-}" if command -v "${BIN}" >/dev/null 2>&1; then echo "✔ ${BIN} already installed: $("${BIN}" --version 2>/dev/null || echo present)" @@ -79,6 +82,11 @@ install_cargo() { if install_prebuilt; then echo "✔ Installed ${BIN} -> ${DEST}/${BIN}" +elif [ -n "${AUTO}" ]; then + # Auto mode (hook): no prebuilt for this platform — don't block on a build. + echo "ℹ No prebuilt binary for ${os}/${arch}. Build it manually (needs Rust):" + echo " cargo install --git https://github.com/${REPO} --features full" + exit 0 elif install_cargo; then echo "✔ Installed ${BIN} via cargo" else