tinysa mcp
用于通过串行端口操作TinySA的MCP服务器
抱歉,我目前正在进行实验,无法保证它能正常工作。
概述
该项目是一个MCP服务器,旨在通过串行端口操作TinySA设备。它利用pyserial、httpx、numpy、Pillow和FastMCP等Python库提供基于工具的接口,用于连接设备、执行命令和检索设备版本信息。
体系结构和线程模型
该项目使用基于Tkinter的GUI和MCP服务器。由于Tkinter要求在主线程中运行,因此使用了以下设计:
flowchart TD
subgraph MainThread
A[main()] --> B[tk.Tk() & TinySALogMonitor]
B --> C[root.mainloop()]
end
subgraph MCPThread
D[run_mcp_server(mcp_server)]
D --> E[mcp_server.run()]
end
E -- log_callback --> F[log_monitor.log_queue]
F -- root.afterで定期ポーリング --> B
D -- サーバー終了時 --> G[root.after(0, root.destroy)]- Tkinter GUI在主线程中运行:\
主线程初始化Tkinter根窗口并启动主事件循环。所有GUI操作都在此线程中执行。
- MCP服务器在后台线程中运行:\
MCP服务器使用Python在单独的线程中启动 threading.Thread这允许服务器与GUI同时处理请求。
- 通过队列进行线程安全通信:\
来自MCP服务器(或其他后台线程)的日志消息和其他数据使用 queue.QueueGUI使用以下命令定期轮询此队列 root.after 以安全地更新显示。
- 平滑关闭:\
当MCP服务器停止时,它会使用以下命令安排GUI关闭 root.after(0, root.destroy),确保所有Tkinter操作都保留在主线程中。
示例(主要功能):
def main():
root = tk.Tk()
log_monitor = TinySALogMonitor(root)
mcp_server = create_mcp_server(log_monitor.add_log)
mcp_thread = threading.Thread(target=run_mcp_server, args=(mcp_server,), daemon=True)
mcp_thread.start()
root.mainloop()备注
- 不要从后台线程访问Tkinter对象。\
始终使用提供的队列 root.after 用于线程安全通信。
- 这种设计确保了MCP服务器和GUI可以同时运行,而不会违反Tkinter的线程要求。
特性
- 发送命令并从设备检索响应。
- 检索固件和硬件版本信息。
- 展示MCP工具,以便与其他系统集成。
- 支持从设备屏幕捕获图像,以及可选的带时间戳的文件保存。
MCP工具
以下MCP工具可用:
- 获取版本:从TinySA设备检索版本信息。
- execute_命令:向TinySA设备发送命令并获取响应。
- 连接:连接到指定端口上的TinySA设备。
- 断开:断开TinySA设备。
- get_device_info:检索有关连接设备的详细信息。
- capture_image:捕获TinySA屏幕图像,并可选择将其保存到带有时间戳的文件中。
用法示例
使用MCP客户端调用MCP工具。例如,要获取设备版本:
mcp call get_version --args '{"port": "COM4"}'故障排除
- 连接问题: 确保指定的串行端口正确,并且您的用户具有适当的权限。
- 命令失败: 检查MCP服务器日志(如果可用)中的错误消息。
- 图像捕获: 验证设备在图像捕获期间是否返回了足够的数据(307200字节)。
- 请参阅 模型上下文协议文档 有关MCP集成的更多信息。
材料
请参阅 material 目录中的附加文档,最好添加文件“USB interface.txt”作为AI知识。
许可证
该项目根据MIT许可证获得许可。
