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.
- package/CHANGELOG.md +17 -0
- package/dist/connector-profile.d.ts +16 -2
- package/dist/connector-profile.d.ts.map +1 -1
- package/dist/connector-profile.js.map +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.js +1 -1
- package/dist/prompts.d.ts +2 -11
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js.map +1 -1
- package/dist/remote/agent-executor.d.ts.map +1 -1
- package/dist/remote/agent-executor.js +3 -6
- package/dist/remote/agent-executor.js.map +1 -1
- package/dist/remote/control-plane.d.ts.map +1 -1
- package/dist/remote/control-plane.js +13 -0
- package/dist/remote/control-plane.js.map +1 -1
- package/dist/remote/oauth-handler.d.ts +6 -0
- package/dist/remote/oauth-handler.d.ts.map +1 -1
- package/dist/remote/oauth-handler.js +61 -1
- package/dist/remote/oauth-handler.js.map +1 -1
- package/dist/remote/safe-file.d.ts +2 -1
- package/dist/remote/safe-file.d.ts.map +1 -1
- package/dist/remote/safe-file.js +51 -53
- package/dist/remote/safe-file.js.map +1 -1
- package/dist/resources.d.ts +2 -7
- package/dist/resources.d.ts.map +1 -1
- package/dist/resources.js.map +1 -1
- package/dist/session.d.ts +4 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +38 -15
- package/dist/session.js.map +1 -1
- package/docs/development/coding-standards.md +8 -2
- package/docs/development/release-process.md +29 -55
- package/docs/remote-mcp-hardening.md +17 -0
- package/mcp.json +1 -1
- package/package.json +6 -4
- package/registry/ssh-mcp-pro/mcp.json +1 -1
- package/server.json +3 -3
|
@@ -1,57 +1,31 @@
|
|
|
1
1
|
# Release Process
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
163
|
-
"check:circular": "depcruise src --config .dependency-cruiser.mjs
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
25
|
+
"version": "1.2.3",
|
|
26
26
|
"runtimeHint": "npx",
|
|
27
27
|
"transport": {
|
|
28
28
|
"type": "streamable-http",
|