Spamcop (spamcop.net) for agents: Check IP blocklist status; Look up abuse contact for IP; Read a page on spamcop.net — through Unbrowse's scoped MCP for spamcop.net (unofficial), which replays...
Spamcop as tools for your agent. Unofficial: not affiliated with or endorsed by spamcop.net. Unbrowse compiled these from spamcop.net's own requests: each call replays the site's first-party API server-side and returns a verified result. No scraping of rendered pages, no browser on your side, no spamcop.net API key.
This server is a tool scope holding only spamcop.net: its compiled tools plus the Unbrowse tools that run them, so the agent's tool list stays small and every call stays on spamcop.net.
claude mcp add --transport http spamcop https://unbrowse.ai/mcp/spamcop.net
codex mcp add spamcop --url https://unbrowse.ai/mcp/spamcop.net && codex mcp login spamcop
{"mcpServers":{"spamcop":{"url":"https://unbrowse.ai/mcp/spamcop.net"}}}
The first connect signs in to Unbrowse with OAuth (free tier, only verified results count). For scripts, send Authorization: Bearer $UNBROWSE_API_KEY (key from https://unbrowse.ai/app/keys; keep it in a secret manager, never in config you commit).
If none of the tools below are in this session's tool list, the server is not connected or not signed in: say so and stop. Do not fetch spamcop.net some other way and present it as this skill's result.
spamcop_net__get_w3m — Check IP blocklist statusCheck IP blocklist status. Inputs: ip. Returns the page's title, readable text and links. Read-only on spamcop.net.
ip (string, required) — ip (typed during “fill ip”)action (string) — optional, e.g. "checkblock"{"ip":"<ip>"}
spamcop_net__get_sc — Look up abuse contact for IPLook up abuse contact for IP. Inputs: track. Returns the page's title, readable text and links. Read-only on spamcop.net.
track (string, required){"track":"<track>"}
spamcop_net__read_page — Read a page on spamcop.netRead any page on spamcop.net — a path such as /news/2026/some-story, or a full spamcop.net URL — and get its title, readable text and links. One first-party HTTP request, no browser. Follow a returned link by passing its href back as the path. Inputs: path e.g. "/". Returns the page's title, readable text and links. Read-only on spamcop.net.
path (string, required) — A page on spamcop.net: a path like /about, or a full URL on spamcop.net{"path":"/"}
Always there too: unbrowse.run (a task on spamcop.net in plain words), unbrowse.inspect, unbrowse.resume, unbrowse.scrape and unbrowse.map (any page on spamcop.net), and the recorded cloud browser unbrowse.browse.open → unbrowse.browse.act → unbrowse.browse.finish. Hosts that reject dotted names show them with _ (unbrowse_run).
status. succeeded carries the verified result. input_required is not a failure: answer the open fields with unbrowse.resume {runId, answers} on the same run.unbrowse.run {task}. It fails with no_capability when nothing is compiled for that yet: do it once with unbrowse.browse.open on spamcop.net → unbrowse.browse.act → unbrowse.browse.finish, which compiles a new tool this server lists next time. Anything off spamcop.net is refused here (not_in_scope): use the general Unbrowse server for that.unbrowse.browse.act with action: "autofill" fills spamcop.net's login from their Unbrowse password manager.succeeded result says. outcome_unknown means a change may have happened: check before retrying. Posting, buying, sending or deleting needs the user's go-ahead.Every tool is also a REST call:
curl -s https://unbrowse.ai/api/v1/sites/spamcop.net/call/spamcop_net__get_w3m \
-H "authorization: Bearer $UNBROWSE_API_KEY" -H "content-type: application/json" \
-d '{"ip":"<ip>"}'
OpenAPI: https://unbrowse.ai/api/v1/sites/spamcop.net/openapi.json. Every other site: the general Unbrowse skill (https://github.com/unbrowse-ai/unbrowse) and https://unbrowse.ai/mcp.