Tl.
Command-line tools
Thirty binaries across fourteen crates. Most sit behind the clap feature, which is off by default, so a library never pulls in an argument parser you did not ask for.
§ 01
Building them
Build the whole set once and put them on your path, or run them ad hoc through cargo run. The workspace build produces the SQLite storage profile; see the PDS guide if you need the fjall one.
cargo build --features clap --bins
# Or install a single tool from the registry:
cargo install atproto-identity --features clap,hickory-dns
§ 02
Reference
Every binary in the workspace, with the crate it belongs to and the features it needs.
| Binary | Features | Does |
|---|---|---|
| atproto-identity-resolve | clap, hickory-dns | Resolve a handle or DID to its canonical identifier, optionally printing the DID document. |
| atpdid | clap, hickory-dns | Short-form identity resolution, for when you are typing it repeatedly. |
| atproto-identity-key | clap | Generate a P-256, P-384 or K-256 key. |
| atproto-identity-sign | clap | Sign a JSON file with a private key. |
| atproto-identity-validate | clap | Verify a signature against a public key. |
| atproto-identity-plc-audit | clap, hickory-dns | Read a did:plc operation log and audit its history. |
| atproto-identity-plc-fork-viz | clap, hickory-dns | Visualise forks in a PLC operation log. |
| Binary | Features | Does |
|---|---|---|
| atpcid | clap | Compute the DAG-CBOR CID of a JSON value. |
| atproto-dasl | clap | Convert between JSON and DAG-CBOR hex, both directions. |
| atproto-record-cid | clap | Record CID from JSON on stdin. |
| atptid | clap | Generate TIDs; -n for a batch. |
| atproto-repo-car | clap | Inspect a CAR v1 archive — roots, blocks, sizes. |
| atproto-repo-mst | clap | Walk the Merkle Search Tree inside an archive. |
| Binary | Features | Does |
|---|---|---|
| atproto-attestation-sign | clap, tokio | Produce an inline or remote attestation over a record. |
| atproto-attestation-verify | clap, tokio | Verify an attestation, including the repository binding. |
| atproto-lexicon-resolve | clap, hickory-dns | Resolve an NSID through DNS and XRPC to its schema. |
| atproto-extras-parse-facets | clap, cli, hickory-dns | Parse mentions, URLs and hashtags out of text into facets. |
| Binary | Features | Does |
|---|---|---|
| atproto-client-auth | clap | Create and refresh a session from an identifier and password. |
| atproto-client-app-password | clap | Make an XRPC call with an app-password bearer token. |
| atproto-client-dpop | clap | Make an XRPC call with a DPoP-bound token. |
| atproto-client-put-record | clap | Write a record into a repository. |
| atpxrpc | — | General XRPC client with persistent sessions. |
| atproto-oauth-service-token | clap | Mint and inspect OAuth service tokens. |
| atproto-oauth-tool | clap | Drive a login flow end to end from the terminal. |
| Binary | Features | Does |
|---|---|---|
| atproto-jetstream-consumer | clap | Stream Jetstream events with filtering and optional compression. |
| atproto-tap-client | clap | Stream verified TAP events as JSON; manage tracked repositories. |
| atproto-tap-extras | clap | Bulk-add a DID’s social graph to TAP tracking. |
| pds | clap + profile | The Personal Data Server. See the operator guide. |
| atproto-pds-admin | clap + profile | Invite codes, account inspection, takedowns. |
| atpmcp | — | MCP server over stdio exposing create_record_cid. |
§ 03
Worked invocations
Copied from the workspace README, which is the version that gets exercised.
cargo run --features clap,hickory-dns \
--bin atproto-identity-resolve -- alice.bsky.social
cargo run --features clap --bin atproto-identity-key -- generate p256
cargo run --features clap \
--bin atproto-identity-sign -- did:key:... data.json
cargo run --features clap \
--bin atproto-identity-validate -- did:key:... data.json signature
cargo run --features clap,hickory-dns \
--bin atproto-identity-plc-audit -- did:plc:...
cargo run --features clap,hickory-dns \
--bin atproto-identity-plc-fork-viz -- did:plc:...
cargo run --package atproto-dasl --features clap \
--bin atpcid -- '{"text":"hello"}'
# JSON in, DAG-CBOR hex out — and back again.
echo '{"text":"hello","likes":1}' | atproto-dasl encode
echo 'a2656c696b6573016474657874656...' | atproto-dasl decode
cat record.json | cargo run --features clap --bin atproto-record-cid
cargo run --package atproto-record --features clap --bin atptid -- -n 5
cargo run --package atproto-repo --features clap \
--bin atproto-repo-car -- ls repo.car
cargo run --package atproto-repo --features clap \
--bin atproto-repo-mst -- ls repo.car
cargo run --package atproto-attestation --features clap,tokio \
--bin atproto-attestation-sign -- \
inline record.json did:key:... metadata.json
cargo run --package atproto-attestation --features clap,tokio \
--bin atproto-attestation-verify -- signed_record.json
cargo run --features clap,hickory-dns \
--bin atproto-lexicon-resolve -- app.bsky.feed.post
cargo run --features clap \
--bin atproto-client-auth -- login alice.bsky.social password123
cargo run --features clap --bin atproto-client-app-password -- \
alice.bsky.social access_token /xrpc/com.atproto.repo.listRecords
cargo run --features clap --bin atproto-client-dpop -- \
alice.bsky.social did:key:... access_token \
/xrpc/com.atproto.repo.listRecords
cargo run --package atproto-oauth-axum --features clap \
--bin atproto-oauth-tool -- login did:key:... alice.bsky.social
cargo run --package atpxrpc --bin atpxrpc -- --help
cargo run --features clap --bin atproto-jetstream-consumer -- \
jetstream1.us-east.bsky.network dictionary.zstd
cargo run --package atproto-tap --features clap \
--bin atproto-tap-client -- --help
cargo run --package atproto-tap --features clap \
--bin atproto-tap-extras -- --help
§ 04
The MCP server
atpmcp speaks JSON-RPC 2.0 over stdio and exposes one tool, create_record_cid. It exists so an assistant can compute a real DAG-CBOR CID instead of producing something that looks like one.
{
"mcpServers": {
"atpmcp": {
"command": "/path/to/target/release/atpmcp"
}
}
}
cargo build -p atpmcp --release