loading…
Search for a command to run...
loading…
An MCP server that enables users to interact with the Bluesky social network through comprehensive read and write API tools, including session management and ti
An MCP server that enables users to interact with the Bluesky social network through comprehensive read and write API tools, including session management and timeline navigation. It also features a Jetstream-powered local SQLite database for indexing and searching Japanese posts.
このリポジトリは、Bluesky の API を操作するための MCP(Model Context Protocol)サーバー(FastMCP)と、動作確認用の簡易クライアントを提供します。
Python パッケージは src/mcpbluesky/ 配下にあり、サーバーは mcpbluesky.server をエントリポイントとして起動します。
pyproject.toml は Hatchling(PEP 517/518)でビルドする構成で、インストールすると mcpbluesky という コンソールスクリプト(mcpbluesky = mcpbluesky.server:main)が導入されます。
sessions.json にアクセストークン/リフレッシュトークン等を保存acting_handle 引数の省略時に使う デフォルトハンドルを保持主要ファイルは src/mcpbluesky/ にあります。
src/mcpbluesky/server.pySessionManager(複数ユーザーセッションのロード/セーブ/選択)bsky_search_local_posts の提供src/mcpbluesky/tools_bluesky.pybsky_*)の登録acting_handle による「どのログインセッションで実行するか」の切替src/mcpbluesky/bluesky_api.pyBlueskyAPI(HTTP 呼び出しの薄いラッパ)BlueskySession(accessJwt/refreshJwt/did/handle/pds_url)src/mcpbluesky/common_http.pyurllib.request ベースの HTTP 実装(requests 非依存)src/mcpbluesky/bluesky_db.pylangs に ja、または ひらがな/カタカナ正規表現)src/mcpbluesky/client.pylist_tools() と bsky_get_profile を呼ぶ動作確認用サンプルserver.py)の挙動SessionManager)sessions.json に永続化されます。SessionManager.default_handle を保持し、各ツールの acting_handle が省略された場合に そのデフォルトのセッションを使います。SessionManager.get_api(handle=None)BlueskyAPI を返すBlueskyAPI を返します(この場合 auth_params() により https://public.api.bsky.app を使用)--jetstream を付けた場合のみ Jetstream を別スレッドで起動し、
wss://jetstream1.us-east.bsky.network/subscribe?wantedCollections=app.bsky.feed.post を購読します。kind == "commit" かつ operation == "create" の投稿のみを対象にし、
BlueskyDB.is_japanese(text, langs) が True のものだけ DB に保存します。src/mcpbluesky/tools_bluesky.py と src/mcpbluesky/server.py により、少なくとも以下のツールが登録されます。
bsky_login(handle: Optional[str] = None, password: Optional[str] = None)handle/password が省略された場合は環境変数から補完BSKY_HANDLEBSKY_APP_PASSWORDmanager.remove_session(handle) で削除してから再ログインします。bsky_logout(handle: str)bsky_refresh_session(acting_handle: Optional[str] = None)bsky_get_profile(handle: str, acting_handle: Optional[str] = None)bsky_get_author_feed(handle: str, limit: int = 10, cursor: Optional[str] = None, acting_handle: Optional[str] = None)bsky_get_actor_feeds(handle: str, acting_handle: Optional[str] = None)bsky_get_timeline(limit: int = 20, cursor: Optional[str] = None, acting_handle: Optional[str] = None)(要認証)bsky_get_timeline_page(limit: int = 50, cursor: Optional[str] = None, summary: bool = True, text_max_len: int = 120, acting_handle: Optional[str] = None)(要認証)bsky_get_post_thread(uri: str, depth: int = 6, acting_handle: Optional[str] = None)bsky_get_follows(handle: str, limit: int = 50, cursor: Optional[str] = None, acting_handle: Optional[str] = None)bsky_get_followers(handle: str, limit: int = 50, cursor: Optional[str] = None, acting_handle: Optional[str] = None)bsky_get_notifications(limit: int = 20, cursor: Optional[str] = None, acting_handle: Optional[str] = None)(要認証)bsky_resolve_handle(handle: str, acting_handle: Optional[str] = None)bsky_search_posts(query: str, limit: int = 10, cursor: Optional[str] = None, acting_handle: Optional[str] = None)bsky_get_likes(uri: str, acting_handle: Optional[str] = None)bsky_get_lists(handle: str, limit: int = 50, cursor: Optional[str] = None, acting_handle: Optional[str] = None)bsky_get_list(list_uri: str, limit: int = 50, cursor: Optional[str] = None, acting_handle: Optional[str] = None)bsky_search_users(term: str, limit: int = 10, cursor: Optional[str] = None, acting_handle: Optional[str] = None)bsky_post(text: str, acting_handle: Optional[str] = None)bsky_reply(text: str, parent_uri: str, parent_cid: str, root_uri: str, root_cid: str, acting_handle: Optional[str] = None)bsky_like(uri: str, cid: str, acting_handle: Optional[str] = None)bsky_repost(uri: str, cid: str, acting_handle: Optional[str] = None)bsky_delete_post(post_uri: str, acting_handle: Optional[str] = None)bsky_follow(subject_did: str, acting_handle: Optional[str] = None)bsky_unfollow(follow_uri: str, acting_handle: Optional[str] = None)bsky_block(subject_did: str, acting_handle: Optional[str] = None)bsky_unblock(block_uri: str, acting_handle: Optional[str] = None)bsky_create_list(name: str, purpose: str = "app.bsky.graph.defs#curatormodlist", description: str = "", acting_handle: Optional[str] = None)bsky_delete_list(list_uri: str, acting_handle: Optional[str] = None)bsky_add_to_list(subject_did: str, list_uri: str, acting_handle: Optional[str] = None)bsky_remove_from_list(listitem_uri: str, acting_handle: Optional[str] = None)bsky_mute(handle: str, acting_handle: Optional[str] = None)bsky_unmute(handle: str, acting_handle: Optional[str] = None)bsky_update_profile(displayName: Optional[str] = None, description: Optional[str] = None, acting_handle: Optional[str] = None)bsky_set_threadgate(post_uri: str, allow_mentions: bool = True, allow_following: bool = False, acting_handle: Optional[str] = None)server.py で定義)bsky_search_local_posts(keyword: Optional[str] = None, limit: int = 50)このプロジェクトは pyproject.toml を持つ PEP 517/518 のパッケージで、ビルドバックエンドは hatchling です。
mcpbluesky0.1.2>= 3.10fastmcpgraphemewebsocketsrequirements.txt があるので、まずこれを入れて python -m ... で動かすこともできます。
pip install -r requirements.txt
ただし、この方法は「パッケージとしてインストールされる状態」を作りません。
コンソールスクリプト mcpbluesky も入りません。
リポジトリを編集しながら、通常の import や mcpbluesky コマンドで動作させたい場合は editable install を使います。
pip install -e .
この形でインストールすると:
import mcpbluesky が有効になりますmcpbluesky コマンド(mcpbluesky = mcpbluesky.server:main)が導入されますPEP 517 の標準ツール build を使うのが簡単です。
python -m pip install --upgrade build
python -m build
成功すると dist/ 配下に成果物ができます(例):
dist/mcpbluesky-0.1.2-py3-none-any.whldist/mcpbluesky-0.1.2.tar.gzpython -m pip install dist/mcpbluesky-0.1.2-py3-none-any.whl
(バージョンは pyproject.toml の version に合わせてください)
mcpbluesky --help
python -c "import mcpbluesky; print(mcpbluesky.__all__)"
pyproject.toml の [project.scripts] により、インストールすると mcpbluesky コマンドが使えます。
mcpbluesky --transport stdio
mcpbluesky --transport streamable-http --host 127.0.0.1 --port 8000 --mount-path /mcp
mcpbluesky --transport sse --host 127.0.0.1 --port 8000 --mount-path /mcp
mcpbluesky --transport stdio --jetstream
python -m mcpbluesky.server --transport stdio
src/mcpbluesky/client.py は、streamable-http で http://127.0.0.1:8000/mcp に接続するサンプルです。
python -m mcpbluesky.client
このスクリプトは:
list_tools() を実行してツール一覧を表示bsky_get_profile を呼び出して bsky.app のプロフィールを取得を行います。
mcp_servers.json の例)HTTP transport の例(mount-path /mcp の場合):
{
"mcp_servers": [
{
"name": "mcpbluesky",
"url": "http://127.0.0.1:8000/mcp",
"transport": "streamable-http"
}
]
}
transport=stdio で使う場合は、エージェント側の stdio 起動設定(command/args 等)に合わせてください。mount_path と一致させてください。bsky_login は Bluesky のアプリパスワードを使います(通常のログインパスワードは使わないでください)。BSKY_HANDLEBSKY_APP_PASSWORD~/.mcpbluesky/bluesky_posts.db--jetstream で Jetstream を購読している間、
日本語と判定できた投稿が posts テーブルに保存されます。bsky_search_local_posts で保存済み投稿をキーワード検索できます。sessions.json にはアクセストークン/リフレッシュトークン等が保存されます。取り扱いに注意してください。common_http.py には短時間大量アクセスを抑えるためのスロットリングと、
429/5xx 等の簡易リトライが入っていますが、過剰なリクエストは避けてください。Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"mcpbluesky": {
"command": "npx",
"args": []
}
}
}