openanalyst-mcp-server
Uses DuckDB as the in-process analytical engine to profile, query, and chart CSV, Parquet, JSON, and XLSX data.
Allows attaching MySQL databases read-only and listing their tables for querying and analysis.
Allows attaching PostgreSQL databases read-only and listing their tables for querying and analysis.
Allows attaching SQLite databases read-only and listing their tables for querying and analysis.
Generates Vega-Lite chart specifications and renders them as SVG files or in-conversation charts for data visualization.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@openanalyst-mcp-serverAttach sales.csv, profile it, and show a bar chart of revenue by month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
A real DeepSeek Harness session — the agent attached a CSV, profiled it, and drew these charts as conversation nodes (headless-Chrome capture of the live UI; see the verification record):
Status: M1 + M2 + M3 complete. The dsh plugin is live-verified inside
dsh web 0.1.0-rc.8— the full attach → profile → query → chart chain ran in a real session and both charts rendered as conversation nodes (verification record). The MCP server passes protocol-level tests plus a stdio smoke. See Known limitations.
What it does
data_attach → register a CSV / Parquet / JSON / XLSX file as a queryable table
data_attach_db → attach PostgreSQL / MySQL / SQLite read-only and list its tables
data_profile → types, missing values, exact distinct counts, outliers, quality issues, chart ideas
data_query → one read-only SQL statement, results as lossless JSON
data_chart → bar / line / scatter / histogram / area / heatmap / boxplot — with color
series, stacked/grouped layout, facet small multiples; line & scatter pan/zoom
data_report → a self-contained HTML report (profile + charts as inline SVG); prints to PDF
data_sources → what is currently attachedThe same five tools ship on two hosts from one engine:
Host | Package | Chart delivery |
DeepSeek Harness plugin |
| live conversation node (Vega canvas) |
MCP server (Claude Code / Codex / Cursor / any MCP client) |
| SVG file + full Vega-Lite spec in |
Every tool is also reachable from Code Mode as await tools.data_*(args), so
the agent can chain the whole analysis inside one program instead of spending a
round trip per step.
The workbench — a session-header panel listing this session's data sources, a chart gallery with click-to-scroll, and generated reports:
More in-conversation chart kinds (same theme, exported from a live session):
Related MCP server: chdb-mcp
Install
DeepSeek Harness:
dsh plugin --profile web add openanalystClaude Code (or any MCP client, via stdio):
claude mcp add openanalyst -- npx -y openanalyst-mcp-serverArchitecture
Three decisions shape the codebase.
The engine knows nothing about the harness. @openanalyst/core takes paths
and SQL and returns lossless JSON. It imports no dsh, MCP, or CLI type. That is
what lets the same analysis ship to Claude Code, Codex, and Cursor through an
MCP adapter later without a second implementation — the single largest factor
in whether a plugin reaches an audience beyond one host.
DuckDB does the statistics. SUMMARIZE returns min/max/avg/std/quartiles/
approx_unique/null_percentage for every column in one pass, and reads CSV,
Parquet and JSON directly with full-file type inference. Only IQR outliers,
duplicate-row detection, and the judgement about what is worth flagging are
written by hand.
Charts are Vega-Lite specs carried on session events. The harness tool-card
kinds are a closed set — generic, terminal, diff, search, web — with
no chart member, so a tool result can only ever degrade a chart to text. A real
chart has to come from a conversation node, which the client half registers.
That constraint turned out to pick the chart format too. A conversation node must rebuild its view as a pure function of durable events — no clock, no random, no live state — and the engine prefers whole-value checkpoints over deltas. A Vega-Lite spec with its data inlined is exactly that: one plain JSON value that replays byte-for-byte. Vega-Lite was chosen because it satisfies the replay rule, not because it is a popular chart library.
@openanalyst/core engine, profiling, DB connectors, chart specs (host-agnostic)
├── @openanalyst/report Vega-Lite -> SVG (pure JS) + self-contained HTML reports
├── openanalyst dsh host half: 7 tools + chart event
│ └── ./client dsh browser half: conversation node + Vega canvas
└── openanalyst-mcp-server stdio MCP server: same 7 tools, charts as SVG filesDevelopment
pnpm install
pnpm -r run build
pnpm -r run test74 tests: 46 over the core (SQL policy, JSON conversion, profiling with exact
distinct counts, charts, and live PostgreSQL/MySQL connector tests that
auto-skip without the Docker fixtures), 5 over the report builder, 14 driving
the real dsh plugin tools end to end against DuckDB (including per-agent
isolation), and 9 protocol-level MCP tests over the SDK's in-memory transport
(plus a scripted stdio smoke). Live verification against a running dsh web is scripted in
scripts/mock-llm-scripted.mjs + scripts/verify-live.patch.yml — see
docs/VERIFICATION.md.
Known limitations
These are real and worth reading before building on this.
PTC 模式 (Code Mode) presets reject direct tool calls — the model must wrap them in a
run_codeprogram there. Under the Standard preset the tools are called directly. Verified behavior, documented in docs/VERIFICATION.md.dsh per-agent engines are bounded, not lifecycle-tracked. Each dsh agent session gets its own engine (no alias collisions), but the harness does not notify plugins on agent disposal, so the plugin holds at most 32 engines and evicts the least-recently used — that session transparently re-attaches on its next call.
The client bundle is ~860 kB. Vega is inlined because the harness serves exactly one file per plugin and has no route for sibling chunks, so a chart-free session still pays for it.
data_attachtakes any path the host process can read. There is no workspace fencing yet; it inherits whatever the harness sandbox allows.XLSX depends on DuckDB's
read_xlsx, which may need an extension download on first use. CSV, Parquet and JSON are covered by tests; XLSX is not.
Notes on the dsh npm packages
Two things cost time here and are worth recording for anyone else building a harness plugin:
latestpoints at a broken line.npm view @deepseek-ai/dsh-tools versionreports0.0.1-rc.1, but the current line is0.1.0-rc.8. Several0.0.1-rc.1packages cannot be installed at all —@deepseek-ai/dsh-client-runtime@0.0.1-rc.1depends on@deepseek-ai/dsh-compactand@deepseek-ai/dsh-session@0.0.1-rc.1depends on@deepseek-ai/dsh-type-meta; neither is published. Pin0.1.0-rc.8.pnpm's
minimumReleaseAgepolicy blocks the rc line while it is fresh. This repo lifts it inpnpm-workspace.yaml, with a note to restore it once dsh has a stable release.
Roadmap
M1 | Core + dsh plugin, charts in the conversation — done, live-verified |
M2 | MCP server: same capability in Claude Code / Codex / Cursor — done ← you are here |
M3 | HTML report export (prints to PDF), PostgreSQL / MySQL / SQLite, per-agent isolation — done |
M4 | Workbench panel: data sources, chart gallery with click-to-scroll, report archive — done, live-verified |
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityCmaintenanceAn open-source MCP server that connects to various data sources (SQL databases, CSV, Parquet files), allowing AI models to execute SQL queries and generate data visualizations for analytics and business intelligence.1275MIT
- AlicenseAqualityBmaintenanceAn MCP server for chDB, the in-process SQL OLAP engine powered by ClickHouse. Lets agents query Parquet, CSV, JSON, and pandas DataFrames with one tool — no separate server, no Docker.7Apache 2.0
- AlicenseBqualityAmaintenanceA research-informed MCP server that enables natural language question answering over local dataframes (CSV, Parquet, or Pandas) with safe, read-only execution and typed analysis plans.3MIT
- FlicenseNot gradedqualityCmaintenanceAn MCP server that answers natural-language questions over CSV, Excel, and SQL data by providing deterministic tools for loading, profiling, querying, cleaning, statistical analysis, visualization, and reporting. It enables LLMs to plan and interpret while all computation is done exactly through MCP tools.
Related MCP Connectors
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
GibsonAI MCP server: manage your databases with natural language
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Chenmo0414/openanalyst'
If you have feedback or need assistance with the MCP directory API, please join our Discord server