MCP2Serial
import os
import sys
import platform
import subprocess
import json
from pathlib import Path
def check_os():
"""检查操作系统"""
system = platform.system()
if system != "Darwin":
print(f"❌ 错误: 此脚本仅支持 MacOS 系统,当前系统为 {system}")
sys.exit(1)
print(f"✅ 操作系统: MacOS {platform.mac_ver()[0]}")
return system
def check_python_version():
"""检查Python版本"""
version = sys.version_info
if version.major < 3 or (version.major == 3 and version.minor < 11):
print(f"❌ 错误: Python版本必须大于等于3.11,当前版本为 {sys.version.split()[0]}")
sys.exit(1)
print(f"✅ Python版本检查通过: {sys.version.split()[0]}")
def check_homebrew():
"""检查是否安装了Homebrew"""
try:
subprocess.run(["brew", "--version"], capture_output=True)
print("✅ Homebrew 已安装")
except FileNotFoundError:
print("❌ 请先安装 Homebrew")
print("💡 安装命令: /bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"")
sys.exit(1)
def check_and_install_uv():
"""检查和安装uv"""
try:
subprocess.run(["uv", "--version"], capture_output=True)
print("✅ uv 已安装")
# 检查uvx是否可用
try:
subprocess.run(["uvx", "--version"], capture_output=True)
print("✅ uvx 已安装")
except FileNotFoundError:
print("⚙️ 正在配置 uvx...")
subprocess.run([sys.executable, "-m", "uv", "pip", "install", "--system", "uv"], check=True)
print("✅ uvx 配置成功")
except FileNotFoundError:
print("⚙️ 正在安装 uv...")
try:
# 使用 Homebrew 安装 uv
subprocess.run(["brew", "install", "astral-sh/tap/uv"], check=True)
print("✅ uv 安装成功")
# 安装完uv后配置uvx
print("⚙️ 正在配置 uvx...")
subprocess.run([sys.executable, "-m", "uv", "pip", "install", "--system", "uv"], check=True)
print("✅ uvx 配置成功")
except subprocess.CalledProcessError:
print("❌ uv 安装失败")
sys.exit(1)
def create_config():
"""创建默认配置文件"""
config_dir = Path.home() / ".mcp2serial"
config_file = config_dir / "config.yaml"
if not config_dir.exists():
config_dir.mkdir(parents=True)
print(f"✅ 创建配置目录: {config_dir}")
if not config_file.exists():
config_content = """serial:
port: /dev/tty.usbserial-* # 串口设备名,支持通配符
baud_rate: 115200
commands:
set_pwm:
command: "PWM {frequency}\\n"
need_parse: false
prompts:
- "把PWM调到{value}"
- "Set PWM to {value}%"
"""
config_file.write_text(config_content, encoding='utf-8')
print(f"✅ 创建配置文件: {config_file}")
print("⚠️ 请修改配置文件中的串口设备名为实际值")
else:
print(f"ℹ️ 配置文件已存在: {config_file}")
def check_and_configure_claude():
"""检查和配置Claude桌面客户端"""
claude_config_dir = Path.home() / "Library/Application Support/Claude"
if not claude_config_dir.exists():
print(f"ℹ️ 未检测到Claude桌面客户端目录: {claude_config_dir}")
return
config_file = claude_config_dir / "claude_desktop_config.json"
if not config_file.exists():
print(f"ℹ️ Claude配置文件不存在: {config_file}")
return
try:
with open(config_file, 'r', encoding='utf-8') as f:
config = json.load(f)
except json.JSONDecodeError:
print("❌ Claude配置文件格式错误")
return
if "mcpServers" not in config:
config["mcpServers"] = {}
if "mcp2serial" not in config["mcpServers"]:
config["mcpServers"]["mcp2serial"] = {
"command": "uvx",
"args": ["mcp2serial"]
}
with open(config_file, 'w', encoding='utf-8') as f:
json.dump(config, f, indent=2)
print("✅ 已添加mcp2serial配置到Claude")
else:
print("ℹ️ Claude已配置mcp2serial")
def check_vscode():
"""检查VSCode安装"""
vscode_path = Path("/Applications/Visual Studio Code.app")
if vscode_path.exists():
print("""
ℹ️ 检测到VSCode安装
请在VSCode中添加以下MCP服务器配置:
{
"mcp2serial": {
"command": "uvx",
"args": ["mcp2serial"]
}
}
""")
else:
print("ℹ️ 未检测到VSCode安装")
def check_serial_devices():
"""检查串口设备"""
devices = list(Path("/dev").glob("tty.usbserial-*"))
if devices:
print("\n检测到以下串口设备:")
for device in devices:
print(f"- {device}")
print("💡 请在配置文件中使用正确的设备名")
else:
print("\n⚠️ 未检测到串口设备,请确保:")
print("1. 设备已正确连接")
print("2. 已安装串口驱动")
print("💡 常用串口芯片驱动:")
print("- CH340/CH341: https://www.wch.cn/downloads/CH341SER_MAC_ZIP.html")
print("- CP210x: https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers")
print("- FTDI: https://ftdichip.com/drivers/vcp-drivers/")
def main():
print("=== MCP2Serial MacOS 安装程序 ===")
# 1. 检查操作系统
system = check_os()
# 2. 检查Python版本
check_python_version()
# 3. 检查Homebrew
check_homebrew()
# 4. 检查和安装uv/uvx
check_and_install_uv()
# 5. 创建配置文件
create_config()
# 6. 检查和配置Claude
check_and_configure_claude()
# 7. 检查VSCode
check_vscode()
# 8. 检查串口设备
check_serial_devices()
print("\n✨ 安装完成!")
print("📝 请确保:")
print("1. 修改配置文件中的串口设备名")
print("2. 检查Claude或VSCode的MCP服务器配置")
print("3. 重启Claude或VSCode以使配置生效")
print("\n💡 提示:")
print("- mcp2serial 将在首次运行时自动下载")
print("- 串口设备名通常为 /dev/tty.usbserial-* 格式")
print("- 如遇到权限问题,请确保当前用户有串口设备的读写权限")
if __name__ == "__main__":
main()