viznoir
VTK is all you need. Cinema-quality science visualization for AI agents.
<!-- mcp-name: io.github.kimimgo/viznoir -->
    
<br>
<div align="center">
One prompt β physics analysis β cinematic renders β LaTeX equations β publication-ready story.
</div>
<br>
What it does
An MCP server that gives AI agents full access to VTK's rendering pipeline β no ParaView GUI, no Jupyter notebooks, no display server. Your agent reads simulation data, applies filters, renders cinema-quality images, and exports animations, all headless.
Works with: Claude Code Β· Cursor Β· Windsurf Β· Gemini CLI Β· any MCP client
Quick Start
1. Install
pip install viznoir
# With optional extras
pip install "viznoir[mesh]" # meshio + trimesh (50+ formats)
pip install "viznoir[composite]" # Pillow + matplotlib (split_animate)
pip install "viznoir[all]" # everything
Requires Python β₯3.10. VTK wheel auto-installed (EGL headless rendering supported).
2. Verify
mcp-server-viznoir --help # server entry point
python -c "import viznoir; print(viznoir.__version__)"
3. Use with an MCP client
Add to your MCP client config (claude_desktop_config.json, ~/.cursor/mcp.json, etc.):
{
"mcpServers": {
"viznoir": {
"command": "mcp-server-viznoir",
"env": {
"VIZNOIR_DATA_DIR": "/path/to/your/simulation/data",
"VIZNOIR_OUTPUT_DIR": "/path/to/output"
}
}
}
}
Then ask your AI agent:
"Open cavity.foam, render the pressure field with cinematic lighting, then create a physics decomposition story."
4. Or use as a Python library (advanced)
All tool implementations are importable as async functions. You provide a VTKRunner and await the result:
import asyncio
from viznoir.core.runner import VTKRunner
from viznoir.tools.inspect import inspect_data_impl
from viznoir.tools.render import render_impl
async def main():
runner = VTKRunner()
meta = await inspect_data_impl(file_path="cavity.foam", runner=runner)
print(meta["fields"], meta["timesteps"])
result = await render_impl(
file_path="cavity.foam",
field_name="p",
runner=runner,
colormap="Cool to Warm",
camera="isometric",
width=1920, height=1080,
output_filename="pressure.png",
)
print(result.file_path)
asyncio.run(main())
See docs for the full tool reference.
Capabilities
| Category | Tools | |----------|-------| | Rendering | render Β· cinematic_render Β· batch_render Β· volume_render | | Filters | slice Β· contour Β· clip Β· streamlines Β· pv_isosurface | | Analysis | inspect_data Β· inspect_physics Β· extract_stats Β· analyze_data | | Probing | plot_over_line Β· integrate_surface Β· probe_timeseries | | Animation | animate Β· split_animate | | Comparison | compare Β· compose_assets | | Export | preview_3d Β· execute_pipeline |
22 tools Β· 12 resources Β· 4 prompts Β· 50+ file formats (OpenFOAM, VTK, CGNS, Exodus, STL, glTF, β¦)
Showcase β 10 Domains, One Pipeline
Every frame below is a single MCP tool call. No GUI, no post-processing, no ParaView. Annotations are rendered inside the 3D scene via VTK-native text actors and leader lines β no Photoshop, no matplotlib overlay.
<div align="center">
| | | | | | |:-:|:-:|:-:|:-:|:-:| | !Medical | !CFD | !Thermal | !Geoscience | !Automotive | | Medical <br/> CT skull volume | CFD <br/> Combustion streamlines | Thermal <br/> Heatsink gradient | Geoscience <br/> Seismic wavefield | Automotive <br/> DrivAerML Β· 8.8M cells | | !Molecular | !Vascular | !Planetary | !Structural | !Volume | | Molecular <br/> HβO electron density | Vascular <br/> Cerebral aneurysm MRA | Planetary <br/> Bennu Β· 196K triangles | Structural <br/> Cantilever FEA stress | Volume <br/> Thermal threshold |
</div>
Physics-Aware Animations
Seven presets convert raw simulation data into publication-ready motion β each binds a rendering primitive to a physical phenomenon.
| Preset | Physics | Rendering | |--------|---------|-----------| | streamline_growth | Lagrangian advection | Particle path-line extension over time | | clip_sweep | Pressure gradient cross-section | Moving clip plane | | layer_reveal | CT density classification | Progressive isosurface stacking | | iso_sweep | Orbital topology | Isovalue sweep with camera orbit | | warp_oscillation | Structural mode shape | Warp-by-vector harmonic displacement | | light_orbit | Oblique illumination | Rotating key light for material reveal | | threshold_reveal | Feature hierarchy | Threshold peeling from outside β in |
Story Composition (compose_assets)
<div align="center">
Inspect β render β annotate β compose β narrate. One prompt produces a 4-panel physics decomposition with LaTeX-rendered governing equations.
</div>
Layouts: story (vertical narrative) Β· grid (NΓM comparison) Β· slides (16:9 keynote) Β· video (MP4 with transitions)
Full interactive gallery: https://kimimgo.github.io/viznoir/#showcase
Architecture
prompt "Render pressure from cavity.foam"
β
MCP Server 22 tools Β· 12 resources Β· 4 prompts
β
VTK Engine readers β filters β renderer β camera
β EGL/OSMesa headless Β· cinematic lighting
Physics Layer topology analysis Β· context parsing
β vortex detection Β· stagnation points
Animation 7 physics presets Β· easing Β· timeline
β transitions Β· compositor Β· video export
Output PNG Β· WebP Β· MP4 Β· GLTF Β· LaTeX
Numbers
| | | |---|---| | 22 MCP tools | 24 VTK filters | | 10 domains | 19 native file formats | | 6/6 VTK data types | 50+ formats via meshio |
Documentation
Homepage: kimimgo.github.io/viznoir
Developer docs: kimimgo.github.io/viznoir/docs β full tool reference, domain gallery, architecture guide
License
MIT











