MCP2Serial
#!/usr/bin/env python3
# ====================================================
# Project: MCP2Serial
# Description: Installation script for Ubuntu/Raspberry Pi
# Repository: https://github.com/mcp2everything/mcp2serial.git
# License: MIT License
# Author: mcp2everything
# Copyright (c) 2024 mcp2everything
# ====================================================
import os
import sys
import json
import subprocess
from pathlib import Path
import shutil
def get_uv_path():
"""Get uv executable path."""
# 检查是否已安装uv
try:
result = subprocess.run(['which', 'uv'], capture_output=True, text=True)
if result.returncode == 0:
return result.stdout.strip()
except:
pass
return None
def install_uv():
"""Install uv package manager."""
print("Installing uv package manager...")
try:
# 使用curl安装uv
curl_command = 'curl -LsSf https://astral.sh/uv/install.sh | sh'
subprocess.run(curl_command, shell=True, check=True)
# 添加uv到PATH
home = str(Path.home())
bashrc_path = os.path.join(home, '.bashrc')
with open(bashrc_path, 'a') as f:
f.write('\n# uv package manager\nexport PATH="$HOME/.cargo/bin:$PATH"\n')
print("uv installed successfully!")
return True
except Exception as e:
print(f"Error installing uv: {e}")
return False
def install_mcp2serial():
"""Install mcp2serial package."""
try:
# 创建虚拟环境并安装包
subprocess.run(['uv', 'venv', '.venv'], check=True)
subprocess.run(['.venv/bin/uv', 'pip', 'install', 'mcp2serial'], check=True)
return True
except Exception as e:
print(f"Error installing mcp2serial: {e}")
return False
def configure_claude_desktop():
"""Configure Claude Desktop with mcp2serial."""
try:
home = str(Path.home())
config_dir = os.path.join(home, '.config', 'claude-desktop')
os.makedirs(config_dir, exist_ok=True)
config_file = os.path.join(config_dir, 'config.json')
config = {
"mcpServers": {
"mcp2serial": {
"command": "uvx",
"args": ["mcp2serial"]
}
}
}
# 如果配置文件已存在,则更新而不是覆盖
if os.path.exists(config_file):
with open(config_file, 'r') as f:
existing_config = json.load(f)
existing_config.setdefault('mcpServers', {})
existing_config['mcpServers']['mcp2serial'] = config['mcpServers']['mcp2serial']
config = existing_config
with open(config_file, 'w') as f:
json.dump(config, f, indent=4)
print("Claude Desktop configured successfully!")
return True
except Exception as e:
print(f"Error configuring Claude Desktop: {e}")
return False
def setup_config():
"""Setup configuration files."""
try:
home = str(Path.home())
config_dir = os.path.join(home, '.mcp2serial')
os.makedirs(config_dir, exist_ok=True)
# 复制默认配置文件
default_config = os.path.join(os.path.dirname(__file__), 'config.yaml')
user_config = os.path.join(config_dir, 'config.yaml')
if os.path.exists(default_config):
shutil.copy2(default_config, user_config)
print(f"Configuration file copied to: {user_config}")
return True
except Exception as e:
print(f"Error setting up configuration: {e}")
return False
def main():
"""Main installation process."""
print("Starting MCP2Serial installation for Ubuntu/Raspberry Pi...")
# 检查Python版本
if sys.version_info < (3, 11):
print("Error: Python 3.11 or higher is required")
sys.exit(1)
# 安装uv(如果需要)
if not get_uv_path():
if not install_uv():
print("Failed to install uv package manager")
sys.exit(1)
# 安装mcp2serial
if not install_mcp2serial():
print("Failed to install mcp2serial")
sys.exit(1)
# 配置Claude Desktop
if not configure_claude_desktop():
print("Warning: Failed to configure Claude Desktop")
# 设置配置文件
if not setup_config():
print("Warning: Failed to setup configuration files")
print("\nInstallation completed!")
print("\nTo use mcp2serial:")
print("1. Activate the virtual environment:")
print(" source .venv/bin/activate")
print("2. Run the server:")
print(" uv run mcp2serial")
print("\nFor more information, visit: https://github.com/mcp2everything/mcp2serial")
if __name__ == "__main__":
main()