Debug and analyze Nanostores apps with AI: scan stores, monitor runtime events, and search docs.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Model Context Protocol server for Nanostores β analyze, debug and monitor your nanostores in AI assistants like Claude Desktop.
@nanostores/logger, performance metrics, activity trackingAsk your AI: "Analyze my store architecture" or "Which stores update most frequently?"
Made at Evil Martians, product consulting for developer tools.
Understand your nanostores architecture without running your app:
.subscribe() / .listen() calls and component bindings across React, Vue, Svelte, and Angular<script> and <script setup> blocks in .vue files (requires @vue/compiler-sfc)<script context="module"> and instance <script> blocks, auto-subscriptions ($storeName in templates), and filters out Svelte 5 runes ($state, $derived, $effect, etc.) so they are not mistaken for store references (requires svelte)@nanostores/angular NanostoresService constructor injections and detects this.nanostores.useStore(...) call patterns in TypeScript component filesReal-time insights into your running application:
@nanostores/loggerSearch and browse Nanostores documentation directly from your AI assistant:
nanostores in your node_modules automatically| Requirement | Version |
|---|---|
| Node.js | ^20.0.0 || >=22.0.0 |
Required peer dependency (for static analysis):
Optional peer dependencies β install only if you use the corresponding file format:
| Package | When needed |
|---|---|
@vue/compiler-sfc | Vue SFC (.vue) file scanning |
svelte | Svelte (.svelte) file scanning |
@nanostores/logger | Runtime monitoring (attachMcpLogger) |
Without these optional packages the server still works β it silently skips unsupported file types.
Or run directly without installation:
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Requires GitHub Copilot extension (VS Code 1.99+). Create .vscode/mcp.json in your project:
Tools are available in Copilot's Agent mode (select "Agent" in the Copilot Chat dropdown).
Create .cursor/mcp.json in your project root (or ~/.cursor/mcp.json for global):
Add to your Zed settings.json:
The server appears in Zed's Agent Panel settings.
Add to ~/.codeium/windsurf/mcp_config.json:
You can also open this file from the MCP icon in the Cascade panel β "Configure".
Add via CLI:
Or create .mcp.json in your project root (shared with the team):
| Variable | Default | Description |
|---|---|---|
NANOSTORES_MCP_ROOT | cwd | Project root path |
NANOSTORES_MCP_ROOTS | β | Platform-delimited roots (: on Unix, ; on Windows) for multi-project setup |
WORKSPACE_FOLDER | β | Alias for NANOSTORES_MCP_ROOT β set automatically by VS Code and some editors |
WORKSPACE_FOLDER_PATHS | β | Alias for NANOSTORES_MCP_ROOTS β set automatically by some editors |
NANOSTORES_MCP_LOGGER_ENABLED | true | Set to false or 0 to disable runtime event collection and the logger bridge |
NANOSTORES_MCP_LOGGER_PORT | 3999 | HTTP port for logger bridge |
NANOSTORES_MCP_LOGGER_HOST | 127.0.0.1 | Host to bind. Allowed values: 127.0.0.1, localhost, ::1 |
NANOSTORES_DOCS_ROOT | auto-detect | Path to documentation directory |
NANOSTORES_DOCS_PATTERNS | **/*.md | Comma-separated glob patterns for docs |
The server picks workspace roots in priority order:
NANOSTORES_MCP_ROOTS / NANOSTORES_MCP_ROOT / WORKSPACE_FOLDER_PATHS / WORKSPACE_FOLDERroots/list capability (set automatically by some editors)process.cwd() used as fallback when neither env nor client roots are configuredWhen a tool is called without an explicit projectRoot argument the server uses the first configured root. In a multi-root setup always pass projectRoot to avoid ambiguity.
Works out of the box β just point at your project and ask:
Auto-detected from nanostores in your node_modules:
Requires logger integration in your app. See Runtime Monitoring below.
Run these four tools in order to confirm everything is working:
If nanostores_scan_project returns zero stores, check that NANOSTORES_MCP_ROOT points to the correct project directory.
| Resource | Description |
|---|---|
nanostores://graph | Full dependency graph (text + Mermaid) |
nanostores://store/{key} | Store details by name or id |
nanostores://docs | Documentation index β all pages and tags |
nanostores://docs/page/{id} | Full content of a documentation page |
Static Analysis
| Tool | Description |
|---|---|
nanostores_scan_project | Scan project for all stores, subscribers, and dependencies |
nanostores_store_summary | Detailed summary of a specific store |
nanostores_project_outline | High-level overview: store kinds, top directories, hub stores |
nanostores_store_subgraph | BFS-expanded dependency neighborhood of a store |
nanostores_store_impact | Downstream causal chain β what recomputes/re-renders if X changes |
Runtime Monitoring
| Tool | Description |
|---|---|
nanostores_runtime_overview | Overall health report with statistics for all stores |
nanostores_store_activity | Activity timeline for a specific store (filterable by kind/action) |
nanostores_find_noisy_stores | Identify stores with high change frequency or error rates |
nanostores_runtime_coverage | Compare static graph with runtime events to find coverage gaps |
Documentation
| Tool | Description |
|---|---|
nanostores_docs_search | Search docs by query (full-text), storeKind (atom, map, computed, persistentAtom, etc.), or both. Optional: limit (default 10), tags |
Use nanostores://docs/page/{id} resource to read the full content of pages returned by search.
Utilities
| Tool | Description |
|---|---|
nanostores_ping | Server health check and logger bridge status |
nanostores_clear_cache | Clear project index cache to force rescan |
| Prompt | Parameters | Description |
|---|---|---|
explain-project | focus (optional) | AI-guided explanation of your project's store architecture. focus narrows to a feature/domain (e.g. "cart", "auth") |
explain-store | store_name (required) | Deep dive into a specific store's implementation and usage |
debug-store | store_name (required) | Comprehensive analysis combining static + runtime data |
debug-project-activity | β | Project-wide performance analysis and optimization |
docs-how-to | task (required) | Step-by-step guidance for a Nanostores task, backed by docs (e.g. "How do I sync a map store to localStorage?") |
Most tools accept these optional arguments that significantly change their behavior:
| Argument | Type | Used in | Description |
|---|---|---|---|
storeId | string | store_summary, store_subgraph, store_impact | Exact store identifier β format: store:src/stores.ts#$counterName. Takes priority over name when both are provided. |
name | string | store_summary, store_subgraph, store_impact | Store name (e.g. "$user"). Used when storeId is not provided. |
radius | number (0β10, default 2) | nanostores_store_subgraph | BFS hops around the store. 1 = direct deps only; 2 = deps of deps. Warning: on highly-connected hub stores (hub score > 5) radius β₯ 2 may return most of the project β start with 1. |
projectRoot | string | most tools | Which project root to analyze in multi-root setups. Omit to use the first configured root. Always specify this in multi-root projects. |
windowMs | number | store_activity, find_noisy_stores, runtime_overview | Look-back window in milliseconds (e.g. 60000 = last 60 s). Filters events to that time range. |
kinds | string[] | nanostores_store_activity | Filter events by type. Values: "mount", "unmount", "change", "action-start", "action-end", "action-error". |
actionName | string | nanostores_store_activity | Filter events to a specific action (e.g. "increment"). |
compact | boolean | scan_project, find_noisy_stores, runtime_overview | Return a compressed token-efficient table instead of full text. Useful for large projects to reduce context usage. |
For runtime analysis, integrate the MCP Logger client into your application.
1. Install in your app and enable the logger bridge:
The logger bridge starts automatically β no extra config needed. To disable it, set NANOSTORES_MCP_LOGGER_ENABLED=false in your MCP server config.
2. Define stores with logger attached (src/stores.ts):
3. Use stores normally β events (mount, unmount, change, actions) are captured automatically and batched to the MCP server every second.
4. Ask your AI assistant:
nanostores_find_noisy_storesnanostores_store_activitynanostores_runtime_overviewnanostores_runtime_overview health summary
The overview groups stores into three categories:
action-error events. High error counts indicate failing async actions.nanostores_runtime_coverage
Compares your static store graph against observed runtime events:
| Term | Meaning |
|---|---|
| static-only | Store found by AST scan but no runtime events observed. Possible dead code, deferred initialization, or missing attachMcpLogger call. |
| runtime-only | Events received for a store not found by the scanner. Common for dynamically-created stores, factory patterns, or stores in node_modules. |
| Coverage by kind | E.g. atom: 3/5 (60%) β 3 out of 5 atom stores received runtime events. 0% for a kind usually means attachMcpLogger was not called for those stores. |
nanostores_find_noisy_stores
Returns stores ranked by total activity (changes + actions combined) within the windowMs period. A store is considered "noisy" when its change frequency is disproportionately high relative to visible UI updates β use this to find re-render hotspots or thrashing computed chains.
The runtime logger is designed to stay on your local machine:
127.0.0.1, localhost, or ::1. Binding to 0.0.0.0 is explicitly blocked. Data never leaves your machine.maskEvent to filter or redact events client-side before they are batched and sent:Ask your AI assistant natural language questions:
Static Analysis:
Runtime Debugging:
With Playwright MCP:
Documentation:
Multi-root: same store name in multiple projects
In multi-root mode a store named $user can exist in two different projects. The runtime event store uses a composite key (projectRoot + storeName) to keep them separate, but summary views may show the same name twice with no project label. Always specify projectRoot when querying tools in a multi-root setup to get unambiguous results.
Static analysis only covers discovered files
The AST scanner follows TypeScript/JavaScript imports from your project root. Stores created dynamically at runtime, generated by factories, or living in node_modules will not appear in static results β they may show up as "runtime-only" in coverage reports.
Vue and Svelte parsing requires optional dependencies
If @vue/compiler-sfc or svelte are not installed, .vue / .svelte files are silently skipped during scanning. Install them as dev dependencies if you want full coverage for those file types.
Event ring buffer is capped at 5 000 events
Older events are dropped when the buffer is full. For high-frequency stores use windowMs to narrow your queries to recent data, or lower batchMs in initMcpLogger to deliver events more frequently and reduce the chance of buffer overflow during bursts.
radius on hub stores can be very large
Stores with many dependencies (hub score > 5) can return most of the project graph at radius=2. Start with radius=1 and increase only if you need broader context.
Logger not receiving events:
ping tool to verify logger bridge is enabled and running[nanostores-mcp] warnings about connection issuesNANOSTORES_MCP_LOGGER_PORT) and client URLPort conflicts:
TypeScript errors:
Documentation not found:
nanostores in your node_modulesnanostores is installed: npm install nanostoresNANOSTORES_DOCS_ROOT to point at a docs directory manuallyNanostores ecosystem:
MCP:
MIT
Contributions are welcome! Please open an issue or PR.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/nanostores-mcp)<a href="https://allmcps.com/mcp/nanostores-mcp"><img src="https://allmcps.com/api/badge/nanostores-mcp?style=directory" alt="Nanostores MCP on AllMCPs" /></a>