@aristanetworks/eos-mcp-server 0.6.1-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/LICENSE +203 -0
- package/README.md +652 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.js +188 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/printServerInfo.d.ts +2 -0
- package/dist/commands/printServerInfo.js +14 -0
- package/dist/commands/printServerInfo.js.map +1 -0
- package/dist/commands/probe.d.ts +2 -0
- package/dist/commands/probe.js +26 -0
- package/dist/commands/probe.js.map +1 -0
- package/dist/commands/validateInventory.d.ts +9 -0
- package/dist/commands/validateInventory.js +59 -0
- package/dist/commands/validateInventory.js.map +1 -0
- package/dist/config/loadConfig.d.ts +3 -0
- package/dist/config/loadConfig.js +84 -0
- package/dist/config/loadConfig.js.map +1 -0
- package/dist/config/schema.d.ts +151 -0
- package/dist/config/schema.js +54 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/configuration/getRunningConfig.d.ts +24 -0
- package/dist/configuration/getRunningConfig.js +38 -0
- package/dist/configuration/getRunningConfig.js.map +1 -0
- package/dist/connection/eosDeviceReader.d.ts +18 -0
- package/dist/connection/eosDeviceReader.js +13 -0
- package/dist/connection/eosDeviceReader.js.map +1 -0
- package/dist/connection/resolveConnection.d.ts +4 -0
- package/dist/connection/resolveConnection.js +58 -0
- package/dist/connection/resolveConnection.js.map +1 -0
- package/dist/connection/validateStartupConnections.d.ts +4 -0
- package/dist/connection/validateStartupConnections.js +28 -0
- package/dist/connection/validateStartupConnections.js.map +1 -0
- package/dist/core/errors.d.ts +8 -0
- package/dist/core/errors.js +22 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/version.d.ts +2 -0
- package/dist/core/version.js +7 -0
- package/dist/core/version.js.map +1 -0
- package/dist/eapi/client.d.ts +8 -0
- package/dist/eapi/client.js +159 -0
- package/dist/eapi/client.js.map +1 -0
- package/dist/eapi/commands.d.ts +2 -0
- package/dist/eapi/commands.js +25 -0
- package/dist/eapi/commands.js.map +1 -0
- package/dist/eapi/transport.d.ts +21 -0
- package/dist/eapi/transport.js +143 -0
- package/dist/eapi/transport.js.map +1 -0
- package/dist/eapi/types.d.ts +49 -0
- package/dist/eapi/types.js +15 -0
- package/dist/eapi/types.js.map +1 -0
- package/dist/facts/getFacts.d.ts +33 -0
- package/dist/facts/getFacts.js +50 -0
- package/dist/facts/getFacts.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/inventory/buildModel.d.ts +3 -0
- package/dist/inventory/buildModel.js +79 -0
- package/dist/inventory/buildModel.js.map +1 -0
- package/dist/inventory/effectiveVars.d.ts +2 -0
- package/dist/inventory/effectiveVars.js +52 -0
- package/dist/inventory/effectiveVars.js.map +1 -0
- package/dist/inventory/graph.d.ts +6 -0
- package/dist/inventory/graph.js +81 -0
- package/dist/inventory/graph.js.map +1 -0
- package/dist/inventory/internalTypes.d.ts +17 -0
- package/dist/inventory/internalTypes.js +2 -0
- package/dist/inventory/internalTypes.js.map +1 -0
- package/dist/inventory/internalUtils.d.ts +10 -0
- package/dist/inventory/internalUtils.js +68 -0
- package/dist/inventory/internalUtils.js.map +1 -0
- package/dist/inventory/listInventoryView.d.ts +23 -0
- package/dist/inventory/listInventoryView.js +22 -0
- package/dist/inventory/listInventoryView.js.map +1 -0
- package/dist/inventory/loadInventory.d.ts +4 -0
- package/dist/inventory/loadInventory.js +87 -0
- package/dist/inventory/loadInventory.js.map +1 -0
- package/dist/inventory/normalize.d.ts +4 -0
- package/dist/inventory/normalize.js +251 -0
- package/dist/inventory/normalize.js.map +1 -0
- package/dist/inventory/parse.d.ts +6 -0
- package/dist/inventory/parse.js +31 -0
- package/dist/inventory/parse.js.map +1 -0
- package/dist/inventory/policy.d.ts +11 -0
- package/dist/inventory/policy.js +27 -0
- package/dist/inventory/policy.js.map +1 -0
- package/dist/inventory/resolveTarget.d.ts +14 -0
- package/dist/inventory/resolveTarget.js +55 -0
- package/dist/inventory/resolveTarget.js.map +1 -0
- package/dist/inventory/types.d.ts +50 -0
- package/dist/inventory/types.js +2 -0
- package/dist/inventory/types.js.map +1 -0
- package/dist/inventory/validateNormalized.d.ts +2 -0
- package/dist/inventory/validateNormalized.js +64 -0
- package/dist/inventory/validateNormalized.js.map +1 -0
- package/dist/inventory/varValidation.d.ts +2 -0
- package/dist/inventory/varValidation.js +60 -0
- package/dist/inventory/varValidation.js.map +1 -0
- package/dist/inventory/writePolicy.d.ts +2 -0
- package/dist/inventory/writePolicy.js +36 -0
- package/dist/inventory/writePolicy.js.map +1 -0
- package/dist/logging/loggingQuery.d.ts +15 -0
- package/dist/logging/loggingQuery.js +38 -0
- package/dist/logging/loggingQuery.js.map +1 -0
- package/dist/logging/showLogging.d.ts +28 -0
- package/dist/logging/showLogging.js +37 -0
- package/dist/logging/showLogging.js.map +1 -0
- package/dist/mcp/createServer.d.ts +3 -0
- package/dist/mcp/createServer.js +82 -0
- package/dist/mcp/createServer.js.map +1 -0
- package/dist/mcp/toolResult.d.ts +7 -0
- package/dist/mcp/toolResult.js +13 -0
- package/dist/mcp/toolResult.js.map +1 -0
- package/dist/mcp/tools/getFacts.d.ts +21 -0
- package/dist/mcp/tools/getFacts.js +17 -0
- package/dist/mcp/tools/getFacts.js.map +1 -0
- package/dist/mcp/tools/getRunningConfig.d.ts +21 -0
- package/dist/mcp/tools/getRunningConfig.js +17 -0
- package/dist/mcp/tools/getRunningConfig.js.map +1 -0
- package/dist/mcp/tools/getServerInfo.d.ts +10 -0
- package/dist/mcp/tools/getServerInfo.js +9 -0
- package/dist/mcp/tools/getServerInfo.js.map +1 -0
- package/dist/mcp/tools/listInventory.d.ts +16 -0
- package/dist/mcp/tools/listInventory.js +15 -0
- package/dist/mcp/tools/listInventory.js.map +1 -0
- package/dist/mcp/tools/probeDevices.d.ts +21 -0
- package/dist/mcp/tools/probeDevices.js +14 -0
- package/dist/mcp/tools/probeDevices.js.map +1 -0
- package/dist/mcp/tools/runShow.d.ts +30 -0
- package/dist/mcp/tools/runShow.js +34 -0
- package/dist/mcp/tools/runShow.js.map +1 -0
- package/dist/mcp/tools/showLogging.d.ts +24 -0
- package/dist/mcp/tools/showLogging.js +20 -0
- package/dist/mcp/tools/showLogging.js.map +1 -0
- package/dist/operations/readExecution.d.ts +57 -0
- package/dist/operations/readExecution.js +132 -0
- package/dist/operations/readExecution.js.map +1 -0
- package/dist/probe/probeDevices.d.ts +24 -0
- package/dist/probe/probeDevices.js +24 -0
- package/dist/probe/probeDevices.js.map +1 -0
- package/dist/serverInfo/buildServerInfo.d.ts +2 -0
- package/dist/serverInfo/buildServerInfo.js +49 -0
- package/dist/serverInfo/buildServerInfo.js.map +1 -0
- package/dist/serverInfo/types.d.ts +46 -0
- package/dist/serverInfo/types.js +2 -0
- package/dist/serverInfo/types.js.map +1 -0
- package/dist/show/runShow.d.ts +29 -0
- package/dist/show/runShow.js +40 -0
- package/dist/show/runShow.js.map +1 -0
- package/dist/utils/json.d.ts +1 -0
- package/dist/utils/json.js +4 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/path.d.ts +2 -0
- package/dist/utils/path.js +14 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/value.d.ts +6 -0
- package/dist/utils/value.js +28 -0
- package/dist/utils/value.js.map +1 -0
- package/docs/CHECKPOINT.md +46 -0
- package/docs/CODE_WALKTHROUGH.md +112 -0
- package/docs/DESIGN.md +56 -0
- package/docs/DEVELOPMENT.md +72 -0
- package/docs/EXAMPLES.md +178 -0
- package/docs/IMPLEMENTATION_PLAN.md +32 -0
- package/docs/QUICKSTART.md +152 -0
- package/example-inventories/canonical-fabric.yaml +45 -0
- package/example-inventories/multi-password.yaml +35 -0
- package/example-inventories/simplified-lab.yaml +33 -0
- package/package.json +57 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { AppError } from "../core/errors.js";
|
|
2
|
+
export class InventoryResolutionError extends AppError {
|
|
3
|
+
constructor(code, message) {
|
|
4
|
+
super(code, message);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export function resolveInventoryTarget(model, options) {
|
|
8
|
+
const { target } = options;
|
|
9
|
+
const directHost = model.hostMap.get(target);
|
|
10
|
+
if (directHost) {
|
|
11
|
+
validateHostsForOperation([directHost], target);
|
|
12
|
+
return {
|
|
13
|
+
target,
|
|
14
|
+
targetType: "host",
|
|
15
|
+
resolvedHosts: [directHost]
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const group = model.groupMap.get(target);
|
|
19
|
+
if (!group) {
|
|
20
|
+
throw new InventoryResolutionError("target_not_found", `Unknown inventory target ${target}`);
|
|
21
|
+
}
|
|
22
|
+
const resolvedHosts = group.resolvedHosts.map((hostName) => {
|
|
23
|
+
const host = model.hostMap.get(hostName);
|
|
24
|
+
if (!host) {
|
|
25
|
+
throw new InventoryResolutionError("target_resolution_failed", `Resolved host ${hostName} is missing from inventory host map`);
|
|
26
|
+
}
|
|
27
|
+
return host;
|
|
28
|
+
});
|
|
29
|
+
validateHostsForOperation(resolvedHosts, target);
|
|
30
|
+
return {
|
|
31
|
+
target,
|
|
32
|
+
targetType: "group",
|
|
33
|
+
resolvedHosts
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function validateHostsForOperation(hosts, target) {
|
|
37
|
+
if (hosts.length === 0) {
|
|
38
|
+
throw new InventoryResolutionError("no_eligible_targets", `Target ${target} resolved to zero hosts`);
|
|
39
|
+
}
|
|
40
|
+
const deniedHosts = [];
|
|
41
|
+
for (const host of hosts) {
|
|
42
|
+
if (!host.eligible) {
|
|
43
|
+
deniedHosts.push(host.inventoryHostname);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (!host.readAllowed) {
|
|
47
|
+
deniedHosts.push(host.inventoryHostname);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (deniedHosts.length > 0) {
|
|
52
|
+
throw new InventoryResolutionError("policy_denied", `Policy denied: target ${target} includes host(s) not permitted for read operations: ${deniedHosts.sort().join(", ")}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=resolveTarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveTarget.js","sourceRoot":"","sources":["../../src/inventory/resolveTarget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAa7C,MAAM,OAAO,wBAAyB,SAAQ,QAAQ;IACpD,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvB,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAqB,EACrB,OAAsC;IAEtC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,UAAU,EAAE,CAAC;QACf,yBAAyB,CAAC,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO;YACL,MAAM;YACN,UAAU,EAAE,MAAM;YAClB,aAAa,EAAE,CAAC,UAAU,CAAC;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,wBAAwB,CAAC,kBAAkB,EAAE,4BAA4B,MAAM,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,wBAAwB,CAAC,0BAA0B,EAAE,iBAAiB,QAAQ,qCAAqC,CAAC,CAAC;QACjI,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,yBAAyB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAEjD,OAAO;QACL,MAAM;QACN,UAAU,EAAE,OAAO;QACnB,aAAa;KACd,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,KAA2B,EAC3B,MAAc;IAEd,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,wBAAwB,CAAC,qBAAqB,EAAE,UAAU,MAAM,yBAAyB,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACzC,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACzC,SAAS;QACX,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,wBAAwB,CAChC,eAAe,EACf,yBAAyB,MAAM,wDAAwD,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvH,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type InventorySchemaKind = "canonical-ansible-yaml" | "simplified-yaml";
|
|
2
|
+
export interface InventorySummary {
|
|
3
|
+
path: string;
|
|
4
|
+
basename: string;
|
|
5
|
+
schemaKind: InventorySchemaKind;
|
|
6
|
+
totalHostCount: number;
|
|
7
|
+
totalGroupCount: number;
|
|
8
|
+
eosEligibleHostCount: number | null;
|
|
9
|
+
readAllowedHostCount: number | null;
|
|
10
|
+
}
|
|
11
|
+
export interface InventoryValidationError {
|
|
12
|
+
code: string;
|
|
13
|
+
message: string;
|
|
14
|
+
path?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface InventoryValidationResult {
|
|
17
|
+
ok: boolean;
|
|
18
|
+
schemaKind?: InventorySchemaKind;
|
|
19
|
+
summary?: InventorySummary;
|
|
20
|
+
errors: InventoryValidationError[];
|
|
21
|
+
notes: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface InventoryHostModel {
|
|
24
|
+
inventoryHostname: string;
|
|
25
|
+
resolvedEndpoint: string;
|
|
26
|
+
effectiveVars: Record<string, unknown>;
|
|
27
|
+
eligible: boolean;
|
|
28
|
+
readAllowed: boolean;
|
|
29
|
+
ineligibilityReasons: string[];
|
|
30
|
+
groupMemberships: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface InventoryGroupModel {
|
|
33
|
+
name: string;
|
|
34
|
+
hosts: string[];
|
|
35
|
+
children: string[];
|
|
36
|
+
resolvedHosts: string[];
|
|
37
|
+
eligibleHostCount: number;
|
|
38
|
+
ineligibleHostCount: number;
|
|
39
|
+
actionable: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface InventoryModel {
|
|
42
|
+
path: string;
|
|
43
|
+
basename: string;
|
|
44
|
+
schemaKind: InventorySchemaKind;
|
|
45
|
+
summary: InventorySummary;
|
|
46
|
+
hosts: InventoryHostModel[];
|
|
47
|
+
groups: InventoryGroupModel[];
|
|
48
|
+
hostMap: Map<string, InventoryHostModel>;
|
|
49
|
+
groupMap: Map<string, InventoryGroupModel>;
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/inventory/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { validateSafeName } from "./internalUtils.js";
|
|
2
|
+
export function validateNormalizedInventory(inventory, context) {
|
|
3
|
+
validateGroupReferences(inventory, context);
|
|
4
|
+
validateGroupGraph(inventory, context);
|
|
5
|
+
}
|
|
6
|
+
function validateGroupReferences(inventory, context) {
|
|
7
|
+
for (const group of inventory.groups.values()) {
|
|
8
|
+
for (const hostName of group.hosts) {
|
|
9
|
+
validateSafeName(hostName, "host", context, `groups.${group.name}.hosts`);
|
|
10
|
+
if (!inventory.hosts.has(hostName)) {
|
|
11
|
+
context.errors.push({
|
|
12
|
+
code: "inventory_group_host_missing",
|
|
13
|
+
message: `Group ${group.name} references unknown host ${hostName}`,
|
|
14
|
+
path: `groups.${group.name}.hosts`
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
for (const childName of group.children) {
|
|
19
|
+
validateSafeName(childName, "group", context, `groups.${group.name}.children`);
|
|
20
|
+
if (!inventory.groups.has(childName)) {
|
|
21
|
+
context.errors.push({
|
|
22
|
+
code: "inventory_group_child_missing",
|
|
23
|
+
message: `Group ${group.name} references unknown child group ${childName}`,
|
|
24
|
+
path: `groups.${group.name}.children`
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function validateGroupGraph(inventory, context) {
|
|
31
|
+
const visited = new Set();
|
|
32
|
+
const inStack = new Set();
|
|
33
|
+
const stack = [];
|
|
34
|
+
for (const groupName of inventory.groups.keys()) {
|
|
35
|
+
visit(groupName);
|
|
36
|
+
}
|
|
37
|
+
function visit(groupName) {
|
|
38
|
+
if (visited.has(groupName)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (inStack.has(groupName)) {
|
|
42
|
+
const cycleStart = stack.indexOf(groupName);
|
|
43
|
+
const cyclePath = [...stack.slice(cycleStart), groupName].join(" -> ");
|
|
44
|
+
context.errors.push({
|
|
45
|
+
code: "inventory_group_cycle",
|
|
46
|
+
message: `Inventory group graph contains a cycle: ${cyclePath}`,
|
|
47
|
+
path: groupName
|
|
48
|
+
});
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
inStack.add(groupName);
|
|
52
|
+
stack.push(groupName);
|
|
53
|
+
const group = inventory.groups.get(groupName);
|
|
54
|
+
for (const child of group?.children ?? []) {
|
|
55
|
+
if (inventory.groups.has(child)) {
|
|
56
|
+
visit(child);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
stack.pop();
|
|
60
|
+
inStack.delete(groupName);
|
|
61
|
+
visited.add(groupName);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=validateNormalized.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateNormalized.js","sourceRoot":"","sources":["../../src/inventory/validateNormalized.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const BOOLEAN_VAR_KEYS = new Set([
|
|
2
|
+
"mcp_read_allowed",
|
|
3
|
+
"mcp_validate_certs",
|
|
4
|
+
"ansible_httpapi_validate_certs"
|
|
5
|
+
]);
|
|
6
|
+
const NON_EMPTY_STRING_VAR_KEYS = new Set([
|
|
7
|
+
"ansible_host",
|
|
8
|
+
"ansible_user",
|
|
9
|
+
"ansible_network_os",
|
|
10
|
+
"mcp_platform",
|
|
11
|
+
"mcp_password_env",
|
|
12
|
+
"ansible_password"
|
|
13
|
+
]);
|
|
14
|
+
const POSITIVE_INTEGER_VAR_KEYS = new Set(["ansible_httpapi_port"]);
|
|
15
|
+
export function validateKnownInventoryVarTypes(inventory, context) {
|
|
16
|
+
validateVarSet(inventory.globalVars, "vars", context);
|
|
17
|
+
for (const group of inventory.groups.values()) {
|
|
18
|
+
validateVarSet(group.vars, `groups.${group.name}.vars`, context);
|
|
19
|
+
}
|
|
20
|
+
for (const [hostName, hostVars] of inventory.hosts.entries()) {
|
|
21
|
+
validateVarSet(hostVars, `hosts.${hostName}`, context);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function validateVarSet(vars, pathLabel, context) {
|
|
25
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
26
|
+
const valuePath = `${pathLabel}.${key}`;
|
|
27
|
+
if (BOOLEAN_VAR_KEYS.has(key) && typeof value !== "boolean") {
|
|
28
|
+
addTypeError(context, valuePath, key, value, "a boolean");
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (NON_EMPTY_STRING_VAR_KEYS.has(key) && !isNonEmptyString(value)) {
|
|
32
|
+
addTypeError(context, valuePath, key, value, "a non-empty string");
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (POSITIVE_INTEGER_VAR_KEYS.has(key) && !isPositiveIntegerLike(value)) {
|
|
36
|
+
addTypeError(context, valuePath, key, value, "a positive integer or positive integer string");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function isNonEmptyString(value) {
|
|
41
|
+
return typeof value === "string" && value.length > 0;
|
|
42
|
+
}
|
|
43
|
+
function isPositiveIntegerLike(value) {
|
|
44
|
+
if (typeof value === "number") {
|
|
45
|
+
return Number.isInteger(value) && value > 0;
|
|
46
|
+
}
|
|
47
|
+
if (typeof value === "string" && value.length > 0) {
|
|
48
|
+
const parsed = Number(value);
|
|
49
|
+
return Number.isInteger(parsed) && parsed > 0;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
function addTypeError(context, path, key, value, expected) {
|
|
54
|
+
context.errors.push({
|
|
55
|
+
code: "inventory_var_type_invalid",
|
|
56
|
+
message: `${path} must be ${expected}; got ${key}=${JSON.stringify(value)}`,
|
|
57
|
+
path
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=varValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"varValidation.js","sourceRoot":"","sources":["../../src/inventory/varValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import type { InventoryVars, NormalizedInventory, ValidationContext } from "./internalTypes.js";
|
|
2
|
+
export declare function validateWritePolicyContradictions(hostName: string, globalVars: InventoryVars, lineageGroups: Set<string>, hostVars: InventoryVars, inventory: NormalizedInventory, groupDepths: Map<string, number>, context: ValidationContext): void;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { readBoolean } from "../utils/value.js";
|
|
2
|
+
export function validateWritePolicyContradictions(hostName, globalVars, lineageGroups, hostVars, inventory, groupDepths, context) {
|
|
3
|
+
const falseDepths = [];
|
|
4
|
+
const globalWrite = readBoolean(globalVars.mcp_write_allowed);
|
|
5
|
+
if (globalWrite === false) {
|
|
6
|
+
falseDepths.push(0);
|
|
7
|
+
}
|
|
8
|
+
for (const groupName of lineageGroups) {
|
|
9
|
+
const groupWrite = readBoolean(inventory.groups.get(groupName)?.vars.mcp_write_allowed);
|
|
10
|
+
if (groupWrite === false) {
|
|
11
|
+
falseDepths.push(groupDepths.get(groupName) ?? 1);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
if (falseDepths.length === 0) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (readBoolean(hostVars.mcp_write_allowed) === true) {
|
|
18
|
+
context.errors.push({
|
|
19
|
+
code: "inventory_write_policy_contradiction",
|
|
20
|
+
message: `Host ${hostName} sets mcp_write_allowed=true beneath an inherited false`,
|
|
21
|
+
path: hostName
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
for (const groupName of lineageGroups) {
|
|
25
|
+
const groupWrite = readBoolean(inventory.groups.get(groupName)?.vars.mcp_write_allowed);
|
|
26
|
+
const depth = groupDepths.get(groupName) ?? 1;
|
|
27
|
+
if (groupWrite === true && falseDepths.some((falseDepth) => falseDepth < depth)) {
|
|
28
|
+
context.errors.push({
|
|
29
|
+
code: "inventory_write_policy_contradiction",
|
|
30
|
+
message: `Host ${hostName} inherits mcp_write_allowed=true in group ${groupName} beneath an inherited false`,
|
|
31
|
+
path: hostName
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=writePolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writePolicy.js","sourceRoot":"","sources":["../../src/inventory/writePolicy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,UAAU,iCAAiC,CAC/C,QAAgB,EAChB,UAAyB,EACzB,aAA0B,EAC1B,QAAuB,EACvB,SAA8B,EAC9B,WAAgC,EAChC,OAA0B;IAE1B,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAC9D,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QAC1B,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACxF,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,IAAI,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE,CAAC;QACrD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YAClB,IAAI,EAAE,sCAAsC;YAC5C,OAAO,EAAE,QAAQ,QAAQ,yDAAyD;YAClF,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAE9C,IAAI,UAAU,KAAK,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC;YAChF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;gBAClB,IAAI,EAAE,sCAAsC;gBAC5C,OAAO,EAAE,QAAQ,QAAQ,6CAA6C,SAAS,6BAA6B;gBAC5G,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const LOGGING_SEVERITIES: readonly ["emergencies", "alerts", "critical", "errors", "warnings", "notifications", "informational", "debugging"];
|
|
2
|
+
export type LoggingSeverity = (typeof LOGGING_SEVERITIES)[number];
|
|
3
|
+
export interface BuildLoggingQueryOptions {
|
|
4
|
+
minimumSeverity?: string;
|
|
5
|
+
messageCount?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface BuildLoggingQueryLimits {
|
|
8
|
+
maxMessageCount: number;
|
|
9
|
+
}
|
|
10
|
+
export interface LoggingQuery {
|
|
11
|
+
minimumSeverity: LoggingSeverity;
|
|
12
|
+
messageCount: number;
|
|
13
|
+
command: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function buildLoggingQuery(options: BuildLoggingQueryOptions, limits: BuildLoggingQueryLimits): LoggingQuery;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { AppError } from "../core/errors.js";
|
|
2
|
+
export const LOGGING_SEVERITIES = [
|
|
3
|
+
"emergencies",
|
|
4
|
+
"alerts",
|
|
5
|
+
"critical",
|
|
6
|
+
"errors",
|
|
7
|
+
"warnings",
|
|
8
|
+
"notifications",
|
|
9
|
+
"informational",
|
|
10
|
+
"debugging"
|
|
11
|
+
];
|
|
12
|
+
const DEFAULT_LOGGING_MESSAGE_COUNT = 100;
|
|
13
|
+
const EOS_MAX_LOGGING_MESSAGE_COUNT = 9999;
|
|
14
|
+
export function buildLoggingQuery(options, limits) {
|
|
15
|
+
const minimumSeverity = normalizeLoggingSeverity(options.minimumSeverity ?? "warnings");
|
|
16
|
+
const messageCount = normalizeMessageCount(limits.maxMessageCount, options.messageCount ?? DEFAULT_LOGGING_MESSAGE_COUNT);
|
|
17
|
+
return {
|
|
18
|
+
minimumSeverity,
|
|
19
|
+
messageCount,
|
|
20
|
+
command: `show logging threshold ${minimumSeverity} ${messageCount}`
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function normalizeLoggingSeverity(severity) {
|
|
24
|
+
if (LOGGING_SEVERITIES.includes(severity)) {
|
|
25
|
+
return severity;
|
|
26
|
+
}
|
|
27
|
+
throw new AppError("logging_severity_invalid", `Unsupported logging severity: ${severity}`);
|
|
28
|
+
}
|
|
29
|
+
function normalizeMessageCount(maxMessageCount, messageCount) {
|
|
30
|
+
if (!Number.isInteger(messageCount) || messageCount < 1 || messageCount > EOS_MAX_LOGGING_MESSAGE_COUNT) {
|
|
31
|
+
throw new AppError("logging_message_count_invalid", `Logging message_count must be an integer from 1 to ${EOS_MAX_LOGGING_MESSAGE_COUNT}`);
|
|
32
|
+
}
|
|
33
|
+
if (messageCount > maxMessageCount) {
|
|
34
|
+
throw new AppError("logging_message_count_limit_exceeded", `Logging message_count ${messageCount} exceeds configured maxLoggingMessagesPerRequest ${maxMessageCount}`);
|
|
35
|
+
}
|
|
36
|
+
return messageCount;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=loggingQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loggingQuery.js","sourceRoot":"","sources":["../../src/logging/loggingQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,aAAa;IACb,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,UAAU;IACV,eAAe;IACf,eAAe;IACf,WAAW;CACH,CAAC;AAIX,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAC1C,MAAM,6BAA6B,GAAG,IAAI,CAAC;AAiB3C,MAAM,UAAU,iBAAiB,CAAC,OAAiC,EAAE,MAA+B;IAClG,MAAM,eAAe,GAAG,wBAAwB,CAAC,OAAO,CAAC,eAAe,IAAI,UAAU,CAAC,CAAC;IACxF,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,YAAY,IAAI,6BAA6B,CAAC,CAAC;IAE1H,OAAO;QACL,eAAe;QACf,YAAY;QACZ,OAAO,EAAE,0BAA0B,eAAe,IAAI,YAAY,EAAE;KACrE,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAgB;IAChD,IAAK,kBAAwC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjE,OAAO,QAA2B,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,QAAQ,CAAC,0BAA0B,EAAE,iCAAiC,QAAQ,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,qBAAqB,CAAC,eAAuB,EAAE,YAAoB;IAC1E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,6BAA6B,EAAE,CAAC;QACxG,MAAM,IAAI,QAAQ,CAChB,+BAA+B,EAC/B,sDAAsD,6BAA6B,EAAE,CACtF,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,GAAG,eAAe,EAAE,CAAC;QACnC,MAAM,IAAI,QAAQ,CAChB,sCAAsC,EACtC,yBAAyB,YAAY,oDAAoD,eAAe,EAAE,CAC3G,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ResolvedServerConfig } from "../config/schema.js";
|
|
2
|
+
import type { EosDeviceReader } from "../connection/eosDeviceReader.js";
|
|
3
|
+
import type { InventoryModel } from "../inventory/types.js";
|
|
4
|
+
import { type LoggingSeverity } from "./loggingQuery.js";
|
|
5
|
+
import { type DeviceResultSummary } from "../operations/readExecution.js";
|
|
6
|
+
export interface ShowLoggingOptions {
|
|
7
|
+
target: string;
|
|
8
|
+
minimumSeverity?: LoggingSeverity;
|
|
9
|
+
messageCount?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface ShowLoggingResult {
|
|
12
|
+
target: string;
|
|
13
|
+
target_type: "host" | "group";
|
|
14
|
+
minimum_severity: LoggingSeverity;
|
|
15
|
+
message_count: number;
|
|
16
|
+
resolved_devices: string[];
|
|
17
|
+
summary: DeviceResultSummary;
|
|
18
|
+
results: Array<{
|
|
19
|
+
inventory_hostname: string;
|
|
20
|
+
resolved_endpoint: string;
|
|
21
|
+
status: "success" | "failed";
|
|
22
|
+
command?: string;
|
|
23
|
+
log_text?: string;
|
|
24
|
+
error_code?: string;
|
|
25
|
+
message?: string;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
28
|
+
export declare function showLogging(model: InventoryModel, config: ResolvedServerConfig, options: ShowLoggingOptions, reader: EosDeviceReader): Promise<ShowLoggingResult>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { AppError } from "../core/errors.js";
|
|
2
|
+
import { buildLoggingQuery } from "./loggingQuery.js";
|
|
3
|
+
import { buildReadDeviceFailure, buildReadDeviceSuccess, buildReadOperationResultEnvelope, executeReadOperation } from "../operations/readExecution.js";
|
|
4
|
+
export async function showLogging(model, config, options, reader) {
|
|
5
|
+
const query = buildLoggingQuery({
|
|
6
|
+
...(options.minimumSeverity !== undefined ? { minimumSeverity: options.minimumSeverity } : {}),
|
|
7
|
+
...(options.messageCount !== undefined ? { messageCount: options.messageCount } : {})
|
|
8
|
+
}, { maxMessageCount: config.maxLoggingMessagesPerRequest });
|
|
9
|
+
const operation = await executeReadOperation(model, config, {
|
|
10
|
+
target: options.target,
|
|
11
|
+
operationName: "eos_show_logging",
|
|
12
|
+
run: async (host, signal) => buildReadDeviceSuccess(host, {
|
|
13
|
+
command: query.command,
|
|
14
|
+
log_text: extractLogText(await reader.runShowCommands(host, [query.command], "text", { signal }))
|
|
15
|
+
}),
|
|
16
|
+
onError: (host, error) => buildReadDeviceFailure(host, "logging_failed", error)
|
|
17
|
+
});
|
|
18
|
+
return buildReadOperationResultEnvelope(options.target, operation, {
|
|
19
|
+
extra: {
|
|
20
|
+
minimum_severity: query.minimumSeverity,
|
|
21
|
+
message_count: query.messageCount
|
|
22
|
+
},
|
|
23
|
+
responseSizeLimit: {
|
|
24
|
+
config,
|
|
25
|
+
operationName: "eos_show_logging",
|
|
26
|
+
narrowingGuidance: "Reduce message_count, target fewer devices, or raise minimum_severity to return fewer log lines."
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function extractLogText(commandResults) {
|
|
31
|
+
const first = commandResults[0]?.output;
|
|
32
|
+
if (typeof first === "string") {
|
|
33
|
+
return first;
|
|
34
|
+
}
|
|
35
|
+
throw new AppError("logging_payload_invalid", "Unexpected logging payload structure");
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=showLogging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"showLogging.js","sourceRoot":"","sources":["../../src/logging/showLogging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK7C,OAAO,EAAE,iBAAiB,EAAwB,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,gCAAgC,EAChC,oBAAoB,EAErB,MAAM,gCAAgC,CAAC;AA0BxC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAqB,EACrB,MAA4B,EAC5B,OAA2B,EAC3B,MAAuB;IAEvB,MAAM,KAAK,GAAG,iBAAiB,CAC7B;QACE,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtF,EACD,EAAE,eAAe,EAAE,MAAM,CAAC,4BAA4B,EAAE,CACzD,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,oBAAoB,CAAuC,KAAK,EAAE,MAAM,EAAE;QAChG,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,aAAa,EAAE,kBAAkB;QACjC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAC1B,sBAAsB,CAAC,IAAI,EAAE;YAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,QAAQ,EAAE,cAAc,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;SAClG,CAAC;QACJ,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,CAAC;KAChF,CAAC,CAAC;IAEH,OAAO,gCAAgC,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE;QACjE,KAAK,EAAE;YACL,gBAAgB,EAAE,KAAK,CAAC,eAAe;YACvC,aAAa,EAAE,KAAK,CAAC,YAAY;SAClC;QACD,iBAAiB,EAAE;YACjB,MAAM;YACN,aAAa,EAAE,kBAAkB;YACjC,iBAAiB,EAAE,kGAAkG;SACtH;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,cAAkC;IACxD,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IAExC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,sCAAsC,CAAC,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { EapiDeviceReader } from "../connection/eosDeviceReader.js";
|
|
5
|
+
import { APP_NAME, APP_VERSION } from "../core/version.js";
|
|
6
|
+
import { EapiClient } from "../eapi/client.js";
|
|
7
|
+
import { buildGetFactsToolResult, getFactsInputSchema } from "./tools/getFacts.js";
|
|
8
|
+
import { buildGetRunningConfigToolResult, getRunningConfigInputSchema } from "./tools/getRunningConfig.js";
|
|
9
|
+
import { buildGetServerInfoToolResult, getServerInfoInputSchema } from "./tools/getServerInfo.js";
|
|
10
|
+
import { buildListInventoryToolResult, listInventoryInputSchema } from "./tools/listInventory.js";
|
|
11
|
+
import { buildProbeDevicesToolResult, probeDevicesInputSchema } from "./tools/probeDevices.js";
|
|
12
|
+
import { buildRunShowToolResult, runShowInputSchema } from "./tools/runShow.js";
|
|
13
|
+
import { buildShowLoggingToolResult, showLoggingInputSchema } from "./tools/showLogging.js";
|
|
14
|
+
function buildToolDefinitions(deps) {
|
|
15
|
+
return [
|
|
16
|
+
{
|
|
17
|
+
name: "eos_get_server_info",
|
|
18
|
+
description: "Return a sanitized summary of current server capabilities, limits, runtime mode, and inventory summary.",
|
|
19
|
+
inputSchema: getServerInfoInputSchema,
|
|
20
|
+
handler: async () => buildGetServerInfoToolResult(deps.runtimeContext)
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "eos_list_inventory",
|
|
24
|
+
description: "Return a sanitized operational view of the loaded inventory. By default only EOS-eligible hosts are shown, while all groups remain visible with actionable status.",
|
|
25
|
+
inputSchema: listInventoryInputSchema,
|
|
26
|
+
handler: async (args) => buildListInventoryToolResult(deps.inventoryModel, args)
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "eos_probe_devices",
|
|
30
|
+
description: "Probe EOS device readiness for a host or group target by validating connectivity, authentication, and harmless command execution.",
|
|
31
|
+
inputSchema: probeDevicesInputSchema,
|
|
32
|
+
handler: async (args) => buildProbeDevicesToolResult(deps.inventoryModel, deps.config, args, deps.deviceReader)
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "eos_run_show",
|
|
36
|
+
description: "Run one or more EOS show commands against a host or group target. Supports auto/json/text output modes with strict show-only validation.",
|
|
37
|
+
inputSchema: runShowInputSchema,
|
|
38
|
+
handler: async (args) => buildRunShowToolResult(deps.inventoryModel, deps.config, args, deps.deviceReader)
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "eos_show_logging",
|
|
42
|
+
description: "Retrieve bounded EOS logging output for a host or group target using a minimum severity threshold and message-count limit.",
|
|
43
|
+
inputSchema: showLoggingInputSchema,
|
|
44
|
+
handler: async (args) => buildShowLoggingToolResult(deps.inventoryModel, deps.config, args, deps.deviceReader)
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "eos_get_facts",
|
|
48
|
+
description: "Collect a fixed core set of EOS device facts for a host or group target.",
|
|
49
|
+
inputSchema: getFactsInputSchema,
|
|
50
|
+
handler: async (args) => buildGetFactsToolResult(deps.inventoryModel, deps.config, args, deps.deviceReader)
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: "eos_get_running_config",
|
|
54
|
+
description: "Retrieve running configuration text for a host target, or for a group target when a raw EOS section selector is provided.",
|
|
55
|
+
inputSchema: getRunningConfigInputSchema,
|
|
56
|
+
handler: async (args) => buildGetRunningConfigToolResult(deps.inventoryModel, deps.config, args, deps.deviceReader)
|
|
57
|
+
}
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
export async function startMcpServer(config, inventoryModel) {
|
|
61
|
+
const runtimeContext = {
|
|
62
|
+
instanceId: randomUUID(),
|
|
63
|
+
startedAt: new Date().toISOString(),
|
|
64
|
+
config,
|
|
65
|
+
inventorySummary: inventoryModel.summary
|
|
66
|
+
};
|
|
67
|
+
const deviceReader = new EapiDeviceReader(config, new EapiClient());
|
|
68
|
+
const server = new McpServer({
|
|
69
|
+
name: APP_NAME,
|
|
70
|
+
version: APP_VERSION
|
|
71
|
+
});
|
|
72
|
+
const registerTool = server.registerTool.bind(server);
|
|
73
|
+
for (const tool of buildToolDefinitions({ runtimeContext, inventoryModel, config, deviceReader })) {
|
|
74
|
+
registerTool(tool.name, {
|
|
75
|
+
description: tool.description,
|
|
76
|
+
inputSchema: tool.inputSchema
|
|
77
|
+
}, tool.handler);
|
|
78
|
+
}
|
|
79
|
+
const transport = new StdioServerTransport();
|
|
80
|
+
await server.connect(transport);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=createServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/mcp/createServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { prettyJson } from "../utils/json.js";
|
|
2
|
+
export function buildJsonToolResult(payload) {
|
|
3
|
+
return {
|
|
4
|
+
content: [
|
|
5
|
+
{
|
|
6
|
+
type: "text",
|
|
7
|
+
text: prettyJson(payload)
|
|
8
|
+
}
|
|
9
|
+
],
|
|
10
|
+
structuredContent: payload
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=toolResult.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolResult.js","sourceRoot":"","sources":["../../src/mcp/toolResult.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,UAAU,mBAAmB,CAAW,OAAiB;IAC7D,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC;aAC1B;SACF;QACD,iBAAiB,EAAE,OAA6C;KACjE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ResolvedServerConfig } from "../../config/schema.js";
|
|
3
|
+
import type { EosDeviceReader } from "../../connection/eosDeviceReader.js";
|
|
4
|
+
import type { InventoryModel } from "../../inventory/types.js";
|
|
5
|
+
export declare const getFactsInputSchema: z.ZodObject<{
|
|
6
|
+
target: z.ZodString;
|
|
7
|
+
include_raw: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
8
|
+
}, "strict", z.ZodTypeAny, {
|
|
9
|
+
target: string;
|
|
10
|
+
include_raw: boolean;
|
|
11
|
+
}, {
|
|
12
|
+
target: string;
|
|
13
|
+
include_raw?: boolean | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function buildGetFactsToolResult(inventoryModel: InventoryModel, config: ResolvedServerConfig, args: z.infer<typeof getFactsInputSchema>, reader: EosDeviceReader): Promise<{
|
|
16
|
+
content: {
|
|
17
|
+
type: "text";
|
|
18
|
+
text: string;
|
|
19
|
+
}[];
|
|
20
|
+
structuredContent: Record<string, unknown>;
|
|
21
|
+
}>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getFacts } from "../../facts/getFacts.js";
|
|
3
|
+
import { buildJsonToolResult } from "../toolResult.js";
|
|
4
|
+
export const getFactsInputSchema = z
|
|
5
|
+
.object({
|
|
6
|
+
target: z.string().min(1),
|
|
7
|
+
include_raw: z.boolean().optional().default(false)
|
|
8
|
+
})
|
|
9
|
+
.strict();
|
|
10
|
+
export async function buildGetFactsToolResult(inventoryModel, config, args, reader) {
|
|
11
|
+
const payload = await getFacts(inventoryModel, config, {
|
|
12
|
+
target: args.target,
|
|
13
|
+
include_raw: args.include_raw ?? false
|
|
14
|
+
}, reader);
|
|
15
|
+
return buildJsonToolResult(payload);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=getFacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFacts.js","sourceRoot":"","sources":["../../../src/mcp/tools/getFacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC;KACjC,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACnD,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,cAA8B,EAC9B,MAA4B,EAC5B,IAAyC,EACzC,MAAuB;IAEvB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,cAAc,EACd,MAAM,EACN;QACE,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,KAAK;KACvC,EACD,MAAM,CACP,CAAC;IAEF,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ResolvedServerConfig } from "../../config/schema.js";
|
|
3
|
+
import type { EosDeviceReader } from "../../connection/eosDeviceReader.js";
|
|
4
|
+
import type { InventoryModel } from "../../inventory/types.js";
|
|
5
|
+
export declare const getRunningConfigInputSchema: z.ZodObject<{
|
|
6
|
+
target: z.ZodString;
|
|
7
|
+
section: z.ZodOptional<z.ZodString>;
|
|
8
|
+
}, "strict", z.ZodTypeAny, {
|
|
9
|
+
target: string;
|
|
10
|
+
section?: string | undefined;
|
|
11
|
+
}, {
|
|
12
|
+
target: string;
|
|
13
|
+
section?: string | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function buildGetRunningConfigToolResult(inventoryModel: InventoryModel, config: ResolvedServerConfig, args: z.infer<typeof getRunningConfigInputSchema>, reader: EosDeviceReader): Promise<{
|
|
16
|
+
content: {
|
|
17
|
+
type: "text";
|
|
18
|
+
text: string;
|
|
19
|
+
}[];
|
|
20
|
+
structuredContent: Record<string, unknown>;
|
|
21
|
+
}>;
|