@usex/mikrotik-mcp 4.2.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -119,6 +119,34 @@ bun run start # serve from source
119
119
  bun run build # bundle to dist/
120
120
  ```
121
121
 
122
+ ### As an MCP Bundle (`.mcpb`)
123
+
124
+ A one-click install for Claude Desktop and other MCPB hosts — no Bun, Node or npm
125
+ needed on the machine, and the router credentials are entered in the host's UI
126
+ rather than a shell.
127
+
128
+ ```bash
129
+ bun run build:mcp # bundle for this machine
130
+ bun run build:mcp --target linux-x64 # or one specific target
131
+ bun run build:mcp:all # every target
132
+ ```
133
+
134
+ Bundles land in `dist-mcpb/` as `mikrotik-mcp-<version>-<platform>-<arch>.mcpb`.
135
+ Open one with your MCPB host (on Claude Desktop, drag it onto Settings →
136
+ Extensions) and fill in the router address and credentials it prompts for.
137
+
138
+ Because the server is Bun-native — `bun:sqlite`, `Bun.serve`, `Bun.S3Client`, and
139
+ `@tikoci/centrs`, which ships raw TypeScript — it cannot run on the Node runtime an
140
+ MCPB host provides. Each bundle therefore **vendors the Bun binary it was built
141
+ against** and runs `runtime/bun dist/cli.js serve`, so every subsystem (MAC-Telnet,
142
+ the dashboard, S3 backups) behaves exactly as it does from source. That costs about
143
+ 60 MB per bundle and makes each one platform-specific — hence one artifact per
144
+ platform/arch rather than a single universal file.
145
+
146
+ The build stages the bundle, validates the manifest, and drives the staged server
147
+ over stdio (`initialize` + `tools/list`, asserting the tool count matches the
148
+ manifest) before packing. Pass `--no-smoke` to skip that last check.
149
+
122
150
  ## The tool catalog
123
151
 
124
152
  **706 tools across 111 modules.** Full, always-current reference (parameters +
package/dist/cli.js CHANGED
@@ -106,7 +106,7 @@ import {
106
106
  updateAaaEntity,
107
107
  updateSummaryLine,
108
108
  writeBackup
109
- } from "./shared/cli-365rqpy1.js";
109
+ } from "./shared/cli-mm90zmj3.js";
110
110
 
111
111
  // src/cli.ts
112
112
  import { existsSync as existsSync2 } from "fs";
package/dist/index.js CHANGED
@@ -29,7 +29,7 @@ import {
29
29
  selectToolModules,
30
30
  setConfig,
31
31
  updateSummaryLine
32
- } from "./shared/library-ndn9hj45.js";
32
+ } from "./shared/library-t0cfgfyj.js";
33
33
  // src/server.ts
34
34
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
35
35
  import { ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
@@ -4,7 +4,7 @@ import {
4
4
  allToolModules,
5
5
  moduleCatalog,
6
6
  selectToolModules
7
- } from "./cli-365rqpy1.js";
7
+ } from "./cli-mm90zmj3.js";
8
8
  export {
9
9
  selectToolModules,
10
10
  moduleCatalog,
@@ -8364,7 +8364,7 @@ var cache = null;
8364
8364
  async function gateway() {
8365
8365
  if (cache)
8366
8366
  return cache;
8367
- const { moduleCatalog } = await import("./cli-10a2apr1.js");
8367
+ const { moduleCatalog } = await import("./cli-k18dkv4w.js");
8368
8368
  const forIndex = [];
8369
8369
  const byName = new Map;
8370
8370
  for (const mod of moduleCatalog) {
@@ -23668,14 +23668,14 @@ ${result}`;
23668
23668
  name: "add_ospf_interface_template",
23669
23669
  title: "Add OSPF Interface Template",
23670
23670
  annotations: WRITE,
23671
- description: "Bind interfaces or network prefixes to an OSPF area (`/routing ospf interface-template add`). " + "Match links via `interfaces` (interface or interface-list name) and/or `networks` (prefix, " + "e.g. '10.0.0.0/24'). `type` sets the link model: broadcast (LAN), ptp (point-to-point), " + "nbma, ptmp, or virtual-link. `passive=true` advertises the subnet without forming OSPF adjacencies " + "(for stub networks). `auth`/`auth_id`/`auth_key` enable per-interface authentication; `hello_interval` " + "e.g. '10s', `dead_interval` e.g. '40s'. " + "Requires the area to already exist (add_ospf_area). " + "Returns the new template id (e.g. '*2') if RouterOS echoes one; use list_ospf_interface_templates to verify.",
23671
+ description: "Bind interfaces or network prefixes to an OSPF area (`/routing ospf interface-template add`). " + "Match links via `interfaces` (interface or interface-list name) and/or `networks` (prefix, " + "e.g. '10.0.0.0/24'). `type` sets the link model: broadcast (LAN), ptp (point-to-point), " + "ptmp, ptmp-broadcast, nbma, or virtual-link. `passive=true` advertises the subnet without forming OSPF adjacencies " + "(for stub networks). `auth`/`auth_id`/`auth_key` enable per-interface authentication; `hello_interval` " + "e.g. '10s', `dead_interval` e.g. '40s'. " + "Requires the area to already exist (add_ospf_area). " + "Returns the new template id (e.g. '*2') if RouterOS echoes one; use list_ospf_interface_templates to verify.",
23672
23672
  inputSchema: {
23673
23673
  area: z96.string().describe("OSPF area name to attach matched interfaces to"),
23674
23674
  interfaces: z96.string().optional().describe("Interface or interface-list name"),
23675
23675
  networks: z96.string().optional().describe('Network prefix(es) to enable OSPF on, e.g. "10.0.0.0/24"'),
23676
23676
  cost: z96.number().int().optional().describe("Output cost / metric"),
23677
23677
  priority: z96.number().int().optional().describe("DR election priority (0 = never DR)"),
23678
- type: z96.enum(["broadcast", "ptp", "nbma", "ptmp", "virtual-link"]).optional(),
23678
+ type: z96.enum(["broadcast", "ptp", "ptmp", "ptmp-broadcast", "nbma", "virtual-link"]).optional(),
23679
23679
  passive: z96.boolean().optional(),
23680
23680
  hello_interval: z96.string().optional().describe('e.g. "10s"'),
23681
23681
  dead_interval: z96.string().optional().describe('e.g. "40s"'),
@@ -8294,7 +8294,7 @@ var cache = null;
8294
8294
  async function gateway() {
8295
8295
  if (cache)
8296
8296
  return cache;
8297
- const { moduleCatalog } = await import("./library-wbht6e2m.js");
8297
+ const { moduleCatalog } = await import("./library-tmmvpwjf.js");
8298
8298
  const forIndex = [];
8299
8299
  const byName = new Map;
8300
8300
  for (const mod of moduleCatalog) {
@@ -23598,14 +23598,14 @@ ${result}`;
23598
23598
  name: "add_ospf_interface_template",
23599
23599
  title: "Add OSPF Interface Template",
23600
23600
  annotations: WRITE,
23601
- description: "Bind interfaces or network prefixes to an OSPF area (`/routing ospf interface-template add`). " + "Match links via `interfaces` (interface or interface-list name) and/or `networks` (prefix, " + "e.g. '10.0.0.0/24'). `type` sets the link model: broadcast (LAN), ptp (point-to-point), " + "nbma, ptmp, or virtual-link. `passive=true` advertises the subnet without forming OSPF adjacencies " + "(for stub networks). `auth`/`auth_id`/`auth_key` enable per-interface authentication; `hello_interval` " + "e.g. '10s', `dead_interval` e.g. '40s'. " + "Requires the area to already exist (add_ospf_area). " + "Returns the new template id (e.g. '*2') if RouterOS echoes one; use list_ospf_interface_templates to verify.",
23601
+ description: "Bind interfaces or network prefixes to an OSPF area (`/routing ospf interface-template add`). " + "Match links via `interfaces` (interface or interface-list name) and/or `networks` (prefix, " + "e.g. '10.0.0.0/24'). `type` sets the link model: broadcast (LAN), ptp (point-to-point), " + "ptmp, ptmp-broadcast, nbma, or virtual-link. `passive=true` advertises the subnet without forming OSPF adjacencies " + "(for stub networks). `auth`/`auth_id`/`auth_key` enable per-interface authentication; `hello_interval` " + "e.g. '10s', `dead_interval` e.g. '40s'. " + "Requires the area to already exist (add_ospf_area). " + "Returns the new template id (e.g. '*2') if RouterOS echoes one; use list_ospf_interface_templates to verify.",
23602
23602
  inputSchema: {
23603
23603
  area: z96.string().describe("OSPF area name to attach matched interfaces to"),
23604
23604
  interfaces: z96.string().optional().describe("Interface or interface-list name"),
23605
23605
  networks: z96.string().optional().describe('Network prefix(es) to enable OSPF on, e.g. "10.0.0.0/24"'),
23606
23606
  cost: z96.number().int().optional().describe("Output cost / metric"),
23607
23607
  priority: z96.number().int().optional().describe("DR election priority (0 = never DR)"),
23608
- type: z96.enum(["broadcast", "ptp", "nbma", "ptmp", "virtual-link"]).optional(),
23608
+ type: z96.enum(["broadcast", "ptp", "ptmp", "ptmp-broadcast", "nbma", "virtual-link"]).optional(),
23609
23609
  passive: z96.boolean().optional(),
23610
23610
  hello_interval: z96.string().optional().describe('e.g. "10s"'),
23611
23611
  dead_interval: z96.string().optional().describe('e.g. "40s"'),
@@ -4,7 +4,7 @@ import {
4
4
  allToolModules,
5
5
  moduleCatalog,
6
6
  selectToolModules
7
- } from "./library-ndn9hj45.js";
7
+ } from "./library-t0cfgfyj.js";
8
8
  export {
9
9
  selectToolModules,
10
10
  moduleCatalog,