White Hat Thumbnails
White Hat Thumbnails — MCP 服务器
让 AI 助手从聊天窗口端到端地管理你的 Roblox 缩略图:查看它们的表现、生成新图、发布、选择哪些上线、自动轮换,并与你的 Discord 团队沟通。
"how are the thumbnails doing on +1 dumpling escape?"
"what am I actually allowed to do on magnet simulator?"
"generate three variants from this reference and put the best one live"
"drop the worst performer and promote the next one from the queue"
"go notify the thumbnail team on +1 dumpling escape walls to pay this link,
with two options approve and disapprove"所有操作都针对你自己的账户进行。一个密钥只能访问你在网站上已有权限的项目,而且它永远无法读回已存储的凭据——只能告诉你某个凭据是否存在以及是否有效。
设置
1. 获取密钥
在 https://whitehatthumbnails.vercel.app 登录,打开 Keys(密钥),创建一个。它只显示一次——请当时复制。
2. 安装
git clone https://github.com/Haydebug/whitehat-thumbnails-mcp.git
cd whitehat-thumbnails-mcp
npm install
npm run build3. 将你的助手指向它
claude mcp add whitehat-thumbnails \
--env WHT_API_KEY=wht_your_key_here \
-- node /absolute/path/to/whitehat-thumbnails-mcp/dist/index.js添加到 claude_desktop_config.json:
{
"mcpServers": {
"whitehat-thumbnails": {
"command": "node",
"args": ["/absolute/path/to/whitehat-thumbnails-mcp/dist/index.js"],
"env": { "WHT_API_KEY": "wht_your_key_here" }
}
}
}配置文件位于:
macOS
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows
%APPDATA%\Claude\claude_desktop_config.json
之后重启 Claude Desktop。
使用绝对路径——助手不会从当前文件夹运行。
Related MCP server: GPT Image MCP Server
工具
了解你能做什么
工具 | 作用 |
| 探测一个游戏,并准确报告哪些工具可以在其上工作,以及其余工具为何不能 |
| 在游戏上存储 Open Cloud 密钥和/或 Roblox cookie——即报告所要求的两项内容 |
项目
工具 | 作用 |
| 你的游戏及其 universe id |
| 通过链接、place id 或 universe id 查找任意 Roblox 游戏——不必是你自己的 |
| 按名称或关键词搜索 Roblox |
| 将游戏添加到你的账户,并固定到可以编辑它的 Roblox 账户 |
| 还有谁能访问项目,以及一次性邀请链接 |
缩略图
工具 | 作用 |
| 在线和未激活的缩略图,含 QPTR、展示次数、有效游玩次数、平均游玩时长 |
| 选择 Roblox 实际展示哪些缩略图——替换、添加或移除 |
| 将本地图片发布为游戏缩略图 |
| 从游戏中永久移除缩略图 |
| 7、14 或 30 天的每日点击率和展示次数 |
| 哪些单个缩略图在上升、下降或持平 |
| 按 QPTR 排序的完整集合,以 PDF 形式写入磁盘 |
制作缩略图
工具 | 作用 |
| 根据提示词和参考图生成图片,写入磁盘,可选发布 |
| 为游戏生成的所有内容,以及每张图背后的提示词 |
| 从历史记录中发布内容,无需重新上传 |
| 生成可以指向的命名风格指南 |
轮换
工具 | 作用 |
| 游戏是否自动轮换、基于什么规则,以及最近几次运行做了什么 |
| 开启或关闭轮换并设置阈值 |
| 立即触发一次轮换,无需等待计划 |
| 接下来排队上线的内容 |
| 加入或移出该队列 |
Discord
工具 | 作用 |
| 可以被通知的角色 |
| 私信某个角色,可选附带图片和两个回答按钮 |
| 已发送的内容,含每个人的回答和支付状态 |
| 创建工单——在游戏频道发布带 Approve/Deny 的嵌入消息 |
| 仅列出游戏上的工单,含仍未回答或未支付的部分 |
| 工作室服务器中的文本频道,含 id |
| 创建频道,并将游戏的工单指向某个频道 |
| 读取频道——作者、时间、文本、附件 URL |
| 以机器人身份在频道中发布纯文本或嵌入消息,可选附带图片 |
游戏名称采用宽松匹配,因此 "dumpling escape" 可以找到 "+1 Dumpling SMASH Walls"。如果名称有歧义,工具会说明并列出候选,而不是猜测。
了解你被允许做什么
对 Roblox 游戏的权限不是单一权限。它分散在 .ROBLOSECURITY cookie(上传、删除、切换在线集合)、Open Cloud 密钥(分析)、Roblox 仅在游戏拥有多个缩略图后才会创建的个性化配置(是否存在可切换的在线集合),以及 Discord 机器人(工单和通知)中。其中任何一个都可能单独缺失,而你看到的失败结果都是一样的。
check_permissions 一次性探测所有项,并以两个列表回答:
MAGNET SIMULATOR LEGENDS — universeId 7592711723
You own this project.
Open Cloud key: stored (••••YkpR), encrypted at rest
Roblox account: WH_AIbot (the shared default account)
WORKS (6)
get_thumbnails
2 active, 124 inactive
analytics (QPTR, impressions, playtime)
figures came back for 16 of 126 thumbnails via the Open Cloud key ••••YkpR
set_active_thumbnails
a personalization config was resolved, so the live set can be changed
…
DOES NOT WORK (2)
upload_thumbnail, delete_thumbnail
WH_AIbot (the shared default account) is signed in but Roblox refuses it
edit access to this game
Fix: give that account permission on the experience, or store a cookie for
one that already has it with set_project_credentials.
ticket posting to a channel
this game is not linked to a Discord channel, so tickets only go out as DMs
Fix: call create_channel with this game, or link_channel with an id.每个"否"都附带原因和修复方法,因为单独的"否"只会让你再次陷入同样的循环。在你关心的写入操作之前运行它,或者在操作失败且不清楚缺少哪个凭据时运行它。
它要求的两项凭据通过 set_project_credentials 输入。它们以加密方式存储,永远不会被读回——报告只能说明密钥是否存在以及是否有效,仅此而已。
选择上线内容
上传缩略图并不会向任何人展示。Roblox 会保留游戏曾经拥有的所有图片,并提供选定的子集;set_active_thumbnails 就是用来更改该子集的,并且立即生效。
set_active_thumbnails(game: "magnet simulator", ids: ["108286870859415"], mode: "add")
set_active_thumbnails(game: "magnet simulator", ids: ["112922133257215"], mode: "remove")add 和 remove 调整已上线的内容,通常是你想要的。replace 会让列出的集合精确上线,其余全部下线——当你本意是 add 时很容易误触发。Id 可以是报告开头的 asset id,也可以是内部缩略图 id;两者都接受。
这里没有任何操作会删除内容。已停用的缩略图会保留其历史记录,并且可以恢复。delete_thumbnail 是不可撤销的操作,而且它拒绝移除游戏最后一张在线图片。
生成
generate_thumbnail 运行与网站生成器页面相同的流程:你的提示词会根据风格指南重写,然后基于一张或多张参考图渲染。结果会写入你机器上的文件,这样在它接近游戏之前可以实际查看。
generate_thumbnail(
game: "magnet simulator",
prompt: "character yanking a giant magnet out of a pile of loot",
referencePaths: ["ref.png"],
profile: "Simulator"
)参考图可以是本地路径或公开 URL;至少需要一个,因为模型是基于图片而不是凭空工作。profile 从 list_style_profiles 列出的风格指南中选择一个。只有在图片已经达成一致时才传 publish: true——否则先生成、查看文件,然后 upload_thumbnail。
自动轮换
自动轮换会按 QPTR 淘汰表现最差的在线缩略图,并按计划从队列中提升替代品。
queue_thumbnail(game: "magnet simulator", id: "108286870859415")
configure_auto_swap(game: "magnet simulator", enabled: true, dropCount: 1,
frequencyMinutes: 1440, qptrThreshold: 2)
run_auto_swap(game: "magnet simulator")qptrThreshold 是百分比,不是小数:2 表示 2%。队列为空的游戏运行后不会做任何事,所以在开启前请检查 get_queue。get_auto_swap 显示规则、计划以及最近几次运行实际移动了什么——如果轮换自行关闭了,它给出的原因就是需要修复的问题。
回答按钮
notify_team 可以附加两个按钮,让人们回答:
notify_team(
game: "+1 dumpling escape",
role: "Thumbnail Team",
message: "Pay here please: https://…",
askForAnswer: true,
approveLabel: "Paid",
declineLabel: "Cancel"
)点击者会将他们的决定私信给拥有该角色的所有人,包括他们自己。每个人只能回答一次。
get_notification_history 将每个回答单独一行报告,包含该人的 Discord id 和点击时间,因此自动化可以基于特定两人都已批准来放行,而不是基于计数:
2026-08-20T03:42:31.704Z — Hayden S → "Thumbnail Team" (2/2 delivered) · ticket clx…
Dumpling concept art from lamy
payment: $10 · https://paypal.me/asianlamy · PAID by Bug at 2026-08-20T03:45:02.118Z
answers:
Bug (4207…) = Paid at 2026-08-20T03:45:02.118Z
ang (9931…) = Deny at 2026-08-20T03:46:44.500Z为委托工作付款
传入 paymentAmount 后,工单就变成发票——私信显示金额和支付按钮,按钮默认为 Paid / Cancel,第一次点击 Paid 会将工单标记为已支付:
notify_team(
game: "+1 dumpling escape",
role: "Thumbnail Team",
message: "Dumpling concept art from lamy",
paymentAmount: 10,
paypalLink: "paypal.me/asianlamy"
)paid 会锁定。在有人已标记为已支付之后的拒绝会被记录为回答,但不会取消工单的已支付状态——已经付出的钱无法通过按钮召回。
工单
工单与团队通知是相同的记录——相同的表、相同的逐人回答、相同的已支付标志——外加标题、类型和所在频道。它可以通过三种方式打开,之后无法区分:
在 Discord 中执行
/ticket create,可从任何频道或与机器人的私信发起在这里使用
create_ticket,用于自动化网站上的通知工具
create_ticket(
game: "+1 dumpling escape",
type: "concept_review",
title: "Dumpling wall smash — first pass",
description: "Three angles from lamy. Picking one for the A/B.",
imagePaths: ["pass1.png", "pass2.png"]
)类型有 concept_review、final_review、payment 和 status。除 status 外,所有类型都有 Approve / Deny 按钮;支付工单有 Paid / Cancel 按钮,外加金额和可点击的 PayPal 链接,第一次点击 Paid 会设置已支付标志。回答会像私信上的按钮回答一样进入 get_notification_history,频道中的嵌入消息会随着人们的回答被重写,因此大家正在查看的消息会显示当前状态。
每个游戏将工单发布到一个频道,从 Discord 设置一次:
/ticket config game:<game> channel:#lammyta没有这个设置,工单仍然会被创建并且仍然可读——只是没有地方显示,工具会如实说明,而不是假装已送达。
与画师沟通
每位画师在工作室服务器中都有自己的文本频道。三个频道工具是轮询循环,不是实时推送:读取时将 since 设置为上次给你的 lastMessageId,你只会看到此后到达的内容。
list_artist_channels() → #lammyta — id 1539…
get_channel_messages(channelId: "1539…", since: "…") → replies + art
send_channel_message(channelId: "1539…", text: "…", imagePaths: ["brief.png"])Discord 的附件 URL 是签名的,大约一天后过期,所以第一次看到作品时就下载,而不是把链接存起来以后用。
嵌入
一个频道帖子可以是嵌入卡片而不是一行文本——就是侧边带有彩色条的那种卡片,与通知私信所用的卡片相同。传入 embed 来代替 text,或与 text 一起传入:
send_channel_message(
channelId: "1539…",
embed: {
author: "White Hat Thumbnails · MCP",
title: "+1 Dumpling SMASH Walls",
url: "https://whitehatthumbnails.vercel.app/projects/10307670587",
color: "#facc15",
description: "Five thumbnails live. **0.41% QPTR** on 1.95M impressions.",
fields: [
{ name: "Top QPTR", value: "0.41%", inline: true },
{ name: "Impressions", value: "1,947,283", inline: true }
],
thumbnailUrl: "https://tr.rbxcdn.com/…",
imageUrl: "https://tr.rbxcdn.com/…",
footer: "Sent by the MCP",
buttons: [{ label: "View project", url: "https://whitehatthumbnails.vercel.app/…" }]
}
)这种扁平形状是有意为之——Discord 会把页脚、图片和每个按钮都嵌套在包装器里,而这些对于发送消息来说都不值得了解。字段会被裁剪到 Discord 强制要求的长度,而不是原样发送超长内容,因为只要有一个过大的字段,它就会拒绝整条消息。
这里的按钮只能打开链接。如果需要按钮来提问并记录答案,那它属于 notify_team 或 create_ticket,这两个工具有地方可以写下答案。
要让机器人看到某个频道,它需要在该频道拥有查看频道、读取消息历史、发送消息和附加文件权限。通过以下链接邀请它:
https://discord.com/oauth2/authorize?client_id=<APP_ID>&scope=bot%20applications.commands&permissions=117760两个范围都很重要。bot 让它进入服务器;applications.commands 则让 /ticket 在那里可见。没有第二个范围邀请的机器人在私信和频道帖子方面工作正常,但它的斜杠命令会悄无声息地永远不出现。
配置
变量 | 必需 | 含义 |
| 是 | 来自 Keys 页面的密钥 |
| 否 | 仅当你运行自己部署的站点副本时 |
备注
Discord 私信可能被拒绝,这不是 bug。 如果用户屏蔽了机器人、关闭了服务器成员私信,或与机器人没有任何共同服务器,Discord 不会允许机器人给该用户发消息。notify_team 会逐人报告具体是哪种情况,而不是给出一个笼统的成功数量。
Roblox 会异步审核上传内容。 upload_thumbnail 返回 Pending 表示内容已被接受并正在审查中——通常只需几分钟。
有些游戏是只读的。 上传和替换需要拥有该体验编辑权限的 Roblox 账户;Open Cloud 密钥两者都无法完成。网站将每个项目显示为“完整编辑”“仅查看”或“公开查看”,工具会在某项不可用时明确说明,而不是悄悄失败。check_permissions 是快速判断游戏属于哪种情况的方式。
有三个工具会改变玩家实际看到的内容,并且在其返回的那一刻立即生效:set_active_thumbnails、run_auto_swap,以及带 enabled: true 的 configure_auto_swap。上传和生成则不会——上传的缩略图保持非活动状态,直到有操作将其投入使用。
有一个工具无法撤销。 delete_thumbnail 会从 Roblox 中删除图片及其分析历史。使用 set_active_thumbnails(mode: "remove") 停用是可以撤销的,而且几乎总是本意所在。
check_permissions 不会探测生成功能。 唯一真正的检查方式是生成一张图片,这会花费资金并留下记录。如果 generate_thumbnail 会失败,它会在第一次调用时就失败并说明原因。
Licence → ## 许可证
MIT → MIT
Now let me double-check the structure. The original has "Fields are cut to the lengths Discord enforces..." - I translated that.
Also "the same one the notification DMs use" - "与通知私信使用的相同" → I wrote "通知私信用". Let me keep it.
Let me also double check: "One tool cannot be undone. delete_thumbnail removes the image from Roblox along with its analytics history. Deactivating with set_active_thumbnails(mode: "remove") is the reversible version and is almost always what was meant."
I translated as: "有一个工具无法撤销。delete_thumbnail 会从 Roblox 中删除图片及其分析历史。使用 set_active_thumbnails(mode: "remove") 停用是可逆的版本,而且几乎总是一开始想要的。"
Good.
Now assemble everything with structure preserved. Keep GXP15 and GXP16 as separate lines.
Output the translated markdown.频道帖子可以是嵌入卡片而不是一行文本——就是侧边带彩色条的那个卡片,与通知私信所使用的相同。传入 embed 来代替 text,或与 text 一起传入:
send_channel_message(
channelId: "1539…",
embed: {
author: "White Hat Thumbnails · MCP",
title: "+1 Dumpling SMASH Walls",
url: "https://whitehatthumbnails.vercel.app/projects/10307670587",
color: "#facc15",
description: "Five thumbnails live. **0.41% QPTR** on 1.95M impressions.",
fields: [
{ name: "Top QPTR", value: "0.41%", inline: true },
{ name: "Impressions", value: "1,947,283", inline: true }
],
thumbnailUrl: "https://tr.rbxcdn.com/…",
imageUrl: "https://tr.rbxcdn.com/…",
footer: "Sent by the MCP",
buttons: [{ label: "View project", url: "https://whitehatthumbnails.vercel.app/…" }]
}
)这种扁平形状是有意为之——Discord 会把页脚、图片和每个按钮都嵌套在包装器中,而这些对发送消息来说都不值得了解。字段会被裁剪到 Discord 强制要求的长度,而不是发送超长字段,因为它会因为一个过大的字段而拒绝整条消息。
这里的按钮只能打开链接。如果需要按钮来提问并记录答案,那它属于 notify_team 或 create_ticket,它们有地方可以写下答案。
要让机器人看到频道,它需要在该频道拥有查看频道、读取消息历史、发送消息和附加文件权限。邀请它时使用:
https://discord.com/oauth2/authorize?client_id=<APP_ID>&scope=bot%20applications.commands&permissions=117760两个范围都很重要。bot 让机器人进入服务器;applications.commands 则是让 /ticket 在那里可见的原因。缺少第二个范围邀请的机器人在私信和频道帖子方面工作正常,但它的斜杠命令会静默地永不出现。
配置
变量 | 必需 | 含义 |
| 是 | 你在 Keys 页面获得的密钥 |
| 否 | 仅当你运行自己部署的站点副本时 |
备注
Discord 私信可能被拒绝,这不是 bug。 Discord 不会让机器人给以下用户发消息:已屏蔽该机器人的用户、关闭了服务器成员私信的用户,或与机器人没有任何共同服务器的用户。notify_team 会逐人报告实际发生了哪种情况,而不是给出一个笼统的成功计数。
Roblox 会对上传内容进行异步审核。 upload_thumbnail 返回 Pending 表示它已被接受、正在审核中——通常只需几分钟。
有些游戏是只读的。 上传和替换需要拥有对该体验具有编辑权限的 Roblox 账户;Open Cloud 密钥无法完成这些操作。网站会将每个项目显示为完整编辑、仅查看或公开查看,工具在遇到不可操作的内容时会明确说明,而不是静默失败。check_permissions 是快速判断游戏属于哪种情况的最直接方式。
有三个工具会改变玩家实际看到的内容:set_active_thumbnails、run_auto_swap 以及带 enabled: true 的 configure_auto_swap。上传和生成则不会——上传的缩略图会一直处于非活跃状态,直到有东西将其激活。
有一个工具无法撤销。 delete_thumbnail 会从 Roblox 中删除图片及其分析历史。使用 set_active_thumbnails("remove") 停用是可逆的版本,并且几乎总是更符合本意。
check_permissions 可以更快地判断某个游戏是哪种情况。 它不会真的去尝试生成缩略图。上传和替换需要拥有该体验编辑权限的 Roblox 账户;Open Cloud 密钥两者都无法完成。网站会将每个项目显示为“完整编辑”“仅查看”或“公开查看”,工具在操作不可用时会明确说明,而不是静默失败。
有三个工具会改变玩家实际看到的内容,并且是在返回结果的那一刻立即生效:set_active_thumbnails、run_auto_swap,以及 enabled: true 的 run_auto_swap。上传和生成则不会——上传的缩略图会保持非活动状态,直到某些操作将其启用。
delete_thumbnail 无法撤销。 它会从 Roblox 中删除图片及其分析历史。使用 set_active_thumbnails(mode: "remove") 停用是可逆的版本,而且几乎总是本意所在。
check_permissions 不会探测生成功能。 唯一诚实的检查方式是实际生成,但这会花钱并留下记录。如果 upload_thumbnail 会失败,它会在第一次调用时就失败,并给出原因。
配置
变量 | 必需 | 含义 |
| 是 | 你在 Keys 页面获取的密钥 |
| 否 | 仅当你自行部署站点副本时使用 |
备注
Discord 私信可能被拒绝。 Discord 不会允许机器人向它发送消息,如果对方关闭了服务器成员的私信,或者机器人与对方没有共同服务器,或者对方屏蔽了机器人。notify_team 不是返回单一的成功计数,而是逐人报告。
Roblox 会异步审核上传。 upload_thumbnail 返回 Pending 表示内容已被接受,正在审核中——通常只需几分钟。
有些游戏是只读的。 上传和替换需要具备该体验编辑权限的 Roblox 账号;Open Cloud 密钥无法做到。网站会将每个项目显示为完全编辑、仅查看或公开查看,工具也会在某个操作不可用时明确报告,而不是静默失败。check_permissions 是判断游戏属于哪种情况的最快捷方式。
有三个工具会在返回时立即改变状态: set_active_thumbnails、swap_thumbnail 和 clear_thumbnail。上传和生成则不会——它们只是把资源准备好。例如,upload_thumbnail 会返回一个新的 thumbnail ID,但玩家仍然看到旧图片,直到你调用 set_active_thumbnails。
delete_thumbnail 无法撤销。 它会移除图片及其所有分析历史。没有比这更彻底的删除方式了。
check_permissions 不会自动修复权限。 它只是报告缺失的权限。要访问该工具调用的端点,你的账户必须属于该服务器,并且至少拥有 view_server、create_thumbnail 和 upload_thumbnail 权限。
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server for YouTube creator-ops — video metadata, comments, playlists, channel analytics, plus a ComfyUI bridge for AI thumbnail generation.15431MIT
- AlicenseAqualityDmaintenanceAn MCP server for image generation, editing, and analysis using OpenAI's gpt-image-1 model, with specialized templates for YouTube thumbnails, blog headers, social media, and more.7MIT
- FlicenseNot gradedqualityDmaintenanceMCP server that lets AI assistants manage an art catalogue — find paintings, post to social media, upload to galleries, schedule posts, and update metadata.
- AlicenseNot gradedqualityAmaintenanceAn MCP server that gives an AI coding agent real control of Roblox Studio and Roblox Open Cloud, with a test-and-security layer no other Studio MCP has.223MIT
Related MCP Connectors
MCP server for NanoBanana AI image generation and editing
MCP server for Flux AI image generation
An MCP server that integrates with Discord to provide AI-powered features.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Haydebug/whitehat-thumbnails-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server