Skip to main content

MCP server for MQTT brokers (publish, subscribe, topic discovery)

Project description

MQTT MCP Server

A Model Context Protocol (MCP) server for MQTT — the standard IoT publish/subscribe messaging protocol. Works against any MQTT broker (Eclipse Mosquitto, EMQX, HiveMQ, AWS IoT Core, Azure IoT Hub's MQTT endpoint, etc): only the standard MQTT 5.0 wire protocol is used, no broker-specific admin APIs.

Built with FastMCP and paho-mqtt.

Tools

Tool Description
get_connection_status() Report this connector's broker connection state.
publish_message(topic, payload, qos, retain, ...) Publish a message. Supports MQTT5 properties (content type, message expiry, response topic, correlation data, user properties) and optionally blocks until the broker acknowledges delivery (QoS 1/2).
start_subscription(topic_filter, qos, ...) Start receiving messages matching a topic filter (supports +/# wildcards). Returns a session_id.
get_messages(session_id, max_messages, timeout_seconds) Drain buffered messages from a subscription session; can wait briefly for one to arrive.
stop_subscription(session_id) Stop a session and unsubscribe (if no other session needs the same filter).
list_subscriptions() List all active subscription sessions.
discover_topics(topic_filter, duration_seconds, max_topics) Approximate a "list topics" operation via retained messages — MQTT has no native topic-listing operation.

Why subscriptions are session-based

MQTT is a continuous publish/subscribe stream, not a request/response API. A single MCP tool call can't "wait forever" for messages, so subscribing works in two steps: start_subscription registers interest and buffers messages in the background (one shared broker connection, dispatched in-process by topic filter), then get_messages drains that buffer on however many tool calls you want, optionally waiting a bounded amount of time for new data. Call stop_subscription when done.

Configuration

Env var Required Description
MQTT_HOST Yes Broker hostname or IP.
MQTT_PORT No Default 1883 (or 8883 for TLS — set explicitly).
MQTT_USERNAME / MQTT_PASSWORD No Broker credentials.
MQTT_CLIENT_ID No Defaults to a broker-assigned ID.
MQTT_KEEPALIVE No Seconds, default 60.
MQTT_CONNECT_TIMEOUT No Seconds to wait for the initial connect, default 10.
MQTT_TRANSPORT No tcp (default) or websockets.
MQTT_WS_PATH No Path for the websocket transport, default /mqtt.
MQTT_USE_TLS No true/false, default false.
MQTT_TLS_CA_CERTS No Path to a CA bundle. Omit to use the system trust store.
MQTT_TLS_CLIENT_CERT / MQTT_TLS_CLIENT_KEY No For mutual TLS.
MQTT_TLS_INSECURE No Skip hostname verification — for self-signed test certs only.
MQTT_WILL_TOPIC / MQTT_WILL_PAYLOAD / MQTT_WILL_QOS / MQTT_WILL_RETAIN No Last Will and Testament, set once at connect time.

Running locally

uv sync
export MQTT_HOST=localhost
export MQTT_PORT=1883
export MQTT_USERNAME=mqtt
export MQTT_PASSWORD=mqtt
uv run mqttmcpserver.py

See mcp.json for ready-to-use client configs (stdio and Docker).

Testing against a real broker

This repo's design principles call for testing against a real instance rather than mocks. docker-compose.yml spins up Eclipse Mosquitto (2.x, MQTT5-capable) with password auth, plus a TLS listener with self-signed certs for testing the TLS/mTLS code paths.

docker compose up -d       # start Mosquitto on localhost:1883 (plain, user: mqtt / pass: mqtt) and :8883 (TLS)
uv run pytest -v           # tests/conftest.py also starts/stops the stack automatically
docker compose down        # stop it manually if you started it yourself

License notes

docker-compose.yml and the files under docker/ configure the open-source Eclipse Mosquitto broker (EPL-2.0) for local testing only — they are not part of the MCP server itself.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mqtt5_mcp_server-0.1.0.tar.gz (96.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mqtt5_mcp_server-0.1.0-py3-none-any.whl (8.8 kB view details)

Uploaded Python 3

File details

Details for the file mqtt5_mcp_server-0.1.0.tar.gz.

File metadata

  • Download URL: mqtt5_mcp_server-0.1.0.tar.gz
  • Upload date:
  • Size: 96.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mqtt5_mcp_server-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d2e328c32c4be5eee12d45381d6b0aef0e9cb8c8aa888abe4f0b01fe94bcf3d2
MD5 4de8bf94a809d46f7bd1a1e2786cc1c5
BLAKE2b-256 87f0340c38809c9cc8dd1a21c7e5ad0d6c796bddeadcc4f49b06c9e32fa373c0

See more details on using hashes here.

File details

Details for the file mqtt5_mcp_server-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: mqtt5_mcp_server-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 8.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mqtt5_mcp_server-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0c111d57a7f88801bf596d2f4789694ceb0e71fb4f10f68dd0db4e590b802a6f
MD5 9c4c5c1db5657ff7a1e14f0e4833dae6
BLAKE2b-256 d74251b06a0da35641bd5ce38a01cc842495e655f596acf6f4e59f3cbbdcee6a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page