About Serial-MCP
Serial-MCP is an MCP server for agents that need to communicate with devices over a computer's serial port. It provides asynchronous communication, buffering, connection controls, and error reporting; the README says it has only been tested on Mac.
Key features
- 01Send messages and check responses
- 02Read timestamped buffered messages
- 03List and configure serial ports
- 04Manage connection status and lifecycle
- 05Report communication errors
Use cases
- 01Send commands to a serial-connected device
- 02Read buffered device responses
- 03Check available ports and connection state
MCP support
It exposes serial-port initialization, configuration, messaging, status, port listing, and connection closing as tools for MCP clients.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project READMESerial-MCP
MCP server allowing Agents to talk to devices connected to serial port of the computer. Tested only with MAC atm.
A robust serial communication server built with FastMCP framework, providing a reliable interface for serial port communication with features like message buffering, error handling, and connection management.
Installation
- Clone the repository:
git clone https://github.com/PaDev1/Serial-MCP.git
cd Serial-MCP
- Install dependencies:
pip install -r requirements.txt
Add the server after installing to your Claude Desktop or similar with the following structure
"serial_MCP": { "command": "uv", "args": [ "run", "--with", "fastmcp,pyserial", "fastmcp", "run", "/serial_MCP.py" ], "env": { "SERIAL_PORT": "", "SERIAL_BAUD_RATE": "9600", "SERIAL_BUFFER_LENGTH": "100" } }
Features
- Asynchronous Serial Communication: Built on asyncio for efficient I/O operations
- Message Buffering: Configurable buffer size with timestamp support
- Connection Management: Automatic port detection and connection handling
- Error Handling: Comprehensive error detection and reporting
- Environment Configuration: Support for environment variables and runtime configuration
- Logging: Detailed logging with timestamps and error tracking
Available Tools
1. delay
Wait for a specified number of seconds.
Parameters:
delay(float): Number of seconds to wait (must be positive)
Returns:
- Success status
- Requested delay time
- Actual delay time (measured)
- Status message
Example:
await delay({
"delay": 2.5 # Wait for 2.5 seconds
})
2. init_serial
Initialize a serial connection with specified parameters.
Parameters:
port(str): Serial port device path (e.g., '/dev/tty.usbmodem1101')baudrate(int): Communication speed in bauds (default: 9600)buffer_length(int): Maximum number of messages to buffer (default: 100)
Returns:
- Status of initialization
- Current mode (real/disconnected)
- Port and baudrate information
3. send_message
Send a message through the serial connection and optionally wait for a response.
Parameters:
message(str): Message to sendwait_for_response(bool): Whether to wait for a response after sending (default: False)response_timeout(float): Time in seconds to wait for a response (default: 0.5)
Returns:
success(bool): Overall operation successstatus(str): Operation status ("success", "error", etc.)mode(str): Current connection mode ("real", "disconnected")write_status(str): Write operation status:- "success": Message was written successfully
- "failed": Write operation failed
- "timeout": Write operation timed out
connection_state(str): Current connection state:- "connected": Serial port is connected and available
- "disconnected": No active serial connection
- "error": Connection in error state
response_status(str): Response status:- "not_checked": Response check was not requested
- "received": Response was received
- "no_response": No response received within timeout
- "error": Error occurred while checking for response
response_messages(list): List of received messages (if any)bytes_written(int): Number of bytes successfully writtenerror_type(str): Type of error if operation failedmessage(str): Human-readable status messageerror_details(dict): Additional error information if applicable
Example Send Without Response Check:
await send_message({
"message": "Hello",
"wait_for_response": False
})
# Returns:
{
"success": True,
"status": "success",
"mode": "real",
"write_status": "success",
"connection_state": "connected",
"response_status": "not_checked",
"response_messages": [],
"bytes_written": 6,
"message": "Message sent successfully in real mode"
}
Example Send With Response Check:
await send_message({
"message": "Hello",
"wait_for_response": True,
"response_timeout": 1.0
})
# Returns:
{
"success": True,
"status": "success",
"mode": "real",
"write_status": "success",
"connection_state": "connected",
"response_status": "received",
"response_messages": [
{
"timestamp": "2024-03-14T15:30:45.123456",
"message": "Hello received"
}
],
"bytes_written": 6,
"message": "Message sent successfully in real mode"
}
Example No Response Within Timeout:
await send_message({
"message": "Hello",
"wait_for_response": True,
"response_timeout": 0.5
})
# Returns:
{
"success": True,
"status": "success",
"mode": "real",
"write_status": "success",
"connection_state": "connected",
"response_status": "no_response",
"response_messages": [],
"bytes_written": 6,
"message": "Message sent successfully in real mode"
}
4. read_message
Read messages from the buffer.
Parameters:
wait(bool): Whether to wait for messages if buffer is empty (default: False)timeout(float): Time to wait for messages in seconds (default: 1.0)
Returns:
- List of messages with timestamps
- Current mode
- Status of read operation
5. list_serial_ports
List all available serial ports on the system.
Parameters: None
Returns:
- List of available ports with details
- Port names and descriptions
- Hardware IDs
6. get_serial_status
Get the current status of the serial connection.
Parameters: None
Returns:
- Current mode
- Port and baudrate information
- Buffer length
- Available ports
- Last error message
- Serial module availability
7. configure_serial
Configure the serial connection after initialization.
Parameters:
port(str, optional): New port to usebaudrate(int, optional): New baudrate to uselist_ports(bool): Whether to just list ports (default: False)
Returns:
- Updated configuration
- Current mode
- Available ports (if list_ports is True)
8. close_serial
Close the current serial connection.
Parameters: None
Returns:
- Status of closure
- Current mode
9. help
Get detailed instructions on how to use the Serial MCP server.
Parameters: None
Returns:
- Detailed help information including:
- Tool descriptions and parameters
- Example usage for each tool
- Common response formats
- Connection states
- Response statuses
- Important usage notes
Example:
await help()
# Returns comprehensive help information about all available tools and their usage
Configuration
The server can be configured using environment variables:
SERIAL_PORT: Serial port device path (default: '/dev/tty.usb*')SERIAL_BAUD_RATE: Communication speed in bauds (default: 9600)SERIAL_BUFFER_LENGTH: Maximum number of messages to buffer (default: 100)
Usage
Starting the Server
python serial_MCP.py
API Endpoints
Initialize Serial Connection
await init_serial({
"port": "/dev/tty.usbmodem1101",
"baudrate": 9600,
"buffer_length": 100
})
Send Message
await send_message({
"message": "Hello, device!"
})
Read Messages
await read_message({
"wait": False, # Whether to wait for messages
"timeout": 1.0 # Timeout in seconds
})
List Available Ports
await list_serial_ports()
Get Connection Status
await get_serial_status()
Configure Connection
await configure_serial({
"port": "/dev/tty.usbmodem1101",
"baudrate": 9600,
"list_ports": False
})
Close Connection
await close_serial()
Message Format
Messages in the buffer are stored with timestamps:
{
"timestamp": "2024-03-14T15:30:45.123456", # ISO format
"message": "Actual message content"
}
Error Handling
The server provides detailed error messages for various scenarios:
- Connection failures
- Invalid parameters
- Timeout conditions
- Buffer overflow
- Invalid messages
Logging
Logs are written to logs/serial_MCP.log with the following format:
[timestamp] - [level] - [message]
Requirements
- Python 3.7+
- pyserial>=3.5
- fastmcp>=0.1.0
- pydantic>=2.0.0
- asyncio>=3.4.3
Contributing
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
- FastMCP framework for the server infrastructure
- pyserial for the serial communication capabilities
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.