使用说明
麦克布鲁斯基
此存储库包含:用于处理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的“在哪个登录会话中执行”的切换
- MCP工具(
src/mcpbluesky/bluesky_api.pyBlueskyAPI(HTTP调用的薄喇叭)BlueskySession(accessJwt/refreshJwt/did/handle/pds_url)- 帖子文本验证(grapheme300/bytes3000)
- 将URL/散列标签转换为facets(UTF-8字节偏移中的index设置)
src/mcpbluesky/common_http.pyurllib.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动作确认用样品
- 使用HTTP transport(streamable-http)连接到服务器
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_HANDLEBSKY_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 - 依存:
fastmcpgraphemewebsockets
只加入依存关系想在手边实行的情况(开发·验证)
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.whldist/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_HANDLEBSKY_APP_PASSWORD
关于本地数据库(Jetstream保存)
- 数据库文件(默认):
~/.mcpbluesky/bluesky_posts.db --jetstream在您查看完详细信息后,单击 被判定为日语的投稿posts保存在表中。bsky_search_local_posts中描述的场景,使用以下步骤创建明细表,以便在概念设计中分析体量的体积。
注意事项/安全性
sessions.json将条目添加到文档注册表。请注意使用。- 如果启用Jetstream,则Jetstream的接收处理将在其他线程上运行。
common_http.py有用于抑制短时间大量访问的时隙 包含429/5xx等简易重试,但请避免过多的请求。