Skip to main content
Glama

White Hat Thumbnails — MCP-Server

Lässt einen KI-Assistenten Ihre Roblox-Thumbnails von einem Chatfenster aus Ende-zu-Ende verwalten: lesen, wie sie abschneiden, neue generieren, veröffentlichen, auswählen, welche live sind, sie automatisch rotieren und mit Ihrem Discord-Team darüber sprechen.

"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"

Alles läuft gegen Ihr eigenes Konto. Ein Schlüssel erreicht nur die Projekte, auf die Sie auf der Website bereits Zugriff haben, und er kann niemals eine gespeicherte Anmeldeinformation zurücklesen – er kann nur sagen, ob eine vorhanden ist und ob sie funktioniert.


Einrichtung

1. Einen Schlüssel erhalten

Melden Sie sich unter https://whitehatthumbnails.vercel.app an, öffnen Sie Keys und erstellen Sie einen. Er wird nur einmal angezeigt – kopieren Sie ihn dann.

2. Installieren

git clone https://github.com/Haydebug/whitehat-thumbnails-mcp.git
cd whitehat-thumbnails-mcp
npm install
npm run build

3. Richten Sie Ihren Assistenten darauf aus

claude mcp add whitehat-thumbnails \
  --env WHT_API_KEY=wht_your_key_here \
  -- node /absolute/path/to/whitehat-thumbnails-mcp/dist/index.js

Fügen Sie zu claude_desktop_config.json hinzu:

{
  "mcpServers": {
    "whitehat-thumbnails": {
      "command": "node",
      "args": ["/absolute/path/to/whitehat-thumbnails-mcp/dist/index.js"],
      "env": { "WHT_API_KEY": "wht_your_key_here" }
    }
  }
}

Die Konfigurationsdatei befindet sich unter:

  • macOS ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows %APPDATA%\Claude\claude_desktop_config.json

Starten Sie Claude Desktop danach neu.

Verwenden Sie einen absoluten Pfad – der Assistent wird nicht aus diesem Ordner ausgeführt.


Related MCP server: GPT Image MCP Server

Werkzeuge

Wissen, was Sie tun können

Werkzeug

Was es tut

check_permissions

Testet ein Spiel und berichtet genau, welche Werkzeuge darauf funktionieren und warum die anderen nicht.

set_project_credentials

Speichert einen Open-Cloud-Schlüssel und/oder ein Roblox-Cookie für ein Spiel – die beiden Dinge, die der Bericht anfordert.

Projekte

Werkzeug

Was es tut

list_projects

Ihre Spiele und ihre Universe-IDs

get_game_info

Jedes Roblox-Spiel per Link, Place-ID oder Universe-ID nachschlagen – es muss nicht Ihres sein.

search_roblox_games

Roblox nach Name oder Stichwort durchsuchen.

add_project

Ein Spiel zu Ihrem Konto hinzufügen, das an das Roblox-Konto gebunden ist, das es bearbeiten kann.

list_collaborators / invite_collaborator

Wer sonst noch Zugriff auf ein Projekt hat, und ein einmaliger Einladungslink.

Thumbnails

Werkzeug

Was es tut

get_thumbnails

Live- und inaktive Thumbnails mit QPTR, Impressionen, qualifizierten Spielen, durchschnittlicher Spielzeit.

set_active_thumbnails

Wählen Sie aus, welche Thumbnails Roblox tatsächlich anzeigt – ersetzen, hinzufügen oder entfernen.

upload_thumbnail

Veröffentlichen Sie ein lokales Bild als Spiel-Thumbnail.

delete_thumbnail

Entfernen Sie ein Thumbnail dauerhaft aus dem Spiel.

get_qptr_trend

Tägliche Klickrate und Impressionen über 7, 14 oder 30 Tage.

get_thumbnail_momentum

Welche einzelnen Thumbnails steigen, fallen oder stagnieren.

export_thumbnail_report

Die gesamte Sammlung, nach QPTR geordnet, als PDF auf die Festplatte geschrieben.

Thumbnails erstellen

Werkzeug

Was es tut

generate_thumbnail

Generieren Sie ein Bild aus einem Prompt und Referenzen, schreiben Sie es auf die Festplatte, optional veröffentlichen Sie es.

list_generations

Alles, was für ein Spiel generiert wurde, mit den Prompts hinter jedem einzelnen.

upload_generation

Veröffentlichen Sie etwas aus diesem Verlauf, ohne es erneut hochzuladen.

list_style_profiles

Die benannten Stilvorlagen, auf die die Generierung ausgerichtet werden kann.

Rotation

Werkzeug

Was es tut

get_auto_swap

Ob ein Spiel sich selbst rotiert, nach welchen Regeln und was letzte Läufe bewirkt haben.

configure_auto_swap

Rotation ein- oder ausschalten und Schwellenwerte festlegen.

run_auto_swap

Jetzt eine Rotation auslösen, ohne auf den Zeitplan zu warten.

get_queue

Was als Nächstes live gehen soll.

queue_thumbnail / unqueue_thumbnail

Zur Warteschlange hinzufügen oder daraus entfernen.

Discord

Werkzeug

Was es tut

list_discord_roles

Rollen, die benachrichtigt werden können.

notify_team

Eine Rolle per DM benachrichtigen, optional mit Bildern und zwei Antwortschaltflächen.

get_notification_history

Was bereits gesendet wurde, mit Antworten pro Person und Zahlungsstatus.

create_ticket

Ein Ticket eröffnen – postet ein Embed mit Genehmigen/Ablehnen im Kanal des Spiels.

list_tickets

Nur die Tickets eines Spiels, mit dem, was noch unbeantwortet oder unbezahlt ist.

list_artist_channels

Textkanäle im Studio-Server, mit IDs.

create_channel / link_channel

Einen Kanal erstellen und die Tickets eines Spiels darauf ausrichten.

get_channel_messages

Einen Kanal lesen – Autor, Zeit, Text, Anhang-URLs.

send_channel_message

Im Kanal als Bot posten, als Klartext oder Embed, optional mit Bildern.

Spielnamen werden locker abgeglichen, sodass „dumpling escape“ „+1 Dumpling SMASH Walls“ findet. Wenn ein Name mehrdeutig ist, sagt das Werkzeug dies und listet die Kandidaten auf, anstatt zu raten.

Wissen, was Sie tun dürfen

Die Berechtigung für ein Roblox-Spiel ist nicht eine einzelne Erlaubnis. Sie verteilt sich auf ein .ROBLOSECURITY-Cookie (Uploads, Löschungen, Austausch des Live-Sets), einen Open-Cloud-Schlüssel (Analysen), eine Personalisierungskonfiguration, die Roblox nur erstellt, sobald ein Spiel mehrere Thumbnails hat (ob es überhaupt ein austauschbares Live-Set gibt), und einen Discord-Bot (Tickets und Benachrichtigungen). Jede davon kann einzeln fehlen, und der Fehler, den Sie sehen, ist in beiden Fällen dasselbe Achselzucken.

check_permissions testet alle gleichzeitig und antwortet in zwei Listen:

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.

Jedes „Nein“ enthält den Grund und die Lösung, denn ein „Nein“ allein schickt Sie wieder in dieselbe Schleife. Führen Sie es vor einem Schreibvorgang aus, der Ihnen wichtig ist, oder nachdem einer fehlgeschlagen ist und nicht offensichtlich ist, welche Anmeldeinformation fehlte.

Die beiden Anmeldeinformationen, die es anfordert, werden mit set_project_credentials eingegeben. Sie werden verschlüsselt gespeichert und nie zurückgelesen – der Bericht kann sagen, dass ein Schlüssel vorhanden ist und ob er funktioniert, und nichts weiter.

Auswählen, was live ist

Das Hochladen eines Thumbnails zeigt es niemandem. Roblox behält jedes Bild, das ein Spiel je hatte, und liefert eine ausgewählte Teilmenge; set_active_thumbnails ändert diese Teilmenge und wirkt sofort.

set_active_thumbnails(game: "magnet simulator", ids: ["108286870859415"], mode: "add")
set_active_thumbnails(game: "magnet simulator", ids: ["112922133257215"], mode: "remove")

add und remove passen an, was bereits live ist, und sind das, was Sie normalerweise möchten. replace macht genau die aufgelistete Menge live und alles andere inaktiv – leicht versehentlich auszulösen, wenn Sie add meinten. IDs können die Asset-IDs sein, mit denen die Berichte beginnen, oder die internen Thumbnail-IDs; beide werden akzeptiert.

Hier wird nichts gelöscht. Ein deaktiviertes Thumbnail behält seinen Verlauf und kann zurückgeholt werden. delete_thumbnail ist dasjenige, das nicht rückgängig gemacht werden kann, und es weigert sich, das letzte Live-Bild eines Spiels zu entfernen.

Generieren

generate_thumbnail führt dieselbe Pipeline aus wie die Generatorseite der Website: Ihr Prompt wird anhand einer Stilvorlage umgeschrieben und dann gegen ein oder mehrere Referenzbilder gerendert. Das Ergebnis wird in eine Datei auf Ihrem Rechner geschrieben, sodass es tatsächlich angesehen werden kann, bevor es in die Nähe eines Spiels gelangt.

generate_thumbnail(
  game: "magnet simulator",
  prompt: "character yanking a giant magnet out of a pile of loot",
  referencePaths: ["ref.png"],
  profile: "Simulator"
)

Referenzen können lokale Pfade oder öffentliche URLs sein; mindestens eine ist erforderlich, da das Modell von einem Bild ausgeht und nicht von nichts. profile wählt eine der Stilvorlagen aus, die list_style_profiles auflistet. Übergeben Sie publish: true nur, wenn das Bild bereits vereinbart wurde – andernfalls generieren Sie, schauen Sie sich die Datei an und laden Sie dann upload_thumbnail hoch.

Automatisches Rotieren

Auto-Swap entfernt die am schlechtesten abschneidenden Live-Thumbnails nach QPTR und befördert Ersatz aus einer Warteschlange, nach einem Zeitplan.

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 ist ein Prozentsatz, kein Bruchteil: 2 bedeutet 2%. Ein Spiel mit leerer Warteschlange wird ausgeführt und tut nichts, also prüfen Sie get_queue, bevor Sie es aktivieren. get_auto_swap zeigt die Regeln, den Zeitplan und was letzte Läufe tatsächlich bewegt haben – und wenn sich die Rotation selbst deaktiviert hat, ist der Grund, den es angibt, das, was zu beheben ist.

Antwortschaltflächen

notify_team kann zwei Schaltflächen anhängen und Personen antworten lassen:

notify_team(
  game: "+1 dumpling escape",
  role: "Thumbnail Team",
  message: "Pay here please: https://…",
  askForAnswer: true,
  approveLabel: "Paid",
  declineLabel: "Cancel"
)

Wer klickt, dessen Entscheidung wird allen mit dieser Rolle per DM zugesandt, einschließlich sich selbst. Jede Person kann einmal antworten.

get_notification_history meldet jede Antwort in einer eigenen Zeile mit der Discord-ID der Person und dem Zeitpunkt des Klicks, sodass eine Automatisierung auf ein bestimmtes Paar von Personen warten kann, die beide genehmigt haben, anstatt auf eine Anzahl:

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

Bezahlung für Auftragsarbeiten

Übergeben Sie paymentAmount und das Ticket wird zu einer Rechnung – die DM zeigt den Betrag und einen Bezahlen-Button, die Schaltflächen sind standardmäßig Bezahlt / Abbrechen, und der erste Klick auf Bezahlt markiert das Ticket als bezahlt:

notify_team(
  game: "+1 dumpling escape",
  role: "Thumbnail Team",
  message: "Dumpling concept art from lamy",
  paymentAmount: 10,
  paypalLink: "paypal.me/asianlamy"
)

paid verriegelt. Eine Ablehnung, nachdem jemand es bereits als bezahlt markiert hat, wird als Antwort aufgezeichnet, zahlt das Ticket aber nicht zurück – Geld, das ausgegangen ist, kann nicht durch einen Button zurückgerufen werden.

Tickets

Ein Ticket ist derselbe Datensatz wie eine Team-Benachrichtigung – dieselbe Tabelle, dieselben Antworten pro Person, dasselbe Bezahlt-Flag – mit einem Titel, einem Typ und einem Kanal, in dem es lebt. Es kann auf drei Arten geöffnet werden, und danach sind sie nicht unterscheidbar:

  • /ticket create in Discord, von jedem Kanal oder einer DM mit dem Bot

  • create_ticket hier, für Automatisierungen

  • die Benachrichtigungswerkzeuge auf der Website

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"]
)

Typen sind concept_review, final_review, payment und status. Alles außer status erhält Genehmigen/Ablehnen-Schaltflächen; ein Zahlungsticket erhält Bezahlt/Abbrechen plus den Betrag und einen antippbaren PayPal-Link, und der erste Klick auf Bezahlt setzt das Bezahlt-Flag. Antworten landen in get_notification_history genau wie Schaltflächenantworten auf einer DM, und das Embed im Kanal wird neu geschrieben, während Personen antworten, sodass die Nachricht, die alle ansehen, den aktuellen Zustand zeigt.

Jedes Spiel postet seine Tickets in einen Kanal, der einmal von Discord aus festgelegt wird:

/ticket config game:<game> channel:#lammyta

Ohne das wird ein Ticket trotzdem erstellt und ist trotzdem lesbar – es hat nur keinen Ort, an dem es erscheint, und das Werkzeug sagt dies, anstatt vorzutäuschen, dass es zugestellt wurde.

Mit Künstlern sprechen

Jeder Künstler hat seinen eigenen Textkanal im Studio-Server. Die drei Kanalwerkzeuge sind eine Abrufschleife, kein Live-Feed: Lesen Sie mit since, das auf die lastMessageId gesetzt ist, die Sie beim letzten Mal erhalten haben, und Sie sehen nur, was seitdem angekommen ist.

list_artist_channels()                              → #lammyta — id 1539…
get_channel_messages(channelId: "1539…", since: "…") → replies + art
send_channel_message(channelId: "1539…", text: "…", imagePaths: ["brief.png"])

Anhang-URLs von Discord sind signiert und verfallen in etwa einem Tag. Laden Sie Kunst also herunter, wenn Sie sie zum ersten Mal sehen, anstatt den Link für später zu speichern.

Embeds

Ein Kanalbeitrag kann ein Embed sein statt einer Textzeile — die Karte mit dem farbigen Balken an der Seite, dieselbe, die auch die Benachrichtigungs-DMs verwenden. Übergib embed statt text oder zusätzlich dazu:

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/…" }]
  }
)

Die Form ist bewusst flach — Discord verschachtelt die Fußzeile, das Bild und jeden Button in Wrappern, und nichts davon ist wichtig, um eine Nachricht zu senden. Felder werden auf die Längen gekürzt, die Discord erzwingt, statt lang gesendet zu werden, weil es die gesamte Nachricht wegen eines einzigen überlangen Felds ablehnt.

Buttons hier öffnen nur Links. Ein Button, der eine Frage stellt und die Antwort aufzeichnet, gehört zu notify_team oder create_ticket, die einen Ort haben, um die Antwort zu speichern.

Damit der Bot einen Kanal sehen kann, braucht er dort View Channel, Read Message History, Send Messages und Attach Files. Lade ihn ein mit:

https://discord.com/oauth2/authorize?client_id=<APP_ID>&scope=bot%20applications.commands&permissions=117760

Beide Scopes sind wichtig. bot bringt ihn in den Server; applications.commands macht /ticket dort sichtbar. Ein Bot, der ohne den zweiten eingeladen wurde, funktioniert für DMs und Kanalbeiträge einwandfrei, während seine Slash-Commands stillschweigend nie erscheinen.


Konfiguration

Variable

Erforderlich

Bedeutung

WHT_API_KEY

ja

Dein Schlüssel von der Keys-Seite

WHT_BASE_URL

nein

Nur wenn du deine eigene Kopie der Website betreibst


Hinweise

Discord-DMs können abgelehnt werden, und das ist kein Fehler. Discord lässt einen Bot niemanden anschreiben, der ihn blockiert hat, der DMs von Servermitgliedern deaktiviert hat oder der keinen Server mit dem Bot teilt. notify_team meldet pro Person, welcher dieser Fälle eingetreten ist, statt einer einzigen Erfolgszahl.

Roblox moderiert Uploads asynchron. Wenn upload_thumbnail Pending zurückgibt, bedeutet das, dass der Upload angenommen wurde und geprüft wird — normalerweise ein paar Minuten.

Einige Spiele sind schreibgeschützt. Hochladen und Austauschen erfordern ein Roblox-Konto mit Bearbeitungszugriff auf diese Erfahrung; ein Open-Cloud-Schlüssel kann keines von beiden. Die Website zeigt jedes Projekt als Full Edit, View Only oder Public View, und die Tools melden, wenn etwas nicht verfügbar ist, statt still zu scheitern. check_permissions ist der schnellste Weg, um herauszufinden, in welchem Fall sich ein Spiel befindet.

Drei Tools ändern, was Spieler tatsächlich sehen, und zwar in dem Moment, in dem sie zurückkehren: set_active_thumbnails, run_auto_swap und configure_auto_swap mit enabled: true. Hochladen und Generieren tun das nicht — ein hochgeladenes Thumbnail bleibt inaktiv, bis etwas es live schaltet.

Ein Tool kann nicht rückgängig gemacht werden. delete_thumbnail entfernt das Bild von Roblox zusammen mit seiner Analysestatistik. Das Deaktivieren mit set_active_thumbnails(mode: "remove") ist die umkehrbare Version und ist fast immer das, was gemeint war.

check_permissions testet die Generierung nicht. Die einzige ehrliche Prüfung wäre, ein Bild zu generieren, was Geld kostet und eine Spur hinterlässt. Wenn generate_thumbnail scheitern wird, scheitert es beim ersten Aufruf, mit dem Grund.

Lizenz

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