multicorn-shield 1.4.1 → 1.6.0
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 +19 -0
- package/dist/multicorn-proxy.js +218 -13
- package/dist/multicorn-shield.js +38 -13
- package/dist/proxy.cjs +6 -2
- package/dist/proxy.d.cts +1 -1
- package/dist/proxy.d.ts +1 -1
- package/dist/proxy.js +6 -2
- package/dist/shield-extension.js +8 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
- Bump `version` in `package.json` before publishing to npm.
|
|
11
11
|
|
|
12
|
+
## [1.5.0] - 2026-05-10
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- Claude Code promotion note when selecting Cursor in the CLI
|
|
17
|
+
- Example usage prompt in CLI "Next steps" output
|
|
18
|
+
- `--version` flag prints version number and exits
|
|
19
|
+
- Consent-required errors now display a clear multi-line message with the approval URL on its own line
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Auth prompt detects token pasted at the y/N confirmation and treats it as the token value directly
|
|
24
|
+
- Single-item arrow select skips the interactive picker and selects immediately
|
|
25
|
+
- Blocked response message reformatted for clarity
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
|
|
29
|
+
- Hosted proxy blocks `.well-known` OAuth discovery probes to prevent `mcp-remote` entering OAuth mode
|
|
30
|
+
|
|
12
31
|
## [1.4.1] - 2026-05-09
|
|
13
32
|
|
|
14
33
|
### Changed
|
package/dist/multicorn-proxy.js
CHANGED
|
@@ -1411,6 +1411,12 @@ async function promptWindsurfIntegrationMode(ask) {
|
|
|
1411
1411
|
return choice === 1 ? "native" : "hosted";
|
|
1412
1412
|
}
|
|
1413
1413
|
async function arrowSelect(options, ask, fallbackLabel) {
|
|
1414
|
+
if (options.length === 1) {
|
|
1415
|
+
const only = options[0] ?? "";
|
|
1416
|
+
process.stderr.write(`${style.violet("\u276F")} ${style.cyan(only)}
|
|
1417
|
+
`);
|
|
1418
|
+
return 0;
|
|
1419
|
+
}
|
|
1414
1420
|
const canRaw = process.stdin.isTTY && typeof process.stdin.setRawMode === "function";
|
|
1415
1421
|
if (!canRaw) {
|
|
1416
1422
|
for (let i = 0; i < options.length; i++) {
|
|
@@ -1463,7 +1469,7 @@ async function arrowSelect(options, ask, fallbackLabel) {
|
|
|
1463
1469
|
cleanup();
|
|
1464
1470
|
clearLines();
|
|
1465
1471
|
const chosen = options.at(idx);
|
|
1466
|
-
if (chosen !== void 0) {
|
|
1472
|
+
if (chosen !== void 0 && options.length > 1) {
|
|
1467
1473
|
process.stderr.write(`${style.violet("\u276F")} ${style.cyan(chosen)}
|
|
1468
1474
|
`);
|
|
1469
1475
|
}
|
|
@@ -2813,6 +2819,14 @@ You have ${String(agentsForPlatform.length)} agent(s) connected for ${selectedLa
|
|
|
2813
2819
|
}
|
|
2814
2820
|
rl.close();
|
|
2815
2821
|
if (configuredAgents.length > 0) {
|
|
2822
|
+
let mcpPromptLabel2 = function(platformSlug) {
|
|
2823
|
+
const rows = configuredAgents.filter((a) => a.platform === platformSlug);
|
|
2824
|
+
const last = rows[rows.length - 1];
|
|
2825
|
+
if (last === void 0) return "shield-mcp";
|
|
2826
|
+
const s = typeof last.shortName === "string" ? last.shortName.trim() : "";
|
|
2827
|
+
if (s.length > 0) return s;
|
|
2828
|
+
return last.agentName.trim().length > 0 ? last.agentName.trim() : "shield-mcp";
|
|
2829
|
+
};
|
|
2816
2830
|
process.stderr.write("\n" + style.bold(style.violet("Setup complete")) + "\n\n");
|
|
2817
2831
|
for (const agent of configuredAgents) {
|
|
2818
2832
|
const namePart = agent.agentName.length > 0 ? ` - ${style.cyan(agent.agentName)}` : "";
|
|
@@ -2824,14 +2838,6 @@ You have ${String(agentsForPlatform.length)} agent(s) connected for ${selectedLa
|
|
|
2824
2838
|
}
|
|
2825
2839
|
process.stderr.write("\n");
|
|
2826
2840
|
const configuredPlatforms = new Set(configuredAgents.map((a) => a.platform));
|
|
2827
|
-
const cursorMcpPromptLabel = (() => {
|
|
2828
|
-
const rows = configuredAgents.filter((a) => a.platform === "cursor");
|
|
2829
|
-
const last = rows[rows.length - 1];
|
|
2830
|
-
if (last === void 0) return "shield-mcp";
|
|
2831
|
-
const s = typeof last.shortName === "string" ? last.shortName.trim() : "";
|
|
2832
|
-
if (s.length > 0) return s;
|
|
2833
|
-
return last.agentName.trim().length > 0 ? last.agentName.trim() : "shield-mcp";
|
|
2834
|
-
})();
|
|
2835
2841
|
const blocks = [];
|
|
2836
2842
|
if (configuredPlatforms.has("openclaw")) {
|
|
2837
2843
|
blocks.push(
|
|
@@ -2844,13 +2850,15 @@ You have ${String(agentsForPlatform.length)} agent(s) connected for ${selectedLa
|
|
|
2844
2850
|
);
|
|
2845
2851
|
}
|
|
2846
2852
|
if (configuredPlatforms.has("claude-desktop")) {
|
|
2853
|
+
const cdLabel = mcpPromptLabel2("claude-desktop");
|
|
2847
2854
|
blocks.push(
|
|
2848
|
-
"\n" + style.bold("Claude Desktop") +
|
|
2855
|
+
"\n" + style.bold("Claude Desktop") + '\n \u2192 Restart Claude Desktop to load the updated configuration\n \u2192 Confirm connection: click your profile (bottom-left) \u2192 Settings \u2192 Developer\n Check that "' + cdLabel + '" shows a green "running" status\n \u2192 Try it: paste this into Claude Desktop:\n "Use the ' + cdLabel + ' MCP server to list my GitHub repositories"\n'
|
|
2849
2856
|
);
|
|
2850
2857
|
}
|
|
2851
2858
|
if (configuredPlatforms.has("cursor")) {
|
|
2859
|
+
const cursorLabel = mcpPromptLabel2("cursor");
|
|
2852
2860
|
blocks.push(
|
|
2853
|
-
"\n" + style.bold("Cursor") + "\n \u2192 If needed, download Cursor from " + style.cyan("https://www.cursor.com/downloads") + '\n \u2192 Restart Cursor so it loads the MCP server\n \u2192
|
|
2861
|
+
"\n" + style.bold("Cursor") + "\n \u2192 If needed, download Cursor from " + style.cyan("https://www.cursor.com/downloads") + '\n \u2192 Restart Cursor so it loads the MCP server\n \u2192 Confirm connection: open Settings \u2192 Tools & MCPs\n Check that "' + cursorLabel + '" shows a green status indicator\n \u2192 Try it: paste this into Cursor:\n "Use the ' + cursorLabel + ' MCP server to list my GitHub repositories"\n'
|
|
2854
2862
|
);
|
|
2855
2863
|
}
|
|
2856
2864
|
if (configuredPlatforms.has("kilo-code")) {
|
|
@@ -3438,9 +3446,13 @@ function extractToolCallParams(request) {
|
|
|
3438
3446
|
if (typeof args !== "object" || args === null) return null;
|
|
3439
3447
|
return { name, arguments: args };
|
|
3440
3448
|
}
|
|
3441
|
-
function buildBlockedResponse(id, service,
|
|
3449
|
+
function buildBlockedResponse(id, service, _permissionLevel, dashboardUrl) {
|
|
3442
3450
|
const displayService = capitalize(service);
|
|
3443
|
-
const message = `Action blocked by
|
|
3451
|
+
const message = `Action blocked by Shield
|
|
3452
|
+
|
|
3453
|
+
This agent cannot use ${displayService}.
|
|
3454
|
+
|
|
3455
|
+
Configure permissions: ${dashboardUrl}`;
|
|
3444
3456
|
return {
|
|
3445
3457
|
jsonrpc: "2.0",
|
|
3446
3458
|
id,
|
|
@@ -3974,6 +3986,192 @@ var init_restore = __esm({
|
|
|
3974
3986
|
}
|
|
3975
3987
|
});
|
|
3976
3988
|
|
|
3989
|
+
// package.json
|
|
3990
|
+
var package_default;
|
|
3991
|
+
var init_package = __esm({
|
|
3992
|
+
"package.json"() {
|
|
3993
|
+
package_default = {
|
|
3994
|
+
name: "multicorn-shield",
|
|
3995
|
+
version: "1.6.0",
|
|
3996
|
+
description: "The control layer for AI agents: permissions, consent, spending limits, and audit logging.",
|
|
3997
|
+
license: "MIT",
|
|
3998
|
+
author: "Multicorn AI Pty Ltd",
|
|
3999
|
+
type: "module",
|
|
4000
|
+
main: "./dist/index.cjs",
|
|
4001
|
+
module: "./dist/index.js",
|
|
4002
|
+
types: "./dist/index.d.ts",
|
|
4003
|
+
exports: {
|
|
4004
|
+
".": {
|
|
4005
|
+
import: {
|
|
4006
|
+
types: "./dist/index.d.ts",
|
|
4007
|
+
default: "./dist/index.js"
|
|
4008
|
+
},
|
|
4009
|
+
require: {
|
|
4010
|
+
types: "./dist/index.d.cts",
|
|
4011
|
+
default: "./dist/index.cjs"
|
|
4012
|
+
}
|
|
4013
|
+
},
|
|
4014
|
+
"./proxy": {
|
|
4015
|
+
import: {
|
|
4016
|
+
types: "./dist/proxy.d.ts",
|
|
4017
|
+
default: "./dist/proxy.js"
|
|
4018
|
+
},
|
|
4019
|
+
require: {
|
|
4020
|
+
types: "./dist/proxy.d.cts",
|
|
4021
|
+
default: "./dist/proxy.cjs"
|
|
4022
|
+
}
|
|
4023
|
+
}
|
|
4024
|
+
},
|
|
4025
|
+
bin: {
|
|
4026
|
+
"multicorn-shield": "./dist/multicorn-shield.js",
|
|
4027
|
+
"multicorn-proxy": "./dist/multicorn-proxy.js"
|
|
4028
|
+
},
|
|
4029
|
+
files: [
|
|
4030
|
+
"dist",
|
|
4031
|
+
"plugins/multicorn-shield",
|
|
4032
|
+
"plugins/windsurf",
|
|
4033
|
+
"plugins/cline",
|
|
4034
|
+
"plugins/gemini-cli",
|
|
4035
|
+
"LICENSE",
|
|
4036
|
+
"README.md",
|
|
4037
|
+
"CHANGELOG.md"
|
|
4038
|
+
],
|
|
4039
|
+
publishConfig: {
|
|
4040
|
+
access: "public",
|
|
4041
|
+
provenance: true
|
|
4042
|
+
},
|
|
4043
|
+
sideEffects: [
|
|
4044
|
+
"dist/index.js",
|
|
4045
|
+
"dist/index.cjs",
|
|
4046
|
+
"dist/badge.js",
|
|
4047
|
+
"src/badge/multicorn-badge.ts"
|
|
4048
|
+
],
|
|
4049
|
+
engines: {
|
|
4050
|
+
node: ">=20"
|
|
4051
|
+
},
|
|
4052
|
+
scripts: {
|
|
4053
|
+
build: "tsup",
|
|
4054
|
+
dev: "tsup --watch",
|
|
4055
|
+
lint: "eslint . --no-warn-ignored && prettier --check .",
|
|
4056
|
+
"lint:fix": "eslint --fix . --no-warn-ignored && prettier --write .",
|
|
4057
|
+
test: "vitest run",
|
|
4058
|
+
"test:watch": "vitest",
|
|
4059
|
+
"test:coverage": "vitest run --coverage",
|
|
4060
|
+
typecheck: "tsc --noEmit",
|
|
4061
|
+
docs: "typedoc",
|
|
4062
|
+
clean: "rm -rf dist coverage docs/api extension-pack",
|
|
4063
|
+
"stage-extension-pack": "rm -rf extension-pack && mkdir -p extension-pack/server && cp manifest.json extension-pack/ && cp icon.png extension-pack/ && cp dist/shield-extension.js extension-pack/server/index.js",
|
|
4064
|
+
"validate:extension": "pnpm run stage-extension-pack && mcpb validate extension-pack/manifest.json",
|
|
4065
|
+
"build:extension": "tsup",
|
|
4066
|
+
"pack:extension": "pnpm run build && pnpm run stage-extension-pack && mcpb validate extension-pack/manifest.json && mcpb pack extension-pack dist/multicorn-shield.mcpb",
|
|
4067
|
+
size: "size-limit",
|
|
4068
|
+
prepublishOnly: "pnpm run clean && pnpm run typecheck && pnpm run lint && pnpm run test && pnpm run build",
|
|
4069
|
+
prepare: "husky || true",
|
|
4070
|
+
"release:patch": "npm version patch && pnpm publish",
|
|
4071
|
+
"release:minor": "npm version minor && pnpm publish",
|
|
4072
|
+
"release:major": "npm version major && pnpm publish"
|
|
4073
|
+
},
|
|
4074
|
+
"lint-staged": {
|
|
4075
|
+
"*.ts": [
|
|
4076
|
+
"eslint --fix --no-warn-ignored",
|
|
4077
|
+
"prettier --write"
|
|
4078
|
+
],
|
|
4079
|
+
"*.{json,md}": [
|
|
4080
|
+
"prettier --write"
|
|
4081
|
+
]
|
|
4082
|
+
},
|
|
4083
|
+
dependencies: {
|
|
4084
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
4085
|
+
lit: "^3.2.0",
|
|
4086
|
+
zod: "^4.3.6"
|
|
4087
|
+
},
|
|
4088
|
+
devDependencies: {
|
|
4089
|
+
"@anthropic-ai/mcpb": "^2.1.2",
|
|
4090
|
+
"@eslint/js": "^9.19.0",
|
|
4091
|
+
"@open-wc/testing-helpers": "^3.0.1",
|
|
4092
|
+
"@size-limit/file": "^11.1.6",
|
|
4093
|
+
"@types/node": "^22.0.0",
|
|
4094
|
+
"@vitest/coverage-v8": "^3.0.5",
|
|
4095
|
+
eslint: "^9.19.0",
|
|
4096
|
+
"eslint-config-prettier": "^10.0.1",
|
|
4097
|
+
"eslint-plugin-unicorn": "^57.0.0",
|
|
4098
|
+
globals: "^15.14.0",
|
|
4099
|
+
husky: "^9.1.7",
|
|
4100
|
+
jiti: "^2.4.2",
|
|
4101
|
+
jsdom: "^25.0.1",
|
|
4102
|
+
"lint-staged": "^16.2.7",
|
|
4103
|
+
prettier: "^3.4.2",
|
|
4104
|
+
"size-limit": "^11.1.6",
|
|
4105
|
+
tsup: "^8.3.6",
|
|
4106
|
+
typedoc: "^0.28.17",
|
|
4107
|
+
typescript: "^5.7.3",
|
|
4108
|
+
"typescript-eslint": "^8.22.0",
|
|
4109
|
+
vite: "^7.3.2",
|
|
4110
|
+
vitest: "^3.0.5"
|
|
4111
|
+
},
|
|
4112
|
+
"size-limit": [
|
|
4113
|
+
{
|
|
4114
|
+
path: "dist/index.js",
|
|
4115
|
+
limit: "50 kB",
|
|
4116
|
+
gzip: true
|
|
4117
|
+
},
|
|
4118
|
+
{
|
|
4119
|
+
path: "dist/index.cjs",
|
|
4120
|
+
limit: "50 kB",
|
|
4121
|
+
gzip: true
|
|
4122
|
+
},
|
|
4123
|
+
{
|
|
4124
|
+
path: "dist/badge.js",
|
|
4125
|
+
limit: "5 kB",
|
|
4126
|
+
gzip: true
|
|
4127
|
+
}
|
|
4128
|
+
],
|
|
4129
|
+
keywords: [
|
|
4130
|
+
"ai",
|
|
4131
|
+
"agents",
|
|
4132
|
+
"permissions",
|
|
4133
|
+
"sdk",
|
|
4134
|
+
"typescript",
|
|
4135
|
+
"consent",
|
|
4136
|
+
"spending-limits",
|
|
4137
|
+
"audit-log",
|
|
4138
|
+
"mcp",
|
|
4139
|
+
"shield",
|
|
4140
|
+
"multicorn"
|
|
4141
|
+
],
|
|
4142
|
+
repository: {
|
|
4143
|
+
type: "git",
|
|
4144
|
+
url: "git+https://github.com/Multicorn-AI/multicorn-shield.git"
|
|
4145
|
+
},
|
|
4146
|
+
bugs: {
|
|
4147
|
+
url: "https://github.com/Multicorn-AI/multicorn-shield/issues"
|
|
4148
|
+
},
|
|
4149
|
+
homepage: "https://multicorn.ai",
|
|
4150
|
+
pnpm: {
|
|
4151
|
+
overrides: {
|
|
4152
|
+
vite: ">=7.3.2",
|
|
4153
|
+
flatted: ">=3.4.2",
|
|
4154
|
+
minimatch: ">=10.2.3",
|
|
4155
|
+
rollup: ">=4.59.0",
|
|
4156
|
+
picomatch: ">=4.0.4",
|
|
4157
|
+
"path-to-regexp": ">=8.4.0",
|
|
4158
|
+
"node-forge": ">=1.4.0",
|
|
4159
|
+
"fast-uri": ">=3.1.2"
|
|
4160
|
+
}
|
|
4161
|
+
}
|
|
4162
|
+
};
|
|
4163
|
+
}
|
|
4164
|
+
});
|
|
4165
|
+
|
|
4166
|
+
// src/package-meta.ts
|
|
4167
|
+
var PACKAGE_VERSION;
|
|
4168
|
+
var init_package_meta = __esm({
|
|
4169
|
+
"src/package-meta.ts"() {
|
|
4170
|
+
init_package();
|
|
4171
|
+
PACKAGE_VERSION = package_default.version;
|
|
4172
|
+
}
|
|
4173
|
+
});
|
|
4174
|
+
|
|
3977
4175
|
// bin/multicorn-shield.ts
|
|
3978
4176
|
var multicorn_shield_exports = {};
|
|
3979
4177
|
__export(multicorn_shield_exports, {
|
|
@@ -4132,6 +4330,7 @@ function printHelp() {
|
|
|
4132
4330
|
" Shield's permission layer.",
|
|
4133
4331
|
"",
|
|
4134
4332
|
"Options:",
|
|
4333
|
+
" --version, -v Print version and exit",
|
|
4135
4334
|
" --verbose, --debug Print extra diagnostics during init (menu selection, agent counts)",
|
|
4136
4335
|
" --api-key <key> Multicorn API key (overrides MULTICORN_API_KEY env var and config file)",
|
|
4137
4336
|
" --log-level <level> Log level: debug | info | warn | error (default: info)",
|
|
@@ -4156,6 +4355,11 @@ async function runCli() {
|
|
|
4156
4355
|
);
|
|
4157
4356
|
return;
|
|
4158
4357
|
}
|
|
4358
|
+
if (first === "--version" || first === "-v") {
|
|
4359
|
+
process.stdout.write(`${PACKAGE_VERSION}
|
|
4360
|
+
`);
|
|
4361
|
+
process.exit(0);
|
|
4362
|
+
}
|
|
4159
4363
|
const cli = parseArgs(process.argv);
|
|
4160
4364
|
const logger = createLogger(cli.logLevel);
|
|
4161
4365
|
if (cli.subcommand === "help") {
|
|
@@ -4302,6 +4506,7 @@ var init_multicorn_shield = __esm({
|
|
|
4302
4506
|
init_logger();
|
|
4303
4507
|
init_consent();
|
|
4304
4508
|
init_restore();
|
|
4509
|
+
init_package_meta();
|
|
4305
4510
|
isDirectRun = process.argv[1] !== void 0 && (import.meta.url.endsWith(process.argv[1]) || import.meta.url === `file://${process.argv[1]}` || import.meta.url.endsWith("/multicorn-shield.js") || import.meta.url.endsWith("/multicorn-shield.ts"));
|
|
4306
4511
|
if (isDirectRun && process.env["VITEST"] === void 0) {
|
|
4307
4512
|
runCli().catch((error) => {
|
package/dist/multicorn-shield.js
CHANGED
|
@@ -1483,6 +1483,12 @@ async function promptWindsurfIntegrationMode(ask) {
|
|
|
1483
1483
|
return choice === 1 ? "native" : "hosted";
|
|
1484
1484
|
}
|
|
1485
1485
|
async function arrowSelect(options, ask, fallbackLabel) {
|
|
1486
|
+
if (options.length === 1) {
|
|
1487
|
+
const only = options[0] ?? "";
|
|
1488
|
+
process.stderr.write(`${style.violet("\u276F")} ${style.cyan(only)}
|
|
1489
|
+
`);
|
|
1490
|
+
return 0;
|
|
1491
|
+
}
|
|
1486
1492
|
const canRaw = process.stdin.isTTY && typeof process.stdin.setRawMode === "function";
|
|
1487
1493
|
if (!canRaw) {
|
|
1488
1494
|
for (let i = 0; i < options.length; i++) {
|
|
@@ -1535,7 +1541,7 @@ async function arrowSelect(options, ask, fallbackLabel) {
|
|
|
1535
1541
|
cleanup();
|
|
1536
1542
|
clearLines();
|
|
1537
1543
|
const chosen = options.at(idx);
|
|
1538
|
-
if (chosen !== void 0) {
|
|
1544
|
+
if (chosen !== void 0 && options.length > 1) {
|
|
1539
1545
|
process.stderr.write(`${style.violet("\u276F")} ${style.cyan(chosen)}
|
|
1540
1546
|
`);
|
|
1541
1547
|
}
|
|
@@ -2894,6 +2900,14 @@ You have ${String(agentsForPlatform.length)} agent(s) connected for ${selectedLa
|
|
|
2894
2900
|
}
|
|
2895
2901
|
rl.close();
|
|
2896
2902
|
if (configuredAgents.length > 0) {
|
|
2903
|
+
let mcpPromptLabel2 = function(platformSlug) {
|
|
2904
|
+
const rows = configuredAgents.filter((a) => a.platform === platformSlug);
|
|
2905
|
+
const last = rows[rows.length - 1];
|
|
2906
|
+
if (last === void 0) return "shield-mcp";
|
|
2907
|
+
const s = typeof last.shortName === "string" ? last.shortName.trim() : "";
|
|
2908
|
+
if (s.length > 0) return s;
|
|
2909
|
+
return last.agentName.trim().length > 0 ? last.agentName.trim() : "shield-mcp";
|
|
2910
|
+
};
|
|
2897
2911
|
process.stderr.write("\n" + style.bold(style.violet("Setup complete")) + "\n\n");
|
|
2898
2912
|
for (const agent of configuredAgents) {
|
|
2899
2913
|
const namePart = agent.agentName.length > 0 ? ` - ${style.cyan(agent.agentName)}` : "";
|
|
@@ -2905,14 +2919,6 @@ You have ${String(agentsForPlatform.length)} agent(s) connected for ${selectedLa
|
|
|
2905
2919
|
}
|
|
2906
2920
|
process.stderr.write("\n");
|
|
2907
2921
|
const configuredPlatforms = new Set(configuredAgents.map((a) => a.platform));
|
|
2908
|
-
const cursorMcpPromptLabel = (() => {
|
|
2909
|
-
const rows = configuredAgents.filter((a) => a.platform === "cursor");
|
|
2910
|
-
const last = rows[rows.length - 1];
|
|
2911
|
-
if (last === void 0) return "shield-mcp";
|
|
2912
|
-
const s = typeof last.shortName === "string" ? last.shortName.trim() : "";
|
|
2913
|
-
if (s.length > 0) return s;
|
|
2914
|
-
return last.agentName.trim().length > 0 ? last.agentName.trim() : "shield-mcp";
|
|
2915
|
-
})();
|
|
2916
2922
|
const blocks = [];
|
|
2917
2923
|
if (configuredPlatforms.has("openclaw")) {
|
|
2918
2924
|
blocks.push(
|
|
@@ -2925,13 +2931,15 @@ You have ${String(agentsForPlatform.length)} agent(s) connected for ${selectedLa
|
|
|
2925
2931
|
);
|
|
2926
2932
|
}
|
|
2927
2933
|
if (configuredPlatforms.has("claude-desktop")) {
|
|
2934
|
+
const cdLabel = mcpPromptLabel2("claude-desktop");
|
|
2928
2935
|
blocks.push(
|
|
2929
|
-
"\n" + style.bold("Claude Desktop") +
|
|
2936
|
+
"\n" + style.bold("Claude Desktop") + '\n \u2192 Restart Claude Desktop to load the updated configuration\n \u2192 Confirm connection: click your profile (bottom-left) \u2192 Settings \u2192 Developer\n Check that "' + cdLabel + '" shows a green "running" status\n \u2192 Try it: paste this into Claude Desktop:\n "Use the ' + cdLabel + ' MCP server to list my GitHub repositories"\n'
|
|
2930
2937
|
);
|
|
2931
2938
|
}
|
|
2932
2939
|
if (configuredPlatforms.has("cursor")) {
|
|
2940
|
+
const cursorLabel = mcpPromptLabel2("cursor");
|
|
2933
2941
|
blocks.push(
|
|
2934
|
-
"\n" + style.bold("Cursor") + "\n \u2192 If needed, download Cursor from " + style.cyan("https://www.cursor.com/downloads") + '\n \u2192 Restart Cursor so it loads the MCP server\n \u2192
|
|
2942
|
+
"\n" + style.bold("Cursor") + "\n \u2192 If needed, download Cursor from " + style.cyan("https://www.cursor.com/downloads") + '\n \u2192 Restart Cursor so it loads the MCP server\n \u2192 Confirm connection: open Settings \u2192 Tools & MCPs\n Check that "' + cursorLabel + '" shows a green status indicator\n \u2192 Try it: paste this into Cursor:\n "Use the ' + cursorLabel + ' MCP server to list my GitHub repositories"\n'
|
|
2935
2943
|
);
|
|
2936
2944
|
}
|
|
2937
2945
|
if (configuredPlatforms.has("kilo-code")) {
|
|
@@ -3397,9 +3405,13 @@ function extractToolCallParams(request) {
|
|
|
3397
3405
|
if (typeof args !== "object" || args === null) return null;
|
|
3398
3406
|
return { name, arguments: args };
|
|
3399
3407
|
}
|
|
3400
|
-
function buildBlockedResponse(id, service,
|
|
3408
|
+
function buildBlockedResponse(id, service, _permissionLevel, dashboardUrl) {
|
|
3401
3409
|
const displayService = capitalize(service);
|
|
3402
|
-
const message = `Action blocked by
|
|
3410
|
+
const message = `Action blocked by Shield
|
|
3411
|
+
|
|
3412
|
+
This agent cannot use ${displayService}.
|
|
3413
|
+
|
|
3414
|
+
Configure permissions: ${dashboardUrl}`;
|
|
3403
3415
|
return {
|
|
3404
3416
|
jsonrpc: "2.0",
|
|
3405
3417
|
id,
|
|
@@ -3901,6 +3913,13 @@ async function restoreClaudeDesktopMcpFromBackup() {
|
|
|
3901
3913
|
});
|
|
3902
3914
|
}
|
|
3903
3915
|
|
|
3916
|
+
// package.json
|
|
3917
|
+
var package_default = {
|
|
3918
|
+
version: "1.6.0"};
|
|
3919
|
+
|
|
3920
|
+
// src/package-meta.ts
|
|
3921
|
+
var PACKAGE_VERSION = package_default.version;
|
|
3922
|
+
|
|
3904
3923
|
// bin/multicorn-shield.ts
|
|
3905
3924
|
function parseArgs(argv) {
|
|
3906
3925
|
const args = argv.slice(2);
|
|
@@ -4053,6 +4072,7 @@ function printHelp() {
|
|
|
4053
4072
|
" Shield's permission layer.",
|
|
4054
4073
|
"",
|
|
4055
4074
|
"Options:",
|
|
4075
|
+
" --version, -v Print version and exit",
|
|
4056
4076
|
" --verbose, --debug Print extra diagnostics during init (menu selection, agent counts)",
|
|
4057
4077
|
" --api-key <key> Multicorn API key (overrides MULTICORN_API_KEY env var and config file)",
|
|
4058
4078
|
" --log-level <level> Log level: debug | info | warn | error (default: info)",
|
|
@@ -4077,6 +4097,11 @@ async function runCli() {
|
|
|
4077
4097
|
);
|
|
4078
4098
|
return;
|
|
4079
4099
|
}
|
|
4100
|
+
if (first === "--version" || first === "-v") {
|
|
4101
|
+
process.stdout.write(`${PACKAGE_VERSION}
|
|
4102
|
+
`);
|
|
4103
|
+
process.exit(0);
|
|
4104
|
+
}
|
|
4080
4105
|
const cli = parseArgs(process.argv);
|
|
4081
4106
|
const logger = createLogger(cli.logLevel);
|
|
4082
4107
|
if (cli.subcommand === "help") {
|
package/dist/proxy.cjs
CHANGED
|
@@ -30,9 +30,13 @@ function extractToolCallParams(request) {
|
|
|
30
30
|
if (typeof args !== "object" || args === null) return null;
|
|
31
31
|
return { name, arguments: args };
|
|
32
32
|
}
|
|
33
|
-
function buildBlockedResponse(id, service,
|
|
33
|
+
function buildBlockedResponse(id, service, _permissionLevel, dashboardUrl) {
|
|
34
34
|
const displayService = capitalize(service);
|
|
35
|
-
const message = `Action blocked by
|
|
35
|
+
const message = `Action blocked by Shield
|
|
36
|
+
|
|
37
|
+
This agent cannot use ${displayService}.
|
|
38
|
+
|
|
39
|
+
Configure permissions: ${dashboardUrl}`;
|
|
36
40
|
return {
|
|
37
41
|
jsonrpc: "2.0",
|
|
38
42
|
id,
|
package/dist/proxy.d.cts
CHANGED
|
@@ -31,7 +31,7 @@ interface ToolCallParams {
|
|
|
31
31
|
}
|
|
32
32
|
declare function parseJsonRpcLine(line: string): JsonRpcRequest | null;
|
|
33
33
|
declare function extractToolCallParams(request: JsonRpcRequest): ToolCallParams | null;
|
|
34
|
-
declare function buildBlockedResponse(id: string | number | null, service: string,
|
|
34
|
+
declare function buildBlockedResponse(id: string | number | null, service: string, _permissionLevel: string, dashboardUrl: string): JsonRpcResponse;
|
|
35
35
|
declare function buildSpendingBlockedResponse(id: string | number | null, reason: string, dashboardUrl: string): JsonRpcResponse;
|
|
36
36
|
/**
|
|
37
37
|
* Internal error: Shield could not verify permissions due to an exception.
|
package/dist/proxy.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ interface ToolCallParams {
|
|
|
31
31
|
}
|
|
32
32
|
declare function parseJsonRpcLine(line: string): JsonRpcRequest | null;
|
|
33
33
|
declare function extractToolCallParams(request: JsonRpcRequest): ToolCallParams | null;
|
|
34
|
-
declare function buildBlockedResponse(id: string | number | null, service: string,
|
|
34
|
+
declare function buildBlockedResponse(id: string | number | null, service: string, _permissionLevel: string, dashboardUrl: string): JsonRpcResponse;
|
|
35
35
|
declare function buildSpendingBlockedResponse(id: string | number | null, reason: string, dashboardUrl: string): JsonRpcResponse;
|
|
36
36
|
/**
|
|
37
37
|
* Internal error: Shield could not verify permissions due to an exception.
|
package/dist/proxy.js
CHANGED
|
@@ -28,9 +28,13 @@ function extractToolCallParams(request) {
|
|
|
28
28
|
if (typeof args !== "object" || args === null) return null;
|
|
29
29
|
return { name, arguments: args };
|
|
30
30
|
}
|
|
31
|
-
function buildBlockedResponse(id, service,
|
|
31
|
+
function buildBlockedResponse(id, service, _permissionLevel, dashboardUrl) {
|
|
32
32
|
const displayService = capitalize(service);
|
|
33
|
-
const message = `Action blocked by
|
|
33
|
+
const message = `Action blocked by Shield
|
|
34
|
+
|
|
35
|
+
This agent cannot use ${displayService}.
|
|
36
|
+
|
|
37
|
+
Configure permissions: ${dashboardUrl}`;
|
|
34
38
|
return {
|
|
35
39
|
jsonrpc: "2.0",
|
|
36
40
|
id,
|
package/dist/shield-extension.js
CHANGED
|
@@ -22504,7 +22504,7 @@ async function writeExtensionBackup(claudeDesktopConfigPath, mcpServers) {
|
|
|
22504
22504
|
|
|
22505
22505
|
// package.json
|
|
22506
22506
|
var package_default = {
|
|
22507
|
-
version: "1.
|
|
22507
|
+
version: "1.6.0"};
|
|
22508
22508
|
|
|
22509
22509
|
// src/package-meta.ts
|
|
22510
22510
|
var PACKAGE_VERSION = package_default.version;
|
|
@@ -23067,7 +23067,7 @@ function resultSuggestsConsentNeeded(result) {
|
|
|
23067
23067
|
return false;
|
|
23068
23068
|
}
|
|
23069
23069
|
const t = first.text;
|
|
23070
|
-
return t.includes("Action blocked by
|
|
23070
|
+
return t.includes("Action blocked by Shield") || t.includes("Permission required") || t.includes("This agent cannot use") || t.includes("does not have") && t.includes("access to") || t.includes("Configure permissions:");
|
|
23071
23071
|
}
|
|
23072
23072
|
|
|
23073
23073
|
// src/types/index.ts
|
|
@@ -23290,9 +23290,13 @@ function sleep2(ms) {
|
|
|
23290
23290
|
var BLOCKED_ERROR_CODE = -32e3;
|
|
23291
23291
|
var INTERNAL_ERROR_CODE = -32002;
|
|
23292
23292
|
var SERVICE_UNREACHABLE_ERROR_CODE = -32003;
|
|
23293
|
-
function buildBlockedResponse(id, service,
|
|
23293
|
+
function buildBlockedResponse(id, service, _permissionLevel, dashboardUrl) {
|
|
23294
23294
|
const displayService = capitalize(service);
|
|
23295
|
-
const message = `Action blocked by
|
|
23295
|
+
const message = `Action blocked by Shield
|
|
23296
|
+
|
|
23297
|
+
This agent cannot use ${displayService}.
|
|
23298
|
+
|
|
23299
|
+
Configure permissions: ${dashboardUrl}`;
|
|
23296
23300
|
return {
|
|
23297
23301
|
jsonrpc: "2.0",
|
|
23298
23302
|
id,
|
package/package.json
CHANGED