toolspace › registry › Muninn Bluesky Card
Muninn Bluesky Card
Compose and publish Bluesky posts with rich link-card embeds (Open Graph preview). Python module; app-password auth; reads arbitrary URLs to extract OG metadata, then posts via the authenticated PDS.
Install
install-manifest install https://raw.githubusercontent.com/oaustegard/muninn-utilities/main/manifests/bsky-card/muninn-bsky-card.v0.4.json
manifest JSON · source · docs · issues · homepage
Security
| Kill switch | url Manual: revoke at |
|---|---|
| Smoke contract | action-call action |
Scopes
-
atproto.reporead, write app-password (coarse)Creates and deletes records (app.bsky.feed.post) in the user's repo, and uploads blob attachments for card thumbnails.
-
atproto.identityread app-password (coarse)Resolves the user's handle to a DID at startup so the smoke test can confirm auth resolves to the expected account.
-
net.outboundread *Two outbound destinations: (1) the configured PDS (default bsky.social) for atproto operations, and (2) ARBITRARY user-supplied URLs fetched server-side to extract Open Graph metadata. The second is the wider blast radius — any URL the agent shares is fetched by this tool.
Data boundary
Reads
atproto.repo.postssensitivity: lowexternal.url_contentsensitivity: low
Transmits
-
bsky.social persistent-indefinite
publish post + OG-card thumbnail blob to user's PDS; PDS federates publicly to the network firehose. Posts are public by design.
atproto.repo.posts/textatproto.repo.posts/embed.external.uriatproto.repo.posts/embed.external.titleatproto.repo.posts/embed.external.descriptionatproto.repo.posts/embed.external.thumb
-
— unknown
fetch OG metadata and thumbnail image from the caller-supplied URL
input.urlfetched.og_image_url
Persists
Nothing persisted by the tool itself.
Tool-local retention: 0 day(s).
Actions
-
whoami read idempotent
Authenticate, resolve handle to DID, and return both. Read-only. ·
atproto.identity- Goal
- Verify auth and confirm the configured handle resolves to a real DID.
- Inputs
(none)- Outputs
{handle, did, pds}- Errors
auth_invalid, handle_not_found, network_unreachable- Example
whoami
-
post_link destructive
Post a URL to Bluesky with an automatically-generated link card. ·
atproto.reponet.outbound- Goal
- Share a URL on Bluesky with a proper card preview.
- Inputs
text (≤300 graphemes), url, og_overrides? (manual title/description/image), languages? (BCP-47 array)- Outputs
{uri, cid, url}- Errors
text_too_long, url_unreachable, blob_upload_failed, auth_invalid, rate_limited- Example
post_link text='New post on the manifest spec' url='https://muninn.austegard.com/perch/...'
-
delete_post destructive idempotent
Delete a previously-created post by AT-URI. ·
atproto.repo- Goal
- Retract a Bluesky post by AT-URI.
- Inputs
uri (at:// URI from post_link)- Outputs
{uri, deleted: true}- Errors
uri_invalid, not_owned, auth_invalid- Example
delete-post uri='at://did:plc:abc.../app.bsky.feed.post/3l5...'
Verify & cost
| Verify suite | — · — cases · pass ≥ — |
|---|---|
| SLA | p50 1200 ms · p95 4000 ms · max error rate 0.05 |
| Schedule | cadence: weekly · on install: no |
| Install fee | 0¢ |
| Monthly fee | 0¢ |
| Usage model | none |
Runtime
runtime: python-module · install method: preinstalled · entrypoint: python -m muninn_utils.bsky_card
Library that an orchestrating agent calls to share a URL on Bluesky with a proper link card. Workflow: fetch the target URL, extract Open Graph tags, upload the card thumbnail as a blob to the user's PDS, compose UTF-8 facets for any inline links, and create the post via com.atproto.repo.createRecord. Auth is a Bluesky app password (created at bsky.app/settings/app-passwords); the password grants write access to everything except DMs and account deletion. The tool itself stores nothing; ephemeral session JWTs live only in the calling process's memory. First in the consumer-test series for install-manifest-spec v0.3 — see the muninns-inbox discussion #1 thread for the findings the writeup surfaced. Manifest moved here (from muninns-inbox/manifests/) per issue #5 — the round-1 venue mistake. Auth is supplied by the caller as an `auth` dict (`handle`, `did`, `access_jwt`); this utility reads no BSKY_* env vars directly.
Tags: blueskyatprotosocialpostinglink-card
License: MIT
Last fetched 2026-06-18T09:09:16Z (live)