netxops/test/fixtures-netx-mcp-tools.json
oliver 277a61894d Netx tools: convert MCP inputSchema to the DSH value schema DSL
defineTool rejected netx tools whose parameters carry standard JSON
Schema constraints ("parameters.page.minimum is not supported by the
value schema DSL"), and the old pass-through dropped the top-level
required list.

- mcp-schema.ts: fold minimum/maxItems/pattern/... into the description,
  mark required per property, map anyOf/oneOf/type arrays (minus null)
  to oneOf, default additionalProperties to true.
- Test compiles all 39 real /mcp tool schemas through defineTool.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 22:28:26 +08:00

1990 lines
No EOL
43 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[
{
"name": "queryNmsAlarms",
"inputSchema": {
"properties": {
"severity": {
"type": "string",
"description": "critical/major/minor/warning"
},
"is_cleared": {
"type": "string",
"description": "\"False\" = active only; \"True\" = cleared."
},
"ne_id": {
"type": "string",
"description": "Filter only; do not show UUID to users"
},
"host_name": {
"type": "string",
"description": "Filter by NE host_name"
},
"keyword": {
"type": "string",
"description": "Substring on cause/object/event. Examples: LOS, Fiber Break, bandwidth, CRC, BN EMS, dying gasp, License, optical power, BGP Neighbour."
},
"time_from": {
"type": "string",
"description": "ISO time; filters last_seen_at >="
},
"time_to": {
"type": "string",
"description": "ISO time; filters last_seen_at <="
},
"page": {
"type": "integer",
"minimum": 1,
"default": 1
},
"page_size": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 50
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "aggregateNmsAlarms",
"inputSchema": {
"properties": {
"severity": {
"type": "string",
"description": "Optional perceived_severity filter (critical/major/minor/warning)."
},
"top_ne": {
"type": "integer",
"minimum": 0,
"maximum": 5000,
"default": 50,
"description": "Max NE buckets to return (0 = all; positive limit up to 5000). Ignored when group_by is set."
},
"exclude_missing_host": {
"type": "boolean",
"default": true,
"description": "Omit (host_name missing) from by_ne / host rankings."
},
"time_from": {
"type": "string",
"description": "ISO time; filters last_seen_at >="
},
"time_to": {
"type": "string",
"description": "ISO time; filters last_seen_at <="
},
"group_by": {
"type": "string",
"enum": [
"alarm_alarm_key",
"alarm_host_name",
"alarm_ne_id",
"alarm_object_name",
"alarm_event_type",
"alarm_native_probable_cause",
"alarm_perceived_severity",
"alarm_is_cleared",
"alarm_time_created",
"alarm_root_cause_alarm_indication",
"ne_ne_id",
"ne_ne_name",
"ne_user_label",
"ne_ip_address",
"ne_ipv6_address",
"ne_ne_type",
"ne_device_level",
"ne_host_name",
"ne_location",
"ne_hardware_version",
"ne_loopback",
"ne_consistent_state",
"ne_interface_version",
"ne_mac",
"ne_admin_status",
"ne_address_type",
"ne_connection_status",
"ne_maintain_status",
"ne_net_mask",
"ne_create_time",
"ne_creator",
"ne_vendor",
"ne_source_type",
"ne_exists"
],
"description": "Optional. When set, routes to dynamic raw aggregation (same as aggregateNmsAlarmsRaw). Prefer alarm_host_name for NE Top."
},
"group_by2": {
"type": "string",
"enum": [
"alarm_alarm_key",
"alarm_host_name",
"alarm_ne_id",
"alarm_object_name",
"alarm_event_type",
"alarm_native_probable_cause",
"alarm_perceived_severity",
"alarm_is_cleared",
"alarm_time_created",
"alarm_root_cause_alarm_indication",
"ne_ne_id",
"ne_ne_name",
"ne_user_label",
"ne_ip_address",
"ne_ipv6_address",
"ne_ne_type",
"ne_device_level",
"ne_host_name",
"ne_location",
"ne_hardware_version",
"ne_loopback",
"ne_consistent_state",
"ne_interface_version",
"ne_mac",
"ne_admin_status",
"ne_address_type",
"ne_connection_status",
"ne_maintain_status",
"ne_net_mask",
"ne_create_time",
"ne_creator",
"ne_vendor",
"ne_source_type",
"ne_exists"
],
"description": "Optional second group field when group_by is set."
},
"is_cleared": {
"type": "string",
"description": "Only used when group_by is set."
},
"ne_id": {
"type": "string",
"description": "Only used when group_by is set."
},
"event_type": {
"type": "string",
"description": "Only used when group_by is set."
},
"keyword": {
"type": "string",
"description": "Only used when group_by is set."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 2000,
"default": 200,
"description": "Bucket limit when group_by is set (default 200)."
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "runNmsDiagnostics",
"inputSchema": {
"properties": {},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "queryNmsNeInventory",
"inputSchema": {
"properties": {
"keyword": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"default": 1
},
"page_size": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 50
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "getNmsNe",
"inputSchema": {
"properties": {
"ne_id": {
"type": "string",
"description": "NMS UUID, or exact host_name / IP."
}
},
"required": [
"ne_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "queryNmsAlarmsRaw",
"inputSchema": {
"properties": {
"severity": {
"type": "string"
},
"is_cleared": {
"type": "string"
},
"ne_id": {
"type": "string"
},
"event_type": {
"type": "string"
},
"keyword": {
"type": "string",
"description": "Substring filter; see queryNmsAlarms keyword examples."
},
"time_from": {
"type": "string"
},
"time_to": {
"type": "string"
},
"order_by": {
"type": "string",
"enum": [
"last_seen_at",
"time_created",
"perceived_severity",
"event_type",
"ne_id"
]
},
"order": {
"type": "string",
"enum": [
"asc",
"desc"
]
},
"select_fields": {
"type": "array",
"items": {
"type": "string"
}
},
"field_preset": {
"type": "string",
"enum": [
"brief",
"evidence",
"ne_debug"
]
},
"page": {
"type": "integer",
"minimum": 1,
"default": 1
},
"page_size": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 50
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "aggregateNmsAlarmsRaw",
"inputSchema": {
"properties": {
"group_by": {
"type": "string",
"enum": [
"alarm_alarm_key",
"alarm_host_name",
"alarm_ne_id",
"alarm_object_name",
"alarm_event_type",
"alarm_native_probable_cause",
"alarm_perceived_severity",
"alarm_is_cleared",
"alarm_time_created",
"alarm_root_cause_alarm_indication",
"ne_ne_id",
"ne_ne_name",
"ne_user_label",
"ne_ip_address",
"ne_ipv6_address",
"ne_ne_type",
"ne_device_level",
"ne_host_name",
"ne_location",
"ne_hardware_version",
"ne_loopback",
"ne_consistent_state",
"ne_interface_version",
"ne_mac",
"ne_admin_status",
"ne_address_type",
"ne_connection_status",
"ne_maintain_status",
"ne_net_mask",
"ne_create_time",
"ne_creator",
"ne_vendor",
"ne_source_type",
"ne_exists"
]
},
"group_by2": {
"type": "string",
"enum": [
"alarm_alarm_key",
"alarm_host_name",
"alarm_ne_id",
"alarm_object_name",
"alarm_event_type",
"alarm_native_probable_cause",
"alarm_perceived_severity",
"alarm_is_cleared",
"alarm_time_created",
"alarm_root_cause_alarm_indication",
"ne_ne_id",
"ne_ne_name",
"ne_user_label",
"ne_ip_address",
"ne_ipv6_address",
"ne_ne_type",
"ne_device_level",
"ne_host_name",
"ne_location",
"ne_hardware_version",
"ne_loopback",
"ne_consistent_state",
"ne_interface_version",
"ne_mac",
"ne_admin_status",
"ne_address_type",
"ne_connection_status",
"ne_maintain_status",
"ne_net_mask",
"ne_create_time",
"ne_creator",
"ne_vendor",
"ne_source_type",
"ne_exists"
]
},
"severity": {
"type": "string"
},
"is_cleared": {
"type": "string"
},
"ne_id": {
"type": "string"
},
"event_type": {
"type": "string"
},
"keyword": {
"type": "string"
},
"time_from": {
"type": "string"
},
"time_to": {
"type": "string"
},
"exclude_missing_host": {
"type": "boolean",
"default": true,
"description": "Omit missing host buckets when grouping by host/user_label fields."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 2000,
"default": 200
}
},
"required": [
"group_by"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "listNmsAlarmFields",
"inputSchema": {
"properties": {},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "sqlQueryNms",
"inputSchema": {
"properties": {
"sql": {
"type": "string"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 2000,
"default": 200
},
"statement_timeout_ms": {
"type": "integer",
"minimum": 0,
"maximum": 30000,
"default": 0
}
},
"required": [
"sql"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "listManagedNe",
"inputSchema": {
"properties": {
"keyword": {
"type": "string"
},
"vendor": {
"type": "string"
},
"connect_status": {
"type": "string",
"enum": [
"unknown",
"testing",
"pass",
"fail"
]
},
"page": {
"type": "integer",
"minimum": 1,
"default": 1
},
"page_size": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 20
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "getManagedNe",
"inputSchema": {
"properties": {
"ne_id": {
"type": "string",
"description": "Managed NE id (not NMS host_name / not NMS ne_id unless they coincide)."
}
},
"required": [
"ne_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "execManagedNe",
"inputSchema": {
"properties": {
"ne_id": {
"type": "string"
},
"nms_ne_id": {
"type": "string",
"description": "NMS inventory id (preferred)."
},
"ne_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"description": "Managed NE ids for concurrent batch (shared commands)."
},
"nms_ne_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"description": "NMS inventory ne_ids for concurrent batch (shared commands)."
},
"targets": {
"type": "array",
"maxItems": 20,
"items": {
"type": "object",
"properties": {
"ne_id": {
"type": "string"
},
"nms_ne_id": {
"type": "string"
},
"commands": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"maxItems": 5
}
},
"additionalProperties": false
},
"description": "Preferred for mixed-vendor / per-NE command sets: each item is one NE (ne_id OR nms_ne_id) with its own commands[]. Per-target commands override top-level shared commands. Still one concurrent batch — not N single-NE calls."
},
"commands": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"maxItems": 5,
"description": "Commands for single NE, or shared commands for ne_ids/nms_ne_ids. Optional fallback for targets that omit per-target commands."
},
"read_timeout_sec": {
"type": "integer",
"minimum": 10,
"maximum": 120,
"default": 60,
"description": "Per-command read timeout (default 60; use 90–120 for slow show)."
},
"concurrency": {
"type": "integer",
"minimum": 1,
"maximum": 8,
"default": 4,
"description": "Parallel NEs for batch mode (ignored for single-NE)."
},
"async": {
"type": "boolean",
"description": "true=background job_id + getNeExecJob; false=force sync; omit=auto for large batches (~4+ NEs, NETX_NE_EXEC_ASYNC_MIN_NES)."
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "getNeExecJob",
"inputSchema": {
"properties": {
"job_id": {
"type": "string",
"description": "Job id from execManagedNe async response."
}
},
"required": [
"job_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "listCliTargets",
"inputSchema": {
"properties": {
"source": {
"type": "string",
"enum": [
"managed",
"nms",
"all"
],
"default": "all",
"description": "nms selects the configured NMS inventory; managed selects managed NEs."
},
"keyword": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"default": 1
},
"page_size": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 50
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "findTopologyPaths",
"inputSchema": {
"properties": {
"from_nms_ne_id": {
"type": "string",
"description": "Source NMS ne_id (from alarm ne_id); mutually exclusive with from_managed_ne_id"
},
"from_managed_ne_id": {
"type": "string",
"description": "Source managed NE id; mutually exclusive with from_nms_ne_id"
},
"to_nms_ne_id": {
"type": "string",
"description": "Target NMS ne_id; mutually exclusive with to_managed_ne_id"
},
"to_managed_ne_id": {
"type": "string",
"description": "Target managed NE id; mutually exclusive with to_nms_ne_id"
},
"max_paths": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"default": 3
},
"max_hops": {
"type": "integer",
"minimum": 1,
"maximum": 12,
"default": 6
},
"layer": {
"type": "string",
"default": "physical"
},
"detail": {
"type": "string",
"enum": [
"summary",
"full"
],
"default": "summary",
"description": "summary=compact ops fields; full=include attrs/coords."
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "getTopologyTree",
"inputSchema": {
"properties": {
"compact": {
"type": "boolean",
"default": true,
"description": "Default true — slim folder/view fields. Pass false for raw API tree."
},
"max_depth": {
"type": "integer",
"minimum": 0,
"description": "Optional depth limit from root (0 = root only). Omitted = full depth."
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "getTopologyView",
"inputSchema": {
"properties": {
"view_id": {
"type": "string"
},
"detail": {
"type": "string",
"enum": [
"summary",
"full"
],
"default": "summary"
},
"sample": {
"type": "integer",
"minimum": 0,
"maximum": 200,
"default": 20,
"description": "Sample node count when detail=summary (use >=node_count for layout study)."
}
},
"required": [
"view_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "createTopologyFolder",
"inputSchema": {
"properties": {
"name": {
"type": "string",
"description": "Root or sub-region display name"
},
"parent_id": {
"type": "string",
"description": "Omit for new top-level「根」+根图. Pass 根图/region folder id to create a sub-region under it (not a sibling custom view)."
},
"locale": {
"type": "string",
"description": "Optional zh|en — labels auto「根图」vs Root map"
},
"sort_order": {
"type": "integer",
"default": 0
}
},
"required": [
"name"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "addTopologyViewNodes",
"inputSchema": {
"properties": {
"view_id": {
"type": "string"
},
"max_nodes": {
"type": "integer",
"minimum": 1,
"maximum": 2000,
"description": "Optional: PATCH this view's membership.max_nodes before add (use on physical 根图/region when soft cap blocks members)."
},
"keyword": {
"type": "string"
},
"role": {
"type": "string"
},
"vendor": {
"type": "string"
},
"link_status": {
"type": "string",
"enum": [
"linked",
"orphaned",
"managed",
"ume",
"both"
]
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 2000,
"default": 500
},
"offset": {
"type": "integer",
"minimum": 0,
"default": 0
},
"fabric_node_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"layout": {
"type": "string",
"enum": [
"grid",
"keep"
],
"default": "grid"
}
},
"required": [
"view_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "removeTopologyViewNodes",
"inputSchema": {
"properties": {
"view_id": {
"type": "string"
},
"keyword": {
"type": "string"
},
"role": {
"type": "string"
},
"vendor": {
"type": "string"
},
"link_status": {
"type": "string",
"enum": [
"linked",
"orphaned",
"managed",
"ume",
"both"
]
},
"fabric_node_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"view_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "sinkTopologyDualUnits",
"inputSchema": {
"properties": {
"source_view_id": {
"type": "string",
"description": "Root / source physical view_id to drain."
},
"sink_view_id": {
"type": "string",
"description": "Child-region physical view_id receiving batches."
},
"max_units": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 3,
"description": "Max dual_units per batch (default 3)."
},
"min_nodes": {
"type": "integer",
"minimum": 2,
"maximum": 200,
"default": 8
},
"max_nodes": {
"type": "integer",
"minimum": 2,
"maximum": 400,
"default": 300,
"description": "Max nodes per dual_unit candidate (CN eyes often 150–300)."
},
"max_batch_nodes": {
"type": "integer",
"minimum": 8,
"maximum": 800,
"default": 400
},
"layout_batch": {
"type": "boolean",
"default": true,
"description": "Default true: run layout_dual_unit per unit before parking (old staging/block layout). false = copy source coords only."
},
"unit_gap": {
"type": "number",
"default": 220,
"description": "Gap between laid-out units in a batch strip."
},
"until_empty": {
"type": "boolean",
"default": false,
"description": "Loop batches until source empty (watch MCP timeout)."
},
"max_batches": {
"type": "integer",
"minimum": 1,
"maximum": 200,
"description": "Safety cap when until_empty (default 50)."
},
"include_leftovers": {
"type": "boolean",
"default": true,
"description": "When dual_units exhausted, move leftover NE chunks."
},
"keep_layers": {
"type": "array",
"items": {
"type": "string"
},
"default": [
"core",
"agg"
],
"description": "Fabric layers that stay on source (not sunk). Default core+agg so root keeps the gravity bar; pass [] to drain everything (legacy)."
},
"sink_layers": {
"type": "array",
"items": {
"type": "string"
},
"default": [
"access",
"other"
],
"description": "Only move these layers this phase. Default access+other. Pass [] to allow any non-keep. With by_level=true, auto picks deepest remaining (access→agg→…)."
},
"by_level": {
"type": "boolean",
"default": false,
"description": "Auto sink deepest remaining non-keep layer each batch (access first, then agg if keep allows)."
},
"prefer_pure": {
"type": "boolean",
"default": false,
"description": "Legacy: prefer both portals sinkable. Default false so CN/core eyes (portals stay on root) are not deprioritized."
},
"prefer_core_eye": {
"type": "boolean",
"default": true,
"description": "Alias of prefer_top_eye. Prefer core/agg eyes top→down before access rings."
},
"prefer_top_eye": {
"type": "boolean",
"default": true,
"description": "Prefer dual_unit portals top→down: core–core, core–agg, agg–agg, then maximize movable coverage."
},
"dry_run": {
"type": "boolean",
"default": false
},
"pad": {
"type": "number",
"default": 280,
"description": "Gap between sink hull and parked batch."
},
"detect_max_units": {
"type": "integer",
"minimum": 20,
"maximum": 300,
"default": 120
}
},
"required": [
"source_view_id",
"sink_view_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "copyTopologyViewNodes",
"inputSchema": {
"properties": {
"source_view_id": {
"type": "string",
"description": "Canvas to copy FROM."
},
"target_view_id": {
"type": "string",
"description": "Canvas to copy TO."
},
"copy_positions": {
"type": "boolean",
"default": true,
"description": "Copy x/y from source (default true)."
},
"clear_target": {
"type": "boolean",
"default": false,
"description": "Remove existing target members before copy."
},
"offset_x": {
"type": "number",
"default": 0,
"description": "Shift copied x by this amount."
},
"offset_y": {
"type": "number",
"default": 0
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 2000,
"description": "Optional cap on how many source nodes to copy."
},
"dry_run": {
"type": "boolean",
"default": false
}
},
"required": [
"source_view_id",
"target_view_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "updateTopologyViewPositions",
"inputSchema": {
"properties": {
"view_id": {
"type": "string"
},
"layout": {
"type": "string",
"enum": [
"grid",
"offset",
"stack"
]
},
"keyword": {
"type": "string"
},
"role": {
"type": "string"
},
"vendor": {
"type": "string"
},
"link_status": {
"type": "string",
"enum": [
"linked",
"orphaned",
"managed",
"ume",
"both"
]
},
"fabric_node_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"origin_x": {
"type": "number",
"default": 40
},
"origin_y": {
"type": "number",
"default": 40
},
"gap_x": {
"type": "number",
"default": 180
},
"gap_y": {
"type": "number",
"default": 120
},
"cols": {
"type": "integer",
"minimum": 0,
"default": 0
},
"dx": {
"type": "number",
"default": 0
},
"dy": {
"type": "number",
"default": 0
},
"positions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"fabric_node_id": {
"type": "string"
},
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"label": {
"type": "string",
"description": "Omit to keep the current label; \"\" clears a rename (follow device name)."
},
"locked": {
"type": "boolean",
"description": "Omit to keep the lock. Locked nodes are skipped unless locked=false (unlock + move)."
}
},
"required": [
"fabric_node_id"
],
"additionalProperties": false
}
}
},
"required": [
"view_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "projectTopologyNeighbors",
"inputSchema": {
"properties": {
"view_id": {
"type": "string"
},
"seed_fabric_node_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional fabric node ids already on the view to expand from"
},
"managed_ne_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional managed NE ids to resolve to on-view fabric seeds"
},
"region_folder_id": {
"type": "string",
"description": "If set, only add neighbors with matching fabric.region_folder_id; skipped peers are counted in out_of_region_skipped."
},
"dry_run": {
"type": "boolean",
"default": false,
"description": "Preview projected graph without saving placements."
},
"detail": {
"type": "string",
"enum": [
"summary",
"full"
],
"default": "summary"
},
"sample": {
"type": "integer",
"minimum": 0,
"maximum": 100,
"default": 20
}
},
"required": [
"view_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "queryTopologyFabricNodes",
"inputSchema": {
"properties": {
"mode": {
"type": "string",
"enum": [
"summary",
"list",
"search"
],
"description": "Omit to auto-pick: q→search, else list."
},
"q": {
"type": "string",
"description": "Search needle (mode=search); also aliases keyword for list."
},
"keyword": {
"type": "string",
"description": "List filter keyword; alias of q for search."
},
"role": {
"type": "string"
},
"level": {
"type": "string",
"description": "Exact fabric level e.g. 1.1"
},
"level_major": {
"type": "string",
"description": "Major band e.g. 2 → [2.0, 3.0)"
},
"region_folder_id": {
"type": "string",
"description": "Filter by topo folder id (UME region / canvas folder)."
},
"link_status": {
"type": "string",
"enum": [
"linked",
"orphaned",
"managed",
"ume",
"both"
]
},
"page": {
"type": "integer",
"minimum": 1,
"default": 1
},
"page_size": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 50
},
"limit": {
"type": "integer",
"description": "Alias of page_size"
},
"summary": {
"type": "boolean",
"default": false,
"description": "Shortcut for mode=summary"
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "classifyTopologyFabricNodes",
"inputSchema": {
"properties": {
"action": {
"type": "string",
"enum": [
"match",
"tag",
"patch",
"unmatched",
"preview_rules",
"apply_rules",
"list_rules"
],
"description": "Required. Typical: match → tag(dry_run) → tag."
},
"pattern": {
"type": "string",
"description": "Regex for match/tag (aliases q)."
},
"q": {
"type": "string",
"description": "Alias of pattern."
},
"match_field": {
"type": "string",
"enum": [
"name",
"ip",
"name_ip"
],
"default": "name"
},
"sample_limit": {
"type": "integer",
"minimum": 1,
"maximum": 200,
"default": 50
},
"fabric_node_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Explicit ids for tag (from match)."
},
"fabric_node_id": {
"type": "string",
"description": "Single id for patch (alias node_id)."
},
"node_id": {
"type": "string"
},
"level": {
"description": "Layout rank e.g. 0, 1, 1.1, 2.1, 3. null clears."
},
"role": {
"type": "string",
"description": "Preset alias → level: external|core|aggregation|access|edge."
},
"region_folder_id": {
"type": "string",
"description": "Topo region folder id; empty + clear_region clears."
},
"clear_region": {
"type": "boolean",
"default": false,
"description": "Clear region_folder_id on tag/patch."
},
"dry_run": {
"type": "boolean",
"default": false,
"description": "tag only: preview without write."
},
"kind": {
"type": "string",
"enum": [
"any",
"level",
"role",
"region"
],
"default": "any",
"description": "unmatched filter (role aliases level)."
},
"page": {
"type": "integer",
"minimum": 1,
"default": 1
},
"page_size": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 50
},
"limit": {
"type": "integer",
"description": "Alias of page_size"
},
"skip_manual": {
"type": "boolean",
"default": true,
"description": "apply_rules: skip manually tagged nodes."
},
"overwrite_manual": {
"type": "boolean",
"default": false,
"description": "apply_rules shortcut: skip_manual=false."
},
"fill_empty_only": {
"type": "boolean",
"default": false,
"description": "apply_rules: only fill empty role/region."
}
},
"required": [
"action"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "queryTopologyNeighborhood",
"inputSchema": {
"properties": {
"node_id": {
"type": "string"
},
"depth": {
"type": "integer",
"minimum": 1,
"maximum": 3,
"default": 1
},
"layer": {
"type": "string",
"default": "physical"
}
},
"required": [
"node_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "queryTopologyEdges",
"inputSchema": {
"properties": {
"node_id": {
"type": "string"
},
"keyword": {
"type": "string"
},
"layer": {
"type": "string",
"default": "physical"
},
"status": {
"type": "string",
"enum": [
"active",
"missing",
"stale"
]
},
"source": {
"type": "string",
"enum": [
"lldp",
"ume",
"manual"
]
},
"detail": {
"type": "string",
"enum": [
"adjacency",
"ports"
],
"default": "adjacency",
"description": "adjacency (default) = NE pairs; ports = raw port rows in items[]."
},
"page": {
"type": "integer",
"minimum": 1,
"default": 1
},
"page_size": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 100
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "suggestSinkHubs",
"inputSchema": {
"properties": {
"source_view_id": {
"type": "string",
"description": "Root / leftover canvas (required). Alias: view_id."
},
"view_id": {
"type": "string",
"description": "Alias of source_view_id."
},
"sink_view_id": {
"type": "string",
"description": "Eye sink canvas; ids already there are dropped from batches."
},
"exclude_portal_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Extra freeze ids (CN portals). Merged with dual_units portals."
},
"use_source_dual_portals": {
"type": "boolean",
"default": false,
"description": "Exclude portals from source dual_units (default false)."
},
"use_sink_dual_portals": {
"type": "boolean",
"default": true,
"description": "Exclude portals from sink dual_units when sink_view_id set."
},
"only_layers": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hub layers to consider (default [agg, core])."
},
"min_territory": {
"type": "integer",
"minimum": 0,
"default": 1,
"description": "Skip hubs with remaining_territory below this."
},
"min_move_n": {
"type": "integer",
"minimum": 1,
"default": 1
},
"top_n": {
"type": "integer",
"minimum": 1,
"maximum": 40,
"default": 12
},
"pick": {
"type": "integer",
"minimum": 1,
"default": 1,
"description": "1-based batch to expose as batch + move_nodes."
},
"include_hub": {
"type": "boolean",
"default": true,
"description": "Include hub id in fabric_node_ids when still on source."
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "analyzeTopologyViewLayout",
"inputSchema": {
"properties": {
"view_id": {
"type": "string",
"description": "Analyze a single topology view"
},
"folder_id": {
"type": "string",
"description": "Sample physical views under this folder (tree walk)"
},
"detail": {
"type": "string",
"enum": [
"summary",
"structure",
"hotspots",
"blocks",
"both"
],
"default": "summary",
"description": "summary=score only; structure=gravity/hubs/recipe hint (phase 0.5); hotspots|blocks=sight; both=structure+sight (hand-drag)"
},
"score_profile": {
"type": "string",
"enum": [
"auto",
"default",
"eye"
],
"default": "auto",
"description": "Scoring weights. auto→eye for large sparse diagonal canvases; eye softens axis/rings (arc-band dual sinks); default=metro."
},
"sight_limit": {
"type": "integer",
"minimum": 5,
"maximum": 80,
"default": 40,
"description": "Max crossings / drag candidates when detail≠summary"
},
"sight_cell": {
"type": "number",
"default": 600,
"description": "Grid cell size (px) for detail=blocks"
},
"max_views": {
"type": "integer",
"minimum": 1,
"maximum": 80,
"default": 25
},
"min_nodes": {
"type": "integer",
"minimum": 0,
"default": 5
},
"max_nodes": {
"type": "integer",
"minimum": 1,
"maximum": 2000,
"default": 800
},
"with_meta": {
"type": "boolean",
"default": false,
"description": "Include IP/vendor caption line in overlap boxes"
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "layoutTopologyView",
"inputSchema": {
"properties": {
"view_id": {
"type": "string",
"description": "Target canvas to layout (and write when mode=apply)"
},
"action": {
"type": "string",
"enum": [
"layout",
"fix_overlaps",
"layout_dual_unit",
"straighten_channels",
"untangle",
"polish_crossings",
"clear_edge_hits",
"compact_bbox",
"pull_far_chains",
"align_reference",
"orbit_sweep",
"level_bands",
"move_nodes",
"job_status",
"job_cancel"
],
"default": "layout",
"description": "layout=full recipe; layout_dual_unit=dual-portal eye; level_bands=horizontal layer bands; move_nodes=migrate fabric_node_ids; orbit_sweep=polar sweep; polish_crossings=one-shot cut crossings; clear_edge_hits=eject edge hits (no crossing rise); pull_far_chains=scale far corridors toward portal mid; compact_bbox=gated farthest-K shrink; align_reference=same-network A/B debug only; fix_overlaps; untangle/straighten_channels; job_status|job_cancel."
},
"source_view_id": {
"type": "string",
"description": "For action=layout: optional load graph (default=view_id). For action=move_nodes: required FROM canvas (view_id is TO). For action=align_reference: same-network reference (debug only)."
},
"recipe": {
"type": "string",
"enum": [
"rings",
"corridor",
"compact",
"unstick"
],
"default": "rings",
"description": "Only for action=layout. rings=petals/min-rings; corridor/compact/unstick=Tutte corridor variants."
},
"preset": {
"type": "string",
"enum": [
"loose",
"balanced",
"dense"
],
"default": "balanced"
},
"mode": {
"type": "string",
"enum": [
"preview",
"apply"
],
"default": "preview",
"description": "preview=no write; apply=PATCH positions"
},
"tune": {
"type": "boolean",
"default": false,
"description": "Small param sweep for action=layout; zero-overlap first"
},
"params": {
"type": "object",
"description": "Overrides. layout: target_nn/target_util/…. job_status|job_cancel: job_id (required). layout_dual_unit: unit_id / portal_a+portal_b; require_zero_cross (default false). untangle: max_rounds/max_degree/protect_rigid/focus_ids[]. polish_crossings: portal_ids[]/source_view_ids[], top_n/max_moves/max_sweeps/straighten/untangle_rounds. clear_edge_hits: top_n/thr/margin/max_moves/portal_ids/max_eject_degree/preserve_axis. compact_bbox|pull_far_chains: portal_ids; pull scales toward portal mid (not outer hub); compact defaults farthest-K. orbit_sweep: node_id/pick/round/until_limit/portal_ids[]/freeze_layers[]/freeze_levels[]/max_degree/max_moves/stall_limit/max_stretch/min_delta/max_jump/angle_step/nn_floor; until_limit defaults protect_rigid=portals + objective=crossing; single-node/round default protect_rigid=off. move_nodes: fabric_node_ids[] (required), copy_positions (default true), park, remove_from_source (default true), pad/offset_x/offset_y.",
"properties": {
"job_id": {
"type": "string",
"description": "Required for job_status/job_cancel; returned by background start."
},
"background": {
"type": "boolean",
"description": "Run apply computation in a durable subprocess and return job_id immediately."
},
"sync": {
"type": "boolean",
"description": "Force inline computation, disabling automatic background execution."
}
},
"additionalProperties": true
},
"catalog": {
"type": "boolean",
"default": false,
"description": "If true, only return action/recipe/preset catalog"
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "listBizMonitors",
"inputSchema": {
"properties": {
"kind": {
"type": "string",
"enum": [
"all",
"projects",
"tasks"
],
"default": "all"
},
"purpose": {
"type": "string",
"description": "任务用途:portrait / cutover_hf;空为全部"
},
"status": {
"type": "string",
"description": "本地过滤状态,如 active/paused"
},
"q": {
"type": "string",
"description": "名称、设备、备注或 ID 关键词"
},
"limit": {
"type": "integer",
"default": 100,
"minimum": 1,
"maximum": 500
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "listBizMonitorBatches",
"inputSchema": {
"properties": {
"kind": {
"type": "string",
"enum": [
"auto",
"all",
"cutover",
"collect",
"runs"
],
"default": "auto"
},
"project_id": {
"type": "string",
"description": ""
},
"task_id": {
"type": "string",
"description": ""
},
"batch_id": {
"type": "string",
"description": "割接批次 ID,非采集批次 ID"
},
"include_runs": {
"type": "boolean",
"default": false
},
"status": {
"type": "string",
"description": ""
},
"limit": {
"type": "integer",
"default": 50,
"minimum": 1,
"maximum": 200
},
"runs_limit": {
"type": "integer",
"default": 10,
"minimum": 1,
"maximum": 50
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "getBizMonitorContext",
"inputSchema": {
"properties": {
"project_id": {
"type": "string",
"description": ""
},
"task_id": {
"type": "string",
"description": ""
}
},
"required": [],
"type": "object",
"additionalProperties": false
}
},
{
"name": "getBizMonitorBoard",
"inputSchema": {
"properties": {
"batch_id": {
"type": "string",
"description": "割接批次 ID"
},
"run_id": {
"type": "string",
"description": "可选评估运行 ID"
}
},
"required": [
"batch_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "listBizMonitorReds",
"inputSchema": {
"properties": {
"project_id": {
"type": "string",
"description": ""
},
"status": {
"type": "string",
"description": "open / carried / resolved;空为全部"
},
"limit": {
"type": "integer",
"default": 200,
"minimum": 1,
"maximum": 500
}
},
"required": [
"project_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "getBizMonitorDiffs",
"inputSchema": {
"properties": {
"run_id": {
"type": "string",
"description": ""
},
"metric_id": {
"type": "string",
"description": ""
},
"sheet_id": {
"type": "string",
"description": ""
},
"verdict": {
"type": "string",
"description": ""
},
"color": {
"type": "string",
"description": "如 red"
},
"q": {
"type": "string",
"description": "差异关键词,映射 HTTP kw"
},
"limit": {
"type": "integer",
"default": 100,
"minimum": 1,
"maximum": 500
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"run_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "getBizCollectBatch",
"inputSchema": {
"properties": {
"batch_id": {
"type": "string",
"description": "业务状态采集批次 ID"
}
},
"required": [
"batch_id"
],
"type": "object",
"additionalProperties": false
}
},
{
"name": "getBizCollectCommandRaw",
"inputSchema": {
"properties": {
"batch_id": {
"type": "string",
"description": "采集批次 ID"
},
"command_id": {
"type": "string",
"description": "getBizCollectBatch 返回的命令 ID"
}
},
"required": [
"batch_id",
"command_id"
],
"type": "object",
"additionalProperties": false
}
}
]