BLE transport for FastMCP clients.
Project description
fastmcp-transport-ble
A Bluetooth Low Energy (BLE) client transport for FastMCP.
This project provides a ClientTransport implementation that connects to an MCP server over BLE using GATT writes (client → server) and notifications (server → client). It is intended for scenarios where you want to run an MCP server on a BLE-capable device (embedded board, mobile device, etc.) and interact with it from a Python FastMCP client.
Features
- FastMCP
ClientTransportimplementation for BLE (powered bybleak) - Device discovery by BLE address or by advertised service UUID (with optional name hint)
- JSON-RPC message framing over GATT to support payloads larger than a single characteristic write
- Small, testable core for framing/packetization logic
Requirements
- Python 3.10+
- A BLE peripheral that implements the expected GATT service and characteristics (see “BLE GATT Protocol”)
- Supported host platform for
bleak(macOS, Windows, Linux; details depend on your BLE adapter and OS)
Installation
python -m pip install fastmcp-transport-ble
Usage
Create a FastMCP client with the BLE transport:
import asyncio
from fastmcp import Client
from fastmcp_transport_ble import BleTransport
async def main() -> None:
transport = BleTransport(
address=None,
name_hint="MCP_Server_BLE",
scan_timeout_s=10.0,
)
async with Client(transport) as client:
tools = await client.list_tools()
print([t.name for t in tools])
if __name__ == "__main__":
asyncio.run(main())
Demo script
There is a minimal demo at:
examples/list_tools/list_tools.py
Run it directly:
python examples/list_tools/list_tools.py --help
python examples/list_tools/list_tools.py --name-hint MCP_Server_BLE
python examples/list_tools/list_tools.py --address AA:BB:CC:DD:EE:FF
Configuration
BleTransport supports:
target: aBleTargetobject (or use the convenience args below)address: connect to a specific device addressname_hint: substring match against device name (applies when scanning)service_uuid: service UUID used for scanning (defaults toSERVICE_UUID)rx_char_uuid: characteristic UUID for client writes (defaults toRX_CHAR_UUID)tx_char_uuid: characteristic UUID for server notifications (defaults toTX_CHAR_UUID)scan_timeout_s: BLE scan timeout (seconds)request_mtu: optional MTU request (best-effort; platform-dependent)write_with_response: whether to write with response (reliable, but may be slower)
BLE GATT Protocol
This transport expects the peripheral to expose:
- A primary service UUID (default
SERVICE_UUID) - An RX characteristic UUID (default
RX_CHAR_UUID) that the client writes to - A TX characteristic UUID (default
TX_CHAR_UUID) that the client subscribes to for notifications
Payloads are UTF-8 JSON strings. Messages are framed into packets with a 1-byte header:
- High 2 bits: packet type (
SINGLE,START,CONT,END) - Low 6 bits: sequence number (mod 64)
Packet formats:
SINGLE:[header][json-bytes...]START:[header][total_len:4 bytes big-endian][chunk...]CONT:[header][chunk...]END:[header][chunk...]
The maximum payload per packet is derived from the negotiated MTU (minus ATT overhead), with a safety floor and a hard cap.
Development
Run unit tests:
python -m unittest discover -s tests -p "test*.py"
Compatibility notes
- BLE MTU negotiation support varies across platforms and adapters; the transport treats MTU requests as best-effort.
- GATT write/notify throughput can be limited; consider using smaller payloads and fewer concurrent requests if you see timeouts.
Contributing
Issues and pull requests are welcome. Please include:
- OS and Python version
- BLE adapter details (if relevant)
- Peripheral firmware/protocol details (UUIDs, MTU, packet sizes)
License
No license has been specified yet. Add a license file before publishing if you want others to legally reuse and redistribute the project.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastmcp_transport_ble-0.0.1a1.tar.gz.
File metadata
- Download URL: fastmcp_transport_ble-0.0.1a1.tar.gz
- Upload date:
- Size: 7.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
efd64e76ba68c7b9e7939242def8b9960be76d36a197c47642930b283be59296
|
|
| MD5 |
c08879a08546655c02cb5c5731404b8d
|
|
| BLAKE2b-256 |
84bea3d5978fad79f4b277012d2ae171679ede98f586d81feb2a05a2fc8edf4d
|
File details
Details for the file fastmcp_transport_ble-0.0.1a1-py3-none-any.whl.
File metadata
- Download URL: fastmcp_transport_ble-0.0.1a1-py3-none-any.whl
- Upload date:
- Size: 6.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d8318d3a230df060df0a9e34ae39f3cdc673dedf984be6c983ea41c7a0e570b
|
|
| MD5 |
dcee18b8134a40e78e3fdf1dc3c0e8d5
|
|
| BLAKE2b-256 |
762244a9d208a36e2024f5bda9e6b19083352335f4d4a9216f0b75b4efba8481
|