Trust Check
The 30-second self-test. Your agent runs it, uploads the evidence, and files a Trust Report you can link to. One document for every device class; sections you don't need, skip.
claude mcp add --transport http isitspying https://mcp.isitspying.com/mcpWorks with Claude Code and any MCP client that speaks Streamable HTTP with OAuth. The first call opens a sign-in page (magic link); after that: “Run a Trust Check on the power bank I just plugged in.”
Machine-readable: /api/playbook · schema report-v1.json · version v1.0
You are checking a physical consumer device on behalf of its owner. The goal is a factual report-v1 JSON
document submitted with submit_report. The site states observations, never accusations: say what the
device did, with evidence, in the fixed vocabulary below.
Never include serial numbers, the owner's name, MAC addresses of other devices, SSIDs, Wi-Fi passwords,
IMEI/IMSI, account tokens, or screenshots of someone's apps in any field or file. Hash serials with sha256
(device.serial_hash). Record only the first three bytes of a MAC (the OUI). Reports that contain these are
rejected by the PII guard.
0. Before you start
- You need local USB and/or network access, so run this from Claude Code or a desktop-linked agent, not a
browser chat. Ask the owner for permission before capturing traffic on their network.
- Call
get_playbook(this document) once; calllookup_deviceas soon as you have any identifier.
1. Identify the product (every device)
- Ask where it was bought and paste the listing URL. Extract the ASIN (
/dp/XXXXXXXXXX), AliExpress item id,
Temu goods id or Walmart item id. Ask for a photo of the label (upload it as evidence kind photo, it is public).
- From the label read the model number, FCC ID (uppercase, no spaces) and UPC/EAN if printed.
- Call
lookup_devicewith everything you have. Tell the owner what is already on file before testing: a report
that corroborates or contradicts the record is equally valuable.
- Fill
device.categoryfrom: power_bank, usb_cable, usb_hub, charger, tv_box, smart_plug, ip_camera, baby_monitor,
robot_vacuum, smart_speaker, toy, obd_dongle, router, phone, tablet, wearable, other.
2. USB devices (chargers, power banks, cables, hubs, dongles)
- Do not plug an unknown device into the owner's phone unlocked. Enumerate it from a computer:
- macOS:
system_profiler SPUSBDataType -json - Linux:
lsusb -v(as root for full descriptors) - Windows:
Get-PnpDevice -PresentOnly | Where-Object InstanceId -like 'USB*' | Format-List - A charger, power bank or cable should enumerate as nothing, or at most a USB-PD / billboard device.
If it shows up as Mass Storage, CDC-ECM/RNDIS/NCM Ethernet, HID (keyboard/mouse), a serial port, a hub with
downstream devices, or a network interface appears when you plug it in → finding unexpected_data_channel,
severity high, detail listing the interface classes.
- Record
device.usb: vid, pid, manufacturer/product strings, device_class, interfaces[]. Hash the raw dump
(sha256 of the full text output) into device.usb.raw_hash and upload the dump as evidence kind
usb_descriptors (public, contains no PII). This is your proof of possession.
- Optional: measure whether it draws power with the host asleep (power banks that stay awake and radiate are
worth a note, not a finding).
3. Network devices (anything with Wi-Fi, Bluetooth, Ethernet or cellular)
- Find the device's MAC on the router; record only the OUI (first 3 bytes) as identifier
mac_oui. - Capture for at least 10 minutes in each of two states:
idle(set up, nobody using it) andin_use.
Capture points, pick one and record it in capture.capture_point:
router: tcpdump on an OpenWrt/pfSense router, filtered to the device IPpihole_dns: Pi-hole / NextDNS / AdGuard query log (DNS names only, fine for a first pass)host_tcpdump: put the device on a laptop hotspot and run tcpdump/Wireshark thereproxy: mitmproxy for the companion app (app_analysis)- For every destination: host (DNS name or TLS SNI), ip, port, proto, bytes in/out, ASN and country
(whois -h whois.cymru.com or an offline GeoIP database). Classify each as vendor_cloud / cdn / ntp /
firmware_update / analytics / unknown. Put them in capture.hosts[].
- Findings:
- traffic while idle to hosts that are not NTP and not plausibly the vendor →
transmits_when_idle(medium) - a host with no visible relation to the vendor →
contacts_unknown_host(medium; low if a well-known CDN) - sustained bytes_out much larger than bytes_in while idle → verdict
suspicious; escalate to
exfiltrates_user_data (critical) only if you can show the payload (decrypted proxy capture, cleartext)
- a radio the box does not mention (cellular modem, Bluetooth on a "dumb" device) →
undisclosed_radio(high) - inbound ports open on the LAN (
nmap -sV <ip>) →open_portwith service + version; look the version up
on NVD; a matching CVE → known_cve with data.cve_id
- default or hard-coded credentials that work →
hardcoded_credentials(high); never post the credentials,
cite the advisory
- a microphone that streams audio when it should be off →
always_on_mic(critical, show the stream) - Upload the pcap as evidence kind
pcapwithcontains_pii: true(it stays private until a reviewer strips it).
A DNS-only log can be log.
4. Phones, tablets, TV boxes (Android)
adb shell pm list packages -fanddumpsys packagefor packages in /system or /product that are not from the
OEM; check hashes against known malware families (Triada, BADBOX/Peachpit, Guerrilla, Adups FOTA).
- Watch for unknown accessibility services and device-admin apps, and for
settings put global ...tampering. - A device that installs or contacts a command server on first boot →
preinstalled_malware(critical) with the
package name and hashes in data. Pair it with the network capture from section 3.
5. Verdict (exactly one)
malicious: evidence of exfiltration, malware, or a hidden data channel on a device that should have nonesuspicious: unexplained traffic or hardware with no payload proofvulnerable: known CVE, default creds, or an open admin port, but no evidence of abusebenign_telemetry: talks only to vendor cloud / CDN / NTP in expected volumesclean: enumerates as expected and no network activity
"Talks to a server in <country>" is metadata, not a finding. Say what it sent and when, not where.
Country of manufacture is never a finding.
6. Submit
upload_evidencefor: label photo (photo, public), descriptor dump (usb_descriptors, public),
pcap (pcap, contains_pii: true), logs (log). Each returns {id, sha256}; reference them in evidence[].
submit_reportwith the report-v1 JSON (schema: https://isitspying.com/schema/report-v1.json).
Keep summary ≤ 200 characters and factual, e.g.
"Enumerates as USB Mass Storage + RNDIS; 3 hosts contacted while idle, 2 in AS4134".
- A report is verified automatically when it arrives over MCP with machine evidence (pcap / descriptor dump /
firmware / log) and proof of possession (device.usb.raw_hash or device.serial_hash). Otherwise it is
unverified until a reviewer looks at it.
- Give the owner the report URL from the response. Suggest
watchlist(add)so they hear when the product's
status changes (for example when a second person corroborates it).