Skip to main content

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 ClientTransport implementation for BLE (powered by bleak)
  • 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: a BleTarget object (or use the convenience args below)
  • address: connect to a specific device address
  • name_hint: substring match against device name (applies when scanning)
  • service_uuid: service UUID used for scanning (defaults to SERVICE_UUID)
  • rx_char_uuid: characteristic UUID for client writes (defaults to RX_CHAR_UUID)
  • tx_char_uuid: characteristic UUID for server notifications (defaults to TX_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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastmcp_transport_ble-0.0.1a1.tar.gz (7.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fastmcp_transport_ble-0.0.1a1-py3-none-any.whl (6.8 kB view details)

Uploaded Python 3

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

Hashes for fastmcp_transport_ble-0.0.1a1.tar.gz
Algorithm Hash digest
SHA256 efd64e76ba68c7b9e7939242def8b9960be76d36a197c47642930b283be59296
MD5 c08879a08546655c02cb5c5731404b8d
BLAKE2b-256 84bea3d5978fad79f4b277012d2ae171679ede98f586d81feb2a05a2fc8edf4d

See more details on using hashes here.

File details

Details for the file fastmcp_transport_ble-0.0.1a1-py3-none-any.whl.

File metadata

File hashes

Hashes for fastmcp_transport_ble-0.0.1a1-py3-none-any.whl
Algorithm Hash digest
SHA256 1d8318d3a230df060df0a9e34ae39f3cdc673dedf984be6c983ea41c7a0e570b
MD5 dcee18b8134a40e78e3fdf1dc3c0e8d5
BLAKE2b-256 762244a9d208a36e2024f5bda9e6b19083352335f4d4a9216f0b75b4efba8481

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page