priora-portal-mcp
v0.3.0
Published
MCP server that lets Claude keep a client's PRIORA Vault portal (changelog, roadmap, roadmap plans, health, updates, overview metrics) up to date via propose-then-approve writes.
Readme
PRIORA Portal MCP
An MCP server that lets Claude keep one client's PRIORA Vault portal current — changelog, roadmap, health, meeting recaps, and dashboard metrics — without ever writing something 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.
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
.priora-portal.json:{ "apiUrl": "https://vault.priora.io", "clientSlug": "acme-corp" }Replace
acme-corpwith the client's slug from the PRIORA Vault admin.Get a token for this client from your PRIORA admin (minted once, then carried to any machine). Keep it secret.
Create
.mcp.json:{ "mcpServers": { "priora-portal": { "command": "npx", "args": ["-y", "priora-portal-mcp@latest"], "env": { "PRIORA_PORTAL_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 .priora-portal.json and token, so
it can't be accidentally driven against the wrong client.
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_departments— the client's one department list, shared by the roadmap filter and Departmental Health. A roadmapdepartmenthas to be a name from here.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).departmentmust name an existing department;estimatedHourssets the effort estimate the portal totals.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
commit_proposal— apply an approved proposal. The only tool that writes.
Develop
npm install
npm run dev # tsx src/index.ts (stdio)
npm run build # tsc -> dist/
npm publish # builds first via prepublishOnly