Manufacturer-cited router default logins and compliance check, plus MAC/OUI vendor lookup. Free.
MCP server for ssid.ai — manufacturer-cited router default logins, a universal-default-password check, and MAC-address (OUI) vendor lookup, callable from any agent host. (ssid.ai is the branded tool at that domain, not the generic "SSID" WiFi-network-name term.)
Add to any MCP-capable host (Claude Desktop, Cursor, etc.). No API key needed.
{
"mcpServers": {
"ssid": { "command": "npx", "args": ["-y", "ssid-mcp"] }
}
}
Node 18 or newer.
get_router_defaults({ slug }) or get_router_defaults({ brand, model })The factory login for a router or gateway model, cited to the manufacturer's own
documentation: default gateway IP, login host, admin username and password, credential
type, factory-reset steps, and the source URL. Null credential fields are the answer, not
a gap — credType and credTypeMeaning say why there is no factory password, so an agent
is never left to fill a blank with admin/admin. Brand + model is an exact resolve, not a
search: an inexact model returns up to five candidate slugs within that brand.
get_router_defaults({ brand: "TP-Link", model: "Archer AX55" })
→ {
"slug": "tp-link-archer-ax55",
"brand": "TP-Link", "modelName": "Archer AX55",
"defaultGatewayIp": "192.168.0.1", "loginHost": "tplinkwifi.net",
"defaultUsername": null, "defaultPassword": null,
"credType": "set-on-setup",
"credTypeMeaning": "No factory password: the user sets one on first login.",
"resetSteps": "Visit http://tplinkwifi.net and create an admin password on first setup. ...",
"source": { "url": "https://www.tp-link.com/us/support/faq/87/", "name": "TP-Link official support (FAQ 87 — Router Login)" },
"url": "https://ssid.ai/routers/tp-link-archer-ax55",
"rateLimit": { "limit": 100, "remaining": 99, "tier": "anonymous" }
}
credType is one of set-on-setup, label-unique, app-only, static (a universal
default password shared by every unit) or unknown.
check_router_compliance({ slug })Whether a router model still ships a universal default password — the pattern prohibited
for consumer connectable products under the UK PSTI Act (in force April 2024) and targeted
by the EU Cyber Resilience Act — read from the manufacturer-cited credential type, with the
Router Compliance Index totals for context. A documentation
reading, not legal advice; every result carries a basis line saying so.
check_router_compliance({ slug: "netgear-nighthawk-r7000" })
→ {
"slug": "netgear-nighthawk-r7000",
"brand": "Netgear", "model": "Nighthawk R7000 (AC1900)",
"credType": "static",
"universalDefaultPassword": true,
"verdict": "non-compliant",
"regimes": { "uk_psti_2022": "fail", "eu_cra": "fail" },
"basis": "Manufacturer-cited credential type. 'static' means a universal default password, ...",
"source": { "url": "https://kb.netgear.com/1148/...", "name": "NETGEAR official KB 1148 (Default UI passwords)" },
"index": { "total": 409, "compliantPct": 73, "staticCount": 111, "generatedAt": "2026-09-04",
"brand": { "total": 24, "staticCount": 9, "clean": false } },
"url": "https://ssid.ai/compliance"
}
lookup_mac({ mac })Vendor, OUI, kind (universal / randomized / multicast / invalid), a randomized flag,
confidence and the source. Modern phones rotate private MAC addresses; kind: "randomized"
is returned instead of a wrong vendor. For the router's factory login, call
get_router_defaults next.
lookup_mac({ mac: "F4:F5:E8:11:22:33" })
→ { "vendor": { "organization": "Google, Inc." }, "kind": "universal", "randomized": false, ... }
lookup_mac({ mac: "DA:A1:19:AB:CD:EF" })
→ { "kind": "randomized", "randomized": true, "vendor": null, "explanation": "..." }
submit_correction({ slug, field, proposedValue, sourceUrl })Propose a fix to a router model's default login IP, username, password, credential type,
or reset steps. Requires an official manufacturer sourceUrl — never applied
automatically, queued for verification against that source. The contribution loop is open
to agents on the same terms as humans.
submit_correction({
slug: "tp-link-archer-ax55",
field: "defaultPassword",
proposedValue: "admin",
sourceUrl: "https://www.tp-link.com/us/support/faq/..."
})
→ { "ok": true, "status": "pending" }
Numbers below were read from the live API at publish time (2026-09-04). Re-query
https://ssid.ai/compliance/data.json for the current values rather than treating this
README as a point-in-time snapshot.
| Metric | Value | Source |
|---|---|---|
| Router / gateway / mesh / AP models tracked | 409 | Manufacturer documentation, per-model cited |
| No longer ship a universal default password | 73% (298 of 409) | Compliance Index |
| — set at first setup | 124 | |
| — unique password on the device label | 126 | |
| — app-only admin, no web login | 48 | |
| — universal default (the risky pattern) | 111 | |
| MAC/OUI vendors indexed | 40,083 | IEEE OUI registry, re-ingested daily |
Full per-brand breakdown, worst offenders and zero-default brands: router-defaults-dataset.md. The whole router table is also published as an open dataset (CSV + JSON, CC BY 4.0): https://github.com/Drumworks/router-default-passwords.
lookup_mac returns kind: "randomized" with a plain-English explanation instead of a
misleading "unknown vendor"./routers/brand/{brand}) and per-login-IP hubs (/routers/ip/{ip}, e.g.
every model that ships 192.168.1.1): https://ssid.ai/routersThe free tier needs no key. MAC/OUI lookup has no daily cap. The router tools are metered
(100 calls/day without a key, 1,000/day with a free key); every result includes
rateLimit so an agent can pace itself, and a 429 says how to raise the limit. Set
SSID_API_KEY to use a key (get one at https://ssid.ai/api-docs) and SSID_API_BASE to
point at a different host.
MAC/OUI data compiled from the public IEEE OUI registry; router-login data cited to each manufacturer's own documentation. Facts are uncopyrightable — ssid.ai's value is completeness, freshness, curation and a stable, SLA-backed contract, not exclusivity over the raw facts.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y ssid-mcpMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"ai-ssid-ssid-mcp": {
"command": "npx",
"args": [
"-y",
"ssid-mcp"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referencessid-mcpnpmai.ssid/ssid-mcp works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.