vegalite-viewer
README.md
<!-- omit from toc -->
Vega-Lite Viewer MCP Server
===========================
A [Model Context Protocol](https://modelcontextprotocol.com) (MCP) server that enables creating interactive data visualizations using the [Vega-Lite](https://vega.github.io/vega-lite) grammar. Visualizations are rendered directly inside the chat using [MCP Apps](https://modelcontextprotocol.io/docs/extensions/apps) — no browser window required.
- [Usage](#usage)
- [Prerequisites](#prerequisites)
- [Quick Start](#quick-start)
- [CLI Reference](#cli-reference)
- [MCP Tools and Prompt](#mcp-tools-and-prompt)
- [Tools](#tools)
- [Prompt](#prompt)
- [Example Prompts](#example-prompts)
- [Using with MCP Inspector](#using-with-mcp-inspector)
- [Troubleshooting](#troubleshooting)
- [Contributing](#contributing)
Usage
-----
### Prerequisites
This server requires `uv`. Install it via:
```bash
# Windows
winget install --id=astral-sh.uv -e
# macOS
brew install uv
# Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
```
> **macOS note:** The `curl` installer places `uv` in `~/.local/bin/` and updates your shell profile, but macOS GUI apps like Claude Desktop do not load shell startup files. Install via Homebrew to make `uv` visible to GUI apps.
See the [uv installation guide](https://docs.astral.sh/uv/getting-started/installation/) for more options.
### Quick Start
Add the following entry to your Claude Desktop configuration file (accessible via `Settings... > Developer > Edit Config`):
```jsonc
{
"mcpServers": {
"vegalite-viewer": {
"command": "uv",
"args": [
"run",
"--with-editable",
"/path/to/mcp-server-vegalite-viewer",
"mcp-server-vegalite-viewer"
]
}
}
}
```
Restart Claude Desktop to apply changes. The server is ready when `vegalite-viewer` appears in the list of connected MCP servers.
> ℹ️ **Note:** Rendering visualizations inline in the chat requires a client that supports [MCP Apps](https://modelcontextprotocol.io/docs/extensions/apps), such as Claude Desktop or Claude.ai.
### CLI Reference
| Flag | Description |
|------------|--------------------------------------------------------------------------------|
| `--silent` | Show only error messages |
| `--debug` | Enable detailed debug logging (also settable via `VEGALITE_VIEWER_DEBUG=1`) |
### MCP Tools and Prompt
#### Tools
| Tool | Description |
|------------------|--------------------------------------------------------------------------------|
| `upload_data` | Upload a JSON dataset and register it by name for later use in visualizations |
| `visualize_data` | Render a registered dataset as a Vega-Lite chart, displayed inline in the chat |
**Workflow:** call `upload_data` first to register the dataset, then call `visualize_data` with a [Vega-Lite specification](https://vega.github.io/schema/vega-lite/v6.json) to produce the chart. The same dataset can be visualized multiple times with different specs.
#### Prompt
| Prompt | Description |
|-------------------------------------------|-----------------------------------------------------------------------------------------|
| `Create a simple chart for a JSON dataset`| Instructs the LLM to create a chart of a chosen type (`bar`, `line`, `pie`, etc.) for a provided JSON dataset |
### Example Prompts
```text
Create a simple bar chart for the following JSON dataset:
[
{"category": "Alpha", "value": 4},
{"category": "Bravo", "value": 6},
{"category": "Charlie", "value": 10},
{"category": "Delta", "value": 3},
{"category": "Echo", "value": 7},
{"category": "Foxtrot", "value": 9}
]
```
### Using with MCP Inspector
Create an `mcp.json` file:
```jsonc
{
"mcpServers": {
"vegalite-viewer": {
"command": "uv",
"args": [
"run",
"mcp-server-vegalite-viewer",
"--debug"
]
}
}
}
```
Start the inspector from a terminal:
```bash
npx -y @modelcontextprotocol/inspector --config mcp.json --server vegalite-viewer
```
In your browser:
- Click `Connect` to start the server
- Go to `Tools > List Tools` to see the available tools
- Find server logs under `Server Notifications` and in `%TEMP%\mcp_server_vegalite_viewer.log` (Windows) or `${TMPDIR:-/tmp}/mcp_server_vegalite_viewer.log` (Linux/macOS)
### Troubleshooting
**Visualization not rendering inline**
The client must support [MCP Apps](https://modelcontextprotocol.io/docs/extensions/apps). In clients without MCP Apps support the tool still works — the Vega-Lite JSON spec is returned as text, which the LLM can describe or the user can paste into [Vega Editor](https://vega.github.io/editor).
**Server fails to start in Claude Desktop**
Check the Claude Desktop logs:
- **Windows:** `%LOCALAPPDATA%\Claude\Logs\mcp-server-vegalite-viewer.log`
- **macOS:** `~/Library/Logs/Claude/mcp-server-vegalite-viewer.log`
Or go to `Settings > Developer`, select `vegalite-viewer` and click `Open Logs Folder`.
**Still having issues?**
Run the server with `--debug` and open an issue on GitHub with the relevant log output.
Contributing
------------
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, building the React app, code quality checks, and the release process.
TDQS
A4.5/5.0
Scored across 2 tools
Disambiguation5/5
Each tool has a clearly distinct purpose: upload_data registers datasets, while visualize_data renders them. The descriptions explicitly define when to use each, leaving no ambiguity.
Naming Consistency5/5
Both tools follow the same verb_noun pattern (upload_data, visualize_data), which is consistent and predictable.
Tool Count4/5
At 2 tools, the server is slightly under the typical 3-15 range, but the tools form a complete two-step workflow for the narrow purpose of Vega-Lite visualization, so the count is reasonable.
Completeness4/5
The upload-then-visualize flow covers the core workflow, but there are no management operations (e.g., listing or deleting datasets), which are minor gaps that agents can work around by re-uploading with a new name.
Maintenance
ActivityInactive
ResponsivenessNo issues