iotforge
Allows discovery and control of Bluetooth Low Energy (BLE) devices, such as BLE lights, through adapter plugins.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@iotforgediscover all IoT devices on my network"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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/GATTMCP Tools
Tool | Description |
| Scan WiFi/LAN and BLE for devices |
| List devices awaiting registration |
| Promote a pending device to the registry |
| Dismiss a pending device |
| List registered devices with filters |
| Send a command to a device |
| Get current device status |
MCP Resources
Resource | Description |
| Full device inventory (markdown) |
| 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.yamlKey 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.yamlSet 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=iotforgeLicense
MIT — see LICENSE.
Available Tools
7 toolslan_device_controlC
Send a command to a device.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| command | Yes | ||
| device_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filter_room | No | ||
| filter_type | No | ||
| online_only | No | ||
| filter_transport | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| room | No | ||
| pending_id | Yes | ||
| adapter_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| scan_type | No | all | |
| network_range | No | 192.168.1.0/24 | |
| timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filter_transport | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| pending_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
7 tool updates
v0.1.0- First observed
lan_device_control - First observed
lan_device_list - First observed
lan_device_register - First observed
lan_device_status - First observed
lan_discover - First observed
lan_discover_pending - First observed
lan_pending_dismiss
TDQS
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.
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.
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.
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
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
Turns a phone into a camera+Bluetooth remote so AI assistants can see and control any PC.
Control your Tesla from your AI assistant - climate, charging, access, and security.
AI agent infrastructure for discovery, authorization, execution, identity, and signed receipts.
Smart home product intelligence: 1,080+ products with expert consensus scores and compatibility.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables 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.10MIT
- AlicenseAqualityCmaintenanceEnables 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.111MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to directly interact with Matter devices and protocol operations, including device commissioning, attribute read/write, commands, and event monitoring, through natural language.7MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to control Apple HomeKit smart home accessories, scenes, and automations via MCP tools.164MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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