mirror of
https://github.com/hansjone/netxops.git
synced 2026-10-19 21:44:06 +08:00
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>
1990 lines
No EOL
43 KiB
JSON
1990 lines
No EOL
43 KiB
JSON
[
|
||
{
|
||
"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
|
||
}
|
||
}
|
||
] |