# atproto.md

A read-only, markdown-first API for exploring the full AT Protocol ecosystem.
Works with **any collection on any PDS** — first-party Bluesky or third-party lexicons.

---

## URL Structure

URLs accept `at://` URIs directly in the path:

```
GET https://atproto.md/at://did:plc:eob75vcjtmbaef2tn4evc4sl
GET https://atproto.md/at://did:plc:eob75vcjtmbaef2tn4evc4sl/app.bsky.feed.post
GET https://atproto.md/at://did:plc:eob75vcjtmbaef2tn4evc4sl/app.bsky.feed.post/{rkey}

GET https://atproto.md/at://alice.bsky.social
GET https://atproto.md/at://alice.bsky.social/com.whtwnd.blog.entry
```

---

## Endpoints

### `GET https://atproto.md/resolve/{actor}`
Full identity chain: handle → DID → DID document → PDS endpoint.

### `GET https://atproto.md/at://{actor}`
Repo overview. Lists all collections present in the repo.

### `GET https://atproto.md/at://{actor}/{collection}`
List records in any collection on any PDS.

**Query params:**
- `limit` — Records per page (default: 25, max: 100)
- `cursor` — Pagination cursor
- `reverse` — `true` for oldest-first

### `GET https://atproto.md/at://{actor}/{collection}/{rkey}`
Fetch a single record by rkey.

---

## Rich formatting for known collections

| Collection                                      | Notes                              |
| ----------------------------------------------- | ---------------------------------- |
| `app.bsky.feed.post`                            | Text, embeds, reply context        |
| `app.bsky.actor.profile`                        | Bio, display name                  |
| `app.bsky.graph.follow/block/list/listitem`     | Subjects, timestamps               |
| `app.bsky.feed.like/repost/generator`           | Subjects, timestamps               |
| `app.bsky.labeler.service`                      | Label policies                     |
| `site.standard.publication`                     | Name, URL, description             |
| `site.standard.document`                        | Title, content, published date     |
| `pub.leaflet.publication/document`              | Name, URL, content from pages      |
| `app.offprint.publication/document.article`     | References to standard records     |
| `blog.pckt.publication`                         | Reference to standard record       |
| `link.woosh.linkPage`                           | Description, labeled link sections |
| `blue.linkat.entry`                             | Title, URL, description            |
| `events.smokesignal.calendar.event`             | Name, dates, location              |
| *Any other collection*                          | Generic key-value markdown         |

---

## For LLM agents

- **[`/skill.md`](https://atproto.md/skill.md)** — Full agent skill sheet with usage triggers, examples, and endpoint reference
- **[`/llms.txt`](https://atproto.md/llms.txt)** — Structured API summary for LLM discovery
- **`/mcp`** — MCP server endpoint. Install in Claude Code: `claude mcp add --transport http atproto-md https://atproto.md/mcp`

---

## Contributing

Missing a collection formatter? [Open an issue](https://tangled.org/socialde.pt/atproto.md/issues) or [contribute a formatter](https://tangled.org/socialde.pt/atproto.md/) — adding one is just a few lines of TypeScript.

---

*Data fetched directly from AT Protocol PDSes via `com.atproto.repo.*`*
*No authentication. Public data only.*
