@aristanetworks/eos-mcp-server 0.6.1-beta → 0.8.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.
Files changed (76) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +171 -44
  3. package/dist/config/diagnostics.d.ts +65 -0
  4. package/dist/config/diagnostics.js +38 -0
  5. package/dist/config/diagnostics.js.map +1 -0
  6. package/dist/config/loadConfig.js +1 -0
  7. package/dist/config/loadConfig.js.map +1 -1
  8. package/dist/config/schema.d.ts +182 -8
  9. package/dist/config/schema.js +3 -0
  10. package/dist/config/schema.js.map +1 -1
  11. package/dist/diagnostics/concurrency.d.ts +29 -0
  12. package/dist/diagnostics/concurrency.js +115 -0
  13. package/dist/diagnostics/concurrency.js.map +1 -0
  14. package/dist/diagnostics/eapiRunner.d.ts +10 -0
  15. package/dist/diagnostics/eapiRunner.js +52 -0
  16. package/dist/diagnostics/eapiRunner.js.map +1 -0
  17. package/dist/diagnostics/executionError.d.ts +7 -0
  18. package/dist/diagnostics/executionError.js +10 -0
  19. package/dist/diagnostics/executionError.js.map +1 -0
  20. package/dist/diagnostics/executor.d.ts +31 -0
  21. package/dist/diagnostics/executor.js +114 -0
  22. package/dist/diagnostics/executor.js.map +1 -0
  23. package/dist/diagnostics/ping.d.ts +7 -0
  24. package/dist/diagnostics/ping.js +131 -0
  25. package/dist/diagnostics/ping.js.map +1 -0
  26. package/dist/diagnostics/types.d.ts +81 -0
  27. package/dist/diagnostics/types.js +2 -0
  28. package/dist/diagnostics/types.js.map +1 -0
  29. package/dist/eapi/client.d.ts +3 -1
  30. package/dist/eapi/client.js +18 -6
  31. package/dist/eapi/client.js.map +1 -1
  32. package/dist/eapi/types.d.ts +9 -0
  33. package/dist/eapi/types.js.map +1 -1
  34. package/dist/inventory/buildModel.js +1 -0
  35. package/dist/inventory/buildModel.js.map +1 -1
  36. package/dist/inventory/listInventoryView.d.ts +1 -0
  37. package/dist/inventory/listInventoryView.js +1 -0
  38. package/dist/inventory/listInventoryView.js.map +1 -1
  39. package/dist/inventory/policy.d.ts +1 -0
  40. package/dist/inventory/policy.js +3 -1
  41. package/dist/inventory/policy.js.map +1 -1
  42. package/dist/inventory/types.d.ts +1 -0
  43. package/dist/inventory/varValidation.js +1 -0
  44. package/dist/inventory/varValidation.js.map +1 -1
  45. package/dist/mcp/createServer.js +39 -4
  46. package/dist/mcp/createServer.js.map +1 -1
  47. package/dist/mcp/tools/getServerInfo.d.ts +2 -1
  48. package/dist/mcp/tools/getServerInfo.js +2 -2
  49. package/dist/mcp/tools/getServerInfo.js.map +1 -1
  50. package/dist/mcp/tools/ping.d.ts +31 -0
  51. package/dist/mcp/tools/ping.js +27 -0
  52. package/dist/mcp/tools/ping.js.map +1 -0
  53. package/dist/operations/readExecution.d.ts +3 -1
  54. package/dist/operations/readExecution.js +24 -16
  55. package/dist/operations/readExecution.js.map +1 -1
  56. package/dist/serverInfo/buildServerInfo.d.ts +2 -1
  57. package/dist/serverInfo/buildServerInfo.js +17 -2
  58. package/dist/serverInfo/buildServerInfo.js.map +1 -1
  59. package/dist/serverInfo/types.d.ts +16 -0
  60. package/docs/CHECKPOINT.md +8 -1
  61. package/docs/CODE_WALKTHROUGH.md +25 -6
  62. package/docs/DESIGN.md +17 -4
  63. package/docs/DIAGNOSTICS.md +167 -0
  64. package/docs/IMPLEMENTATION_PLAN.md +4 -3
  65. package/docs/QUICKSTART.md +13 -13
  66. package/docs/adr/0001-non-configuring-diagnostics.md +5 -0
  67. package/docs/adr/0002-fail-closed-diagnostic-reservations.md +9 -0
  68. package/docs/adr/0003-durable-diagnostic-ledger.md +11 -0
  69. package/docs/adr/0004-offline-operator-attested-release.md +7 -0
  70. package/docs/adr/0005-multi-destination-ping.md +9 -0
  71. package/docs/adr/0006-in-memory-timed-diagnostic-capacity.md +21 -0
  72. package/docs/research/eos-diagnostic-lifecycle.md +86 -0
  73. package/package.json +1 -1
  74. package/dist/inventory/writePolicy.d.ts +0 -2
  75. package/dist/inventory/writePolicy.js +0 -36
  76. package/dist/inventory/writePolicy.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -2,7 +2,33 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.8.1-beta
6
+
7
+ - **Breaking:** removes the durable diagnostic ledger and its exclusive lock, so several MCP servers (for example two chat sessions, or the desktop app alongside Claude Code) can use the same inventory at once. Previously a second server failed to start whenever any host allowed diagnostics, losing every tool. See [ADR 0006](docs/adr/0006-in-memory-timed-diagnostic-capacity.md), which supersedes ADRs 0002 to 0004.
8
+ - When a ping's remote completion is unknown (timeout, cancellation, lost connection, malformed or uncorrelated response), its slot is now held for `diagnostics.commandTimeoutMs` and then freed automatically instead of indefinitely; a late confirmed response frees it sooner. New work queues behind held slots within the overall deadline. Server info reports `releases_at` for each uncertain reservation. `deviceConcurrency` now limits each server process rather than an inventory.
9
+ - Ping requests now send EOS's native `runCmds.requestTimeout`, set to `diagnostics.commandTimeoutMs`, so the switch itself interrupts a ping that outlives its budget. On by default; set `diagnostics.nativeRequestTimeout: false` if an EOS version rejects the field. Server info reports it as `limits.diagnostics.native_request_timeout`. Verified on cEOS 4.34.3M only.
10
+ - Removes the `inspect-diagnostics` and `release-diagnostics` commands, fencing attestations and release audit, the `diagnostics.stateFile` setting (now rejected with guidance), the `diagnostic_capacity_uncertain` and `diagnostic_state_*` errors, and the capacity snapshot's `scope`, `storage_error_code` and `rpc_request_id` fields (`reservation_id` is the wire RPC ID). Old ledger files under `~/.local/state/eos-mcp-server/` are no longer read and can be deleted.
11
+
12
+ ## 0.8.0-beta
13
+
14
+ 0.7.0-beta was not published to npm, so upgrading from 0.6.1-beta picks up both this section and the 0.7.0-beta section below.
15
+
16
+ - **Breaking:** `eos_ping` replaces `destination` with `destinations`, an array of 1 to `diagnostics.maxDestinationsPerRequest` (default 16) unique IP literals. Use `destinations: ["<ip>"]` for a single ping; the old field is rejected with guidance. Duplicates are compared by canonical address, so different IPv6 spellings of one address are rejected, while an IPv4 address and its IPv4-mapped IPv6 form stay distinct. Destinations run concurrently within the existing diagnostic concurrency, each with its own reservation. Results always contain one entry per host and destination, each carrying `destination`, and `summary` counts those entries rather than devices. All destinations are validated before dispatch, and `maxProbesPerRequest` now counts hosts × destinations × count. Server info reports `limits.diagnostics.max_destinations_per_request`. See [ADR 0005](docs/adr/0005-multi-destination-ping.md).
17
+ - Routes diagnostics through a per-kind `DiagnosticDefinition` (prepare, probe cost, interpret), so the executor no longer contains ping-specific logic.
18
+ - Documents the Codex `supports_parallel_tool_calls = true` opt-in in the README's Codex configuration examples. Without it, Codex runs independent EOS tool calls serially.
19
+ - Refreshes locked dependencies with `npm audit fix`, including `@modelcontextprotocol/sdk` 1.32.2 and its HTTP-transport dependencies. One advisory remains: zod's memory exhaustion when validating oversized constrained collections is fixed only in zod 4, which needs a separate migration.
20
+
21
+ ## 0.7.0-beta
22
+
23
+ - Refactors diagnostic queueing and reservation transitions into separate paths, makes pre-/post-dispatch error handling explicit, and shares audit hashing and snapshot normalization. Ledger formats, schema versions, and safety policy are unchanged; adds coverage for queued journal failure without invalidating already-completed work.
24
+ - Retains uncertain diagnostic capacity for correlated malformed text results instead of mistaking validation failure for completion. Offline inspection now reads integrity, schema, reservations, and audit in one SQLite transaction, preventing mixed before/after release snapshots.
25
+ - Adds offline `release-diagnostics` with exact ID scope, a private bounded fencing-attestation file, explicit confirmation, exclusive ledger ownership, and atomic audit-plus-release. Records actual OS identity separately from the claimed verifier and checks content digests; it does not verify fencing truth or expose an MCP reset. Schema 1 migrates transactionally to schema 2, preserving unresolved work; `inspect-diagnostics` exposes read-only audit history. Exact committed retries are no-ops; changed attestation reuse is rejected.
26
+ - Validates JSON-RPC 2.0 response IDs and exclusive result/error envelopes before accepting output or retrying read-only JSON fallback. Missing/stale acknowledgements retain uncertain diagnostic capacity. New ledger reservations persist the exact wire RPC ID before dispatch; offline inspection distinguishes legacy records without one. IDs provide correlation, not an EOS status token or retry/deduplication guarantee.
27
+ - Adds `eos_ping`: bounded IPv4/IPv6 diagnostics executed on inventory hosts/groups, optional VRF/source IP, normalized loss/RTT and reachability findings, and opt-in original EOS text. Requires inherited `mcp_diagnostics_allowed: true`; read denial still vetoes execution. No configuration changes, automatic retries, or SSH/shell fallback.
28
+ - Fixes read-only auto output fallback for EOS code 1003 (`unconverted command`) and aligns optional read integration hostnames with the checked-in unprefixed topology. Ping's single-execution text path still never retries.
29
+ - Adds configurable `diagnostics` limits/timeouts with sensible defaults, ledger-scoped admission across simultaneous calls, and indefinite fail-closed reservations when device completion is unknown. Reports permission in inventory views, effective limits and live reservation state in server info, and a structured `diagnostic_capacity_uncertain` error when uncertainty exhausts capacity. Reservations are committed before dispatch to a private, inventory-keyed SQLite ledger and survive restart as uncertain. A crash-released ownership lock prevents competing owners; storage errors fail closed. Adds optional `diagnostics.stateFile` and offline, read-only `inspect-diagnostics`. Offline operator-attested release is available; a machine-verified native remote deadline/completion facility remains unresolved; post-dispatch RPC interruption errors do not prove completion. Qualified on cEOS 4.34.3M; traceroute and packet capture remain future work.
5
30
  - Publishes the package to npm as `@aristanetworks/eos-mcp-server` (#14). The installed command is still `eos-mcp-server`. The release workflow publishes through npm trusted publishing, and prerelease tags go to the `next` dist-tag. The release tarball is now named `aristanetworks-eos-mcp-server-<version>.tgz`.
31
+ - Upgrading from a `.tgz` install: run `npm uninstall -g eos-mcp-server` before `npm install -g @aristanetworks/eos-mcp-server`. Both packages provide the same `eos-mcp-server` command.
6
32
 
7
33
  ## 0.6.1-beta
8
34
 
package/README.md CHANGED
@@ -1,11 +1,14 @@
1
- # eos-mcp-server BETA
1
+ # eos-mcp-server
2
2
 
3
- Read-only MCP server for Arista EOS eAPI (JSON-RPC over HTTPS).
3
+ [![Project status: Beta](https://img.shields.io/badge/status-beta-orange.svg)](https://github.com/aristanetworks/eos-mcp-server/releases)
4
+ [![npm version](https://img.shields.io/npm/v/%40aristanetworks%2Feos-mcp-server.svg)](https://www.npmjs.com/package/@aristanetworks/eos-mcp-server)
5
+
6
+ Read-only (non-configuring) MCP server for Arista EOS eAPI (JSON-RPC over HTTPS).
4
7
 
5
8
  > **Beta status:** this project is under active development.
6
9
  > **Support:** best-effort only. This open source project is not currently supported by Arista TAC.
7
10
 
8
- This server provides a set of **read-only** tools. It never exposes configuration-changing operations. The server can:
11
+ This server never exposes configuration-changing operations. It provides read-only inspection and explicitly authorized, bounded **active diagnostics**. Non-configuring does not mean passive or harmless: diagnostics generate traffic. The server can:
9
12
 
10
13
  - introspect its own runtime and inventory
11
14
  - list inventory hosts/groups
@@ -14,8 +17,9 @@ This server provides a set of **read-only** tools. It never exposes configuratio
14
17
  - retrieve bounded logging output for troubleshooting
15
18
  - collect a fixed set of device facts
16
19
  - retrieve running configuration
20
+ - run bounded ping diagnostics on EOS devices, including group fan-out
17
21
 
18
- > **Security note:** LLMs have occasionally tried to bypass the MCP server and make configuration changes through other means (for example, SSH). As a best practice, use AAA and scope the authentication credentials used by this server to read-only access.
22
+ > **Security note:** LLMs have occasionally tried to bypass the MCP server and make configuration changes through other means (for example, SSH). As a best practice, use AAA and scope the authentication credentials used by this server to the intended inspection and diagnostic commands only.
19
23
 
20
24
  ## Contents
21
25
 
@@ -24,6 +28,7 @@ This server provides a set of **read-only** tools. It never exposes configuratio
24
28
  - [Install and get started](#install-and-get-started)
25
29
  - [Server config file](#server-config-file)
26
30
  - [Connect to an MCP client](#connect-to-an-mcp-client)
31
+ - [Skills](#skills)
27
32
  - [CLI usage](#cli-usage)
28
33
  - [MCP tool reference](#mcp-tool-reference)
29
34
  - [Inventory formats](#inventory-formats)
@@ -39,6 +44,7 @@ Implemented MCP tools:
39
44
  - `eos_get_server_info`
40
45
  - `eos_list_inventory`
41
46
  - `eos_probe_devices`
47
+ - `eos_ping`
42
48
  - `eos_run_show`
43
49
  - `eos_show_logging`
44
50
  - `eos_get_facts`
@@ -55,40 +61,68 @@ Implemented local CLI commands:
55
61
 
56
62
  - Node.js 24+
57
63
  - Arista EOS devices reachable via eAPI over HTTPS
58
- - EOS 4.20 or later
64
+ - EOS 4.20 or later for existing read operations; `eos_ping` is qualified on cEOS 4.34.3M
59
65
  - Inventory in one of the supported YAML formats
60
66
 
61
67
  ## Install and get started
62
68
 
63
- 1. Install the package globally from npm:
69
+ The package is published on npm as [`@aristanetworks/eos-mcp-server`](https://www.npmjs.com/package/@aristanetworks/eos-mcp-server). The package provides the `eos-mcp-server` command.
64
70
 
65
- ```bash
66
- npm install -g @aristanetworks/eos-mcp-server
67
- ```
71
+ ### npx or global install?
68
72
 
69
- Prereleases are published under the `next` tag (`npm install -g @aristanetworks/eos-mcp-server@next`). Each [GitHub release](https://github.com/aristanetworks/eos-mcp-server/releases) also attaches the package as a `.tgz`, which you can install with `npm install -g ./aristanetworks-eos-mcp-server-<version>.tgz`.
73
+ Both run the same package. They differ in when the version changes and whether the npm registry must be reachable when the server starts.
70
74
 
71
- 2. Confirm that the command is available:
75
+ | Use | When |
76
+ | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
77
+ | `npx -y @aristanetworks/eos-mcp-server` | You're trying the server out, or mainly run it from an MCP client. Nothing to install, and it picks up the latest release when it launches. |
78
+ | `npx -y @aristanetworks/eos-mcp-server@<version>` | You want a reproducible setup, such as an MCP config shared with a team. Everyone runs the same version until you change it. |
79
+ | `npm install -g @aristanetworks/eos-mcp-server` | You run the CLI often, want to control when upgrades happen, or the npm registry isn't always reachable. The command starts without a registry lookup and stays on one version until you run `npm update -g`. |
80
+ | `.tgz` from a [GitHub release](https://github.com/aristanetworks/eos-mcp-server/releases) | The machine can't reach the npm registry at all. |
72
81
 
73
- ```bash
74
- eos-mcp-server --help
75
- ```
82
+ ### Run with npx (recommended)
76
83
 
77
- The global install places `eos-mcp-server` on your `PATH`. To remove it later:
84
+ No install step is needed. `npx` downloads the package on first use and caches it:
78
85
 
79
86
  ```bash
80
- npm uninstall -g @aristanetworks/eos-mcp-server
87
+ npx -y @aristanetworks/eos-mcp-server --help
81
88
  ```
82
89
 
83
- Next, create an inventory, provide the device password, and validate connectivity:
90
+ The [MCP client examples](#connect-to-an-mcp-client) below use `npx`. `-y` skips npm's install confirmation prompt, which an MCP client can't answer. Without a version, npx checks the registry for the latest release each time it launches the server. To pin a specific release, append a version, for example `@aristanetworks/eos-mcp-server@0.8.1-beta`.
91
+
92
+ ### Or install globally
93
+
94
+ A global install puts `eos-mcp-server` on your `PATH`, starts without a registry lookup, and stays on the installed version until you update it:
95
+
96
+ ```bash
97
+ npm install -g @aristanetworks/eos-mcp-server
98
+ eos-mcp-server --help
99
+ ```
100
+
101
+ Update it later with `npm update -g @aristanetworks/eos-mcp-server`, or remove it with `npm uninstall -g @aristanetworks/eos-mcp-server`.
102
+
103
+ Prereleases are published under the `next` tag (`@aristanetworks/eos-mcp-server@next`). Each [GitHub release](https://github.com/aristanetworks/eos-mcp-server/releases) also attaches the package as a `.tgz`, for offline installs: `npm install -g ./aristanetworks-eos-mcp-server-<version>.tgz`.
104
+
105
+ ### Upgrading from a `.tgz` install
106
+
107
+ Versions up to 0.6.1-beta were distributed as `.tgz` files under the unscoped package name `eos-mcp-server`. Both packages provide the same `eos-mcp-server` command, so remove the old package before switching to npm. Otherwise the global install can fail with a conflict, or the old version keeps running:
108
+
109
+ ```bash
110
+ npm uninstall -g eos-mcp-server
111
+ ```
112
+
113
+ ### Validate your inventory
114
+
115
+ Create an inventory, provide the device password, and validate connectivity:
84
116
 
85
117
  ```bash
86
118
  export EOS_MCP_PASSWORD='replace-with-device-password'
87
119
 
88
- eos-mcp-server validate-inventory --inventory inventory.yml
89
- eos-mcp-server probe --inventory inventory.yml --target leaf1
120
+ npx -y @aristanetworks/eos-mcp-server validate-inventory --inventory inventory.yml
121
+ npx -y @aristanetworks/eos-mcp-server probe --inventory inventory.yml --target leaf1
90
122
  ```
91
123
 
124
+ With a global install, run `eos-mcp-server` in place of `npx -y @aristanetworks/eos-mcp-server`. The [CLI usage](#cli-usage) examples later in this README use the shorter `eos-mcp-server` form.
125
+
92
126
  See [Quickstart](docs/QUICKSTART.md) for a complete inventory example and MCP client setup. For building or contributing from source, see the [developer workflow](docs/DEVELOPMENT.md).
93
127
 
94
128
  ## Server config file
@@ -114,6 +148,17 @@ maxShowCommandsPerRequest: 5
114
148
  maxLoggingMessagesPerRequest: 1000
115
149
  maxResponseSizeBytes: 1048576
116
150
  eapiVersion: latest
151
+ diagnostics:
152
+ defaultPingCount: 3
153
+ maxPingCount: 10
154
+ maxProbesPerRequest: 100
155
+ maxDestinationsPerRequest: 16
156
+ deviceConcurrency: 5
157
+ pingReplyTimeoutMs: 1000
158
+ commandTimeoutMs: 30000
159
+ httpTimeoutMs: 35000
160
+ overallOperationTimeoutMs: 60000
161
+ nativeRequestTimeout: true
117
162
  secretEnvPrefixes:
118
163
  - EOS_MCP_
119
164
  defaultConnection:
@@ -126,6 +171,7 @@ Supported config fields:
126
171
 
127
172
  - `inventory`
128
173
  - `actor`
174
+ - `logFile`
129
175
  - `caFile`
130
176
  - `readTimeoutMs`
131
177
  - `overallOperationTimeoutMs`
@@ -135,30 +181,41 @@ Supported config fields:
135
181
  - `maxLoggingMessagesPerRequest`
136
182
  - `maxResponseSizeBytes`
137
183
  - `eapiVersion`
184
+ - `diagnostics` — optional limits/timeouts mapping; see [Network diagnostics](docs/DIAGNOSTICS.md#settings-and-defaults)
138
185
  - `secretEnvPrefixes`
139
186
  - `defaultConnection.ansibleUser`
140
187
  - `defaultConnection.ansibleHttpapiPort`
141
188
  - `defaultConnection.mcpValidateCerts`
142
189
  - `defaultConnection.mcpPasswordEnv`
143
190
 
144
- `readTimeoutMs` applies to each device eAPI request. `overallOperationTimeoutMs`, when set, bounds the whole tool call and aborts in-flight device requests once the limit is reached. `maxLoggingMessagesPerRequest` caps `eos_show_logging.message_count` and defaults to 1000. `maxResponseSizeBytes` limits both the buffered HTTP response from each device and the final serialized read-tool result. `eapiVersion` selects the eAPI JSON output schema sent as the `runCmds` `version` parameter: `latest` (the default) returns the current schema for each command, and `1` pins the original schema for consumers that depend on it. It only affects JSON output, so `eos_get_running_config` and `eos_show_logging` are unchanged.
191
+ For read tools, `readTimeoutMs` applies to each device eAPI request. `overallOperationTimeoutMs`, when set, bounds the whole read-tool call and aborts in-flight device requests once the limit is reached. `maxLoggingMessagesPerRequest` caps `eos_show_logging.message_count` and defaults to 1000. `maxResponseSizeBytes` limits both the buffered HTTP response from each device and the final serialized result of device read operations. `eapiVersion` selects the eAPI JSON output schema sent as the `runCmds` `version` parameter: `latest` (the default) returns the current schema for each command, and `1` pins the original schema for consumers that depend on it. It only affects JSON output, so `eos_get_running_config` and `eos_show_logging` are unchanged.
192
+
193
+ `eos_ping` uses its own configurable `diagnostics` timeouts and per-server concurrency, while sharing `maxReadTargets` and `maxResponseSizeBytes`. Omitted diagnostic settings retain the defaults shown above; invalid or contradictory settings fail validation. Ping requires explicit inventory permission and has no automatic retries. Response IDs and protocol envelopes are validated before output is accepted. When a ping's remote completion is unknown (timeout, cancellation, lost connection), its slot is held for `commandTimeoutMs` and then freed automatically; inspect the running server's `eos_get_server_info.diagnostics.capacity`. Capacity lives in memory, so several MCP servers can use the same inventory at once. See [Network diagnostics](docs/DIAGNOSTICS.md), including the distinction between a reply timeout, command budget, and remote process termination.
194
+
195
+ `actor` and `logFile` remain sanitized runtime metadata and do not enable a general tool-call audit log.
145
196
 
146
197
  `defaultConnection.mcpPasswordEnv` is a fallback password source. A host or inherited inventory value for `mcp_password_env` or `ansible_password` overrides it. Setting both `mcp_password_env` and `ansible_password` for the same host remains invalid.
147
198
 
148
199
  ## Connect to an MCP client
149
200
 
150
- These examples assume you've already installed `eos-mcp-server` per [Install and get started](#install-and-get-started) above, and have an inventory file (and optionally a [server config file](#server-config-file)) ready.
201
+ These examples assume you have an inventory file (and optionally a [server config file](#server-config-file)) ready. They launch the server with `npx`, so nothing needs to be installed first. If you [installed globally](#or-install-globally), use `eos-mcp-server` as the command and drop `-y @aristanetworks/eos-mcp-server` from the arguments.
151
202
 
152
203
  ### Generic stdio example
153
204
 
154
- If `eos-mcp-server` is installed on your `PATH`, point it at just an inventory file:
205
+ Point the server at just an inventory file:
155
206
 
156
207
  ```json
157
208
  {
158
209
  "mcpServers": {
159
210
  "eos": {
160
- "command": "eos-mcp-server",
161
- "args": ["serve", "--inventory", "/absolute/path/to/inventory.yml"]
211
+ "command": "npx",
212
+ "args": [
213
+ "-y",
214
+ "@aristanetworks/eos-mcp-server",
215
+ "serve",
216
+ "--inventory",
217
+ "/absolute/path/to/inventory.yml"
218
+ ]
162
219
  }
163
220
  }
164
221
  }
@@ -170,33 +227,39 @@ Or use a [server config file](#server-config-file) if you want to set additional
170
227
  {
171
228
  "mcpServers": {
172
229
  "eos": {
173
- "command": "eos-mcp-server",
174
- "args": ["serve", "--config", "/absolute/path/to/eos-mcp-server.yml"]
230
+ "command": "npx",
231
+ "args": [
232
+ "-y",
233
+ "@aristanetworks/eos-mcp-server",
234
+ "serve",
235
+ "--config",
236
+ "/absolute/path/to/eos-mcp-server.yml"
237
+ ]
175
238
  }
176
239
  }
177
240
  }
178
241
  ```
179
242
 
180
- If you built the project locally instead of installing the package, replace `"command": "eos-mcp-server"` with `"command": "node"` and put `/absolute/path/to/eos-mcp-server/dist/index.js` first in `args`.
243
+ If you built the project locally instead, use `"command": "node"` and put `/absolute/path/to/eos-mcp-server/dist/index.js` first in `args`, in place of `-y` and the package name.
181
244
 
182
245
  ### Claude Code
183
246
 
184
247
  With just an inventory file:
185
248
 
186
249
  ```bash
187
- claude mcp add eos -- eos-mcp-server serve --inventory /absolute/path/to/inventory.yml
250
+ claude mcp add eos -- npx -y @aristanetworks/eos-mcp-server serve --inventory /absolute/path/to/inventory.yml
188
251
  ```
189
252
 
190
253
  Or with a [server config file](#server-config-file) for additional options:
191
254
 
192
255
  ```bash
193
- claude mcp add eos -- eos-mcp-server serve --config /absolute/path/to/eos-mcp-server.yml
256
+ claude mcp add eos -- npx -y @aristanetworks/eos-mcp-server serve --config /absolute/path/to/eos-mcp-server.yml
194
257
  ```
195
258
 
196
259
  Add `-s user` before `eos` in either command to make the server available across all your projects instead of just the current one:
197
260
 
198
261
  ```bash
199
- claude mcp add -s user eos -- eos-mcp-server serve --inventory /absolute/path/to/inventory.yml
262
+ claude mcp add -s user eos -- npx -y @aristanetworks/eos-mcp-server serve --inventory /absolute/path/to/inventory.yml
200
263
  ```
201
264
 
202
265
  ### Codex
@@ -208,8 +271,9 @@ With just an inventory file:
208
271
 
209
272
  ```toml
210
273
  [mcp_servers.eos]
211
- command = "eos-mcp-server"
212
- args = ["serve", "--inventory", "/absolute/path/to/inventory.yml"]
274
+ supports_parallel_tool_calls = true
275
+ command = "npx"
276
+ args = ["-y", "@aristanetworks/eos-mcp-server", "serve", "--inventory", "/absolute/path/to/inventory.yml"]
213
277
  env_vars = ["EOS_MCP_PASSWORD"]
214
278
  ```
215
279
 
@@ -217,24 +281,42 @@ Or with a [server config file](#server-config-file) for additional options:
217
281
 
218
282
  ```toml
219
283
  [mcp_servers.eos]
220
- command = "eos-mcp-server"
221
- args = ["serve", "--config", "/absolute/path/to/eos-mcp-server.yml"]
284
+ supports_parallel_tool_calls = true
285
+ command = "npx"
286
+ args = ["-y", "@aristanetworks/eos-mcp-server", "serve", "--config", "/absolute/path/to/eos-mcp-server.yml"]
222
287
  env_vars = ["EOS_MCP_PASSWORD"]
223
288
  ```
224
289
 
290
+ Set `supports_parallel_tool_calls = true` under `[mcp_servers.eos]` to let
291
+ Codex dispatch independent tool calls, including pings, concurrently. Without
292
+ this opt-in, tools that omit the MCP read-only annotation may run serially even
293
+ when requested together. Reload Codex after changing the setting. The server
294
+ still enforces its configured diagnostic concurrency and packet limits.
295
+ A single `eos_ping` call with several `destinations` already runs them
296
+ concurrently on the server, so this setting matters for other independent
297
+ calls, such as show commands on different devices or pings that need different
298
+ VRFs, sources, or counts.
299
+
225
300
  `serve` is optional because it is the default command, but is shown explicitly
226
- here for clarity. You can also add the server with:
301
+ here for clarity. After exporting the password, you can also add the server and
302
+ pass its current value through with the Codex CLI:
227
303
 
228
304
  ```bash
229
- codex mcp add eos -- eos-mcp-server serve --inventory /absolute/path/to/inventory.yml
305
+ export EOS_MCP_PASSWORD='replace-with-device-password'
306
+
307
+ codex mcp add eos \
308
+ --env EOS_MCP_PASSWORD="$EOS_MCP_PASSWORD" \
309
+ -- npx -y @aristanetworks/eos-mcp-server serve \
310
+ --inventory /absolute/path/to/inventory.yml
230
311
  ```
231
312
 
232
- Then add `env_vars = ["EOS_MCP_PASSWORD"]` to the generated
233
- `[mcp_servers.eos]` table.
313
+ The `--env` form stores the expanded value in the generated Codex configuration.
314
+ To have Codex read the variable from its environment each time it starts the
315
+ server, use `env_vars = ["EOS_MCP_PASSWORD"]` as in the TOML examples above.
234
316
 
235
317
  ### Passing secrets to the MCP server
236
318
 
237
- Prefer exporting secrets in the environment that launches the MCP client:
319
+ To export secrets in the environment that launches the MCP client use:
238
320
 
239
321
  ```bash
240
322
  export EOS_MCP_PASSWORD='super-secret'
@@ -244,6 +326,30 @@ For Codex, `env_vars = ["EOS_MCP_PASSWORD"]` forwards that exported variable to
244
326
  the server. Other MCP clients may support per-server `env` blocks. Avoid
245
327
  committing secret values to client config files when possible.
246
328
 
329
+ ## Skills
330
+
331
+ The [`skills/`](skills/) folder holds community-created skills for everyday network operations workflows. Each skill is a `SKILL.md` file that teaches an AI assistant, such as Claude Code or Codex, how to carry out one workflow with this server's read-only tools: which `show` commands to run, how to read the output, what to investigate next, and how to report results.
332
+
333
+ The current skills cover:
334
+
335
+ - **Health checks:** BGP, EVPN and EVPN multicast, interfaces, Port-Channels/LACP, VLANs, routing tables and VRFs, IGMP snooping, and PIM.
336
+ - **Validation:** ISIS Segment Routing, RFC 9721 EVPN IP mobility, and MCS/CVX configuration.
337
+ - **Troubleshooting:** multicast flows that are missing, dropping, or corrupted; PTP grandmaster and connectivity problems; Segment Routing faults; and MCS mounts and agents.
338
+
339
+ See [`skills/README.md`](skills/README.md) for the full list and for how to load the skills into Claude Code or Codex. Skills aren't included in the npm package, so clone this repository to use them.
340
+
341
+ ### Contribute a skill
342
+
343
+ If you have a workflow you run by hand, such as a check you do after a change window, a runbook for a recurring problem, or an audit for a feature your network depends on, consider contributing it as a skill so other network engineers can use it too.
344
+
345
+ 1. Add `skills/<skill-name>/SKILL.md` with `name`, `description`, `trigger`, and `allowed-tools` frontmatter. The existing skills are good templates.
346
+ 2. Keep it **read-only**, and keep it **generic**: no site-specific hostnames, group names, or inventory layouts.
347
+ 3. Document the EOS commands the skill runs, the JSON fields it relies on, and what to check when something looks wrong.
348
+ 4. Add a row for the skill to the table in [`skills/README.md`](skills/README.md).
349
+ 5. Open a pull request that changes only files under `skills/`.
350
+
351
+ Pull requests that touch only `skills/` can be accepted without a contributor license agreement. They are licensed under Apache-2.0. See [CONTRIBUTING.md](CONTRIBUTING.md) for details, and [Writing a new skill](skills/README.md#writing-a-new-skill) for the full guidelines. Improvements to existing skills are welcome too, such as coverage for another EOS feature, a better diagnostic drill-down, or a fix for output that changed between EOS releases.
352
+
247
353
  ## Inventory formats
248
354
 
249
355
  The server supports exactly one inventory file loaded at startup. The inventory is not watched for changes — to pick up inventory edits, restart the server. Most MCP clients will do this automatically when you restart the client or re-launch the MCP connection.
@@ -326,6 +432,8 @@ still using their individual credentials.
326
432
  - `mcp_platform: arista_eos`
327
433
  - `mcp_read_allowed` defaults to `true` for eligible EOS hosts. Set it to `false` — inherited like any other variable — to explicitly deny read access to a host or group.
328
434
  - Read operations fail closed if the resolved target contains ineligible or read-denied hosts.
435
+ - `mcp_diagnostics_allowed` defaults to `false`. Set this inherited boolean to `true` to permit `eos_ping`; read denial still vetoes diagnostics. A mixed-permission group fails before any dispatch.
436
+ - A diagnostic destination is distinct from the inventory target and may be an address outside inventory.
329
437
 
330
438
  ## Connection and authentication
331
439
 
@@ -407,7 +515,7 @@ caFile: /path/to/ca.pem
407
515
 
408
516
  ## CLI usage
409
517
 
410
- If no subcommand is provided, the CLI defaults to `serve`.
518
+ If no subcommand is provided, the CLI defaults to `serve`. These examples use the globally installed `eos-mcp-server` command; with npx, run `npx -y @aristanetworks/eos-mcp-server` in its place.
411
519
 
412
520
  ### `serve`
413
521
 
@@ -462,7 +570,7 @@ Devices: 1/1 succeeded
462
570
 
463
571
  ### `eos_get_server_info`
464
572
 
465
- Returns a sanitized summary of server runtime, capabilities, limits, TLS/config posture, and inventory summary.
573
+ Returns a sanitized summary of server runtime, capabilities, limits, TLS/config posture, inventory summary, and live active/uncertain diagnostic reservations. Reservation metadata excludes destinations, credentials, and original EOS output.
466
574
 
467
575
  Input:
468
576
 
@@ -495,6 +603,23 @@ Input:
495
603
  }
496
604
  ```
497
605
 
606
+ ### `eos_ping`
607
+
608
+ Runs bounded ping from an inventory host or group to one or more destinations, requiring inherited `mcp_diagnostics_allowed: true`. It generates traffic without changing configuration. Each destination must be a unicast IPv4/IPv6 literal, and duplicates are rejected, including different spellings of the same IPv6 address; use a one-element `destinations` array for a single ping. Destinations run concurrently within the server's diagnostic concurrency, up to 16 per call by default. Optional VRF and source IP apply to every destination and never silently fall back. Count defaults to 3 per destination and is capped at 10 unless changed in settings.
609
+
610
+ ```json
611
+ {
612
+ "target": "leaf1",
613
+ "destinations": ["192.0.2.10", "192.0.2.20"],
614
+ "count": 3,
615
+ "vrf": "BLUE",
616
+ "source": "192.0.2.11",
617
+ "include_raw": false
618
+ }
619
+ ```
620
+
621
+ `count`, `vrf`, `source`, and `include_raw` are optional. Results contain one entry per host and destination, each naming its `destination`; `summary` counts those entries. Results separate execution status from `reachable`/`partial`/`unreachable` findings and include loss/RTT measurements. Zero replies do not establish a cause. See [Network diagnostics](docs/DIAGNOSTICS.md) for all limits, address restrictions, lifecycle caveats, and result semantics. Traceroute and packet capture are not yet implemented.
622
+
498
623
  ### `eos_run_show`
499
624
 
500
625
  Runs one or more `show` commands.
@@ -624,18 +749,20 @@ This means the target resolved to at least one host that is either not marked as
624
749
 
625
750
  The read-path tools have been validated against EOS 4.34.3M. The minimum supported EOS version for read operations is 4.20, which is when eAPI JSON-RPC became stable and `show` commands reliably produce structured JSON output.
626
751
 
752
+ `eos_ping` has separately been validated on cEOS 4.34.3M. Older EOS versions and physical platforms have not been qualified for this new tool.
753
+
627
754
  ## Design notes
628
755
 
629
- - inventory is the trust boundary
756
+ - inventory is the execution-target trust boundary; diagnostic destinations may be outside inventory
630
757
  - reads are fail-closed on ineligible or denied targets
631
- - the server exposes only documented read-only operations
758
+ - the server exposes only documented non-configuring operations; active diagnostics require explicit opt-in
632
759
 
633
760
  ## Project docs
634
761
 
635
762
  Additional design and planning docs in the `docs/` directory:
636
763
 
637
- - `docs/design-overview.md` — design overview for evaluators
638
764
  - `docs/DESIGN.md` — detailed design specification
765
+ - `docs/DIAGNOSTICS.md` — ping usage, settings, safety, lifecycle, and extension seam
639
766
  - `docs/IMPLEMENTATION_PLAN.md` — implemented scope and maintenance priorities
640
767
  - `docs/CHECKPOINT.md` — current implementation status
641
768
  - `docs/CODE_WALKTHROUGH.md` — source layout and module guide
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ export declare const diagnosticsConfigSchema: z.ZodEffects<z.ZodObject<{
3
+ stateFile: z.ZodOptional<z.ZodNever>;
4
+ defaultPingCount: z.ZodDefault<z.ZodNumber>;
5
+ maxPingCount: z.ZodDefault<z.ZodNumber>;
6
+ maxProbesPerRequest: z.ZodDefault<z.ZodNumber>;
7
+ maxDestinationsPerRequest: z.ZodDefault<z.ZodNumber>;
8
+ deviceConcurrency: z.ZodDefault<z.ZodNumber>;
9
+ pingReplyTimeoutMs: z.ZodDefault<z.ZodNumber>;
10
+ commandTimeoutMs: z.ZodDefault<z.ZodNumber>;
11
+ httpTimeoutMs: z.ZodDefault<z.ZodNumber>;
12
+ overallOperationTimeoutMs: z.ZodDefault<z.ZodNumber>;
13
+ nativeRequestTimeout: z.ZodDefault<z.ZodBoolean>;
14
+ }, "strict", z.ZodTypeAny, {
15
+ defaultPingCount: number;
16
+ maxPingCount: number;
17
+ maxProbesPerRequest: number;
18
+ maxDestinationsPerRequest: number;
19
+ deviceConcurrency: number;
20
+ pingReplyTimeoutMs: number;
21
+ commandTimeoutMs: number;
22
+ httpTimeoutMs: number;
23
+ overallOperationTimeoutMs: number;
24
+ nativeRequestTimeout: boolean;
25
+ stateFile?: undefined;
26
+ }, {
27
+ stateFile?: undefined;
28
+ defaultPingCount?: number | undefined;
29
+ maxPingCount?: number | undefined;
30
+ maxProbesPerRequest?: number | undefined;
31
+ maxDestinationsPerRequest?: number | undefined;
32
+ deviceConcurrency?: number | undefined;
33
+ pingReplyTimeoutMs?: number | undefined;
34
+ commandTimeoutMs?: number | undefined;
35
+ httpTimeoutMs?: number | undefined;
36
+ overallOperationTimeoutMs?: number | undefined;
37
+ nativeRequestTimeout?: boolean | undefined;
38
+ }>, {
39
+ defaultPingCount: number;
40
+ maxPingCount: number;
41
+ maxProbesPerRequest: number;
42
+ maxDestinationsPerRequest: number;
43
+ deviceConcurrency: number;
44
+ pingReplyTimeoutMs: number;
45
+ commandTimeoutMs: number;
46
+ httpTimeoutMs: number;
47
+ overallOperationTimeoutMs: number;
48
+ nativeRequestTimeout: boolean;
49
+ stateFile?: undefined;
50
+ }, {
51
+ stateFile?: undefined;
52
+ defaultPingCount?: number | undefined;
53
+ maxPingCount?: number | undefined;
54
+ maxProbesPerRequest?: number | undefined;
55
+ maxDestinationsPerRequest?: number | undefined;
56
+ deviceConcurrency?: number | undefined;
57
+ pingReplyTimeoutMs?: number | undefined;
58
+ commandTimeoutMs?: number | undefined;
59
+ httpTimeoutMs?: number | undefined;
60
+ overallOperationTimeoutMs?: number | undefined;
61
+ nativeRequestTimeout?: boolean | undefined;
62
+ }>;
63
+ /** Conservative bound: finite probes, fixed 1s spacing, reply waits, and scheduling margin. */
64
+ export declare function pingExecutionBoundMs(count: number, replyTimeoutMs: number): number;
65
+ export type DiagnosticsConfig = z.infer<typeof diagnosticsConfigSchema>;
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ // Node timers must not overflow into an effectively immediate timeout.
3
+ const MAX_TIMER_MS = 2_147_483_647;
4
+ const positiveInteger = z.number().int().positive().max(MAX_TIMER_MS);
5
+ export const diagnosticsConfigSchema = z.object({
6
+ stateFile: z.never({ message: "Removed: diagnostic capacity is now held in memory (ADR 0006); delete this setting" }).optional(),
7
+ defaultPingCount: positiveInteger.default(3),
8
+ maxPingCount: positiveInteger.default(10),
9
+ maxProbesPerRequest: positiveInteger.default(100),
10
+ maxDestinationsPerRequest: positiveInteger.default(16),
11
+ deviceConcurrency: positiveInteger.default(5),
12
+ pingReplyTimeoutMs: positiveInteger.multipleOf(1000).default(1000),
13
+ commandTimeoutMs: positiveInteger.default(30_000),
14
+ httpTimeoutMs: positiveInteger.default(35_000),
15
+ overallOperationTimeoutMs: positiveInteger.default(60_000),
16
+ nativeRequestTimeout: z.boolean().default(true)
17
+ }).strict().superRefine((config, context) => {
18
+ const invalid = (path, message) => {
19
+ context.addIssue({ code: z.ZodIssueCode.custom, path: [path], message });
20
+ };
21
+ if (config.defaultPingCount > config.maxPingCount) {
22
+ invalid("defaultPingCount", "Must not exceed maxPingCount");
23
+ }
24
+ if (config.maxPingCount > config.maxProbesPerRequest) {
25
+ invalid("maxPingCount", "Must not exceed maxProbesPerRequest");
26
+ }
27
+ if (pingExecutionBoundMs(config.maxPingCount, config.pingReplyTimeoutMs) > config.commandTimeoutMs) {
28
+ invalid("commandTimeoutMs", "Must cover maxPingCount * (pingReplyTimeoutMs + 1000) + 1000 ms");
29
+ }
30
+ if (config.httpTimeoutMs < config.commandTimeoutMs + 1000) {
31
+ invalid("httpTimeoutMs", "Must exceed commandTimeoutMs by at least 1000 ms");
32
+ }
33
+ });
34
+ /** Conservative bound: finite probes, fixed 1s spacing, reply waits, and scheduling margin. */
35
+ export function pingExecutionBoundMs(count, replyTimeoutMs) {
36
+ return count * (1000 + replyTimeoutMs) + 1000;
37
+ }
38
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/config/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,uEAAuE;AACvE,MAAM,YAAY,GAAG,aAAa,CAAC;AACnC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,oFAAoF,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChI,gBAAgB,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,mBAAmB,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC;IACjD,yBAAyB,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,iBAAiB,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,kBAAkB,EAAE,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAClE,gBAAgB,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;IACjD,aAAa,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;IAC9C,yBAAyB,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC;IAC1D,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAChD,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;IAC1C,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,OAAe,EAAQ,EAAE;QACtD,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC;IACF,IAAI,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;QAClD,OAAO,CAAC,kBAAkB,EAAE,8BAA8B,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACrD,OAAO,CAAC,cAAc,EAAE,qCAAqC,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,oBAAoB,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACnG,OAAO,CAAC,kBAAkB,EAAE,iEAAiE,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,gBAAgB,GAAG,IAAI,EAAE,CAAC;QAC1D,OAAO,CAAC,eAAe,EAAE,kDAAkD,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,+FAA+F;AAC/F,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,cAAsB;IACxE,OAAO,KAAK,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC"}
@@ -19,6 +19,7 @@ export async function loadServerConfig(options) {
19
19
  }
20
20
  const merged = {
21
21
  configPath: resolvedConfigPath,
22
+ diagnostics: fileConfig.diagnostics,
22
23
  inventoryPath: resolveMaybePath(fileConfig.inventory, resolvedConfigPath),
23
24
  actor: fileConfig.actor,
24
25
  logFile: resolveMaybePath(fileConfig.logFile, resolvedConfigPath),
@@ -1 +1 @@
1
- {"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/config/loadConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/config/loadConfig.ts"],"names":[],"mappings":"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"}