Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Prism — Crossdeck

NPM · @CROSS-DECK/AI · 2 COMPONENTS · SCANNED SEP 25

Ask your app anything — revenue, errors, read-cost, growth — and get rendered charts back.

0 this week 77 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 98 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency48
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 80 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability42
  • 0% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Fail
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 4203 tokens (~233/item across 18 items; 16 tools + 2 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management90
  • Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 16 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 18 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
  • Supports UI / widget rendering.Pass
Install

How do I install the Prism — Crossdeck MCP server?

Prism — Crossdeck runs locally as an npm package, launched with npx -y @cross-deck/ai. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @cross-deck/ai

# add to Claude Code
claude mcp add com-cross-deck-prism -- npx -y @cross-deck/ai
// .cursor/mcp.json
{
  "mcpServers": {
    "com-cross-deck-prism": {
      "command": "npx",
      "args": [
        "-y",
        "@cross-deck/ai"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-cross-deck-prism": {
      "command": "npx",
      "args": [
        "-y",
        "@cross-deck/ai"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add com-cross-deck-prism -- npx -y @cross-deck/ai
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-cross-deck-prism": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@cross-deck/ai"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-cross-deck-prism --command npx --arg -y --arg @cross-deck/ai
# ~/.hermes/config.yaml
mcp_servers:
  com-cross-deck-prism:
    command: "npx"
    args: ["-y", "@cross-deck/ai"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-cross-deck-prism": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@cross-deck/ai"
      ]
    }
  }
}
# add to Vellum
assistant mcp add com-cross-deck-prism -t stdio -c npx -a -y @cross-deck/ai
// mcp.json
{
  "mcpServers": {
    "com-cross-deck-prism": {
      "command": "npx",
      "args": [
        "-y",
        "@cross-deck/ai"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 25 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 24 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 23 Sept 26 −3
    • Stability: pass → 0.83 functional
  • 22 Sept 26 +1
    • Stability: 0.97 → pass security
  • 20 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 18 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 16 Sept 26 −3
    • Stability: pass → 0.80 functional
  • 15 Sept 26 +1
    • Stability: 0.97 → pass security
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 25 Sept 2026 · Analysed npm/@cross-deck/ai@0.4.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 98 packages
Packages resolved 98
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 16 exposed · ~3,509 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
draw_user_growth ~173

Render an interactive line chart of unique visitors and page views over time for a host you own, and return the period totals as text. Returns a rendered chart in MCP-Apps-capable hosts (a text summary elsewhere) plus the totals. Use when asked to chart, graph, draw, or visualize growth or traffic for a subdomain. The host must be a verified origin of the project, or the request is rejected.

NameTypeReqDescription
daysinteger–Look-back window in days (1–90, default 30).
hoststringyesThe host to chart, e.g. 'wes.example.com'. Must be a verified origin of the selected app.
projectstring–The app to read (its project id, from list_projects). Required with a workspace key unless set via use_project.

No output schema declared.

No examples provided.

get_acquisition ~201

Answer 'what's my biggest signup source?'. Returns new customers grouped by their TRUE first-touch source — the referrer/utm on their earliest anonymous visit (e.g. chatgpt.com, google), carried forward to the customer at signup, NOT the signup-moment referrer. Counts only, highest-first. Forward-only: coverage.state='not_instrumented' means no signups have been attributed since first-touch tracking shipped, NOT zero signups historically. Use for acquisition-channel and signup-source questions.

NameTypeReqDescription
limitinteger–Max sources to return (1–100, default 25), highest signups first.
projectstring–The app to read, as a project id from list_projects (e.g. 'proj_3a8f137bccdd4f'). With a workspace key (cd_wk_) this is required unless you've set a default via use_project; with a single-app key it…

No output schema declared.

No examples provided.

get_customer ~286

Cross-match one customer across every layer Crossdeck joins by identity. Returns what they pay (monthly cents), their active entitlement count, and their database read-cost — in one view. Identify the person by ANY ONE of the identifiers below; they all resolve to the same canonical customer. Use for 'how much does this user pay and what do they cost us?'. If no customer resolves, returns a no-match result, not an error.

NameTypeReqDescription
anonymousIdstring–A pre-login anonymous/device id captured before the user signed in.
appleOriginalTransactionIdstring–Apple StoreKit originalTransactionId for the customer's purchase.
customerIdstring–A Crossdeck customer id ('cdcust_…').
googlePurchaseTokenstring–Google Play purchase token for the customer's purchase.
projectstring–The app to read, as a project id from list_projects (e.g. 'proj_3a8f137bccdd4f'). With a workspace key (cd_wk_) this is required unless you've set a default via use_project; with a single-app key it…
stripeCustomerIdstring–Stripe customer id ('cus_…').
userIdstring–Your own user id for this person — the value you pass to identify() in the SDK (e.g. 'user_847').

No output schema declared.

No examples provided.

get_customers ~212

The canonical count of an app's customers, sourced from the revenue + identity ledgers — use THIS for 'how many users/customers does this app have', NOT get_read_cost (whose attributedActors is a cost artifact, not a user count). Returns payingCustomers (distinct customers with an active subscription — a real point-read), plus totalCustomers and activePeople. Each is state-tagged in data.coverage.<field>.state: payingCustomers is `measured`; totalCustomers and activePeople are `not_instrumented` today (Crossdeck doesn't maintain those counters yet — the response says so, and null there is NOT zero). Read the coverage state before reporting any of them.

NameTypeReqDescription
projectstring–The app to read, as a project id from list_projects (e.g. 'proj_3a8f137bccdd4f'). With a workspace key (cd_wk_) this is required unless you've set a default via use_project; with a single-app key it…

No output schema declared.

No examples provided.

get_error_affected_users ~235

For one error (by fingerprint), get the PAYING users it actually hit — the row-level moat answer: which paying customer broke, and how much are they worth. Returns a list sorted by revenue at risk (highest first), each row with your own user id, monthly revenue in cents, and when they last hit the error. Joins the error layer to identity and revenue. Returns only your own identifiers — never emails or names you didn't provide. Use when you need the actual customers, not just the counts from get_error_impact.

NameTypeReqDescription
fingerprintstringyesThe error's fingerprint / issue id (e.g. 'a1b2c3').
limitinteger–Max users to return (1–100, default 25), highest revenue-at-risk first.
projectstring–The app to read, as a project id from list_projects (e.g. 'proj_3a8f137bccdd4f'). With a workspace key (cd_wk_) this is required unless you've set a default via use_project; with a single-app key it…

No output schema declared.

No examples provided.

get_error_impact ~192

For one error (by fingerprint/issue id), get its blast radius joined to identity. Returns distinct users affected, how many of those are PAYING customers, and the error's type, status, occurrence count, and first/last-seen timestamps — counts only. Use to size an error's impact. For the NAMED paying users behind the counts (and their revenue at risk), call get_error_affected_users instead.

NameTypeReqDescription
fingerprintstringyesThe error's fingerprint / issue id from the Crossdeck Errors view (e.g. 'a1b2c3').
projectstring–The app to read, as a project id from list_projects (e.g. 'proj_3a8f137bccdd4f'). With a workspace key (cd_wk_) this is required unless you've set a default via use_project; with a single-app key it…

No output schema declared.

No examples provided.

get_host_analytics ~223

Get headless web analytics for one host/subdomain the app owns (e.g. a tenant's subdomain). Returns page views and unique visitors with totals; granularity='day' adds a daily series. The host MUST be a verified origin of the project, or the request is rejected (403). Use for per-tenant or per-subdomain traffic questions.

NameTypeReqDescription
daysinteger–Look-back window in days (1–90, default 30).
granularitystring–'total' (default) for totals only, or 'day' for a daily series.
hoststringyesThe host to read, e.g. 'wes.example.com'. Must be a verified origin of the selected app.
projectstring–The app to read, as a project id from list_projects (e.g. 'proj_3a8f137bccdd4f'). With a workspace key (cd_wk_) this is required unless you've set a default via use_project; with a single-app key it…

No output schema declared.

No examples provided.

get_host_top_pages ~256

Get the top pages or top referrers for one host the app owns, ranked and paginated. Returns rows of { key, views } highest-first, where `key` is a page path (default) or a referrer. Set dimension='top_referrers' for traffic sources. The host must belong to the selected app. Use for 'most-viewed pages on this subdomain' or 'where its traffic comes from'.

NameTypeReqDescription
daysinteger–Look-back window in days (1–90, default 30).
dimensionstring–What to rank: 'top_pages' (default) or 'top_referrers'.
hoststringyesThe host to read, e.g. 'wes.example.com'. Must belong to the selected app.
limitinteger–Max rows to return (1–100, default 25), highest-first.
projectstring–The app to read, as a project id from list_projects (e.g. 'proj_3a8f137bccdd4f'). With a workspace key (cd_wk_) this is required unless you've set a default via use_project; with a single-app key it…

No output schema declared.

No examples provided.

get_portfolio ~113

The coverage manifest — LOAD THIS FIRST (workspace key). For every app it returns which surfaces are instrumented vs a blind spot: coverage.revenue / readCost / analytics / userCensus, each 'measured' or 'not_instrumented'. Use it to interpret every later number: if an app's readCost is 'not_instrumented' here, a blank read-cost for it later is a KNOWN blind spot, not a real zero. Prevents reporting an un-wired surface as fact.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

get_read_cost ~239

Get an app's database read-cost over the last `days` days: total metered reads split into per-user reads vs un-attributed overhead, plus the breakdown by operation. `attributedActors` counts the distinct actor keys the SDK labelled during cost reporting — it INCLUDES background/service actors and is NOT a user or customer count (for that, call get_customers or get_revenue). Server-side reads only (excludes the outbound API + iOS). When an app has no read-cost attribution the fields come back `not_instrumented` (a blind spot), not 0 — check data.coverage.state. Use for 'what's driving our database reads' or 'which operation costs the most'.

NameTypeReqDescription
daysinteger–Look-back window in days (1–90, default 30).
projectstring–The app to read, as a project id from list_projects (e.g. 'proj_3a8f137bccdd4f'). With a workspace key (cd_wk_) this is required unless you've set a default via use_project; with a single-app key it…

No output schema declared.

No examples provided.

get_revenue ~315

Get an app's recurring revenue from its maintained revenue ledger (a point-read, never a scan). Returns MRR in cents, the paying-customer count, and the per-rail split across Stripe, Apple, and Google. With granularity='day' it adds a daily MRR time series (`data.series`, oldest→newest) — pass days to set the window (e.g. days=56 for 8 weeks) and use it to answer 'is my MRR up or down over time', 'MRR history', or any trend question. Use also for 'what's our MRR' or 'how many paying customers'. An app with no payment rail connected returns `not_instrumented` (check data.coverage.state) — that is NOT $0 earned. For a broader customer census (total / active people, not just paying), call get_customers.

NameTypeReqDescription
daysinteger–Only with granularity='day': the trend window in days (1–366, default 90).
granularitystring–How to aggregate: 'total' (default) = the latest snapshot; 'day' = a daily time series across the window.
projectstring–The app to read, as a project id from list_projects (e.g. 'proj_3a8f137bccdd4f'). With a workspace key (cd_wk_) this is required unless you've set a default via use_project; with a single-app key it…

No output schema declared.

No examples provided.

get_revenue_averages ~255

Get an app's revenue AVERAGES from maintained ledgers (point-reads, no scan): ARPU (avg MRR per paying customer) and average lifetime value per paying customer. Lifetime value = combinedLifetimeValueCents (all customers' LTV: active-subscription annualized run-rate + banked one-offs) — it RECONCILES to the dashboard's per-customer LTV and is NOT the same as recognisedCashToDateCents (actual cash banked), which is returned separately. Answers 'average lifetime value per user' and 'what's my ARPU'. Averages are ACROSS THE PAYING BASE — NOT any one customer's pay (use get_customer for one). 'user' = paying customer here; a per-all-users average is not_instrumented. `not_instrumented` when no revenue rail is connected — not $0.

NameTypeReqDescription
projectstring–The app to read, as a project id from list_projects (e.g. 'proj_3a8f137bccdd4f'). With a workspace key (cd_wk_) this is required unless you've set a default via use_project; with a single-app key it…

No output schema declared.

No examples provided.

list_customers_ranked ~323

Pivot the whole customer book by an axis Crossdeck owns and rank it — the cross-layer question no single tool answers: 'which paying customers cost me the most in database reads?'. by='read_cost' ranks by metered reads over the window; by='mrr' ranks by monthly revenue. Filter with segment='paying'|'non_paying'|'all'. Each row carries your own user id, monthly revenue (cents), paying flag, and read-cost — joined by identity. Rows are your own identifiers only, never emails/names. Read-cost that isn't instrumented comes back as coverage.state='not_instrumented' (a blind spot), never a misleading empty ranking. Use for 'who are my most expensive paying users' or 'top customers by revenue'.

NameTypeReqDescription
bystring–Ranking axis: 'read_cost' (metered reads, default) or 'mrr' (monthly revenue).
daysinteger–Read-cost look-back window in days (1–90, default 30).
limitinteger–Rows to return (1–100, default 25), highest-ranked first.
projectstring–The app to read, as a project id from list_projects (e.g. 'proj_3a8f137bccdd4f'). With a workspace key (cd_wk_) this is required unless you've set a default via use_project; with a single-app key it…
segmentstring–Which customers to include (default 'all').

No output schema declared.

No examples provided.

list_projects ~94

List every app (project) in your Crossdeck portfolio that this connector can read — the same set your Pulse dashboard shows. Returns an array of { id, name } per app. Call this FIRST when a workspace key (cd_wk_) is connected, then pass an id to other tools or set a default with use_project. With a single-app key it returns just that one app. Read-only; takes no arguments.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

open_moat_dashboard ~258

Render a customer's cross-layer dashboard — what they pay (monthly), their active entitlements, and their database read-cost, joined by identity — and return the same as a text summary. Returns a rendered dashboard in MCP-Apps-capable hosts (a text summary elsewhere). Identify the customer by ANY ONE of the identifiers below; they all resolve to the same canonical customer. Use when asked to show, open, or visualize a customer's full picture. Returns a no-match result if no customer resolves.

NameTypeReqDescription
anonymousIdstring–A pre-login anonymous/device id captured before sign-in.
appleOriginalTransactionIdstring–Apple StoreKit originalTransactionId for the purchase.
customerIdstring–A Crossdeck customer id ('cdcust_…').
googlePurchaseTokenstring–Google Play purchase token for the purchase.
projectstring–The app to read (its project id, from list_projects). Required with a workspace key unless set via use_project.
stripeCustomerIdstring–Stripe customer id ('cus_…').
userIdstring–Your own user id for this person — the value you pass to identify() (e.g. 'user_847').

No output schema declared.

No examples provided.

use_project ~134

Set the current app for this conversation so later tools default to it without repeating `project`. Behaves as session state: it persists until you call this again and applies to every subsequent tool call. Returns { currentProject } — the project id now in effect. Use when the user says 'switch to <app>' or names an app to focus on; call list_projects first for valid ids. No effect with a single-app key (the project is fixed).

NameTypeReqDescription
projectstringyesThe project id to make current, copied from list_projects (e.g. 'proj_3a8f137bccdd4f').

No output schema declared.

No examples provided.

Common questions

What is the Prism — Crossdeck MCP server?

Prism — Crossdeck is an MCP server listed in the public MCP registry as com.cross-deck/prism. Ask your app anything, revenue, errors, read-cost, growth, and get rendered charts back. This page covers its npm package (@cross-deck/ai).

Is the Prism — Crossdeck MCP server safe to use?

Prism — Crossdeck scores 77 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 25 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Prism — Crossdeck MCP server expose?

Prism — Crossdeck exposes 16 tools: list_projects, get_portfolio, use_project, get_revenue, get_customers, and 11 more. Their descriptions and schemas cost roughly 3,509 tokens of context every time the server is loaded.

Is the Prism — Crossdeck MCP server still maintained?

Prism — Crossdeck is still listed as active in the MCP registry. We last reached this channel on 25 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Prism — Crossdeck MCP server under?

Prism — Crossdeck declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.