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.
- package/ARCHITECTURE.md +1 -1
- package/CHANGELOG.md +71 -0
- package/LICENSES/MIT.txt +1 -1
- package/README.md +38 -1
- package/SUPPORT.md +95 -0
- package/dist/agent-bin.js +0 -0
- package/dist/config-parsers.d.ts +12 -0
- package/dist/config-parsers.d.ts.map +1 -0
- package/dist/config-parsers.js +60 -0
- package/dist/config-parsers.js.map +1 -0
- package/dist/config.d.ts +3 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -58
- package/dist/config.js.map +1 -1
- package/dist/ensure-pkg.d.ts +9 -0
- package/dist/ensure-pkg.d.ts.map +1 -0
- package/dist/ensure-pkg.js +105 -0
- package/dist/ensure-pkg.js.map +1 -0
- package/dist/ensure.d.ts.map +1 -1
- package/dist/ensure.js +2 -104
- package/dist/ensure.js.map +1 -1
- package/dist/fs-sftp.d.ts +58 -0
- package/dist/fs-sftp.d.ts.map +1 -0
- package/dist/fs-sftp.js +184 -0
- package/dist/fs-sftp.js.map +1 -0
- package/dist/fs-tools.d.ts.map +1 -1
- package/dist/fs-tools.js +2 -144
- package/dist/fs-tools.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.js +1 -1
- package/dist/remote/agent-executor.d.ts.map +1 -1
- package/dist/remote/agent-executor.js +16 -4
- package/dist/remote/agent-executor.js.map +1 -1
- package/dist/remote/agent-handler.d.ts +36 -0
- package/dist/remote/agent-handler.d.ts.map +1 -0
- package/dist/remote/agent-handler.js +255 -0
- package/dist/remote/agent-handler.js.map +1 -0
- package/dist/remote/control-plane.d.ts +4 -17
- package/dist/remote/control-plane.d.ts.map +1 -1
- package/dist/remote/control-plane.js +24 -651
- package/dist/remote/control-plane.js.map +1 -1
- package/dist/remote/http-util.d.ts +29 -0
- package/dist/remote/http-util.d.ts.map +1 -0
- package/dist/remote/http-util.js +159 -0
- package/dist/remote/http-util.js.map +1 -0
- package/dist/remote/oauth-handler.d.ts +47 -0
- package/dist/remote/oauth-handler.d.ts.map +1 -0
- package/dist/remote/oauth-handler.js +296 -0
- package/dist/remote/oauth-handler.js.map +1 -0
- package/dist/session-auth.d.ts +39 -0
- package/dist/session-auth.d.ts.map +1 -0
- package/dist/session-auth.js +148 -0
- package/dist/session-auth.js.map +1 -0
- package/dist/session.d.ts +0 -19
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +8 -154
- package/dist/session.js.map +1 -1
- package/docs/audit/2026-06-05-ecosystem-audit.md +146 -0
- package/docs/docker.md +39 -0
- package/docs/governance/issue-taxonomy.json +141 -0
- package/docs/testing.md +50 -0
- package/mcp.json +1 -1
- package/package.json +80 -71
- package/registry/ssh-mcp-pro/mcp.json +1 -1
- package/server.json +3 -3
package/docs/testing.md
ADDED
|
@@ -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.
|
|
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.
|
|
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
|
-
"
|
|
47
|
-
"
|
|
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:
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
25
|
+
"version": "1.1.3",
|
|
26
26
|
"runtimeHint": "npx",
|
|
27
27
|
"transport": {
|
|
28
28
|
"type": "streamable-http",
|