datacartel-mcp
v0.3.0
Published
MCP server that lets Claude keep a client's Data Cartel portal (changelog, roadmap, roadmap plans, health, updates, overview metrics) up to date via propose-then-approve writes.
Readme
Data Cartel MCP
An MCP server that lets Claude keep one client's Data Cartel portal current: changelog, roadmap, health, meeting recaps, and dashboard metrics. It never writes anything the user hasn't approved.
How it works
Every write is two phases:
- A
propose_*tool validates a draft and returns a preview + token. It writes nothing. - Claude shows the preview to you (via its question UI) and only calls
commit_proposalwith that token after you approve. Or choose Send to Inbox:send_to_inboxstores that same previewed change in the portal's Inbox (Admin, Inbox), where anyone on the data team can publish or dismiss it later. Nothing reaches the business unit until someone publishes it.
The token encodes the exact previewed content, so a commit can only write what you saw. There is no delete capability, and every commit is appended to an audit log in the portal database.
Per-client setup (one directory per client)
No code to clone or build. The server runs directly via npx. Client identity
comes from config + token, never the directory name.
In the client's working directory:
Create
.datacartel.json:{ "apiUrl": "https://acme.datacartel.io", "clientSlug": "sales" }Use your organization's Data Cartel address for
apiUrl, and replacesaleswith the client's slug from the Data Cartel admin.Get a token for this client from your Data Cartel admin (minted once, then carried to any machine). Keep it secret.
Create
.mcp.json:{ "mcpServers": { "datacartel": { "command": "npx", "args": ["-y", "datacartel-mcp@latest"], "env": { "DATACARTEL_TOKEN": "pp_..." } } } }The
@latesttag makes npx re-resolve on each launch, so a published update rolls out with just a Claude Code restart (no cache to clear).Restart Claude Code. Run
portal_statusto confirm the connection.
The server refuses to start without a valid .datacartel.json and token, so
it can't be accidentally driven against the wrong client.
Moving from priora-portal-mcp
This package was previously published as priora-portal-mcp. That name now
belongs to a different product. To move a Data Cartel setup over:
- Rename
.priora-portal.jsonto.datacartel.json. - Rename the
PRIORA_PORTAL_TOKENenv var toDATACARTEL_TOKEN(andPRIORA_PORTAL_CONFIGtoDATACARTEL_CONFIG, if you set it). - In
.mcp.json, changepriora-portal-mcp@latesttodatacartel-mcp@latest.
The old names are recognised only to tell you what to rename. They are never read, so an old config can't send your token to another product's API.
Tools
Read
portal_status— confirm which client you're locked to and that the API is reachable.get_changelog/get_roadmap/get_health/get_updates/get_overview_metrics— read current state before drafting.get_roadmap_plan— read the full Claude scoping plan attached to a roadmap item (get_roadmapshows ahasPlanflag; plans are elided from the list).
Propose (writes nothing; returns a preview + token)
propose_changelog_entry— draft a changelog entry.propose_roadmap_update— draft a roadmap item create/update, or mark one shipped (complete: truealso drafts a linked changelog entry). Schedule it withstartDate/endDate(YYYY-MM-DD) anddatePrecision(day,month,quarter), and mark recurring work withcadence(weekly,monthly,quarterly). Omitted fields are left unchanged;nullclears one.propose_roadmap_plan— attach a Claude scoping plan (Markdown) to an existing roadmap item, with an optional client-visibility toggle.propose_health_update— draft a health check update (stage + five dimensions; status derived automatically).propose_update— draft a meeting recap.propose_overview_metric_update— draft a dashboard metric create/update.
Commit, or defer
commit_proposal— apply an approved proposal. The only tool that writes portal content.send_to_inbox— store an approved-for-review proposal in the Inbox instead of applying it. Publishing from the Inbox applies exactly the previewed content.
Develop
npm install
npm run dev # tsx src/index.ts (stdio)
npm run build # tsc -> dist/
npm publish # builds first via prepublishOnly