localwp-mcp 0.1.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/LICENSE +15 -0
- package/README.md +229 -0
- package/dist/backup.d.ts +72 -0
- package/dist/backup.js +351 -0
- package/dist/backup.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.js +58 -0
- package/dist/config.js.map +1 -0
- package/dist/environment-check.d.ts +187 -0
- package/dist/environment-check.js +174 -0
- package/dist/environment-check.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/local-doctor.d.ts +42 -0
- package/dist/local-doctor.js +224 -0
- package/dist/local-doctor.js.map +1 -0
- package/dist/local-sites.d.ts +103 -0
- package/dist/local-sites.js +234 -0
- package/dist/local-sites.js.map +1 -0
- package/dist/local-tooling.d.ts +2 -0
- package/dist/local-tooling.js +23 -0
- package/dist/local-tooling.js.map +1 -0
- package/dist/logs.d.ts +144 -0
- package/dist/logs.js +208 -0
- package/dist/logs.js.map +1 -0
- package/dist/mysql.d.ts +17 -0
- package/dist/mysql.js +229 -0
- package/dist/mysql.js.map +1 -0
- package/dist/permissions.d.ts +4 -0
- package/dist/permissions.js +129 -0
- package/dist/permissions.js.map +1 -0
- package/dist/platform-paths.d.ts +10 -0
- package/dist/platform-paths.js +95 -0
- package/dist/platform-paths.js.map +1 -0
- package/dist/process-utils.d.ts +13 -0
- package/dist/process-utils.js +128 -0
- package/dist/process-utils.js.map +1 -0
- package/dist/prompts.d.ts +2 -0
- package/dist/prompts.js +64 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +2 -0
- package/dist/resources.js +110 -0
- package/dist/resources.js.map +1 -0
- package/dist/results.d.ts +15 -0
- package/dist/results.js +26 -0
- package/dist/results.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +23 -0
- package/dist/server.js.map +1 -0
- package/dist/tool-schemas.d.ts +14 -0
- package/dist/tool-schemas.js +20 -0
- package/dist/tool-schemas.js.map +1 -0
- package/dist/tools/backup-site.d.ts +2 -0
- package/dist/tools/backup-site.js +42 -0
- package/dist/tools/backup-site.js.map +1 -0
- package/dist/tools/db-export.d.ts +2 -0
- package/dist/tools/db-export.js +40 -0
- package/dist/tools/db-export.js.map +1 -0
- package/dist/tools/db-import.d.ts +2 -0
- package/dist/tools/db-import.js +42 -0
- package/dist/tools/db-import.js.map +1 -0
- package/dist/tools/execute-wp-cli.d.ts +2 -0
- package/dist/tools/execute-wp-cli.js +34 -0
- package/dist/tools/execute-wp-cli.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +29 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-local-sites.d.ts +2 -0
- package/dist/tools/list-local-sites.js +32 -0
- package/dist/tools/list-local-sites.js.map +1 -0
- package/dist/tools/local-doctor.d.ts +2 -0
- package/dist/tools/local-doctor.js +23 -0
- package/dist/tools/local-doctor.js.map +1 -0
- package/dist/tools/local-environment-check.d.ts +2 -0
- package/dist/tools/local-environment-check.js +32 -0
- package/dist/tools/local-environment-check.js.map +1 -0
- package/dist/tools/local-logs.d.ts +2 -0
- package/dist/tools/local-logs.js +31 -0
- package/dist/tools/local-logs.js.map +1 -0
- package/dist/tools/local-site-info.d.ts +2 -0
- package/dist/tools/local-site-info.js +46 -0
- package/dist/tools/local-site-info.js.map +1 -0
- package/dist/tools/mysql-execute.d.ts +2 -0
- package/dist/tools/mysql-execute.js +46 -0
- package/dist/tools/mysql-execute.js.map +1 -0
- package/dist/tools/mysql-query.d.ts +2 -0
- package/dist/tools/mysql-query.js +43 -0
- package/dist/tools/mysql-query.js.map +1 -0
- package/dist/tools/mysql-schema.d.ts +2 -0
- package/dist/tools/mysql-schema.js +50 -0
- package/dist/tools/mysql-schema.js.map +1 -0
- package/dist/tools/restore-backup.d.ts +2 -0
- package/dist/tools/restore-backup.js +52 -0
- package/dist/tools/restore-backup.js.map +1 -0
- package/dist/types.d.ts +84 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/wp-cli.d.ts +14 -0
- package/dist/wp-cli.js +140 -0
- package/dist/wp-cli.js.map +1 -0
- package/package.json +61 -0
package/dist/server.d.ts
ADDED
package/dist/server.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { registerPrompts } from "./prompts.js";
|
|
3
|
+
import { registerResources } from "./resources.js";
|
|
4
|
+
import { registerTools } from "./tools/index.js";
|
|
5
|
+
const SERVER_NAME = "localwp-mcp";
|
|
6
|
+
const SERVER_VERSION = process.env.npm_package_version || "0.1.0";
|
|
7
|
+
export function createServer() {
|
|
8
|
+
const server = new McpServer({
|
|
9
|
+
name: SERVER_NAME,
|
|
10
|
+
version: SERVER_VERSION,
|
|
11
|
+
}, {
|
|
12
|
+
capabilities: {
|
|
13
|
+
prompts: {},
|
|
14
|
+
resources: {},
|
|
15
|
+
tools: {},
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
registerResources(server);
|
|
19
|
+
registerPrompts(server);
|
|
20
|
+
registerTools(server);
|
|
21
|
+
return server;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC;AAElE,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,EACD;QACE,YAAY,EAAE;YACZ,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,eAAe,CAAC,MAAM,CAAC,CAAC;IACxB,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const siteSelectorSchema: {
|
|
3
|
+
siteId: z.ZodOptional<z.ZodString>;
|
|
4
|
+
siteName: z.ZodOptional<z.ZodString>;
|
|
5
|
+
};
|
|
6
|
+
export declare const logScopeSchema: z.ZodOptional<z.ZodEnum<{
|
|
7
|
+
site: "site";
|
|
8
|
+
global: "global";
|
|
9
|
+
all: "all";
|
|
10
|
+
}>>;
|
|
11
|
+
export declare const backupScopeSchema: z.ZodOptional<z.ZodEnum<{
|
|
12
|
+
database: "database";
|
|
13
|
+
full: "full";
|
|
14
|
+
}>>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const siteSelectorSchema = {
|
|
3
|
+
siteId: z
|
|
4
|
+
.string()
|
|
5
|
+
.optional()
|
|
6
|
+
.describe("Optional Local site ID, for example 'pAqtzqnWM'."),
|
|
7
|
+
siteName: z
|
|
8
|
+
.string()
|
|
9
|
+
.optional()
|
|
10
|
+
.describe("Optional Local site name, for example 'plovercrm'."),
|
|
11
|
+
};
|
|
12
|
+
export const logScopeSchema = z
|
|
13
|
+
.enum(["site", "global", "all"])
|
|
14
|
+
.optional()
|
|
15
|
+
.describe("Which logs to read: the selected site's logs, Local's app logs, or both.");
|
|
16
|
+
export const backupScopeSchema = z
|
|
17
|
+
.enum(["database", "full"])
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("Backup only the database, or create a full Local-style backup with app, conf, logs, and a fresh SQL export.");
|
|
20
|
+
//# sourceMappingURL=tool-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schemas.js","sourceRoot":"","sources":["../src/tool-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kDAAkD,CAAC;IAC/D,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,oDAAoD,CAAC;CAClE,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;KAC/B,QAAQ,EAAE;KACV,QAAQ,CACP,0EAA0E,CAC3E,CAAC;AAEJ,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;KAC1B,QAAQ,EAAE;KACV,QAAQ,CACP,6GAA6G,CAC9G,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createSiteBackup } from "../backup.js";
|
|
3
|
+
import { config } from "../config.js";
|
|
4
|
+
import { buildSiteContext, summarizeSite } from "../local-sites.js";
|
|
5
|
+
import { createErrorToolResult, createJsonToolResult } from "../results.js";
|
|
6
|
+
import { backupScopeSchema, siteSelectorSchema } from "../tool-schemas.js";
|
|
7
|
+
export function registerBackupSiteTool(server) {
|
|
8
|
+
server.registerTool("backup_site", {
|
|
9
|
+
description: "Creates a Local-friendly backup for the selected site. Use scope='database' for a SQL-only backup or scope='full' for app/conf/logs plus a fresh SQL export.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
...siteSelectorSchema,
|
|
12
|
+
scope: backupScopeSchema,
|
|
13
|
+
outputDir: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("Optional output directory. If omitted, backups are written to the site's localwp-mcp-backups folder."),
|
|
17
|
+
label: z
|
|
18
|
+
.string()
|
|
19
|
+
.optional()
|
|
20
|
+
.describe("Optional short label to include in the backup folder name."),
|
|
21
|
+
},
|
|
22
|
+
}, async ({ siteId, siteName, scope, outputDir, label }) => {
|
|
23
|
+
try {
|
|
24
|
+
const context = await buildSiteContext({ siteId, siteName });
|
|
25
|
+
const result = await createSiteBackup(context, {
|
|
26
|
+
scope,
|
|
27
|
+
outputDir,
|
|
28
|
+
label,
|
|
29
|
+
});
|
|
30
|
+
return createJsonToolResult({
|
|
31
|
+
site: summarizeSite(context.site),
|
|
32
|
+
selectionMethod: context.selectionMethod,
|
|
33
|
+
accessProfile: config.profile,
|
|
34
|
+
...result,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return createErrorToolResult(error);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=backup-site.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-site.js","sourceRoot":"","sources":["../../src/tools/backup-site.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,WAAW,EACT,8JAA8J;QAChK,WAAW,EAAE;YACX,GAAG,kBAAkB;YACrB,KAAK,EAAE,iBAAiB;YACxB,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,sGAAsG,CACvG;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4DAA4D,CAAC;SAC1E;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE;gBAC7C,KAAK;gBACL,SAAS;gBACT,KAAK;aACN,CAAC,CAAC;YAEH,OAAO,oBAAoB,CAAC;gBAC1B,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;gBACjC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,aAAa,EAAE,MAAM,CAAC,OAAO;gBAC7B,GAAG,MAAM;aACV,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { exportDatabase } from "../backup.js";
|
|
3
|
+
import { config } from "../config.js";
|
|
4
|
+
import { buildSiteContext, summarizeSite } from "../local-sites.js";
|
|
5
|
+
import { createErrorToolResult, createJsonToolResult } from "../results.js";
|
|
6
|
+
import { siteSelectorSchema } from "../tool-schemas.js";
|
|
7
|
+
export function registerDbExportTool(server) {
|
|
8
|
+
server.registerTool("db_export", {
|
|
9
|
+
description: "Exports the selected LocalWP site's database to a SQL file. The destination can be a .sql file path or a directory.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
...siteSelectorSchema,
|
|
12
|
+
destinationPath: z
|
|
13
|
+
.string()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe("Optional destination .sql file path or directory. If omitted, the export is written to localwp-mcp-backups/database-exports."),
|
|
16
|
+
label: z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("Optional label to include in the exported SQL filename."),
|
|
20
|
+
},
|
|
21
|
+
}, async ({ siteId, siteName, destinationPath, label }) => {
|
|
22
|
+
try {
|
|
23
|
+
const context = await buildSiteContext({ siteId, siteName });
|
|
24
|
+
const result = await exportDatabase(context, {
|
|
25
|
+
destinationPath,
|
|
26
|
+
label,
|
|
27
|
+
});
|
|
28
|
+
return createJsonToolResult({
|
|
29
|
+
site: summarizeSite(context.site),
|
|
30
|
+
selectionMethod: context.selectionMethod,
|
|
31
|
+
accessProfile: config.profile,
|
|
32
|
+
...result,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return createErrorToolResult(error);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=db-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-export.js","sourceRoot":"","sources":["../../src/tools/db-export.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,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;AAExD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,WAAW,EACT,qHAAqH;QACvH,WAAW,EAAE;YACX,GAAG,kBAAkB;YACrB,eAAe,EAAE,CAAC;iBACf,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,8HAA8H,CAC/H;YACH,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,yDAAyD,CAAC;SACvE;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,EAAE;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE;gBAC3C,eAAe;gBACf,KAAK;aACN,CAAC,CAAC;YAEH,OAAO,oBAAoB,CAAC;gBAC1B,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;gBACjC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,aAAa,EAAE,MAAM,CAAC,OAAO;gBAC7B,GAAG,MAAM;aACV,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { importDatabase } from "../backup.js";
|
|
3
|
+
import { config } from "../config.js";
|
|
4
|
+
import { buildSiteContext, summarizeSite } from "../local-sites.js";
|
|
5
|
+
import { createErrorToolResult, createJsonToolResult } from "../results.js";
|
|
6
|
+
import { siteSelectorSchema } from "../tool-schemas.js";
|
|
7
|
+
export function registerDbImportTool(server) {
|
|
8
|
+
server.registerTool("db_import", {
|
|
9
|
+
description: "Imports a SQL dump into the selected LocalWP site. You can pass either a .sql file path or a backup_site directory. Requires the 'full-access' profile.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
...siteSelectorSchema,
|
|
12
|
+
sourcePath: z
|
|
13
|
+
.string()
|
|
14
|
+
.min(1)
|
|
15
|
+
.describe("The source .sql file path or a backup_site directory that contains a manifest.json."),
|
|
16
|
+
backupBeforeImport: z
|
|
17
|
+
.boolean()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("When true or omitted, export a pre-import SQL backup first."),
|
|
20
|
+
},
|
|
21
|
+
}, async ({ siteId, siteName, sourcePath, backupBeforeImport }) => {
|
|
22
|
+
try {
|
|
23
|
+
if (config.profile !== "full-access") {
|
|
24
|
+
throw new Error("db_import requires LOCALWP_MCP_PROFILE=full-access.");
|
|
25
|
+
}
|
|
26
|
+
const context = await buildSiteContext({ siteId, siteName });
|
|
27
|
+
const result = await importDatabase(context, sourcePath, {
|
|
28
|
+
backupBeforeImport,
|
|
29
|
+
});
|
|
30
|
+
return createJsonToolResult({
|
|
31
|
+
site: summarizeSite(context.site),
|
|
32
|
+
selectionMethod: context.selectionMethod,
|
|
33
|
+
accessProfile: config.profile,
|
|
34
|
+
...result,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return createErrorToolResult(error);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=db-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-import.js","sourceRoot":"","sources":["../../src/tools/db-import.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,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;AAExD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,WAAW,EACT,yJAAyJ;QAC3J,WAAW,EAAE;YACX,GAAG,kBAAkB;YACrB,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACP,qFAAqF,CACtF;YACH,kBAAkB,EAAE,CAAC;iBAClB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,6DAA6D,CAC9D;SACJ;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACzE,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE;gBACvD,kBAAkB;aACnB,CAAC,CAAC;YAEH,OAAO,oBAAoB,CAAC;gBAC1B,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;gBACjC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,aAAa,EAAE,MAAM,CAAC,OAAO;gBAC7B,GAAG,MAAM;aACV,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { buildSiteContext, summarizeSite } from "../local-sites.js";
|
|
4
|
+
import { createErrorToolResult, createJsonToolResult } from "../results.js";
|
|
5
|
+
import { siteSelectorSchema } from "../tool-schemas.js";
|
|
6
|
+
import { runWpCli } from "../wp-cli.js";
|
|
7
|
+
export function registerExecuteWpCliTool(server) {
|
|
8
|
+
server.registerTool("execute_wp_cli", {
|
|
9
|
+
description: "Runs a WP-CLI command against the selected LocalWP site using that site's Local PHP runtime and WordPress path.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
...siteSelectorSchema,
|
|
12
|
+
command: z
|
|
13
|
+
.string()
|
|
14
|
+
.min(1)
|
|
15
|
+
.describe("WP-CLI arguments only, for example 'plugin list'."),
|
|
16
|
+
},
|
|
17
|
+
}, async ({ siteId, siteName, command }) => {
|
|
18
|
+
try {
|
|
19
|
+
const context = await buildSiteContext({ siteId, siteName });
|
|
20
|
+
const result = await runWpCli(context, command);
|
|
21
|
+
return createJsonToolResult({
|
|
22
|
+
site: summarizeSite(context.site),
|
|
23
|
+
selectionMethod: context.selectionMethod,
|
|
24
|
+
accessProfile: config.profile,
|
|
25
|
+
command,
|
|
26
|
+
...result,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return createErrorToolResult(error);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=execute-wp-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-wp-cli.js","sourceRoot":"","sources":["../../src/tools/execute-wp-cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,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,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,iHAAiH;QACnH,WAAW,EAAE;YACX,GAAG,kBAAkB;YACrB,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,mDAAmD,CAAC;SACjE;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEhD,OAAO,oBAAoB,CAAC;gBAC1B,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;gBACjC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,aAAa,EAAE,MAAM,CAAC,OAAO;gBAC7B,OAAO;gBACP,GAAG,MAAM;aACV,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { registerBackupSiteTool } from "./backup-site.js";
|
|
2
|
+
import { registerDbExportTool } from "./db-export.js";
|
|
3
|
+
import { registerDbImportTool } from "./db-import.js";
|
|
4
|
+
import { registerExecuteWpCliTool } from "./execute-wp-cli.js";
|
|
5
|
+
import { registerLocalDoctorTool } from "./local-doctor.js";
|
|
6
|
+
import { registerLocalEnvironmentCheckTool } from "./local-environment-check.js";
|
|
7
|
+
import { registerLocalLogsTool } from "./local-logs.js";
|
|
8
|
+
import { registerListLocalSitesTool } from "./list-local-sites.js";
|
|
9
|
+
import { registerLocalSiteInfoTool } from "./local-site-info.js";
|
|
10
|
+
import { registerMysqlExecuteTool } from "./mysql-execute.js";
|
|
11
|
+
import { registerMysqlQueryTool } from "./mysql-query.js";
|
|
12
|
+
import { registerMysqlSchemaTool } from "./mysql-schema.js";
|
|
13
|
+
import { registerRestoreBackupTool } from "./restore-backup.js";
|
|
14
|
+
export function registerTools(server) {
|
|
15
|
+
registerListLocalSitesTool(server);
|
|
16
|
+
registerLocalEnvironmentCheckTool(server);
|
|
17
|
+
registerLocalDoctorTool(server);
|
|
18
|
+
registerLocalLogsTool(server);
|
|
19
|
+
registerLocalSiteInfoTool(server);
|
|
20
|
+
registerBackupSiteTool(server);
|
|
21
|
+
registerDbExportTool(server);
|
|
22
|
+
registerDbImportTool(server);
|
|
23
|
+
registerRestoreBackupTool(server);
|
|
24
|
+
registerMysqlQueryTool(server);
|
|
25
|
+
registerMysqlExecuteTool(server);
|
|
26
|
+
registerMysqlSchemaTool(server);
|
|
27
|
+
registerExecuteWpCliTool(server);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,iCAAiC,CAAC,MAAM,CAAC,CAAC;IAC1C,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { loadLocalSites, summarizeSite } from "../local-sites.js";
|
|
3
|
+
import { createErrorToolResult, createJsonToolResult } from "../results.js";
|
|
4
|
+
export function registerListLocalSitesTool(server) {
|
|
5
|
+
server.registerTool("list_local_sites", {
|
|
6
|
+
description: "Lists LocalWP sites from Local's own metadata, including status, path, domain, and service versions.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
includeStopped: z
|
|
9
|
+
.boolean()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe("When true, include halted sites. Defaults to true."),
|
|
12
|
+
},
|
|
13
|
+
annotations: {
|
|
14
|
+
readOnlyHint: true,
|
|
15
|
+
},
|
|
16
|
+
}, async ({ includeStopped }) => {
|
|
17
|
+
try {
|
|
18
|
+
const sites = await loadLocalSites();
|
|
19
|
+
const filteredSites = includeStopped === false
|
|
20
|
+
? sites.filter((site) => site.status === "running")
|
|
21
|
+
: sites;
|
|
22
|
+
return createJsonToolResult({
|
|
23
|
+
sites: filteredSites.map((site) => summarizeSite(site)),
|
|
24
|
+
count: filteredSites.length,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return createErrorToolResult(error);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=list-local-sites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-local-sites.js","sourceRoot":"","sources":["../../src/tools/list-local-sites.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EACT,sGAAsG;QACxG,WAAW,EAAE;YACX,cAAc,EAAE,CAAC;iBACd,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,oDAAoD,CAAC;SAClE;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;SACnB;KACF,EACD,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;YACrC,MAAM,aAAa,GACjB,cAAc,KAAK,KAAK;gBACtB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;gBACnD,CAAC,CAAC,KAAK,CAAC;YAEZ,OAAO,oBAAoB,CAAC;gBAC1B,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACvD,KAAK,EAAE,aAAa,CAAC,MAAM;aAC5B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { runLocalDoctor } from "../local-doctor.js";
|
|
2
|
+
import { createErrorToolResult, createJsonToolResult } from "../results.js";
|
|
3
|
+
import { siteSelectorSchema } from "../tool-schemas.js";
|
|
4
|
+
export function registerLocalDoctorTool(server) {
|
|
5
|
+
server.registerTool("local_doctor", {
|
|
6
|
+
description: "Runs a practical LocalWP health check for the selected site, including site resolution, Local tooling, probes, and log availability.",
|
|
7
|
+
inputSchema: {
|
|
8
|
+
...siteSelectorSchema,
|
|
9
|
+
},
|
|
10
|
+
annotations: {
|
|
11
|
+
readOnlyHint: true,
|
|
12
|
+
},
|
|
13
|
+
}, async ({ siteId, siteName }) => {
|
|
14
|
+
try {
|
|
15
|
+
const result = await runLocalDoctor({ siteId, siteName });
|
|
16
|
+
return createJsonToolResult(result);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return createErrorToolResult(error);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=local-doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-doctor.js","sourceRoot":"","sources":["../../src/tools/local-doctor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,WAAW,EACT,sIAAsI;QACxI,WAAW,EAAE;YACX,GAAG,kBAAkB;SACtB;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;SACnB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1D,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { runEnvironmentCheck } from "../environment-check.js";
|
|
3
|
+
import { createErrorToolResult, createJsonToolResult } from "../results.js";
|
|
4
|
+
import { siteSelectorSchema } from "../tool-schemas.js";
|
|
5
|
+
export function registerLocalEnvironmentCheckTool(server) {
|
|
6
|
+
server.registerTool("local_environment_check", {
|
|
7
|
+
description: "Runs a non-destructive LocalWP environment self-check for this machine, including resolved Local paths and optional WP-CLI/MySQL probes for one site.",
|
|
8
|
+
inputSchema: {
|
|
9
|
+
...siteSelectorSchema,
|
|
10
|
+
probeWpCli: z
|
|
11
|
+
.boolean()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe("When true, run a lightweight 'wp core is-installed' probe."),
|
|
14
|
+
probeMysql: z
|
|
15
|
+
.boolean()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("When true, run a lightweight 'SELECT 1 AS ok' MySQL probe."),
|
|
18
|
+
},
|
|
19
|
+
annotations: {
|
|
20
|
+
readOnlyHint: true,
|
|
21
|
+
},
|
|
22
|
+
}, async ({ siteId, siteName, probeWpCli, probeMysql }) => {
|
|
23
|
+
try {
|
|
24
|
+
const result = await runEnvironmentCheck({ siteId, siteName }, { probeWpCli, probeMysql });
|
|
25
|
+
return createJsonToolResult(result);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return createErrorToolResult(error);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=local-environment-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-environment-check.js","sourceRoot":"","sources":["../../src/tools/local-environment-check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,UAAU,iCAAiC,CAAC,MAAiB;IACjE,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,WAAW,EACT,uJAAuJ;QACzJ,WAAW,EAAE;YACX,GAAG,kBAAkB;YACrB,UAAU,EAAE,CAAC;iBACV,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,4DAA4D,CAAC;YACzE,UAAU,EAAE,CAAC;iBACV,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,4DAA4D,CAAC;SAC1E;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;SACnB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE;QACrD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,EAAE,MAAM,EAAE,QAAQ,EAAE,EACpB,EAAE,UAAU,EAAE,UAAU,EAAE,CAC3B,CAAC;YAEF,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { collectLocalLogs } from "../logs.js";
|
|
3
|
+
import { createErrorToolResult, createJsonToolResult } from "../results.js";
|
|
4
|
+
import { logScopeSchema, siteSelectorSchema } from "../tool-schemas.js";
|
|
5
|
+
export function registerLocalLogsTool(server) {
|
|
6
|
+
server.registerTool("local_logs", {
|
|
7
|
+
description: "Reads recent Local site logs and Local app logs, including WordPress debug.log, PHP, nginx, and Local's own verbose logs.",
|
|
8
|
+
inputSchema: {
|
|
9
|
+
...siteSelectorSchema,
|
|
10
|
+
scope: logScopeSchema,
|
|
11
|
+
lines: z
|
|
12
|
+
.number()
|
|
13
|
+
.int()
|
|
14
|
+
.positive()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("How many lines to read from the end of each log file."),
|
|
17
|
+
},
|
|
18
|
+
annotations: {
|
|
19
|
+
readOnlyHint: true,
|
|
20
|
+
},
|
|
21
|
+
}, async ({ siteId, siteName, scope, lines }) => {
|
|
22
|
+
try {
|
|
23
|
+
const result = await collectLocalLogs({ siteId, siteName }, { scope, lines });
|
|
24
|
+
return createJsonToolResult(result);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return createErrorToolResult(error);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=local-logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-logs.js","sourceRoot":"","sources":["../../src/tools/local-logs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,WAAW,EACT,2HAA2H;QAC7H,WAAW,EAAE;YACX,GAAG,kBAAkB;YACrB,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;SACrE;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;SACnB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,EAAE,MAAM,EAAE,QAAQ,EAAE,EACpB,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YAEF,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { config } from "../config.js";
|
|
2
|
+
import { resolveLocalTooling } from "../local-tooling.js";
|
|
3
|
+
import { buildSiteContext, summarizeSite } from "../local-sites.js";
|
|
4
|
+
import { createErrorToolResult, createJsonToolResult } from "../results.js";
|
|
5
|
+
import { siteSelectorSchema } from "../tool-schemas.js";
|
|
6
|
+
export function registerLocalSiteInfoTool(server) {
|
|
7
|
+
server.registerTool("local_site_info", {
|
|
8
|
+
description: "Resolves one LocalWP site and returns its WordPress, PHP, and MySQL runtime details.",
|
|
9
|
+
inputSchema: {
|
|
10
|
+
...siteSelectorSchema,
|
|
11
|
+
},
|
|
12
|
+
annotations: {
|
|
13
|
+
readOnlyHint: true,
|
|
14
|
+
},
|
|
15
|
+
}, async ({ siteId, siteName }) => {
|
|
16
|
+
try {
|
|
17
|
+
const context = await buildSiteContext({ siteId, siteName });
|
|
18
|
+
const tooling = await resolveLocalTooling();
|
|
19
|
+
return createJsonToolResult({
|
|
20
|
+
site: summarizeSite(context.site),
|
|
21
|
+
platform: config.platform,
|
|
22
|
+
arch: config.arch,
|
|
23
|
+
wpRoot: context.wpRoot,
|
|
24
|
+
runtimeDir: context.runtimeDir,
|
|
25
|
+
wordpressPath: context.wpRoot,
|
|
26
|
+
localAppSupportDir: config.localAppSupportDir,
|
|
27
|
+
localExtraResourcesDirs: config.localExtraResourcesDirs,
|
|
28
|
+
localLightningServicesDirs: config.localLightningServicesDirs,
|
|
29
|
+
mysqlDefaultsFile: context.mysqlDefaultsFile,
|
|
30
|
+
mysqlHost: context.mysqlHost,
|
|
31
|
+
mysqlPort: context.mysqlPort,
|
|
32
|
+
mysqlSocket: context.mysqlSocket,
|
|
33
|
+
mysqlBinary: context.mysql.binaryPath,
|
|
34
|
+
phpBinary: context.php.binaryPath,
|
|
35
|
+
wpCliPhar: tooling.wpCliPhar,
|
|
36
|
+
wpCliConfig: tooling.wpCliConfig,
|
|
37
|
+
selectionMethod: context.selectionMethod,
|
|
38
|
+
accessProfile: config.profile,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return createErrorToolResult(error);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=local-site-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-site-info.js","sourceRoot":"","sources":["../../src/tools/local-site-info.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,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;AAExD,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EACT,sFAAsF;QACxF,WAAW,EAAE;YACX,GAAG,kBAAkB;SACtB;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;SACnB;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC;YAE5C,OAAO,oBAAoB,CAAC;gBAC1B,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;gBACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,aAAa,EAAE,OAAO,CAAC,MAAM;gBAC7B,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;gBAC7C,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;gBACvD,0BAA0B,EAAE,MAAM,CAAC,0BAA0B;gBAC7D,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;gBACrC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;gBACjC,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,aAAa,EAAE,MAAM,CAAC,OAAO;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { buildSiteContext, summarizeSite } from "../local-sites.js";
|
|
4
|
+
import { clampMaxRows, executeMysqlStatement, ensureMysqlReady, getSqlVerb, validateFullAccessSql, } from "../mysql.js";
|
|
5
|
+
import { createErrorToolResult, createJsonToolResult } from "../results.js";
|
|
6
|
+
import { siteSelectorSchema } from "../tool-schemas.js";
|
|
7
|
+
export function registerMysqlExecuteTool(server) {
|
|
8
|
+
server.registerTool("mysql_execute", {
|
|
9
|
+
description: "Runs any single SQL statement against the selected LocalWP site's MySQL database in the 'full-access' profile.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
...siteSelectorSchema,
|
|
12
|
+
sql: z
|
|
13
|
+
.string()
|
|
14
|
+
.min(1)
|
|
15
|
+
.describe("A single SQL statement to execute."),
|
|
16
|
+
maxRows: z
|
|
17
|
+
.number()
|
|
18
|
+
.int()
|
|
19
|
+
.positive()
|
|
20
|
+
.optional()
|
|
21
|
+
.describe("Maximum rows to return if the statement yields a result set."),
|
|
22
|
+
},
|
|
23
|
+
}, async ({ siteId, siteName, sql, maxRows }) => {
|
|
24
|
+
try {
|
|
25
|
+
if (config.profile !== "full-access") {
|
|
26
|
+
throw new Error("mysql_execute requires LOCALWP_MCP_PROFILE=full-access.");
|
|
27
|
+
}
|
|
28
|
+
const context = await buildSiteContext({ siteId, siteName });
|
|
29
|
+
await ensureMysqlReady(context);
|
|
30
|
+
const executableSql = validateFullAccessSql(sql);
|
|
31
|
+
const result = await executeMysqlStatement(context, executableSql, clampMaxRows(maxRows));
|
|
32
|
+
return createJsonToolResult({
|
|
33
|
+
site: summarizeSite(context.site),
|
|
34
|
+
selectionMethod: context.selectionMethod,
|
|
35
|
+
accessProfile: config.profile,
|
|
36
|
+
sql: executableSql,
|
|
37
|
+
statementType: getSqlVerb(executableSql),
|
|
38
|
+
...result,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return createErrorToolResult(error);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=mysql-execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mysql-execute.js","sourceRoot":"","sources":["../../src/tools/mysql-execute.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EAChB,UAAU,EACV,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,WAAW,EACT,gHAAgH;QAClH,WAAW,EAAE;YACX,GAAG,kBAAkB;YACrB,GAAG,EAAE,CAAC;iBACH,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,oCAAoC,CAAC;YACjD,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,EAAE;iBACV,QAAQ,CAAC,8DAA8D,CAAC;SAC5E;KACF,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CACb,yDAAyD,CAC1D,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7D,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAEhC,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,qBAAqB,CACxC,OAAO,EACP,aAAa,EACb,YAAY,CAAC,OAAO,CAAC,CACtB,CAAC;YAEF,OAAO,oBAAoB,CAAC;gBAC1B,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;gBACjC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,aAAa,EAAE,MAAM,CAAC,OAAO;gBAC7B,GAAG,EAAE,aAAa;gBAClB,aAAa,EAAE,UAAU,CAAC,aAAa,CAAC;gBACxC,GAAG,MAAM;aACV,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|