@nightsquawktech/tacticalrmm-mcp-server 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/COMMERCIAL.md +35 -0
- package/LICENSE +661 -0
- package/README.md +79 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/agents.d.ts +39 -0
- package/dist/schemas/agents.d.ts.map +1 -0
- package/dist/schemas/agents.js +37 -0
- package/dist/schemas/agents.js.map +1 -0
- package/dist/schemas/clients.d.ts +16 -0
- package/dist/schemas/clients.d.ts.map +1 -0
- package/dist/schemas/clients.js +10 -0
- package/dist/schemas/clients.js.map +1 -0
- package/dist/schemas/common.d.ts +5 -0
- package/dist/schemas/common.d.ts.map +1 -0
- package/dist/schemas/common.js +19 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/schemas/resources.d.ts +76 -0
- package/dist/schemas/resources.d.ts.map +1 -0
- package/dist/schemas/resources.js +37 -0
- package/dist/schemas/resources.js.map +1 -0
- package/dist/schemas/server.d.ts +10 -0
- package/dist/schemas/server.d.ts.map +1 -0
- package/dist/schemas/server.js +8 -0
- package/dist/schemas/server.js.map +1 -0
- package/dist/services/config.d.ts +3 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +22 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/errors.d.ts +2 -0
- package/dist/services/errors.d.ts.map +1 -0
- package/dist/services/errors.js +41 -0
- package/dist/services/errors.js.map +1 -0
- package/dist/services/tacticalrmm-client.d.ts +10 -0
- package/dist/services/tacticalrmm-client.d.ts.map +1 -0
- package/dist/services/tacticalrmm-client.js +37 -0
- package/dist/services/tacticalrmm-client.js.map +1 -0
- package/dist/tools/agents.d.ts +4 -0
- package/dist/tools/agents.d.ts.map +1 -0
- package/dist/tools/agents.js +97 -0
- package/dist/tools/agents.js.map +1 -0
- package/dist/tools/automation.d.ts +4 -0
- package/dist/tools/automation.d.ts.map +1 -0
- package/dist/tools/automation.js +41 -0
- package/dist/tools/automation.js.map +1 -0
- package/dist/tools/clients.d.ts +4 -0
- package/dist/tools/clients.d.ts.map +1 -0
- package/dist/tools/clients.js +34 -0
- package/dist/tools/clients.js.map +1 -0
- package/dist/tools/format.d.ts +6 -0
- package/dist/tools/format.d.ts.map +1 -0
- package/dist/tools/format.js +37 -0
- package/dist/tools/format.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inventory.d.ts +4 -0
- package/dist/tools/inventory.d.ts.map +1 -0
- package/dist/tools/inventory.js +32 -0
- package/dist/tools/inventory.js.map +1 -0
- package/dist/tools/logs.d.ts +4 -0
- package/dist/tools/logs.d.ts.map +1 -0
- package/dist/tools/logs.js +91 -0
- package/dist/tools/logs.js.map +1 -0
- package/dist/tools/monitoring.d.ts +4 -0
- package/dist/tools/monitoring.d.ts.map +1 -0
- package/dist/tools/monitoring.js +70 -0
- package/dist/tools/monitoring.js.map +1 -0
- package/dist/tools/read-tools.d.ts +20 -0
- package/dist/tools/read-tools.d.ts.map +1 -0
- package/dist/tools/read-tools.js +51 -0
- package/dist/tools/read-tools.js.map +1 -0
- package/dist/tools/server.d.ts +4 -0
- package/dist/tools/server.d.ts.map +1 -0
- package/dist/tools/server.js +42 -0
- package/dist/tools/server.js.map +1 -0
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { AgentIdSchema, ListAgentsSchema } from "../schemas/agents.js";
|
|
2
|
+
import { formatApiError } from "../services/errors.js";
|
|
3
|
+
import { formatResponse, makeToolResponse, paginate, summarizeRecord } from "./format.js";
|
|
4
|
+
export function registerAgentTools(server, client) {
|
|
5
|
+
server.registerTool("tacticalrmm_list_agents", {
|
|
6
|
+
title: "List TacticalRMM Agents",
|
|
7
|
+
description: "List agents visible to the TacticalRMM API key from /agents/ with optional client, site, monitoring_type, and detail filters.",
|
|
8
|
+
inputSchema: ListAgentsSchema.shape,
|
|
9
|
+
annotations: {
|
|
10
|
+
readOnlyHint: true,
|
|
11
|
+
destructiveHint: false,
|
|
12
|
+
idempotentHint: true,
|
|
13
|
+
openWorldHint: true
|
|
14
|
+
}
|
|
15
|
+
}, async (params) => {
|
|
16
|
+
try {
|
|
17
|
+
const agents = await client.get("/agents/", {
|
|
18
|
+
detail: params.detail ? "true" : "false",
|
|
19
|
+
...(params.client ? { client: params.client } : {}),
|
|
20
|
+
...(params.site ? { site: params.site } : {}),
|
|
21
|
+
...(params.monitoring_type ? { monitoring_type: params.monitoring_type } : {})
|
|
22
|
+
});
|
|
23
|
+
const data = paginate(agents, params.limit, params.offset);
|
|
24
|
+
const markdown = [
|
|
25
|
+
"# TacticalRMM Agents",
|
|
26
|
+
"",
|
|
27
|
+
`Showing ${data.count} of ${data.total} agents.`,
|
|
28
|
+
"",
|
|
29
|
+
...data.items.map((item) => `- ${summarizeRecord(item, ["agent_id", "hostname", "client_name", "site_name", "status", "plat"])}`)
|
|
30
|
+
].join("\n");
|
|
31
|
+
return makeToolResponse(data, formatResponse(params.response_format, data, markdown));
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const data = { error: formatApiError(error) };
|
|
35
|
+
return makeToolResponse(data, data.error, true);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
server.registerTool("tacticalrmm_get_agent", {
|
|
39
|
+
title: "Get TacticalRMM Agent",
|
|
40
|
+
description: "Get one TacticalRMM agent record by agent_id from /agents/<agent_id>/. This tool is read-only.",
|
|
41
|
+
inputSchema: AgentIdSchema.shape,
|
|
42
|
+
annotations: {
|
|
43
|
+
readOnlyHint: true,
|
|
44
|
+
destructiveHint: false,
|
|
45
|
+
idempotentHint: true,
|
|
46
|
+
openWorldHint: true
|
|
47
|
+
}
|
|
48
|
+
}, async ({ agent_id, response_format }) => {
|
|
49
|
+
try {
|
|
50
|
+
const agent = await client.get(`/agents/${encodeURIComponent(agent_id)}/`);
|
|
51
|
+
const data = { agent };
|
|
52
|
+
const markdown = [
|
|
53
|
+
"# TacticalRMM Agent",
|
|
54
|
+
"",
|
|
55
|
+
summarizeRecord(agent, ["agent_id", "hostname", "client_name", "site_name", "status", "plat"])
|
|
56
|
+
].join("\n");
|
|
57
|
+
return makeToolResponse(data, formatResponse(response_format, data, markdown));
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const data = { error: formatApiError(error) };
|
|
61
|
+
return makeToolResponse(data, data.error, true);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
server.registerTool("tacticalrmm_list_agent_software", {
|
|
65
|
+
title: "List TacticalRMM Agent Software",
|
|
66
|
+
description: "List software inventory for a TacticalRMM agent from /software/<agent_id>/. This tool is read-only.",
|
|
67
|
+
inputSchema: AgentIdSchema.shape,
|
|
68
|
+
annotations: {
|
|
69
|
+
readOnlyHint: true,
|
|
70
|
+
destructiveHint: false,
|
|
71
|
+
idempotentHint: true,
|
|
72
|
+
openWorldHint: true
|
|
73
|
+
}
|
|
74
|
+
}, async ({ agent_id, response_format }) => {
|
|
75
|
+
try {
|
|
76
|
+
const software = await client.get(`/software/${encodeURIComponent(agent_id)}/`);
|
|
77
|
+
const data = {
|
|
78
|
+
agent_id,
|
|
79
|
+
total: software.length,
|
|
80
|
+
software
|
|
81
|
+
};
|
|
82
|
+
const markdown = [
|
|
83
|
+
"# TacticalRMM Agent Software",
|
|
84
|
+
"",
|
|
85
|
+
`Found ${software.length} software records for ${agent_id}.`,
|
|
86
|
+
"",
|
|
87
|
+
...software.slice(0, 100).map((item) => `- ${summarizeRecord(item, ["name", "version", "publisher", "install_date"])}`)
|
|
88
|
+
].join("\n");
|
|
89
|
+
return makeToolResponse(data, formatResponse(response_format, data, markdown));
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const data = { error: formatApiError(error) };
|
|
93
|
+
return makeToolResponse(data, data.error, true);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/tools/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { TacticalRmmClient } from "../services/tacticalrmm-client.js";
|
|
3
|
+
export declare function registerAutomationTools(server: McpServer, client: TacticalRmmClient): void;
|
|
4
|
+
//# sourceMappingURL=automation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation.d.ts","sourceRoot":"","sources":["../../src/tools/automation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAI3E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAwC1F"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { AgentResourceSchema, ListResourcesSchema } from "../schemas/resources.js";
|
|
2
|
+
import { registerCollectionReadTool } from "./read-tools.js";
|
|
3
|
+
export function registerAutomationTools(server, client) {
|
|
4
|
+
registerCollectionReadTool(server, client, {
|
|
5
|
+
name: "tacticalrmm_list_tasks",
|
|
6
|
+
title: "List TacticalRMM Tasks",
|
|
7
|
+
description: "List TacticalRMM automated tasks from /tasks/. This tool is read-only and does not run tasks.",
|
|
8
|
+
inputSchema: ListResourcesSchema.shape,
|
|
9
|
+
path: () => "/tasks/",
|
|
10
|
+
preferredFields: ["id", "name", "agent", "agent_hostname", "enabled", "last_run"],
|
|
11
|
+
heading: "TacticalRMM Tasks"
|
|
12
|
+
});
|
|
13
|
+
registerCollectionReadTool(server, client, {
|
|
14
|
+
name: "tacticalrmm_list_agent_tasks",
|
|
15
|
+
title: "List TacticalRMM Agent Tasks",
|
|
16
|
+
description: "List automated tasks assigned to one TacticalRMM agent from /agents/<agent_id>/tasks/. This tool is read-only.",
|
|
17
|
+
inputSchema: AgentResourceSchema.shape,
|
|
18
|
+
path: (params) => `/agents/${encodeURIComponent(String(params.agent_id))}/tasks/`,
|
|
19
|
+
preferredFields: ["id", "name", "enabled", "last_run", "task_result"],
|
|
20
|
+
heading: "TacticalRMM Agent Tasks"
|
|
21
|
+
});
|
|
22
|
+
registerCollectionReadTool(server, client, {
|
|
23
|
+
name: "tacticalrmm_list_scripts",
|
|
24
|
+
title: "List TacticalRMM Scripts",
|
|
25
|
+
description: "List scripts from the TacticalRMM script library at /scripts/. This tool is read-only and does not run scripts.",
|
|
26
|
+
inputSchema: ListResourcesSchema.shape,
|
|
27
|
+
path: () => "/scripts/",
|
|
28
|
+
preferredFields: ["id", "name", "shell", "script_type", "category", "description"],
|
|
29
|
+
heading: "TacticalRMM Scripts"
|
|
30
|
+
});
|
|
31
|
+
registerCollectionReadTool(server, client, {
|
|
32
|
+
name: "tacticalrmm_list_policies",
|
|
33
|
+
title: "List TacticalRMM Policies",
|
|
34
|
+
description: "List automation policies from /automation/policies/. This tool is read-only.",
|
|
35
|
+
inputSchema: ListResourcesSchema.shape,
|
|
36
|
+
path: () => "/automation/policies/",
|
|
37
|
+
preferredFields: ["id", "name", "desc", "enabled"],
|
|
38
|
+
heading: "TacticalRMM Policies"
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=automation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation.js","sourceRoot":"","sources":["../../src/tools/automation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,MAAyB;IAClF,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE;QACzC,IAAI,EAAE,wBAAwB;QAC9B,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,+FAA+F;QAC5G,WAAW,EAAE,mBAAmB,CAAC,KAAK;QACtC,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;QACrB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,CAAC;QACjF,OAAO,EAAE,mBAAmB;KAC7B,CAAC,CAAC;IAEH,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE;QACzC,IAAI,EAAE,8BAA8B;QACpC,KAAK,EAAE,8BAA8B;QACrC,WAAW,EAAE,gHAAgH;QAC7H,WAAW,EAAE,mBAAmB,CAAC,KAAK;QACtC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS;QACjF,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC;QACrE,OAAO,EAAE,yBAAyB;KACnC,CAAC,CAAC;IAEH,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE;QACzC,IAAI,EAAE,0BAA0B;QAChC,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,iHAAiH;QAC9H,WAAW,EAAE,mBAAmB,CAAC,KAAK;QACtC,IAAI,EAAE,GAAG,EAAE,CAAC,WAAW;QACvB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,CAAC;QAClF,OAAO,EAAE,qBAAqB;KAC/B,CAAC,CAAC;IAEH,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE;QACzC,IAAI,EAAE,2BAA2B;QACjC,KAAK,EAAE,2BAA2B;QAClC,WAAW,EAAE,8EAA8E;QAC3F,WAAW,EAAE,mBAAmB,CAAC,KAAK;QACtC,IAAI,EAAE,GAAG,EAAE,CAAC,uBAAuB;QACnC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;QAClD,OAAO,EAAE,sBAAsB;KAChC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { TacticalRmmClient } from "../services/tacticalrmm-client.js";
|
|
3
|
+
export declare function registerClientTools(server: McpServer, client: TacticalRmmClient): void;
|
|
4
|
+
//# sourceMappingURL=clients.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../src/tools/clients.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAK3E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAiCtF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { formatApiError } from "../services/errors.js";
|
|
2
|
+
import { ListClientsSchema } from "../schemas/clients.js";
|
|
3
|
+
import { formatResponse, makeToolResponse, paginate, summarizeRecord } from "./format.js";
|
|
4
|
+
export function registerClientTools(server, client) {
|
|
5
|
+
server.registerTool("tacticalrmm_list_clients", {
|
|
6
|
+
title: "List TacticalRMM Clients",
|
|
7
|
+
description: "List clients visible to the TacticalRMM API key from /clients/. This tool is read-only.",
|
|
8
|
+
inputSchema: ListClientsSchema.shape,
|
|
9
|
+
annotations: {
|
|
10
|
+
readOnlyHint: true,
|
|
11
|
+
destructiveHint: false,
|
|
12
|
+
idempotentHint: true,
|
|
13
|
+
openWorldHint: true
|
|
14
|
+
}
|
|
15
|
+
}, async ({ limit, offset, response_format }) => {
|
|
16
|
+
try {
|
|
17
|
+
const clients = await client.get("/clients/");
|
|
18
|
+
const data = paginate(clients, limit, offset);
|
|
19
|
+
const markdown = [
|
|
20
|
+
"# TacticalRMM Clients",
|
|
21
|
+
"",
|
|
22
|
+
`Showing ${data.count} of ${data.total} clients.`,
|
|
23
|
+
"",
|
|
24
|
+
...data.items.map((item) => `- ${summarizeRecord(item, ["id", "name"])}`)
|
|
25
|
+
].join("\n");
|
|
26
|
+
return makeToolResponse(data, formatResponse(response_format, data, markdown));
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const data = { error: formatApiError(error) };
|
|
30
|
+
return makeToolResponse(data, data.error, true);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=clients.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.js","sourceRoot":"","sources":["../../src/tools/clients.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAyB,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1F,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAyB;IAC9E,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,yFAAyF;QACtG,WAAW,EAAE,iBAAiB,CAAC,KAAK;QACpC,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAoB,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAAY,WAAW,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG;gBACf,uBAAuB;gBACvB,EAAE;gBACF,WAAW,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,WAAW;gBACjD,EAAE;gBACF,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;aAC1E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,gBAAgB,CAAC,IAAI,EAAE,cAAc,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PaginatedItems, ResponseFormat, ToolResponse } from "../types.js";
|
|
2
|
+
export declare function paginate<T>(items: T[], limit: number, offset: number): PaginatedItems<T>;
|
|
3
|
+
export declare function makeToolResponse<T extends Record<string, unknown>>(data: T, text: string, isError?: boolean): ToolResponse<T>;
|
|
4
|
+
export declare function formatResponse<T>(format: ResponseFormat, data: T, markdown: string): string;
|
|
5
|
+
export declare function summarizeRecord(record: unknown, preferredFields: string[]): string;
|
|
6
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/tools/format.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAYxF;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAU3H;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3F;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,MAAM,CAWlF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { RESPONSE_CHARACTER_LIMIT } from "../constants.js";
|
|
2
|
+
export function paginate(items, limit, offset) {
|
|
3
|
+
const pageItems = items.slice(offset, offset + limit);
|
|
4
|
+
const hasMore = offset + pageItems.length < items.length;
|
|
5
|
+
return {
|
|
6
|
+
total: items.length,
|
|
7
|
+
count: pageItems.length,
|
|
8
|
+
offset,
|
|
9
|
+
items: pageItems,
|
|
10
|
+
has_more: hasMore,
|
|
11
|
+
...(hasMore ? { next_offset: offset + pageItems.length } : {})
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function makeToolResponse(data, text, isError = false) {
|
|
15
|
+
const responseText = text.length > RESPONSE_CHARACTER_LIMIT
|
|
16
|
+
? `${text.slice(0, RESPONSE_CHARACTER_LIMIT)}\n\nResponse truncated at ${RESPONSE_CHARACTER_LIMIT} characters. Use filters or a smaller limit.`
|
|
17
|
+
: text;
|
|
18
|
+
return {
|
|
19
|
+
content: [{ type: "text", text: responseText }],
|
|
20
|
+
structuredContent: data,
|
|
21
|
+
...(isError ? { isError: true } : {})
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function formatResponse(format, data, markdown) {
|
|
25
|
+
return format === "json" ? JSON.stringify(data, null, 2) : markdown;
|
|
26
|
+
}
|
|
27
|
+
export function summarizeRecord(record, preferredFields) {
|
|
28
|
+
if (!record || typeof record !== "object") {
|
|
29
|
+
return String(record);
|
|
30
|
+
}
|
|
31
|
+
const source = record;
|
|
32
|
+
const fields = preferredFields
|
|
33
|
+
.filter((field) => source[field] !== undefined && source[field] !== null && source[field] !== "")
|
|
34
|
+
.map((field) => `${field}: ${String(source[field])}`);
|
|
35
|
+
return fields.length > 0 ? fields.join(", ") : JSON.stringify(record);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/tools/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,MAAM,UAAU,QAAQ,CAAI,KAAU,EAAE,KAAa,EAAE,MAAc;IACnE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAEzD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,KAAK,EAAE,SAAS,CAAC,MAAM;QACvB,MAAM;QACN,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,OAAO;QACjB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAoC,IAAO,EAAE,IAAY,EAAE,OAAO,GAAG,KAAK;IACxG,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,wBAAwB;QACzD,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,6BAA6B,wBAAwB,8CAA8C;QAC/I,CAAC,CAAC,IAAI,CAAC;IAET,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;QAC/C,iBAAiB,EAAE,IAAI;QACvB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAI,MAAsB,EAAE,IAAO,EAAE,QAAgB;IACjF,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAe,EAAE,eAAyB;IACxE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,MAAM,MAAM,GAAG,eAAe;SAC3B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;SAChG,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAExD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { TacticalRmmClient } from "../services/tacticalrmm-client.js";
|
|
3
|
+
export declare function registerTools(server: McpServer, client: TacticalRmmClient): void;
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAS3E,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAQhF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { registerAgentTools } from "./agents.js";
|
|
2
|
+
import { registerAutomationTools } from "./automation.js";
|
|
3
|
+
import { registerClientTools } from "./clients.js";
|
|
4
|
+
import { registerInventoryTools } from "./inventory.js";
|
|
5
|
+
import { registerLogTools } from "./logs.js";
|
|
6
|
+
import { registerMonitoringTools } from "./monitoring.js";
|
|
7
|
+
import { registerServerTools } from "./server.js";
|
|
8
|
+
export function registerTools(server, client) {
|
|
9
|
+
registerServerTools(server, client);
|
|
10
|
+
registerClientTools(server, client);
|
|
11
|
+
registerAgentTools(server, client);
|
|
12
|
+
registerInventoryTools(server, client);
|
|
13
|
+
registerMonitoringTools(server, client);
|
|
14
|
+
registerAutomationTools(server, client);
|
|
15
|
+
registerLogTools(server, client);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,MAAyB;IACxE,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { TacticalRmmClient } from "../services/tacticalrmm-client.js";
|
|
3
|
+
export declare function registerInventoryTools(server: McpServer, client: TacticalRmmClient): void;
|
|
4
|
+
//# sourceMappingURL=inventory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../src/tools/inventory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAI3E,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CA8BzF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AgentResourceSchema, ListResourcesSchema } from "../schemas/resources.js";
|
|
2
|
+
import { registerCollectionReadTool } from "./read-tools.js";
|
|
3
|
+
export function registerInventoryTools(server, client) {
|
|
4
|
+
registerCollectionReadTool(server, client, {
|
|
5
|
+
name: "tacticalrmm_list_sites",
|
|
6
|
+
title: "List TacticalRMM Sites",
|
|
7
|
+
description: "List TacticalRMM sites from /clients/sites/. This tool is read-only.",
|
|
8
|
+
inputSchema: ListResourcesSchema.shape,
|
|
9
|
+
path: () => "/clients/sites/",
|
|
10
|
+
preferredFields: ["id", "name", "client", "client_name"],
|
|
11
|
+
heading: "TacticalRMM Sites"
|
|
12
|
+
});
|
|
13
|
+
registerCollectionReadTool(server, client, {
|
|
14
|
+
name: "tacticalrmm_list_agent_services",
|
|
15
|
+
title: "List TacticalRMM Agent Services",
|
|
16
|
+
description: "List Windows service inventory for an agent from /services/<agent_id>/. This tool is read-only.",
|
|
17
|
+
inputSchema: AgentResourceSchema.shape,
|
|
18
|
+
path: (params) => `/services/${encodeURIComponent(String(params.agent_id))}/`,
|
|
19
|
+
preferredFields: ["name", "display_name", "status", "start_type", "username"],
|
|
20
|
+
heading: "TacticalRMM Agent Services"
|
|
21
|
+
});
|
|
22
|
+
registerCollectionReadTool(server, client, {
|
|
23
|
+
name: "tacticalrmm_list_win_updates",
|
|
24
|
+
title: "List TacticalRMM Windows Updates",
|
|
25
|
+
description: "List Windows Update inventory for an agent from /winupdate/<agent_id>/. This tool is read-only and does not scan or install updates.",
|
|
26
|
+
inputSchema: AgentResourceSchema.shape,
|
|
27
|
+
path: (params) => `/winupdate/${encodeURIComponent(String(params.agent_id))}/`,
|
|
28
|
+
preferredFields: ["title", "kb", "severity", "installed", "approved", "status"],
|
|
29
|
+
heading: "TacticalRMM Windows Updates"
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../src/tools/inventory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAyB;IACjF,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE;QACzC,IAAI,EAAE,wBAAwB;QAC9B,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,sEAAsE;QACnF,WAAW,EAAE,mBAAmB,CAAC,KAAK;QACtC,IAAI,EAAE,GAAG,EAAE,CAAC,iBAAiB;QAC7B,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC;QACxD,OAAO,EAAE,mBAAmB;KAC7B,CAAC,CAAC;IAEH,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE;QACzC,IAAI,EAAE,iCAAiC;QACvC,KAAK,EAAE,iCAAiC;QACxC,WAAW,EAAE,iGAAiG;QAC9G,WAAW,EAAE,mBAAmB,CAAC,KAAK;QACtC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG;QAC7E,eAAe,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC;QAC7E,OAAO,EAAE,4BAA4B;KACtC,CAAC,CAAC;IAEH,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE;QACzC,IAAI,EAAE,8BAA8B;QACpC,KAAK,EAAE,kCAAkC;QACzC,WAAW,EAAE,sIAAsI;QACnJ,WAAW,EAAE,mBAAmB,CAAC,KAAK;QACtC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG;QAC9E,eAAe,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC;QAC/E,OAAO,EAAE,6BAA6B;KACvC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { TacticalRmmClient } from "../services/tacticalrmm-client.js";
|
|
3
|
+
export declare function registerLogTools(server: McpServer, client: TacticalRmmClient): void;
|
|
4
|
+
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAM3E,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAgGnF"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { AgentResourceSchema, AuditLogsSchema, ListResourcesSchema } from "../schemas/resources.js";
|
|
2
|
+
import { formatApiError } from "../services/errors.js";
|
|
3
|
+
import { formatResponse, makeToolResponse, summarizeRecord } from "./format.js";
|
|
4
|
+
import { registerCollectionReadTool } from "./read-tools.js";
|
|
5
|
+
export function registerLogTools(server, client) {
|
|
6
|
+
registerCollectionReadTool(server, client, {
|
|
7
|
+
name: "tacticalrmm_list_agent_history",
|
|
8
|
+
title: "List TacticalRMM Agent History",
|
|
9
|
+
description: "List history for one TacticalRMM agent from /agents/<agent_id>/history/. This tool is read-only.",
|
|
10
|
+
inputSchema: AgentResourceSchema.shape,
|
|
11
|
+
path: (params) => `/agents/${encodeURIComponent(String(params.agent_id))}/history/`,
|
|
12
|
+
preferredFields: ["id", "entry_time", "event_type", "message", "description"],
|
|
13
|
+
heading: "TacticalRMM Agent History"
|
|
14
|
+
});
|
|
15
|
+
registerCollectionReadTool(server, client, {
|
|
16
|
+
name: "tacticalrmm_list_agent_notes",
|
|
17
|
+
title: "List TacticalRMM Agent Notes",
|
|
18
|
+
description: "List notes for one TacticalRMM agent from /agents/<agent_id>/notes/. This tool is read-only.",
|
|
19
|
+
inputSchema: AgentResourceSchema.shape,
|
|
20
|
+
path: (params) => `/agents/${encodeURIComponent(String(params.agent_id))}/notes/`,
|
|
21
|
+
preferredFields: ["id", "title", "note", "created_by", "entry_time"],
|
|
22
|
+
heading: "TacticalRMM Agent Notes"
|
|
23
|
+
});
|
|
24
|
+
registerCollectionReadTool(server, client, {
|
|
25
|
+
name: "tacticalrmm_list_pending_actions",
|
|
26
|
+
title: "List TacticalRMM Pending Actions",
|
|
27
|
+
description: "List global pending actions from /logs/pendingactions/. This tool is read-only.",
|
|
28
|
+
inputSchema: ListResourcesSchema.shape,
|
|
29
|
+
path: () => "/logs/pendingactions/",
|
|
30
|
+
preferredFields: ["id", "agent", "hostname", "action_type", "status", "entry_time"],
|
|
31
|
+
heading: "TacticalRMM Pending Actions"
|
|
32
|
+
});
|
|
33
|
+
registerCollectionReadTool(server, client, {
|
|
34
|
+
name: "tacticalrmm_list_agent_pending_actions",
|
|
35
|
+
title: "List TacticalRMM Agent Pending Actions",
|
|
36
|
+
description: "List pending actions for one TacticalRMM agent from /agents/<agent_id>/pendingactions/. This tool is read-only.",
|
|
37
|
+
inputSchema: AgentResourceSchema.shape,
|
|
38
|
+
path: (params) => `/agents/${encodeURIComponent(String(params.agent_id))}/pendingactions/`,
|
|
39
|
+
preferredFields: ["id", "action_type", "status", "entry_time", "result"],
|
|
40
|
+
heading: "TacticalRMM Agent Pending Actions"
|
|
41
|
+
});
|
|
42
|
+
registerCollectionReadTool(server, client, {
|
|
43
|
+
name: "tacticalrmm_get_custom_fields",
|
|
44
|
+
title: "Get TacticalRMM Custom Fields",
|
|
45
|
+
description: "List TacticalRMM custom fields from /core/customfields/. This tool is read-only.",
|
|
46
|
+
inputSchema: ListResourcesSchema.shape,
|
|
47
|
+
path: () => "/core/customfields/",
|
|
48
|
+
preferredFields: ["id", "name", "model", "field_type", "required"],
|
|
49
|
+
heading: "TacticalRMM Custom Fields"
|
|
50
|
+
});
|
|
51
|
+
server.registerTool("tacticalrmm_get_audit_logs", {
|
|
52
|
+
title: "Get TacticalRMM Audit Logs",
|
|
53
|
+
description: "Query TacticalRMM audit logs from /logs/audit/. This is a read-only audit-log query; TacticalRMM examples use a PATCH request body for filters.",
|
|
54
|
+
inputSchema: AuditLogsSchema.shape,
|
|
55
|
+
annotations: {
|
|
56
|
+
readOnlyHint: true,
|
|
57
|
+
destructiveHint: false,
|
|
58
|
+
idempotentHint: true,
|
|
59
|
+
openWorldHint: true
|
|
60
|
+
}
|
|
61
|
+
}, async (params) => {
|
|
62
|
+
try {
|
|
63
|
+
const payload = {
|
|
64
|
+
pagination: {
|
|
65
|
+
sortBy: params.sort_by,
|
|
66
|
+
descending: params.descending,
|
|
67
|
+
page: params.page,
|
|
68
|
+
rowsPerPage: params.rows_per_page,
|
|
69
|
+
rowsNumber: 0
|
|
70
|
+
},
|
|
71
|
+
agentFilter: params.agent_ids,
|
|
72
|
+
actionFilter: params.actions
|
|
73
|
+
};
|
|
74
|
+
const data = await client.query("/logs/audit/", payload);
|
|
75
|
+
const rows = Array.isArray(data.data) ? data.data : Array.isArray(data.rows) ? data.rows : [];
|
|
76
|
+
const markdown = [
|
|
77
|
+
"# TacticalRMM Audit Logs",
|
|
78
|
+
"",
|
|
79
|
+
`Returned ${rows.length} audit log records.`,
|
|
80
|
+
"",
|
|
81
|
+
...rows.slice(0, params.rows_per_page).map((item) => `- ${summarizeRecord(item, ["id", "entry_time", "agent", "action", "object_repr", "user"])}`)
|
|
82
|
+
].join("\n");
|
|
83
|
+
return makeToolResponse(data, formatResponse(params.response_format, data, markdown));
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const data = { error: formatApiError(error) };
|
|
87
|
+
return makeToolResponse(data, data.error, true);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { TacticalRmmClient } from "../services/tacticalrmm-client.js";
|
|
3
|
+
export declare function registerMonitoringTools(server: McpServer, client: TacticalRmmClient): void;
|
|
4
|
+
//# sourceMappingURL=monitoring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitoring.d.ts","sourceRoot":"","sources":["../../src/tools/monitoring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAM3E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAuE1F"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { AgentResourceSchema, CheckHistorySchema, ListResourcesSchema } from "../schemas/resources.js";
|
|
2
|
+
import { formatApiError } from "../services/errors.js";
|
|
3
|
+
import { formatResponse, makeToolResponse, paginate, summarizeRecord } from "./format.js";
|
|
4
|
+
import { extractItems, registerCollectionReadTool } from "./read-tools.js";
|
|
5
|
+
export function registerMonitoringTools(server, client) {
|
|
6
|
+
registerCollectionReadTool(server, client, {
|
|
7
|
+
name: "tacticalrmm_list_alerts",
|
|
8
|
+
title: "List TacticalRMM Alerts",
|
|
9
|
+
description: "List TacticalRMM alerts from /alerts/. This tool is read-only; TacticalRMM expects a PATCH query for alert filters.",
|
|
10
|
+
inputSchema: ListResourcesSchema.shape,
|
|
11
|
+
path: () => "/alerts/",
|
|
12
|
+
method: "query",
|
|
13
|
+
body: () => ({}),
|
|
14
|
+
preferredFields: ["id", "alert_type", "severity", "hostname", "agent_hostname", "message", "status"],
|
|
15
|
+
heading: "TacticalRMM Alerts"
|
|
16
|
+
});
|
|
17
|
+
registerCollectionReadTool(server, client, {
|
|
18
|
+
name: "tacticalrmm_list_checks",
|
|
19
|
+
title: "List TacticalRMM Checks",
|
|
20
|
+
description: "List TacticalRMM checks from /checks/. This tool is read-only.",
|
|
21
|
+
inputSchema: ListResourcesSchema.shape,
|
|
22
|
+
path: () => "/checks/",
|
|
23
|
+
preferredFields: ["id", "name", "check_type", "status", "agent", "agent_hostname"],
|
|
24
|
+
heading: "TacticalRMM Checks"
|
|
25
|
+
});
|
|
26
|
+
registerCollectionReadTool(server, client, {
|
|
27
|
+
name: "tacticalrmm_list_agent_checks",
|
|
28
|
+
title: "List TacticalRMM Agent Checks",
|
|
29
|
+
description: "List checks assigned to one TacticalRMM agent from /agents/<agent_id>/checks/. This tool is read-only.",
|
|
30
|
+
inputSchema: AgentResourceSchema.shape,
|
|
31
|
+
path: (params) => `/agents/${encodeURIComponent(String(params.agent_id))}/checks/`,
|
|
32
|
+
preferredFields: ["id", "name", "check_type", "status", "last_run"],
|
|
33
|
+
heading: "TacticalRMM Agent Checks"
|
|
34
|
+
});
|
|
35
|
+
server.registerTool("tacticalrmm_get_check_history", {
|
|
36
|
+
title: "Get TacticalRMM Check History",
|
|
37
|
+
description: "Read history for one TacticalRMM check from /checks/<check_id>/history/. This tool is read-only.",
|
|
38
|
+
inputSchema: CheckHistorySchema.shape,
|
|
39
|
+
annotations: {
|
|
40
|
+
readOnlyHint: true,
|
|
41
|
+
destructiveHint: false,
|
|
42
|
+
idempotentHint: true,
|
|
43
|
+
openWorldHint: true
|
|
44
|
+
}
|
|
45
|
+
}, async ({ check_id, limit, offset, response_format }) => {
|
|
46
|
+
try {
|
|
47
|
+
const raw = await client.query(`/checks/${encodeURIComponent(String(check_id))}/history/`, {
|
|
48
|
+
timeFilter: 0
|
|
49
|
+
});
|
|
50
|
+
const history = extractItems(raw);
|
|
51
|
+
const data = {
|
|
52
|
+
check_id,
|
|
53
|
+
...paginate(history, limit, offset)
|
|
54
|
+
};
|
|
55
|
+
const markdown = [
|
|
56
|
+
"# TacticalRMM Check History",
|
|
57
|
+
"",
|
|
58
|
+
`Showing ${data.count} of ${data.total} history records for check ${check_id}.`,
|
|
59
|
+
"",
|
|
60
|
+
...data.items.map((item) => `- ${summarizeRecord(item, ["id", "status", "output", "created", "entry_time", "timestamp"])}`)
|
|
61
|
+
].join("\n");
|
|
62
|
+
return makeToolResponse(data, formatResponse(response_format, data, markdown));
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const data = { error: formatApiError(error) };
|
|
66
|
+
return makeToolResponse(data, data.error, true);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=monitoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitoring.js","sourceRoot":"","sources":["../../src/tools/monitoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
import type { TacticalRmmClient } from "../services/tacticalrmm-client.js";
|
|
4
|
+
type ToolParams = Record<string, unknown>;
|
|
5
|
+
type CollectionReadOptions = {
|
|
6
|
+
name: string;
|
|
7
|
+
title: string;
|
|
8
|
+
description: string;
|
|
9
|
+
inputSchema: Record<string, z.ZodTypeAny>;
|
|
10
|
+
path: (params: ToolParams) => string;
|
|
11
|
+
query?: (params: ToolParams) => Record<string, unknown> | undefined;
|
|
12
|
+
body?: (params: ToolParams) => Record<string, unknown> | undefined;
|
|
13
|
+
method?: "get" | "query";
|
|
14
|
+
preferredFields: string[];
|
|
15
|
+
heading: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function registerCollectionReadTool(server: McpServer, client: TacticalRmmClient, options: CollectionReadOptions): void;
|
|
18
|
+
export declare function extractItems(raw: unknown): unknown[];
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=read-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-tools.d.ts","sourceRoot":"","sources":["../../src/tools/read-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAK3E,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,KAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC;IACrC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACpE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACnE,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAQF,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,qBAAqB,GAC7B,IAAI,CAqCN;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,EAAE,CAepD"}
|