White Hat Thumbnails
White Hat Thumbnails — MCP-сервер
Позволяет ИИ-ассистенту управлять вашими миниатюрами 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
Инструменты
Что вы можете делать
Tool | Что делает |
| Проверяет одну игру и сообщает, какие инструменты будут работать с ней, а какие нет, и почему. |
| Сохраняет ключ Open Cloud и/или cookie Roblox для игры — то, что запрашивает отчёт. |
Проекты
Tool | Что делает |
| Ваши игры и их идентификаторы вселенных. |
| Находит любую игру Roblox по ссылке, идентификатору места или вселенной — она не обязательно ваша. |
| Поиск Roblox по названию или ключевому слову. |
| Добавляет игру в ваш аккаунт, привязанную к тому аккаунту Roblox, который может её редактировать. |
| Кто ещё имеет доступ к проекту, и одноразовая ссылка-приглашение. |
Миниатюры
Tool | Что делает |
| Активные и неактивные миниатюры с QPTR, показами, квалифицированными играми, средним временем игры. |
| Выбирает, какие миниатюры Roblox действительно показывает — заменить, добавить или удалить. |
| Публикует локальное изображение как миниатюру игры. |
| Навсегда удаляет миниатюру из игры. |
| Ежедневные переходы и показы за 7, 14 или 30 дней. |
| Какие отдельные миниатюры растут, падают или остаются на месте. |
| Весь набор, отсортированный по QPTR, в виде PDF, записанного на диск. |
Создание миниатюр
Tool | Что делает |
| Создаёт изображение по запросу и ссылкам, записывает его на диск, при желании публикует. |
| Всё, что было создано для игры, с запросами, стоящими за каждым. |
| Публикует что-то из этой истории без повторной загрузки. |
| Именованные руководства по стилю, на которые можно указать при генерации. |
Ротация
Tool | Что делает |
| Вращается ли игра сама, по каким правилам, и что делали последние запуски. |
| Включает или выключает ротацию и задаёт её пороги. |
| Запускает одну ротацию сейчас, не дожидаясь расписания. |
| Что стоит в очереди на следующую публикацию. |
| Добавляет в очередь или удаляет из неё. |
Discord
Tool | Что делает |
| Роли, которым можно отправлять уведомления. |
| Отправляет личное сообщение роли, опционально с изображениями и двумя кнопками ответа. |
| Что уже было отправлено, с ответами по каждому человеку и статусом оплаты. |
| Открывает тикет — публикует embed с кнопками Одобрить/Отклонить в канале игры. |
| Только тикеты по игре, с указанием, что ещё не отвечено или не оплачено. |
| Текстовые каналы на сервере студии, с идентификаторами. |
| Создаёт канал и привязывает тикеты игры к нему. |
| Читает канал — автор, время, текст, URL вложений. |
| Публикует сообщение в канале от имени бота, как простой текст или embed, опционально с изображениями. |
Названия игр сопоставляются нестрого, поэтому «dumpling escape» найдёт «+1 Dumpling SMASH Walls». Если название неоднозначно, инструмент сообщает об этом и перечисляет кандидатов, а не угадывает.
Что вам разрешено делать
Полномочия на игру Roblox — это не одно разрешение. Они распределены между cookie .ROBLOSECURITY (загрузка, удаление, замена активного набора), ключом 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. Идентификаторы могут быть идентификаторами ассетов, с которых начинаются отчёты, или внутренними идентификаторами миниатюр; принимаются оба.
Здесь ничего не удаляется. Деактивированная миниатюра сохраняет свою историю и может быть возвращена. 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, и тикет станет счётом — в личном сообщении отображается сумма и кнопка оплаты, кнопки по умолчанию Оплачено / Отмена, и первый клик по «Оплачено» отмечает тикет как оплаченный:
notify_team(
game: "+1 dumpling escape",
role: "Thumbnail Team",
message: "Dumpling concept art from lamy",
paymentAmount: 10,
paypalLink: "paypal.me/asianlamy"
)paid фиксируется. Отклонение после того, как кто-то уже отметил его как оплаченное, записывается как ответ, но не отменяет оплату тикета — отправленные деньги нельзя отозвать кнопкой.
Тикеты
Тикет — это та же запись, что и уведомление команды — та же таблица, те же ответы по каждому человеку, тот же флаг оплаты — с заголовком, типом и каналом, в котором он живёт. Его можно открыть тремя способами, и впоследствии они неразличимы:
/ticket createв Discord, из любого канала или личного сообщения с ботом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, получает кнопки Одобрить / Отклонить; тикет оплаты получает Оплачено / Отмена, а также сумму и кликабельную ссылку PayPal, и первый клик по «Оплачено» устанавливает флаг оплаты. Ответы попадают в get_notification_history точно так же, как ответы на кнопки в личном сообщении, и embed в канале переписывается по мере ответов, чтобы сообщение, на которое все смотрят, показывало текущее состояние.
Каждая игра публикует свои тикеты в одном канале, который задаётся один раз из 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"])URL вложений из Discord подписаны и истекают примерно через день, поэтому скачивайте арт при первом просмотре, а не сохраняйте ссылку на потом.
Embeds
Сообщение в канале может быть вложением (embed), а не просто строкой текста — карточкой с цветной полосой сбоку, той самой, что используется в уведомлениях в личных сообщениях. Передавайте embed вместо 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 вкладывает footer, изображение и все кнопки внутрь обёрток, и ничего из этого не нужно знать, чтобы отправить сообщение. Поля обрезаются до длины, которую задаёт Discord, а не отправляются целиком, потому что он отклоняет всё сообщение целиком из-за одного слишком длинного поля.
Кнопки здесь только открывают ссылки. Кнопка, которая задаёт вопрос и записывает ответ, относится к notify_team или create_ticket, у которых есть куда записать ответ.
Чтобы бот видел канал, ему нужны права View Channel, Read Message History, Send Messages и Attach Files. Пригласите его с такими правами:
https://discord.com/oauth2/authorize?client_id=<APP_ID>&scope=bot%20applications.commands&permissions=117760Оба набора прав важны. bot даёт доступ к серверу, а applications.commands — это то, что делает команды /ticket видимыми там. Бот, приглашённый без второго набора, будет нормально работать в личных сообщениях и в каналах, но его слэш-команды просто не появятся.
Конфигурация
Параметр | Обязателен | Описание |
| да | Ваш ключ со страницы Keys |
| нет | Только если вы запускаете свою копию сайта |
Примечания
Discord может отклонять личные сообщения, и это не ошибка. Discord не даст боту написать человеку, который его заблокировал, отключил личные сообщения от участников сервера или не состоит с ботом на одном сервере. notify_team сообщает по каждому человеку отдельно, что именно произошло, а не просто один общий результат.
Roblox обрабатывает загрузки асинхронно. upload_thumbnail, возвращающий Pending, означает, что изображение принято и обрабатывается — обычно это занимает несколько минут.
Некоторые игры доступны только для чтения. Загрузка и замена требуют аккаунта Roblox с правом редактирования этого опыта; ключ Open Cloud не может этого сделать. Сайт показывает каждый проект как Full Edit, View Only или Public View, и инструменты сообщают, когда что-то недоступно, а не просто молча завершаются ошибкой. check_permissions — самый быстрый способ узнать, в каком статусе находится игра.
Три инструмента меняют то, что видят игроки, и делают это мгновенно: set_active_thumbnails, run_auto_swap и configure_auto_swap с параметром enabled: true. Загрузка и генерация — нет: загруженное изображение остаётся неактивным, пока что-то не выведет его в эфир.
Один инструмент нельзя отменить. delete_thumbnail удаляет изображение из Roblox вместе с историей его аналитики. Отключение через set_active_thumbnails(mode: "remove") — обратимая альтернатива, и именно её чаще всего и нужно использовать.
check_permissions не проверяет генерацию. Единственная честная проверка — сгенерировать изображение, а это стоит денег и оставляет след в истории. Если generate_thumbnail должен завершиться ошибкой, он завершится ей на первом же вызове, с указанием причины.
Лицензия
MIT
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