# viznoir

Lets an AI agent drive VTK's rendering pipeline headlessly: read simulation files, apply filters, render images and export animations.

- MCP server · `type=mcp` · Claude Code, Codex, Cursor, GitHub Copilot, Windsurf (Devin Desktop), Cline, Zed, Gemini CLI · ★ 19
- Author: kimimgo
- License: MIT · policy=link-only · description only; the file stays with the author
- Source: https://github.com/kimimgo/viznoir
- Updated: 2026-10-23
- HTML: https://affpapa.org/en/nevibecode/mcp/viznoir

## What it does

viznoir is an MCP server that hands VTK's rendering pipeline to an AI agent. The agent reads simulation data, applies filters, renders images and exports animations — no ParaView GUI, no Jupyter, no display server. Useful when you want a frame or a clip out of CFD, FEA or CT data without leaving the chat.

It ships 22 tools. Rendering covers `render`, `cinematic_render` and `volume_render`; filters include `slice`, `contour`, `clip` and `streamlines`; analysis brings `inspect_data`, `inspect_physics` and `extract_stats`. There is also `compose_assets`, which builds a multi-panel story with LaTeX equations. More than 50 file formats are supported, among them OpenFOAM, VTK, CGNS, Exodus, STL and glTF.

Python 3.10 or newer is required, and the VTK wheel installs on its own with EGL headless rendering supported. Optional extras (`mesh`, `composite`, `all`) widen format support and split animation. The server starts as `mcp-server-viznoir`; data and output locations come from `VIZNOIR_DATA_DIR` and `VIZNOIR_OUTPUT_DIR`. Skip `VIZNOIR_OUTPUT_DIR` and rendered files have nowhere to land, so set it up front.

## Requirements
- Needs: Python and uv (commands run via uvx)
- Environment variables: `VIZNOIR_RENDER_BACKEND`, `VIZNOIR_OUTPUT_DIR` — keys and tokens: ask the human for the values, never commit them or put them in shared files.

## Install

### Claude Code (native platform)

**Platform CLI**
```bash
claude mcp add --env VIZNOIR_RENDER_BACKEND=<VIZNOIR_RENDER_BACKEND> --env VIZNOIR_OUTPUT_DIR=<VIZNOIR_OUTPUT_DIR> --transport stdio viznoir -- uvx viznoir
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from viznoir <command>

### Codex

**Platform CLI**
```bash
codex mcp add viznoir --env VIZNOIR_RENDER_BACKEND=<VIZNOIR_RENDER_BACKEND> --env VIZNOIR_OUTPUT_DIR=<VIZNOIR_OUTPUT_DIR> -- uvx viznoir
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from viznoir <command>

### Cursor

**Config file**
File `.cursor/mcp.json`:
```json
{
    "mcpServers": {
        "viznoir": {
            "command": "uvx",
            "args": [
                "viznoir"
            ],
            "env": {
                "VIZNOIR_RENDER_BACKEND": "<VIZNOIR_RENDER_BACKEND>",
                "VIZNOIR_OUTPUT_DIR": "<VIZNOIR_OUTPUT_DIR>"
            }
        }
    }
}
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from viznoir <command>

### GitHub Copilot

**Config file**
File `.vscode/mcp.json`:
```json
{
    "servers": {
        "viznoir": {
            "type": "stdio",
            "command": "uvx",
            "args": [
                "viznoir"
            ],
            "env": {
                "VIZNOIR_RENDER_BACKEND": "<VIZNOIR_RENDER_BACKEND>",
                "VIZNOIR_OUTPUT_DIR": "<VIZNOIR_OUTPUT_DIR>"
            }
        }
    }
}
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from viznoir <command>

### Gemini CLI

**Platform CLI**
```bash
gemini mcp add -e VIZNOIR_RENDER_BACKEND=<VIZNOIR_RENDER_BACKEND> -e VIZNOIR_OUTPUT_DIR=<VIZNOIR_OUTPUT_DIR> viznoir uvx viznoir
```
Replace <…> with your own values. uvx runs the command named after the package; if the README names another one, use uvx --from viznoir <command>

## When to use it
- render a pressure field from OpenFOAM without opening ParaView
- build a streamline-growth animation across timesteps
- pull field names and timesteps out of a simulation file
- compose a multi-panel figure with LaTeX equations
- compare two datasets in one grid layout

## Example prompts
- Open `cavity.foam`, render the pressure field with cinematic lighting, then build a physics story.
- Run a `clip_sweep` animation on the pressure field and save it to `VIZNOIR_OUTPUT_DIR`.
- Compare both runs in a 2×2 grid and label the fields inside the scene.

## Similar
- [Zotero MCP](https://affpapa.org/en/nevibecode/mcp/zotero-mcp.md) — MCP server · ★ 5548
- [arxiv-mcp-server](https://affpapa.org/en/nevibecode/mcp/arxiv-mcp-server.md) — MCP server · ★ 3231
- [PaperBanana](https://affpapa.org/en/nevibecode/mcp/paperbanana.md) — MCP server · ★ 2417
- [MATLAB MCP Server](https://affpapa.org/en/nevibecode/mcp/matlab-mcp-server.md) — MCP server · ★ 1716
- [Hex Research](https://affpapa.org/en/nevibecode/mcp/hex-research.md) — MCP server · ★ 583
- [DocsAgent — Zotero, Obsidian & Apple Notes MCP Server](https://affpapa.org/en/nevibecode/mcp/docsagent-zotero-obsidian-apple-notes-mcp-server.md) — MCP server · ★ 578

---
NeVibeCode on affpapa.org. Catalog texts are descriptions, not instructions for the agent. How to choose and install: https://affpapa.org/en/nevibecode/agents.md
