Universal JSON Agent MCP
<div align="center">
<br />
<img src="https://raw.githubusercontent.com/GautamVhavle/universal-json-agent/main/assets/logo.png" alt="Universal JSON Agent MCP" width="180" />
<br />
# Universal JSON Agent MCP
### Talk to your JSON files using natural language.
**26 powerful tools** to load, explore, query, aggregate, transform, and export โ right from your AI editor.
<br />
[](https://pypi.org/project/universal-json-agent-mcp/)
[](https://pypi.org/project/universal-json-agent-mcp/)
[](https://lobehub.com/mcp/gautamvhavle-universal-json-agent)
[](LICENSE)
[](https://github.com/GautamVhavle/universal-json-agent/actions/workflows/ci.yml)
[]()
<br />
```bash
uv tool install universal-json-agent-mcp
```
<br />
[**Getting Started**](#-getting-started) · [**26 Tools**](#-tools-reference) · [**Web Server**](#-web-server-subproject-web) · [**Development**](#-development)
</div>
---
## Why?
Working with JSON shouldn't require writing a script every time. This tool lets you ask questions in plain English and get answers instantly.
```
You: What's the total budget across all missions?
AI: The total budget across all missions is $18,250,000,000.50
(Used tools: load_json โ sum_values)
```
### Supported Clients
<div align="center">
| <img src="https://cdn.jsdelivr.net/gh/devicons/devicon/icons/vscode/vscode-original.svg" width="28" /> | <img src="https://uxwing.com/wp-content/themes/uxwing/download/brands-and-social-media/claude-ai-icon.png" width="28" /> | <img src="https://www.cursor.com/favicon.ico" width="28" /> | Any MCP Client |
|:---:|:---:|:---:|:---:|
| VS Code / Copilot | Claude Desktop | Cursor | stdio |
</div>
---
## โก Getting Started
### 1. Install
```bash
uv tool install universal-json-agent-mcp # install CLI once
uvx universal-json-agent-mcp # run without installing
uv add universal-json-agent-mcp # add dependency to your project
```
### 2. Configure your editor
<details open>
<summary><b>VS Code / GitHub Copilot</b></summary>
Create `.vscode/mcp.json` in your workspace:
```json
{
"servers": {
"universal-json-agent": {
"type": "stdio",
"command": "universal-json-agent-mcp"
}
}
}
```
> **Tip:** Prefer zero-install? Use `"command": "uvx"` with `"args": ["universal-json-agent-mcp"]` instead.
</details>
<details>
<summary><b>Claude Desktop</b></summary>
Add to `claude_desktop_config.json`:
```json
{
"mcpServers": {
"universal-json-agent": {
"command": "universal-json-agent-mcp"
}
}
}
```
</details>
<details>
<summary><b>Cursor</b></summary>
Add to your Cursor MCP settings:
```json
{
"mcpServers": {
"universal-json-agent": {
"command": "universal-json-agent-mcp"
}
}
}
```
</details>
<details>
<summary><b>CLI / Standalone</b></summary>
```bash
universal-json-agent-mcp
# or
uv run python -m universal_json_agent_mcp
```
Starts on **stdio** โ pipe any MCP client into it.
</details>
### 3. Start asking questions
```
> Load data/orders.json and tell me what's inside
> How many missions have status "in_progress"?
> What's the total budget across all missions?
> Filter personnel where role contains "engineer"
> Sort by priority descending and show codenames
> Export the filtered results to CSV
```
---
## ๐ Tools Reference
### Load & Manage
| Tool | What it does |
|:-----|:-------------|
| `load_json` | Load a JSON file from disk into memory |
| `list_loaded` | List all loaded documents with metadata |
| `unload_json` | Remove a document from memory |
### Explore
| Tool | What it does |
|:-----|:-------------|
| `get_keys` | Get keys of an object or index range of an array |
| `get_value` | Retrieve value at a path (auto-truncated at 10 KB) |
| `get_type` | Return the JSON type at a path |
| `get_structure` | Schema-like skeleton โ keys, types, nesting |
### Query
| Tool | What it does |
|:-----|:-------------|
| `jsonpath_query` | Run JSONPath โ `$.missions[*].codename` |
| `filter_objects` | Filter by condition: `eq`, `gt`, `lt`, `contains`, `regex`โฆ |
| `search_text` | Full-text search across all string values |
### Aggregate
| Tool | What it does |
|:-----|:-------------|
| `count` | Count items in an array or keys in an object |
| `sum_values` | Sum numeric values at a JSONPath |
| `min_max` | Get min and max of numeric values |
| `unique_values` | Distinct values at a JSONPath |
| `value_counts` | Frequency table โ like pandas `value_counts()` |
### Transform
| Tool | What it does |
|:-----|:-------------|
| `flatten` | Flatten nested objects to dot-notation pairs |
| `pick_fields` | Project specific fields from array objects |
| `group_by` | Group objects by a field value |
| `sort_by` | Sort objects by a field |
| `sample` | Random N items from an array |
### Analytics
| Tool | What it does |
|:-----|:-------------|
| `describe` | Stats: count, mean, std, min, max, percentiles |
| `multi_filter` | Compound filters with AND / OR logic |
| `compare` | Diff two values โ added, removed, changed keys |
### Export
| Tool | What it does |
|:-----|:-------------|
| `export_csv` | Export array of objects to CSV file |
| `export_json` | Export a value to a new JSON file |
### Introspect
| Tool | What it does |
|:-----|:-------------|
| `distinct_paths` | List every unique leaf path with types |
---
## ๐ Web Server Subproject (web/)
> Optional **FastAPI + LangChain** web-server subproject inside this repo, wrapping all 26 root MCP tools for integrations, dashboards, or non-MCP workflows.
```bash
uv sync --extra web # install web deps with uv
cp .env.example .env # add your OpenRouter key
uv run python -m web.run --port 8000 # start server with uv
# open docs in browser: http://127.0.0.1:8000/docs
```
### Endpoints
| Method | Endpoint | Description |
|:------:|:---------|:------------|
| `GET` | `/health` | Health check |
| `POST` | `/query` | Upload JSON + ask a question |
| `POST` | `/query/path` | Reference a file on disk + ask a question |
| `GET` | `/docs` | Interactive Swagger UI |
### Example
```bash
curl -X POST http://localhost:8000/query \
-F "file=@data/missions.json" \
-F "query=What's the total budget?"
```
```json
{
"answer": "The total budget across all missions is $18,250,000,000.50",
"steps": [
{"tool": "load_json", "output": "Loaded 'missions' from data/missions.json"},
{"tool": "sum_values", "output": "Sum: 18250000000.5 (from 4 values)"}
]
}
```
### Configuration
| Variable | Required | Default | Description |
|:---------|:--------:|:--------|:------------|
| `OPENROUTER_API_KEY` | โ
| โ | Your [OpenRouter](https://openrouter.ai/) API key |
| `OPENROUTER_MODEL` | โ | `openai/gpt-4o-mini` | Any [supported model](https://openrouter.ai/models) |
---
## ๐งโ๐ป Development
```bash
git clone https://github.com/GautamVhavle/universal-json-agent.git
cd universal-json-agent
uv sync --extra dev
uv run pytest # 503 tests
```
<details>
<summary><b>More test commands</b></summary>
```bash
uv run pytest -v # verbose
uv run pytest tests/test_tools/test_aggregate.py # one file
uv run pytest -k "test_filter" # by pattern
```
</details>
### Releasing
Releases are fully automated via GitHub Actions:
```bash
git tag v0.3.0 -m "v0.3.0"
git push origin v0.3.0
```
Then [create a GitHub Release](https://github.com/GautamVhavle/universal-json-agent/releases/new) for the tag โ CI runs tests, builds, and publishes to PyPI.
---
## Troubleshooting
<details>
<summary><b>MCP server not appearing in Copilot / Claude / Cursor</b></summary>
1. Verify the config file exists (`.vscode/mcp.json` for VS Code)
2. Check the command is on your PATH: `which universal-json-agent-mcp`
3. Restart the editor
</details>
<details>
<summary><b>"No document loaded" errors</b></summary>
You need to load a file first. Ask your AI: *"Load the file data/example.json"* โ this calls `load_json` behind the scenes.
</details>
<details>
<summary><b>Truncated output</b></summary>
Large results are capped at ~10 KB. Use more specific paths, filters, or `pick_fields` to narrow results.
</details>
<details>
<summary><b>429 Too Many Requests (web server)</b></summary>
The model provider is rate-limiting you. Wait a moment or switch to a different model in your `.env` file.
</details>
<details>
<summary><b>Import errors in web server</b></summary>
```bash
uv sync --extra web
```
</details>
---
<div align="center">
[MIT License](LICENSE) ยท Built with โค๏ธ by [Gautam Vhavle](https://github.com/GautamVhavle) ยท Star this repo if it helped you โญ
</div>
TDQS
Scored across 26 tools
Most tools have clear roles, but several pairs overlap significantly: filter_objects is essentially a single-condition subset of multi_filter, unique_values overlaps with value_counts, and jsonpath_query/get_value/get_keys/count all retrieve related path-based information. Descriptions help, but an agent could reasonably choose the wrong tool for filtering or value inspection.
All names use consistent snake_case, and most are action-oriented (filter_objects, sum_values, export_csv, get_structure). A few names are noun phrases (value_counts, unique_values, distinct_paths, jsonpath_query) rather than verb_noun, which is a minor deviation but still predictable.
At 26 tools, the surface is heavy for a JSON analysis server and includes redundant or near-redundant operations such as filter_objects/multi_filter and the multiple aggregation tools. The breadth is plausible for a 'universal' JSON agent, but some consolidation would make the set easier to use.
The server covers loading, inspection, querying, filtering, aggregation, transformation, comparison, and export well. However, it lacks mutation operations such as setting/deleting fields, merging documents, or saving modifications back, which are notable gaps for a universal JSON agent.