Ble MCP Server
Let AI agents interact with real BLE hardware — scan, connect, read, write, and subscribe.
Connector by es617 · GitHub account verified by the MCP Registry
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/es617-ble-mcp-server
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.
- Tools
- 20 read · 7 write · 0 delete · 8 not yet classified
- Secrets
- None asked for
- Install scripts
- Not scanned yet
- Runs as
- Python package
Tools by what they do 35
Read from the source code; the running server may list different tools.
Read 20 · Look things up without changing anything.
ble.connection_statusble.connections.listble.discoverble.mtuble.plugin.listble.plugin.templateble.poll_notificationsble.readble.read_descriptorble.scan_get_resultsble.scans.listble.spec.get
Show 8 more tools
ble.spec.listble.spec.readble.spec.searchble.spec.templateble.subscriptions.listble.tasks.listble.trace.statusble.trace.tail
Write 7 · Create, change, send or run things.
ble.spec.attachble.spec.registerble.subscribeble.tasks.cancelble.unsubscribeble.writeble.write_descriptor
Not yet classified 8 · We could not tell from the name and description.
ble.connectble.disconnectble.drain_notificationsble.plugin.loadble.plugin.reloadble.scan_startble.scan_stopble.wait_notification
Secrets and settings it asks for
Other settings (environment variables or headers).
BLE_MCP_ALLOW_WRITESBLE_MCP_PLUGINSBLE_MCP_TOOL_SEPARATORBLE_MCP_WRITE_ALLOWLIST
Files it touches
- Any path the agent passes to its tools
Tools (35)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
ble.connectConnect to a BLE peripheral by address. Returns a connection_id, device identity (device_name, service_uuids from scan cache), and spec status (null if none attached). After connecting: 1) Use ble.spec.list to check for a matching protocol spec by device name or service UUIDs. If a match is found, attach it with ble.spec.attach. If no match, ask the user if they have a protocol spec for this device. 2) Use ble.plugin.list to check for a plugin whose name matches the device. If a matching plugin is loaded, its tools are available to use directly.
ble.connection_statusCheck whether a connection is still alive. Returns connected (bool), address, and disconnect_ts if the device disconnected unexpectedly. Use this to verify a connection before a sequence of operations.
ble.connections.listList all tracked connections with their status, address, name, timestamps, and subscription count. Useful for recovering connection IDs after context loss.
ble.disconnectDisconnect a BLE peripheral by connection_id.
ble.discoverDiscover services and characteristics on a connected device. Results are cached per connection.
ble.drain_notificationsBatch-collect notifications: waits up to timeout_s for the first notification, then keeps collecting until idle_timeout_s passes with no new data, max_items is reached, or the total timeout_s expires. Ideal for bursty flows like downloading a log file or dataset over BLE notifications.
ble.mtuReturn the negotiated MTU (Maximum Transmission Unit) for a connection. The effective max write payload per packet is mtu - 3 bytes (ATT header). Useful for determining chunk sizes for large writes.
ble.plugin.listList loaded plugins with their tool names and metadata. Each plugin may include a 'meta' dict with matching hints like service_uuids, device_name_contains, or description — use these to determine which plugin fits the connected device. Also returns whether plugins are enabled and the current policy. Plugins require BLE_MCP_PLUGINS env var — set to 'all' for all or 'name1,name2' to allow specific plugins. If disabled, tell the user to set this variable when adding the MCP server.
ble.plugin.loadLoad a new plugin from a file or directory path. Requires BLE_MCP_PLUGINS env var to be set.
ble.plugin.reloadHot-reload a plugin by name. Re-imports the module and refreshes tools. Requires BLE_MCP_PLUGINS env var to be set.
ble.plugin.templateReturn a Python plugin template. Use this when creating a new plugin. Optionally pre-fill with a device name. Save the result to .ble_mcp/plugins/<name>.py, fill in the tools and handlers, then load with ble.plugin.load.
ble.poll_notificationsNon-blocking: return up to max_items buffered notifications immediately. Returns an empty list if the queue is empty. Also returns a dropped counter showing how many notifications were lost to queue overflow since subscription start.
ble.readRead the value of a GATT characteristic.
ble.read_descriptorRead a GATT descriptor by handle. Use ble.discover to find descriptor handles. Descriptors provide metadata about characteristics (e.g. CCCD, user description).
ble.scan_get_resultsNon-blocking: return the devices discovered so far by a running (or finished) scan. Also returns whether the scan is still active. Call this to check progress or to decide whether to stop early.
Show 20 more tools
ble.scan_startStart a background BLE scan. Returns a scan_id immediately. The scan runs in the background for up to timeout_s seconds. Use ble.scan_get_results to check discovered devices and ble.scan_stop to end the scan early.
ble.scan_stopStop a running scan early and return the final list of discovered devices. Safe to call on an already-finished scan.
ble.scans.listList all tracked scans with their status, filters, timestamps, and device count. Useful for recovering scan IDs after context loss.
ble.spec.attachAttach a registered spec to a connection session (in-memory only). The spec will be available via ble.spec.get for the duration of this connection. After attaching, check ble.plugin.list for a matching plugin, then present the user with their options: interact with the device using the spec (read/write characteristics, execute flows), use plugin shortcut tools if a plugin is loaded, extend an existing plugin with new tools, or create a new plugin using ble.plugin.template.
ble.spec.getGet the attached spec for a connection (returns null if none attached).
ble.spec.listList all registered specs with their metadata and matching hints.
ble.spec.readRead full spec content, file path, and metadata by spec_id.
ble.spec.registerRegister a spec file in the index. Validates YAML front-matter (requires kind: ble-protocol and name). The file path can be absolute or relative to CWD.
ble.spec.searchFull-text search over a spec's content. Returns matching snippets with line numbers and surrounding context.
ble.spec.templateReturn a markdown template for a new BLE protocol spec. Optionally pre-fill with a device name.
ble.subscribeSubscribe to notifications/indications on a characteristic.
ble.subscriptions.listList all active subscriptions with their status, queue depth, and dropped count. Optionally filter by connection_id. Useful for recovering subscription IDs.
ble.tasks.cancelCancel a running background task by task_id.
ble.tasks.listList all registered background tasks (from plugins) with their status. Shows task_id, name, running/stopped, start time, and any error.
ble.trace.statusReturn tracing config and event count.
ble.trace.tailReturn last N trace events (default 50).
ble.unsubscribeUnsubscribe from a previously created subscription.
ble.wait_notificationBlock until the next single notification arrives on a subscription, or timeout. For bursty / bulk flows (e.g. downloading a dataset or log file) prefer ble.drain_notifications instead.
ble.writeWrite a value to a GATT characteristic. Requires BLE_MCP_ALLOW_WRITES=true at server startup. Provide value as base64 (value_b64) or hex (value_hex).
ble.write_descriptorWrite to a GATT descriptor by handle. Requires BLE_MCP_ALLOW_WRITES=true. Rarely needed directly — bleak handles CCCD for notify/indicate automatically.
Signals
- Stars
- 18
- Forks
- 2
- Open issues
- 0
- Weekly downloads
- 67
- Last commit
- Mar 30, 2026 (7 months ago)
- Last release
- Mar 30, 2026 (7 months ago)
- Last package publish
- Mar 30, 2026 (7 months ago)
From GitHub (fetched Oct 24, 2026) and the package registry.
Details
- Registry name
io.github.es617/ble-mcp-server- Version
- 0.3.0
- Auth
- API key
- Packages
- pypi ble-mcp-serverpypi ble-mcp-serverpypi ble-mcp-server
- License
- MIT
- Repository
- github.com/es617/ble-mcp-server
- First seen
- Oct 24, 2026
- Last checked
- Oct 25, 2026
More from es617
- 0.586score
Obsidian Sync MCP
es617
Give AI agents access to your Obsidian vault via local files or Self-hosted LiveSync.
ConnectorAFreshness: ARemote★ 66 - 0.425score
Serial MCP Server
es617
Let AI agents interact with serial devices — list ports, connect, send, and read.
ConnectorDFreshness: DLocal★ 25↓ 91/wkClaude Code +5 - 0.410score
Dbgprobe MCP Server
es617
Let AI agents interact with debug probes — connect, flash, read/write memory, and reset.
ConnectorDFreshness: DLocal★ 10↓ 55/wkClaude Code +5
Cite this page
Ble MCP Server. Agent Mart. https://agentmart.dev/connectors/es617-ble-mcp-server (last updated 2026-10-25)