@local-labs-jpollock/local-cli 0.0.1
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/addon-dist/bin/mcp-stdio.js +2808 -0
- package/addon-dist/lib/common/constants.d.ts +22 -0
- package/addon-dist/lib/common/constants.js +26 -0
- package/addon-dist/lib/common/theme.d.ts +68 -0
- package/addon-dist/lib/common/theme.js +126 -0
- package/addon-dist/lib/common/types.d.ts +298 -0
- package/addon-dist/lib/common/types.js +6 -0
- package/addon-dist/lib/main/config/ConnectionInfo.d.ts +25 -0
- package/addon-dist/lib/main/config/ConnectionInfo.js +82 -0
- package/addon-dist/lib/main/index.d.ts +12 -0
- package/addon-dist/lib/main/index.js +3322 -0
- package/addon-dist/lib/main/mcp/McpAuth.d.ts +37 -0
- package/addon-dist/lib/main/mcp/McpAuth.js +87 -0
- package/addon-dist/lib/main/mcp/McpServer.d.ts +67 -0
- package/addon-dist/lib/main/mcp/McpServer.js +343 -0
- package/addon-dist/lib/main/mcp/tools/changePhpVersion.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/changePhpVersion.js +81 -0
- package/addon-dist/lib/main/mcp/tools/cloneSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/cloneSite.js +66 -0
- package/addon-dist/lib/main/mcp/tools/createSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/createSite.js +137 -0
- package/addon-dist/lib/main/mcp/tools/deleteSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/deleteSite.js +72 -0
- package/addon-dist/lib/main/mcp/tools/exportDatabase.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/exportDatabase.js +72 -0
- package/addon-dist/lib/main/mcp/tools/exportSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/exportSite.js +103 -0
- package/addon-dist/lib/main/mcp/tools/getLocalInfo.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/getLocalInfo.js +72 -0
- package/addon-dist/lib/main/mcp/tools/getSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/getSite.js +68 -0
- package/addon-dist/lib/main/mcp/tools/getSiteLogs.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/getSiteLogs.js +149 -0
- package/addon-dist/lib/main/mcp/tools/helpers.d.ts +59 -0
- package/addon-dist/lib/main/mcp/tools/helpers.js +179 -0
- package/addon-dist/lib/main/mcp/tools/importDatabase.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/importDatabase.js +109 -0
- package/addon-dist/lib/main/mcp/tools/importSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/importSite.js +149 -0
- package/addon-dist/lib/main/mcp/tools/index.d.ts +26 -0
- package/addon-dist/lib/main/mcp/tools/index.js +117 -0
- package/addon-dist/lib/main/mcp/tools/listBlueprints.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/listBlueprints.js +54 -0
- package/addon-dist/lib/main/mcp/tools/listServices.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/listServices.js +112 -0
- package/addon-dist/lib/main/mcp/tools/listSites.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/listSites.js +62 -0
- package/addon-dist/lib/main/mcp/tools/openAdminer.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/openAdminer.js +59 -0
- package/addon-dist/lib/main/mcp/tools/openSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/openSite.js +62 -0
- package/addon-dist/lib/main/mcp/tools/renameSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/renameSite.js +70 -0
- package/addon-dist/lib/main/mcp/tools/restartSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/restartSite.js +56 -0
- package/addon-dist/lib/main/mcp/tools/saveBlueprint.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/saveBlueprint.js +89 -0
- package/addon-dist/lib/main/mcp/tools/startSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/startSite.js +54 -0
- package/addon-dist/lib/main/mcp/tools/stopSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/stopSite.js +54 -0
- package/addon-dist/lib/main/mcp/tools/toggleXdebug.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/toggleXdebug.js +69 -0
- package/addon-dist/lib/main/mcp/tools/trustSsl.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/trustSsl.js +59 -0
- package/addon-dist/lib/main/mcp/tools/wpCli.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/wpCli.js +110 -0
- package/addon-dist/lib/main.d.ts +1 -0
- package/addon-dist/lib/main.js +10 -0
- package/addon-dist/lib/renderer/index.d.ts +7 -0
- package/addon-dist/lib/renderer/index.js +479 -0
- package/addon-dist/package.json +73 -0
- package/bin/lwp.js +10 -0
- package/lib/bootstrap/index.d.ts +98 -0
- package/lib/bootstrap/index.js +493 -0
- package/lib/bootstrap/paths.d.ts +28 -0
- package/lib/bootstrap/paths.js +96 -0
- package/lib/client/GraphQLClient.d.ts +38 -0
- package/lib/client/GraphQLClient.js +71 -0
- package/lib/client/index.d.ts +4 -0
- package/lib/client/index.js +10 -0
- package/lib/formatters/index.d.ts +75 -0
- package/lib/formatters/index.js +139 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +1173 -0
- package/package.json +72 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_local_info Tool
|
|
3
|
+
* Get information about the Local application
|
|
4
|
+
*/
|
|
5
|
+
import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
|
|
6
|
+
export declare const getLocalInfoDefinition: McpToolDefinition;
|
|
7
|
+
export declare function getLocalInfo(_args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* get_local_info Tool
|
|
4
|
+
* Get information about the Local application
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.getLocalInfoDefinition = void 0;
|
|
11
|
+
exports.getLocalInfo = getLocalInfo;
|
|
12
|
+
const os_1 = __importDefault(require("os"));
|
|
13
|
+
const constants_1 = require("../../../common/constants");
|
|
14
|
+
const index_1 = require("./index");
|
|
15
|
+
exports.getLocalInfoDefinition = {
|
|
16
|
+
name: 'get_local_info',
|
|
17
|
+
description: 'Get information about the Local application including version, platform, MCP server status, and available tools',
|
|
18
|
+
inputSchema: {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {},
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
async function getLocalInfo(_args, services) {
|
|
24
|
+
try {
|
|
25
|
+
const sitesMap = services.siteData.getSites();
|
|
26
|
+
const allSites = Object.values(sitesMap);
|
|
27
|
+
// Count sites by status
|
|
28
|
+
let runningSites = 0;
|
|
29
|
+
let stoppedSites = 0;
|
|
30
|
+
for (const site of allSites) {
|
|
31
|
+
const status = await services.siteProcessManager.getSiteStatus(site);
|
|
32
|
+
if (status === 'running') {
|
|
33
|
+
runningSites++;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
stoppedSites++;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const info = {
|
|
40
|
+
local: {
|
|
41
|
+
version: process.env.LOCAL_VERSION || 'unknown',
|
|
42
|
+
platform: os_1.default.platform(),
|
|
43
|
+
arch: os_1.default.arch(),
|
|
44
|
+
},
|
|
45
|
+
mcp: {
|
|
46
|
+
version: constants_1.MCP_SERVER.VERSION,
|
|
47
|
+
name: constants_1.MCP_SERVER.NAME,
|
|
48
|
+
tools: (0, index_1.getToolNames)(),
|
|
49
|
+
},
|
|
50
|
+
sites: {
|
|
51
|
+
total: allSites.length,
|
|
52
|
+
running: runningSites,
|
|
53
|
+
stopped: stoppedSites,
|
|
54
|
+
},
|
|
55
|
+
system: {
|
|
56
|
+
nodeVersion: process.version,
|
|
57
|
+
hostname: os_1.default.hostname(),
|
|
58
|
+
homeDir: os_1.default.homedir(),
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
content: [{ type: 'text', text: JSON.stringify(info, null, 2) }],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return {
|
|
67
|
+
content: [{ type: 'text', text: `Failed to get Local info: ${error.message}` }],
|
|
68
|
+
isError: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0TG9jYWxJbmZvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21haW4vbWNwL3Rvb2xzL2dldExvY2FsSW5mby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7QUFpQkgsb0NBb0RDO0FBbkVELDRDQUFvQjtBQUVwQix5REFBdUQ7QUFDdkQsbUNBQXVDO0FBRTFCLFFBQUEsc0JBQXNCLEdBQXNCO0lBQ3ZELElBQUksRUFBRSxnQkFBZ0I7SUFDdEIsV0FBVyxFQUNULGlIQUFpSDtJQUNuSCxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRSxFQUFFO0tBQ2Y7Q0FDRixDQUFDO0FBRUssS0FBSyxVQUFVLFlBQVksQ0FDaEMsS0FBOEIsRUFDOUIsUUFBdUI7SUFFdkIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBVSxDQUFDO1FBRWxELHdCQUF3QjtRQUN4QixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7WUFDNUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JFLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QixZQUFZLEVBQUUsQ0FBQztZQUNqQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sWUFBWSxFQUFFLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLElBQUksR0FBRztZQUNYLEtBQUssRUFBRTtnQkFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksU0FBUztnQkFDL0MsUUFBUSxFQUFFLFlBQUUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZCLElBQUksRUFBRSxZQUFFLENBQUMsSUFBSSxFQUFFO2FBQ2hCO1lBQ0QsR0FBRyxFQUFFO2dCQUNILE9BQU8sRUFBRSxzQkFBVSxDQUFDLE9BQU87Z0JBQzNCLElBQUksRUFBRSxzQkFBVSxDQUFDLElBQUk7Z0JBQ3JCLEtBQUssRUFBRSxJQUFBLG9CQUFZLEdBQUU7YUFDdEI7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNO2dCQUN0QixPQUFPLEVBQUUsWUFBWTtnQkFDckIsT0FBTyxFQUFFLFlBQVk7YUFDdEI7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sV0FBVyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2dCQUM1QixRQUFRLEVBQUUsWUFBRSxDQUFDLFFBQVEsRUFBRTtnQkFDdkIsT0FBTyxFQUFFLFlBQUUsQ0FBQyxPQUFPLEVBQUU7YUFDdEI7U0FDRixDQUFDO1FBRUYsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDakUsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLDZCQUE2QixLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUMvRSxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZ2V0X2xvY2FsX2luZm8gVG9vbFxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBMb2NhbCBhcHBsaWNhdGlvblxuICovXG5cbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgeyBNY3BUb29sRGVmaW5pdGlvbiwgTWNwVG9vbFJlc3VsdCwgTG9jYWxTZXJ2aWNlcyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBNQ1BfU0VSVkVSIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRUb29sTmFtZXMgfSBmcm9tICcuL2luZGV4JztcblxuZXhwb3J0IGNvbnN0IGdldExvY2FsSW5mb0RlZmluaXRpb246IE1jcFRvb2xEZWZpbml0aW9uID0ge1xuICBuYW1lOiAnZ2V0X2xvY2FsX2luZm8nLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBMb2NhbCBhcHBsaWNhdGlvbiBpbmNsdWRpbmcgdmVyc2lvbiwgcGxhdGZvcm0sIE1DUCBzZXJ2ZXIgc3RhdHVzLCBhbmQgYXZhaWxhYmxlIHRvb2xzJyxcbiAgaW5wdXRTY2hlbWE6IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMb2NhbEluZm8oXG4gIF9hcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2VydmljZXM6IExvY2FsU2VydmljZXNcbik6IFByb21pc2U8TWNwVG9vbFJlc3VsdD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNpdGVzTWFwID0gc2VydmljZXMuc2l0ZURhdGEuZ2V0U2l0ZXMoKTtcbiAgICBjb25zdCBhbGxTaXRlcyA9IE9iamVjdC52YWx1ZXMoc2l0ZXNNYXApIGFzIGFueVtdO1xuXG4gICAgLy8gQ291bnQgc2l0ZXMgYnkgc3RhdHVzXG4gICAgbGV0IHJ1bm5pbmdTaXRlcyA9IDA7XG4gICAgbGV0IHN0b3BwZWRTaXRlcyA9IDA7XG4gICAgZm9yIChjb25zdCBzaXRlIG9mIGFsbFNpdGVzKSB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzZXJ2aWNlcy5zaXRlUHJvY2Vzc01hbmFnZXIuZ2V0U2l0ZVN0YXR1cyhzaXRlKTtcbiAgICAgIGlmIChzdGF0dXMgPT09ICdydW5uaW5nJykge1xuICAgICAgICBydW5uaW5nU2l0ZXMrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0b3BwZWRTaXRlcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluZm8gPSB7XG4gICAgICBsb2NhbDoge1xuICAgICAgICB2ZXJzaW9uOiBwcm9jZXNzLmVudi5MT0NBTF9WRVJTSU9OIHx8ICd1bmtub3duJyxcbiAgICAgICAgcGxhdGZvcm06IG9zLnBsYXRmb3JtKCksXG4gICAgICAgIGFyY2g6IG9zLmFyY2goKSxcbiAgICAgIH0sXG4gICAgICBtY3A6IHtcbiAgICAgICAgdmVyc2lvbjogTUNQX1NFUlZFUi5WRVJTSU9OLFxuICAgICAgICBuYW1lOiBNQ1BfU0VSVkVSLk5BTUUsXG4gICAgICAgIHRvb2xzOiBnZXRUb29sTmFtZXMoKSxcbiAgICAgIH0sXG4gICAgICBzaXRlczoge1xuICAgICAgICB0b3RhbDogYWxsU2l0ZXMubGVuZ3RoLFxuICAgICAgICBydW5uaW5nOiBydW5uaW5nU2l0ZXMsXG4gICAgICAgIHN0b3BwZWQ6IHN0b3BwZWRTaXRlcyxcbiAgICAgIH0sXG4gICAgICBzeXN0ZW06IHtcbiAgICAgICAgbm9kZVZlcnNpb246IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgaG9zdG5hbWU6IG9zLmhvc3RuYW1lKCksXG4gICAgICAgIGhvbWVEaXI6IG9zLmhvbWVkaXIoKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IEpTT04uc3RyaW5naWZ5KGluZm8sIG51bGwsIDIpIH1dLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiBgRmFpbGVkIHRvIGdldCBMb2NhbCBpbmZvOiAke2Vycm9yLm1lc3NhZ2V9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_site Tool
|
|
3
|
+
* Get detailed information about a specific site
|
|
4
|
+
*/
|
|
5
|
+
import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
|
|
6
|
+
export declare const getSiteDefinition: McpToolDefinition;
|
|
7
|
+
export declare function getSite(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* get_site Tool
|
|
4
|
+
* Get detailed information about a specific site
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getSiteDefinition = void 0;
|
|
8
|
+
exports.getSite = getSite;
|
|
9
|
+
const helpers_1 = require("./helpers");
|
|
10
|
+
exports.getSiteDefinition = {
|
|
11
|
+
name: 'get_site',
|
|
12
|
+
description: 'Get detailed information about a WordPress site including PHP version, web server, database, and WordPress version',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
site: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: 'Site name or ID (partial names work)',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
required: ['site'],
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
async function getSite(args, services) {
|
|
25
|
+
const { site: siteQuery } = args;
|
|
26
|
+
// Validate required parameter
|
|
27
|
+
const paramError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
|
|
28
|
+
if (paramError)
|
|
29
|
+
return paramError;
|
|
30
|
+
// Find site or return error
|
|
31
|
+
const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
|
|
32
|
+
if ('error' in siteResult)
|
|
33
|
+
return siteResult.error;
|
|
34
|
+
const { site } = siteResult;
|
|
35
|
+
try {
|
|
36
|
+
const currentStatus = await services.siteProcessManager.getSiteStatus(site);
|
|
37
|
+
const siteInfo = {
|
|
38
|
+
id: site.id,
|
|
39
|
+
name: site.name,
|
|
40
|
+
status: currentStatus,
|
|
41
|
+
domain: site.domain,
|
|
42
|
+
path: site.path,
|
|
43
|
+
url: `https://${site.domain}`,
|
|
44
|
+
adminUrl: `https://${site.domain}/wp-admin`,
|
|
45
|
+
environment: site.environment,
|
|
46
|
+
services: {
|
|
47
|
+
php: site.phpVersion || site.services?.php?.version,
|
|
48
|
+
webServer: site.webServer || site.services?.nginx?.version || site.services?.apache?.version,
|
|
49
|
+
database: site.mysql || site.services?.mysql?.version,
|
|
50
|
+
},
|
|
51
|
+
wordpress: {
|
|
52
|
+
version: site.wordPressVersion,
|
|
53
|
+
multisite: site.multisite || false,
|
|
54
|
+
},
|
|
55
|
+
hostConnections: site.hostConnections || [],
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
content: [{ type: 'text', text: JSON.stringify(siteInfo, null, 2) }],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return {
|
|
63
|
+
content: [{ type: 'text', text: `Failed to get site info: ${error.message}` }],
|
|
64
|
+
isError: true,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U2l0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9nZXRTaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQXlCSCwwQkFpREM7QUF2RUQsdUNBQW1FO0FBRXRELFFBQUEsaUJBQWlCLEdBQXNCO0lBQ2xELElBQUksRUFBRSxVQUFVO0lBQ2hCLFdBQVcsRUFDVCxvSEFBb0g7SUFDdEgsV0FBVyxFQUFFO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLHNDQUFzQzthQUNwRDtTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDO0tBQ25CO0NBQ0YsQ0FBQztBQU1LLEtBQUssVUFBVSxPQUFPLENBQzNCLElBQTZCLEVBQzdCLFFBQXVCO0lBRXZCLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBOEIsQ0FBQztJQUUzRCw4QkFBOEI7SUFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBQSwrQkFBcUIsRUFBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUQsSUFBSSxVQUFVO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFFbEMsNEJBQTRCO0lBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUEseUJBQWUsRUFBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLElBQUksT0FBTyxJQUFJLFVBQVU7UUFBRSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDbkQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQztJQUU1QixJQUFJLENBQUM7UUFDSCxNQUFNLGFBQWEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUUsTUFBTSxRQUFRLEdBQUc7WUFDZixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixNQUFNLEVBQUUsYUFBYTtZQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsR0FBRyxFQUFFLFdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM3QixRQUFRLEVBQUUsV0FBVyxJQUFJLENBQUMsTUFBTSxXQUFXO1lBQzNDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixRQUFRLEVBQUU7Z0JBQ1IsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsT0FBTztnQkFDbkQsU0FBUyxFQUNQLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU87Z0JBQ25GLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU87YUFDdEQ7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQzlCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUs7YUFDbkM7WUFDRCxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsSUFBSSxFQUFFO1NBQzVDLENBQUM7UUFFRixPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNyRSxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzlFLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBnZXRfc2l0ZSBUb29sXG4gKiBHZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBzaXRlXG4gKi9cblxuaW1wb3J0IHsgTWNwVG9vbERlZmluaXRpb24sIE1jcFRvb2xSZXN1bHQsIExvY2FsU2VydmljZXMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVSZXF1aXJlZFBhcmFtLCBmaW5kU2l0ZU9yRXJyb3IgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgZ2V0U2l0ZURlZmluaXRpb246IE1jcFRvb2xEZWZpbml0aW9uID0ge1xuICBuYW1lOiAnZ2V0X3NpdGUnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnR2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgV29yZFByZXNzIHNpdGUgaW5jbHVkaW5nIFBIUCB2ZXJzaW9uLCB3ZWIgc2VydmVyLCBkYXRhYmFzZSwgYW5kIFdvcmRQcmVzcyB2ZXJzaW9uJyxcbiAgaW5wdXRTY2hlbWE6IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBzaXRlOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1NpdGUgbmFtZSBvciBJRCAocGFydGlhbCBuYW1lcyB3b3JrKScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFsnc2l0ZSddLFxuICB9LFxufTtcblxuaW50ZXJmYWNlIEdldFNpdGVBcmdzIHtcbiAgc2l0ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2l0ZShcbiAgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNlcnZpY2VzOiBMb2NhbFNlcnZpY2VzXG4pOiBQcm9taXNlPE1jcFRvb2xSZXN1bHQ+IHtcbiAgY29uc3QgeyBzaXRlOiBzaXRlUXVlcnkgfSA9IGFyZ3MgYXMgdW5rbm93biBhcyBHZXRTaXRlQXJncztcblxuICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBwYXJhbWV0ZXJcbiAgY29uc3QgcGFyYW1FcnJvciA9IHZhbGlkYXRlUmVxdWlyZWRQYXJhbShzaXRlUXVlcnksICdzaXRlJyk7XG4gIGlmIChwYXJhbUVycm9yKSByZXR1cm4gcGFyYW1FcnJvcjtcblxuICAvLyBGaW5kIHNpdGUgb3IgcmV0dXJuIGVycm9yXG4gIGNvbnN0IHNpdGVSZXN1bHQgPSBmaW5kU2l0ZU9yRXJyb3Ioc2l0ZVF1ZXJ5LCBzZXJ2aWNlcy5zaXRlRGF0YSk7XG4gIGlmICgnZXJyb3InIGluIHNpdGVSZXN1bHQpIHJldHVybiBzaXRlUmVzdWx0LmVycm9yO1xuICBjb25zdCB7IHNpdGUgfSA9IHNpdGVSZXN1bHQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdHVzID0gYXdhaXQgc2VydmljZXMuc2l0ZVByb2Nlc3NNYW5hZ2VyLmdldFNpdGVTdGF0dXMoc2l0ZSk7XG5cbiAgICBjb25zdCBzaXRlSW5mbyA9IHtcbiAgICAgIGlkOiBzaXRlLmlkLFxuICAgICAgbmFtZTogc2l0ZS5uYW1lLFxuICAgICAgc3RhdHVzOiBjdXJyZW50U3RhdHVzLFxuICAgICAgZG9tYWluOiBzaXRlLmRvbWFpbixcbiAgICAgIHBhdGg6IHNpdGUucGF0aCxcbiAgICAgIHVybDogYGh0dHBzOi8vJHtzaXRlLmRvbWFpbn1gLFxuICAgICAgYWRtaW5Vcmw6IGBodHRwczovLyR7c2l0ZS5kb21haW59L3dwLWFkbWluYCxcbiAgICAgIGVudmlyb25tZW50OiBzaXRlLmVudmlyb25tZW50LFxuICAgICAgc2VydmljZXM6IHtcbiAgICAgICAgcGhwOiBzaXRlLnBocFZlcnNpb24gfHwgc2l0ZS5zZXJ2aWNlcz8ucGhwPy52ZXJzaW9uLFxuICAgICAgICB3ZWJTZXJ2ZXI6XG4gICAgICAgICAgc2l0ZS53ZWJTZXJ2ZXIgfHwgc2l0ZS5zZXJ2aWNlcz8ubmdpbng/LnZlcnNpb24gfHwgc2l0ZS5zZXJ2aWNlcz8uYXBhY2hlPy52ZXJzaW9uLFxuICAgICAgICBkYXRhYmFzZTogc2l0ZS5teXNxbCB8fCBzaXRlLnNlcnZpY2VzPy5teXNxbD8udmVyc2lvbixcbiAgICAgIH0sXG4gICAgICB3b3JkcHJlc3M6IHtcbiAgICAgICAgdmVyc2lvbjogc2l0ZS53b3JkUHJlc3NWZXJzaW9uLFxuICAgICAgICBtdWx0aXNpdGU6IHNpdGUubXVsdGlzaXRlIHx8IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGhvc3RDb25uZWN0aW9uczogc2l0ZS5ob3N0Q29ubmVjdGlvbnMgfHwgW10sXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IEpTT04uc3RyaW5naWZ5KHNpdGVJbmZvLCBudWxsLCAyKSB9XSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYEZhaWxlZCB0byBnZXQgc2l0ZSBpbmZvOiAke2Vycm9yLm1lc3NhZ2V9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_site_logs Tool
|
|
3
|
+
* Retrieve log files for a site
|
|
4
|
+
*/
|
|
5
|
+
import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
|
|
6
|
+
export declare const getSiteLogsDefinition: McpToolDefinition;
|
|
7
|
+
export declare function getSiteLogs(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* get_site_logs Tool
|
|
4
|
+
* Retrieve log files for a site
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.getSiteLogsDefinition = void 0;
|
|
41
|
+
exports.getSiteLogs = getSiteLogs;
|
|
42
|
+
const helpers_1 = require("./helpers");
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
exports.getSiteLogsDefinition = {
|
|
46
|
+
name: 'get_site_logs',
|
|
47
|
+
description: 'Get log file contents for a site (PHP errors, access logs, etc.)',
|
|
48
|
+
inputSchema: {
|
|
49
|
+
type: 'object',
|
|
50
|
+
properties: {
|
|
51
|
+
site: {
|
|
52
|
+
type: 'string',
|
|
53
|
+
description: 'Site name or ID',
|
|
54
|
+
},
|
|
55
|
+
logType: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
enum: ['php', 'nginx', 'mysql', 'all'],
|
|
58
|
+
description: 'Type of logs to retrieve (default: php)',
|
|
59
|
+
},
|
|
60
|
+
lines: {
|
|
61
|
+
type: 'number',
|
|
62
|
+
description: 'Number of lines to return from end of log (default: 100)',
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
required: ['site'],
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
function readLastLines(filePath, numLines) {
|
|
69
|
+
try {
|
|
70
|
+
if (!fs.existsSync(filePath)) {
|
|
71
|
+
return `[Log file not found: ${path.basename(filePath)}]`;
|
|
72
|
+
}
|
|
73
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
74
|
+
const lines = content.split('\n');
|
|
75
|
+
const lastLines = lines.slice(-numLines).join('\n');
|
|
76
|
+
return lastLines || '[Log file is empty]';
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
return `[Error reading log: ${error.message}]`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function findLogFiles(logsDir, serviceType) {
|
|
83
|
+
const servicePath = path.join(logsDir, serviceType);
|
|
84
|
+
const logFiles = [];
|
|
85
|
+
try {
|
|
86
|
+
if (fs.existsSync(servicePath) && fs.statSync(servicePath).isDirectory()) {
|
|
87
|
+
const files = fs.readdirSync(servicePath);
|
|
88
|
+
for (const file of files) {
|
|
89
|
+
if (file.endsWith('.log')) {
|
|
90
|
+
logFiles.push(path.join(servicePath, file));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Directory doesn't exist or can't be read
|
|
97
|
+
}
|
|
98
|
+
return logFiles;
|
|
99
|
+
}
|
|
100
|
+
async function getSiteLogs(args, services) {
|
|
101
|
+
const { site: siteQuery, logType = 'php', lines = 100 } = args;
|
|
102
|
+
const paramError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
|
|
103
|
+
if (paramError)
|
|
104
|
+
return paramError;
|
|
105
|
+
const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
|
|
106
|
+
if ('error' in siteResult)
|
|
107
|
+
return siteResult.error;
|
|
108
|
+
const { site } = siteResult;
|
|
109
|
+
try {
|
|
110
|
+
// Get logs directory from site paths
|
|
111
|
+
const logsDir = site.paths?.logs || path.join(site.path, 'logs');
|
|
112
|
+
if (!fs.existsSync(logsDir)) {
|
|
113
|
+
return {
|
|
114
|
+
content: [{ type: 'text', text: `Logs directory not found: ${logsDir}` }],
|
|
115
|
+
isError: true,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
const results = [];
|
|
119
|
+
const numLines = Math.min(Math.max(lines, 10), 1000); // Clamp between 10 and 1000
|
|
120
|
+
const serviceTypes = logType === 'all' ? ['php', 'nginx', 'mysql'] : [logType];
|
|
121
|
+
for (const serviceType of serviceTypes) {
|
|
122
|
+
const logFiles = findLogFiles(logsDir, serviceType);
|
|
123
|
+
if (logFiles.length === 0) {
|
|
124
|
+
results.push(`=== ${serviceType.toUpperCase()} ===\n[No log files found]`);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
for (const logFile of logFiles) {
|
|
128
|
+
const fileName = path.basename(logFile);
|
|
129
|
+
const content = readLastLines(logFile, numLines);
|
|
130
|
+
results.push(`=== ${serviceType.toUpperCase()}: ${fileName} ===\n${content}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
content: [
|
|
135
|
+
{
|
|
136
|
+
type: 'text',
|
|
137
|
+
text: `Logs for "${site.name}" (last ${numLines} lines):\n\n${results.join('\n\n')}`,
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
return {
|
|
144
|
+
content: [{ type: 'text', text: `Failed to get site logs: ${error.message}` }],
|
|
145
|
+
isError: true,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U2l0ZUxvZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbWFpbi9tY3AvdG9vbHMvZ2V0U2l0ZUxvZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0VILGtDQTBEQztBQS9IRCx1Q0FBbUU7QUFDbkUsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUVoQixRQUFBLHFCQUFxQixHQUFzQjtJQUN0RCxJQUFJLEVBQUUsZUFBZTtJQUNyQixXQUFXLEVBQUUsa0VBQWtFO0lBQy9FLFdBQVcsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxpQkFBaUI7YUFDL0I7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDO2dCQUN0QyxXQUFXLEVBQUUseUNBQXlDO2FBQ3ZEO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSwwREFBMEQ7YUFDeEU7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQztLQUNuQjtDQUNGLENBQUM7QUFRRixTQUFTLGFBQWEsQ0FBQyxRQUFnQixFQUFFLFFBQWdCO0lBQ3ZELElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyx3QkFBd0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQzVELENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMs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Q0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZ2V0X3NpdGVfbG9ncyBUb29sXG4gKiBSZXRyaWV2ZSBsb2cgZmlsZXMgZm9yIGEgc2l0ZVxuICovXG5cbmltcG9ydCB7IE1jcFRvb2xEZWZpbml0aW9uLCBNY3BUb29sUmVzdWx0LCBMb2NhbFNlcnZpY2VzIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHZhbGlkYXRlUmVxdWlyZWRQYXJhbSwgZmluZFNpdGVPckVycm9yIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBjb25zdCBnZXRTaXRlTG9nc0RlZmluaXRpb246IE1jcFRvb2xEZWZpbml0aW9uID0ge1xuICBuYW1lOiAnZ2V0X3NpdGVfbG9ncycsXG4gIGRlc2NyaXB0aW9uOiAnR2V0IGxvZyBmaWxlIGNvbnRlbnRzIGZvciBhIHNpdGUgKFBIUCBlcnJvcnMsIGFjY2VzcyBsb2dzLCBldGMuKScsXG4gIGlucHV0U2NoZW1hOiB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc2l0ZToge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdTaXRlIG5hbWUgb3IgSUQnLFxuICAgICAgfSxcbiAgICAgIGxvZ1R5cGU6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGVudW06IFsncGhwJywgJ25naW54JywgJ215c3FsJywgJ2FsbCddLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1R5cGUgb2YgbG9ncyB0byByZXRyaWV2ZSAoZGVmYXVsdDogcGhwKScsXG4gICAgICB9LFxuICAgICAgbGluZXM6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGxpbmVzIHRvIHJldHVybiBmcm9tIGVuZCBvZiBsb2cgKGRlZmF1bHQ6IDEwMCknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ3NpdGUnXSxcbiAgfSxcbn07XG5cbmludGVyZmFjZSBHZXRTaXRlTG9nc0FyZ3Mge1xuICBzaXRlOiBzdHJpbmc7XG4gIGxvZ1R5cGU/OiAncGhwJyB8ICduZ2lueCcgfCAnbXlzcWwnIHwgJ2FsbCc7XG4gIGxpbmVzPzogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiByZWFkTGFzdExpbmVzKGZpbGVQYXRoOiBzdHJpbmcsIG51bUxpbmVzOiBudW1iZXIpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBgW0xvZyBmaWxlIG5vdCBmb3VuZDogJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX1dYDtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IGxhc3RMaW5lcyA9IGxpbmVzLnNsaWNlKC1udW1MaW5lcykuam9pbignXFxuJyk7XG4gICAgcmV0dXJuIGxhc3RMaW5lcyB8fCAnW0xvZyBmaWxlIGlzIGVtcHR5XSc7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICByZXR1cm4gYFtFcnJvciByZWFkaW5nIGxvZzogJHtlcnJvci5tZXNzYWdlfV1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRMb2dGaWxlcyhsb2dzRGlyOiBzdHJpbmcsIHNlcnZpY2VUeXBlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlcnZpY2VQYXRoID0gcGF0aC5qb2luKGxvZ3NEaXIsIHNlcnZpY2VUeXBlKTtcbiAgY29uc3QgbG9nRmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzZXJ2aWNlUGF0aCkgJiYgZnMuc3RhdFN5bmMoc2VydmljZVBhdGgpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoc2VydmljZVBhdGgpO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmIChmaWxlLmVuZHNXaXRoKCcubG9nJykpIHtcbiAgICAgICAgICBsb2dGaWxlcy5wdXNoKHBhdGguam9pbihzZXJ2aWNlUGF0aCwgZmlsZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBEaXJlY3RvcnkgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSByZWFkXG4gIH1cblxuICByZXR1cm4gbG9nRmlsZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTaXRlTG9ncyhcbiAgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNlcnZpY2VzOiBMb2NhbFNlcnZpY2VzXG4pOiBQcm9taXNlPE1jcFRvb2xSZXN1bHQ+IHtcbiAgY29uc3QgeyBzaXRlOiBzaXRlUXVlcnksIGxvZ1R5cGUgPSAncGhwJywgbGluZXMgPSAxMDAgfSA9IGFyZ3MgYXMgdW5rbm93biBhcyBHZXRTaXRlTG9nc0FyZ3M7XG5cbiAgY29uc3QgcGFyYW1FcnJvciA9IHZhbGlkYXRlUmVxdWlyZWRQYXJhbShzaXRlUXVlcnksICdzaXRlJyk7XG4gIGlmIChwYXJhbUVycm9yKSByZXR1cm4gcGFyYW1FcnJvcjtcblxuICBjb25zdCBzaXRlUmVzdWx0ID0gZmluZFNpdGVPckVycm9yKHNpdGVRdWVyeSwgc2VydmljZXMuc2l0ZURhdGEpO1xuICBpZiAoJ2Vycm9yJyBpbiBzaXRlUmVzdWx0KSByZXR1cm4gc2l0ZVJlc3VsdC5lcnJvcjtcbiAgY29uc3QgeyBzaXRlIH0gPSBzaXRlUmVzdWx0O1xuXG4gIHRyeSB7XG4gICAgLy8gR2V0IGxvZ3MgZGlyZWN0b3J5IGZyb20gc2l0ZSBwYXRoc1xuICAgIGNvbnN0IGxvZ3NEaXIgPSBzaXRlLnBhdGhzPy5sb2dzIHx8IHBhdGguam9pbihzaXRlLnBhdGgsICdsb2dzJyk7XG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMobG9nc0RpcikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYExvZ3MgZGlyZWN0b3J5IG5vdCBmb3VuZDogJHtsb2dzRGlyfWAgfV0sXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbnVtTGluZXMgPSBNYXRoLm1pbihNYXRoLm1heChsaW5lcywgMTApLCAxMDAwKTsgLy8gQ2xhbXAgYmV0d2VlbiAxMCBhbmQgMTAwMFxuXG4gICAgY29uc3Qgc2VydmljZVR5cGVzID0gbG9nVHlwZSA9PT0gJ2FsbCcgPyBbJ3BocCcsICduZ2lueCcsICdteXNxbCddIDogW2xvZ1R5cGVdO1xuXG4gICAgZm9yIChjb25zdCBzZXJ2aWNlVHlwZSBvZiBzZXJ2aWNlVHlwZXMpIHtcbiAgICAgIGNvbnN0IGxvZ0ZpbGVzID0gZmluZExvZ0ZpbGVzKGxvZ3NEaXIsIHNlcnZpY2VUeXBlKTtcblxuICAgICAgaWYgKGxvZ0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXN1bHRzLnB1c2goYD09PSAke3NlcnZpY2VUeXBlLnRvVXBwZXJDYXNlKCl9ID09PVxcbltObyBsb2cgZmlsZXMgZm91bmRdYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxvZ0ZpbGUgb2YgbG9nRmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGxvZ0ZpbGUpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gcmVhZExhc3RMaW5lcyhsb2dGaWxlLCBudW1MaW5lcyk7XG4gICAgICAgIHJlc3VsdHMucHVzaChgPT09ICR7c2VydmljZVR5cGUudG9VcHBlckNhc2UoKX06ICR7ZmlsZU5hbWV9ID09PVxcbiR7Y29udGVudH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIHRleHQ6IGBMb2dzIGZvciBcIiR7c2l0ZS5uYW1lfVwiIChsYXN0ICR7bnVtTGluZXN9IGxpbmVzKTpcXG5cXG4ke3Jlc3VsdHMuam9pbignXFxuXFxuJyl9YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IGBGYWlsZWQgdG8gZ2V0IHNpdGUgbG9nczogJHtlcnJvci5tZXNzYWdlfWAgfV0sXG4gICAgICBpc0Vycm9yOiB0cnVlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Helper Functions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Blocked WP-CLI commands that could allow arbitrary code execution
|
|
6
|
+
*/
|
|
7
|
+
export declare const BLOCKED_WP_COMMANDS: string[];
|
|
8
|
+
/**
|
|
9
|
+
* Check if a WP-CLI command is blocked for security reasons
|
|
10
|
+
* Returns the blocked command name if blocked, null if safe
|
|
11
|
+
*/
|
|
12
|
+
export declare function isBlockedWpCommand(command: string[]): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Validate that a file path is safe (no path traversal)
|
|
15
|
+
* Returns true if the path is within allowed directories
|
|
16
|
+
*/
|
|
17
|
+
export declare function isValidFilePath(filePath: string, allowedDirs?: string[]): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Validate that a SQL file path is safe
|
|
20
|
+
* Must end in .sql and be in an allowed directory
|
|
21
|
+
*/
|
|
22
|
+
export declare function isValidSqlPath(sqlPath: unknown): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* MCP Tool Result type for error responses
|
|
25
|
+
*/
|
|
26
|
+
export interface McpErrorResult {
|
|
27
|
+
content: Array<{
|
|
28
|
+
type: 'text';
|
|
29
|
+
text: string;
|
|
30
|
+
}>;
|
|
31
|
+
isError: true;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create a standardized error result for MCP tools
|
|
35
|
+
*/
|
|
36
|
+
export declare function createErrorResult(message: string): McpErrorResult;
|
|
37
|
+
/**
|
|
38
|
+
* Validate that a required parameter is present
|
|
39
|
+
* Returns an error result if missing, null if valid
|
|
40
|
+
*/
|
|
41
|
+
export declare function validateRequiredParam(value: unknown, paramName: string): McpErrorResult | null;
|
|
42
|
+
/**
|
|
43
|
+
* Find a site by name or ID
|
|
44
|
+
* Supports partial name matching (case-insensitive)
|
|
45
|
+
*/
|
|
46
|
+
export declare function findSite(query: string, siteData: any): any | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Get all site names as a comma-separated string
|
|
49
|
+
*/
|
|
50
|
+
export declare function getAllSiteNames(siteData: any): string;
|
|
51
|
+
/**
|
|
52
|
+
* Find a site or return an error result
|
|
53
|
+
* Combines site lookup with standardized error handling
|
|
54
|
+
*/
|
|
55
|
+
export declare function findSiteOrError(query: string, siteData: any): {
|
|
56
|
+
site: any;
|
|
57
|
+
} | {
|
|
58
|
+
error: McpErrorResult;
|
|
59
|
+
};
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tool Helper Functions
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.BLOCKED_WP_COMMANDS = void 0;
|
|
40
|
+
exports.isBlockedWpCommand = isBlockedWpCommand;
|
|
41
|
+
exports.isValidFilePath = isValidFilePath;
|
|
42
|
+
exports.isValidSqlPath = isValidSqlPath;
|
|
43
|
+
exports.createErrorResult = createErrorResult;
|
|
44
|
+
exports.validateRequiredParam = validateRequiredParam;
|
|
45
|
+
exports.findSite = findSite;
|
|
46
|
+
exports.getAllSiteNames = getAllSiteNames;
|
|
47
|
+
exports.findSiteOrError = findSiteOrError;
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const os = __importStar(require("os"));
|
|
50
|
+
/**
|
|
51
|
+
* Blocked WP-CLI commands that could allow arbitrary code execution
|
|
52
|
+
*/
|
|
53
|
+
exports.BLOCKED_WP_COMMANDS = [
|
|
54
|
+
'eval', // Execute arbitrary PHP code
|
|
55
|
+
'eval-file', // Execute PHP from file
|
|
56
|
+
'shell', // Interactive PHP shell
|
|
57
|
+
'db query', // Raw SQL execution
|
|
58
|
+
'db cli', // MySQL CLI access
|
|
59
|
+
];
|
|
60
|
+
/**
|
|
61
|
+
* Check if a WP-CLI command is blocked for security reasons
|
|
62
|
+
* Returns the blocked command name if blocked, null if safe
|
|
63
|
+
*/
|
|
64
|
+
function isBlockedWpCommand(command) {
|
|
65
|
+
const commandStr = command.join(' ').toLowerCase();
|
|
66
|
+
for (const blocked of exports.BLOCKED_WP_COMMANDS) {
|
|
67
|
+
if (commandStr.includes(blocked)) {
|
|
68
|
+
return blocked;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Validate that a file path is safe (no path traversal)
|
|
75
|
+
* Returns true if the path is within allowed directories
|
|
76
|
+
*/
|
|
77
|
+
function isValidFilePath(filePath, allowedDirs) {
|
|
78
|
+
// Resolve to absolute path
|
|
79
|
+
const resolvedPath = path.resolve(filePath);
|
|
80
|
+
// Default allowed directories: home, tmp, and common paths
|
|
81
|
+
const homeDir = os.homedir();
|
|
82
|
+
const defaultAllowed = [
|
|
83
|
+
homeDir,
|
|
84
|
+
os.tmpdir(),
|
|
85
|
+
'/tmp',
|
|
86
|
+
'/var/tmp',
|
|
87
|
+
];
|
|
88
|
+
const allowedDirectories = allowedDirs || defaultAllowed;
|
|
89
|
+
// Check if path is within any allowed directory
|
|
90
|
+
for (const allowedDir of allowedDirectories) {
|
|
91
|
+
const resolvedAllowed = path.resolve(allowedDir);
|
|
92
|
+
if (resolvedPath.startsWith(resolvedAllowed + path.sep) || resolvedPath === resolvedAllowed) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Validate that a SQL file path is safe
|
|
100
|
+
* Must end in .sql and be in an allowed directory
|
|
101
|
+
*/
|
|
102
|
+
function isValidSqlPath(sqlPath) {
|
|
103
|
+
if (typeof sqlPath !== 'string' || !sqlPath) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
// Must end in .sql
|
|
107
|
+
if (!sqlPath.toLowerCase().endsWith('.sql')) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
// Must be in an allowed directory
|
|
111
|
+
return isValidFilePath(sqlPath);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create a standardized error result for MCP tools
|
|
115
|
+
*/
|
|
116
|
+
function createErrorResult(message) {
|
|
117
|
+
return {
|
|
118
|
+
content: [{ type: 'text', text: message }],
|
|
119
|
+
isError: true,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Validate that a required parameter is present
|
|
124
|
+
* Returns an error result if missing, null if valid
|
|
125
|
+
*/
|
|
126
|
+
function validateRequiredParam(value, paramName) {
|
|
127
|
+
if (!value) {
|
|
128
|
+
return createErrorResult(`Error: ${paramName} parameter is required`);
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Find a site by name or ID
|
|
134
|
+
* Supports partial name matching (case-insensitive)
|
|
135
|
+
*/
|
|
136
|
+
function findSite(query, siteData) {
|
|
137
|
+
const sitesMap = siteData.getSites();
|
|
138
|
+
const sites = Object.values(sitesMap);
|
|
139
|
+
// Try exact ID match first
|
|
140
|
+
const byId = sites.find((s) => s.id === query);
|
|
141
|
+
if (byId)
|
|
142
|
+
return byId;
|
|
143
|
+
// Try exact name match (case-insensitive)
|
|
144
|
+
const byExactName = sites.find((s) => s.name.toLowerCase() === query.toLowerCase());
|
|
145
|
+
if (byExactName)
|
|
146
|
+
return byExactName;
|
|
147
|
+
// Try partial name match (case-insensitive)
|
|
148
|
+
const byPartialName = sites.find((s) => s.name.toLowerCase().includes(query.toLowerCase()));
|
|
149
|
+
if (byPartialName)
|
|
150
|
+
return byPartialName;
|
|
151
|
+
// Try domain match
|
|
152
|
+
const byDomain = sites.find((s) => s.domain?.toLowerCase() === query.toLowerCase());
|
|
153
|
+
if (byDomain)
|
|
154
|
+
return byDomain;
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get all site names as a comma-separated string
|
|
159
|
+
*/
|
|
160
|
+
function getAllSiteNames(siteData) {
|
|
161
|
+
const sitesMap = siteData.getSites();
|
|
162
|
+
const sites = Object.values(sitesMap);
|
|
163
|
+
return sites.map((s) => s.name).join(', ') || 'none';
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Find a site or return an error result
|
|
167
|
+
* Combines site lookup with standardized error handling
|
|
168
|
+
*/
|
|
169
|
+
function findSiteOrError(query, siteData) {
|
|
170
|
+
const site = findSite(query, siteData);
|
|
171
|
+
if (!site) {
|
|
172
|
+
const siteNames = getAllSiteNames(siteData);
|
|
173
|
+
return {
|
|
174
|
+
error: createErrorResult(`Site not found: "${query}". Available sites: ${siteNames}`),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
return { site };
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JILGdEQVFDO0FBTUQsMENBd0JDO0FBTUQsd0NBWUM7QUFhRCw4Q0FLQztBQU1ELHNEQVFDO0FBTUQsNEJBcUJDO0FBS0QsMENBSUM7QUFNRCwwQ0FjQztBQWxLRCwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBRXpCOztHQUVHO0FBQ1UsUUFBQSxtQkFBbUIsR0FBRztJQUNqQyxNQUFNLEVBQVMsNkJBQTZCO0lBQzVDLFdBQVcsRUFBSSx3QkFBd0I7SUFDdkMsT0FBTyxFQUFRLHdCQUF3QjtJQUN2QyxVQUFVLEVBQUssb0JBQW9CO0lBQ25DLFFBQVEsRUFBTyxtQkFBbUI7Q0FDbkMsQ0FBQztBQUVGOzs7R0FHRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE9BQWlCO0lBQ2xELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkQsS0FBSyxNQUFNLE9BQU8sSUFBSSwyQkFBbUIsRUFBRSxDQUFDO1FBQzFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQWdCLEVBQUUsV0FBc0I7SUFDdEUsMkJBQTJCO0lBQzNCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFNUMsMkRBQTJEO0lBQzNELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVB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QUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDekYsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFFOUIsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQWE7SUFDM0MsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFVLENBQUM7SUFDL0MsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQztBQUM1RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixLQUFhLEVBQ2IsUUFBYTtJQUViLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLE9BQU87WUFDTCxLQUFLLEVBQUUsaUJBQWlCLENBQ3RCLG9CQUFvQixLQUFLLHVCQUF1QixTQUFTLEVBQUUsQ0FDNUQ7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUb29sIEhlbHBlciBGdW5jdGlvbnNcbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuXG4vKipcbiAqIEJsb2NrZWQgV1AtQ0xJIGNvbW1hbmRzIHRoYXQgY291bGQgYWxsb3cgYXJiaXRyYXJ5IGNvZGUgZXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBCTE9DS0VEX1dQX0NPTU1BTkRTID0gW1xuICAnZXZhbCcsICAgICAgICAvLyBFeGVjdXRlIGFyYml0cmFyeSBQSFAgY29kZVxuICAnZXZhbC1maWxlJywgICAvLyBFeGVjdXRlIFBIUCBmcm9tIGZpbGVcbiAgJ3NoZWxsJywgICAgICAgLy8gSW50ZXJhY3RpdmUgUEhQIHNoZWxsXG4gICdkYiBxdWVyeScsICAgIC8vIFJhdyBTUUwgZXhlY3V0aW9uXG4gICdkYiBjbGknLCAgICAgIC8vIE15U1FMIENMSSBhY2Nlc3Ncbl07XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBXUC1DTEkgY29tbWFuZCBpcyBibG9ja2VkIGZvciBzZWN1cml0eSByZWFzb25zXG4gKiBSZXR1cm5zIHRoZSBibG9ja2VkIGNvbW1hbmQgbmFtZSBpZiBibG9ja2VkLCBudWxsIGlmIHNhZmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmxvY2tlZFdwQ29tbWFuZChjb21tYW5kOiBzdHJpbmdbXSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjb21tYW5kU3RyID0gY29tbWFuZC5qb2luKCcgJykudG9Mb3dlckNhc2UoKTtcbiAgZm9yIChjb25zdCBibG9ja2VkIG9mIEJMT0NLRURfV1BfQ09NTUFORFMpIHtcbiAgICBpZiAoY29tbWFuZFN0ci5pbmNsdWRlcyhibG9ja2VkKSkge1xuICAgICAgcmV0dXJuIGJsb2NrZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBmaWxlIHBhdGggaXMgc2FmZSAobm8gcGF0aCB0cmF2ZXJzYWwpXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdGggaXMgd2l0aGluIGFsbG93ZWQgZGlyZWN0b3JpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRGaWxlUGF0aChmaWxlUGF0aDogc3RyaW5nLCBhbGxvd2VkRGlycz86IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIFJlc29sdmUgdG8gYWJzb2x1dGUgcGF0aFxuICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuXG4gIC8vIERlZmF1bHQgYWxsb3dlZCBkaXJlY3RvcmllczogaG9tZSwgdG1wLCBhbmQgY29tbW9uIHBhdGhzXG4gIGNvbnN0IGhvbWVEaXIgPSBvcy5ob21lZGlyKCk7XG4gIGNvbnN0IGRlZmF1bHRBbGxvd2VkID0gW1xuICAgIGhvbWVEaXIsXG4gICAgb3MudG1wZGlyKCksXG4gICAgJy90bXAnLFxuICAgICcvdmFyL3RtcCcsXG4gIF07XG5cbiAgY29uc3QgYWxsb3dlZERpcmVjdG9yaWVzID0gYWxsb3dlZERpcnMgfHwgZGVmYXVsdEFsbG93ZWQ7XG5cbiAgLy8gQ2hlY2sgaWYgcGF0aCBpcyB3aXRoaW4gYW55IGFsbG93ZWQgZGlyZWN0b3J5XG4gIGZvciAoY29uc3QgYWxsb3dlZERpciBvZiBhbGxvd2VkRGlyZWN0b3JpZXMpIHtcbiAgICBjb25zdCByZXNvbHZlZEFsbG93ZWQgPSBwYXRoLnJlc29sdmUoYWxsb3dlZERpcik7XG4gICAgaWYgKHJlc29sdmVkUGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQWxsb3dlZCArIHBhdGguc2VwKSB8fCByZXNvbHZlZFBhdGggPT09IHJlc29sdmVkQWxsb3dlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBTUUwgZmlsZSBwYXRoIGlzIHNhZmVcbiAqIE11c3QgZW5kIGluIC5zcWwgYW5kIGJlIGluIGFuIGFsbG93ZWQgZGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU3FsUGF0aChzcWxQYXRoOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc3FsUGF0aCAhPT0gJ3N0cmluZycgfHwgIXNxbFBhdGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNdXN0IGVuZCBpbiAuc3FsXG4gIGlmICghc3FsUGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuc3FsJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNdXN0IGJlIGluIGFuIGFsbG93ZWQgZGlyZWN0b3J5XG4gIHJldHVybiBpc1ZhbGlkRmlsZVBhdGgoc3FsUGF0aCk7XG59XG5cbi8qKlxuICogTUNQIFRvb2wgUmVzdWx0IHR5cGUgZm9yIGVycm9yIHJlc3BvbnNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1jcEVycm9yUmVzdWx0IHtcbiAgY29udGVudDogQXJyYXk8eyB0eXBlOiAndGV4dCc7IHRleHQ6IHN0cmluZyB9PjtcbiAgaXNFcnJvcjogdHJ1ZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzdGFuZGFyZGl6ZWQgZXJyb3IgcmVzdWx0IGZvciBNQ1AgdG9vbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9yUmVzdWx0KG1lc3NhZ2U6IHN0cmluZyk6IE1jcEVycm9yUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IG1lc3NhZ2UgfV0sXG4gICAgaXNFcnJvcjogdHJ1ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgcmVxdWlyZWQgcGFyYW1ldGVyIGlzIHByZXNlbnRcbiAqIFJldHVybnMgYW4gZXJyb3IgcmVzdWx0IGlmIG1pc3NpbmcsIG51bGwgaWYgdmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmVxdWlyZWRQYXJhbShcbiAgdmFsdWU6IHVua25vd24sXG4gIHBhcmFtTmFtZTogc3RyaW5nXG4pOiBNY3BFcnJvclJlc3VsdCB8IG51bGwge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVycm9yUmVzdWx0KGBFcnJvcjogJHtwYXJhbU5hbWV9IHBhcmFtZXRlciBpcyByZXF1aXJlZGApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEZpbmQgYSBzaXRlIGJ5IG5hbWUgb3IgSURcbiAqIFN1cHBvcnRzIHBhcnRpYWwgbmFtZSBtYXRjaGluZyAoY2FzZS1pbnNlbnNpdGl2ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTaXRlKHF1ZXJ5OiBzdHJpbmcsIHNpdGVEYXRhOiBhbnkpOiBhbnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBzaXRlc01hcCA9IHNpdGVEYXRhLmdldFNpdGVzKCk7XG4gIGNvbnN0IHNpdGVzID0gT2JqZWN0LnZhbHVlcyhzaXRlc01hcCkgYXMgYW55W107XG5cbiAgLy8gVHJ5IGV4YWN0IElEIG1hdGNoIGZpcnN0XG4gIGNvbnN0IGJ5SWQgPSBzaXRlcy5maW5kKChzOiBhbnkpID0+IHMuaWQgPT09IHF1ZXJ5KTtcbiAgaWYgKGJ5SWQpIHJldHVybiBieUlkO1xuXG4gIC8vIFRyeSBleGFjdCBuYW1lIG1hdGNoIChjYXNlLWluc2Vuc2l0aXZlKVxuICBjb25zdCBieUV4YWN0TmFtZSA9IHNpdGVzLmZpbmQoKHM6IGFueSkgPT4gcy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHF1ZXJ5LnRvTG93ZXJDYXNlKCkpO1xuICBpZiAoYnlFeGFjdE5hbWUpIHJldHVybiBieUV4YWN0TmFtZTtcblxuICAvLyBUcnkgcGFydGlhbCBuYW1lIG1hdGNoIChjYXNlLWluc2Vuc2l0aXZlKVxuICBjb25zdCBieVBhcnRpYWxOYW1lID0gc2l0ZXMuZmluZCgoczogYW55KSA9PiBzLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSk7XG4gIGlmIChieVBhcnRpYWxOYW1lKSByZXR1cm4gYnlQYXJ0aWFsTmFtZTtcblxuICAvLyBUcnkgZG9tYWluIG1hdGNoXG4gIGNvbnN0IGJ5RG9tYWluID0gc2l0ZXMuZmluZCgoczogYW55KSA9PiBzLmRvbWFpbj8udG9Mb3dlckNhc2UoKSA9PT0gcXVlcnkudG9Mb3dlckNhc2UoKSk7XG4gIGlmIChieURvbWFpbikgcmV0dXJuIGJ5RG9tYWluO1xuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IGFsbCBzaXRlIG5hbWVzIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsU2l0ZU5hbWVzKHNpdGVEYXRhOiBhbnkpOiBzdHJpbmcge1xuICBjb25zdCBzaXRlc01hcCA9IHNpdGVEYXRhLmdldFNpdGVzKCk7XG4gIGNvbnN0IHNpdGVzID0gT2JqZWN0LnZhbHVlcyhzaXRlc01hcCkgYXMgYW55W107XG4gIHJldHVybiBzaXRlcy5tYXAoKHM6IGFueSkgPT4gcy5uYW1lKS5qb2luKCcsICcpIHx8ICdub25lJztcbn1cblxuLyoqXG4gKiBGaW5kIGEgc2l0ZSBvciByZXR1cm4gYW4gZXJyb3IgcmVzdWx0XG4gKiBDb21iaW5lcyBzaXRlIGxvb2t1cCB3aXRoIHN0YW5kYXJkaXplZCBlcnJvciBoYW5kbGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFNpdGVPckVycm9yKFxuICBxdWVyeTogc3RyaW5nLFxuICBzaXRlRGF0YTogYW55XG4pOiB7IHNpdGU6IGFueSB9IHwgeyBlcnJvcjogTWNwRXJyb3JSZXN1bHQgfSB7XG4gIGNvbnN0IHNpdGUgPSBmaW5kU2l0ZShxdWVyeSwgc2l0ZURhdGEpO1xuICBpZiAoIXNpdGUpIHtcbiAgICBjb25zdCBzaXRlTmFtZXMgPSBnZXRBbGxTaXRlTmFtZXMoc2l0ZURhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogY3JlYXRlRXJyb3JSZXN1bHQoXG4gICAgICAgIGBTaXRlIG5vdCBmb3VuZDogXCIke3F1ZXJ5fVwiLiBBdmFpbGFibGUgc2l0ZXM6ICR7c2l0ZU5hbWVzfWBcbiAgICAgICksXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBzaXRlIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* import_database Tool
|
|
3
|
+
* Import SQL file into site database using WP-CLI
|
|
4
|
+
*/
|
|
5
|
+
import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
|
|
6
|
+
export declare const importDatabaseDefinition: McpToolDefinition;
|
|
7
|
+
export declare function importDatabase(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
|