Skip to main content

iotsploit-mcp

iotsploit-mcp exposes IoTSploit to external coding agents through MCP over streamable HTTP. It is intended to run on the IoTSploit rig, next to iotsploit-django, iotsploit-core, the plugin packages, and the attached hardware.

Commands

Start the MCP HTTP endpoint (the default; serves both the Django AI assistant and external agents):

export IOTSPLOIT_DJANGO_API_BASE_URL="http://127.0.0.1:8888"
iotsploit-mcp
iotsploit-mcp http --host 127.0.0.1 --port 9900

The MCP endpoint is http://<rig-host>:9900/mcp.

The AI Assistant uses a separate inspection instance. The normal service launcher starts it automatically on loopback at port 9901 (or full MCP port + 1). When supervising services separately, run:

IOTSPLOIT_MCP_READONLY=1 iotsploit-mcp http --host 127.0.0.1 --port 9901

This omits active device scanning and all write tools from both listing and dispatch. API-mode and CLI-mode assistants use this endpoint; only an explicit, confirmed Scan devices quick action uses full MCP. See ai_assistant_runtime.md for setup, migration, deployment limits, and the client protocol.

Bind to 127.0.0.1 for local use (the default). The HTTP endpoint does not require authentication in this MVP. If you expose the service beyond loopback (0.0.0.0 or a LAN address), protect it with a firewall, TLS/reverse proxy, or re-add authentication before sharing the rig.

Agent Config

Claude Code:

claude mcp add --transport http iotsploit http://<rig-host>:9900/mcp

Codex, Cursor, or generic MCP config:

{
  "mcpServers": {
    "iotsploit": {
      "type": "http",
      "url": "http://<rig-host>:9900/mcp"
    }
  }
}

Environment

  • IOTSPLOIT_MCP_HOST: optional default host for the MCP server.
  • IOTSPLOIT_MCP_PORT: optional default port for the MCP server.
  • IOTSPLOIT_DJANGO_API_BASE_URL: Django API base URL, default http://127.0.0.1:8888.
  • IOTSPLOIT_DJANGO_API_TIMEOUT_S: Django request timeout in seconds.
  • IOTSPLOIT_MCP_LOG_TO_FILE: set to 1 to enable MCP file logging.

Current Tool Surface

This branch exposes an HTTP-backed MCP surface. Read-only tools are:

  • System: system_status, system_health, list_urls
  • Plugins/groups: list_plugins, describe_plugin, list_groups
  • Drivers/devices: list_device_drivers, describe_driver, scan_devices, list_devices, device_info, get_driver_states
  • Targets: list_targets, get_target, get_current_target
  • Observations: get_current_observations
  • Firmware: firmware_list, firmware_info
  • Fuzzer results: fuzzer_campaign_status, fuzzer_campaign_statistics, fuzzer_results_summary, fuzzer_artifacts
  • Tools/files: get_tools_status, get_tool_details, list_files
  • Local rig helper: list_serial_ports

The mutating tools are create_target, edit_target, select_target, execute_plugin, execute_device_command, set_driver_enabled and record_observations. execute_plugin runs an enabled exploit plugin against the current target and can interact with attached hardware or the target. execute_device_command runs one command a driver publishes (see describe_driver) on one scanned device, such as an ESP32 SCPI command; some commands, like flash_firmware and erase_flash, are irreversible. It needs the driver enabled, which set_driver_enabled does; that setting persists and applies to every client. Django does not yet authenticate these requests (see "Mutating /api/ requests are unauthenticated" in docs/exec-plans/tech-debt-tracker.md), and the MCP endpoint itself is unauthenticated too, so loopback binding is currently the only control: keep both bound to loopback or otherwise protected.

All other mutating or destructive tools remain prohibited until backend auth hardening and the two-key safety gate described in the implementation proposal are complete.

record_observations records findings an agent produced itself, rather than by running a plugin. It cannot claim to be a plugin: the backend stores the source as agent:<label>, refusing a caller-supplied source outright, and source is one of a scan's comparable scope fields -- so an agent's complete snapshot replaces only its own previous snapshot of the same scope and can never make a tool's measurement disappear. Pass is_complete=False for a spot check; the facts are kept as history but do not define current state.

Metadata

Release files for iotsploit-mcp 0.0.10

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

Source distribution (sdist)

Source distribution for iotsploit-mcp 0.0.10
File Size Uploaded Provenance Actions
iotsploit_mcp-0.0.10.tar.gz 17.2 kB Without provenance Details for iotsploit_mcp-0.0.10.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for iotsploit-mcp 0.0.10
File Interpreter ABI Platform Actions
iotsploit_mcp-0.0.10-py3-none-any.whl Python 3 none any Details for iotsploit_mcp-0.0.10-py3-none-any.whl

Total release size: 39.3 kB

Release files / iotsploit_mcp-0.0.10.tar.gz

Download URL iotsploit_mcp-0.0.10.tar.gz
Size 17.2 kB
Tags Source
SHA-256 checksum
How to use checksums
1cb6deabd5aa4f2bb5301b8fff490fa1ece230d54cb35a51ecfa98ba2a4facf2
BLAKE2b-256 checksum
How to use checksums
21cbbf511250edd9a1cec77d8b639d273ff3d848441bdefbc7a43d47f4595e55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.15

Release files / iotsploit_mcp-0.0.10-py3-none-any.whl

Download URL iotsploit_mcp-0.0.10-py3-none-any.whl
Size 22.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f404e8c47382e9310c43ef6920ef250f8e8a915c7dbba3329a33b2f7a8bfc36e
BLAKE2b-256 checksum
How to use checksums
8465307aa4b61275fa96b1d3ae67bc73c2fc5cdbba08095014d30cc5c2f368bf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.15

Security for iotsploit-mcp 0.0.10

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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