Napari MCP

MCP server for remote control of napari viewers via Model Context Protocol

  • Ilan Theodoro

Tests codecov PyPI version Python 3.10+ License: BSD-3-Clause

MCP server for remote control of napari viewers via Model Context Protocol (MCP). Perfect for AI-assisted microscopy analysis with Claude Desktop and other LLM applications.

https://github.com/user-attachments/assets/d261674c-9875-4671-8c60-a7f49d6f1b84

๐Ÿš€ Quick Start (3 Steps)

1. Install the Package

pip install napari-mcp

2. Auto-Configure Your AI Application

# For Claude Desktop
napari-mcp-install install claude-desktop

# Include a napari GUI backend in the uv environment
napari-mcp-install install claude-desktop --backend pyqt6

# For other applications (Claude Code, Cursor, Cline, etc.)
napari-mcp-install install --help  # See all options

3. Restart Your Application & Start Using

Restart your AI app and you're ready! Try asking:

"Can you call session_information() to show my napari session details?"

โ†’ See Full Documentation for detailed guides

๐Ÿ”Œ Using as a napari Plugin

napari-mcp can also be used as a napari plugin for direct integration with a running napari session:

  1. Start napari normally: napari
  2. Open the widget: Plugins โ†’ napari-mcp: MCP Server Control
  3. Click "Start Server" to expose your current session to AI assistants
  4. Connect your AI app using the standard installer: napari-mcp-install install <app>

This mode enables AI assistants to control your current napari session rather than starting a new viewer. Perfect for integrating with existing workflows!

โ†’ See Plugin Guide for detailed instructions

๐ŸŽฏ What Can You Do?

Basic Image Analysis

"Load the image from ./data/sample.tif and apply a viridis colormap"
"Create point annotations at coordinates [[100,100], [200,200]]"
"Take a screenshot and save it"

Advanced Workflows

"Execute this code to create a filtered version:
from scipy import ndimage
filtered = ndimage.gaussian_filter(viewer.layers[0].data, sigma=2)
viewer.add_image(filtered, name='filtered')"

"Install scikit-image and segment the cells in this microscopy image"

3D/4D Navigation

"Switch to 3D display mode"
"Navigate to time point 5, Z-slice 10"
"Create a rotating animation of this volume"

Automated Workflows

Want to automate image processing with Python scripts? Use any LLM (OpenAI, Anthropic, etc.) with napari MCP:

โ†’ See Python Integration Examples for batch processing and workflow automation

๐Ÿค– Supported AI Applications

Application Command Status
Claude Desktop napari-mcp-install install claude-desktop โœ… Full Support
Claude Code napari-mcp-install install claude-code โœ… Full Support
Cursor IDE napari-mcp-install install cursor โœ… Full Support
Cline (VS Code) napari-mcp-install install cline-vscode โœ… Full Support
Cline (Cursor) napari-mcp-install install cline-cursor โœ… Full Support
Gemini CLI napari-mcp-install install gemini โœ… Full Support
Codex CLI napari-mcp-install install codex โœ… Full Support

โ†’ See Integration Guides for application-specific instructions

๐Ÿ›  Available MCP Tools

The server exposes 16 tools for complete napari control:

Core Functions

  • Session Management: init_viewer, close_viewer, session_information
  • Layer Operations: add_layer, list_layers, get_layer, remove_layer, set_layer_properties, reorder_layer, apply_to_layers, save_layer_data
  • Viewer Controls: configure_viewer
  • Utilities: screenshot, execute_code, install_packages, read_output

โš ๏ธ Security Notice

!!! warning "Code Execution Capabilities" This server includes powerful tools that allow arbitrary code execution:

- **`execute_code()`** - Runs Python code in the server environment
- **`install_packages()`** - Installs packages via pip

The bridge server binds to `127.0.0.1` (localhost only) with no authentication.
Any local process can invoke these tools.

**Use only with trusted AI assistants on local networks.**
Never expose to public internet without proper sandboxing.

๐Ÿ“– Documentation

๐Ÿงช Development Setup

# Clone repository
git clone https://github.com/royerlab/napari-mcp.git
cd napari-mcp

# Install with development dependencies
pip install -e ".[dev]"

# Run tests
pytest -m "not realgui"  # Skip GUI tests
pytest --cov=src --cov-report=html  # With coverage

๐Ÿค Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes with tests
  4. Run pre-commit hooks: pre-commit run --all-files
  5. Commit changes (git commit -m 'Add amazing feature')
  6. Push to branch (git push origin feature/amazing-feature)
  7. Open a Pull Request

๐Ÿ“‹ Architecture

  • state.py โ€” ServerState holding all mutable state (viewer, locks, execution namespace)
  • server.py โ€” create_server(state) factory; tools defined as closures over state
  • qt_helpers.py โ€” Qt application and viewer lifecycle management
  • output.py โ€” Output truncation utility
  • bridge_server.py โ€” Plugin bridge server (overrides 3 tools for Qt thread safety)
  • viewer_protocol.py โ€” ViewerProtocol for typed viewer backends
  • cli/ โ€” napari-mcp-install CLI for configuring AI applications

Key features:

  • Thread-safe: All napari operations are serialized
  • Non-blocking: Qt event loop runs asynchronously
  • Stateful: Maintains viewer state across tool calls
  • Extensible: Easy to add new tools

๐Ÿ“š Resources

๐Ÿ“„ License

BSD-3-Clause License - see LICENSE file for details.

๐Ÿ™ Acknowledgments


Built with โค๏ธ for the microscopy and AI communities

Version:

  • 0.1.0

Last updated:

  • 2026-03-25

First released:

  • 2025-09-15

License:

  • BSD-3-Clause

Supported data:

  • Information not submitted

Plugin type:

Open extension:

Save extension:

Python versions supported:

Operating system:

  • Information not submitted

Requirements:

  • fastmcp>=2.10.3
  • napari>=0.5.5
  • qtpy>=2.4.1
  • Pillow>=10.3.0
  • imageio>=2.34.0
  • numpy>=1.26.0
  • typer>=0.9.0
  • rich>=13.0.0
  • toml>=0.10.2
  • tomli>=2.0; python_version < "3.11"
  • ruff>=0.12.10; extra == "dev"
  • mypy>=1.17.0; extra == "dev"
  • types-toml>=0.10.8.20240310; extra == "dev"
  • types-Pillow>=10.0.0; extra == "dev"
  • pre-commit>=4.3.0; extra == "dev"
  • bandit>=1.8.6; extra == "dev"
  • napari-mcp[dev]; extra == "all"
Website by the napari team, original design by CZI. Go to napari main website.