We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mario-andreschak/mcp-sap-gui'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
import json
import sys
import os
import shutil
from datetime import datetime
from pathlib import Path
from typing import Dict, Any, Literal
def get_settings_path(mode: Literal["cline", "roo"]) -> Path:
"""Get the path to the settings file based on mode."""
base_path = Path(os.path.expanduser("~")) / "AppData" / "Roaming" / "Code" / "User" / "globalStorage"
if mode == "cline":
return base_path / "saoudrizwan.claude-dev" / "settings" / "cline_mcp_settings.json"
else: # roo
return base_path / "rooveterinaryinc.roo-cline" / "settings" / "cline_mcp_settings.json"
def create_backup(file_path: Path) -> Path:
"""Create a backup of the file with timestamp."""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = file_path.parent / f"{file_path.stem}_backup_{timestamp}{file_path.suffix}"
shutil.copy2(file_path, backup_path)
return backup_path
def validate_json_structure(data: Dict[str, Any]) -> bool:
"""Validate the basic structure of the settings JSON."""
if not isinstance(data, dict):
return False
if "mcpServers" not in data or not isinstance(data["mcpServers"], dict):
return False
return True
def get_mcp_config() -> Dict[str, Any]:
"""Get the MCP SAP GUI configuration with the current path."""
current_path = os.path.abspath(os.path.dirname(__file__))
return {
"command": "python",
"args": [
"-m",
"sap_gui_server.server"
],
"cwd": current_path,
"disabled": False
}
def update_settings(mode: Literal["cline", "roo"]) -> None:
"""Update the settings file safely."""
settings_path = get_settings_path(mode)
# Check if file exists
if not settings_path.exists():
print(f"Error: Settings file not found at {settings_path}")
sys.exit(1)
try:
# Read existing settings
with open(settings_path, 'r', encoding='utf-8') as f:
settings = json.load(f)
# Validate structure
if not validate_json_structure(settings):
print("Error: Invalid settings file structure")
sys.exit(1)
# Create backup
backup_path = create_backup(settings_path)
print(f"Backup created at: {backup_path}")
# Update configuration
mcp_config = get_mcp_config()
settings["mcpServers"]["mcp-sap-gui"] = mcp_config
# Write updated settings atomically
temp_path = settings_path.parent / f"{settings_path.stem}_temp{settings_path.suffix}"
with open(temp_path, 'w', encoding='utf-8') as f:
json.dump(settings, f, indent=2)
# Validate the written JSON
with open(temp_path, 'r', encoding='utf-8') as f:
test_load = json.load(f)
if not validate_json_structure(test_load):
print("Error: Failed to validate written JSON")
os.unlink(temp_path)
sys.exit(1)
# Atomic rename
os.replace(temp_path, settings_path)
print(f"Successfully updated {mode} settings")
except json.JSONDecodeError as e:
print(f"Error: Invalid JSON in settings file: {e}")
sys.exit(1)
except Exception as e:
print(f"Error: Failed to update settings: {e}")
sys.exit(1)
def main():
if len(sys.argv) != 2 or sys.argv[1].lower() not in ["cline", "roo"]:
print("Usage: python integrate.py [cline|roo]")
sys.exit(1)
mode = sys.argv[1].lower()
update_settings(mode)
if __name__ == "__main__":
main()