Getting started with the MCP server¶
pivotkit-mcp lets an AI client build pivot reports for you: "sales by region per quarter as Excel"
becomes a view, checked against your data and written into a file you open. The model sees the
fields of your data (by default names, types and counts, no values) and never reads the data itself.
See the reference for every tool and setting.
Node 22 or later. A client starts the server itself (stdio), or connects to one that runs (HTTP).
1. Your data and a folder for the reports¶
Put the data where the server may read it and make a folder for what it writes:
mkdir -p ~/reports/out
cd ~/reports && npx -y pivotkit-cli example # optional: sample data (sales.csv) from the command line
Any CSV, TSV, JSON or Excel file works. Check what the server would expose before a client connects:
npx -y pivotkit-mcp --source sales=$HOME/reports/sales.csv --output ~/reports/out --check-config
2. Add it to your client¶
claude mcp add pivotkit -- npx -y pivotkit-mcp --source sales=$HOME/reports/sales.csv --output $HOME/reports/out
In claude_desktop_config.json (the app's settings open it):
{ "mcpServers": { "pivotkit": {
"command": "npx",
"args": ["-y", "pivotkit-mcp", "--source", "sales=/Users/you/reports/sales.csv", "--output", "/Users/you/reports/out"] } } }
In .vscode/mcp.json:
{ "servers": { "pivotkit": {
"type": "stdio",
"command": "npx",
"args": ["-y", "pivotkit-mcp", "--source", "sales=${workspaceFolder}/data/sales.csv", "--output", "${workspaceFolder}/reports"] } } }
{ "mcpServers": { "pivotkit": { "command": "npx", "args": ["-y", "pivotkit-mcp", "--config", "/path/to/pivotkit-mcp.json"] } } }
Use absolute paths: a client may start the server in another directory, and create the output
directory first (the server does not). VS Code also reads the newer .mcp.json with mcpServers, as
under "Other clients".
Pin a version for a setup
others rely on (pivotkit-mcp@0.1.0): npx without one takes the newest at each start.
Then ask: "Which sources does pivotkit have?", "Make an Excel report of sales by region per quarter", "Make a link to that report". The server answers with the file's place; when the report uses fields whose values you did not let the model see, it says that it has not seen the content.
3. Choose what the model may see¶
By default every field is summary: name, type and counts. Mark fields whose values may reach the
model as show (the model can then answer questions about them and get small results inline), and
fields it must not know about as hide (dropped when the data is read). In a configuration file:
{
"sources": {
"sales": {
"file": "/Users/you/reports/sales.csv",
"title": "Sales",
"policy": { "fields": { "Region": "show", "Product": "show", "Customer": "hide" } }
}
},
"output": { "dir": "/Users/you/reports/out" }
}
claude mcp add pivotkit -- npx -y pivotkit-mcp --config /Users/you/reports/pivotkit-mcp.json
To let the model open any data file in a folder by path ("file:q3.csv"), add
--allow-dir /Users/you/reports (and --list-files to have it listed). Every file in that folder
can then be read: put only data there that the model may use. Exposure policy.
4. For a team: HTTP¶
export PIVOTKIT_MCP_TOKEN="$(node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))")"
npx -y pivotkit-mcp --config pivotkit-mcp.json --http --auth token
The server listens on http://127.0.0.1:3333/mcp; open http://127.0.0.1:3333/ in a browser for
the quick-start page with the configurations to copy. For other machines, put it behind a reverse
proxy with TLS and give --public-url https://reports.example.com (and --host 0.0.0.0 or the
proxy's network). The reports are written on the server: for people on other machines, serve the
output directory (behind the same sign-in) and set output.baseUrl, so results carry a link
instead of a path on the server. Clients connect with:
claude mcp add --transport http pivotkit https://reports.example.com/mcp --header "Authorization: Bearer <token>"
For sign-in with your identity provider (Authentik, Keycloak, Microsoft Entra ID, any OAuth 2.1 / OpenID Connect provider), see OAuth; scopes then decide who sees which source and may use which tool.
To serve programs too, run pivotkit-server serve --config pivotkit-mcp.json (with
pivotkit-mcp installed beside it) instead: the same /mcp endpoint and the
REST service at /api/v1 on one port, also as a container image.
Its one static token is $PIVOTKIT_TOKEN.
PowerShell Universal¶
PowerShell Universal runs scripts and apps but is no MCP client; it can host the server and its data:
- Data: a scheduled script exports what a source shows into a data folder, written to a temporary name first and then moved, so the server never reads half a file:
$rows = Invoke-Sqlcmd -Query 'SELECT Region, Product, Sales, OrderDate FROM dbo.Sales'
$rows | Export-Csv -Path 'D:\pivotkit\data\sales.tmp' -NoTypeInformation -Encoding utf8
Move-Item -Path 'D:\pivotkit\data\sales.tmp' -Destination 'D:\pivotkit\data\sales.csv' -Force
- Server: run
node <path>\node_modules\pivotkit-mcp\bin\pivotkit-mcp.js --config D:\pivotkit\pivotkit-mcp.json --http --auth tokenas a service that restarts it (a Windows service wrapper, or PowerShell Universal's own way of keeping a process running), withPIVOTKIT_MCP_TOKENfrom a secret. Install it once withnpm install pivotkit-mcp@<version>in that folder (or from a tarball on a machine without internet). - Links: give a source
"link": "https://psu.example.com/reports/sales", the page of the app that shows the report with pivotkit;create_linkthen makes links that open the view there, and the page loads the data with the rights of the person who opens it.
The skill¶
The server teaches the model its workflow through its instructions, the prompt pivotkit_report,
and MCP skills for clients that support them. The same skill is a folder you can install in clients
that read skills:
/plugin marketplace add eizedev/pivotkit
/plugin install pivotkit-mcp@pivotkit
The plugin holds the skill only; add the server with claude mcp add as above.
Copy skills/pivotkit-reports/ from the installed package (node_modules/pivotkit-mcp/skills/)
or from the repository
into your client's skills folder (for Claude Code: ~/.claude/skills/).