Taproot: AT Protocol MCP

com.atproto-mcp由 atproto-mcp.com 发布v1.0.0更新于 Oct 24, 2026

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

已验证Streamable HTTP可网页运行网页搜索与抓取知识与记忆安全与监控

概览

AI 生成的概览

一个远程 MCP 服务器,用于读取公开的 AT Protocol 数据:个人资料、记录、帖子串、反向链接、词库、PDS 与中继目录以及审核标签。

可以做什么
解析 handle、DID 和 at:// URI,读取个人资料、单条记录和分页的集合列表,并获取记录数量与仓库状态或提交指纹。重建帖子会话串,查询入站反向链接,包括点赞、转发、引用、回复和关注背后的账号。搜索账号,浏览或解析词库 schema,并描述 PDS、中继及其托管的账号。校验 handle 归属、DID 文档、来自 PLC 审计日志的账号历史,以及审核标签和标签服务。将 at:// URI 转换为可分享的网页链接,并列出或查看仓库中托管的媒体 blob。
适用场景
当助手需要在不编写 API 代码的情况下查询或核实公开的 AT Protocol 与 Bluesky 数据时适用,例如查看某个账号、帖子串、记录类型、服务器,或谁与某内容发生了互动。
运行要求
远程 streamable HTTP 端点;未声明需要 API 密钥或账号。需要能访问该端点及其查询的 AT Protocol 服务。
安装前请注意
仅对公开数据进行只读查询,但查询会发送给第三方服务(PDS、中继、Bluesky AppView、Constellation、pds.directory、firehose.directory、标签服务)。部分结果为尽力而为或缓存数据,账号搜索返回的是候选而非已验证的 handle;在信任某个身份前应使用 handle 验证工具。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Taproot: AT Protocol MCP,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/com.atproto-mcp%2Ftaproot/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "taproot-at-protocol": {
      "type": "http",
      "url": "https://mcp.atproto.at/mcp"
    }
  }
}

工具

27

resolve

Resolve any AT Protocol identifier to JSON. Accepts an at:// URI (at://<did-or-handle>/<collection>/<rkey>), 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.

输入参数uri必填limitcursorinclude

get_profile

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

输入参数actor必填include

get_record

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

输入参数uri必填include

list_records

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).

输入参数repo必填limitcursorcollection必填

count_records

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.

输入参数repo必填cursorcollection必填

search_accounts

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).

输入参数limitquery必填cursor

get_account_history

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.

输入参数actor必填

search_lexicons

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.

输入参数typelimitqueryoffset

resolve_lexicon

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.

输入参数nsid必填

describe_pds

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).

输入参数pds必填

list_repos

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.

输入参数pds必填limitcursorenrich

get_repo_status

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.

输入参数repo必填

get_latest_commit

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.

输入参数repo必填

verify_handle

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.

输入参数handle必填

get_did_document

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.

输入参数actor必填

get_pds_directory_info

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.

输入参数hostname必填

get_relay_directory_info

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.

输入参数hostname必填

query_labels

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).

输入参数limitcursorlabeler必填subject必填

list_repos_by_collection

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.

输入参数limitrelaycursorenrichcollection必填

count_repos_by_collection

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).

输入参数relaycursorcollection必填

list_blobs

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.

输入参数repo必填limitcursor

get_blob_info

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.

输入参数cid必填repo必填

list_labelers

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.

输入参数limitcursor

get_thread

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.

输入参数uri必填

版本历史

1
  1. v1.0.0最新Sep 16, 2026

评分

已满足适用检查项的 83%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分

    请声明包含 README 的 GitHub 仓库,或在 OAuth 受保护资源元数据中提供 resource_documentation。

  • 许可证不适用

    托管服务按其提供方的条款使用,因此这里不要求许可证。此检查项不计入百分比。