Cisco Modeling Labs CML
An MCP server that provides access to common Cisco Modeling Labs (CML) operations.
Connector by xorrkaz · GitHub account verified by the MCP Registry
Chalk Labs
Need help deploying Cisco Modeling Labs CML?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/xorrkaz-cml-mcp
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: infrastructure-as-code
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 25, 2026.
- Tools
- 19 read · 24 write · 8 delete
- Secrets
- 3 (API keys, tokens or passwords)
- Install scripts
- None found
- Runs as
- Python package
Tools by what they do 51
Read from the source code; the running server may list different tools.
Read 19 · Look things up without changing anything.
check_packet_capture_statusdownload_lab_topologyget_all_links_for_labget_annotations_for_cml_labget_captured_packet_overviewget_cml_groupsget_cml_informationget_cml_lab_by_titleget_cml_labsget_cml_licensing_detailsget_cml_node_definitionsget_cml_statistics
Show 7 more tools
get_cml_statusget_cml_usersget_console_logget_interfaces_for_nodeget_node_definition_detailget_nodes_for_cml_labget_packet_capture_data
Write 24 · Create, change, send or run things.
add_ellipse_annotationadd_interface_to_nodeadd_line_annotationadd_node_to_cml_labadd_rectangle_annotationadd_text_annotationapply_link_conditioningclone_cml_labconfigure_cml_nodeconnect_two_nodescreate_cml_groupcreate_cml_user
Show 12 more tools
create_empty_labcreate_full_lab_topologymodify_cml_labset_cml_lab_permissionsstart_cml_labstart_cml_linkstart_cml_nodestart_packet_capturestop_cml_labstop_cml_linkstop_cml_nodestop_packet_capture
Delete 8 · Delete, drop, revoke or wipe things.
delete_annotation_from_labdelete_cml_groupdelete_cml_labdelete_cml_nodedelete_cml_usersend_cli_commandwipe_cml_labwipe_cml_node
Secrets and settings it asks for
Secrets: values you paste in that let it act as you.
CML_PASSWORDPYATS_AUTH_PASSPYATS_PASSWORD
Other settings (environment variables or headers).
CML_URLCML_USERNAMEPYATS_USERNAME
Network hosts it talks to 4
cisco.com· found in codecml.host.internal· found in codegithub.com· found in codesmartreceiver.cisco.com· found in code
Files it touches
/etc/cockpit/machines.d/etc/default/virl2/var/lib/libvirt/images/var/local/virl2
Tools (51)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
add_ellipse_annotationAdd Ellipse AnnotationAdd an ellipse shape annotation to a lab canvas. Returns the annotation UUID. Coordinates: x1/y1 = anchor; x2/y2 are WIDTH and HEIGHT (per CML's X2Y2Mixin schema -- the same convention as rectangles). All coords -15000..15000. Required: x1, y1 (anchor coords -15000 to 15000), x2, y2 (WIDTH and HEIGHT from anchor), border_color, color (e.g., "#FF0000"), border_style ("solid"/"dotted"/"dashed"), thickness (1-32), z_index (-10240 to 10240), rotation (0-360 degrees). Examples: - "Draw a green ellipse around the firewall cluster" - "Add a circle at position 50,50 with radius 100" - "Highlight th…
add_interface_to_nodeAdd an Interface to a CML NodeAdd a new interface to a node. Returns interface details (id, node, slot, type, MAC). Note: depending on the slot requested, multiple interfaces may be added, so a list of added interfaces is returned. Required: lab_id (lab UUID), node (node UUID). Optional: slot (0-128), mac_address (e.g. "00:11:22:33:44:55"). Examples: - "Add a new interface to node R1" - "Give the firewall another GigabitEthernet port" - "Add interface slot 3 to node xyz"
add_line_annotationAdd Line AnnotationAdd a line annotation to a lab canvas. Returns the annotation UUID. Coordinates: x1/y1 = start point; x2/y2 = end point (absolute, not width/height). All coords -15000..15000. Required: x1, y1 (start coords -15000 to 15000), x2, y2 (absolute end coords), border_color, color (e.g., "#0000FF"), border_style ("solid"/"dotted"/"dashed"), thickness (1-32), z_index (-10240 to 10240), line_start, line_end ("arrow"/"square"/"circle" or None). Examples: - "Add an arrow pointing from R1 to R2" - "Draw a line from 0,0 to 200,200 with arrow on both ends" - "Connect the firewall to the internet cloud wi…
add_node_to_cml_labAdd a Node to a CML LabAdd a node to an existing lab. Returns the new node's UUID. Default interfaces are auto-created. Required: lab_id (lab UUID), node_definition (e.g. "alpine", "iosv", "csr1000v" -- discover via get_cml_node_definitions). Optional: label (1-128 chars), x/y coordinates (-15000..15000), image_definition, ram (MB, 1-1048576), cpus (1-128), cpu_limit (%, 20-100), data_volume (GB, 0-4096), boot_disk_size (GB, 0-4096), tags (list of strings), configuration (string or dict), parameters (dict), hide_links (bool), priority (0-10000), pyats (PyATS credentials dict). Examples: - "Add a CSR1000v router ca…
add_rectangle_annotationAdd Rectangle AnnotationAdd a rectangle shape annotation to a lab canvas. Returns the annotation UUID. Coordinates: x1/y1 = top-left anchor; x2/y2 are WIDTH and HEIGHT (not bottom-right). All coords -15000..15000. Required: x1, y1 (anchor coords -15000 to 15000), x2, y2 (WIDTH and HEIGHT from anchor, not corners!), border_color, color (e.g., "#FF0000"), border_style ("solid"/"dotted"/"dashed"), thickness (1-32), z_index (-10240 to 10240), rotation (0-360 degrees), border_radius (0-128). Examples: - "Draw a red rectangle around the routers in lab abc123" - "Add a blue box at 100,100 with width 200 height 150" - "Cr…
add_text_annotationAdd Text AnnotationAdd a text label annotation to a lab canvas. Returns the annotation UUID. Coordinates: x1/y1 are the text anchor (top-left). All coords -15000..15000. Required: x1, y1 (coords -15000 to 15000), text_content (0-8192 chars), text_font (0-128 chars), text_size (1-128), text_unit ("pt"/"px"/"em"), text_bold, text_italic (bool), border_color, color (e.g., "#FF0000"), border_style ("solid"/"dotted"/"dashed"), thickness (1-32), z_index (-10240 to 10240), rotation (0-360 degrees). Examples: - "Add a 'Core Network' text label at position 0,0 in my lab" - "Label the router cluster at coordinates 100,…
apply_link_conditioningApply Link ConditioningApply network impairment to a link (bandwidth limit, latency, loss, jitter, etc.) by lab and link UUID. Omitted fields keep their existing value. Optional: enabled (bool), bandwidth (kbps, 0-10M), latency (ms, 0-10K), loss (%, 0-100), jitter (ms, 0-10K), duplicate (%), corrupt_prob (%), gap (ms), limit (ms), reorder_prob (%), delay_corr/loss_corr/duplicate_corr/reorder_corr/corrupt_corr (%). Examples: - "Add 100ms latency to the link between R1 and R2" - "Limit the WAN link to 1 Mbps with 1% packet loss" - "Simulate a flaky connection on link xyz"
check_packet_capture_statusCheck Packet Capture Status on a Linkread-onlyCheck whether a packet capture is active on a link, plus its config and packet count so far. Returns a PCAPStatusResponse. Examples: - "Is a capture running on link xyz?" - "How many packets have I captured so far?" - "Show packet capture status for the WAN link"
clone_cml_labClone CML LabClone an existing lab by UUID, optionally with a new title. Returns the new lab's UUID. If new_title is omitted, the clone is named "Copy of <original title>". Examples: - "Clone lab abc123" - "Make a copy of my OSPF lab called 'OSPF Lab v2'" - "Duplicate the BGP lab"
configure_cml_nodeConfigure a CML NodeSet the startup configuration for a node by lab and node UUID. The `config` is a plain string of device CLI commands. Node must be in the CREATED state (newly added or wiped). Prefer this over starting the node and using send_cli_command -- it is faster and avoids needing the node to be running. Examples: - "Set the startup config for R1 in lab abc123" - "Apply this bootstrap config to the ASAv node" - "Load the IOS config onto router xyz"
connect_two_nodesConnect Two Nodes in a CML LabCreate a link between two interfaces in the same lab. Returns the new link's UUID. Required: src_int (source interface UUID) and dst_int (destination interface UUID). Get interface UUIDs from get_interfaces_for_node. Examples: - "Connect router R1 to switch SW1" - "Link the firewall to the core router" - "Wire R1 Gi0/0 to R2 Gi0/0"
create_cml_groupCreate CML GroupCreate a new CML group. Requires admin privileges. Returns the new group's UUID. Required: name (1-64 chars). Optional: description, members (list of user UUIDs), associations (list of lab/group association dicts). Examples: - "Create a group called 'engineers'" - "Add a new CML group named 'students'" - "Set up a group for the QA team"
create_cml_userCreate CML UserCreate a new CML user. Requires admin privileges. Returns the new user's UUID. Required: username, password. Optional: fullname, description, email (max 128 chars), groups (list of group UUIDs), admin (bool), resource_pool (UUID), associations (list of lab dicts), opt_in ("UNSET"/"ACCEPTED"/"DECLINED"), tour_version (max 128 chars), pubkey (SSH public key). Examples: - "Create a user named alice with password ChangeMe123" - "Add a new admin account 'bob'" - "Provision a CML user for carol"
create_empty_labCreate an Empty LabCreate an empty CML lab (no nodes/links). Returns the new lab UUID. Optional: title (1-64 chars), owner (UUID), description (<=4096 chars), notes (<=32768 chars). Use set_cml_lab_permissions to configure group/user access after creation. Examples: - "Create a new empty lab called 'OSPF Practice'" - "Make me a blank CML lab" - "Start a new lab titled 'Customer Demo'"
create_full_lab_topologyCreate a Full Lab TopologyImport a complete CML lab from a Topology object (nodes + links + lab metadata). IMPORTANT: `topology` MUST be a structured object (or dict / JSON-encoded object string) matching the CML Topology schema with top-level keys `lab`, `nodes`, `links`, and optionally `annotations`. Do NOT pass a raw string such as a lab title, a YAML blob, or a non-Topology JSON string — those will fail. For simpler use cases, prefer `create_empty_lab` followed by `add_node_to_cml_lab` and `connect_two_nodes`. Expected shape: { "lab": {"title": "...", "version": "0.3.0"}, "nodes": [{"id": "n0", "label":…
Show 36 more tools
delete_annotation_from_labDelete an Annotation from a CML Labcan change or delete dataDelete a single annotation by lab and annotation UUID. CRITICAL: Destructive. Always ask "Confirm deletion of [annotation]?" and wait for the user's "yes" before invoking this tool. Examples: - "Delete the 'Core Network' label" - "Remove annotation xyz from my lab" - "Get rid of the red rectangle"
delete_cml_groupDelete CML Groupcan change or delete dataDelete a CML group by UUID. Requires admin privileges. CRITICAL: Destructive and irreversible. Always ask "Confirm deletion of [group]?" and wait for the user's "yes" before invoking this tool. Examples: - "Delete the 'students' group" - "Remove group xyz" - "Get rid of the QA team group"
delete_cml_labDelete a CML Labcan change or delete dataDelete a CML lab by UUID. Auto-stops and wipes the lab first. CRITICAL: Destructive and irreversible. Always ask "Confirm deletion of [lab]?" and wait for the user's "yes" before invoking this tool. Examples: - "Delete lab abc123" - "Remove my OSPF lab" - "Get rid of the test lab"
delete_cml_nodeDelete a node from a CML lab.can change or delete dataDelete a node from a lab by lab and node UUID. Auto-stops and wipes the node first. CRITICAL: Destructive and irreversible. Always ask "Confirm deletion of [node]?" and wait for the user's "yes" before invoking this tool. Examples: - "Delete node R1 from my lab" - "Remove the firewall from the topology" - "Get rid of node xyz"
delete_cml_userDelete CML Usercan change or delete dataDelete a CML user by UUID. Requires admin privileges. CRITICAL: Destructive and irreversible. Always ask "Confirm deletion of [user]?" and wait for the user's "yes" before invoking this tool. Examples: - "Delete user alice" - "Remove the bob account from CML" - "Get rid of user xyz"
download_lab_topologyDownload lab topologyread-onlyDownload the full topology for a lab by UUID as a YAML string. Present this to the user for saving to a .yaml file (e.g. for backup or sharing). Examples: - "Export lab abc123 as YAML" - "Download my OSPF lab topology" - "Give me a backup of lab xyz"
get_all_links_for_labGet All Links for a CML Labread-onlyList all links in a lab by lab UUID. Returns id, label, interface_a, interface_b, node_a, node_b, state, and capture_key (for packet capture). Examples: - "Show all links in lab abc123" - "List the connections in my topology" - "What's wired up in my OSPF lab?"
get_annotations_for_cml_labGet all annotations for a CML Labread-onlyGet all visual annotations (text labels, shapes, lines) on a lab's canvas by lab UUID. Examples: - "Show me the annotations on my lab" - "List all labels and shapes in lab abc123" - "What's drawn on the OSPF lab canvas?"
get_captured_packet_overviewGet packet capture overviewread-onlyGet a brief one-line summary of each packet captured on a link (timestamps, src/dst, protocol). Lightweight alternative to downloading the full PCAP. Examples: - "Summarize the captured packets on link xyz" - "Show me a packet list for the WAN capture" - "What was captured between R1 and R2?"
get_cml_groupsGet List of CML Groupsread-onlyList all CML groups. Returns id, name, description, members (user UUIDs), and lab associations. Examples: - "List all CML groups" - "Who's in the engineers group?" - "Show me group memberships"
get_cml_informationGet CML System Informationread-onlyGet CML server info: version, hostname, uptime, ready status, and configuration details. Examples: - "What version of CML is this?" - "Show me the CML server info" - "How long has the CML server been up?"
get_cml_lab_by_titleGet a CML Lab by Titleread-onlyLook up a single CML lab by its exact, case-sensitive title. Returns the Lab object. Examples: - "Get the lab titled 'OSPF Practice'" - "Find my lab named 'Customer Demo'" - "Look up the 'BGP Lab' by name"
get_cml_labsGet All CML Labsread-onlyList CML labs, optionally filtered by owner username. Returns Lab objects with id, lab_title, owner_username, description, state, and metadata. Omit `user` to get all labs (admin) or current user's labs (non-admin). Examples: - "Show me all my CML labs" - "List all available labs in CML" - "What labs does alice own?"
get_cml_licensing_detailsGet CML License Inforead-onlyGet CML licensing info: registration status, features, node limits, and expiration dates. Examples: - "Is CML licensed?" - "When does my CML license expire?" - "How many nodes can I run on this license?"
get_cml_node_definitionsGet All CML Node Definitionsread-onlyList all available node types on this CML server. Returns id, label, general_nature (switch/router/server/desktop), and schema_version. Use this to discover valid `node_definition` values before calling add_node_to_cml_lab. Examples: - "What node types can I use in CML?" - "List all available device definitions" - "Show me the supported routers and switches"
get_cml_statisticsGet CML System Statisticsread-onlyGet CML resource usage: CPU, memory, disk, and counts of running labs/nodes/links and cluster stats. Examples: - "How much CPU and memory is CML using?" - "Show me how busy the CML server is" - "How many labs and nodes are running?"
get_cml_statusGet CML System Healthread-onlyGet CML system health: compute, controller, virl2, and overall health indicators. Examples: - "Is CML healthy?" - "Check the CML server status" - "Are all CML components running?"
get_cml_usersGet List of CML Usersread-onlyList all CML users. Returns id, username, fullname, email, admin status, groups, and resource_pool. Examples: - "Show me all CML users" - "Who has accounts on this CML server?" - "List the users and their groups"
get_console_logGet Console Logs for a CML Noderead-onlyGet the console output history for a node by lab and node UUID. The node must be started. Returns log entries (time in ms since start + message) from the selected serial console (default 0). Some nodes (e.g. Docker-based) expose multiple consoles -- use console=1 for the second port. Useful for boot troubleshooting and verifying CLI command results. Examples: - "Show me the console output for router R1" - "Get the boot log for the firewall node" - "Tail the second console (console 1) on the Alpine container"
get_interfaces_for_nodeGet Interfaces for a CML Noderead-onlyList all interfaces on a node by lab and node UUID. Returns id, node, label, slot, type, MAC address, and IP configuration. Examples: - "List the interfaces on R1" - "Show me the ports on the firewall" - "What interfaces does node xyz have?"
get_node_definition_detailGet Details About a Node Definitionread-onlyGet full details for one node definition by id: interfaces, default device config, boot options, and resource requirements. Examples: - "Tell me more about the csr1000v node definition" - "How many interfaces does iosv have by default?" - "What's the default RAM for an ASAv?"
get_nodes_for_cml_labGet All Nodes for a CML Labread-onlyList all nodes in a lab by lab UUID. Returns id, label, node_definition, x/y, state, interfaces, and operational data (CPU, RAM, serial consoles). Examples: - "List all nodes in my CML lab" - "What devices are in lab abc123?" - "Show me the topology nodes"
get_packet_capture_dataGet Full Packets from a Packet Captureread-onlyDownload the complete PCAP file for a link by lab and link UUID. Returns base64-encoded binary PCAP data -- decode and save as a .pcap file for Wireshark, tcpdump, or other analysis tools. Examples: - "Download the pcap from link xyz" - "Give me the capture file for the WAN link" - "Get the full packet capture for the link between R1 and R2"
modify_cml_labModify CML Lab PropertiesUpdate lab metadata (title, owner, description, notes) by lab UUID. Only provided fields are modified; omitted fields remain unchanged. Examples: - "Rename lab abc123 to 'Production Test'" - "Change the owner of my lab to bob" - "Update the description on lab abc123"
send_cli_commandSend CLI Command to CML Nodecan change or delete dataSend CLI commands to a running node via PyATS/Unicon. Identify the node by lab UUID and node label (NOT node UUID). Node must be in BOOTED state. Returns command output text. - Separate multiple commands with newlines. - config_command=false (default): exec/operational mode (e.g. "show version"). - config_command=true: configuration mode -- DO NOT include "configure terminal" or "end". - Optional console: pick a non-default serial console (e.g. console=1 for some Docker nodes). CRITICAL: Can modify device state. Review commands carefully before executing, especially when config_command=true.…
set_cml_lab_permissionsSet CML Lab PermissionsConfigure group and user permissions for a CML lab by lab UUID. Valid permissions: LAB_ADMIN (full control), LAB_EDIT (modify topology), LAB_EXEC (start/stop), LAB_VIEW (read-only). Validation: invalid entries raise an error before the request is sent. Each group dict: {"id": "<group-uuid>", "permissions": ["LAB_ADMIN", "LAB_EDIT", "LAB_EXEC", "LAB_VIEW"]} Each user dict: {"id": "<user-uuid>", "permissions": ["LAB_ADMIN", "LAB_EDIT", "LAB_EXEC", "LAB_VIEW"]} Examples: - "Give group abc read-only access to lab xyz" - "Grant user alice LAB_EDIT and LAB_EXEC permissions on my lab" - "Set permi…
start_cml_labStart a CML LabStart (boot) a CML lab and all its nodes by lab UUID. Set wait_for_convergence=true to block until every node reports a stable state. Examples: - "Start the lab with ID abc123" - "Boot up my OSPF lab" - "Power on lab xyz and wait until it converges"
start_cml_linkStart a CML LinkStart a link (enable connectivity) by lab and link UUID. Examples: - "Start the link between R1 and R2" - "Enable link xyz" - "Bring up the WAN connection"
start_cml_nodeStart a CML NodeStart (boot) a single node by lab and node UUID. Set wait_for_convergence=true to block until the node reaches a stable state. Examples: - "Start router R1" - "Boot the firewall node" - "Power on node xyz and wait for convergence"
start_packet_captureStart a Packet Capture on a LinkStart a packet capture on a link by lab and link UUID. At least one of maxtime (seconds, 1-86400) or maxpackets (1-1000000) is required. Returns true on success. Optional: bpfilter (Berkeley packet filter string, max 128 chars), encap (link encapsulation type, default "ethernet"). Examples: - "Start capturing packets on the link between R1 and R2 for 60 seconds" - "Capture 1000 packets on link xyz" - "Begin a pcap on the WAN link"
stop_cml_labStop a CML LabStop (power off) all running nodes in a CML lab by lab UUID. Examples: - "Stop my CML lab" - "Shut down lab abc123" - "Power off all nodes in the OSPF lab"
stop_cml_linkStop a CML LinkStop a link (disable connectivity, simulate cable pull) by lab and link UUID. Examples: - "Stop the link between R1 and R2" - "Disable link xyz" - "Simulate a cable pull on the WAN link"
stop_cml_nodeStop a CML NodeStop (power down) a single node by lab and node UUID. Examples: - "Stop node R1 in my lab" - "Power down the firewall" - "Shut down node xyz"
stop_packet_captureStop a Packet Capture on a LinkStop an active packet capture on a link by lab and link UUID. Examples: - "Stop the packet capture on link xyz" - "End the pcap between R1 and R2" - "Stop capturing on the WAN link"
wipe_cml_labWipe a CML Labcan change or delete dataWipe a CML lab by UUID -- erases all node disk data and configurations. Lab is stopped first if needed. CRITICAL: Destructive and irreversible. Always ask "Confirm wipe of [lab]?" and wait for the user's "yes" before invoking this tool. Examples: - "Wipe the OSPF lab" - "Reset lab abc123 to a clean state" - "Erase all node data in my CML lab"
wipe_cml_nodeWipe a CML Nodecan change or delete dataWipe a single node's disks by lab and node UUID. Erases all node data. Node must be stopped first. CRITICAL: Destructive and irreversible. Always ask "Confirm wipe of [node]?" and wait for the user's "yes" before invoking this tool. Examples: - "Wipe node R1" - "Reset the firewall node to factory defaults" - "Erase the disk on node xyz"
Signals
- Stars
- 76
- Forks
- 44
- Open issues
- 1
- Contributors
- 6
- Weekly downloads
- 341
- Last commit
- Oct 8, 2026 (22 days ago)
- Last release
- Oct 8, 2026 (22 days ago)
- Last package publish
- Oct 8, 2026 (22 days ago)
From GitHub (fetched Oct 24, 2026) and the package registry.
Details
- Registry name
io.github.xorrkaz/cml-mcp- Version
- 0.32.2
- Auth
- API key
- Packages
- pypi cml-mcp
- License
- BSD-2-Clause
- Repository
- github.com/xorrkaz/cml-mcp
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get Cisco Modeling Labs CML running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
Cisco Modeling Labs CML MCP server. Agent Mart. https://agentmart.dev/connectors/xorrkaz-cml-mcp (last updated 2026-10-24)