EAG MCP Demo
# EAG v3 — MCP demo with Prefab UI
A FastMCP server with three tools that exercise (1) the internet, (2) local-file CRUD, and (3) generative UI via [Prefab](https://prefab.prefect.io). Designed to run inside Claude Desktop.
## Tools
| Tool | Type | Purpose |
|---|---|---|
| `web_search(query)` | internet | DuckDuckGo Instant Answer API — returns abstract + related topics |
| `notes_file(action, key, content)` | local CRUD | one tool, action-dispatched (`create` / `read` / `update` / `delete` / `list`) over `./notes.json` |
| `show_dashboard()` | UI | renders saved notes as a Prefab card grid (uses `@mcp.tool(app=True)`) |
## Setup
Requires `uv` (`brew install uv`) and Claude Desktop.
```bash
cd /Users/nitingangwar/Documents/Code/eagv3/mcp
uv sync
```
### Wire into Claude Desktop
Edit `~/Library/Application Support/Claude/claude_desktop_config.json` and add (or merge) the `mcpServers` block:
```json
{
"mcpServers": {
"eag-mcp-demo": {
"command": "/opt/homebrew/bin/uv",
"args": [
"run",
"--directory",
"/Users/nitingangwar/Documents/Code/eagv3/mcp",
"python",
"server.py"
]
}
}
}
```
Restart Claude Desktop. The MCP indicator should show `eag-mcp-demo` with three tools.
### plain-Python fallback (no uv)
```bash
python3 -m venv .venv
.venv/bin/pip install -e .
```
Then in Claude Desktop config use:
```json
"command": "/Users/nitingangwar/Documents/Code/eagv3/mcp/.venv/bin/python",
"args": ["/Users/nitingangwar/Documents/Code/eagv3/mcp/server.py"]
```
## Demo prompt
Paste this in Claude Desktop after the server is wired up:
> **Find the ownership details of Tata Sons via web search, save a 2–3 sentence summary into my notes file under the key `tata_sons`, then open the dashboard so I can see it.**
Expected behavior:
1. `web_search("Tata Sons ownership")` → DDG abstract.
2. `notes_file("create", "tata_sons", "<summary>")` → writes to `notes.json`.
3. `show_dashboard()` → renders a Prefab card grid inline with one card.
Re-run with another company (e.g. "Reliance Industries") and the dashboard now shows two cards.
## Smoke test
```bash
# Server starts and blocks on stdin (correct):
uv run python server.py
# Or interactive inspector:
npx @modelcontextprotocol/inspector uv run python server.py
```
In the inspector: list tools, call `web_search("Tata Sons")`, then call `notes_file("create", "x", "y")` and confirm `notes.json` updates on disk.
## Fallbacks
- **Prefab renderer doesn't engage** (Claude Desktop returns JSON instead of UI): change the `show_dashboard` decorator from `@mcp.tool(app=True)` to plain `@mcp.tool` and have it return a Markdown table built from `notes.json`.
- **DuckDuckGo returns empty** for the query: DDG only has Instant Answers for well-known entities. Use famous companies / people / places for the demo.
## Files
```
server.py # FastMCP server with the 3 tools
notes.json # backing store for notes_file (starts as {})
pyproject.toml # deps: fastmcp[apps], prefab-ui==0.19.1, httpx
```
TDQS
Scored across 3 tools
The three tools cover completely different areas: local note CRUD (notes_file), visual dashboard (show_dashboard), and external web search (web_search). There is no overlap or ambiguity.
All tool names use snake_case and are descriptive, though the pattern varies slightly (notes_file is a noun, show_dashboard is verb+noun, web_search is noun+verb). Still consistent and readable.
With only 3 tools, the set is small but well-suited for a demo server. Each tool has a clear purpose and none feel redundant. A few more tools might be expected for a full-featured service, but for a demo it's appropriate.
The notes_file tool provides full CRUD and listing, show_dashboard adds visualization, and web_search covers external search. There are no obvious gaps for the stated demo purpose.