@aristanetworks/eos-mcp-server 0.8.0-beta → 0.9.0-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 +13 -0
- package/README.md +19 -42
- package/dist/cli.d.ts +1 -4
- package/dist/cli.js +4 -63
- package/dist/cli.js.map +1 -1
- package/dist/commands/probe.js +2 -1
- package/dist/commands/probe.js.map +1 -1
- package/dist/config/diagnostics.d.ts +15 -5
- package/dist/config/diagnostics.js +8 -3
- package/dist/config/diagnostics.js.map +1 -1
- package/dist/config/loadConfig.js +2 -5
- package/dist/config/loadConfig.js.map +1 -1
- package/dist/config/schema.d.ts +123 -15
- package/dist/config/schema.js +14 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/connection/eosDeviceReader.d.ts +6 -1
- package/dist/connection/eosDeviceReader.js +14 -3
- package/dist/connection/eosDeviceReader.js.map +1 -1
- package/dist/diagnostics/eapiRunner.js +7 -1
- package/dist/diagnostics/eapiRunner.js.map +1 -1
- package/dist/diagnostics/executor.d.ts +7 -4
- package/dist/diagnostics/executor.js +16 -14
- package/dist/diagnostics/executor.js.map +1 -1
- package/dist/diagnostics/types.d.ts +22 -6
- package/dist/eapi/client.js +5 -4
- package/dist/eapi/client.js.map +1 -1
- package/dist/eapi/types.d.ts +3 -0
- package/dist/eapi/types.js.map +1 -1
- package/dist/index.js +0 -10
- package/dist/index.js.map +1 -1
- package/dist/mcp/createServer.js +21 -21
- package/dist/mcp/createServer.js.map +1 -1
- package/dist/mcp/tools/ping.d.ts +2 -9
- package/dist/mcp/tools/ping.js +13 -26
- package/dist/mcp/tools/ping.js.map +1 -1
- package/dist/operations/eapiSlots.d.ts +68 -0
- package/dist/operations/eapiSlots.js +237 -0
- package/dist/operations/eapiSlots.js.map +1 -0
- package/dist/operations/readExecution.js +1 -1
- package/dist/operations/readExecution.js.map +1 -1
- package/dist/serverInfo/buildServerInfo.js +4 -1
- package/dist/serverInfo/buildServerInfo.js.map +1 -1
- package/dist/serverInfo/types.d.ts +3 -0
- package/docs/CHECKPOINT.md +3 -6
- package/docs/CODE_WALKTHROUGH.md +6 -11
- package/docs/DEMO_SKILLS_YOUTUBE.md +346 -0
- package/docs/DESIGN.md +4 -4
- package/docs/DIAGNOSTICS.md +26 -74
- package/docs/IMPLEMENTATION_PLAN.md +2 -2
- package/docs/adr/0002-fail-closed-diagnostic-reservations.md +2 -0
- package/docs/adr/0003-durable-diagnostic-ledger.md +2 -0
- package/docs/adr/0004-offline-operator-attested-release.md +2 -0
- package/docs/adr/0005-multi-destination-ping.md +5 -1
- package/docs/adr/0006-in-memory-timed-diagnostic-capacity.md +23 -0
- package/docs/adr/0007-per-device-diagnostic-concurrency.md +16 -0
- package/docs/adr/0008-read-only-tool-annotations.md +16 -0
- package/docs/adr/0009-shared-per-device-eapi-slots.md +40 -0
- package/docs/research/eos-diagnostic-lifecycle.md +2 -0
- package/docs/research/eos-linter-integration.md +70 -0
- package/package.json +1 -1
- package/dist/commands/inspectDiagnostics.d.ts +0 -3
- package/dist/commands/inspectDiagnostics.js +0 -35
- package/dist/commands/inspectDiagnostics.js.map +0 -1
- package/dist/commands/releaseDiagnostics.d.ts +0 -9
- package/dist/commands/releaseDiagnostics.js +0 -87
- package/dist/commands/releaseDiagnostics.js.map +0 -1
- package/dist/diagnostics/concurrency.d.ts +0 -33
- package/dist/diagnostics/concurrency.js +0 -157
- package/dist/diagnostics/concurrency.js.map +0 -1
- package/dist/diagnostics/journal.d.ts +0 -14
- package/dist/diagnostics/journal.js +0 -317
- package/dist/diagnostics/journal.js.map +0 -1
- package/dist/diagnostics/journalTypes.d.ts +0 -8
- package/dist/diagnostics/journalTypes.js +0 -2
- package/dist/diagnostics/journalTypes.js.map +0 -1
- package/dist/diagnostics/releaseEvidence.d.ts +0 -502
- package/dist/diagnostics/releaseEvidence.js +0 -115
- package/dist/diagnostics/releaseEvidence.js.map +0 -1
- package/dist/diagnostics/reservationSchema.d.ts +0 -49
- package/dist/diagnostics/reservationSchema.js +0 -18
- package/dist/diagnostics/reservationSchema.js.map +0 -1
- package/dist/diagnostics/statePath.d.ts +0 -4
- package/dist/diagnostics/statePath.js +0 -25
- package/dist/diagnostics/statePath.js.map +0 -1
- package/dist/utils/privateFile.d.ts +0 -3
- package/dist/utils/privateFile.js +0 -7
- package/dist/utils/privateFile.js.map +0 -1
- package/docs/examples/diagnostic-release-evidence.template.json +0 -26
|
@@ -50,33 +50,49 @@ export interface DiagnosticDefinition {
|
|
|
50
50
|
probeCount(execution: PreparedDiagnostic): number;
|
|
51
51
|
interpret(output: string, execution: PreparedDiagnostic): DiagnosticFinding;
|
|
52
52
|
}
|
|
53
|
+
/** `reservation_id` doubles as the execution's JSON-RPC request ID. */
|
|
53
54
|
export interface DiagnosticReservationInfo {
|
|
54
55
|
reservation_id: string;
|
|
55
|
-
rpc_request_id?: string;
|
|
56
56
|
inventory_hostname: string;
|
|
57
57
|
diagnostic: DiagnosticRequest["kind"];
|
|
58
58
|
state: "active" | "uncertain";
|
|
59
59
|
reserved_at: string;
|
|
60
60
|
uncertain_since?: string;
|
|
61
|
+
releases_at?: string;
|
|
61
62
|
reason_code?: string;
|
|
62
63
|
}
|
|
63
|
-
|
|
64
|
-
scope: "server-instance" | "state-file";
|
|
65
|
-
storage_error_code?: string;
|
|
66
|
-
limit: number;
|
|
64
|
+
interface DiagnosticSlotCounts {
|
|
67
65
|
available_count: number;
|
|
68
66
|
active_count: number;
|
|
69
67
|
uncertain_count: number;
|
|
70
68
|
queued_count: number;
|
|
69
|
+
}
|
|
70
|
+
/** Slot usage of one inventory host; only hosts holding or awaiting a slot are listed.
|
|
71
|
+
* The four shared counts are diagnostic slots; `available_count` is the diagnostic headroom,
|
|
72
|
+
* capped by the host's shared eAPI headroom and server-wide availability.
|
|
73
|
+
*/
|
|
74
|
+
export interface DiagnosticDeviceCapacity extends DiagnosticSlotCounts {
|
|
75
|
+
inventory_hostname: string;
|
|
76
|
+
read_active_count: number;
|
|
77
|
+
read_queued_count: number;
|
|
78
|
+
}
|
|
79
|
+
/** Top-level counts are server-wide diagnostics; `devices` breaks them down per host, with reads. */
|
|
80
|
+
export interface DiagnosticCapacitySnapshot extends DiagnosticSlotCounts {
|
|
81
|
+
limit: number;
|
|
82
|
+
device_limit: number;
|
|
83
|
+
/** eAPI slots one host may hold across reads and diagnostics. */
|
|
84
|
+
eapi_device_limit: number;
|
|
85
|
+
devices: DiagnosticDeviceCapacity[];
|
|
71
86
|
reservations: DiagnosticReservationInfo[];
|
|
72
87
|
}
|
|
73
88
|
export interface DiagnosticExecutionContext {
|
|
74
89
|
signal: AbortSignal;
|
|
75
90
|
requestId: string;
|
|
76
91
|
}
|
|
77
|
-
/** Device execution seam: inventory identity, typed intent, and
|
|
92
|
+
/** Device execution seam: inventory identity, typed intent, and the reserved attempt ID.
|
|
78
93
|
* Errors stay uncertain unless classified as not_dispatched/completed by DiagnosticExecutionError.
|
|
79
94
|
*/
|
|
80
95
|
export interface DiagnosticDeviceRunner {
|
|
81
96
|
execute(host: InventoryHostModel, request: PreparedDiagnostic, context: DiagnosticExecutionContext): Promise<DiagnosticObservation>;
|
|
82
97
|
}
|
|
98
|
+
export {};
|
package/dist/eapi/client.js
CHANGED
|
@@ -28,10 +28,10 @@ export class EapiClient {
|
|
|
28
28
|
}
|
|
29
29
|
/** Execute once in text mode. Active diagnostics must never use JSON fallback retries. */
|
|
30
30
|
async runTextCommands(connection, commands, options) {
|
|
31
|
-
const payload = await this.runCommands(connection, commands, "text", options
|
|
31
|
+
const payload = await this.runCommands(connection, commands, "text", options);
|
|
32
32
|
return buildCommandResults(payload, commands, "text", false);
|
|
33
33
|
}
|
|
34
|
-
async runCommands(connection, commands, format, options
|
|
34
|
+
async runCommands(connection, commands, format, options) {
|
|
35
35
|
if (commands.length === 0) {
|
|
36
36
|
throw new AppError("eapi_commands_missing", "runCommands requires at least one command");
|
|
37
37
|
}
|
|
@@ -43,9 +43,10 @@ export class EapiClient {
|
|
|
43
43
|
params: {
|
|
44
44
|
version: connection.eapiVersion,
|
|
45
45
|
cmds: wireCommands,
|
|
46
|
-
format
|
|
46
|
+
format,
|
|
47
|
+
...(options?.requestTimeoutSeconds === undefined ? {} : { requestTimeout: options.requestTimeoutSeconds })
|
|
47
48
|
},
|
|
48
|
-
id: requestId
|
|
49
|
+
id: options?.requestId ?? randomUUID()
|
|
49
50
|
};
|
|
50
51
|
const requestSignal = buildRequestSignal(connection.timeoutMs, options?.signal);
|
|
51
52
|
const requestJson = JSON.stringify(requestBody);
|
package/dist/eapi/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/eapi/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EACL,kBAAkB,EAClB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/eapi/client.ts"],"names":[],"mappings":"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"}
|
package/dist/eapi/types.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ export interface EapiCommandOptions {
|
|
|
19
19
|
}
|
|
20
20
|
export interface RunTextCommandOptions extends EapiCommandOptions {
|
|
21
21
|
requestId?: string;
|
|
22
|
+
/** EOS-side runCmds requestTimeout: the device interrupts the command list once it expires. */
|
|
23
|
+
requestTimeoutSeconds?: number;
|
|
22
24
|
}
|
|
23
25
|
export interface RunShowCommandOptions extends EapiCommandOptions {
|
|
24
26
|
includeRawEntries?: boolean;
|
|
@@ -50,6 +52,7 @@ export interface EapiJsonRpcRequest {
|
|
|
50
52
|
version: EapiVersion;
|
|
51
53
|
cmds: string[];
|
|
52
54
|
format: EapiOutputFormat;
|
|
55
|
+
requestTimeout?: number;
|
|
53
56
|
};
|
|
54
57
|
id: string;
|
|
55
58
|
}
|
package/dist/eapi/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/eapi/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/eapi/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA0D7C,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACnF,CAAC;AAOD,MAAM,UAAU,wBAAwB,CAAC,OAAgB,EAAE,mBAA4B;IACrF,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,yDAAyD,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,mBAAmB,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QACvF,MAAM,IAAI,QAAQ,CAChB,sBAAsB,EACtB,+CAA+C,mBAAmB,gCAAgC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAC1H,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,8 +3,6 @@ import { randomUUID } from "node:crypto";
|
|
|
3
3
|
import { AppError, toErrorMessage } from "./core/errors.js";
|
|
4
4
|
import { parseCliArgs, printHelp, printVersion } from "./cli.js";
|
|
5
5
|
import { runProbe } from "./commands/probe.js";
|
|
6
|
-
import { runInspectDiagnostics } from "./commands/inspectDiagnostics.js";
|
|
7
|
-
import { runReleaseDiagnostics } from "./commands/releaseDiagnostics.js";
|
|
8
6
|
import { runValidateInventory } from "./commands/validateInventory.js";
|
|
9
7
|
import { printServerInfo } from "./commands/printServerInfo.js";
|
|
10
8
|
import { loadServerConfig } from "./config/loadConfig.js";
|
|
@@ -42,14 +40,6 @@ async function main() {
|
|
|
42
40
|
printServerInfo(runtimeContext, cli.json ?? false);
|
|
43
41
|
return;
|
|
44
42
|
}
|
|
45
|
-
case "release-diagnostics": {
|
|
46
|
-
process.exitCode = await runReleaseDiagnostics(config, cli);
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
case "inspect-diagnostics": {
|
|
50
|
-
process.exitCode = await runInspectDiagnostics(config, cli.json ?? false);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
43
|
case "probe": {
|
|
54
44
|
if (!cli.target) {
|
|
55
45
|
throw new AppError("cli_missing_target", "probe requires a target via --target");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/createServer.js
CHANGED
|
@@ -4,10 +4,10 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
4
4
|
import { EapiDeviceReader } from "../connection/eosDeviceReader.js";
|
|
5
5
|
import { APP_NAME, APP_VERSION } from "../core/version.js";
|
|
6
6
|
import { toErrorMessage } from "../core/errors.js";
|
|
7
|
-
import { defaultDiagnosticStateFile, diagnosticInventoryIdentity } from "../diagnostics/statePath.js";
|
|
8
7
|
import { EapiClient } from "../eapi/client.js";
|
|
9
8
|
import { EapiDiagnosticRunner } from "../diagnostics/eapiRunner.js";
|
|
10
9
|
import { DiagnosticExecutor } from "../diagnostics/executor.js";
|
|
10
|
+
import { EapiSlots, eapiSlotLimits } from "../operations/eapiSlots.js";
|
|
11
11
|
import { buildPingToolResult, pingInputSchema } from "./tools/ping.js";
|
|
12
12
|
import { buildGetFactsToolResult, getFactsInputSchema } from "./tools/getFacts.js";
|
|
13
13
|
import { buildGetRunningConfigToolResult, getRunningConfigInputSchema } from "./tools/getRunningConfig.js";
|
|
@@ -16,54 +16,68 @@ import { buildListInventoryToolResult, listInventoryInputSchema } from "./tools/
|
|
|
16
16
|
import { buildProbeDevicesToolResult, probeDevicesInputSchema } from "./tools/probeDevices.js";
|
|
17
17
|
import { buildRunShowToolResult, runShowInputSchema } from "./tools/runShow.js";
|
|
18
18
|
import { buildShowLoggingToolResult, showLoggingInputSchema } from "./tools/showLogging.js";
|
|
19
|
+
// Every tool leaves device state unchanged, which lets clients run independent
|
|
20
|
+
// calls concurrently; server-side limits still bound diagnostics (ADR 0008).
|
|
21
|
+
// Most tools reach only inventory devices.
|
|
22
|
+
const closedWorldReadOnly = { readOnlyHint: true, openWorldHint: false };
|
|
23
|
+
// Ping destinations need not be in inventory.
|
|
24
|
+
const openWorldReadOnly = { readOnlyHint: true, openWorldHint: true };
|
|
19
25
|
function buildToolDefinitions(deps) {
|
|
20
26
|
return [
|
|
21
27
|
{
|
|
22
28
|
name: "eos_get_server_info",
|
|
23
29
|
description: "Return a sanitized summary of current server capabilities, limits, runtime mode, and inventory summary.",
|
|
24
30
|
inputSchema: getServerInfoInputSchema,
|
|
31
|
+
annotations: closedWorldReadOnly,
|
|
25
32
|
handler: async () => buildGetServerInfoToolResult(deps.runtimeContext, deps.diagnostics.getCapacity())
|
|
26
33
|
},
|
|
27
34
|
{
|
|
28
35
|
name: "eos_list_inventory",
|
|
29
36
|
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.",
|
|
30
37
|
inputSchema: listInventoryInputSchema,
|
|
38
|
+
annotations: closedWorldReadOnly,
|
|
31
39
|
handler: async (args) => buildListInventoryToolResult(deps.inventoryModel, args)
|
|
32
40
|
},
|
|
33
41
|
{
|
|
34
42
|
name: "eos_probe_devices",
|
|
35
43
|
description: "Probe EOS device readiness for a host or group target by validating connectivity, authentication, and harmless command execution.",
|
|
36
44
|
inputSchema: probeDevicesInputSchema,
|
|
45
|
+
annotations: closedWorldReadOnly,
|
|
37
46
|
handler: async (args) => buildProbeDevicesToolResult(deps.inventoryModel, deps.config, args, deps.deviceReader)
|
|
38
47
|
},
|
|
39
48
|
{
|
|
40
49
|
name: "eos_ping",
|
|
41
50
|
description: "Run bounded, non-configuring ping diagnostics from an inventory host or group to one or more destinations concurrently. Requires explicit diagnostic permission. Destinations are unicast IP literals. Returns one result per host and destination; execution success is separate from reachability, and no replies do not identify a cause.",
|
|
42
51
|
inputSchema: pingInputSchema,
|
|
52
|
+
annotations: openWorldReadOnly,
|
|
43
53
|
handler: async (args, extra) => buildPingToolResult(args, deps.diagnostics, extra.signal)
|
|
44
54
|
},
|
|
45
55
|
{
|
|
46
56
|
name: "eos_run_show",
|
|
47
57
|
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.",
|
|
48
58
|
inputSchema: runShowInputSchema,
|
|
59
|
+
annotations: closedWorldReadOnly,
|
|
49
60
|
handler: async (args) => buildRunShowToolResult(deps.inventoryModel, deps.config, args, deps.deviceReader)
|
|
50
61
|
},
|
|
51
62
|
{
|
|
52
63
|
name: "eos_show_logging",
|
|
53
64
|
description: "Retrieve bounded EOS logging output for a host or group target using a minimum severity threshold and message-count limit.",
|
|
54
65
|
inputSchema: showLoggingInputSchema,
|
|
66
|
+
annotations: closedWorldReadOnly,
|
|
55
67
|
handler: async (args) => buildShowLoggingToolResult(deps.inventoryModel, deps.config, args, deps.deviceReader)
|
|
56
68
|
},
|
|
57
69
|
{
|
|
58
70
|
name: "eos_get_facts",
|
|
59
71
|
description: "Collect a fixed core set of EOS device facts for a host or group target.",
|
|
60
72
|
inputSchema: getFactsInputSchema,
|
|
73
|
+
annotations: closedWorldReadOnly,
|
|
61
74
|
handler: async (args) => buildGetFactsToolResult(deps.inventoryModel, deps.config, args, deps.deviceReader)
|
|
62
75
|
},
|
|
63
76
|
{
|
|
64
77
|
name: "eos_get_running_config",
|
|
65
78
|
description: "Retrieve running configuration text for a host target, or for a group target when a raw EOS section selector is provided.",
|
|
66
79
|
inputSchema: getRunningConfigInputSchema,
|
|
80
|
+
annotations: closedWorldReadOnly,
|
|
67
81
|
handler: async (args) => buildGetRunningConfigToolResult(deps.inventoryModel, deps.config, args, deps.deviceReader)
|
|
68
82
|
}
|
|
69
83
|
];
|
|
@@ -76,18 +90,9 @@ export async function startMcpServer(config, inventoryModel) {
|
|
|
76
90
|
inventorySummary: inventoryModel.summary
|
|
77
91
|
};
|
|
78
92
|
const client = new EapiClient();
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
: undefined;
|
|
83
|
-
let diagnostics;
|
|
84
|
-
try {
|
|
85
|
-
diagnostics = new DiagnosticExecutor(inventoryModel, config, new EapiDiagnosticRunner(config, client), journal);
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
journal?.close();
|
|
89
|
-
throw error;
|
|
90
|
-
}
|
|
93
|
+
const slots = new EapiSlots(eapiSlotLimits(config), config.diagnostics.commandTimeoutMs);
|
|
94
|
+
const deviceReader = new EapiDeviceReader(config, client, slots);
|
|
95
|
+
const diagnostics = new DiagnosticExecutor(inventoryModel, config, new EapiDiagnosticRunner(config, client), slots);
|
|
91
96
|
const server = new McpServer({
|
|
92
97
|
name: APP_NAME,
|
|
93
98
|
version: APP_VERSION
|
|
@@ -96,7 +101,8 @@ export async function startMcpServer(config, inventoryModel) {
|
|
|
96
101
|
for (const tool of buildToolDefinitions({ runtimeContext, inventoryModel, config, deviceReader, diagnostics })) {
|
|
97
102
|
registerTool(tool.name, {
|
|
98
103
|
description: tool.description,
|
|
99
|
-
inputSchema: tool.inputSchema
|
|
104
|
+
inputSchema: tool.inputSchema,
|
|
105
|
+
annotations: tool.annotations
|
|
100
106
|
}, tool.handler);
|
|
101
107
|
}
|
|
102
108
|
const stop = () => {
|
|
@@ -110,13 +116,7 @@ export async function startMcpServer(config, inventoryModel) {
|
|
|
110
116
|
process.off("SIGINT", stop);
|
|
111
117
|
process.off("SIGTERM", stop);
|
|
112
118
|
process.stdin.off("end", stop);
|
|
113
|
-
|
|
114
|
-
diagnostics.close();
|
|
115
|
-
}
|
|
116
|
-
catch (error) {
|
|
117
|
-
console.error(toErrorMessage(error));
|
|
118
|
-
process.exitCode = 1;
|
|
119
|
-
}
|
|
119
|
+
diagnostics.close();
|
|
120
120
|
};
|
|
121
121
|
server.server.onclose = cleanup;
|
|
122
122
|
process.once("SIGINT", stop);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/mcp/createServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/mcp/createServer.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools/ping.d.ts
CHANGED
|
@@ -8,15 +8,15 @@ export declare const pingInputSchema: z.ZodObject<{
|
|
|
8
8
|
source: z.ZodOptional<z.ZodString>;
|
|
9
9
|
include_raw: z.ZodDefault<z.ZodBoolean>;
|
|
10
10
|
}, "strict", z.ZodTypeAny, {
|
|
11
|
-
target: string;
|
|
12
11
|
destinations: string[];
|
|
12
|
+
target: string;
|
|
13
13
|
include_raw: boolean;
|
|
14
14
|
count?: number | undefined;
|
|
15
15
|
vrf?: string | undefined;
|
|
16
16
|
source?: string | undefined;
|
|
17
17
|
}, {
|
|
18
|
-
target: string;
|
|
19
18
|
destinations: string[];
|
|
19
|
+
target: string;
|
|
20
20
|
count?: number | undefined;
|
|
21
21
|
vrf?: string | undefined;
|
|
22
22
|
source?: string | undefined;
|
|
@@ -28,11 +28,4 @@ export declare function buildPingToolResult(args: z.infer<typeof pingInputSchema
|
|
|
28
28
|
text: string;
|
|
29
29
|
}[];
|
|
30
30
|
structuredContent: Record<string, unknown>;
|
|
31
|
-
} | {
|
|
32
|
-
isError: boolean;
|
|
33
|
-
content: {
|
|
34
|
-
type: "text";
|
|
35
|
-
text: string;
|
|
36
|
-
}[];
|
|
37
|
-
structuredContent: Record<string, unknown>;
|
|
38
31
|
}>;
|
package/dist/mcp/tools/ping.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { AppError } from "../../core/errors.js";
|
|
3
2
|
import { buildJsonToolResult } from "../toolResult.js";
|
|
4
3
|
export const pingInputSchema = z.object({
|
|
5
4
|
target: z.string().min(1).describe("Inventory host or group executing the diagnostic"),
|
|
@@ -11,30 +10,18 @@ export const pingInputSchema = z.object({
|
|
|
11
10
|
include_raw: z.boolean().default(false)
|
|
12
11
|
}).strict("Unrecognized field. eos_ping accepts target, destinations, count, vrf, source, and include_raw; use destinations: [\"<ip>\"] for a single ping");
|
|
13
12
|
export async function buildPingToolResult(args, executor, signal) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return buildJsonToolResult(payload);
|
|
28
|
-
}
|
|
29
|
-
catch (error) {
|
|
30
|
-
if (error instanceof AppError && (error.code === "diagnostic_capacity_uncertain" || error.code.startsWith("diagnostic_state_"))) {
|
|
31
|
-
// The SDK otherwise reduces thrown errors to text and drops AppError.code.
|
|
32
|
-
return {
|
|
33
|
-
...buildJsonToolResult({ error_code: error.code, message: error.message }),
|
|
34
|
-
isError: true
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
throw error;
|
|
38
|
-
}
|
|
13
|
+
const payload = await executor.execute({
|
|
14
|
+
target: args.target,
|
|
15
|
+
request: {
|
|
16
|
+
kind: "ping",
|
|
17
|
+
destinations: args.destinations,
|
|
18
|
+
...(args.count === undefined ? {} : { count: args.count }),
|
|
19
|
+
...(args.vrf === undefined ? {} : { vrf: args.vrf }),
|
|
20
|
+
...(args.source === undefined ? {} : { source: args.source })
|
|
21
|
+
},
|
|
22
|
+
includeRaw: args.include_raw,
|
|
23
|
+
...(signal === undefined ? {} : { signal })
|
|
24
|
+
});
|
|
25
|
+
return buildJsonToolResult(payload);
|
|
39
26
|
}
|
|
40
27
|
//# sourceMappingURL=ping.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ping.js","sourceRoot":"","sources":["../../../src/mcp/tools/ping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ping.js","sourceRoot":"","sources":["../../../src/mcp/tools/ping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IACtF,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SAC5C,QAAQ,CAAC,+KAA+K,CAAC;IAC5L,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oGAAoG,CAAC;IAC5J,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;IAC/G,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;IAClH,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACxC,CAAC,CAAC,MAAM,CAAC,gJAAgJ,CAAC,CAAC;AAE5J,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAqC,EACrC,QAA4B,EAC5B,MAAoB;IAEpB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;QACrC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE;YACP,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YACpD,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;SAC9D;QACD,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5C,CAAC,CAAC;IACH,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { DiagnosticCapacitySnapshot, DiagnosticRequest } from "../diagnostics/types.js";
|
|
2
|
+
interface DiagnosticReservationIntent {
|
|
3
|
+
inventoryHostname: string;
|
|
4
|
+
diagnostic: DiagnosticRequest["kind"];
|
|
5
|
+
}
|
|
6
|
+
export interface DiagnosticReservation {
|
|
7
|
+
readonly requestId: string;
|
|
8
|
+
complete(): void;
|
|
9
|
+
markUncertain(reasonCode: string): void;
|
|
10
|
+
}
|
|
11
|
+
export interface EapiSlotLimits {
|
|
12
|
+
/** Slots one inventory host may hold across reads and diagnostics. */
|
|
13
|
+
deviceLimit: number;
|
|
14
|
+
/** Of those, the slots diagnostics may hold on one host, so the rest stay free for reads. */
|
|
15
|
+
diagnosticDeviceLimit: number;
|
|
16
|
+
/** Diagnostic slots shared by every device in the server process. Reads have no server-wide limit. */
|
|
17
|
+
diagnosticServerLimit: number;
|
|
18
|
+
}
|
|
19
|
+
/** One instance per server process, shared by every eAPI request (ADR 0009). A slot is granted only
|
|
20
|
+
* while its device has room and, for a diagnostic, its device's diagnostic share and the server-wide
|
|
21
|
+
* diagnostic ceiling have room; waiters are served oldest first, skipping those that cannot run yet
|
|
22
|
+
* (ADR 0007). A read frees its slot when its request settles. A diagnostic slot with unknown remote
|
|
23
|
+
* completion stays held for the execution budget, then frees itself; a late confirmed response frees
|
|
24
|
+
* it sooner (ADR 0006).
|
|
25
|
+
*/
|
|
26
|
+
export declare class EapiSlots {
|
|
27
|
+
private readonly limits;
|
|
28
|
+
private readonly uncertainHoldMs;
|
|
29
|
+
/** Held diagnostic slots; an uncertain slot carries the timer that frees it. */
|
|
30
|
+
private readonly reservations;
|
|
31
|
+
private readonly readsHeldByDevice;
|
|
32
|
+
private readonly waiting;
|
|
33
|
+
private closed;
|
|
34
|
+
constructor(limits: EapiSlotLimits, uncertainHoldMs: number);
|
|
35
|
+
close(): void;
|
|
36
|
+
/** Top-level counts cover diagnostics; `devices` also shows each host's read slots. */
|
|
37
|
+
snapshot(): DiagnosticCapacitySnapshot;
|
|
38
|
+
/** Per-host counts for every host holding or awaiting a slot, sorted by hostname. */
|
|
39
|
+
private deviceBreakdown;
|
|
40
|
+
/** Waits for a read slot on the host; the returned function frees it. */
|
|
41
|
+
acquireRead(signal: AbortSignal | undefined, inventoryHostname: string): Promise<() => void>;
|
|
42
|
+
acquireDiagnostic(signal: AbortSignal | undefined, intent: DiagnosticReservationIntent): Promise<DiagnosticReservation>;
|
|
43
|
+
private enqueue;
|
|
44
|
+
private hasRoom;
|
|
45
|
+
/** Diagnostic slots a host could take now: the tightest of its diagnostic share, its shared device
|
|
46
|
+
* slots, and the server-wide diagnostic slots still free. Admission and the snapshot both use it.
|
|
47
|
+
*/
|
|
48
|
+
private diagnosticHeadroom;
|
|
49
|
+
/** Counted from the held reservations, which never exceed the server-wide diagnostic limit. */
|
|
50
|
+
private diagnosticSlotsHeldBy;
|
|
51
|
+
private reserveRead;
|
|
52
|
+
/** Keeps only hosts that hold reads, so the snapshot lists no idle hosts. */
|
|
53
|
+
private adjustReadsHeld;
|
|
54
|
+
private reserveDiagnostic;
|
|
55
|
+
private freeDiagnostic;
|
|
56
|
+
/** Grant the oldest waiters that can run now; a waiter that cannot run yet keeps its place. */
|
|
57
|
+
private grantWaiting;
|
|
58
|
+
private markUncertain;
|
|
59
|
+
}
|
|
60
|
+
/** Limits from config: top-level `deviceConcurrency` per device, `diagnostics.*` for the diagnostic share. */
|
|
61
|
+
export declare function eapiSlotLimits(config: {
|
|
62
|
+
deviceConcurrency: number;
|
|
63
|
+
diagnostics: {
|
|
64
|
+
deviceConcurrency: number;
|
|
65
|
+
maxConcurrentDiagnostics: number;
|
|
66
|
+
};
|
|
67
|
+
}): EapiSlotLimits;
|
|
68
|
+
export {};
|