io.github.kvdm-co-pilot/cmp-inspector
NPM · @CREATE-CMP/INSPECTOR · SCANNED OCT 1
Compose Multiplatform UI as structured JSON for agents: trees, tokens, previews, diffs. No pixels.
Available components
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 93 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- 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 5 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability65
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 4291 tokens (~286/item across 15 items; 15 tools + 0 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 15 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 15 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
How do I install the io.github.kvdm-co-pilot/cmp-inspector MCP server?
io.github.kvdm-co-pilot/cmp-inspector runs locally as an npm package, launched with npx -y @create-cmp/inspector. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @create-cmp/inspector
claude mcp add kvdm-co-pilot-cmp-inspector -- npx -y @create-cmp/inspector
{
"mcpServers": {
"kvdm-co-pilot-cmp-inspector": {
"command": "npx",
"args": [
"-y",
"@create-cmp/inspector"
]
}
}
} {
"servers": {
"kvdm-co-pilot-cmp-inspector": {
"command": "npx",
"args": [
"-y",
"@create-cmp/inspector"
]
}
}
} codex mcp add kvdm-co-pilot-cmp-inspector -- npx -y @create-cmp/inspector
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"kvdm-co-pilot-cmp-inspector": {
"type": "local",
"command": [
"npx",
"-y",
"@create-cmp/inspector"
],
"enabled": true
}
}
} openclaw mcp add kvdm-co-pilot-cmp-inspector --command npx --arg -y --arg @create-cmp/inspector
mcp_servers:
kvdm-co-pilot-cmp-inspector:
command: "npx"
args: ["-y", "@create-cmp/inspector"] {
"McpServers": {
"kvdm-co-pilot-cmp-inspector": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"@create-cmp/inspector"
]
}
}
} assistant mcp add kvdm-co-pilot-cmp-inspector -t stdio -c npx -a -y @create-cmp/inspector
{
"mcpServers": {
"kvdm-co-pilot-cmp-inspector": {
"command": "npx",
"args": [
"-y",
"@create-cmp/inspector"
]
}
}
} 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.
- 1 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 29 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Sept 26 −3
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 27 Sept 26 0
- Stability: 0.97 → pass security
- 26 Sept 26 +1
- Package version: 0.6.2 → 0.9.1 functional
- 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 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 22 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
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 1 Oct 2026 · Analysed npm/@create-cmp/inspector@0.9.1
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 93 packages
| Packages resolved | 93 |
|---|---|
| Stale | 31 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
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 →
approval_status Governed-artifact approval status — optionally WAIT for a decision ~332
The human-approval half of the console (VERIFICATION-LAYER-DESIGN.md §4): every governed artifact's live status (design system, architecture+structure, exemplar feature, exemplar spec, per-feature specs — the same §1 ordered walk the Approvals tab shows), via the PROJECT'S OWN qa/lib/approvals.mjs (never forked here). Structure only — no HTML; the tab is for the human, this tool is for you. Without waitForDecision: the current snapshot {available, statuses:[{id,label,status,hash,storedHash,approvedAt,fileCount,missing,resolvable}]}. With waitForDecision:true: BLOCKS — same shape as preview_status's waitForRender — until ANY governed artifact's status changes (a console Approve click, or `node qa/approve.mjs <artifact>` run in a terminal), then returns {timedOut, available, changed:[artifactIds], statuses}. {available:false} in a project with no approvals library (an older, pre-approvals-wave scaffold) — resolves immediately, there is nothing to wait for. Typical use: propose a change, tell the human to review it in the console, then approval_status{waitForDecision:true} instead of polling. Requires a running preview service (call preview{projectDir} first) — that's where the project root comes from.
| Name | Type | Req | Description |
|---|---|---|---|
| timeoutMs | integer | – | waitForDecision timeout (default 120000; result carries timedOut:true on expiry). |
| waitForDecision | boolean | – | Block until any governed artifact's approval status changes instead of returning immediately. |
No output schema declared.
No examples provided.
connect_live Connect to a running app's live inspector (self-healing) ~458
Tier 1 handshake, SELF-HEALING: ensures a device/emulator is attached, ensures the `adb forward tcp:<port> tcp:<port>` exists (creating it — the debug-only inspector server binds loopback on the device), then GETs /inspect/health. If health is dead it LAUNCHES the debug app (applicationId parsed from the project — composeApp/build.gradle.kts / create-cmp.json — never hardcoded; pass `projectDir` when the server's cwd is not the app repo, or `appId` to skip resolution) and re-polls with bounded backoff. On a `device offline`-class adb error (a stale adb server transport — the client says offline while `adb devices` says device) it resets the adb server (kill-server / start-server / wait-for-device) once and retries the whole sequence once. {relaunch:true} forces a VERIFIED restart from a known state (adb force-stop → optional `pm clear` via clearState → launch → health's processStartedAtMs proven to move forward). Every failure names the stage that failed and the one command to run next — never a bare timeout. On success, sets the session default source to {kind:'live', port} so subsequent tool calls can omit `source`; the result's `healed` lists what it had to fix (app-launched, adb-transport-reset, relaunched). Requires a create-cmp DEBUG build installed on the device (the inspector is structurally absent from release builds). This tool never starts emulators.
| Name | Type | Req | Description |
|---|---|---|---|
| appId | string | – | Explicit applicationId (skips resolution from the project). |
| clearState | boolean | – | With relaunch: also `pm clear` — pristine app data (Room DBs, prefs, first-run state). |
| port | integer | – | Inspector port (default 9500). |
| projectDir | string | – | App repo root, for applicationId resolution when the app must be launched (default: cwd). |
| relaunch | boolean | – | Force a verified relaunch (force-stop + launch, proven by processStartedAtMs advancing). |
| serial | string | – | adb device serial (when several devices are attached). |
No output schema declared.
No examples provided.
db_query Read rows from one SQLite table (read-only, bounded) ~186
GET /inspect/db?table=<name>&limit=<n> on the running app — assert PERSISTED state in the live tier. `table` must be a real table name (the app's Room schema JSONs and @Entity classes are in-repo) — the device validates it strictly against `sqlite_master` before ever touching a query, so an unknown name 404s rather than running arbitrary SQL. Rows are capped by `limit` (device-side default/max apply regardless of what's requested). Returns { table, columns, rows, rowCount }. Requires connect_live.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Row cap (device-side default/max still apply). |
| port | integer | – | Inspector port (default: the connect_live session port, else 9500). |
| table | string | yes | Exact table name (see the app's Room schema JSONs / @Entity classes). |
No output schema declared.
No examples provided.
inspect_tree Inspect Compose tree ~451
Load the enriched Compose semantics tree (hierarchy + geometry + resolved design tokens) as JSON, plus a compact summary { nodeCount, taggedCount, tokenizedCount }. With source {kind:'live'} this reads the RUNNING app's current screen (real data + nav state) on every call. Options: `testTag` returns only that node's subtree; format:'wireframe' returns the (sub)tree as a deterministic SVG wireframe instead of raw JSON (footprint nodes as rects, tokenized nodes highlighted with a resolved-values chip, clickable nodes with a distinct outline, testTags as mono labels — SVG is structured text, safe for model context; a11yOverlay:true marks accessibility violations, `out` also writes the file); includeLayoutGaps:true adds `layoutGaps` — the spacing between each pair of consecutive TAGGED siblings ({parentPath, a, b, gaps:{gapX,gapY,dxLeft,dyTop}}).
| Name | Type | Req | Description |
|---|---|---|---|
| a11yOverlay | boolean | – | wireframe only: overlay accessibility-audit violations in a danger style. |
| format | string | – | Default 'json'. 'wireframe' renders the (sub)tree as a deterministic SVG wireframe. |
| includeLayoutGaps | boolean | – | Add `layoutGaps`: spacing between consecutive tagged siblings, tree-wide. |
| maxDepth | integer | – | wireframe only: only draw nodes up to this depth (root = 0). |
| out | string | – | wireframe only: also write the SVG to this path. |
| scale | number | – | wireframe only: explicit px scale (default fits width to ~740). |
| source | – | – | Where the tree comes from. Omit to use (in order): legacy treePath, the connect_live session default, $CMP_INSPECTOR_LIVE (host:port), $CMP_INSPECTOR_TREE (file). |
| testTag | string | – | Return only the subtree rooted at the node with this testTag. |
| treePath | string | – | LEGACY (kept for compatibility): path to a tree JSON produced by the inspector harness. Prefer `source`. Defaults to $CMP_INSPECTOR_TREE. |
No output schema declared.
No examples provided.
navigate_and_inspect Tap the running app and re-inspect (the navigation primitive) ~313
Drive the LIVE app one tap at a time, no pixels needed: resolves the tap point from the live tree (center of `testTag`'s bounds — or pass explicit root-relative `x`/`y` read from bounds), delivers it via the inspector's POST /inspect/tap (HTTP, not adb), waits `settleMs` for the UI to settle, then re-fetches the tree. Returns { tapped:{x,y,testTag?}, before:{tags,textSample,nodeCount}, after:{tags,textSample,nodeCount}, changed, route? } — assert the navigation structurally (old screen's tags gone, new content present). `route:{before,after}` (each a currentRoute string) is included ONLY when the running app exposes GET /inspect/nav — omitted entirely for older apps that predate it, never reported as null/failed. Requires connect_live (or a reachable forward).
| Name | Type | Req | Description |
|---|---|---|---|
| port | integer | – | Inspector port (default: the connect_live session port, else 9500). |
| settleMs | integer | – | How long to wait after the tap before re-fetching the tree (default 1500ms). |
| testTag | string | – | Tap the center of this node's bounds (resolved from the live tree). |
| x | number | – | Explicit tap x in root-relative px (with `y`, instead of testTag). |
| y | number | – | Explicit tap y in root-relative px (with `x`, instead of testTag). |
No output schema declared.
No examples provided.
preview Start the live preview gallery (watch + render + serve) ~372
AI-native previews of a create-cmp app's REAL screens with NO device, emulator, or manual Gradle: starts (or reuses) a resident service that renders every screen in inspector/PreviewRegistry.kt headlessly, serves a LIVE gallery for the human at a local URL (pixels + wireframe + a11y per screen; the page reloads itself via SSE after every re-render), and watches composeApp/src so every save re-renders automatically. Returns { url, screens:[{id, nodes, tokenized, tagged, a11yPass, tree, png}], version, changedLastRender } — give the human the url (open it for them if you can); assert on the returned structure or the per-screen tree paths yourself. After edits use preview_status { waitForRender: true } (blocks until the render/compile outcome) and preview_diff { screen } (one-call verified change). The console runs as a detached RESIDENT process (it survives this session; reconnecting the MCP adopts it), and is auto-ensured at session start inside a create-cmp app; preview_stop stops it only if this session started it. First render includes a Gradle compile (tens of seconds); subsequent saves re-render warm in a few seconds.
| Name | Type | Req | Description |
|---|---|---|---|
| hot | boolean | – | Phase 2 (default true): boot the resident preview daemon under Compose Hot Reload (hotRunDesktop --mainClass=<pkg>.inspector.PreviewDaemonKt --auto) so warm saves re-render in seconds; falls back to… |
| port | integer | – | First port to try for the gallery server (default 9600, probes upward). |
| projectDir | string | yes | Root of the create-cmp app (the directory containing composeApp/). |
No output schema declared.
No examples provided.
preview_diff Diff a screen across the last two renders (one-call verified edit) ~214
The verified dev loop with ZERO bookkeeping: the preview service already retains the previous generation of every screen's tree, so this diffs a screen's LAST render against its CURRENT one — no pre-edit snapshot needed. Returns { changes, regressions:{drift, driftChecked, a11y}, verdict: 'proven-clean' | 'changed-with-regressions' | 'no-change' } (drift is checked against the previews dir's design-system.json when present). Typical loop: edit → preview_status{waitForRender:true} → preview_diff{screen:<a changed id>}. For a baseline that must survive sessions, the lane's golden trees (qa/golden/, UPDATE_GOLDEN=1) are the durable regression layer.
| Name | Type | Req | Description |
|---|---|---|---|
| minTouchTargetPx | number | – | a11y touch-target minimum (default 48). |
| screen | string | yes | Registry screen id (see preview_status screens[].id). |
| tolerancePx | number | – | Bounds-move tolerance in px (default 1). |
No output schema declared.
No examples provided.
preview_status Preview status — optionally WAIT for the next render ~307
The agent's post-edit feedback call. Without arguments: returns the preview service's current status (mode, version, rendering, lastError/lastErrorSource, lastActivity, changedLastRender, per-screen summaries incl. lastChangedVersion, and `renderer` — the render PIPELINE's own health: {lastOutcome:'ok'|'failed'|'never', lastSuccessAt, lastAttemptAt, consecutiveFailures}, tracked independently of lastError so a later, unrelated compile message can never mask a dead renderer. renderer.lastOutcome:'failed' means every render since lastSuccessAt has failed outright (Gradle/daemon call itself threw) — the screens below are stale pixels, not a fresh 'no changes' result; this is different from lastErrorSource:'compile' (the user's edit didn't build). With waitForRender:true it BLOCKS until the next render cycle completes (success or failure) or a hot-recompile failure is detected, then returns the same status plus `timedOut` — so the edit loop is: edit → preview_status{waitForRender:true} → read changedLastRender (empty = the edit reached no screen) and lastError (source 'compile' = the edit didn't even build). No polling, no sleeps.
| Name | Type | Req | Description |
|---|---|---|---|
| timeoutMs | integer | – | waitForRender timeout (default 120000; result carries timedOut:true on expiry). |
| waitForRender | boolean | – | Block until the next render/compile outcome instead of returning immediately. |
No output schema declared.
No examples provided.
preview_stop Stop the live preview gallery ~42
Stops the resident preview service started by `preview` (file watcher + gallery server). Returns the final status. The Gradle daemon it used stays warm (that's desirable).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
render_screen Render the screen as pixels (path-only, for the human) ~447
Pixel preview with a PATH-ONLY contract: returns { path, width, height, sizeBytes, displayHint } parsed from the PNG header — NEVER the image bytes/base64 (pixels flow to the human, structure flows to the AI). Sources: `projectDir` (+ optional `screen` id, default 'shell') renders a REAL screen of a create-cmp app headlessly — through the resident preview daemon when one is running (~1s warm) else via its generated `:composeApp:renderScreens` task — no device/emulator — and also returns `treePath` (the structural twin), `previewsDir`, and `via` ('daemon'|'gradle'); `source:{kind:'live',port?}` fetches the RUNNING app's current screen from GET /inspect/screenshot and writes it to `out` (or a temp file); `pngPath` points at a PNG a harness already produced; `harness:true` runs the create-cmp checkout's demo harness (bundled SampleScreen — use `projectDir` for real apps). Pair it with inspect_tree (format:'wireframe') for the structural twin.
| Name | Type | Req | Description |
|---|---|---|---|
| harness | boolean | – | Run the create-cmp checkout's DEMO harness (bundled SampleScreen) to produce the PNG first. |
| harnessDir | string | – | Harness project directory (default: the create-cmp checkout's inspector/harness). |
| out | string | – | Where to write a live capture (default: a temp file). Ignored for pngPath/harness. |
| pngPath | string | – | Path to an existing PNG (e.g. the harness's out/screen.png). |
| projectDir | string | – | Root of a create-cmp app: runs its generated `:composeApp:renderScreens` task (tier 0, real screens from inspector/PreviewRegistry.kt) and reads the PNG + tree it wrote. |
| screen | string | – | Registry id to render with projectDir (default 'shell'; e.g. 'home', a tab slug). |
| source | object | – | Tier 1: capture the RUNNING app's screen via GET /inspect/screenshot. |
No output schema declared.
No examples provided.
resolve_comment Resolve a console comment (the agent closes the loop) ~155
Marks a comment resolved via the project's own qa/lib/comments.mjs, recording author 'agent' and `note` (what you actually did about it — update the spec/plan/code FIRST, then resolve; the console never edits code itself, per §4's principle, so this is the only way a comment closes). Returns {ok:true, comment} or {ok:false, reason} — the library's refusal verbatim (unknown id, already resolved). The console's Comments tab then shows the resolution + note. Requires a running preview service (call preview{projectDir} first).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Comment id (see review_comments). |
| note | string | yes | What you did in response to the comment. |
No output schema declared.
No examples provided.
review_comments Console comment ledger — optionally WAIT for a new comment ~327
The human-comment half of the console (VERIFICATION-LAYER-DESIGN.md §7.3: 'pixels flow to the human, structure flows to the AI, judgment flows back through comments'): the full comment ledger, via the PROJECT'S OWN qa/lib/comments.mjs (never forked here) — target (screen/element/spec-line/design-system/architecture/general, rendered readably in the console's Comments tab), text, author, createdAt, status, resolution. Without waitForComment: the current snapshot {available, schema, comments}. With waitForComment:true: BLOCKS — same shape as approval_status's waitForDecision — until a NEW comment lands (a 💬 submitted in the console), then returns {timedOut, available, added:[newComments], comments}. A resolve does NOT wake this wait — only a fresh comment does. {available:false} in a project with no comments library (an older, pre-comments-wave scaffold) — resolves immediately, there is nothing to wait for. Loop of record: propose a change, tell the human to review it in the console, review_comments{waitForComment:true} instead of polling, act on `added`, then resolve_comment with what you did. Requires a running preview service (call preview{projectDir} first).
| Name | Type | Req | Description |
|---|---|---|---|
| status | string | – | Filter the snapshot to one status. |
| timeoutMs | integer | – | waitForComment timeout (default 120000; result carries timedOut:true on expiry). |
| waitForComment | boolean | – | Block until a new comment lands instead of returning immediately. |
No output schema declared.
No examples provided.
runtime_crashes Fetch persisted crashes from the running app, with cause attribution ~191
GET /inspect/crashes on the running app (current boot + previous ones; the on-device handler chains to whatever handler was installed before it — it never swallows the crash). Each crash is attributed: its stack frames are intersected with recently-edited files (git status + git diff in `projectDir`, default cwd) to produce a verdict — 'likely-caused-by-recent-edit' (with the matching frame(s) as evidence) or 'no-recent-edit-implicated'. Returns { crashes:[{timestamp,exception,message,frames,attribution}], changedFilesConsidered }. Requires connect_live.
| Name | Type | Req | Description |
|---|---|---|---|
| port | integer | – | Inspector port (default: the connect_live session port, else 9500). |
| projectDir | string | – | App repo root for git-based attribution (default: cwd). |
| since | string | – | ISO timestamp — only crashes at/after this instant. |
No output schema declared.
No examples provided.
runtime_logs Fetch recent device logs for the running app (adb logcat) ~240
Shells `adb shell pidof <appId>` (appId resolved from the live inspector's GET /inspect/health) then `adb logcat -v threadtime --pid=<pid> -d` and returns STRUCTURED, BOUNDED entries — never a log firehose: default limit 200, max 2000, newest-first tail. Optional `level` keeps that severity and above (adb's own ordering); `since` (ISO timestamp) keeps entries at/after it. No on-device log capture — v1 is adb-only, so it needs a device/emulator attached and adb on PATH; errors are actionable (no device, no process running, adb missing).
| Name | Type | Req | Description |
|---|---|---|---|
| level | string | – | Minimum severity (that level and above). |
| limit | integer | – | Max entries returned, newest-first (default 200, max 2000). |
| port | integer | – | Inspector port (default: the connect_live session port, else 9500). |
| serial | string | – | adb device serial (when several devices are attached). |
| since | string | – | ISO timestamp — only entries at/after this instant. |
No output schema declared.
No examples provided.
snapshot_variant Stash the current renders as a named design-language candidate ~256
GENESIS-FLOW-DESIGN.md §2 'Design-language candidates (variants)': copies the CURRENT preview render (every screen's screen.png from the last completed render) plus design-system.json into composeApp/build/previews/variants/<name>/, REPLACING that variant if one with the same name already exists. Returns { name, screens, designSystemStashed, dir }. `name` must match [a-z0-9-]+ (lowercase letters, digits, hyphens) — anything else is refused, not sanitized. Typical loop: edit Tokens.kt, preview_status{waitForRender:true}, snapshot_variant{name:'warmer'}, repeat per candidate token set, then tell the human to compare them side by side in the Design System tab's candidates strip and click Pick — observed via review_comments{waitForComment:true} as a `pick:<name>` comment targeting design-system; apply the chosen tokens, resolve_comment with a note, then approve. Requires a running preview service (call preview{projectDir} first) with at least one completed render.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Candidate name, e.g. 'warmer' or 'rounded-v2' — used as the variant's directory name. |
No output schema declared.
No examples provided.
What is the io.github.kvdm-co-pilot/cmp-inspector MCP server?
io.github.kvdm-co-pilot/cmp-inspector is an MCP server listed in the public MCP registry as io.github.kvdm-co-pilot/cmp-inspector. Compose Multiplatform UI as structured JSON for agents: trees, tokens, previews, diffs. No pixels. This page covers its npm package (@create-cmp/inspector).
Is the io.github.kvdm-co-pilot/cmp-inspector MCP server safe to use?
io.github.kvdm-co-pilot/cmp-inspector scores 81 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 1 October 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 io.github.kvdm-co-pilot/cmp-inspector MCP server expose?
io.github.kvdm-co-pilot/cmp-inspector exposes 15 tools: inspect_tree, connect_live, navigate_and_inspect, runtime_crashes, runtime_logs, and 10 more. Their descriptions and schemas cost roughly 4,291 tokens of context every time the server is loaded.
Is the io.github.kvdm-co-pilot/cmp-inspector MCP server still maintained?
io.github.kvdm-co-pilot/cmp-inspector is still listed as active in the MCP registry. We last reached this channel on 1 October 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 io.github.kvdm-co-pilot/cmp-inspector MCP server under?
io.github.kvdm-co-pilot/cmp-inspector declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.