Skip to main content
Glama

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 build

3. Укажите вашему ассистенту на него

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.json

  • Windows %APPDATA%\Claude\claude_desktop_config.json

После этого перезапустите Claude Desktop.

Используйте абсолютный путь — ассистент не запускается из этой папки.


Related MCP server: GPT Image MCP Server

Инструменты

Что вы можете делать

Tool

Что делает

check_permissions

Проверяет одну игру и сообщает, какие инструменты будут работать с ней, а какие нет, и почему.

set_project_credentials

Сохраняет ключ Open Cloud и/или cookie Roblox для игры — то, что запрашивает отчёт.

Проекты

Tool

Что делает

list_projects

Ваши игры и их идентификаторы вселенных.

get_game_info

Находит любую игру Roblox по ссылке, идентификатору места или вселенной — она не обязательно ваша.

search_roblox_games

Поиск Roblox по названию или ключевому слову.

add_project

Добавляет игру в ваш аккаунт, привязанную к тому аккаунту Roblox, который может её редактировать.

list_collaborators / invite_collaborator

Кто ещё имеет доступ к проекту, и одноразовая ссылка-приглашение.

Миниатюры

Tool

Что делает

get_thumbnails

Активные и неактивные миниатюры с QPTR, показами, квалифицированными играми, средним временем игры.

set_active_thumbnails

Выбирает, какие миниатюры Roblox действительно показывает — заменить, добавить или удалить.

upload_thumbnail

Публикует локальное изображение как миниатюру игры.

delete_thumbnail

Навсегда удаляет миниатюру из игры.

get_qptr_trend

Ежедневные переходы и показы за 7, 14 или 30 дней.

get_thumbnail_momentum

Какие отдельные миниатюры растут, падают или остаются на месте.

export_thumbnail_report

Весь набор, отсортированный по QPTR, в виде PDF, записанного на диск.

Создание миниатюр

Tool

Что делает

generate_thumbnail

Создаёт изображение по запросу и ссылкам, записывает его на диск, при желании публикует.

list_generations

Всё, что было создано для игры, с запросами, стоящими за каждым.

upload_generation

Публикует что-то из этой истории без повторной загрузки.

list_style_profiles

Именованные руководства по стилю, на которые можно указать при генерации.

Ротация

Tool

Что делает

get_auto_swap

Вращается ли игра сама, по каким правилам, и что делали последние запуски.

configure_auto_swap

Включает или выключает ротацию и задаёт её пороги.

run_auto_swap

Запускает одну ротацию сейчас, не дожидаясь расписания.

get_queue

Что стоит в очереди на следующую публикацию.

queue_thumbnail / unqueue_thumbnail

Добавляет в очередь или удаляет из неё.

Discord

Tool

Что делает

list_discord_roles

Роли, которым можно отправлять уведомления.

notify_team

Отправляет личное сообщение роли, опционально с изображениями и двумя кнопками ответа.

get_notification_history

Что уже было отправлено, с ответами по каждому человеку и статусом оплаты.

create_ticket

Открывает тикет — публикует embed с кнопками Одобрить/Отклонить в канале игры.

list_tickets

Только тикеты по игре, с указанием, что ещё не отвечено или не оплачено.

list_artist_channels

Текстовые каналы на сервере студии, с идентификаторами.

create_channel / link_channel

Создаёт канал и привязывает тикеты игры к нему.

get_channel_messages

Читает канал — автор, время, текст, URL вложений.

send_channel_message

Публикует сообщение в канале от имени бота, как простой текст или 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 видимыми там. Бот, приглашённый без второго набора, будет нормально работать в личных сообщениях и в каналах, но его слэш-команды просто не появятся.


Конфигурация

Параметр

Обязателен

Описание

WHT_API_KEY

да

Ваш ключ со страницы Keys

WHT_BASE_URL

нет

Только если вы запускаете свою копию сайта


Примечания

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

Install Server
F
license - not found
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

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