Skip to main content
Glama

Visum Thinker MCP Server

MIT License
mcp-visum-integration.mjsβ€’14.6 kB
// ESTENSIONE MCP SERVER - STRUMENTI VISUM // Aggiunge capacitΓ  di analisi di rete Visum al server MCP import { spawn } from 'child_process'; import { readFileSync, writeFileSync } from 'fs'; console.log("πŸ€– ESTENSIONE MCP SERVER - STRUMENTI VISUM"); console.log("═".repeat(50)); console.log("🎯 Aggiunta di tool specializzati per analisi Visum"); console.log("═".repeat(50)); // Simula l'aggiunta di nuovi tool al server MCP const newMCPTools = { visum_launch: { name: "visum_launch", description: "Launch Visum with a specific project file", inputSchema: { type: "object", properties: { projectPath: { type: "string", description: "Path to the Visum project file (.ver)" }, visible: { type: "boolean", description: "Whether to launch Visum visibly", default: true } }, required: ["projectPath"] } }, visum_network_analysis: { name: "visum_network_analysis", description: "Analyze network topology and extract detailed statistics", inputSchema: { type: "object", properties: { analysisType: { type: "string", enum: ["basic", "detailed", "topology", "performance"], description: "Type of analysis to perform" }, exportPath: { type: "string", description: "Directory to export analysis results" } }, required: ["analysisType"] } }, visum_export_network: { name: "visum_export_network", description: "Export network elements (nodes, links, zones) to CSV files", inputSchema: { type: "object", properties: { elements: { type: "array", items: { type: "string", enum: ["nodes", "links", "zones", "linktypes", "volcap"] }, description: "Network elements to export" }, outputDir: { type: "string", description: "Output directory for exported files" }, method: { type: "string", enum: ["python", "val", "gui"], description: "Export method to use", default: "python" } }, required: ["elements", "outputDir"] } }, visum_python_analysis: { name: "visum_python_analysis", description: "Run Python script analysis using Visum's Python environment", inputSchema: { type: "object", properties: { script: { type: "string", description: "Python script code to execute" }, scriptFile: { type: "string", description: "Path to Python script file" } } } }, visum_connectivity_stats: { name: "visum_connectivity_stats", description: "Calculate detailed connectivity and network topology statistics", inputSchema: { type: "object", properties: { includeRouting: { type: "boolean", description: "Include routing analysis", default: false }, includeCapacity: { type: "boolean", description: "Include capacity analysis", default: true } } } }, visum_val_script: { name: "visum_val_script", description: "Execute VAL script for automated Visum operations", inputSchema: { type: "object", properties: { script: { type: "string", description: "VAL script content" }, scriptFile: { type: "string", description: "Path to VAL script file" } } } } }; // Implementazioni simulate dei tool class VisumMCPTools { async visum_launch(args) { console.log(`πŸš€ MCP Tool: visum_launch`); console.log(` Project: ${args.projectPath}`); console.log(` Visible: ${args.visible}`); const script = ` Start-Process "H:\\Program Files\\PTV Vision\\PTV Visum 2025\\Exe\\Visum250.exe" -ArgumentList "${args.projectPath}" -WindowStyle ${args.visible ? 'Normal' : 'Hidden'} `; return new Promise((resolve) => { const powershell = spawn('powershell', ['-ExecutionPolicy', 'Bypass', '-Command', script]); powershell.on('close', (code) => { resolve({ success: code === 0, message: `Visum launched with project ${args.projectPath}`, visible: args.visible }); }); }); } async visum_network_analysis(args) { console.log(`πŸ“Š MCP Tool: visum_network_analysis`); console.log(` Type: ${args.analysisType}`); console.log(` Export: ${args.exportPath || 'memory'}`); // Usa l'ambiente Python di Visum per analisi avanzata const pythonScript = ` import sys sys.path.append(r"H:\\Program Files\\PTV Vision\\PTV Visum 2025\\Exe") try: import win32com.client # Connessione a Visum visum = win32com.client.GetActiveObject("Visum.Visum") print("πŸ” ANALISI RETE MCP - ${args.analysisType.toUpperCase()}") print("=" * 40) # Statistiche base nodes = visum.Net.Nodes.Count links = visum.Net.Links.Count zones = visum.Net.Zones.Count print(f"Nodi: {nodes:,}") print(f"Link: {links:,}") print(f"Zone: {zones:,}") if "${args.analysisType}" == "detailed" and nodes > 0: print("\\nπŸ”— ANALISI DETTAGLIATA:") # Calcola statistiche avanzate total_length = 0 speed_sum = 0 capacity_sum = 0 valid_links = 0 for i in range(min(1000, links)): # Campione per performance try: link = visum.Net.Links.Item(i) length = link.GetAttValue("Length") v0 = link.GetAttValue("V0_PrT") capacity = link.GetAttValue("VolCapPrT") if length > 0: total_length += length valid_links += 1 if v0 > 0: speed_sum += v0 if capacity > 0: capacity_sum += capacity except: pass if valid_links > 0: avg_length = total_length / valid_links avg_speed = speed_sum / valid_links if speed_sum > 0 else 0 total_capacity = capacity_sum print(f"Lunghezza media link: {avg_length:.1f} m") print(f"VelocitΓ  media: {avg_speed:.1f} km/h") print(f"CapacitΓ  totale: {total_capacity:,.0f} veic/h") # DensitΓ  rete density = links / nodes if nodes > 0 else 0 print(f"DensitΓ  rete: {density:.2f} link/nodo") elif "${args.analysisType}" == "topology": print("\\n🌐 ANALISI TOPOLOGIA:") # Analisi connettivitΓ , grafi, ecc. print("Analisi topologica complessa...") print("\\nβœ… Analisi MCP completata!") except Exception as e: print(f"❌ Errore MCP: {e}") `; const pythonPath = "H:\\Program Files\\PTV Vision\\PTV Visum 2025\\Exe\\python.exe"; return new Promise((resolve) => { const python = spawn(pythonPath, ['-c', pythonScript]); let output = ''; python.stdout.on('data', (data) => { output += data.toString(); console.log(data.toString().trim()); }); python.on('close', (code) => { resolve({ success: code === 0, analysisType: args.analysisType, output: output, method: 'python-visum' }); }); }); } async visum_export_network(args) { console.log(`πŸ“€ MCP Tool: visum_export_network`); console.log(` Elements: ${args.elements.join(', ')}`); console.log(` Method: ${args.method}`); console.log(` Output: ${args.outputDir}`); if (args.method === 'python') { // Usa Python di Visum per export const pythonScript = ` import sys, os sys.path.append(r"H:\\Program Files\\PTV Vision\\PTV Visum 2025\\Exe") try: import win32com.client visum = win32com.client.GetActiveObject("Visum.Visum") output_dir = r"${args.outputDir}" os.makedirs(output_dir, exist_ok=True) elements = ${JSON.stringify(args.elements)} for element in elements: print(f"πŸ“Š Export {element}...") if element == "nodes": # Export nodi con attributi filepath = os.path.join(output_dir, "nodes.csv") visum.Net.Nodes.SaveToFile(filepath) elif element == "links": # Export link con attributi filepath = os.path.join(output_dir, "links.csv") visum.Net.Links.SaveToFile(filepath) elif element == "zones": filepath = os.path.join(output_dir, "zones.csv") visum.Net.Zones.SaveToFile(filepath) print(f"βœ… {element} esportato in {filepath}") print("🎯 Export MCP completato!") except Exception as e: print(f"❌ Errore export MCP: {e}") `; const pythonPath = "H:\\Program Files\\PTV Vision\\PTV Visum 2025\\Exe\\python.exe"; return new Promise((resolve) => { const python = spawn(pythonPath, ['-c', pythonScript]); let output = ''; python.stdout.on('data', (data) => { output += data.toString(); console.log(data.toString().trim()); }); python.on('close', (code) => { resolve({ success: code === 0, elements: args.elements, outputDir: args.outputDir, method: args.method, filesCreated: args.elements.map(e => `${e}.csv`) }); }); }); } } async visum_val_script(args) { console.log(`πŸ“œ MCP Tool: visum_val_script`); // Crea script VAL temporaneo const valScript = args.script || readFileSync(args.scriptFile, 'utf8'); const tempScript = `temp_mcp_script_${Date.now()}.val`; writeFileSync(tempScript, valScript); // Esegui tramite COM const pythonScript = ` import sys sys.path.append(r"H:\\Program Files\\PTV Vision\\PTV Visum 2025\\Exe") try: import win32com.client visum = win32com.client.GetActiveObject("Visum.Visum") print("🎯 Esecuzione script VAL via MCP...") visum.RunScript("${tempScript}") print("βœ… Script VAL eseguito!") except Exception as e: print(f"❌ Errore VAL MCP: {e}") `; const pythonPath = "H:\\Program Files\\PTV Vision\\PTV Visum 2025\\Exe\\python.exe"; return new Promise((resolve) => { const python = spawn(pythonPath, ['-c', pythonScript]); let output = ''; python.stdout.on('data', (data) => { output += data.toString(); console.log(data.toString().trim()); }); python.on('close', (code) => { // Pulisci file temporaneo try { require('fs').unlinkSync(tempScript); } catch(e) {} resolve({ success: code === 0, script: valScript.substring(0, 100) + '...', output: output }); }); }); } } // Demo dell'uso dei nuovi tool MCP async function demoMCPVisumTools() { const tools = new VisumMCPTools(); console.log("\n🎯 DEMO STRUMENTI MCP VISUM"); console.log("═".repeat(35)); // 1. Analisi rete console.log("\n1️⃣ ANALISI RETE DETTAGLIATA:"); await tools.visum_network_analysis({ analysisType: "detailed", exportPath: "C:\\temp\\mcp_analysis" }); // 2. Export elementi rete console.log("\n2️⃣ EXPORT ELEMENTI RETE:"); await tools.visum_export_network({ elements: ["nodes", "links", "zones"], outputDir: "C:\\temp\\mcp_export", method: "python" }); // 3. Script VAL console.log("\n3️⃣ SCRIPT VAL:"); await tools.visum_val_script({ script: ` PRINT("Script VAL eseguito da MCP!") PRINT("Nodi: " + STR(CNT_NODES)) PRINT("Link: " + STR(CNT_LINKS)) ` }); } function generateMCPServerExtension() { console.log("\nπŸ“‹ GENERAZIONE ESTENSIONE SERVER MCP"); console.log("═".repeat(40)); const mcpExtension = ` // Estensione server MCP per Visum // Da aggiungere al file src/index.ts // Nuovi tool da registrare server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ ...existingTools, ${JSON.stringify(newMCPTools, null, 6)} ] }; }); // Handler per i nuovi tool server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; switch (name) { case "visum_launch": return await handleVisumLaunch(args); case "visum_network_analysis": return await handleNetworkAnalysis(args); case "visum_export_network": return await handleExportNetwork(args); case "visum_python_analysis": return await handlePythonAnalysis(args); case "visum_connectivity_stats": return await handleConnectivityStats(args); case "visum_val_script": return await handleValScript(args); default: return existingHandler(request); } }); `; writeFileSync('mcp-visum-extension.ts', mcpExtension); console.log("βœ… Estensione MCP creata: mcp-visum-extension.ts"); console.log("\nπŸ’‘ VANTAGGI MCP PER VISUM:"); console.log("1. βœ… Interfaccia unificata per tutti gli strumenti"); console.log("2. βœ… Accesso diretto all'ambiente Python di Visum"); console.log("3. βœ… Automazione completa del workflow"); console.log("4. βœ… Gestione errori centralizzata"); console.log("5. βœ… Tool riutilizzabili per diversi progetti"); console.log("6. βœ… Schema di validazione input automatico"); } async function main() { console.log("\nπŸš€ AVVIO DEMO MCP VISUM TOOLS..."); // Demo dei tool await demoMCPVisumTools(); // Genera estensione server generateMCPServerExtension(); console.log("\n" + "═".repeat(50)); console.log("🎯 MCP VISUM INTEGRATION COMPLETATA!"); console.log("═".repeat(50)); console.log("\nπŸ“‹ RISULTATO:"); console.log("βœ… 6 nuovi tool MCP per Visum"); console.log("βœ… Integrazione Python environment"); console.log("βœ… Export automatico dati rete"); console.log("βœ… Analisi avanzate via COM"); console.log("βœ… Script VAL automatizzati"); console.log("\nπŸŽ‰ ORA CLAUDE PUΓ’ FARE TUTTO VIA MCP!"); } main().catch(console.error);

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/multiluca2020/visum-thinker-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server