ssh-mcp-pro 1.2.1 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,57 +1,31 @@
1
1
  # Release Process
2
2
 
3
- ## Versioning
4
-
5
- Semantic Versioning, automated by [release-please](https://github.com/googleapis/release-please)
6
- per [release-please-config.json](../../release-please-config.json) (`node` release
7
- type). Conventional Commit types on `main` (see
8
- [commit-conventions.md](commit-conventions.md)) drive whether the next release is a
9
- patch, minor, or major bump.
10
-
11
- ## How a release happens
12
-
13
- 1. Conventional commits land on `main`.
14
- 2. The `release` job in [.github/workflows/release.yml](../../.github/workflows/release.yml)
15
- runs `googleapis/release-please-action`, which opens or updates a release PR
16
- (updating `CHANGELOG.md`, `.release-please-manifest.json`, and the version fields
17
- release-please is configured to touch — see `extra-files` in
18
- `release-please-config.json`, which includes `mcp.json`, `server.json`, and the MCP
19
- registry record).
20
- 3. Merging that PR triggers `release_created`, which runs the `release-assets` job:
21
- - `pnpm run check` (full quality gate) must pass.
22
- - `pnpm run sbom` generates a CycloneDX SBOM.
23
- - The package is packed with `pnpm pack`, and both the tarball and the SBOM get a
24
- `sha256sum` checksum file.
25
- - `actions/attest-build-provenance` runs twice — once for the package, once for the
26
- SBOM — producing verifiable build provenance attestations.
27
- - All artifacts (tarball, SBOM, checksums) are attached to the GitHub Release.
28
- - npm publish only happens if the repository variable `AUTO_RELEASE_PUBLISH` is
29
- `"true"`; otherwise the step is a documented no-op ("npm publishing is disabled by
30
- AUTO_RELEASE_PUBLISH").
31
-
32
- ## Verifying a release artifact
33
-
34
- ```bash
35
- sha256sum -c ssh-mcp-pro-<version>.tgz.sha256
36
- ```
37
-
38
- For provenance, use [GitHub CLI attestation verification](https://cli.github.com/manual/gh_attestation_verify):
39
-
40
- ```bash
41
- gh attestation verify ssh-mcp-pro-<version>.tgz --owner oaslananka
42
- ```
43
-
44
- See [docs/security/release-integrity.md](../security/release-integrity.md) for the full
45
- supply-chain rationale.
46
-
47
- ## Current status
48
-
49
- No release has been published yet (repository created 2026-06-28). Release PR #1
50
- (`chore(main): release ssh-mcp-pro 1.2.0`) is open and is the first opportunity to
51
- exercise this pipeline end-to-end — see [ROADMAP.md](../../ROADMAP.md).
52
-
53
- ## Container images
54
-
55
- Published separately by [.github/workflows/docker.yml](../../.github/workflows/docker.yml)
56
- on tagged releases; see [docs/docker.md](../docker.md) for tag policy and digest-pinned
57
- usage.
3
+ ## Prepare a version
4
+
5
+ Release Please v5 prepares Conventional Commit-driven version updates on `main`. A release PR updates `CHANGELOG.md`, package, registry metadata, client readiness metadata and embedded version strings together. Merge a release PR only after the normal protected-branch checks pass.
6
+
7
+ When an unreleased version reaches `main`, the `Release` workflow preflights the **frozen dependency installation, full quality check, dependency freshness, package build, SBOM, checksums and GitHub artifact attestations** before Release Please creates the tag. It then attaches that exact prebuilt package and SBOM to the GitHub Release and dispatches an immutable-tag GHCR build. Ordinary main pushes without a new version do not repeat the heavy preflight.
8
+
9
+ ## One-click npm publication
10
+
11
+ **Actions → Release → Run workflow → main → Run workflow** is the **manual npm publish button**. No extra version input, stage job or automatic npm publish on release PR merge is involved.
12
+
13
+ The `Publish current GitHub Release to npm` job identifies the `package.json` version on `main`, locates its immutable GitHub Release, downloads the already-built `.tgz` and checksum, verifies the tag's source/version, checks SHA-256, package metadata and the GitHub attestation, then calls **`npm publish` directly with GitHub-hosted Actions OIDC**. A version already public on npm is not published twice. After confirming that exact npm version is public, it dispatches the matching MCP Registry publication job. npm Trusted Publisher must authorize `.github/workflows/release.yml` and permit **direct publication**, not stage-only. This is a provider-side prerequisite, not a second GitHub workflow.
14
+
15
+ GitHub does not override npm account/package security settings. If the npm publisher is configured for stage-only access or another mandatory owner restriction, the direct publish job fails clearly instead of silently staging or bypassing security. Avoid publishing historical versions to work around an npm account restriction; repair the publisher configuration through authorized account settings.
16
+
17
+ ## GHCR and MCP Registry
18
+
19
+ The release workflow triggers `.github/workflows/docker.yml` with the immutable `ssh-mcp-pro-vX.Y.Z` tag. GHCR must grant this repository's GitHub Actions **Write** access to the existing `ghcr.io/oaslananka/ssh-mcp-pro` package. Package access is managed through **GitHub Packages → Package settings → Manage Actions access**. Docker publishing verifies the release tag and package version before pushing both platform tags.
20
+
21
+ The MCP Registry job requires an existing GitHub Release and the *same publicly visible npm version*. It skips versions already registered and uses GitHub OIDC. There is no daily staged-publication reconciliation job. The manual npm publish workflow dispatches the MCP Registry publication only after npm confirms the version is public.
22
+
23
+ ## Verify and troubleshoot
24
+
25
+ - `gh release view ssh-mcp-pro-vX.Y.Z --json assets` — the prepared GitHub Release.
26
+ - `gh run list --workflow release.yml` — release preparation and manual npm publication status.
27
+ - `npm view ssh-mcp-pro@X.Y.Z version` — independently verify actual npm publication.
28
+ - `gh run list --workflow docker.yml` and `gh api users/oaslananka/packages/container/ssh-mcp-pro` — GHCR status.
29
+ - `gh run list --workflow publish-mcp-registry.yml` — MCP Registry publication.
30
+
31
+ Do not confuse a successful GitHub Release (or npm production environment deployment event) with a successful public npm/GHCR publication. Check the actual registry records before announcing an ecosystem release.
@@ -21,6 +21,23 @@ Use this checklist before exposing `ssh-mcp-pro` through a public Streamable HTT
21
21
 
22
22
  ## OAuth and token verification
23
23
 
24
+ The remote control plane requires explicit browser confirmation before redirecting
25
+ users to GitHub OAuth. `/oauth/authorize` shows the client destination and scopes;
26
+ a same-browser, short-lived HttpOnly/SameSite transaction cookie is required by
27
+ `POST /oauth/approve` and the GitHub callback. Real HTTPS deployments add `Secure`.
28
+ Clients must keep PKCE and exact registered redirect URI matching. Public dynamic
29
+ client registrations are limited to 20 per TCP peer per five minutes per process,
30
+ with the existing global database cap retained. Deployments behind shared proxies
31
+ should also enforce edge rate limits and monitor registration exhaustion.
32
+
33
+ Remote REST endpoints enforce OAuth token capabilities independently: agent list
34
+ and details require `agents:read`; audit history requires `agents:admin`.
35
+
36
+ Remote agent file writes use verified same-directory temporary files and atomic
37
+ replacement so an interrupted write does not truncate an existing target. Renaming
38
+ requires write permission on the containing directory, in addition to file access.
39
+
40
+
24
41
  - Prefer OAuth mode for public endpoints.
25
42
  - Configure `SSH_MCP_OAUTH_ISSUER`, `SSH_MCP_OAUTH_JWKS_URL`, and either `SSH_MCP_OAUTH_AUDIENCE` or `SSH_MCP_OAUTH_RESOURCE` explicitly.
26
43
  - Use `SSH_MCP_OAUTH_ALLOWED_ALGORITHMS` to pin accepted JWT algorithms when your authorization server has a stable signing policy.
package/mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "ssh-mcp-pro",
3
3
  "display_name": "ssh-mcp-pro",
4
4
  "description": "Secure MCP SSH automation server with policy controls, resources, prompts, stdio, and HTTP.",
5
- "version": "1.2.1",
5
+ "version": "1.2.3",
6
6
  "author": "Osman Aslan",
7
7
  "license": "MIT",
8
8
  "runtime": "node",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ssh-mcp-pro",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "mcpName": "io.github.oaslananka/ssh-mcp-pro",
5
5
  "description": "Model Context Protocol (MCP) SSH client server for remote automation",
6
6
  "type": "module",
@@ -67,6 +67,7 @@
67
67
  "@opentelemetry/resources": "^2.11.0",
68
68
  "@opentelemetry/sdk-node": "^0.222.0",
69
69
  "@opentelemetry/semantic-conventions": "^1.43.0",
70
+ "html-escaper": "3.0.3",
70
71
  "jose": "6.2.3",
71
72
  "node-ssh": "^13.2.1",
72
73
  "ws": "^8.21.1",
@@ -76,6 +77,7 @@
76
77
  "@stryker-mutator/core": "9.6.1",
77
78
  "@stryker-mutator/typescript-checker": "9.6.1",
78
79
  "@stryker-mutator/vitest-runner": "9.6.1",
80
+ "@types/html-escaper": "3.0.4",
79
81
  "@types/node": "^24.13.1",
80
82
  "@types/ssh2": "^1.15.6",
81
83
  "@types/ws": "^8.18.2",
@@ -101,7 +103,7 @@
101
103
  "ip-address": "^10.7.1",
102
104
  "nanoid": "^3.3.18",
103
105
  "browserslist": "^4.28.7",
104
- "@hono/node-server": "^2.0.5",
106
+ "@hono/node-server": "^2.1.3",
105
107
  "markdown-it": "^14.3.2",
106
108
  "vitest": "^4.1.11"
107
109
  },
@@ -159,8 +161,8 @@
159
161
  "pack:check": "node scripts/check-package-contents.mjs",
160
162
  "pack:install-smoke": "node scripts/check-package-install-smoke.mjs",
161
163
  "pack:lint": "publint --strict=false",
162
- "check:knip": "knip -c knip.jsonc --reporter compact || true",
163
- "check:circular": "depcruise src --config .dependency-cruiser.mjs || true",
164
+ "check:knip": "knip -c knip.jsonc --include files,dependencies,unlisted,unresolved,cycles --reporter compact",
165
+ "check:circular": "depcruise src --config .dependency-cruiser.mjs",
164
166
  "check:module-size": "node scripts/check-module-size.mjs",
165
167
  "check:maintainability": "pnpm run check:module-size && pnpm run check:circular && pnpm run check:knip",
166
168
  "check:quality": "pnpm run format:check && pnpm run check:doc-language && pnpm run check:package-scripts && pnpm run check:rulesets && pnpm run verify:actions-runtime && pnpm run lint && pnpm run typecheck && pnpm run audit && pnpm run licenses:check",
@@ -2,7 +2,7 @@
2
2
  "name": "ssh-mcp-pro",
3
3
  "display_name": "ssh-mcp-pro",
4
4
  "description": "Secure MCP SSH automation server with policy controls, resources, prompts, stdio, and HTTP.",
5
- "version": "1.2.1",
5
+ "version": "1.2.3",
6
6
  "author": "Osman Aslan",
7
7
  "license": "MIT",
8
8
  "runtime": "node",
package/server.json CHANGED
@@ -7,13 +7,13 @@
7
7
  "url": "https://github.com/oaslananka/ssh-mcp-pro",
8
8
  "source": "github"
9
9
  },
10
- "version": "1.2.1",
10
+ "version": "1.2.3",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "registryBaseUrl": "https://registry.npmjs.org",
15
15
  "identifier": "ssh-mcp-pro",
16
- "version": "1.2.1",
16
+ "version": "1.2.3",
17
17
  "transport": {
18
18
  "type": "stdio"
19
19
  }
@@ -22,7 +22,7 @@
22
22
  "registryType": "npm",
23
23
  "registryBaseUrl": "https://registry.npmjs.org",
24
24
  "identifier": "ssh-mcp-pro",
25
- "version": "1.2.1",
25
+ "version": "1.2.3",
26
26
  "runtimeHint": "npx",
27
27
  "transport": {
28
28
  "type": "streamable-http",