ssh-mcp-pro 1.0.0 → 1.1.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.
Files changed (66) hide show
  1. package/ARCHITECTURE.md +1 -1
  2. package/CHANGELOG.md +71 -0
  3. package/LICENSES/MIT.txt +1 -1
  4. package/README.md +38 -1
  5. package/SUPPORT.md +95 -0
  6. package/dist/agent-bin.js +0 -0
  7. package/dist/config-parsers.d.ts +12 -0
  8. package/dist/config-parsers.d.ts.map +1 -0
  9. package/dist/config-parsers.js +60 -0
  10. package/dist/config-parsers.js.map +1 -0
  11. package/dist/config.d.ts +3 -2
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +3 -58
  14. package/dist/config.js.map +1 -1
  15. package/dist/ensure-pkg.d.ts +9 -0
  16. package/dist/ensure-pkg.d.ts.map +1 -0
  17. package/dist/ensure-pkg.js +105 -0
  18. package/dist/ensure-pkg.js.map +1 -0
  19. package/dist/ensure.d.ts.map +1 -1
  20. package/dist/ensure.js +2 -104
  21. package/dist/ensure.js.map +1 -1
  22. package/dist/fs-sftp.d.ts +58 -0
  23. package/dist/fs-sftp.d.ts.map +1 -0
  24. package/dist/fs-sftp.js +184 -0
  25. package/dist/fs-sftp.js.map +1 -0
  26. package/dist/fs-tools.d.ts.map +1 -1
  27. package/dist/fs-tools.js +2 -144
  28. package/dist/fs-tools.js.map +1 -1
  29. package/dist/index.js +0 -0
  30. package/dist/mcp.d.ts +1 -1
  31. package/dist/mcp.js +1 -1
  32. package/dist/remote/agent-executor.d.ts.map +1 -1
  33. package/dist/remote/agent-executor.js +16 -4
  34. package/dist/remote/agent-executor.js.map +1 -1
  35. package/dist/remote/agent-handler.d.ts +36 -0
  36. package/dist/remote/agent-handler.d.ts.map +1 -0
  37. package/dist/remote/agent-handler.js +255 -0
  38. package/dist/remote/agent-handler.js.map +1 -0
  39. package/dist/remote/control-plane.d.ts +4 -17
  40. package/dist/remote/control-plane.d.ts.map +1 -1
  41. package/dist/remote/control-plane.js +24 -651
  42. package/dist/remote/control-plane.js.map +1 -1
  43. package/dist/remote/http-util.d.ts +29 -0
  44. package/dist/remote/http-util.d.ts.map +1 -0
  45. package/dist/remote/http-util.js +159 -0
  46. package/dist/remote/http-util.js.map +1 -0
  47. package/dist/remote/oauth-handler.d.ts +47 -0
  48. package/dist/remote/oauth-handler.d.ts.map +1 -0
  49. package/dist/remote/oauth-handler.js +296 -0
  50. package/dist/remote/oauth-handler.js.map +1 -0
  51. package/dist/session-auth.d.ts +39 -0
  52. package/dist/session-auth.d.ts.map +1 -0
  53. package/dist/session-auth.js +148 -0
  54. package/dist/session-auth.js.map +1 -0
  55. package/dist/session.d.ts +0 -19
  56. package/dist/session.d.ts.map +1 -1
  57. package/dist/session.js +8 -154
  58. package/dist/session.js.map +1 -1
  59. package/docs/audit/2026-06-05-ecosystem-audit.md +146 -0
  60. package/docs/docker.md +39 -0
  61. package/docs/governance/issue-taxonomy.json +141 -0
  62. package/docs/testing.md +50 -0
  63. package/mcp.json +1 -1
  64. package/package.json +80 -71
  65. package/registry/ssh-mcp-pro/mcp.json +1 -1
  66. package/server.json +3 -3
@@ -0,0 +1,50 @@
1
+ # Testing
2
+
3
+ ## Mutation testing
4
+
5
+ Mutation testing is configured for policy-critical security surfaces only. The
6
+ line-range allowlist lives in `stryker.conf.mjs` and covers the allow/deny
7
+ branches in `src/policy.ts`, `src/safety.ts`, `src/config.ts`,
8
+ `src/session.ts`, `src/http-security.ts`, and the auth and remote control-plane
9
+ policy modules. Whole-file mutation targets are intentionally avoided so the
10
+ scheduled gate stays bounded. Stryker uses `vitest.mutation.config.ts` so the
11
+ advisory gate runs only unit-level security regression tests and does not
12
+ require integration, E2E, or performance fixtures. Static file-load mutants are
13
+ ignored with Stryker's `ignoreStatic` setting to keep the scheduled gate runtime
14
+ predictable while the mutation score is advisory.
15
+
16
+ The CI mutation job is advisory while the score is calibrated. It runs on
17
+ `schedule` and `workflow_dispatch`, uses `continue-on-error: true`, and uploads
18
+ `reports/mutation` for review.
19
+
20
+ Promotion criteria:
21
+
22
+ - Keep the mutation allowlist focused on policy-critical modules until runtime
23
+ is stable.
24
+ - Reach and hold the 80% high-score target for at least three scheduled runs.
25
+ - Investigate surviving mutants in root login denial, strict host-key mode,
26
+ destructive command denial, raw sudo denial, tunnel bind-host denial, and path
27
+ policy denial before raising the gate.
28
+ - Promote by removing `continue-on-error`, setting a non-null
29
+ `thresholds.break`, and adding the job to required branch protection only
30
+ after the score is stable.
31
+
32
+ Local validation on Linux/macOS:
33
+
34
+ ```bash
35
+ pnpm run test:coverage
36
+ pnpm run test:integration
37
+ pnpm run test:e2e
38
+ pnpm run test:perf
39
+ pnpm run test:mutation
40
+ ```
41
+
42
+ Windows 11 PowerShell validation:
43
+
44
+ ```powershell
45
+ pnpm run test:coverage
46
+ pnpm run test:integration:windows
47
+ pnpm run test:e2e
48
+ pnpm run test:perf
49
+ pnpm run test:mutation
50
+ ```
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.0.0",
5
+ "version": "1.1.3",
6
6
  "author": "Osman Aslan",
7
7
  "license": "MIT",
8
8
  "runtime": "node",
package/package.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "name": "ssh-mcp-pro",
3
- "version": "1.0.0",
3
+ "version": "1.1.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",
7
- "packageManager": "pnpm@11.0.9",
8
7
  "main": "dist/index.js",
9
8
  "exports": "./dist/index.js",
10
9
  "types": "dist/index.d.ts",
@@ -20,9 +19,11 @@
20
19
  "mcp.json",
21
20
  "server.json",
22
21
  "README.md",
22
+ "CHANGELOG.md",
23
23
  "LICENSE",
24
24
  "LICENSES/MIT.txt",
25
25
  "SECURITY.md",
26
+ "SUPPORT.md",
26
27
  "REGISTRY_SUBMISSION.md",
27
28
  "registry"
28
29
  ],
@@ -30,11 +31,70 @@
30
31
  "ssh-mcp-pro": "dist/index.js",
31
32
  "ssh-mcp-pro-agent": "dist/agent-bin.js"
32
33
  },
34
+ "keywords": [
35
+ "mcp",
36
+ "ssh",
37
+ "copilot",
38
+ "automation",
39
+ "remote",
40
+ "model-context-protocol",
41
+ "github-copilot",
42
+ "ssh-client",
43
+ "devops",
44
+ "infrastructure"
45
+ ],
46
+ "author": "Osman Aslan <oaslananka>",
47
+ "license": "MIT",
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "git+https://github.com/oaslananka/ssh-mcp-pro.git"
51
+ },
52
+ "homepage": "https://github.com/oaslananka/ssh-mcp-pro#readme",
53
+ "bugs": {
54
+ "url": "https://github.com/oaslananka/ssh-mcp-pro/issues"
55
+ },
56
+ "publishConfig": {
57
+ "access": "public"
58
+ },
59
+ "engines": {
60
+ "node": ">=22.22.2",
61
+ "pnpm": "^11.5.1"
62
+ },
63
+ "dependencies": {
64
+ "@modelcontextprotocol/sdk": "^1.29.0",
65
+ "@opentelemetry/api": "^1.9.1",
66
+ "@opentelemetry/exporter-trace-otlp-http": "^0.218.0",
67
+ "@opentelemetry/resources": "^2.7.1",
68
+ "@opentelemetry/sdk-node": "^0.218.0",
69
+ "@opentelemetry/semantic-conventions": "^1.41.1",
70
+ "jose": "6.2.3",
71
+ "node-ssh": "^13.2.1",
72
+ "zod": "^4.4.3"
73
+ },
74
+ "devDependencies": {
75
+ "@stryker-mutator/core": "9.6.1",
76
+ "@stryker-mutator/typescript-checker": "9.6.1",
77
+ "@stryker-mutator/vitest-runner": "9.6.1",
78
+ "@types/node": "^24.13.1",
79
+ "@types/ssh2": "^1.15.5",
80
+ "@typescript-eslint/eslint-plugin": "^8.61.0",
81
+ "@typescript-eslint/parser": "^8.61.0",
82
+ "@vitest/coverage-v8": "^4.1.8",
83
+ "ajv": "^8.20.0",
84
+ "autocannon": "^7.15.0",
85
+ "dependency-cruiser": "^17.4.3",
86
+ "eslint": "^10.4.1",
87
+ "fast-check": "^4.8.0",
88
+ "knip": "^6.16.1",
89
+ "prettier": "^3.8.4",
90
+ "typedoc": "0.28.19",
91
+ "typescript": "^6.0.3",
92
+ "vite": "^7.3.5",
93
+ "vitest": "^4.1.8"
94
+ },
33
95
  "scripts": {
34
96
  "build": "tsc -p tsconfig.json",
35
97
  "dev": "tsc -p tsconfig.json -w",
36
- "dev:control-plane": "pnpm run build && node scripts/dev-control-plane.mjs",
37
- "dev:agent": "pnpm run build && node scripts/dev-agent.mjs",
38
98
  "typecheck": "tsc --noEmit -p tsconfig.json",
39
99
  "test": "vitest run --project unit --reporter=default --reporter=junit",
40
100
  "test:coverage": "vitest run --coverage --project unit --project integration --project e2e",
@@ -43,15 +103,14 @@
43
103
  "test:e2e": "vitest run --project e2e",
44
104
  "test:perf": "vitest run --project perf",
45
105
  "test:perf:baseline": "WRITE_BASELINE=true pnpm run test:perf",
46
- "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\" \"vitest.config.ts\"",
47
- "lint:fix": "eslint \"src/**/*.ts\" \"test/**/*.ts\" \"vitest.config.ts\" --fix",
106
+ "test:mutation": "stryker run",
107
+ "test:mutation:ci": "stryker run",
108
+ "lint": "eslint \"src/**/*.ts\" \"test/**/*.ts\" \"vitest.config.ts\" \"vitest.mutation.config.ts\"",
109
+ "lint:fix": "eslint \"src/**/*.ts\" \"test/**/*.ts\" \"vitest.config.ts\" \"vitest.mutation.config.ts\" --fix",
48
110
  "lint:staged": "node scripts/run-staged-checks.mjs --lint-only",
49
- "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\" \"scripts/**/*.{mjs,cjs}\" \".github/workflows/*.{yml,yaml}\" \"vitest.config.ts\"",
50
- "format:check": "prettier --check \"src/**/*.ts\" \"test/**/*.ts\" \"scripts/**/*.{mjs,cjs}\" \".github/workflows/*.{yml,yaml}\" \"vitest.config.ts\"",
111
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\" \"scripts/**/*.{mjs,cjs}\" \"docs/**/*.md\" \".github/workflows/*.{yml,yaml}\" \"stryker.conf.mjs\" \"vitest.config.ts\" \"vitest.mutation.config.ts\"",
112
+ "format:check": "prettier --check \"src/**/*.ts\" \"test/**/*.ts\" \"scripts/**/*.{mjs,cjs}\" \"docs/**/*.md\" \".github/workflows/*.{yml,yaml}\" \"stryker.conf.mjs\" \"vitest.config.ts\" \"vitest.mutation.config.ts\"",
51
113
  "format:staged": "node scripts/run-staged-checks.mjs",
52
- "prepare": "node scripts/setup-git-hooks.mjs",
53
- "prepack": "pnpm run build && pnpm run sync-version -- --check && pnpm run validate:mcp-metadata && pnpm run validate:chatgpt-app && pnpm run validate:claude-connector",
54
- "prepublishOnly": "pnpm run check",
55
114
  "docker:ssh-fixture:up": "node scripts/docker-ssh-fixture.mjs up",
56
115
  "docker:ssh-fixture:down": "node scripts/docker-ssh-fixture.mjs down",
57
116
  "e2e:docker": "node scripts/docker-ssh-fixture.mjs run e2e",
@@ -59,27 +118,33 @@
59
118
  "docs": "pnpm exec typedoc --options typedoc.json",
60
119
  "docs:check": "pnpm exec typedoc --options typedoc.json --treatWarningsAsErrors",
61
120
  "start:http": "node dist/render-http.js",
62
- "setup:chatgpt": "node scripts/setup-chatgpt.mjs",
63
121
  "sync-version": "node scripts/sync-version.mjs",
64
122
  "validate:mcp-metadata": "node scripts/validate-mcp-metadata.mjs",
65
123
  "validate:mcp-registry": "node scripts/check-mcp-registry-record.mjs",
66
124
  "validate:chatgpt-app": "node scripts/validate-chatgpt-app.mjs",
67
125
  "validate:claude-connector": "node scripts/validate-claude-connector.mjs",
68
126
  "check:doc-language": "node scripts/check-doc-language.mjs",
127
+ "check:package-scripts": "node scripts/check-package-scripts.mjs",
128
+ "check:freshness": "node scripts/check-dependency-freshness.mjs --json artifacts/dependency-freshness.json --markdown artifacts/dependency-freshness.md",
69
129
  "check:rulesets": "node scripts/check-rulesets.mjs",
70
- "reuse:lint": "reuse lint",
71
130
  "lint:commits": "node scripts/lint-commits.mjs",
72
131
  "lint:pr-title": "node scripts/lint-pr-title.mjs",
73
132
  "test:pr-title-lint": "node scripts/test-pr-title-lint.mjs",
74
133
  "verify:actions-runtime": "node scripts/verify-actions-runtime.mjs",
134
+ "check:governance": "node scripts/check-governance.mjs",
75
135
  "review:threads": "node scripts/check-review-threads.mjs",
76
136
  "release:state": "node scripts/release-state.mjs",
77
137
  "check:npm-name": "node scripts/check-npm-name.mjs ssh-mcp-pro",
78
138
  "audit": "pnpm audit --audit-level moderate",
79
139
  "licenses:check": "node scripts/check-licenses.mjs",
140
+ "reuse:lint": "reuse lint",
80
141
  "pack:check": "node scripts/check-package-contents.mjs",
81
142
  "pack:install-smoke": "node scripts/check-package-install-smoke.mjs",
82
- "check:quality": "pnpm run format:check && pnpm run check:doc-language && pnpm run check:rulesets && pnpm run verify:actions-runtime && pnpm run lint && pnpm run typecheck && pnpm run audit && pnpm run licenses:check",
143
+ "check:knip": "knip -c knip.jsonc --reporter compact || true",
144
+ "check:circular": "depcruise src --config .dependency-cruiser.mjs || true",
145
+ "check:module-size": "node scripts/check-module-size.mjs",
146
+ "check:maintainability": "pnpm run check:module-size && pnpm run check:circular && pnpm run check:knip",
147
+ "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",
83
148
  "check:package": "pnpm run build && pnpm run sync-version -- --check && pnpm run validate:mcp-metadata && pnpm run validate:chatgpt-app && pnpm run validate:claude-connector && pnpm run docs:check && pnpm run pack:check && pnpm run pack:install-smoke",
84
149
  "check:push": "pnpm run format:check && pnpm run lint && pnpm run typecheck && pnpm test",
85
150
  "check": "pnpm run check:quality && pnpm run test:coverage && pnpm run check:package",
@@ -87,61 +152,5 @@
87
152
  "hook:pre-push": "pnpm run check:push",
88
153
  "release:dry-run": "node scripts/validate-release-please.mjs && node scripts/release-state.mjs --offline --json && pnpm run check:package",
89
154
  "sbom": "node scripts/generate-sbom.mjs"
90
- },
91
- "keywords": [
92
- "mcp",
93
- "ssh",
94
- "copilot",
95
- "automation",
96
- "remote",
97
- "model-context-protocol",
98
- "github-copilot",
99
- "ssh-client",
100
- "devops",
101
- "infrastructure"
102
- ],
103
- "author": "Osman Aslan <oaslananka>",
104
- "license": "MIT",
105
- "repository": {
106
- "type": "git",
107
- "url": "git+https://github.com/oaslananka/ssh-mcp-pro.git"
108
- },
109
- "homepage": "https://github.com/oaslananka/ssh-mcp-pro#readme",
110
- "bugs": {
111
- "url": "https://github.com/oaslananka/ssh-mcp-pro/issues"
112
- },
113
- "publishConfig": {
114
- "access": "public"
115
- },
116
- "engines": {
117
- "node": "^22.22.2 || ^24.15.0",
118
- "pnpm": "^11.0.9"
119
- },
120
- "dependencies": {
121
- "@modelcontextprotocol/sdk": "^1.29.0",
122
- "@opentelemetry/api": "^1.9.1",
123
- "@opentelemetry/exporter-trace-otlp-http": "^0.218.0",
124
- "@opentelemetry/resources": "^2.7.1",
125
- "@opentelemetry/sdk-node": "^0.218.0",
126
- "@opentelemetry/semantic-conventions": "^1.41.1",
127
- "jose": "6.2.3",
128
- "node-ssh": "^13.2.1",
129
- "zod": "^4.4.3"
130
- },
131
- "devDependencies": {
132
- "@types/node": "^24.12.4",
133
- "@types/ssh2": "^1.15.5",
134
- "@typescript-eslint/eslint-plugin": "^8.59.4",
135
- "@typescript-eslint/parser": "^8.59.4",
136
- "@vitest/coverage-v8": "^4.1.7",
137
- "ajv": "^8.20.0",
138
- "autocannon": "^7.15.0",
139
- "eslint": "^9.39.4",
140
- "fast-check": "^4.8.0",
141
- "prettier": "^3.8.3",
142
- "typedoc": "0.28.19",
143
- "typescript": "^5.9.3",
144
- "vite": "^7.3.3",
145
- "vitest": "^4.1.7"
146
155
  }
147
- }
156
+ }
@@ -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.0.0",
5
+ "version": "1.1.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.0.0",
10
+ "version": "1.1.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.0.0",
16
+ "version": "1.1.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.0.0",
25
+ "version": "1.1.3",
26
26
  "runtimeHint": "npx",
27
27
  "transport": {
28
28
  "type": "streamable-http",