Skip to main content
Glama
README.md
# VTK API Validation via MCP

Post-generation validation of VTK Python code using Model Context Protocol (MCP).

## Overview

This module provides automatic validation of generated VTK code to catch API hallucinations:

- ✅ **Direct API lookups** - No vector search overhead, exact class/method verification
- ✅ **Method existence validation** - Detects when LLM invents non-existent methods
- ✅ **Import validation** - Verifies VTK classes are imported from correct modules
- ✅ **Fast in-memory index** - Loads ~2,900 VTK classes at startup
- ✅ **Structured error reporting** - Clear error messages with suggestions

---

## Quick Start

### 1. Install the Package

From PyPI (recommended once published):

```bash
pip install vtkapi-mcp
```

For local development we standardize on **uv** to manage the virtualenv and extras:

```bash
uv venv .venv
source .venv/bin/activate
uv sync --extra dev      # runtime + pytest + ruff
```

> **Note:** The 64 MB `data/vtk-python-docs.jsonl` file is required at runtime but is not bundled in the wheel. Place it under `data/` (or pass `--api-docs /path/to/file`) before launching the MCP server.

Prefer automation? `./setup.sh` now wraps the same uv workflow and accepts `--dev` to include the testing toolchain.

### 2. Test MCP Integration (Optional)

```bash
uv run python demo_mcp_integration.py
```

This runs a complete demo showing how to use vtkapi-mcp as an MCP server (not as standalone Python library). It demonstrates all 18 MCP tools and error detection.

### 3. Developer Workflow (uv-native)

| Task | Command |
|------|---------|
| Run unit + integration tests | `uv run pytest` |
| Run tests with coverage report | `uv run pytest --cov=vtkapi_mcp --cov-report=term-missing` |
| Run Ruff lint & format checks | `uv run ruff check` / `uv run ruff format --check` |

> These commands automatically reuse the `.venv` created via `uv venv` / `uv sync`. No manual activation is required.

### 3. Configure MCP Client

Add to your MCP settings (e.g., Claude Desktop config):

```json
{
  "mcpServers": {
    "vtk-api": {
      "command": "python",
      "args": [
        "-m",
        "vtkapi_mcp",
        "--api-docs",
        "/absolute/path/to/vtkapi-mcp/data/vtk-python-docs.jsonl"
      ]
    }
  }
}
```

### 4. Use VTK Tools

The MCP server provides 18 tools for VTK API validation and lookup. See [MCP Tools](#mcp-tools-provided) below.

---

## Project Structure

### Package Organization

```
vtkapi_mcp/
├── core/              # API indexing and data loading
│   └── api_index.py
├── validation/        # Code validation logic
│   ├── models.py
│   ├── validator.py
│   ├── import_validator.py
│   ├── class_validator.py
│   └── method_validator.py
├── server/           # MCP server implementation
│   ├── mcp_server.py
│   └── tools.py
└── utils/            # Utilities for parsing and search
    ├── extraction.py
    └── search.py
```

### Supporting Files

| File | Purpose |
|------|---------|
| `demo_mcp_integration.py` | Demo showing proper MCP integration (not standalone) |
| `pyproject.toml` | Python package configuration and dependencies |
| `README.md` | This file |

### Data

| File | Purpose | Size |
|------|---------|------|
| `data/vtk-python-docs.jsonl` | VTK API documentation (~2,900 classes) | ~64 MB |

---

## Architecture

### VTKAPIIndex (vtkapi_mcp/core/api_index.py)

Fast in-memory index of all VTK classes and methods:

```
VTKAPIIndex
├── Classes Dict: {class_name → {module, methods, docs}}
├── Modules Dict: {module_name → [class_names]}
└── Load Time: <1 second for ~2,900 classes
```

**Key Methods:**
- `get_class_info(class_name)` - Get module and documentation
- `search_classes(query)` - Search by name or keyword
- `get_module_classes(module)` - List classes in module
- `class_exists(class_name)` - Check if class exists

### VTKCodeValidator (vtkapi_mcp/validation/validator.py)

AST-based validation of generated Python code:

```
VTKCodeValidator
├── Parse Code: Uses Python's ast module
├── Extract VTK Usage:
│   ├── Import statements
│   ├── Class instantiations
│   └── Method calls
├── Validate Against Index:
│   ├── Check classes exist
│   ├── Check imports correct
│   └── Check methods exist
└── Generate Error Report
```

**Validation Types:**
1. **Import Validation** - Verifies module paths
2. **Class Validation** - Checks class existence
3. **Method Validation** - Detects hallucinated methods

---

## MCP Tools Provided

When running as MCP server, provides these 18 tools:

### 1. `vtk_get_class_info`
Get complete information about a VTK class.

**Input:**
```json
{
  "class_name": "vtkPolyDataMapper"
}
```

**Output:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "module": "vtkmodules.vtkRenderingCore",
  "content_preview": "vtkPolyDataMapper - map vtkPolyData to graphics primitives..."
}
```

### 2. `vtk_search_classes`
Search for VTK classes by name or keyword.

**Input:**
```json
{
  "query": "reader",
  "limit": 5
}
```

**Output:**
```json
[
  {
    "class_name": "vtkSTLReader",
    "module": "vtkmodules.vtkIOGeometry",
    "description": "Read ASCII or binary stereo lithography files."
  }
]
```

### 5. `vtk_validate_import`
Validate and correct VTK import statements.

**Input:**
```json
{
  "import_statement": "from vtkmodules.vtkCommonDataModel import vtkPolyDataMapper"
}
```

**Output:**
```json
{
  "valid": false,
  "message": "Incorrect module. 'vtkPolyDataMapper' is in 'vtkmodules.vtkRenderingCore'",
  "suggested": "from vtkmodules.vtkRenderingCore import vtkPolyDataMapper"
}
```

### 6. `vtk_get_method_info`
Get full information about a specific method including section context.

**Input:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "method_name": "SetInputData"
}
```

**Output:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "method_name": "SetInputData",
  "content": "SetInputData(vtkDataObject) - Set the input data...",
  "section": "Methods defined here"
}
```

### 7. `vtk_get_method_doc`
Get just the docstring for a specific method.

**Input:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "method_name": "SetInputData"
}
```

**Output:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "method_name": "SetInputData",
  "docstring": "SetInputData(vtkDataObject) - Set the input data...",
  "found": true
}
```

### 8. `vtk_get_class_doc`
Get the class documentation string.

**Input:**
```json
{
  "class_name": "vtkPolyDataMapper"
}
```

**Output:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "class_doc": "vtkPolyDataMapper - map vtkPolyData to graphics primitives. Superclass: vtkMapper",
  "found": true
}
```

### 9. `vtk_get_class_synopsis`
Get a brief synopsis/summary of what a class does.

**Input:**
```json
{
  "class_name": "vtkPolyDataMapper"
}
```

**Output:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "synopsis": "Maps polygonal data (vtkPolyData) to graphics primitives for rendering.",
  "found": true
}
```

### 10. `vtk_get_class_action_phrase`
Get the action phrase describing what a class does.

**Input:**
```json
{
  "class_name": "vtkPolyDataMapper"
}
```

**Output:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "action_phrase": "polygon mapping",
  "found": true
}
```

### 11. `vtk_get_class_role`
Get the functional role/category of a class.

**Input:**
```json
{
  "class_name": "vtkPolyDataMapper"
}
```

**Output:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "role": "rendering",
  "found": true
}
```

### 12. `vtk_get_class_visibility`
Get the visibility/exposure level of a class.

**Input:**
```json
{
  "class_name": "vtkPolyDataMapper"
}
```

**Output:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "visibility": "likely",
  "found": true
}
```

### 13. `vtk_get_module_classes`
List all classes in a specific module.

**Input:**
```json
{
  "module": "vtkmodules.vtkRenderingCore"
}
```

**Output:**
```json
{
  "module": "vtkmodules.vtkRenderingCore",
  "classes": ["vtkActor", "vtkPolyDataMapper", ...],
  "count": 42
}
```

### 14. `vtk_get_class_module`
Return the vtkmodules.* import path for a given VTK class.

**Input:**
```json
{
  "class_name": "vtkPolyDataMapper"
}
```

**Output:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "module": "vtkmodules.vtkRenderingCore",
  "found": true
}
```

### 15. `vtk_get_class_input_datatype`
Get the input data type for a VTK class.

**Input:**
```json
{
  "class_name": "vtkPolyDataMapper"
}
```

**Output:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "input_datatype": "vtkPolyData",
  "found": true
}
```

### 16. `vtk_get_class_output_datatype`
Get the output data type for a VTK class.

**Input:**
```json
{
  "class_name": "vtkContourFilter"
}
```

**Output:**
```json
{
  "class_name": "vtkContourFilter",
  "output_datatype": "vtkPolyData",
  "found": true
}
```

### 17. `vtk_get_class_semantic_methods`
Get semantically tagged methods for a VTK class (input setters, output getters, configuration methods).

**Input:**
```json
{
  "class_name": "vtkContourFilter"
}
```

**Output:**
```json
{
  "class_name": "vtkContourFilter",
  "semantic_methods": {
    "input_setters": ["SetInputData", "SetInputConnection"],
    "output_getters": ["GetOutput", "GetOutputPort"],
    "configuration": ["SetValue", "SetNumberOfContours"]
  },
  "found": true
}
```

### 18. `vtk_is_a_class`
Check if a given name is a valid VTK class.

**Input:**
```json
{
  "class_name": "vtkPolyDataMapper"
}
```

**Output:**
```json
{
  "class_name": "vtkPolyDataMapper",
  "is_vtk_class": true
}
```

---

## Benefits Over RAG Retrieval

| Aspect | RAG Retrieval | MCP Validation |
|--------|---------------|----------------|
| **Speed** | Vector search + reranking | Direct hash lookup (instant) |
| **Accuracy** | Semantic similarity (can drift) | Exact API match (100%) |
| **Coverage** | Top-K only (~10 results) | All ~2,900 classes available |
| **Tokens** | Consumes prompt tokens | Tool calls (minimal cost) |
| **Errors** | Silent hallucinations | Explicit error messages |

---

## Validation Examples

### Example 1: Method Hallucination (CAUGHT ✅)

**Generated Code:**
```python
stencil = vtkImageStencilToImage()
stencil.SetOutputWholeExtent([0, 10, 0, 10, 0, 10])  # ❌ Doesn't exist!
```

**Validation Error:**
```
UNKNOWN_METHOD: Method 'SetOutputWholeExtent' not found on class 'vtkImageStencilToImage'
Suggestion: Did you mean SetOutputOrigin or SetOutputSpacing?
```

### Example 2: Wrong Import Module (CAUGHT ✅)

**Generated Code:**
```python
from vtkmodules.vtkCommonDataModel import vtkPolyDataMapper  # ❌ Wrong module!
```

**Validation Error:**
```
IMPORT_ERROR: 'vtkPolyDataMapper' is not in module 'vtkmodules.vtkCommonDataModel'
Correct import: from vtkmodules.vtkRenderingCore import vtkPolyDataMapper
```

### Example 3: Non-existent Class (CAUGHT ✅)

**Generated Code:**
```python
converter = vtkImageDataToPolyDataConverter()  # ❌ Class doesn't exist!
```

**Validation Error:**
```
UNKNOWN_CLASS: Class 'vtkImageDataToPolyDataConverter' not found in VTK
Suggestion: Did you mean vtkImageDataGeometryFilter?
```

---

## Data Source

**Input:** `data/vtk-python-docs.jsonl`

Each line is a VTK class documentation in JSON format:

```json
{
  "class_name": "vtkPolyDataMapper",
  "module_name": "vtkmodules.vtkRenderingCore",
  "class_doc": "vtkPolyDataMapper - map vtkPolyData to graphics primitives. Superclass: vtkMapper",
  "synopsis": "Maps polygonal data (vtkPolyData) to graphics primitives for rendering.",
  "action_phrase": "polygon mapping",
  "role": "rendering",
  "visibility_score": "likely",
  "input_datatype": "vtkPolyData",
  "output_datatype": "",
  "semantic_methods": { "input_setters": [...], "output_getters": [...] },
  "structured_docs": { "sections": { ... } }
}
```

**Coverage:** ~2,900 VTK classes from VTK Python API

---

## Future Enhancements

- [ ] **Method signature validation** - Check parameter types and counts
- [ ] **Deprecation warnings** - Flag deprecated VTK methods
- [ ] **Pipeline validation** - Verify data flow compatibility
- [ ] **Auto-fix suggestions** - Generate corrected code automatically
- [ ] **Performance profiling** - Track validation overhead
- [ ] **Cache layer** - Cache frequent lookups for speed

---

## License

This is a standalone MCP server for VTK API validation. Extracted from the [vtk-rag](https://github.com/your-username/vtk-rag) project.

---

**Status:** Production ready MCP server for VTK API validation.

TDQS

A3.8/5.0

Scored across 18 tools

Disambiguation5/5

Each tool has a clearly distinct purpose, querying different aspects of VTK classes (e.g., action phrase, doc, methods, module). Overlaps are minimal and well-defined (e.g., three method-query tools differentiate by payload: doc only, doc+signature, signature only).

Naming Consistency5/5

All tools follow a consistent snake_case pattern with 'vtk_' prefix, verb (mostly 'get', plus 'is_a', 'search', 'validate'), and specific resource. Naming is predictable and uniform.

Tool Count5/5

With 18 tools, the set is well-scoped for a reference API server that provides detailed class metadata. Each tool serves a clear need without clutter.

Completeness5/5

The tool surface covers all key aspects of VTK class information: identification, documentation, methods, module path, input/output types, role, visibility, search, import validation, and per-module listing. No obvious gaps for the stated purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues