mcp-visum-integration-fixed.mjsβ’14.9 kB
#!/usr/bin/env node
import { spawn } from 'child_process';
import fs from 'fs';
import path from 'path';
// π§ CONFIGURAZIONE MCP VISUM
const CONFIG = {
PYTHON_PATH: "H:\\Program Files\\PTV Vision\\PTV Visum 2025\\Exe\\Python\\python.exe",
VISUM_EXE: "H:\\Program Files\\PTV Vision\\PTV Visum 2025\\Exe\\Visum250.exe",
PROJECT_FILE: "H:\\go\\italferr2025\\Campoleone\\100625_Versione_base_v0.3_sub_ok_priv.ver"
};
// π οΈ IMPLEMENTAZIONE MCP TOOLS VISUM
class VisumMCPTools {
// β
TOOL 1: visum_launch
static async visum_launch(projectFile = CONFIG.PROJECT_FILE) {
const script = `
if (Test-Path "${CONFIG.VISUM_EXE}") {
if (Test-Path "${projectFile}") {
Write-Host "π Lancio Visum con progetto..."
Start-Process "${CONFIG.VISUM_EXE}" -ArgumentList "${projectFile}"
Start-Sleep -Seconds 3
Write-Host "β
Visum avviato con successo!"
} else {
Write-Host "β File progetto non trovato: ${projectFile}"
}
} else {
Write-Host "β Visum non trovato: ${CONFIG.VISUM_EXE}"
}
`;
return new Promise((resolve) => {
const powershell = spawn('powershell', ['-ExecutionPolicy', 'Bypass', '-Command', script]);
let output = '';
powershell.stdout.on('data', (data) => {
output += data.toString();
console.log(data.toString().trim());
});
powershell.on('close', () => {
resolve({ success: true, output });
});
});
}
// β
TOOL 2: visum_network_analysis
static async visum_network_analysis(analysisType = 'detailed', exportPath = 'C:\\temp\\mcp_analysis') {
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 - ${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 "${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 "${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}")
`;
return new Promise((resolve) => {
const python = spawn('powershell.exe', [
'-Command',
`& "${CONFIG.PYTHON_PATH}" -c @"
${pythonScript}
"@`
]);
let output = '';
python.stdout.on('data', (data) => {
output += data.toString();
console.log(data.toString().trim());
});
python.on('close', () => {
resolve({ success: true, output });
});
});
}
// β
TOOL 3: visum_export_network
static async visum_export_network(elements = ['nodes', 'links'], exportDir = 'C:\\temp\\mcp_export') {
const pythonScript = `
import sys
sys.path.append(r"H:\\Program Files\\PTV Vision\\PTV Visum 2025\\Exe")
import os
try:
import win32com.client
# Connessione a Visum
visum = win32com.client.GetActiveObject("Visum.Visum")
export_dir = "${exportDir}"
if not os.path.exists(export_dir):
os.makedirs(export_dir)
print("π EXPORT MCP NETWORK")
print("=" * 30)
print(f"Directory: {export_dir}")
elements = ${JSON.stringify(elements)}
for element in elements:
try:
if element == "nodes":
file_path = os.path.join(export_dir, "nodes.csv")
visum.Net.Nodes.SaveToFile(file_path)
print(f"β
Nodi β {file_path}")
elif element == "links":
file_path = os.path.join(export_dir, "links.csv")
visum.Net.Links.SaveToFile(file_path)
print(f"β
Link β {file_path}")
elif element == "zones":
file_path = os.path.join(export_dir, "zones.csv")
visum.Net.Zones.SaveToFile(file_path)
print(f"β
Zone β {file_path}")
except Exception as e:
print(f"β Errore export {element}: {e}")
print("\\nπ― Export MCP completato!")
except Exception as e:
print(f"β Errore MCP export: {e}")
`;
return new Promise((resolve) => {
const python = spawn('powershell.exe', [
'-Command',
`& "${CONFIG.PYTHON_PATH}" -c @"
${pythonScript}
"@`
]);
let output = '';
python.stdout.on('data', (data) => {
output += data.toString();
console.log(data.toString().trim());
});
python.on('close', () => {
resolve({ success: true, output });
});
});
}
// β
TOOL 4: visum_python_analysis
static async visum_python_analysis(customScript) {
const fullScript = `
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("π SCRIPT PYTHON MCP PERSONALIZZATO")
print("=" * 35)
# Script utente
${customScript}
print("\\nβ
Script MCP completato!")
except Exception as e:
print(f"β Errore script MCP: {e}")
`;
return new Promise((resolve) => {
const python = spawn('powershell.exe', [
'-Command',
`& "${CONFIG.PYTHON_PATH}" -c @"
${fullScript}
"@`
]);
let output = '';
python.stdout.on('data', (data) => {
output += data.toString();
console.log(data.toString().trim());
});
python.on('close', () => {
resolve({ success: true, output });
});
});
}
// β
TOOL 5: visum_connectivity_stats
static async visum_connectivity_stats() {
return this.visum_python_analysis(`
# Statistiche connettivitΓ
nodes = visum.Net.Nodes.Count
links = visum.Net.Links.Count
if nodes > 0:
connectivity = links / nodes
print(f"π ConnettivitΓ : {connectivity:.2f} (link/nodo)")
# Analisi gradi nodi
degrees = []
for i in range(min(100, nodes)):
try:
node = visum.Net.Nodes.Item(i)
degree = node.GetAttValue("InLinks").Count + node.GetAttValue("OutLinks").Count
degrees.append(degree)
except:
pass
if degrees:
avg_degree = sum(degrees) / len(degrees)
max_degree = max(degrees)
min_degree = min(degrees)
print(f"π Grado medio nodi: {avg_degree:.1f}")
print(f"π Grado massimo: {max_degree}")
print(f"π Grado minimo: {min_degree}")
`);
}
// β
TOOL 6: visum_val_script
static async visum_val_script(valScript) {
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 MCP")
print("=" * 30)
# Esegui script VAL
result = visum.Evaluation.Execute("${valScript}")
print(f"β
VAL script eseguito: {result}")
except Exception as e:
print(f"β Errore VAL MCP: {e}")
`;
return new Promise((resolve) => {
const python = spawn('powershell.exe', [
'-Command',
`& "${CONFIG.PYTHON_PATH}" -c @"
${pythonScript}
"@`
]);
let output = '';
python.stdout.on('data', (data) => {
output += data.toString();
console.log(data.toString().trim());
});
python.on('close', () => {
resolve({ success: true, output });
});
});
}
}
// π― DEMO DEGLI STRUMENTI MCP VISUM
async function demoMCPVisumTools() {
console.log('π€ ESTENSIONE MCP SERVER - STRUMENTI VISUM');
console.log('β'.repeat(50));
console.log('π― Aggiunta di tool specializzati per analisi Visum');
console.log('β'.repeat(50));
console.log('π AVVIO DEMO MCP VISUM TOOLS...\n');
console.log('π― DEMO STRUMENTI MCP VISUM');
console.log('β'.repeat(35));
// Tool 1: Analisi dettagliata rete
console.log('1οΈβ£ ANALISI RETE DETTAGLIATA:');
console.log('π MCP Tool: visum_network_analysis');
console.log(' Type: detailed');
console.log(' Export: C:\\temp\\mcp_analysis');
await VisumMCPTools.visum_network_analysis('detailed', 'C:\\temp\\mcp_analysis');
console.log('\n2οΈβ£ STATISTICHE CONNETTIVITΓ:');
console.log('π MCP Tool: visum_connectivity_stats');
await VisumMCPTools.visum_connectivity_stats();
console.log('\n3οΈβ£ EXPORT ELEMENTI RETE:');
console.log('πΎ MCP Tool: visum_export_network');
console.log(' Elements: nodes, links, zones');
await VisumMCPTools.visum_export_network(['nodes', 'links', 'zones'], 'C:\\temp\\mcp_export');
console.log('\nπ DEMO MCP VISUM TOOLS COMPLETATA!');
console.log('π§ Integrazione MCP Server pronta per Claude');
}
// π SCHEMA MCP TOOLS COMPLETO
const MCP_VISUM_TOOLS_SCHEMA = {
tools: {
visum_launch: {
description: "Lancia Visum con file progetto specificato",
inputSchema: {
type: "object",
properties: {
projectFile: {
type: "string",
description: "Percorso file progetto Visum (.ver)"
}
}
}
},
visum_network_analysis: {
description: "Analisi completa della rete Visum con statistiche dettagliate",
inputSchema: {
type: "object",
properties: {
analysisType: {
type: "string",
enum: ["detailed", "topology", "basic"],
description: "Tipo di analisi da eseguire"
},
exportPath: {
type: "string",
description: "Directory per export risultati"
}
}
}
},
visum_export_network: {
description: "Export elementi rete Visum in formato CSV",
inputSchema: {
type: "object",
properties: {
elements: {
type: "array",
items: {
type: "string",
enum: ["nodes", "links", "zones", "lines", "stops"]
},
description: "Elementi da esportare"
},
exportDir: {
type: "string",
description: "Directory destinazione export"
}
}
}
},
visum_python_analysis: {
description: "Esecuzione script Python personalizzato con accesso alla rete Visum",
inputSchema: {
type: "object",
properties: {
customScript: {
type: "string",
description: "Script Python da eseguire (variabile 'visum' disponibile)"
}
},
required: ["customScript"]
}
},
visum_connectivity_stats: {
description: "Calcola statistiche di connettivitΓ della rete",
inputSchema: {
type: "object",
properties: {}
}
},
visum_val_script: {
description: "Esecuzione script VAL (Visum Analysis Language)",
inputSchema: {
type: "object",
properties: {
valScript: {
type: "string",
description: "Script VAL da eseguire"
}
},
required: ["valScript"]
}
}
}
};
// π CODICE PER ESTENSIONE MCP SERVER
function generateMCPServerExtension() {
return `
// π ESTENSIONE MCP SERVER CON STRUMENTI VISUM
// Aggiungere questo codice al server MCP esistente
// Import delle dipendenze
import { spawn } from 'child_process';
// Configurazione
const VISUM_CONFIG = ${JSON.stringify(CONFIG, null, 2)};
// Implementazione tools
${VisumMCPTools.toString()}
// Registrazione tools nel server MCP
server.addTool(${JSON.stringify(MCP_VISUM_TOOLS_SCHEMA.tools.visum_launch, null, 2)}, async (args) => {
return await VisumMCPTools.visum_launch(args.projectFile);
});
server.addTool(${JSON.stringify(MCP_VISUM_TOOLS_SCHEMA.tools.visum_network_analysis, null, 2)}, async (args) => {
return await VisumMCPTools.visum_network_analysis(args.analysisType, args.exportPath);
});
server.addTool(${JSON.stringify(MCP_VISUM_TOOLS_SCHEMA.tools.visum_export_network, null, 2)}, async (args) => {
return await VisumMCPTools.visum_export_network(args.elements, args.exportDir);
});
server.addTool(${JSON.stringify(MCP_VISUM_TOOLS_SCHEMA.tools.visum_python_analysis, null, 2)}, async (args) => {
return await VisumMCPTools.visum_python_analysis(args.customScript);
});
server.addTool(${JSON.stringify(MCP_VISUM_TOOLS_SCHEMA.tools.visum_connectivity_stats, null, 2)}, async (args) => {
return await VisumMCPTools.visum_connectivity_stats();
});
server.addTool(${JSON.stringify(MCP_VISUM_TOOLS_SCHEMA.tools.visum_val_script, null, 2)}, async (args) => {
return await VisumMCPTools.visum_val_script(args.valScript);
});
`;
}
// π― ESECUZIONE DEMO
if (import.meta.url === `file://${process.argv[1]}`) {
demoMCPVisumTools();
}
export { VisumMCPTools, MCP_VISUM_TOOLS_SCHEMA, generateMCPServerExtension };