Skip to main content
Glama

iotforge

An MCP server for discovering and controlling IoT devices on your local network and via Bluetooth LE.

What it does

iotforge exposes your LAN and BLE devices as MCP tools so any MCP-compatible AI assistant can:

  • Discover devices on your local network (mDNS, ARP) and Bluetooth LE

  • Register discovered devices into a persistent inventory

  • Control devices through adapter plugins (smart plugs, BLE lights, etc.)

  • Query device status and inventory via MCP resources

Related MCP server: WeMo MCP Server

Architecture

MCP Client (Claude, etc.)
    │
    ▼
┌─────────────────────────────┐
│  iotforge MCP Server        │
│  (stdio or SSE transport)   │
├─────────────────────────────┤
│  Tools: discover, register, │
│         control, status     │
│  Resources: inventory,      │
│             pending         │
├─────────────────────────────┤
│  Core: Scanner, Registry,   │
│        Discovery Service    │
├─────────────────────────────┤
│  Adapters: Meross, BLE      │
│  Database: SQLite (async)   │
└─────────────────────────────┘
    │               │
    ▼               ▼
  LAN/mDNS       BLE/GATT

MCP Tools

Tool

Description

lan_discover

Scan WiFi/LAN and BLE for devices

lan_discover_pending

List devices awaiting registration

lan_device_register

Promote a pending device to the registry

lan_pending_dismiss

Dismiss a pending device

lan_device_list

List registered devices with filters

lan_device_control

Send a command to a device

lan_device_status

Get current device status

MCP Resources

Resource

Description

devices://inventory

Full device inventory (markdown)

devices://pending

Pending devices (markdown)

Installation

pip install -e ".[all]"

Optional extras: meross (Meross smart plugs), ble (Bluetooth LE via bleak).

Configuration

Copy config.example.yaml and edit:

cp config.example.yaml config.yaml

Key settings: network range, scan intervals, transport mode (stdio/SSE), database path.

Usage

With Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "iotforge": {
      "command": "iotforge",
      "args": ["config.yaml"]
    }
  }
}

Standalone (SSE mode)

iotforge config.yaml

Set server.transport: sse in your config to expose an HTTP endpoint.

BLE Scripts

The scripts/ directory contains standalone BLE utilities:

  • elk_ble_ctl.py — GATT controller for ELK-BLEDDM LED strips (service 0xFFF0)

  • lampsmart_pro.py — BLE ADV broadcast controller for LampSmart Pro ceiling lights (multiple protocol versions)

  • ble_adv_sniffer.py — Raw HCI BLE advertisement sniffer for protocol discovery

Adapters

iotforge uses a plugin adapter system. Built-in adapters:

  • meross — Meross smart plugs/switches (requires meross-iot)

  • ble_light — BLE GATT light control (requires bleak)

Custom adapters implement the BaseAdapter interface in src/iotforge/adapters/base.py.

Development

pip install -e ".[dev]"
ruff check .
python -m pytest --cov=iotforge

License

MIT — see LICENSE.

Available Tools

7 tools
lan_device_controlC

Send a command to a device.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNo
commandYes
device_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior2/5

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

With no annotations provided, the description carries full responsibility for disclosing behavior. It only says 'Send a command' and does not mention side effects, required permissions, execution semantics, or whether the command mutates device state.

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

Conciseness3/5

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

The description is a single concise sentence with no redundancy, but it is under-specified. It would benefit from additional context while remaining brief.

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

Completeness2/5

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

Given three parameters, an output schema, and no annotations, the description is incomplete. It does not describe the command mechanism, expected output, or any prerequisites, leaving significant gaps for an agent to invoke the tool correctly.

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

Parameters1/5

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

The schema has 0% description coverage, and the description adds no meaning to the parameters (device_id, command, args). It fails to explain what 'command' means, what 'args' are for, or how device_id is used.

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

Purpose4/5

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

The description states a clear verb ('Send') and resource ('a device'), indicating it sends commands to devices. However, it does not reference the LAN context or distinguish itself from sibling tools like lan_device_status, which could also involve device interactions.

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?

There is no guidance on when to use this tool versus alternatives such as lan_device_status or lan_device_register. It lacks preconditions, exclusions, or context about device discovery/registration requirements.

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

lan_device_listC

List registered devices with current status.

ParametersJSON Schema
NameRequiredDescriptionDefault
filter_roomNo
filter_typeNo
online_onlyNo
filter_transportNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries full responsibility for behavioral disclosure. While 'List' implies a read operation, the description does not state whether it returns all devices or only online ones, whether authentication is needed, or any side effects. It also does not clarify what 'current status' encompasses.

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

Conciseness4/5

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

The description is a single, efficient sentence with no redundant words. It is front-loaded with the core action. However, the extreme brevity leaves out important context, so it earns a 4 rather than a 5.

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

Completeness2/5

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

The tool has four optional parameters, no annotations, and only a minimal description. The output schema exists but is not described; given the low complexity, the description should at least hint at filtering capabilities or typical output. It does not, leaving the tool under-specified for reliable invocation.

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

Parameters1/5

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

Schema coverage is 0% and the description does not mention any of the four parameters (filter_room, filter_type, online_only, filter_transport). There is zero information about accepted values, formats, or how filters interact, forcing the agent to guess.

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 ('List') and resource ('registered devices') with an added scope ('current status'). This clearly distinguishes it from siblings like lan_discover (which scans for unregistered devices) and lan_device_status (which likely targets a single device).

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 is provided on when to use this tool versus alternatives like lan_device_status, lan_discover, or lan_device_control. There are no exclusions, conditions, or example scenarios, leaving the agent to infer usage from the name alone.

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

lan_device_registerC

Promote a pending device to the registry.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
roomNo
pending_idYes
adapter_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.5/5.0
Behavior1/5

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

No annotations are provided, so the description carries the full burden. It simply states the action without disclosing side effects (e.g., device removed from pending list), prerequisites, permission requirements, or any state changes. This is a significant gap for a mutation tool.

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

Conciseness2/5

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

The description is extremely short (7 words) and front-loaded, but it is under-specified to the point of being unhelpful. It is not 'appropriately sized' because it omits essential details, making this more a case of under-specification rather than effective conciseness.

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

Completeness1/5

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

This is a mutating operation with 4 parameters, no annotations, and only a one-sentence description. Even with an output schema present, the description fails to cover prerequisites, behavior, or parameter semantics. It is completely inadequate for an agent to select and invoke the tool correctly.

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

Parameters1/5

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

Schema description coverage is 0%, and the description provides no explanation of parameters such as pending_id, name, room, or adapter_type. With zero compensation from the description, the agent has no guidance beyond the parameter names themselves.

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 'Promote' and identifies the resource 'pending device' and destination 'registry'. It clearly distinguishes from sibling tools like lan_pending_dismiss, lan_discover, and lan_device_list by implying the action of moving a device from pending to registered status.

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?

The description implies when to use the tool (when a pending device should be registered), but it does not explicitly state alternatives or exclusions. Given sibling tools, it could have mentioned 'as opposed to dismissing' but this is not provided.

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

lan_device_statusC

Get detailed current status of a device.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. The verb 'Get' implies a read operation, but the description does not explicitly confirm read-only behavior, side-effect freedom, or clarify what happens if the device is not found. It lacks any details on permissions, rate limits, or the nature of 'detailed status.'

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 filler or redundancy. It efficiently conveys the core action and resource, earning its place without unnecessary detail. This is a model of conciseness.

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

Completeness2/5

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

Although the tool has an output schema and only one parameter, the description omits essential usage context such as when to prefer this over lan_device_list, any preconditions (e.g., device must be discovered first), or what the 'detailed status' covers. It is insufficient for an agent to invoke correctly without supplementary guidance.

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

Parameters1/5

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

The input schema contains one parameter (device_id) with no description, and schema description coverage is 0%. The description fails to mention or explain device_id, its expected format, or how it relates to the status query, thus adding no value beyond the raw schema.

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

Purpose4/5

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

The description clearly identifies the action ('Get') and resource ('detailed current status of a device'), which aligns with the tool name and distinguishes it from sibling tools like lan_device_list or lan_device_control. However, it does not explicitly compare against siblings or clarify what 'detailed' entails, so it lacks definitive differentiation.

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 such as lan_device_list or lan_device_control. It neither states prerequisites, exclusions, nor typical scenarios, leaving the agent without contextual decision-making information.

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

lan_discoverA

Discover devices on local network and Bluetooth.

Scans WiFi/LAN and Bluetooth LE simultaneously. Returns a discovery report with new, updated, lost devices.

ParametersJSON Schema
NameRequiredDescriptionDefault
scan_typeNoall
network_rangeNo192.168.1.0/24
timeout_secondsNo

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?

With no annotations, the description carries the burden of behavioral disclosure. It reveals that the tool performs simultaneous WiFi/LAN and Bluetooth scans and returns a discovery report with new, updated, and lost devices. However, it omits any mention of permissions, network impact, or other side effects, leaving some behavioral traits undisclosed.

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 concise and front-loaded: the first sentence states the primary purpose. The following two sentences add essential details about scanning behavior and output. No wasted words, and the structure is clear.

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?

The presence of an output schema reduces the need to describe return values, and the description does mention key output characteristics. However, it lacks parameter guidance, prerequisites, and workflow context relative to sibling tools. For a tool with 3 undocumented params and no annotations, this level of completeness is only minimal.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explain the parameters (scan_type, network_range, timeout_seconds). It only indirectly hints that scanning covers 'WiFi/LAN and Bluetooth LE,' which may correspond to 'all' in scan_type, but it does not clarify parameter options or effects. This is a significant gap given the low coverage.

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 tool discovers devices on the local network and Bluetooth, with a specific verb ('Discover') and resource ('devices on local network and Bluetooth'). It also differentiates from siblings like lan_device_list and lan_device_control by emphasizing the scanning and reporting of new/updated/lost devices.

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 provides clear context: it scans WiFi/LAN and Bluetooth LE simultaneously, which implies appropriate scenarios for use. However, it does not explicitly mention when not to use this tool or name alternatives, so it stops short of full exclusion guidance.

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

lan_discover_pendingB

List devices awaiting manual registration.

ParametersJSON Schema
NameRequiredDescriptionDefault
filter_transportNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. The verb 'List' implies a read-only operation, but the description does not explicitly state that it makes no changes, nor does it mention any permissions or processing implications. It adds minimal context beyond the core action.

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, efficient sentence with no filler or redundant information. It is front-loaded with the key action ('List devices') and immediately scopes it ('awaiting manual registration'), making it optimally concise.

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?

The output schema exists, so return values are covered. However, the description does not explain the filter_transport parameter, and the interaction with sibling tools (e.g., when pending devices become available for registration) is not addressed. For a simple list tool, it is minimally adequate but leaves gaps in parameter context and workflow integration.

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

Parameters1/5

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

The input schema has one parameter, filter_transport, with no description in the schema and 0% schema description coverage. The tool description does not mention this parameter at all, leaving its meaning and usage completely unexplained. The description fails to add any value for parameter understanding.

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 'List devices awaiting manual registration' uses a specific verb (List) and resource (devices awaiting manual registration), clearly distinguishing this from sibling tools like lan_discover or lan_device_list. The phrase 'awaiting manual registration' adds precision, making the tool's purpose unambiguous.

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 is provided on when to use this tool versus alternatives. It does not mention lan_discover for listing all discovered devices or lan_pending_dismiss as related actions, leaving the agent to infer usage from the name alone.

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

lan_pending_dismissC

Dismiss a pending device (hide from pending list).

ParametersJSON Schema
NameRequiredDescriptionDefault
pending_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries full burden. It only states the action and the effect of hiding, but does not disclose reversibility, permissions, side effects, or whether 'dismiss' causes deletion or just visibility change.

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 filler. Every word adds value, and it is appropriately sized for a simple one-parameter action.

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

Completeness2/5

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

Despite having an output schema, the tool's behavioral and input semantics are underspecified. The agent cannot determine how to obtain a valid pending_id or what the consequences of dismissal are beyond the minimal statement.

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

Parameters1/5

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

Schema coverage is 0% and the description does not mention pending_id at all. The agent is left to infer from the name alone, which is insufficient for a parameter that likely requires specific ID format or provenance.

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 'dismiss' and resource 'pending device', and clarifies the effect with 'hide from pending list'. This clearly distinguishes it from siblings like lan_discover_pending (listing) and lan_device_register.

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 versus alternatives. The parenthetical 'hide from pending list' implies a use case but does not explicitly state context, prerequisites, or when not to use it.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 7 tool updatesv0.1.0
    • First observedlan_device_control
    • First observedlan_device_list
    • First observedlan_device_register
    • First observedlan_device_status
    • First observedlan_discover
    • First observedlan_discover_pending
    • First observedlan_pending_dismiss

TDQS

B3.2/5.0
Disambiguation5/5

Each tool targets a distinct operation: discovery trigger, pending list, pending registration, pending dismissal, registered device list, device control, and device status. No two tools overlap in purpose, so an agent can easily select the correct tool for a given task.

Naming Consistency4/5

All tools share the 'lan_' prefix, providing a unified namespace. However, naming mixes verb-first (lan_discover) and noun-first (lan_device_register) patterns, and lan_device_status uses a noun instead of an action verb. These are minor deviations that don't severely impair readability.

Tool Count5/5

Seven tools is ideal for a local network device management server. The set covers discovery, the pending device workflow, and registered device operations without unnecessary redundancy, fitting comfortably within the 3-15 tool range.

Completeness4/5

The tool set covers the core lifecycle from discovery through pending approval and registration, plus device listing, control, and status retrieval. Notable gaps include no unregister/delete operation for registered devices and no update device details, but these are minor for a LAN management use case.

Maintenance

ActivityInactive
ResponsivenessNo issues

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
    A
    quality
    D
    maintenance
    Enables AI assistants to control Bond Bridge smart home devices including ceiling fans, motorized shades, dimmable lights, and other RF-controlled devices. Provides comprehensive device management and control capabilities through the Bond Local API.
    10
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables natural language control of WeMo smart home devices for power, brightness, and device management through AI assistants. It features a high-reliability multi-phase discovery process to scan, monitor, and configure devices across a local network.
    11
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to directly interact with Matter devices and protocol operations, including device commissioning, attribute read/write, commands, and event monitoring, through natural language.
    7
    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/ashlarforge/iotforge'

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