viznoir

io.github.kimimgoPublished by GitHub account kimimgov0.10.1Updated Oct 24, 2026

Cinema-quality science visualization for AI agents — headless VTK via MCP.

VerifiedSTDIODesktop onlyData & AnalyticsMedia & Design

Overview

AI-generated overview

Headless VTK-based MCP server that lets an AI assistant read simulation data, filter it, and render cinematic scientific images, animations and story layouts.

What you can do
  • Render scientific data as images, including cinematic, batch and volume renders
  • Apply filters such as slice, contour, clip, streamlines and isosurfaces
  • Inspect datasets, extract statistics and analyze physics, plus probe along lines, surfaces and time series
  • Create animations, including physics-aware presets, and compare or compose multi-panel story, grid, slide and video layouts
  • Export previews and run custom pipelines, writing PNG, WebP, MP4, GLTF and LaTeX output
When to use it
Useful when an assistant needs to turn simulation or 3D scientific data (OpenFOAM, VTK, CGNS, STL and similar) into publication-ready figures, animations or comparison panels without opening ParaView or a Jupyter notebook.
Requirements
Runs locally over stdio as a PyPI package (viznoir) requiring Python 3.10 or newer; VTK is installed automatically and EGL headless rendering is supported. Optional extras add meshio/trimesh and Pillow/matplotlib. Environment variables VIZNOIR_DATA_DIR and VIZNOIR_OUTPUT_DIR point at input data and output; VIZNOIR_RENDER_BACKEND selects gpu, cpu or auto. Desktop only.
Before you install
It reads files from the configured data directory and writes rendered images, animations and videos to the output directory, so point both at folders you are comfortable exposing. Rendering large datasets can be resource-intensive, and the GPU backend depends on local graphics support. No authentication is declared.

Installation

In SourceWeft

  1. Open viznoir in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

viznoir

VTK is all you need. Cinema-quality science visualization for AI agents.

[CI] [PyPI] [Python] [License: MIT] [Mentioned in Awesome VTK]


[Science Storytelling]

One prompt → physics analysis → cinematic renders → LaTeX equations → publication-ready story.


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

bash
pip install viznoir
# With optional extraspip 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

bash
mcp-server-viznoir --help    # server entry pointpython -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.):

json
{  "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:

python
import asynciofrom viznoir.core.runner import VTKRunnerfrom viznoir.tools.inspect import inspect_data_implfrom 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

CategoryTools
Renderingrender · cinematic_render · batch_render · volume_render
Filtersslice · contour · clip · streamlines · pv_isosurface
Analysisinspect_data · inspect_physics · extract_stats · analyze_data
Probingplot_over_line · integrate_surface · probe_timeseries
Animationanimate · split_animate
Comparisoncompare · compose_assets
Exportpreview_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.

[Medical][CFD][Thermal][Geoscience][Automotive]
Medical
CT skull volume
CFD
Combustion streamlines
Thermal
Heatsink gradient
Geoscience
Seismic wavefield
Automotive
DrivAerML · 8.8M cells
[Molecular][Vascular][Planetary][Structural][Volume]
Molecular
H₂O electron density
Vascular
Cerebral aneurysm MRA
Planetary
Bennu · 196K triangles
Structural
Cantilever FEA stress
Volume
Thermal threshold

Physics-Aware Animations

Seven presets convert raw simulation data into publication-ready motion — each binds a rendering primitive to a physical phenomenon.

PresetPhysicsRendering
streamline_growthLagrangian advectionParticle path-line extension over time
clip_sweepPressure gradient cross-sectionMoving clip plane
layer_revealCT density classificationProgressive isosurface stacking
iso_sweepOrbital topologyIsovalue sweep with camera orbit
warp_oscillationStructural mode shapeWarp-by-vector harmonic displacement
light_orbitOblique illuminationRotating key light for material reveal
threshold_revealFeature hierarchyThreshold peeling from outside → in

Story Composition (compose_assets)

[Cavity Story]

Inspect → render → annotate → compose → narrate. One prompt produces a 4-panel physics decomposition with LaTeX-rendered governing equations.

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 tools24 VTK filters
10 domains19 native file formats
6/6 VTK data types50+ 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

Source: README.md at commit e3255c0

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.10.1LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts