Carto Md MCP Server

carto-md npm v2.1.5

Published by an unidentified publisher — no publish provenance and no public repository, so the publisher could not be verified and the source cannot be independently located.

Structural intelligence + episodic memory for AI coding tools. Indexes your codebase into SQLite — routes, models, import graph, blast radius, domains — and exposes ~75 MCP tools (validate_diff, get_change_plan, did_we_discuss_this, get_predictive_risk, …

Trust grade
A
91/100
Last scanned get badge →
Trust
A · 91/100
Adoption risk for you: the threat score, then adjusted down for blast radius, publisher verification and how much the scan could see. Deterministic; every point is auditable.
Capability
High
Blast radius if it went rogue — what the server’s tools could reach. Independent of trust.
Coverage
Source
How much the scan could actually inspect. Shallow coverage is stated, never hidden.
Share this Trust Score
𝕏 Share LinkedIn Reddit
A Why this grade threat 99 − adoption risk = 91/100

The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.

1. Threat score — 100 − 1.2 = 99. What the published surface and source actually contain:

PointsWhat was foundCategory
−1.2 Package runs install-time scripts MTC-SUP-010 supply-chain

2. Client adoption risk — 99 − 8 = 91. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:

PointsAdoption-risk factor
−6 capability blast radius (high) — client exposure if the model is manipulated
−2 publisher verification (unlinked) — no provenance/repo link, but the shipped source was fully read

Capability observations and info notes are shown under Findings but never scored. Open any row's finding below for the file, line and evidence behind a deduction.

Findings 16

high Reads a sensitive credential path or dumps the environment (src/security/ignore.js)MTC-SRC-006

In the server's implementation (`src/security/ignore.js:24`): Reading private keys / cloud credentials, or serializing the whole environment, is a sensitive-data source that becomes exfiltration when combined with any egress. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: be caught by *.key) 'id_rsa', 'id_rsa.pub', 'id_ed25519', 'id_ed25519.pub', 'id_ecdsa', 'id_ecdsa.pub', '

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/security/ignore.js

high Shell/command execution in server code (src/acp/safety.js)MTC-SRC-002

In the server's implementation (`src/acp/safety.js:22`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: { execFile } = require('child_process'); const DEFAULT_TIMEOUT_MS = 30_000; const DEFAULT_MAX_OUTPUT_BYTES = 1_048_576;

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/acp/safety.js

high Shell/command execution in server code (src/anci/git-meta.js)MTC-SRC-002

In the server's implementation (`src/anci/git-meta.js:19`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: ecFileSync } = require('child_process'); /** * git(root, args) → trimmed stdout string, or null on any failure. */ fu

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/anci/git-meta.js

high Shell/command execution in server code (src/brain/procedural/index.js)MTC-SRC-002

In the server's implementation (`src/brain/procedural/index.js:49`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: ecFileSync } = require('child_process'); let log; try { log = execFileSync('git', [ '-C', temporalStore._p

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/brain/procedural/index.js

high Shell/command execution in server code (src/brain/working/index.js)MTC-SRC-002

In the server's implementation (`src/brain/working/index.js:16`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: ecFileSync } = require('child_process'); /** * getUncommittedFiles(projectRoot) → Array<{ path, change_kind }> * * U

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/brain/working/index.js

high Shell/command execution in server code (src/cli/check.js)MTC-SRC-002

In the server's implementation (`src/cli/check.js:3`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: { execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); const { SQLiteStore } =

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/cli/check.js

high Shell/command execution in server code (src/cli/init.js)MTC-SRC-002

In the server's implementation (`src/cli/init.js:372`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: spawnSync } = require('child_process'); const cmd = process.platform === 'win32' ? 'where' : 'which'; const r =

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/cli/init.js

high Shell/command execution in server code (src/cli/pr-impact.js)MTC-SRC-002

In the server's implementation (`src/cli/pr-impact.js:35`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: ecFileSync } = require('child_process'); const { SQLiteStore } = require('../store/sqlite-store'); const { StoreAdapter

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/cli/pr-impact.js

high Shell/command execution in server code (src/mcp/middleware/index.js)MTC-SRC-002

In the server's implementation (`src/mcp/middleware/index.js:361`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: s, spawn = require('child_process').spawn, clientIn = process.stdin, clientOut = process.stdout, stderr

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/mcp/middleware/index.js

high Shell/command execution in server code (src/predictive/ownership.js)MTC-SRC-002

In the server's implementation (`src/predictive/ownership.js:15`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: ecFileSync } = require('child_process'); function gitLog(projectRoot, args, timeoutMs = 10_000) { try { return ex

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/predictive/ownership.js

medium Dynamic module load from a non-literal (src/cli/doctor.js)MTC-SRC-005

In the server's implementation (`src/cli/doctor.js:68`): Loading a module chosen at runtime (from a variable) can pull in and run attacker-influenced code paths. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: t err = null; try { require(pkg); loaded = true; } catch (e) { err = e; } results.push({ id: `native-$

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/cli/doctor.js

medium Dynamic module load from a non-literal (src/extractors/loader.js)MTC-SRC-005

In the server's implementation (`src/extractors/loader.js:26`): Loading a module chosen at runtime (from a variable) can pull in and run attacker-influenced code paths. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: { const plugin = require(fullPath); // Validate plugin shape if (typeof plugin.name !== 'string') {

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/extractors/loader.js

medium Dynamic module load from a non-literal (src/mcp/change-plan.js)MTC-SRC-005

In the server's implementation (`src/mcp/change-plan.js:888`): Loading a module chosen at runtime (from a variable) can pull in and run attacker-influenced code paths. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: lower-relevance forward import(s) pruned — run \`impact\` on an anchor for the full dependency set._`); } lines.

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server src/mcp/change-plan.js

low Dynamic code execution in packaging/dev tooling (scripts/gen-api-docs.js)MTC-SRC-001

In a packaging/dev/install script (shipped, but not the server runtime) (`scripts/gen-api-docs.js:28`): Evaluating strings as code is the most direct RCE primitive; if any tool input reaches it, the server executes attacker-chosen code. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: e no-new-func return (new Function(`return ${arrayLiteral}`))(); } function loadTools() { // Cheap eval — extract t

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server scripts/gen-api-docs.js

low Shell/command execution in packaging/dev tooling (scripts/postinstall.js)MTC-SRC-002

In a packaging/dev/install script (shipped, but not the server runtime) (`scripts/postinstall.js:22`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: spawnSync } = require('child_process'); // ---- Static metadata ---- const GRAMMARS = [ { pkg: 'tree-sitter-javascr

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server scripts/postinstall.js

low Package runs install-time scripts (postinstall)MTC-SUP-010

"carto-md" executes postinstall script(s) at install time. An install hook runs at install time; most are routine build/setup, but review what it does before trusting it.

Evidence: node scripts/postinstall.js

Fix: Review the scripts; install with --ignore-scripts where possible and vet what they do.

Location: package carto-md

Tools 86

Each tool and what it can reach — statically extracted from the published source.

  • get_env_varsreads sensitive data
  • get_token_budget_reportreads sensitive data
  • did_we_discuss_thisno sensitive capability
  • dismiss_gapno sensitive capability
  • dismiss_suggestionno sensitive capability
  • explain_change_in_natural_languageno sensitive capability
  • find_consumers_of_apino sensitive capability
  • get_action_patternsno sensitive capability
  • get_active_driftno sensitive capability
  • get_active_suggestionsno sensitive capability
Show 76 more tools ↓
  • get_ai_cost_attributionno sensitive capability
  • get_arch_eventsno sensitive capability
  • get_architectural_driftno sensitive capability
  • get_architectureno sensitive capability
  • get_blast_radiusno sensitive capability
  • get_canonical_patternno sensitive capability
  • get_change_planno sensitive capability
  • get_change_velocityno sensitive capability
  • get_churn_vs_blast_radiusno sensitive capability
  • get_complexity_trendno sensitive capability
  • get_contextno sensitive capability
  • get_conventionsno sensitive capability
  • get_cross_domainno sensitive capability
  • get_cross_language_call_graphno sensitive capability
  • get_cross_repo_blast_radiusno sensitive capability
  • get_cross_team_couplingno sensitive capability
  • get_data_flowno sensitive capability
  • get_dead_code_with_confidenceno sensitive capability
  • get_decision_logno sensitive capability
  • get_dependency_surfaceno sensitive capability
  • get_domainno sensitive capability
  • get_domain_evolutionno sensitive capability
  • get_domain_healthno sensitive capability
  • get_domains_listno sensitive capability
  • get_drift_digestno sensitive capability
  • get_evolution_deltano sensitive capability
  • get_file_ownershipno sensitive capability
  • get_file_receiptsno sensitive capability
  • get_file_summaryno sensitive capability
  • get_gapsno sensitive capability
  • get_high_impact_filesno sensitive capability
  • get_hot_in_prod_no_testsno sensitive capability
  • get_hotspot_filesno sensitive capability
  • get_iac_resourcesno sensitive capability
  • get_intentno sensitive capability
  • get_interface_contractno sensitive capability
  • get_intervention_historyno sensitive capability
  • get_invariantsno sensitive capability
  • get_llm_enrichmentno sensitive capability
  • get_microservice_cut_pointsno sensitive capability
  • get_microservices_migration_cut_pointsno sensitive capability
  • get_minimal_context_for_intentno sensitive capability
  • get_modelsno sensitive capability
  • get_neighborsno sensitive capability
  • get_org_architectureno sensitive capability
  • get_org_domain_mappingno sensitive capability
  • get_pending_decisionsno sensitive capability
  • get_predictive_riskno sensitive capability
  • get_progressive_disclosure_treeno sensitive capability
  • get_recent_decisionsno sensitive capability
  • get_risk_weighted_blast_radiusno sensitive capability
  • get_routesno sensitive capability
  • get_safety_checklistno sensitive capability
  • get_semantic_diffno sensitive capability
  • get_service_boundary_violationsno sensitive capability
  • get_service_dependency_graphno sensitive capability
  • get_session_contextno sensitive capability
  • get_similar_patternsno sensitive capability
  • get_stale_docsno sensitive capability
  • get_structureno sensitive capability
  • get_temporal_contextno sensitive capability
  • get_test_coverage_mapno sensitive capability
  • get_upgrade_riskno sensitive capability
  • get_working_memoryno sensitive capability
  • historyno sensitive capability
  • impactno sensitive capability
  • ingest_otlp_tracesno sensitive capability
  • memoryno sensitive capability
  • orgno sensitive capability
  • patternsno sensitive capability
  • scaffold_for_intentno sensitive capability
  • search_routesno sensitive capability
  • set_intentno sensitive capability
  • simulate_change_impactno sensitive capability
  • validate_changeno sensitive capability
  • validate_diffno sensitive capability

What this scan could not see

Versions 3

Scan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.

VersionScoreFindingsEngineScanned
v2.1.5 latest A 91/100 16 1.13.0 2026-09-07
v2.1.4 A 91/100 16 1.13.0 2026-08-31
v2.1.3 A 91/100 16 1.12.1 2026-08-03

Embed this score

Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.

MCP Trust Score: A · 91/100
Markdown (GitHub README)
[![MCP Trust Score](https://mcptrustchecker.com/registry/carto-md/badge.svg)](https://mcptrustchecker.com/registry/carto-md)
HTML
<a href="https://mcptrustchecker.com/registry/carto-md"><img src="https://mcptrustchecker.com/registry/carto-md/badge.svg" alt="MCP Trust Score" height="20"></a>
Prefer shields.io styling? Point it at https://mcptrustchecker.com/registry/carto-md/badge.json via https://img.shields.io/endpoint?url=…

Verify this score yourself

The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.

npx mcptrustchecker scan carto-md --online

Use the free API → How scoring works

More in Developer Tools