ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AI新时代下的图床管理方案:Cloudflare R2 + MCP + Skills 配置指南(含 TaoToken 统一 Key 接入)

AI新时代下的图床管理方案:Cloudflare R2 + MCP + Skills 配置指南(含 TaoToken 统一 Key 接入) 1. 为什么我把图床从 PicGo 换成了 R2 MCP Skills如果你和我一样日常写博客、发文档、给 AI 助手贴截图图床这件事迟早会变成一个小痛点。传统方案是本地装 PicGo配好 S3 密钥截图后手动上传、复制链接、再粘回编辑器。偶尔用一次还行但当你一天要传十几张图或者让 AI 帮你写文章需要自动插图时这套流程就显得很笨。Cloudflare R2 本身是个很合适的底层10GB 永久免费存储、每月 100 万次写入和 1000 万次读取、出站流量免费还兼容 S3 API。也就是说你不用担心图片被访问多了产生流量账单这一点比很多对象存储都省心。但它只是“存储”真正让它变成“图床”的是上层怎么调用。我现在的做法是把 R2 当作存储层用 MCP 把 R2 的读写能力暴露给 AI 助手再用 Skills 把“上传图片并返回 Markdown 链接”这类动作封装成可复用能力。这样我只要对助手说一句“把这张截图传到图床给我 Markdown 链接”它就能自己完成上传和回链。而所有 AI 工具的调用凭证我统一走 TaoToken 的 Key 来管理避免每个客户端都散落一份密钥。这篇就按我实际配置的顺序把 R2 存储桶、MCP 服务端 config.toml、Skills 目录结构、TaoToken 统一 Key 接入 settings.json 这几块拆开讲最后给出上传和读取的验证动作以及我踩过的几个报错。2. 前置准备R2 存储桶与 TaoToken 统一 Key2.1 创建 R2 存储桶并拿到 S3 凭证登录 Cloudflare 控制台进入 R2 对象存储先激活免费套餐绑定支付方式仅用于验证。然后创建一个图床专用桶比如my-img-bed区域选离你近的亚太节点。接着进入「管理 R2 API 令牌」创建一个新令牌权限选「对象读和写」。你会拿到两个值Access Key IDSecret Access Key只显示一次务必先存好这两个值就是后面 MCP 服务端连接 R2 的凭证。如果你打算生产环境用自定义域名访问图片可以在桶设置里绑定img.yourdomain.com开发阶段先用r2.dev子域名快速验证也行。2.2 为什么用 TaoToken 统一 KeyMCP 客户端、Skills 脚本、各种 AI 工具如果各自配一份模型 Key管理起来很乱换一次 Key 要改一堆地方。我的做法是让这些工具统一走 TaoToken 的接入点Key 只维护一份。TaoToken 的 API 地址是https://taotoken.net/api官网在https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。你可以在控制台里创建 Key然后把它写进各个客户端的 settings.json。这样 MCP 服务端调用模型、Skills 执行任务都复用同一个 Key排查问题时也只需要看一个地方。需要先拿到 Key 的话去控制台的 API Keys 页面创建https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite。接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite配置字段以文档为准。3. 可复制配置MCP 服务端 config.toml 骨架3.1 config.toml 完整骨架下面这份config.toml是我在用的 MCP 服务端骨架把 R2 的 S3 端点和 TaoToken 的模型接入放在一起。你可以直接复制后替换成自己的值。# MCP 服务端配置骨架 [server] name r2-image-bed-mcp version 0.1.0 transport stdio # R2 存储配置S3 兼容 [storage.r2] endpoint https://你的账户ID.r2.cloudflarestorage.com bucket my-img-bed region auto access_key_id 你的 Access Key ID secret_access_key 你的 Secret Access Key public_base_url https://img.yourdomain.com # 模型接入统一走 TaoToken [model] provider taotoken base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} default_model claude-sonnet # 暴露给 AI 助手的工具 [tools] enable [r2_put_object, r2_get_object, r2_list_objects, r2_delete_object]几个关键点说明一下。endpoint里的账户 ID 在 Cloudflare 控制台右侧能看到region填auto即可R2 会自动路由。public_base_url是你绑定自定义域名后的访问前缀上传成功后拼接文件名就能得到可访问链接。api_key我用了环境变量${TAOTOKEN_API_KEY}避免把 Key 硬编码进文件。3.2 环境变量注入在启动 MCP 服务端之前先把 Key 注入环境export TAOTOKEN_API_KEYsk-你的TaoTokenKey如果你用 systemd 或 Docker 管理服务把这一行写进对应的环境文件即可。这样 config.toml 里不出现明文 Key提交到仓库也安全。3.3 Skills 目录结构Skills 的作用是把“上传图片并返回 Markdown 链接”这类动作封装成助手能直接调用的能力包。我的目录结构是这样的skills/ ├── r2-upload/ │ ├── SKILL.md │ ├── skill.json │ └── scripts/ │ └── upload.py ├── r2-list/ │ ├── SKILL.md │ └── skill.json └── r2-cleanup/ ├── SKILL.md └── skill.jsonskill.json描述这个 Skill 的入参和出参SKILL.md写给助手看的自然语言说明scripts/放实际执行脚本。以r2-upload为例skill.json大致长这样{ name: r2-upload, description: 上传本地图片到 R2 图床并返回 Markdown 链接, parameters: { file_path: { type: string, required: true }, folder: { type: string, required: false, default: uploads } }, returns: { markdown: string, url: string } }SKILL.md里写清楚触发条件和注意事项比如“当用户说上传图片到图床时调用本 Skill返回格式必须是![alt](url)”。助手读到这段说明后就能在合适的时候自动调用。4. TaoToken 统一 Key 接入 settings.json4.1 settings.json 配置片段MCP 客户端比如 Claude Desktop、Cursor的settings.json里把模型接入指向 TaoToken同时把 MCP 服务端注册进去{ model: { provider: taotoken, base_url: https://taotoken.net/api, api_key: ${TAOTOKEN_API_KEY}, model: claude-sonnet }, mcpServers: { r2-image-bed: { command: node, args: [/path/to/r2-image-bed-mcp/dist/index.js], env: { TAOTOKEN_API_KEY: ${TAOTOKEN_API_KEY}, R2_CONFIG: /path/to/config.toml } } } }这样一份 settings.json 同时管住了模型调用和 MCP 服务端Key 只从环境变量读。换 Key 时只改环境变量不用动配置文件。4.2 长期编码场景走 Coding Plan如果你主要用 AI 做长期编码、跑 Agent 任务模型调用量会比较大可以考虑用 Coding Plan 来管理额度https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。它和上面的 settings.json 接入方式兼容只是计费维度不同适合持续跑任务的场景。5. 验证请求上传与读取图片5.1 上传验证配置完成后先做一次最小验证。启动 MCP 服务端然后在助手对话框里说把 /Users/me/screenshot.png 上传到图床返回 Markdown 链接。助手会调用r2-uploadSkill最终返回类似![screenshot](https://img.yourdomain.com/uploads/screenshot-20250101.png)你也可以直接用 curl 验证 R2 的 S3 端点是否通curl -X PUT https://账户ID.r2.cloudflarestorage.com/my-img-bed/test.png \ --aws-sigv4 aws:amz:auto:s3 \ --user AccessKeyID:SecretAccessKey \ -T ./test.png返回 200 就说明凭证和桶配置没问题。5.2 读取验证上传成功后用返回的 URL 直接访问或者在助手对话框里说列出图床里 uploads 目录下的所有图片。助手会调用r2-listSkill返回文件列表。你也可以用 curl 拉取curl -I https://img.yourdomain.com/uploads/screenshot-20250101.png看到200 OK和正确的Content-Type: image/png就说明读取链路通了。如果走的是r2.dev子域名注意它有速率限制生产环境还是绑自定义域名更稳。6. 本篇常见错排查6.1 报错 SignatureDoesNotMatch这个报错基本是 Access Key 或 Secret 填错或者region没填auto。R2 的 S3 兼容层对签名区域敏感填成us-east-1之类会直接签名失败。检查 config.toml 里的region auto再确认 Secret 没有多余空格。6.2 报错 403 Forbidden 但凭证没错多半是 API 令牌权限不够。创建令牌时要选「对象读和写」只选读的话上传会 403。另外确认桶名和 endpoint 里的账户 ID 对得上跨账户访问也会 403。6.3 MCP 服务端启动后助手看不到工具先确认 settings.json 里mcpServers的command和args路径正确Node 版本不要太旧。然后看 MCP 服务端日志有没有报TAOTOKEN_API_KEY not set环境变量没注入的话模型调用会失败工具列表也可能加载不全。重启客户端后再看工具面板。6.4 上传成功但链接打不开检查public_base_url是否和你绑定的自定义域名一致。如果用的是r2.dev子域名确认在桶设置里开启了公开访问。另外文件名里如果有中文或空格记得做 URL 编码否则浏览器可能请求失败。6.5 Skills 不触发SKILL.md里的触发描述要写得具体比如明确写“当用户提到上传图片、图床、Markdown 链接时调用”。描述太模糊助手不会主动调用。另外确认skill.json的parameters和脚本实际接收的参数名一致不一致会静默失败。排查时如果怀疑是模型接入侧的问题可以到模型对话页面单独测一下 Key 是否可用https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite。接入相关的字段说明以文档为准https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。Key 管理在 API Keys 页面https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite。长期跑编码和 Agent 任务的话Coding Plan 页面在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。我自己的习惯是先把 curl 直连 R2 跑通再配 MCP最后接 Skills。这样出问题时能快速定位是存储层、协议层还是能力层的问题不用一上来就怀疑整条链路。
返回列表