A lightweight, command-line Bluesky client that makes it easy to interact with the Bluesky social network from your terminal.
- π Simple authentication and session management
- π Post, reply, quote, and repost content
- π Search posts and users
- π₯ Follow/unfollow users
- π View timelines and profiles
- πΌοΈ Support for images and link cards
- π¦ Linux shell friendly output formats
pip install sskyssky login your-handle.bsky.social:your-passwordOr set credentials via environment variable:
export SSKY_USER=your-handle.bsky.social:your-password# Simple post
ssky post "Hello, Bluesky!"
# Post with images
ssky post "Check out these photos!" --image photo1.jpg --image photo2.jpg
# Reply to a post
ssky post "Great post!" --reply-to at://did:plc:.../app.bsky.feed.post/...
# Quote a post
ssky post "Interesting!" --quote at://did:plc:.../app.bsky.feed.post/...# View your timeline
ssky get
# View your timeline with full threads
ssky get --thread
# Get specific post with its thread
ssky get at://did:plc:.../app.bsky.feed.post/... --thread
# Get user's posts as threads with custom depth
ssky get user.bsky.social --thread --thread-depth 5 --thread-parent-height 2
# View someone's profile
ssky profile user.bsky.social
# Search posts
ssky search "keyword"
# Search users
ssky user "username"# Follow a user
ssky follow user.bsky.social
# Repost a post
ssky repost at://did:plc:.../app.bsky.feed.post/...
# Delete a post
ssky delete at://did:plc:.../app.bsky.feed.post/...Retrieve posts along with their complete conversation threads:
# Get timeline with full threads (each post expanded to its thread)
ssky get --thread
# Get specific post's thread
ssky get at://did:plc:.../app.bsky.feed.post/... --thread
# Get user's posts as threads
ssky get user.bsky.social --thread
# Control thread depth (default: 10 replies deep)
ssky get --thread --thread-depth 5
# Include parent posts (default: 0 parents)
ssky get --thread --thread-parent-height 2
# Save threads to files
ssky get --thread --output ./threadsThread Output Formatting:
- Short/ID format (
-S,-I): Reply lines prefixed with"| " - Long/Text format (
-L,-T): Posts within thread separated by"|", independent threads by"----------------" - JSON/simple-json: Cannot be used with
--thread(returns error)
# Get only post IDs
ssky get --id
# Get only text content
ssky get --text
# Get full JSON output
ssky get --json
# Get simplified JSON with facets metadata (ideal for programmatic access)
ssky get --simple-json
# Save posts to files
ssky get --output ./postsThe --simple-json format includes structured facets metadata for rich text features:
- links: URLs with byte positions and text
- mentions: User mentions with handles, DIDs, and byte positions
- tags: Hashtags with byte positions and text
Example output:
{
"status": "success",
"data": [{
"uri": "at://...",
"cid": "...",
"author": {
"did": "did:plc:...",
"handle": "user.bsky.social",
"display_name": "User Name",
"avatar": "https://..."
},
"text": "Check out https://example.com @user.bsky.social #bluesky",
"created_at": "2024-01-01T00:00:00.000Z",
"facets": {
"links": [
{
"url": "https://example.com",
"byte_start": 10,
"byte_end": 30,
"text": "https://example.com"
}
],
"mentions": [
{
"handle": "user.bsky.social",
"did": "did:plc:...",
"byte_start": 31,
"byte_end": 49,
"text": "@user.bsky.social"
}
],
"tags": [
{
"tag": "bluesky",
"byte_start": 50,
"byte_end": 58,
"text": "#bluesky"
}
]
}
}]
}# Reply to your last post
ssky post "Update!" --reply-to $(ssky get myself --limit 1 --id)
# Search your own posts
ssky search "keyword" --author myself
# Save your timeline to files
ssky get --output ./timelinessky provides comprehensive MCP (Model Context Protocol) tools for seamless integration with Cursor Agent, enabling AI-powered Bluesky interactions directly in your development environment.
Features:
- π 10 comprehensive tools: Complete Bluesky functionality
- π€ AI-optimized: Long format defaults for better AI understanding
- π§ Full feature support: Posts with images, quotes, replies, search, social actions
- β‘ Real-time integration: Direct Bluesky interaction from Cursor
Quick Setup:
# For new MCP setup: copy sample configuration (no build required!)
mkdir -p .cursor
cp mcp/mcp.sample.json .cursor/mcp.json
# Set your Bluesky credentials
export SSKY_USER=your-handle.bsky.social:your-password
# Restart Cursor to load the MCP tools⨠Docker will automatically pull the pre-built image on first use!
Advanced Setup:
- For existing MCP setup: Add ssky server to your
.cursor/mcp.json(seemcp/mcp.sample.json) - For local development: Use
cd mcp && ./build.sh && cd ..to build locally - Complete guide: See MCP Documentation
Available Tools:
ssky_get,ssky_search,ssky_user,ssky_profile- Content retrievalssky_post- Content creation with images/quotes/repliesssky_follow,ssky_unfollow,ssky_repost,ssky_unrepost- Social actionsssky_delete- Content management
π Complete MCP Documentation
For development using VS Code Dev Containers:
-
Copy the environment configuration file and set your Bluesky credentials:
cp .env.local.sample .env.local
Edit
.env.localand add your Bluesky handle and password:SSKY_USER=your-handle.bsky.social:your-password SSKY_SKIP_REAL_API_TESTS=1
-
The dev container automatically:
- Loads environment variables from
.env.local - Installs Claude Code extension
- Sets up Python 3.12 environment with Docker support
- Loads environment variables from
To run the tests in the tests/ directory:
-
Copy the environment configuration file and set your Bluesky credentials:
cp tests/_env tests/.env
Edit
tests/.envand add your Bluesky handle and password. -
Run tests using pytest:
# Run all tests pytest tests/ -v # Run individual feature tests pytest tests/test_login.py -v # Login functionality pytest tests/test_post_and_delete.py -v # Post and delete operations pytest tests/test_search.py -v # Search functionality pytest tests/test_follow_unfollow.py -v # Follow/unfollow operations pytest tests/test_get.py -v # Timeline retrieval pytest tests/test_profile.py -v # Profile display pytest tests/test_repost_unrepost.py -v # Repost/unrepost operations pytest tests/test_user.py -v # User functionality
- Python 3.12 or later