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 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
@@ -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") + "\n \u2192 Restart Claude Desktop to pick up config changes\n \u2192 Try it: make a request in Claude Desktop - Shield will intercept the first tool call and ask for your consent\n"
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 Try it: make a request in Cursor - Shield will intercept the first tool call and ask for your consent\n \u2192 Example: "Use the ' + cursorMcpPromptLabel + ' MCP server to list my GitHub repositories"\n'
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, permissionLevel, dashboardUrl) {
3449
+ function buildBlockedResponse(id, service, _permissionLevel, dashboardUrl) {
3442
3450
  const displayService = capitalize(service);
3443
- const message = `Action blocked by Multicorn Shield: agent does not have ${permissionLevel} access to ${displayService}. Configure permissions at ${dashboardUrl}`;
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) => {
@@ -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") + "\n \u2192 Restart Claude Desktop to pick up config changes\n \u2192 Try it: make a request in Claude Desktop - Shield will intercept the first tool call and ask for your consent\n"
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 Try it: make a request in Cursor - Shield will intercept the first tool call and ask for your consent\n \u2192 Example: "Use the ' + cursorMcpPromptLabel + ' MCP server to list my GitHub repositories"\n'
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, permissionLevel, dashboardUrl) {
3408
+ function buildBlockedResponse(id, service, _permissionLevel, dashboardUrl) {
3401
3409
  const displayService = capitalize(service);
3402
- const message = `Action blocked by Multicorn Shield: agent does not have ${permissionLevel} access to ${displayService}. Configure permissions at ${dashboardUrl}`;
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, permissionLevel, dashboardUrl) {
33
+ function buildBlockedResponse(id, service, _permissionLevel, dashboardUrl) {
34
34
  const displayService = capitalize(service);
35
- const message = `Action blocked by Multicorn Shield: agent does not have ${permissionLevel} access to ${displayService}. Configure permissions at ${dashboardUrl}`;
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, permissionLevel: string, dashboardUrl: string): JsonRpcResponse;
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, permissionLevel: string, dashboardUrl: string): JsonRpcResponse;
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, permissionLevel, dashboardUrl) {
31
+ function buildBlockedResponse(id, service, _permissionLevel, dashboardUrl) {
32
32
  const displayService = capitalize(service);
33
- const message = `Action blocked by Multicorn Shield: agent does not have ${permissionLevel} access to ${displayService}. Configure permissions at ${dashboardUrl}`;
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,
@@ -22504,7 +22504,7 @@ async function writeExtensionBackup(claudeDesktopConfigPath, mcpServers) {
22504
22504
 
22505
22505
  // package.json
22506
22506
  var package_default = {
22507
- version: "1.4.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 Multicorn Shield") || t.includes("does not have") && t.includes("access to") || t.includes("Configure permissions at");
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, permissionLevel, dashboardUrl) {
23293
+ function buildBlockedResponse(id, service, _permissionLevel, dashboardUrl) {
23294
23294
  const displayService = capitalize(service);
23295
- const message = `Action blocked by Multicorn Shield: agent does not have ${permissionLevel} access to ${displayService}. Configure permissions at ${dashboardUrl}`;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "multicorn-shield",
3
- "version": "1.4.1",
3
+ "version": "1.6.0",
4
4
  "description": "The control layer for AI agents: permissions, consent, spending limits, and audit logging.",
5
5
  "license": "MIT",
6
6
  "author": "Multicorn AI Pty Ltd",