Skip to main content
Glama

From Chat to MCP: A Network Engineer's MCP Lab

A compact demo MCP server (FastMCP) that lets an LLM safely drive a network lab. Runs in mock mode with no hardware, or against a real EVE-NG lab by swapping one inventory file. Works from Claude Code, Claude Desktop, or a fully local LLM stack (Ollama / vLLM).

Tool

Purpose

list_lab_devices

Show the inventory the server can reach.

send_command

Run a read-only show command on one device.

run_health_check

Health bundle against one device or the whole lab.

get_ospf_neighbors

OSPF neighbor state (right command per platform).

get_bgp_summary

BGP summary state (right command per platform).

configure_device

Push config — gated by an out-of-band confirm code (read-only is one flag).

Quickstart (Docker)

Spins up the whole stack — chat UI, lab tools, and a local model — with one command.

git clone https://github.com/E-Conners-Lab/Packet-Coders-Demo.git
cd Packet-Coders-Demo
docker compose up        # first run pulls images + the qwen3:8b model (a few minutes)

Open http://localhost:3000 (no login) → Settings → Integrations → add http://localhost:8000 as a tool server → set the model's Function Calling → Native → ask "list the lab devices." Defaults to the mock lab (no hardware needed).

Want…

Do this

Faster on a Mac (host Ollama, Metal GPU)

make up-host (then ollama pull qwen3:8b yourself)

The real EVE-NG lab

docs/real-lab.md

Change port / model / inventory

copy .env.example.envdocs/configuration.md

Read-only (hide the write tool)

make readonly

Stop everything

make down

Port 8000 already in use? Set MCPO_PORT in .env. More fixes in docs/troubleshooting.md.

Related MCP server: meraki-dashboard-api

Connect a client

Point any MCP client at the server (start with the mock inventory). Full per-client steps — Claude Code, Claude Desktop, Ollama / vLLM + Open WebUI — are in docs/clients.md.

# Claude Code, from the repo root:
claude mcp add packet-coders-lab \
  --env PACKET_CODERS_INVENTORY="$PWD/configs/inventory.mock.yaml" \
  -- uv run --project "$PWD" packet-coders-mcp

Verify with claude mcp list, then ask it to list_lab_devices.

Safety

A demo, not a production change tool. Strongest guardrails:

  • Writes need an out-of-band code the model never seesconfigure_device prints a one-time code to the server console; a human reads it back, so the model can't self-approve.

  • Read-only is one flagPACKET_CODERS_ALLOW_WRITES=false hides the write tool entirely.

  • Hosts that confirm each call (Claude Desktop / Code) can use their own approval instead — set PACKET_CODERS_REQUIRE_CONFIRM_CODE=false.

Don't point it at production. Full model: docs/safety.md.

Docs

Develop

uv run --extra dev pytest
uv run --extra dev ruff check .

Available Tools

6 tools
configure_deviceA
Destructive

Apply config lines to a lab device, with dry-run enabled by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_nameYesInventory name, such as r1 or spine1.
commandsYesConfig lines only. Do not include configure terminal or end.
dry_runNoWhen true, preview the change without sending config.
confirmNoMust be true with dry_run=false before config is sent.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds context beyond annotations: dry-run enabled by default and confirm parameter logic. Annotations already indicate destructive behavior, and description aligns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with key information: verb, resource, and default behavior. No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given output schema exists, description covers core purpose and dry-run behavior, but lacks details on prerequisites, effect on device, or what happens after applying config.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with good descriptions; description adds value by noting that dry_run defaults to true, which is not in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Apply config lines' and the resource 'lab device', and distinguishes from sibling tools like 'send_command' by mentioning dry-run default.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool vs alternatives like 'send_command'. Usage is implied but not clarified with exclusions or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bgp_summaryA
Read-only

Read BGP summary from a lab device using a platform-appropriate command.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_nameYesInventory name, such as r1 or spine1.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds 'using a platform-appropriate command', indicating output variability by platform, beyond the readOnlyHint annotation. It clearly identifies a read operation with no side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with zero wasted words, front-loaded with the action verb. Efficient and to the point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one parameter and an output schema, the description is complete. It provides necessary context (platform-appropriate command) without redundancy.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameter 'device_name' is already described in the schema. The tool description does not add further semantic value beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Read BGP summary') and the target resource ('from a lab device'). It distinguishes from siblings like get_ospf_neighbors (different protocol) and send_command (generic command).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for reading BGP summaries, and sibling tools provide context for alternatives. However, it does not explicitly state when not to use it or provide exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ospf_neighborsA
Read-only

Read OSPF neighbors from a lab device using a platform-appropriate command.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_nameYesInventory name, such as r1 or spine1.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint. Description adds 'platform-appropriate command' hint but lacks details on command parsing or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded, no unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with one parameter, output schema, and annotations, the description is fully adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers the only parameter (device_name) with description. Description adds 'lab device' context but no extra parameter meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description specifies 'Read OSPF neighbors' with clear verb and resource, and distinguishes from siblings like get_bgp_summary and send_command.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives; no mention of prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_lab_devicesA
Read-only

List lab devices available to this MCP server without returning secrets.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint, openWorldHint), the description adds that secrets are not returned, which is an important behavioral disclosure. It aligns with the read-only nature implied by the annotation and clarifies a security aspect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no unnecessary words. It conveys the essential purpose and constraint efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with an output schema, the description is fairly complete. It states the resource, scope, and the key constraint of not returning secrets. However, it omits details like ordering or pagination, which might be relevant but are not critical given the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters and schema coverage is 100%. The description adds context by specifying that the list includes only devices available to the MCP server, which provides meaning beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'list', the resource 'lab devices', and the scope 'available to this MCP server'. It distinguishes from siblings like configure_device or send_command, which perform different actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, limitations, or scenarios where other tools would be more appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_health_checkA
Read-only

Run basic health checks against one device, or all devices when omitted.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_nameNoOptional inventory device name. If omitted, checks the whole lab.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds that health checks are 'basic' and can run on one or all devices, but does not disclose what specific checks are performed or their effect, which is acceptable given read-only nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the purpose and scope. There is no extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one optional parameter and an output schema (not shown but exists), the description is nearly complete. It explains the core behavior, though it could specify what 'basic health checks' entail. Still, it suffices for this simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter description matching the tool description ('Optional inventory device name. If omitted, checks the whole lab.'). The description adds no new meaning beyond the schema, so baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Run' and resource 'health checks', clearly indicating the action. It also distinguishes between targeting a single device or all devices when omitted, which helps differentiate the scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus siblings like 'get_bgp_summary' or 'send_command'. The purpose is clear but lacks context on when not to use it or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_commandA
Read-only

Run one read-only show/display command on a lab device.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_nameYesInventory name, such as r1 or spine1.
commandYesA read-only show/display command. Configuration commands are blocked.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds valuable context by specifying that only show/display commands are allowed and that configuration commands are blocked, which goes beyond the annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is front-loaded with the essential purpose. Every word serves a clear function, with no unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 parameters, good schema descriptions, output schema present, annotations), the description provides sufficient context. It specifies the domain (lab device), the command type (show/display), and restrictions (read-only, blocked config). Sibling tools are also listed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with good descriptions for both parameters. The tool description does not add new parameter information beyond what the schema already provides, so it defaults to a baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('run'), the resource ('one read-only show/display command'), and the scope ('on a lab device'). It effectively distinguishes from sibling tools like 'configure_device' by specifying read-only and blocking config commands.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly indicates when to use the tool (for read-only show/display commands) and when not (configuration commands are blocked). It provides clear context for choosing this over siblings like 'configure_device'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

TDQS

A4.2/5.0
Disambiguation5/5

Each tool targets a distinct operation: configure_device for config, get_bgp_summary and get_ospf_neighbors for specific routing info, list_lab_devices for device enumeration, run_health_check for overall health, and send_command for generic show commands. No overlapping purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with underscores (e.g., configure_device, get_bgp_summary, list_lab_devices). No mixing of conventions or irregular naming.

Tool Count5/5

With 6 tools, the set is well-scoped for a network lab management server. Each tool covers a core need without redundancy or excessive specialization.

Completeness4/5

The tool set covers essential lifecycle operations: listing devices, configuring, retrieving BGP/OSPF status, health checks, and a generic command. Minor gaps include missing support for other routing protocols, but send_command provides a fallback.

Maintenance

ActivityStale
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that enables operating network devices through chat, using netmiko for SSH/Telnet connections with command allowlists, enable password support, and configuration-change tools (disabled by default).
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/E-Conners-Lab/Packet-Coders-Demo'

If you have feedback or need assistance with the MCP directory API, please join our Discord server