Skip to main content
Glama

Taproot: AT Protocol MCP

Server Details

Read public AT Protocol profiles, records, threads, backlinks and lexicons. No API key required.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over the last 24 hours
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL
ChatGPT
–
Claude
–

TDQS

A3.7/5.0

Scored across 27 tools

Disambiguation4/5

Most tools have distinct resource-and-action targets, and the descriptions carefully separate near neighbors such as get_backlinks vs list_backlink_records and count_repos_by_collection vs list_repos_by_collection. However, resolve, get_profile, get_record, and get_did_document still overlap in retrieving identity/repo data, so some misselection is possible.

Naming Consistency4/5

Nearly all names use lowercase snake_case with a clear action prefix (get_, list_, search_, count_, verify_), and there is no camelCase/snake_case mixing. The only mild deviation is the bare resolve, which lacks a noun but remains readable.

Tool Count3/5

27 tools is heavy and above the usual well-scoped range, but the broad AT Protocol read surface explains many of them. Some count/list/get variants could be consolidated, making the set borderline rather than clearly excessive.

Completeness4/5

The read-only inspection surface is broad, covering accounts, repos, records, blobs, backlinks, labels, lexicons, PDS/relay metadata, and handle verification. Write operations are absent, but that seems intentional for an introspection server; minor gaps remain around social-graph and feed/post search.

Available Tools

27 tools
count_recordsA
Read-only
Inspect

Count the total records in an account's collection (e.g. how many likes a user has given). Scans server-side so you don't page manually. AT Protocol has no cheap exact count, so for very large collections this returns exact:false with a lower-bound count and a cursor,call again with that cursor and ADD the counts to keep going.

Inputs: repo (required), collection (required), cursor. Returns: object

count_repos_by_collectionA
Read-only
Inspect

Count how many accounts across the network publish a given collection/lexicon,e.g. 'how many accounts have an at.glean.subscription?'. Walks a relay's com.atproto.sync.listReposByCollection with NO per-account handle resolution, so it's cheap and returns an exact total for typical collections. For very large collections it returns exact:false with a cursor,call again with that cursor and ADD the counts (like count_records). Relay-served (defaults to the public Bluesky relay; pass relay for another).

Inputs: collection (required), relay, cursor. Returns: object

describe_pdsA
Read-only
Inspect

Describe a Personal Data Server: its DID, whether registration requires an invite, the handle domains you can register there, and ToS/contact links. Works for any PDS, not just Bluesky. Input is the PDS origin (e.g. https://pds.example.com).

Inputs: pds (required). Returns: object

get_account_historyA
Read-only
Inspect

An account's history from its PLC audit log: handle changes, PDS migrations, signing-key rotations, and creation time. did:plc accounts only (did:web has no PLC log). Input is a handle or DID.

Inputs: actor (required). Returns: object

get_blob_infoA
Read-only
Inspect

Get metadata for a single blob: its canonical PDS getBlob URL plus a best-effort content-type and byte size (via a HEAD request). Returns the URL, never the bytes. Use to turn a blob ref (CID) found in a record into a downloadable link and learn what it is. Input is the owning repo (handle or DID) and the blob CID.

Inputs: cid (required), repo (required). Returns: object

get_did_documentA
Read-only
Inspect

Fetch the raw DID document for any DID or handle: all aliases (alsoKnownAs), every service entry (PDS, labeler, custom AppView), and verification methods. Broader than get_profile, and works for did:web accounts. Input is a handle or DID.

Inputs: actor (required). Returns: object

get_latest_commitA
Read-only
Inspect

The current head commit of an account's repository (com.atproto.sync.getLatestCommit): its commit CID and revision. The cheapest way to fingerprint a repo or detect whether it changed since you last looked, without downloading data. Complements get_repo_status (which has the rev but not the commit CID). Input is a handle or DID.

Inputs: repo (required). Returns: object

get_pds_directory_infoA
Read-only
Inspect

A cached health card for a PDS from pds.directory: version, DID, approximate user count, reachability, last-checked time, available domains, and which relays index it. Input is the PDS hostname (e.g. pds.example.com). Best-effort/cached data.

Inputs: hostname (required). Returns: object

get_profileB
Read-only
Inspect

Get an account's repository overview (handle, DID, PDS, and the list of collections it contains). Input is a handle or DID.

Inputs: actor (required), include. Returns: object

get_recordA
Read-only
Inspect

Fetch a single record by its full at:// URI (must include collection and rkey). Returns the record's value, CID, and resolved identity.

Inputs: uri (required), include. Returns: object

get_relay_directory_infoA
Read-only
Inspect

A cached overview of a relay from firehose.directory: counts of PDSes it indexes (total/active/offline/banned) and total accounts. Input is the relay hostname (e.g. bsky.network). Best-effort/cached data.

Inputs: hostname (required). Returns: object

get_repo_statusA
Read-only
Inspect

Liveness/moderation status of an account's repository: whether it is active, its current revision, and any takedown/suspended/deactivated/deleted state. Answers 'has @alice been taken down?' which get_profile can't. Input is a handle or DID.

Inputs: repo (required). Returns: object

get_threadA
Read-only
Inspect

Reconstruct the conversation around a post: its ancestor chain up to the thread root (following reply.parent, root-first) PLUS a bounded descendant reply TREE,replies, replies-to-replies, and so on, each tagged with its depth and parent,walked breadth-first and capped for cost. NOTE: descendant expansion assumes the Bluesky reply model (app.bsky.feed.post with reply.parent); ancestor walking follows reply.parent generically, but the reply tree is specific to that lexicon and will be empty for record types that model replies differently. Answers 'show me this whole conversation / what is this replying to?'. If the tree is truncated, use list_backlink_records on a specific post's URI to expand it further. Input is a post's at:// URI.

Inputs: uri (required). Returns: object

list_blobsA
Read-only
Inspect

List the blobs (uploaded media/attachments,images, video, etc.) hosted in an account's repository, via com.atproto.sync.listBlobs. Returns each blob's CID and its canonical PDS getBlob URL (PDS-native, works for any PDS,not a CDN). Answers 'what media does this account host?'. Records reference blobs by CID; use this (or get_blob_info) to turn a CID into a fetchable URL. Input is a handle or DID.

Inputs: repo (required), limit, cursor. Returns: object

list_labelersA
Read-only
Inspect

List the labeler (moderation) services known to the labeler relay,each labeler's DID, resolved handle, and service endpoint. The discovery step BEFORE query_labels, which needs a labeler DID/handle up front: use this to find moderation.bsky.app and any third-party/regional labelers, then pass one to query_labels.

Inputs: limit, cursor. Returns: object

list_recordsB
Read-only
Inspect

List records in a collection for an account, with pagination. Provide the repo (handle or DID) and the collection NSID (e.g. app.bsky.feed.post).

Inputs: repo (required), collection (required), limit, cursor. Returns: object

list_reposA
Read-only
Inspect

List the accounts (repositories) hosted on a PDS, via com.atproto.sync.listRepos: each repo's DID and active/takedown status, paginated. Answers 'who is hosted on this PDS?' / 'how many accounts does this PDS have?'. By default returns DIDs only (one request, large page — best for counting); pass enrich=true to also resolve handles (slower, smaller page). Input is the PDS origin (e.g. https://pds.example.com). Works for any PDS.

Inputs: pds (required), limit, cursor, enrich. Returns: object

list_repos_by_collectionA
Read-only
Inspect

Network-wide: which accounts publish a given collection/lexicon,e.g. 'who has an app.bsky.feed.generator (a custom feed)?' or who uses a custom lexicon. Via a relay's com.atproto.sync.listReposByCollection (anonymous). By default returns DIDs only (one request, large page); pass enrich=true to also resolve handles (slower, smaller page). For just a total, use count_repos_by_collection. NOTE: relay-served (defaults to the public Bluesky relay; pass relay to query another), not the account's own PDS. Pairs with search_lexicons / resolve_lexicon.

Inputs: collection (required), limit, relay, cursor, +1 more. Returns: object

query_labelsA
Read-only
Inspect

What moderation labels a labeler has applied to a subject (com.atproto.label.queryLabels),e.g. 'has @alice or this post been labeled spam/nsfw/hidden by labeler X?'. Anonymous and service-agnostic: the labeler's own service endpoint is found from its DID document (no hardcoded aggregator). Subject is a DID/handle (account labels) or an at:// URI (record labels); labeler is the handle or DID of a labeler service (e.g. moderation.bsky.app).

Inputs: labeler (required), subject (required), limit, cursor. Returns: object

resolveA
Read-only
Inspect

Resolve any AT Protocol identifier to JSON. Accepts an at:// URI (at:////), a bare handle (alice.bsky.social), or a DID (did:plc:...). Returns a profile, a collection page, or a single record depending on how specific the input is. PDS-agnostic: works for any AT Protocol PDS, not just Bluesky.

Inputs: uri (required), limit, cursor, include. Returns: object

resolve_lexiconA
Read-only
Inspect

Explain what a record type means by resolving its lexicon schema. Input is a collection NSID (e.g. app.bsky.feed.post). Returns the schema's description and definition.

Inputs: nsid (required). Returns: object

search_accountsA
Read-only
Inspect

Search for AT Protocol accounts by handle or display name (paginated, via the Bluesky AppView app.bsky.actor.searchActors, so accounts unknown to that index may be missing). Returns candidate accounts with DID + handle, to turn a name into a DID. Results are search CANDIDATES, not verified handle-to-DID mappings: call verify_handle before trusting that a handle really belongs to a DID (resolve/get_profile only confirm an account exists, not that the handle is authentic).

Inputs: query (required), limit, cursor. Returns: object

search_lexiconsA
Read-only
Inspect

Browse or search the registry of published AT Protocol lexicon schemas. The response's total field is the exact registry size and matched is the exact match count. Substring matches the NSID or description (query 'profile' → anything containing 'profile'); prefix the query with a DOT for a suffix match (query '.profile' → only NSIDs ENDING in .profile, i.e. profile record types). Filter by schema kind with type — 'give me every space lexicon' is type='space' with NO query, since an NSID does not imply its type (space.saebyeok.permissionSet is a permission set; app.kimbia.circle is a space). Types: the spec's primary types are record, query, procedure, subscription, and permission-set; a main def may also be a non-primary type (object, token, string); space comes from proposal 0016 (permissioned data), which is not in the ratified spec; defs-only marks a schema file with no main definition. Every response carries a typeCounts breakdown of the returned matches (it sums to matched), so one call with no arguments shows which kinds exist and how many; when you filter by type, otherTypes reports what the filter excluded, so a too-narrow or misspelled type still shows you the real options. Without a query or type, returns the total plus a sample. Results are paginated by limit; to see matches beyond the first page, call again with the offset printed at the end of the list. Use resolve_lexicon for a specific schema's full definition.

Inputs: type, limit, query, offset. Returns: object

verify_handleA
Read-only
Inspect

Bidirectionally verify that a handle is really owned by its DID, via DNS TXT and HTTPS well-known. Returns whether each method passed. Use this to check for impersonation/spoofing,search results and resolve give candidates, this gives cryptographic binding.

Inputs: handle (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      Enables LLMs to interact with the AT Protocol ecosystem, including Bluesky, through natural language. Supports public data access without authentication and full write operations with authentication.
      51
      127 npm
      10
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      A read-only MCP server for Bluesky that provides tools to access profiles, posts, feeds, and notifications using AT Protocol.
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      A read-only MCP server for safely exploring Nostr, enabling agents to resolve identifiers, fetch profiles and events, query notes, and inspect relay metadata. It does not accept private keys or publish events.
      5
      10 npm
      MIT
    Try in Browser

    Glama MCP Gateway

    Add one secure layer between your agents and this server.

    Resources