isitspying.com

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/mcp

Works 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; call lookup_device as 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_device with 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.category from: 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) and in_use.

Capture points, pick one and record it in capture.capture_point:

  • router: tcpdump on an OpenWrt/pfSense router, filtered to the device IP
  • pihole_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 there
  • proxy: 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_port with 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 pcap with contains_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 -f and dumpsys package for 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 none
  • suspicious: unexplained traffic or hardware with no payload proof
  • vulnerable: known CVE, default creds, or an open admin port, but no evidence of abuse
  • benign_telemetry: talks only to vendor cloud / CDN / NTP in expected volumes
  • clean: 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_evidence for: label photo (photo, public), descriptor dump (usb_descriptors, public),

pcap (pcap, contains_pii: true), logs (log). Each returns {id, sha256}; reference them in evidence[].

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).