# Public MCP server

> Three read-only tools, no account and no key, ten requests a minute per IP.

A second MCP server with no account, no key and no sign-up.

- **Endpoint** `POST https://domduck.com/api/mcp/public`
- **Authentication** none
- **Rate limit** 10 requests a minute, per IP
- **Server name** `domduck-public`, so a client with both connected can tell
  them apart

```bash
claude mcp add --transport http domduck-public https://domduck.com/api/mcp/public
```

```json
{
  "mcpServers": {
    "domduck-public": {
      "type": "http",
      "url": "https://domduck.com/api/mcp/public"
    }
  }
}
```

## What it reads, and what it will not do

This server answers from what Domduck has already collected. **It never fetches
a domain on demand.** A domain nobody has ever looked up returns
`hasReading: false`, and that is a real answer rather than an error: it says
nobody has looked, not that the domain does not exist.

That single rule is why the tier can exist. It also means:

- One domain per call. There is no bulk argument and no bulk tool.
- No history. The dated series is the product and it cannot be backfilled by
  anyone who did not collect it.
- No list tool, no search tool, no ranking. You have to know the name already.

A free [Domduck account](https://domduck.com) adds the history, unlimited tracked
domains with a daily re-read of every source, tags, alerts, the write tools, and
240 requests a minute instead of 10.

## Tools

| Tool | Writes | What it does |
|---|---|---|
| [`lookup_domain`](#lookup-domain) | no | Public reputation snapshot for one domain from Domduck's store: Domain Rating, Tranco rank, OpenPageRank, registration date, TLS certificate state and AI crawler policy. |
| [`get_ai_crawler_policy`](#get-ai-crawler-policy) | no | Which of the eight tracked AI crawlers a domain's robots.txt admits, and whether it publishes an llms.txt. |
| [`list_sources`](#list-sources) | no | What Domduck reads and what each source means, including the eight AI crawlers whose robots.txt policy is tracked. |

### A worked call

```bash
curl -s https://domduck.com/api/mcp/public \
  -H "content-type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"get_ai_crawler_policy","arguments":{"domain":"stripe.com"}}}'
```

### lookup_domain

Public reputation snapshot for one domain from Domduck's store: Domain Rating, Tranco rank, OpenPageRank, registration date, TLS certificate state and AI crawler policy. Returns hasReading false for a domain nobody has looked up yet, which is a real answer and not an error. One domain per call, and no history: the dated series is what a Domduck account is for.
| Argument | Type | Required | Notes |
|---|---|---|---|
| `domain` | `string` | yes | A domain name. Scheme, www and trailing dots are stripped. |

### get_ai_crawler_policy

Which of the eight tracked AI crawlers a domain's robots.txt admits, and whether it publishes an llms.txt. Three states per agent: allowed, disallowed, unspecified. Unspecified is NOT allowed, because a catch-all Disallow blocks an agent the file never names, so read `effective` for what is in force. Reads the last stored reading; it does not fetch the file.
| Argument | Type | Required | Notes |
|---|---|---|---|
| `domain` | `string` | yes | A domain name. Scheme, www and trailing dots are stripped. |

### list_sources

What Domduck reads and what each source means, including the eight AI crawlers whose robots.txt policy is tracked. A constant. Read it first: it is what lets a model interpret lookup_domain without guessing at field names or at which direction is better.
Takes no arguments.

