Bluesky API工具化服务器

一个用于操作Bluesky API的MCP服务器,提供读取、写入和会话管理功能,支持多账户管理和本地数据库存储。

  • by awaku7
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 awaku7/mcpbluesky

使用说明

麦克布鲁斯基

此存储库包含:用于处理Bluesky API的MCP(Model Context Protocol)服务器(FastMCP)和用于确认动作的简易客户端。

Python软件包 src/mcpbluesky/ 在属下,服务器 mcpbluesky.server 中所述修改相应参数的值。

pyproject.toml 是由Hatchling(PEP517/518)构建的配置,安装后 mcpbluesky 说是 控制台脚本(mcpbluesky = mcpbluesky.server:main),模板名称将采用不同的格式。


能做什么

  • 将Bluesky API工具化为MCP服务器
    • 读取(获取简档、获取时间轴、搜索等)
    • 写入(投稿、回复、赞、转发、跟踪/阻止、列表操作等)
  • 多帐户会话管理(持久化)
    • sessions.json 保存访问标记/刷新标记等
    • acting_handle 在省略参数时使用 缺省句柄保留
  • (任意)订阅Jetstream并将日语帖子保存到本地SQLite可搜索

目录配置

主要文件是 src/mcpbluesky/ 的双曲正切值。

  • src/mcpbluesky/server.py
    • FastMCP服务器主机
    • SessionManager(多用户会话的加载/保存/选择)
    • Jetstream订阅(可选)和数据库保存
    • 本地数据库搜索工具 bsky_search_local_posts 提供
  • src/mcpbluesky/tools_bluesky.py
    • MCP工具(bsky_*)的注册
    • acting_handle 的“在哪个登录会话中执行”的切换
  • src/mcpbluesky/bluesky_api.py
    • BlueskyAPI(HTTP调用的薄喇叭)
    • BlueskySession(accessJwt/refreshJwt/did/handle/pds_url)
    • 帖子文本验证(grapheme300/bytes3000)
    • 将URL/散列标签转换为facets(UTF-8字节偏移中的index设置)
  • src/mcpbluesky/common_http.py
    • urllib.request 基于HTTP的实现(不依赖于requests)
    • 插槽(最小间隔0.2秒)
    • 重试(429/403/5xx等)
    • (根据环境)Zscaler continue画面的检测和迂回
  • src/mcpbluesky/bluesky_db.py
    • 将从Jetstream接收到的投稿保存到SQLite中并进行检索
    • 日本语判定(langs 的 ja或平假名/片假名正则表达式)
  • src/mcpbluesky/client.py
    • 使用HTTP transport(streamable-http)连接到服务器 list_tools() 和 bsky_get_profile 动作确认用样品

MCP服务器(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) 将条目添加到文档注册表。

提供工具

src/mcpbluesky/tools_bluesky.py 和 src/mcpbluesky/server.py 至少注册以下工具:。

会话系统

  • bsky_login(handle: Optional[str] = None, password: Optional[str] = None)
    • handle/password 时从环境变量中进行补充
      • BSKY_HANDLE
      • BSKY_APP_PASSWORD
    • 如果已经存在相同的handle会话 manager.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 在的包中,构建后端是 雏鸟 是。

  • 项目名称: mcpbluesky
  • 版本: 0.1.2
  • 対象 Python: >= 3.10
  • 依存:
    • fastmcp
    • grapheme
    • websockets

只加入依存关系想在手边实行的情况(开发·验证)

requirements.txt 因为有,所以先把这个放进去 python -m ... 中所述修改相应参数的值。

pip install -r requirements.txt

但是,这个方法不制作“作为软件包安装的状态”。 控制台脚本 mcpbluesky 也不进去。

开发安装

在编辑存储库的同时 mcpbluesky 使用editable install可在命令中运行。

pip install -e .

以这种方式安装:

  • import mcpbluesky 将条目添加到文档注册表
  • mcpbluesky 命令(mcpbluesky = mcpbluesky.server:main),模板名称将采用不同的格式

构建和安装(创建分发)

1)构建wheel/sdist

PEP517标准工具 build 使用起来很简单。

python -m pip install --upgrade build
python -m build

成功的话 dist/ 可交付成果(例如):

  • dist/mcpbluesky-0.1.2-py3-none-any.whl
  • dist/mcpbluesky-0.1.2.tar.gz

2)安装wheel

python -m pip install dist/mcpbluesky-0.1.2-py3-none-any.whl

(版本为 pyproject.toml 的,之 version 请配合)

3)安装确认

mcpbluesky --help
python -c "import mcpbluesky; print(mcpbluesky.__all__)"

起动方法

1)已安装(建议)

pyproject.toml 的,之 [project.scripts] 安装的话 mcpbluesky 可以使用命令。

标准

mcpbluesky --transport stdio

HTTP:可流式传输的HTTP

mcpbluesky --transport streamable-http --host 127.0.0.1 --port 8000 --mount-path /mcp

HTTP:sse

mcpbluesky --transport sse --host 127.0.0.1 --port 8000 --mount-path /mcp

启用Jetstream

mcpbluesky --transport stdio --jetstream

2)直接从存储库启动时

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 简介

列表框中,此格式对应于条目“无”。


使用LLM代理(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等)。
  • 使用HTTP transport时,URL是FastMCP的 mount_path 中描述的相应参数的值。

关于凭据

  • bsky_login 是 蓝牙应用程序密码(请不要使用正常的登录密码)。
  • 通过参数传递或通过环境变量设置。
    • BSKY_HANDLE
    • BSKY_APP_PASSWORD

关于本地数据库(Jetstream保存)

  • 数据库文件(默认): ~/.mcpbluesky/bluesky_posts.db
  • --jetstream 在您查看完详细信息后,单击 被判定为日语的投稿 posts 保存在表中。
  • bsky_search_local_posts 中描述的场景,使用以下步骤创建明细表,以便在概念设计中分析体量的体积。

注意事项/安全性

  • sessions.json 将条目添加到文档注册表。请注意使用。
  • 如果启用Jetstream,则Jetstream的接收处理将在其他线程上运行。
  • common_http.py 有用于抑制短时间大量访问的时隙 包含429/5xx等简易重试,但请避免过多的请求。