localwp-mcp 0.1.8 → 0.1.9

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/README.md CHANGED
@@ -153,10 +153,10 @@ If a client only accepts an MCP URL and cannot launch a local command, it cannot
153
153
 
154
154
  `localwp-mcp` has 2 access modes:
155
155
 
156
- - `safe`
157
- Best default for most people. Safe WordPress inspection commands, diagnostics, logs, database reads, and backup/export flows.
158
- - `full-access`
159
- Best when you want the agent to fully work on your local site, including SQL writes, imports, and restore operations.
156
+ - `safe`
157
+ Best default for most people. Safe WordPress inspection commands, read-oriented runtime calls, diagnostics, logs, database reads, and backup/export flows.
158
+ - `full-access`
159
+ Best when you want the agent to fully work on your local site, including SQL writes, imports, restore operations, and explicit WordPress runtime PHP execution.
160
160
 
161
161
  `safe` is the default.
162
162
 
@@ -223,18 +223,29 @@ Use:
223
223
  - `stop_local_site`
224
224
  - `restart_local_site`
225
225
 
226
- ### Work With WordPress
227
-
228
- Use:
229
-
230
- - `execute_wp_cli`
231
-
232
- Examples:
233
-
234
- - list plugins
235
- - inspect options
236
- - list posts or users
237
- - run plugin-specific WP-CLI commands
226
+ ### Work With WordPress
227
+
228
+ Use:
229
+
230
+ - `execute_wp_cli`
231
+ - `wp_call_function`
232
+ - `wp_call_static_method`
233
+ - `execute_wp_php`
234
+
235
+ Examples:
236
+
237
+ - list plugins
238
+ - inspect options
239
+ - list posts or users
240
+ - run plugin-specific WP-CLI commands
241
+ - call a function or static method inside the loaded WordPress runtime with explicit JSON args
242
+ - run high-trust PHP snippets or PHP files inside the loaded WordPress runtime in `full-access`
243
+
244
+ `execute_wp_cli` is for ordinary WP-CLI commands. It intentionally blocks `eval`, `eval-file`, `shell`, and `db query`, and blocked commands return structured policy details with suggested alternatives.
245
+
246
+ `wp_call_function` and `wp_call_static_method` are read-oriented runtime inspection tools. They run inside the loaded WordPress runtime with explicit JSON arguments and add best-effort read-only guardrails around common SQL writes, HTTP requests, and outgoing email.
247
+
248
+ `execute_wp_php` is the explicit high-trust runtime path for `full-access`. It runs a PHP snippet or workspace/site `.php` file inside the selected site's loaded WordPress runtime using a file-based `eval-file` flow.
238
249
 
239
250
  ### Work With the Database
240
251
 
@@ -294,9 +305,12 @@ Use `preview_restore_backup` when you want to inspect the restore plan, effectiv
294
305
  - `read_site_file`
295
306
  - `search_site_files`
296
307
  - `write_site_file`
297
- - `delete_site_file`
298
- - `execute_wp_cli`
299
- - `mysql_query`
308
+ - `delete_site_file`
309
+ - `execute_wp_cli`
310
+ - `wp_call_function`
311
+ - `wp_call_static_method`
312
+ - `execute_wp_php`
313
+ - `mysql_query`
300
314
  - `mysql_execute`
301
315
  - `mysql_schema`
302
316
  - `db_export`
@@ -355,15 +369,19 @@ If the MCP does not find your site or cannot run WP-CLI/MySQL:
355
369
  1. Start the site in Local.
356
370
  2. Run `local_environment_check`.
357
371
  3. Run `local_doctor`.
358
- 4. Check `local_logs`.
359
-
360
- Those tools are the fastest way to see whether the problem is:
372
+ 4. Check `local_logs`.
373
+
374
+ Those tools are the fastest way to see whether the problem is:
361
375
 
362
376
  - site selection
363
377
  - Local metadata resolution
364
378
  - WP-CLI resolution
365
379
  - MySQL connectivity
366
- - missing or stopped Local services
380
+ - missing or stopped Local services
381
+
382
+ If plain shell `wp` behaves differently from MCP, call `local_site_info`.
383
+
384
+ `local_site_info` now includes `wpCliRuntime`, `mysqlRuntime`, and `shellReproduction` sections that show the exact Local-managed binaries, working directory, environment overrides, and command arrays this MCP uses. MCP does not rely on your ambient shell `wp`; it resolves the selected site's Local runtime directly.
367
385
 
368
386
  ## For Contributors
369
387
 
@@ -0,0 +1,9 @@
1
+ export interface StructuredToolErrorPayload {
2
+ error: string;
3
+ message: string;
4
+ [key: string]: unknown;
5
+ }
6
+ export declare class StructuredToolError extends Error {
7
+ readonly payload: StructuredToolErrorPayload;
8
+ constructor(payload: StructuredToolErrorPayload);
9
+ }
package/dist/errors.js ADDED
@@ -0,0 +1,9 @@
1
+ export class StructuredToolError extends Error {
2
+ payload;
3
+ constructor(payload) {
4
+ super(payload.message);
5
+ this.name = "StructuredToolError";
6
+ this.payload = payload;
7
+ }
8
+ }
9
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,OAAO,CAA6B;IAE7C,YAAY,OAAmC;QAC7C,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
package/dist/mysql.d.ts CHANGED
@@ -8,6 +8,12 @@ export declare function executeMysqlStatement(context: SiteContext, sql: string,
8
8
  truncated: boolean;
9
9
  stderr: string | null;
10
10
  }>;
11
+ export declare function describeMysqlExecution(context: SiteContext): {
12
+ command: string;
13
+ argsPrefix: string[];
14
+ database: string;
15
+ cwd: string;
16
+ };
11
17
  export declare function validateSafeSqlQuery(sql: string): string;
12
18
  export declare function validateFullAccessSql(sql: string): string;
13
19
  export declare function normalizeSqlStatement(sql: string): string;
package/dist/mysql.js CHANGED
@@ -19,22 +19,8 @@ export async function ensureMysqlReady(context) {
19
19
  }
20
20
  }
21
21
  export async function executeMysqlStatement(context, sql, maxRows) {
22
- const args = [
23
- `--defaults-file=${context.mysqlDefaultsFile}`,
24
- "--batch",
25
- "--default-character-set=utf8mb4",
26
- `--execute=${sql}`,
27
- ];
28
- if (context.mysqlSocket) {
29
- args.push("--protocol=SOCKET", `--socket=${context.mysqlSocket}`);
30
- }
31
- else {
32
- args.push("--protocol=TCP", `--host=${context.mysqlHost || config.defaultMysqlHost}`);
33
- if (context.mysqlPort) {
34
- args.push(`--port=${context.mysqlPort}`);
35
- }
36
- }
37
- args.push(context.database);
22
+ const execution = describeMysqlExecution(context);
23
+ const args = [...execution.argsPrefix, `--execute=${sql}`, execution.database];
38
24
  const result = await spawnCommand(context.mysql.binaryPath, args, {
39
25
  cwd: context.wpRoot,
40
26
  env: process.env,
@@ -61,6 +47,28 @@ export async function executeMysqlStatement(context, sql, maxRows) {
61
47
  stderr: result.stderr || null,
62
48
  };
63
49
  }
50
+ export function describeMysqlExecution(context) {
51
+ const argsPrefix = [
52
+ `--defaults-file=${context.mysqlDefaultsFile}`,
53
+ "--batch",
54
+ "--default-character-set=utf8mb4",
55
+ ];
56
+ if (context.mysqlSocket) {
57
+ argsPrefix.push("--protocol=SOCKET", `--socket=${context.mysqlSocket}`);
58
+ }
59
+ else {
60
+ argsPrefix.push("--protocol=TCP", `--host=${context.mysqlHost || config.defaultMysqlHost}`);
61
+ if (context.mysqlPort) {
62
+ argsPrefix.push(`--port=${context.mysqlPort}`);
63
+ }
64
+ }
65
+ return {
66
+ command: context.mysql.binaryPath,
67
+ argsPrefix,
68
+ database: context.database,
69
+ cwd: context.wpRoot,
70
+ };
71
+ }
64
72
  export function validateSafeSqlQuery(sql) {
65
73
  const normalizedSql = normalizeSqlStatement(sql);
66
74
  const verb = getSqlVerb(normalizedSql);
package/dist/mysql.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../src/mysql.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../src/mysql.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,135 @@
1
1
  import { config } from "./config.js";
2
- const restrictedWpFlags = new Set(["--path", "--ssh", "--http"]);
3
- const wpCliAlwaysBlockedPrefixes = [
4
- ["db", "query"],
5
- ["eval"],
6
- ["eval-file"],
7
- ["package", "install"],
8
- ["package", "uninstall"],
9
- ["package", "update"],
10
- ["shell"],
2
+ import { StructuredToolError } from "./errors.js";
3
+ const restrictedWpFlags = new Map([
4
+ [
5
+ "--path",
6
+ {
7
+ policyCode: "wp_cli_site_selection_flag_blocked",
8
+ message: "The '--path' flag is not allowed here because the MCP selects the Local site for you.",
9
+ reason: "Site-selection flags are controlled by the MCP so the selected Local site stays authoritative.",
10
+ suggestedAlternatives: [
11
+ "Pass siteName or siteId in the tool call instead.",
12
+ ],
13
+ },
14
+ ],
15
+ [
16
+ "--ssh",
17
+ {
18
+ policyCode: "wp_cli_site_selection_flag_blocked",
19
+ message: "The '--ssh' flag is not allowed here because the MCP selects the Local site for you.",
20
+ reason: "Site-selection flags are controlled by the MCP so the selected Local site stays authoritative.",
21
+ suggestedAlternatives: [
22
+ "Pass siteName or siteId in the tool call instead.",
23
+ ],
24
+ },
25
+ ],
26
+ [
27
+ "--http",
28
+ {
29
+ policyCode: "wp_cli_site_selection_flag_blocked",
30
+ message: "The '--http' flag is not allowed here because the MCP selects the Local site for you.",
31
+ reason: "Site-selection flags are controlled by the MCP so the selected Local site stays authoritative.",
32
+ suggestedAlternatives: [
33
+ "Pass siteName or siteId in the tool call instead.",
34
+ ],
35
+ },
36
+ ],
37
+ [
38
+ "--require",
39
+ {
40
+ policyCode: "wp_cli_require_flag_blocked",
41
+ message: "The '--require' flag is not allowed here because it can load arbitrary PHP before WP-CLI runs.",
42
+ reason: "The --require flag can load arbitrary PHP before WP-CLI runs, so it is reserved for dedicated MCP runtime tools.",
43
+ suggestedAlternatives: [
44
+ "Use execute_wp_php for high-trust runtime PHP.",
45
+ "Use wp_call_function or wp_call_static_method for read-oriented runtime inspection.",
46
+ ],
47
+ },
48
+ ],
49
+ [
50
+ "--exec",
51
+ {
52
+ policyCode: "wp_cli_exec_flag_blocked",
53
+ message: "The '--exec' flag is not allowed here because it can execute arbitrary PHP before WP-CLI runs.",
54
+ reason: "The --exec flag can execute arbitrary PHP before WP-CLI runs, so it is reserved for dedicated MCP runtime tools.",
55
+ suggestedAlternatives: [
56
+ "Use execute_wp_php for high-trust runtime PHP.",
57
+ "Use wp_call_function or wp_call_static_method for read-oriented runtime inspection.",
58
+ ],
59
+ },
60
+ ],
61
+ [
62
+ "--config",
63
+ {
64
+ policyCode: "wp_cli_config_flag_blocked",
65
+ message: "The '--config' flag is not allowed here because it can replace the managed WP-CLI configuration.",
66
+ reason: "The --config flag can replace the managed WP-CLI configuration and weaken MCP guardrails.",
67
+ suggestedAlternatives: [
68
+ "Use local_site_info to inspect the managed WP-CLI runtime context.",
69
+ ],
70
+ },
71
+ ],
72
+ ]);
73
+ const wpCliAlwaysBlockedRules = [
74
+ {
75
+ prefix: ["db", "query"],
76
+ policyCode: "wp_cli_db_query_blocked",
77
+ blockedFeature: "db query",
78
+ reason: "WP-CLI database query execution is disabled here because it bypasses the MCP's SQL access controls.",
79
+ suggestedAlternatives: ["mysql_query", "mysql_execute in full-access"],
80
+ },
81
+ {
82
+ prefix: ["eval"],
83
+ policyCode: "wp_cli_eval_blocked",
84
+ blockedFeature: "eval",
85
+ reason: "Inline WP-CLI eval is disabled because it enables arbitrary PHP execution through the general WP-CLI tool.",
86
+ suggestedAlternatives: [
87
+ "execute_wp_php in full-access",
88
+ "execute_wp_cli with standard WP-CLI commands",
89
+ "mysql_query for read-only SQL inspection",
90
+ ],
91
+ },
92
+ {
93
+ prefix: ["eval-file"],
94
+ policyCode: "wp_cli_eval_file_blocked",
95
+ blockedFeature: "eval-file",
96
+ reason: "WP-CLI eval-file is reserved for the dedicated runtime PHP tool so file-based execution can stay explicit and easier to audit.",
97
+ suggestedAlternatives: [
98
+ "execute_wp_php in full-access",
99
+ "execute_wp_cli with standard WP-CLI commands",
100
+ ],
101
+ },
102
+ {
103
+ prefix: ["package", "install"],
104
+ policyCode: "wp_cli_package_install_blocked",
105
+ blockedFeature: "package install",
106
+ reason: "WP-CLI package installation is blocked because it mutates shared tooling outside the selected Local site.",
107
+ suggestedAlternatives: ["package browse", "package list"],
108
+ },
109
+ {
110
+ prefix: ["package", "uninstall"],
111
+ policyCode: "wp_cli_package_uninstall_blocked",
112
+ blockedFeature: "package uninstall",
113
+ reason: "WP-CLI package removal is blocked because it mutates shared tooling outside the selected Local site.",
114
+ suggestedAlternatives: ["package browse", "package list"],
115
+ },
116
+ {
117
+ prefix: ["package", "update"],
118
+ policyCode: "wp_cli_package_update_blocked",
119
+ blockedFeature: "package update",
120
+ reason: "WP-CLI package updates are blocked because they mutate shared tooling outside the selected Local site.",
121
+ suggestedAlternatives: ["package browse", "package list"],
122
+ },
123
+ {
124
+ prefix: ["shell"],
125
+ policyCode: "wp_cli_shell_blocked",
126
+ blockedFeature: "shell",
127
+ reason: "Interactive WP-CLI shell access is blocked because it would bypass the MCP's non-interactive guardrails.",
128
+ suggestedAlternatives: [
129
+ "execute_wp_cli with standard commands",
130
+ "execute_wp_php in full-access",
131
+ ],
132
+ },
11
133
  ];
12
134
  const wpCliSafePrefixes = [
13
135
  ["cap", "list"],
@@ -94,8 +216,20 @@ const wpCliSafePrefixes = [
94
216
  export function assertAllowedWpFlags(args) {
95
217
  for (const arg of args) {
96
218
  const flag = arg.split("=")[0];
97
- if (restrictedWpFlags.has(flag)) {
98
- throw new Error(`The '${flag}' flag is not allowed here because the MCP selects the Local site for you.`);
219
+ const restrictedFlag = restrictedWpFlags.get(flag);
220
+ if (restrictedFlag) {
221
+ throw new StructuredToolError({
222
+ error: "blocked_command",
223
+ message: restrictedFlag.message,
224
+ policyCode: restrictedFlag.policyCode,
225
+ policy_code: restrictedFlag.policyCode,
226
+ blockedFeature: flag,
227
+ blocked_feature: flag,
228
+ reason: restrictedFlag.reason,
229
+ args,
230
+ suggestedAlternatives: restrictedFlag.suggestedAlternatives,
231
+ suggested_alternatives: restrictedFlag.suggestedAlternatives,
232
+ });
99
233
  }
100
234
  }
101
235
  }
@@ -103,8 +237,22 @@ export function assertWpCliPermissions(args) {
103
237
  return assertWpCliPermissionsForProfile(config.profile, args);
104
238
  }
105
239
  export function assertWpCliPermissionsForProfile(profile, args) {
106
- if (matchesAnyPrefix(args, wpCliAlwaysBlockedPrefixes)) {
107
- throw new Error("This WP-CLI command is blocked in this MCP because it behaves like arbitrary code execution or unrestricted SQL.");
240
+ const blockedRule = findMatchingPrefixRule(args, wpCliAlwaysBlockedRules);
241
+ if (blockedRule) {
242
+ throw new StructuredToolError({
243
+ error: "blocked_command",
244
+ message: `This WP-CLI command is blocked in this MCP. ${blockedRule.reason}`,
245
+ policyCode: blockedRule.policyCode,
246
+ policy_code: blockedRule.policyCode,
247
+ blockedFeature: blockedRule.blockedFeature,
248
+ blocked_feature: blockedRule.blockedFeature,
249
+ reason: blockedRule.reason,
250
+ args,
251
+ accessProfile: profile,
252
+ access_profile: profile,
253
+ suggestedAlternatives: blockedRule.suggestedAlternatives,
254
+ suggested_alternatives: blockedRule.suggestedAlternatives,
255
+ });
108
256
  }
109
257
  if (profile === "full-access") {
110
258
  return;
@@ -114,12 +262,36 @@ export function assertWpCliPermissionsForProfile(profile, args) {
114
262
  return;
115
263
  }
116
264
  if (!matchesAnyPrefix(args, wpCliSafePrefixes)) {
117
- throw new Error("This WP-CLI command is not allowed in the 'safe' profile. Switch to LOCALWP_MCP_PROFILE=full-access for broad WP-CLI access.");
265
+ throw new StructuredToolError({
266
+ error: "blocked_command",
267
+ message: "This WP-CLI command is not allowed in the 'safe' profile. Switch to LOCALWP_MCP_PROFILE=full-access for broad WP-CLI access.",
268
+ policyCode: "wp_cli_safe_profile_blocked",
269
+ policy_code: "wp_cli_safe_profile_blocked",
270
+ blockedFeature: args.slice(0, 2).join(" ") || args[0] || "unknown",
271
+ blocked_feature: args.slice(0, 2).join(" ") || args[0] || "unknown",
272
+ reason: "The 'safe' profile only allows the curated set of inspection-oriented WP-CLI commands.",
273
+ args,
274
+ accessProfile: profile,
275
+ access_profile: profile,
276
+ requiredProfile: "full-access",
277
+ required_profile: "full-access",
278
+ suggestedAlternatives: [
279
+ "Use one of the read-oriented WP-CLI commands allowed in safe mode.",
280
+ "Switch to LOCALWP_MCP_PROFILE=full-access for broader WP-CLI access.",
281
+ ],
282
+ suggested_alternatives: [
283
+ "Use one of the read-oriented WP-CLI commands allowed in safe mode.",
284
+ "Switch to LOCALWP_MCP_PROFILE=full-access for broader WP-CLI access.",
285
+ ],
286
+ });
118
287
  }
119
288
  }
120
289
  function matchesAnyPrefix(args, prefixes) {
121
290
  return prefixes.some((prefix) => startsWithCommand(args, prefix));
122
291
  }
292
+ function findMatchingPrefixRule(args, rules) {
293
+ return rules.find((rule) => startsWithCommand(args, [...rule.prefix]));
294
+ }
123
295
  function startsWithCommand(args, prefix) {
124
296
  if (prefix.length > args.length) {
125
297
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEjE,MAAM,0BAA0B,GAAG;IACjC,CAAC,IAAI,EAAE,OAAO,CAAC;IACf,CAAC,MAAM,CAAC;IACR,CAAC,WAAW,CAAC;IACb,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,SAAS,EAAE,WAAW,CAAC;IACxB,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrB,CAAC,OAAO,CAAC;CACV,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACxB,CAAC,KAAK,EAAE,MAAM,CAAC;IACf,CAAC,KAAK,EAAE,cAAc,CAAC;IACvB,CAAC,KAAK,EAAE,UAAU,CAAC;IACnB,CAAC,KAAK,EAAE,MAAM,CAAC;IACf,CAAC,KAAK,EAAE,YAAY,CAAC;IACrB,CAAC,KAAK,EAAE,SAAS,CAAC;IAClB,CAAC,SAAS,EAAE,KAAK,CAAC;IAClB,CAAC,SAAS,EAAE,MAAM,CAAC;IACnB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACjB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACjB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,MAAM,EAAE,cAAc,CAAC;IACxB,CAAC,MAAM,EAAE,cAAc,CAAC;IACxB,CAAC,MAAM,EAAE,kBAAkB,CAAC;IAC5B,CAAC,MAAM,EAAE,SAAS,CAAC;IACnB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IACzB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,IAAI,EAAE,OAAO,CAAC;IACf,CAAC,IAAI,EAAE,SAAS,CAAC;IACjB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,MAAM,CAAC;IACd,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC;IAC5B,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;IAC9B,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC;IAC7B,CAAC,OAAO,EAAE,KAAK,CAAC;IAChB,CAAC,OAAO,EAAE,YAAY,CAAC;IACvB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IACxB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC;IAC1B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;IAC3B,CAAC,QAAQ,EAAE,KAAK,CAAC;IACjB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrB,CAAC,SAAS,EAAE,MAAM,CAAC;IACnB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACjB,CAAC,QAAQ,EAAE,WAAW,CAAC;IACvB,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC1B,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IAC9B,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,SAAS,EAAE,MAAM,CAAC;IACnB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,MAAM,CAAC;IACnB,CAAC,MAAM,EAAE,QAAQ,CAAC;IAClB,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;IAC3B,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IACzB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IACvB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IACxB,CAAC,aAAa,EAAE,MAAM,CAAC;IACvB,CAAC,UAAU,EAAE,KAAK,CAAC;IACnB,CAAC,UAAU,EAAE,MAAM,CAAC;IACpB,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,OAAO,EAAE,KAAK,CAAC;IAChB,CAAC,OAAO,EAAE,WAAW,CAAC;IACtB,CAAC,OAAO,EAAE,cAAc,CAAC;IACzB,CAAC,OAAO,EAAE,MAAM,CAAC;IACjB,CAAC,OAAO,EAAE,MAAM,CAAC;IACjB,CAAC,OAAO,EAAE,QAAQ,CAAC;IACnB,CAAC,WAAW,EAAE,KAAK,CAAC;IACpB,CAAC,WAAW,EAAE,MAAM,CAAC;IACrB,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,CAAC;IACxC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;IACvB,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IACvB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IACxB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;IAC3B,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/B,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,QAAQ,IAAI,4EAA4E,CACzF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAc;IACnD,OAAO,gCAAgC,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,OAAsB,EACtB,IAAc;IAEd,IAAI,gBAAgB,CAAC,IAAI,EAAE,0BAA0B,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,kHAAkH,CACnH,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IACE,iBAAiB,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC1B,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,8HAA8H,CAC/H,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc,EAAE,QAAoB;IAC5D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc,EAAE,MAAgB;IACzD,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC;QACE,QAAQ;QACR;YACE,UAAU,EAAE,oCAAoC;YAChD,OAAO,EACL,uFAAuF;YACzF,MAAM,EACJ,gGAAgG;YAClG,qBAAqB,EAAE;gBACrB,mDAAmD;aACpD;SACF;KACF;IACD;QACE,OAAO;QACP;YACE,UAAU,EAAE,oCAAoC;YAChD,OAAO,EACL,sFAAsF;YACxF,MAAM,EACJ,gGAAgG;YAClG,qBAAqB,EAAE;gBACrB,mDAAmD;aACpD;SACF;KACF;IACD;QACE,QAAQ;QACR;YACE,UAAU,EAAE,oCAAoC;YAChD,OAAO,EACL,uFAAuF;YACzF,MAAM,EACJ,gGAAgG;YAClG,qBAAqB,EAAE;gBACrB,mDAAmD;aACpD;SACF;KACF;IACD;QACE,WAAW;QACX;YACE,UAAU,EAAE,6BAA6B;YACzC,OAAO,EACL,gGAAgG;YAClG,MAAM,EACJ,kHAAkH;YACpH,qBAAqB,EAAE;gBACrB,gDAAgD;gBAChD,qFAAqF;aACtF;SACF;KACF;IACD;QACE,QAAQ;QACR;YACE,UAAU,EAAE,0BAA0B;YACtC,OAAO,EACL,gGAAgG;YAClG,MAAM,EACJ,kHAAkH;YACpH,qBAAqB,EAAE;gBACrB,gDAAgD;gBAChD,qFAAqF;aACtF;SACF;KACF;IACD;QACE,UAAU;QACV;YACE,UAAU,EAAE,4BAA4B;YACxC,OAAO,EACL,kGAAkG;YACpG,MAAM,EACJ,2FAA2F;YAC7F,qBAAqB,EAAE;gBACrB,oEAAoE;aACrE;SACF;KACF;CACF,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG;IAC9B;QACE,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;QACvB,UAAU,EAAE,yBAAyB;QACrC,cAAc,EAAE,UAAU;QAC1B,MAAM,EACJ,qGAAqG;QACvG,qBAAqB,EAAE,CAAC,aAAa,EAAE,8BAA8B,CAAC;KACvE;IACD;QACE,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,UAAU,EAAE,qBAAqB;QACjC,cAAc,EAAE,MAAM;QACtB,MAAM,EACJ,4GAA4G;QAC9G,qBAAqB,EAAE;YACrB,+BAA+B;YAC/B,8CAA8C;YAC9C,0CAA0C;SAC3C;KACF;IACD;QACE,MAAM,EAAE,CAAC,WAAW,CAAC;QACrB,UAAU,EAAE,0BAA0B;QACtC,cAAc,EAAE,WAAW;QAC3B,MAAM,EACJ,gIAAgI;QAClI,qBAAqB,EAAE;YACrB,+BAA+B;YAC/B,8CAA8C;SAC/C;KACF;IACD;QACE,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC9B,UAAU,EAAE,gCAAgC;QAC5C,cAAc,EAAE,iBAAiB;QACjC,MAAM,EACJ,2GAA2G;QAC7G,qBAAqB,EAAE,CAAC,gBAAgB,EAAE,cAAc,CAAC;KAC1D;IACD;QACE,MAAM,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;QAChC,UAAU,EAAE,kCAAkC;QAC9C,cAAc,EAAE,mBAAmB;QACnC,MAAM,EACJ,sGAAsG;QACxG,qBAAqB,EAAE,CAAC,gBAAgB,EAAE,cAAc,CAAC;KAC1D;IACD;QACE,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC7B,UAAU,EAAE,+BAA+B;QAC3C,cAAc,EAAE,gBAAgB;QAChC,MAAM,EACJ,wGAAwG;QAC1G,qBAAqB,EAAE,CAAC,gBAAgB,EAAE,cAAc,CAAC;KAC1D;IACD;QACE,MAAM,EAAE,CAAC,OAAO,CAAC;QACjB,UAAU,EAAE,sBAAsB;QAClC,cAAc,EAAE,OAAO;QACvB,MAAM,EACJ,0GAA0G;QAC5G,qBAAqB,EAAE;YACrB,uCAAuC;YACvC,+BAA+B;SAChC;KACF;CACO,CAAC;AAEX,MAAM,iBAAiB,GAAG;IACxB,CAAC,KAAK,EAAE,MAAM,CAAC;IACf,CAAC,KAAK,EAAE,cAAc,CAAC;IACvB,CAAC,KAAK,EAAE,UAAU,CAAC;IACnB,CAAC,KAAK,EAAE,MAAM,CAAC;IACf,CAAC,KAAK,EAAE,YAAY,CAAC;IACrB,CAAC,KAAK,EAAE,SAAS,CAAC;IAClB,CAAC,SAAS,EAAE,KAAK,CAAC;IAClB,CAAC,SAAS,EAAE,MAAM,CAAC;IACnB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACjB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACjB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,MAAM,EAAE,cAAc,CAAC;IACxB,CAAC,MAAM,EAAE,cAAc,CAAC;IACxB,CAAC,MAAM,EAAE,kBAAkB,CAAC;IAC5B,CAAC,MAAM,EAAE,SAAS,CAAC;IACnB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IACzB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,IAAI,EAAE,OAAO,CAAC;IACf,CAAC,IAAI,EAAE,SAAS,CAAC;IACjB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,IAAI,EAAE,MAAM,CAAC;IACd,CAAC,IAAI,EAAE,QAAQ,CAAC;IAChB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC;IAC5B,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;IAC9B,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC;IAC7B,CAAC,OAAO,EAAE,KAAK,CAAC;IAChB,CAAC,OAAO,EAAE,YAAY,CAAC;IACvB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IACxB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC;IAC1B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;IAC3B,CAAC,QAAQ,EAAE,KAAK,CAAC;IACjB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrB,CAAC,SAAS,EAAE,MAAM,CAAC;IACnB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACjB,CAAC,QAAQ,EAAE,WAAW,CAAC;IACvB,CAAC,QAAQ,EAAE,cAAc,CAAC;IAC1B,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IAC9B,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,SAAS,EAAE,MAAM,CAAC;IACnB,CAAC,SAAS,EAAE,OAAO,CAAC;IACpB,CAAC,SAAS,EAAE,MAAM,CAAC;IACnB,CAAC,MAAM,EAAE,QAAQ,CAAC;IAClB,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;IAC3B,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IACzB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IACvB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IACxB,CAAC,aAAa,EAAE,MAAM,CAAC;IACvB,CAAC,UAAU,EAAE,KAAK,CAAC;IACnB,CAAC,UAAU,EAAE,MAAM,CAAC;IACpB,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,OAAO,EAAE,KAAK,CAAC;IAChB,CAAC,OAAO,EAAE,WAAW,CAAC;IACtB,CAAC,OAAO,EAAE,cAAc,CAAC;IACzB,CAAC,OAAO,EAAE,MAAM,CAAC;IACjB,CAAC,OAAO,EAAE,MAAM,CAAC;IACjB,CAAC,OAAO,EAAE,QAAQ,CAAC;IACnB,CAAC,WAAW,EAAE,KAAK,CAAC;IACpB,CAAC,WAAW,EAAE,MAAM,CAAC;IACrB,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,CAAC;IACxC,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;IACvB,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IACvB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IACxB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;IAC3B,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,IAAc;IACjD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEnD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,IAAI,mBAAmB,CAAC;gBAC5B,KAAK,EAAE,iBAAiB;gBACxB,OAAO,EAAE,cAAc,CAAC,OAAO;gBAC/B,UAAU,EAAE,cAAc,CAAC,UAAU;gBACrC,WAAW,EAAE,cAAc,CAAC,UAAU;gBACtC,cAAc,EAAE,IAAI;gBACpB,eAAe,EAAE,IAAI;gBACrB,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,IAAI;gBACJ,qBAAqB,EAAE,cAAc,CAAC,qBAAqB;gBAC3D,sBAAsB,EAAE,cAAc,CAAC,qBAAqB;aAC7D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAc;IACnD,OAAO,gCAAgC,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,OAAsB,EACtB,IAAc;IAEd,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;IAC1E,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,mBAAmB,CAAC;YAC5B,KAAK,EAAE,iBAAiB;YACxB,OAAO,EACL,+CAA+C,WAAW,CAAC,MAAM,EAAE;YACrE,UAAU,EAAE,WAAW,CAAC,UAAU;YAClC,WAAW,EAAE,WAAW,CAAC,UAAU;YACnC,cAAc,EAAE,WAAW,CAAC,cAAc;YAC1C,eAAe,EAAE,WAAW,CAAC,cAAc;YAC3C,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,IAAI;YACJ,aAAa,EAAE,OAAO;YACtB,cAAc,EAAE,OAAO;YACvB,qBAAqB,EAAE,WAAW,CAAC,qBAAqB;YACxD,sBAAsB,EAAE,WAAW,CAAC,qBAAqB;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IACE,iBAAiB,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC1B,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,mBAAmB,CAAC;YAC5B,KAAK,EAAE,iBAAiB;YACxB,OAAO,EACL,8HAA8H;YAChI,UAAU,EAAE,6BAA6B;YACzC,WAAW,EAAE,6BAA6B;YAC1C,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS;YAClE,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS;YACnE,MAAM,EACJ,wFAAwF;YAC1F,IAAI;YACJ,aAAa,EAAE,OAAO;YACtB,cAAc,EAAE,OAAO;YACvB,eAAe,EAAE,aAAa;YAC9B,gBAAgB,EAAE,aAAa;YAC/B,qBAAqB,EAAE;gBACrB,oEAAoE;gBACpE,sEAAsE;aACvE;YACD,sBAAsB,EAAE;gBACtB,oEAAoE;gBACpE,sEAAsE;aACvE;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc,EAAE,QAAoB;IAC5D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,sBAAsB,CAI7B,IAAc,EAAE,KAAmB;IACnC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc,EAAE,MAAgB;IACzD,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;AAC/D,CAAC"}
package/dist/results.d.ts CHANGED
@@ -7,9 +7,17 @@ export declare function createJsonToolResult<T extends Record<string, unknown>>(
7
7
  };
8
8
  export declare function createErrorToolResult(error: unknown): {
9
9
  isError: boolean;
10
+ structuredContent: import("./errors.js").StructuredToolErrorPayload;
10
11
  content: {
11
12
  type: "text";
12
13
  text: string;
13
14
  }[];
15
+ } | {
16
+ isError: boolean;
17
+ content: {
18
+ type: "text";
19
+ text: string;
20
+ }[];
21
+ structuredContent?: undefined;
14
22
  };
15
23
  export declare function formatError(error: unknown): string;
package/dist/results.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { StructuredToolError } from "./errors.js";
1
2
  export function createJsonToolResult(payload) {
2
3
  return {
3
4
  structuredContent: payload,
@@ -10,6 +11,18 @@ export function createJsonToolResult(payload) {
10
11
  };
11
12
  }
12
13
  export function createErrorToolResult(error) {
14
+ if (error instanceof StructuredToolError) {
15
+ return {
16
+ isError: true,
17
+ structuredContent: error.payload,
18
+ content: [
19
+ {
20
+ type: "text",
21
+ text: JSON.stringify(error.payload, null, 2),
22
+ },
23
+ ],
24
+ };
25
+ }
13
26
  return {
14
27
  isError: true,
15
28
  content: [
@@ -1 +1 @@
1
- {"version":3,"file":"results.js","sourceRoot":"","sources":["../src/results.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAClC,OAAU;IAEV,OAAO;QACL,iBAAiB,EAAE,OAAO;QAC1B,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aACvC;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC;aACzB;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"results.js","sourceRoot":"","sources":["../src/results.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,UAAU,oBAAoB,CAClC,OAAU;IAEV,OAAO;QACL,iBAAiB,EAAE,OAAO;QAC1B,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aACvC;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;QACzC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,KAAK,CAAC,OAAO;YAChC,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC7C;aACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC;aACzB;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerExecuteWpPhpTool(server: McpServer): void;
@@ -0,0 +1,69 @@
1
+ import { rm } from "fs/promises";
2
+ import { z } from "zod";
3
+ import { config } from "../config.js";
4
+ import { StructuredToolError } from "../errors.js";
5
+ import { buildSiteContext, summarizeSite } from "../local-sites.js";
6
+ import { createErrorToolResult, createJsonToolResult } from "../results.js";
7
+ import { siteSelectorSchema } from "../tool-schemas.js";
8
+ import { runWpCliArgs } from "../wp-cli.js";
9
+ import { prepareWpPhpSource } from "../wp-runtime.js";
10
+ export function registerExecuteWpPhpTool(server) {
11
+ server.registerTool("execute_wp_php", {
12
+ description: "Runs a high-trust PHP snippet or PHP file inside the selected LocalWP site's loaded WordPress runtime using a file-based eval flow. Requires the 'full-access' profile.",
13
+ inputSchema: {
14
+ ...siteSelectorSchema,
15
+ phpCode: z
16
+ .string()
17
+ .optional()
18
+ .describe("Optional inline PHP to run after WordPress loads. If you omit '<?php', the tool will prepend it for you."),
19
+ filePath: z
20
+ .string()
21
+ .optional()
22
+ .describe("Optional absolute path or working-directory-relative path to a readable .php file inside the current workspace or selected Local site."),
23
+ },
24
+ }, async ({ siteId, siteName, phpCode, filePath }) => {
25
+ try {
26
+ if (config.profile !== "full-access") {
27
+ throw new StructuredToolError({
28
+ error: "profile_required",
29
+ message: "execute_wp_php requires LOCALWP_MCP_PROFILE=full-access because it executes PHP inside the loaded WordPress runtime.",
30
+ requiredProfile: "full-access",
31
+ accessProfile: config.profile,
32
+ });
33
+ }
34
+ const context = await buildSiteContext({ siteId, siteName });
35
+ const source = await prepareWpPhpSource({
36
+ siteRoot: context.site.absolutePath,
37
+ phpCode,
38
+ filePath,
39
+ });
40
+ try {
41
+ const result = await runWpCliArgs(context, ["eval-file", source.absolutePath], {
42
+ skipPermissionCheck: true,
43
+ });
44
+ return createJsonToolResult({
45
+ site: summarizeSite(context.site),
46
+ selectionMethod: context.selectionMethod,
47
+ accessProfile: config.profile,
48
+ executionEngine: "wp eval-file",
49
+ sourceMode: source.mode,
50
+ sourcePath: source.sourcePath,
51
+ stdout: result.stdout,
52
+ stderr: result.stderr,
53
+ });
54
+ }
55
+ finally {
56
+ if (source.cleanupPath) {
57
+ await rm(source.cleanupPath, {
58
+ recursive: true,
59
+ force: true,
60
+ });
61
+ }
62
+ }
63
+ }
64
+ catch (error) {
65
+ return createErrorToolResult(error);
66
+ }
67
+ });
68
+ }
69
+ //# sourceMappingURL=execute-wp-php.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-wp-php.js","sourceRoot":"","sources":["../../src/tools/execute-wp-php.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,yKAAyK;QAC3K,WAAW,EAAE;YACX,GAAG,kBAAkB;YACrB,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,0GAA0G,CAC3G;YACH,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,wIAAwI,CACzI;SACJ;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;QAChD,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;gBACrC,MAAM,IAAI,mBAAmB,CAAC;oBAC5B,KAAK,EAAE,kBAAkB;oBACzB,OAAO,EACL,sHAAsH;oBACxH,eAAe,EAAE,aAAa;oBAC9B,aAAa,EAAE,MAAM,CAAC,OAAO;iBAC9B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;gBACtC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY;gBACnC,OAAO;gBACP,QAAQ;aACT,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,OAAO,EACP,CAAC,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,EAClC;oBACE,mBAAmB,EAAE,IAAI;iBAC1B,CACF,CAAC;gBAEF,OAAO,oBAAoB,CAAC;oBAC1B,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;oBACjC,eAAe,EAAE,OAAO,CAAC,eAAe;oBACxC,aAAa,EAAE,MAAM,CAAC,OAAO;oBAC7B,eAAe,EAAE,cAAc;oBAC/B,UAAU,EAAE,MAAM,CAAC,IAAI;oBACvB,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;iBACtB,CAAC,CAAC;YACL,CAAC;oBAAS,CAAC;gBACT,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACvB,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE;wBAC3B,SAAS,EAAE,IAAI;wBACf,KAAK,EAAE,IAAI;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -5,6 +5,7 @@ import { registerDbImportTool } from "./db-import.js";
5
5
  import { registerDeleteBackupTool } from "./delete-backup.js";
6
6
  import { registerDeleteSiteFileTool } from "./delete-site-file.js";
7
7
  import { registerExecuteWpCliTool } from "./execute-wp-cli.js";
8
+ import { registerExecuteWpPhpTool } from "./execute-wp-php.js";
8
9
  import { registerListBackupsTool } from "./list-backups.js";
9
10
  import { registerListSiteFilesTool } from "./list-site-files.js";
10
11
  import { registerLocalDoctorTool } from "./local-doctor.js";
@@ -22,6 +23,7 @@ import { registerRestoreBackupTool } from "./restore-backup.js";
22
23
  import { registerSearchSiteFilesTool } from "./search-site-files.js";
23
24
  import { registerStartLocalSiteTool } from "./start-local-site.js";
24
25
  import { registerStopLocalSiteTool } from "./stop-local-site.js";
26
+ import { registerWpRuntimeCallTools } from "./wp-runtime-call.js";
25
27
  import { registerWriteSiteFileTool } from "./write-site-file.js";
26
28
  export function registerTools(server) {
27
29
  registerListLocalSitesTool(server);
@@ -49,5 +51,7 @@ export function registerTools(server) {
49
51
  registerMysqlExecuteTool(server);
50
52
  registerMysqlSchemaTool(server);
51
53
  registerExecuteWpCliTool(server);
54
+ registerExecuteWpPhpTool(server);
55
+ registerWpRuntimeCallTools(server);
52
56
  }
53
57
  //# sourceMappingURL=index.js.map