Atlas / MCP servers / farzadnadiri / MCP-CAN

MCP-CANBLOCK

mcp/farzadnadiri/mcp-can

Talk to Your Car Using AI

Verdict
BLOCK
Grade
F
Trust score
58 /100
Exposed tools
22 16r · 4w · 2d
Transport
streamable-http
License
MIT
Stars
20
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

🔌 Virtual CAN + MCP Server

Peykan is a Model Context Protocol (MCP) server that exposes automotive CAN bus, OBD-II (SAE J1979), UDS, and SAE J1939 diagnostic data to LLMs and AI agents. It ships a built-in virtual CAN bus with an ECU simulator, decodes traffic via a DBC database (cantools), and serves MCP tools over SSE or streamable-HTTP. No CAN hardware, adapter, or vehicle is required by default; optional SocketCAN/vCAN on Linux.

Use it to let an LLM read live CAN frames, decode signals, run OBD-II PID and UDS diagnostic requests, inspect J1939 PGNs/SPNs and DM1 trouble codes, and drive fault-injection scenarios against a simulated vehicle, analyse recorded CAN logs, or work with real hardware behind a read-only-by-default safety policy.

Try it in your browser: peykan.ai gives you a private simulated car and an AI agent to talk to it, no install needed.

Keywords: MCP server, Model Context Protocol, CAN bus, CANbus, OBD-II, OBD2, on-board diagnostics, SAE J1939, UDS, ECU simulator, vehicle diagnostics, automotive, DBC, python-can, cantools, SocketCAN, LLM tools, AI agents.

✨ Highlights

  • MCP server for CAN/OBD/UD
Read from source at commit 27edbba1add1OBSERVED · 2026-10-10
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add peykan-web -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "peykan-web": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ]
    }
  }
}
03

Exposed tools (22)

16 read · 4 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
activate_fault_scenariodestructiveActivate a fault-injection scenario in the simulator, or clear the
analyze_can_logreadSummarise a recorded CAN log (.asc, .blf, .trc, candump .log, .csv):
decode_can_framereadDecode a single CAN frame
decode_j1939_framereadDecode a 29-bit J1939 frame: split the extended ID (integer or hex
filter_framesreadFrames from the last `duration_s` seconds matching the given
get_log_signalreadOne decoded signal
get_transmit_logreadThe transmit policy (is sending allowed on this interface, are
get_vehicle_snapshotreadThe last known value of every signal seen so far (one entry per
list_can_logsreadCAN log files available to analyze (in PEYKAN_LOG_DIR), plus the
list_j1939_pgnsreadThe catalog of J1939 Parameter Group Numbers this server can decode
monitor_signalreadTimestamped samples of one decoded signal over the last `duration_s`
read_can_framesreadReturn every raw frame seen in the last `duration_s` seconds.
read_j1939_dtcsreadRead the most recent J1939 DM1 (active diagnostic trouble codes)
read_vinreadRead the Vehicle Identification Number via OBD-II Mode 09 PID 02
replay_can_logreadReplay a recorded log onto the bus with its original timing
request_j1939_pgnwriteSend a J1939 Request PGN (0xEA00) asking every ECU to transmit
send_diagnostic_requestwriteSend a UDS-style diagnostic request (see vehicle.dbc
send_obd_requestwriteSend a standard OBD-II (SAE J1979) request (e.g. service=1, pid=
stop_log_replaywriteStop the log replay started by replay_can_log (and report how far it got).
uds_clear_dtcsdestructiveUDS ClearDiagnosticInformation (0x14) for all DTC groups. Changes
uds_read_datareadUDS ReadDataByIdentifier (0x22) over ISO-TP. `dids` are data
uds_read_dtcsreadUDS ReadDTCInformation (0x19, reportDTCByStatusMask): stored DTCs
04

Trust audit

BLOCKgrade F · trust 58/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (2 observation(s))
Network
declared (10 observation(s))
Shell
declared (3 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (17)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
web/env.d.ts:3064
exec(input?: (string | URLPatternInit), baseURL?: string): URLPatternResult | null;
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
web/env.d.ts:3355
exec(cmd: string[], options?: ContainerExecOptions): Promise<ExecProcess>;
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
web/env.d.ts:12135
exec(query: string): Promise<D1ExecResult>;
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMInsecure crypto · crypto.weak_random · CWE-327, CWE-338
src/peykan/simulator/runner.py:44
return random.choice(list(sig.choices.keys()))
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
Dockerfile:50
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=5   CMD curl -fs http://127.0.0.1:6278/healthz || exit 1
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
src/peykan/server/mcp_server.py:737
origins = ["http://127.0.0.1:*", "http://localhost:*", "http://[::1]:*"]
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
web/.dev.vars.example:8
VEHICLE_DEV_URL=http://127.0.0.1:6401
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
activate_fault_scenario, uds_clear_dtcs
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
MEDIUMAuth / authz · mcp.remote_no_auth · CWE-287, CWE-862
streamable-http
Why it matters. a network transport with no auth environment variable found
Fix. require a token
LOWInventory / provenance · inv.hidden_file · CWE-1104
web/.dev.vars.example
.dev.vars.example
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
web/.oxfmtrc.json
.oxfmtrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
web/.oxlintrc.json
.oxlintrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
web/.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/test_server_app.py:317
escape = _call(app, "analyze_can_log", {"path": "../../etc/passwd.asc"})
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
web/env.d.ts:310
atob(data: string): string;
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
web/env.d.ts:398
declare function atob(data: string): string;
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
web/package.json
@cfworker/json-schema, @cloudflare/ai-chat, @cloudflare/containers, @modelcontextprotocol/sdk, @phosphor-icons/react, agents, ai, react
Why it matters. 26 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha 27edbba1add1full audit observations/trust-audit/mcp-server/farzadnadiri__mcp-can.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1027edbba1add1BLOCKF58first audit
06

Questions

What is the MCP-CAN MCP server?

Talk to Your Car Using AI

What tools does MCP-CAN expose?

22 in total: 16 read-only, 4 that write, and 2 that can delete or overwrite (activate_fault_scenario, uds_clear_dtcs). Every one is listed on this page with its risk.

Is MCP-CAN safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (58/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does MCP-CAN need?

No credential environment variables were found in its source, so it appears to need none.

How does MCP-CAN run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as peykan-web at 1.0.0.

How current is this page?

The grade is for one exact copy of the source (27edbba1add1), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement