Skip to main content

Cross-MCP Workflows

One of the most powerful features of the Math-Physics-ML MCP system is the ability to chain tools across different servers, creating sophisticated computational pipelines.

How It Works​

Each MCP server produces URI references that can be consumed by other servers:

Math MCP          Quantum MCP         Molecular MCP       Neural MCP
───────── ─────────── ───────────── ──────────
array://... → potential://... → trajectory://... → model://...
↘ ↗
└─ shared data ─┘

Workflow Patterns​

Pattern 1: Math → Quantum​

Use Math MCP to create custom potential functions, then simulate quantum dynamics:

# Step 1: Create custom potential with Math MCP
# Double-well potential for quantum tunneling studies
potential_array = math_mcp.create_array(
shape=[512],
fill_type="function",
function="0.01*(x-128)**2*(x-384)**2 - 500"
)
# Returns: array://abc123...

# Step 2: Use in Quantum MCP simulation
potential = quantum_mcp.create_custom_potential(
array_uri="array://abc123...",
grid_size=[512]
)

# Step 3: Create initial state and simulate
psi = quantum_mcp.create_gaussian_wavepacket(
grid_size=[512],
position=[128],
momentum=[0],
width=15
)

simulation = quantum_mcp.solve_schrodinger(
potential=potential["potential_id"],
initial_state=psi,
time_steps=5000,
dt=0.05,
use_gpu=True
)

Pattern 2: Molecular → Math Analysis​

Run molecular simulations, then analyze results with advanced math tools:

# Step 1: Run molecular dynamics simulation
system = molecular_mcp.create_particles(
n_particles=1000,
box_size=[20, 20, 20],
temperature=1.0
)

molecular_mcp.add_potential(
system_id=system["system_id"],
potential_type="lennard_jones"
)

trajectory = molecular_mcp.run_md(
system_id=system["system_id"],
n_steps=100000,
dt=0.002
)

# Step 2: Get trajectory data
data = molecular_mcp.get_trajectory(
trajectory_id=trajectory["trajectory_id"]
)

# Step 3: Perform FFT analysis on velocity autocorrelation
# to extract vibrational frequencies
velocities = data["velocities"]
fft_result = math_mcp.fft(
array=velocities,
use_gpu=True
)

# Step 4: Find peaks in frequency spectrum
peaks = math_mcp.find_roots(
function="derivative of spectrum",
variables=["frequency"],
initial_guess=[0.1]
)

Pattern 3: Neural → Quantum Surrogate​

Train neural networks on quantum simulation data for fast surrogate models:

# Step 1: Generate quantum simulation dataset
training_data = []
for barrier_height in range(5, 50, 5):
potential = quantum_mcp.create_custom_potential(
grid_size=[256],
function=f"{barrier_height}*exp(-(x-128)**2/200)"
)

psi = quantum_mcp.create_gaussian_wavepacket(
grid_size=[256],
position=[64],
momentum=[2.0],
width=10
)

sim = quantum_mcp.solve_schrodinger(
potential=potential["potential_id"],
initial_state=psi,
time_steps=1000,
dt=0.1
)

# Calculate transmission coefficient
result = quantum_mcp.get_simulation_result(sim["simulation_id"])
training_data.append({
"barrier_height": barrier_height,
"transmission": calculate_transmission(result)
})

# Step 2: Train neural network to predict transmission
model = neural_mcp.define_model(
architecture="custom",
num_classes=1 # Regression output
)

# Custom dataset from quantum simulations
experiment = neural_mcp.train_model(
model_id=model["model_id"],
dataset=training_data, # Custom dataset
epochs=100
)

# Step 3: Use trained model for fast predictions
# 1000x faster than full quantum simulation!

Pattern 4: Multi-Scale Simulation​

Combine molecular and quantum simulations for multi-scale physics:

# Quantum region: Electron density calculation
electron_potential = quantum_mcp.create_lattice_potential(
lattice_type="square",
grid_size=[64, 64],
depth=10,
spacing=8
)

electron_sim = quantum_mcp.solve_schrodinger_2d(
potential=electron_potential["potential_id"],
initial_state=initial_wavefunction,
time_steps=500,
dt=0.01
)

# Extract effective potential for classical nuclei
electron_density = quantum_mcp.get_simulation_result(
electron_sim["simulation_id"]
)

# Classical region: Nuclear dynamics with quantum-derived forces
nuclear_system = molecular_mcp.create_particles(
n_particles=100,
box_size=[64, 64, 64],
temperature=300
)

# Add effective potential from quantum calculation
molecular_mcp.add_potential(
system_id=nuclear_system["system_id"],
potential_type="custom",
potential_data=electron_density["effective_potential"]
)

nuclear_trajectory = molecular_mcp.run_nvt(
system_id=nuclear_system["system_id"],
n_steps=10000,
temperature=300
)

Real-World Applications​

Drug Discovery Pipeline​

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│ Math MCP │ │ Molecular │ │ Neural MCP │
│ │ │ MCP │ │ │
│ Generate │────▶│ Simulate │────▶│ Predict │
│ molecular │ │ binding │ │ binding │
│ geometries │ │ dynamics │ │ affinity │
└─────────────┘ └─────────────┘ └─────────────┘

Materials Science​

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│ Quantum MCP │ │ Math MCP │ │ Molecular │
│ │ │ │ │ MCP │
│ Calculate │────▶│ Fit force │────▶│ Large-scale │
│ electronic │ │ field │ │ simulation │
│ structure │ │ parameters │ │ │
└─────────────┘ └─────────────┘ └─────────────┘

Machine Learning for Physics​

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│ Quantum/ │ │ Math MCP │ │ Neural MCP │
│ Molecular │ │ │ │ │
│ Generate │────▶│ Feature │────▶│ Train │
│ training │ │ extraction │ │ surrogate │
│ data │ │ & analysis │ │ model │
└─────────────┘ └─────────────┘ └─────────────┘

Best Practices​

1. Data Format Compatibility​

All MCPs use consistent data formats:

  • Arrays: NumPy-compatible, serialized as JSON lists
  • URIs: type://uuid format for referencing objects
  • Complex numbers: {"real": x, "imag": y} dictionaries

2. Error Propagation​

Handle errors at each step:

# Check each step succeeded before proceeding
potential = quantum_mcp.create_custom_potential(...)
if "error" in potential:
raise RuntimeError(f"Potential creation failed: {potential['error']}")

simulation = quantum_mcp.solve_schrodinger(
potential=potential["potential_id"],
...
)
if "error" in simulation:
raise RuntimeError(f"Simulation failed: {simulation['error']}")

3. Memory Management​

For large workflows, clean up intermediate results:

# Large simulation workflow
for config in configurations:
# Run simulation
result = run_simulation(config)

# Extract only needed data
summary = extract_summary(result)
summaries.append(summary)

# Allow garbage collection of large arrays
del result

# Analyze summaries
final_result = analyze_summaries(summaries)

4. Parallel Execution​

Independent operations can run in parallel:

# These can run simultaneously
import concurrent.futures

with concurrent.futures.ThreadPoolExecutor() as executor:
# Start all simulations
futures = [
executor.submit(quantum_mcp.solve_schrodinger, ...)
for config in configurations
]

# Collect results
results = [f.result() for f in futures]

Example: Complete Physics Pipeline​

Here's a complete example combining all four MCPs:

# Goal: Study quantum effects on molecular diffusion

# 1. MATH MCP: Create analytical potential
potential_expr = math_mcp.symbolic_simplify(
expression="a*exp(-(x-x0)**2/(2*s**2)) + b*sin(k*x)"
)

potential_array = math_mcp.create_array(
shape=[256],
fill_type="function",
function="5*exp(-(x-128)**2/100) + 2*sin(0.1*x)"
)

# 2. QUANTUM MCP: Solve for quantum ground state
potential = quantum_mcp.create_custom_potential(
array_uri=potential_array["array_id"],
grid_size=[256]
)

# Find ground state via imaginary time evolution
ground_state = quantum_mcp.solve_schrodinger(
potential=potential["potential_id"],
initial_state=trial_wavefunction,
time_steps=1000,
dt=-0.1j # Imaginary time
)

# 3. MOLECULAR MCP: Classical dynamics with quantum corrections
system = molecular_mcp.create_particles(
n_particles=500,
box_size=[50, 50, 50],
temperature=1.0
)

# Add quantum-corrected potential
molecular_mcp.add_potential(
system_id=system["system_id"],
potential_type="custom",
quantum_correction=ground_state
)

trajectory = molecular_mcp.run_nvt(
system_id=system["system_id"],
n_steps=500000,
temperature=1.0
)

msd = molecular_mcp.compute_msd(trajectory["trajectory_id"])
diffusion = msd["diffusion_coefficient"]

# 4. NEURAL MCP: Train model to predict diffusion from parameters
training_data = collect_diffusion_data() # Many simulations

model = neural_mcp.define_model(
architecture="custom",
num_classes=1
)

neural_mcp.train_model(
model_id=model["model_id"],
dataset=training_data,
epochs=50
)

# Now predict diffusion 1000x faster!
predicted_D = neural_mcp.predict(model["model_id"], new_params)

This workflow demonstrates the power of combining mathematical analysis, quantum mechanics, classical dynamics, and machine learning in a single unified pipeline.