Skip to main content

packetfabric-mcp

MCP server for the PacketFabric API, built from its OpenAPI spec (346 operations, bundled in src/packetfabric_mcp/data/openapi.yaml).

Instead of one tool per endpoint (which overwhelms the model), it exposes 16 tools:

Tool What it does
pf_get_account Current customer account — good credential check
pf_list_ports, pf_get_port Ports / LAGs / cloud ports
pf_list_services Virtual circuits (backbone, cloud, IX, marketplace)
pf_list_point_to_point PTP services
pf_list_cloud_routers, pf_list_cloud_router_connections Cloud Routers and their connections
pf_list_cloud_connections L2 hosted / dedicated cloud connections
pf_find_locations POPs / data centers
pf_get_pricing List pricing (MRC/NRC) between locations
pf_get_traffic bps/pps time series for a port or a VC on a port
pf_get_maintenances Current/upcoming maintenance by POP or market
pf_list_api_areas → pf_search_endpoints → pf_describe_endpoint → pf_call_endpoint Reach any other endpoint in the spec

Safety

  • Read-only by default. Any POST/PUT/PATCH/DELETE is refused unless the server runs with PF_ALLOW_WRITES=true.
  • With writes enabled, a write call returns a dry-run preview first; it only executes when re-called with confirm=true.
  • Auth/session, MFA, signup and API-key-management endpoints are never exposed.
  • List responses are capped (max_items, default 100) and can be trimmed to specific fields.

Setup

Requires uv (brew install uv).

cd ~/Documents/src/packetfabric/mcp
uv sync
uv run pytest            # offline tests

Get an API key in the PacketFabric portal (Settings → API Keys). API keys work with MFA-enabled accounts; login/password does not.

Claude Code

claude mcp add packetfabric -s user -e PF_TOKEN=your-key -- \
  uv run --directory ~/Documents/src/packetfabric/mcp packetfabric-mcp

Claude Desktop / Cowork

Settings → Developer → Edit Config (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "packetfabric": {
      "command": "/opt/homebrew/bin/uv",
      "args": ["run", "--directory", "/Users/chad/Documents/src/packetfabric/mcp", "packetfabric-mcp"],
      "env": { "PF_TOKEN": "your-key" }
    }
  }
}

(Use which uv for the command path. Restart Claude after editing.)

To allow provisioning, add "PF_ALLOW_WRITES": "true" to env. Consider a separate server entry (e.g. packetfabric-rw) so read-only stays the default.

Configuration

Env var Purpose
PF_TOKEN API key (sent as Bearer). Preferred.
PF_LOGIN / PF_PASSWORD Alternative to PF_TOKEN; auto re-login on 401
PF_ALLOW_WRITES true to allow create/modify/delete (each still needs confirm=true)
PF_ON_BEHALF Resellers: customer UUID sent as On-Behalf header
PF_API_URL Override base URL (default https://api.packetfabric.com)
PF_SPEC_PATH Use a different OpenAPI file
PF_TIMEOUT, PF_MAX_RESPONSE_CHARS HTTP timeout (s, default 60) and response size cap (default 60000)

Hosted mode (MCP over HTTP + A2A + discovery)

uv sync --extra a2a
PF_PUBLIC_URL=https://mcp.example.com uv run packetfabric-mcp --http --host 0.0.0.0 --port 8765
# or: docker build -t packetfabric-mcp . && docker run -p 8765:8765 -e PF_PUBLIC_URL=... packetfabric-mcp
Path What
POST /mcp MCP streamable HTTP (stateless, so it scales horizontally)
GET /mcp/server-card MCP Server Card (SEP-2127)
GET /.well-known/agent-card.json A2A v1.0 Agent Card
POST /a2a A2A JSON-RPC endpoint
GET /.well-known/ai-catalog.json AI Catalog listing both cards
GET /healthz Liveness

Every caller uses their own PacketFabric API key, sent as Authorization: Bearer <key> (plus On-Behalf: <customer uuid> for resellers). The operator's PF_TOKEN/PF_LOGIN are ignored in HTTP mode unless PF_HTTP_USE_SERVER_CREDENTIALS=true, which is only safe for a private single-user deployment. Put it behind TLS; the discovery documents are public by design and contain no secrets.

The A2A agent is deterministic, not an LLM: send a DataPart {"skill": "list_ports", "arguments": {"pop": "LAX1"}} and get the API result back as a JSON data artifact. Skills mirror the MCP tools (see the agent card). A2A access is always read-only.

curl -s https://mcp.example.com/a2a -H 'A2A-Version: 1.0' -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $PF_TOKEN" -d '{"jsonrpc":"2.0","id":1,"method":"SendMessage","params":{"message":
  {"messageId":"1","role":"ROLE_USER","parts":[{"data":{"skill":"find_locations","arguments":{"market":"NYC"}}}]}}}'
Env var (HTTP mode) Purpose
PF_PUBLIC_URL Public https base URL advertised in the cards (otherwise derived from the request)
PF_HTTP_USE_SERVER_CREDENTIALS true = fall back to the operator's own credentials (private use only)
PF_DISABLE_A2A true = serve MCP only
PF_ICON_URL Icon advertised in the cards

Domain-level discovery: if the server runs on its own host (e.g. mcp.packetfabric.com), the /.well-known/ documents are already in the right place. To advertise it from the main domain, serve a copy of /.well-known/ai-catalog.json from https://packetfabric.com/.well-known/ai-catalog.json (the entries hold absolute URLs, so a static copy works).

Publishing

Listed on the MCP Registry as io.github.PacketFabric/packetfabric-mcp (see server.json), installed from PyPI as packetfabric-mcp.

  1. Bump the version in pyproject.toml, src/packetfabric_mcp/__init__.py and server.json (tests fail if they disagree).
  2. Push a tag vX.Y.Z. .github/workflows/publish.yml runs the tests, publishes to PyPI (Trusted Publishing), then publishes server.json to the MCP Registry using GitHub OIDC.
  3. Once the hosted server is live, set the repo variable MCP_PUBLIC_URL and the registry entry will also list it as a remote.

One-time: add a PyPI Trusted Publisher for packetfabric-mcp (repo PacketFabric/public-mcp, workflow publish.yml, environment pypi). The mcp-name: comment at the top of this README is how the registry verifies that the PyPI package belongs to this server; keep it.

To publish under com.packetfabric/... instead of io.github.PacketFabric/..., change REGISTRY_NAME in metadata.py and server.json, add the DNS TXT record from mcp-publisher login dns, and switch the workflow's login step.

Other

  • Refresh the bundled spec: uv run packetfabric-mcp --update-spec
  • To add a curated tool, copy one of the pf_list_* functions in server.py and point _run() at an operation_id (find one with pf_search_endpoints). Add a matching entry to SKILLS in a2a_agent.py.

Metadata

Release files for packetfabric-mcp 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for packetfabric-mcp 0.2.0
File Size Uploaded
packetfabric_mcp-0.2.0.tar.gz 217.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for packetfabric-mcp 0.2.0
File Interpreter ABI Platform
packetfabric_mcp-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 346.8 kB

Release files / packetfabric_mcp-0.2.0.tar.gz

Download URL packetfabric_mcp-0.2.0.tar.gz
Size 217.1 kB
Tags Source
SHA-256 checksum
How to use checksums
c41f52aeeaeaeb8dc8857ed437b8771a6d31000210a1c87f5628ac4c066007fb
BLAKE2b-256 checksum
How to use checksums
c1f056ed22270114d8154cc62bee93076094b0800fad5da9e87a9d4742569b99
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / packetfabric_mcp-0.2.0-py3-none-any.whl

Download URL packetfabric_mcp-0.2.0-py3-none-any.whl
Size 129.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8a6093b1e2a7e7317001a5e201642d0d9284809af3e3db36a3c97e550326e769
BLAKE2b-256 checksum
How to use checksums
98f23eb2fa567a9957e97c62dd41edfe1d6e1684e802ffb2ea398633525e9d52
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.1

2 release files

This release

0.2.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page