White Hat Thumbnails
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_projectsA | List the Roblox games on this account, with their universe ids. Use this to turn a game name the user said into an id. |
| get_thumbnailsA | Read a game's thumbnails and how they are performing: QPTR, impressions, qualified plays and average playtime, split into the live (active) set and inactive variants. Answers questions like 'how are the thumbnails doing on '. |
| list_discord_rolesA | List the Discord roles that can be notified, so a name the user said can be matched to one. |
| notify_teamA | DM everyone holding a Discord role about a game. Can attach images and can ask for an answer with two buttons whose labels you choose (for example Approve/Disapprove, or Paid/Cancel). When buttons are used, whoever answers has their decision sent to the whole role. Pass paymentAmount to make it an invoice for commissioned work: the DM shows the amount and a pay button, the buttons default to Paid/Cancel, and clicking Paid marks the ticket paid. |
| get_notification_historyA | What has already been sent to the team about a game, with timestamps and any answers. Each answer names who gave it, what they chose, their Discord id, and when β so a caller can gate on a specific pair of people having both approved. Payment tickets also report whether they are paid. |
| create_ticketA | Open a ticket on a game β the same thing the /ticket command does in Discord. Each ticket gets a channel of its own, named π’-0001 and filed under a category named after the game, so the sidebar reads as what is open on it; closing the ticket renames that channel to closed-0001 and drops the dot. The ticket itself is an embed with Approve, Deny and Close buttons. Use type 'payment' with amountUsd to ask for money; it counts as paid once someone clicks Paid. |
| set_ticket_stageA | Set which of the twelve production stages a ticket is on, and redraw the pinned status card in its channel. Every move posts its own card in the ticket channel rather than editing the last one, so the channel is a readable record of how the work went; only the newest stays pinned. Jumping several stages at once is allowed and the card names the ones that were skipped. Opening a ticket puts it on 'ordered' and clicking Approve moves it to 'confirmed' automatically; every stage after that is set here or with /ticket status. The two review gates are stored apart β 'concept_review' waits on the idea, 'art_review' waits on the finished art β even though both read as "Waiting for review" to a person. |
| get_ticket_stageB | Where a ticket sits in the twelve-stage pipeline, what comes next, any estimate on it, and every stage it has been through with who moved it and when. Use this to answer "how is that going" without reading the channel. |
| close_ticketA | Close a ticket once it is done, or open a closed one back up. Closing renames its channel from π’-0007 to closed-0007 and greys the embed, so the sidebar stops showing it as live work. The same thing the Close button on the ticket and /close-ticket in Discord do. Name the ticket by its number (0007, or just 7) or by the id create_ticket handed back. |
| post_ticket_panelA | Post a game's standing "Add ticket" button in its channel. Anyone who clicks it gets a short form, and filing it opens a numbered channel for that ticket under the game's category. create_channel and link_channel already do this when they point a game at a channel, so this is for putting the button back after it has scrolled out of sight, or moving it somewhere else. Posting it again takes the previous one down rather than leaving two. |
| list_artist_channelsA | The text channels the bot can see in the studio Discord server, with their ids β one per artist. Use this to turn an artist name into a channel id. A channel missing from this list is one the bot has not been given access to. |
| create_channelA | Make a text channel in the studio Discord server - one per game or per artist. Pass a game to point it at that game at the same time, which is the whole of setting a new game up: the channel exists, its tickets go there, and the site's View channel button follows. Running it twice with the same name reuses the channel already there rather than making a second one. The bot needs Manage Channels; without it this comes back saying so, and the fix is a fresh invite link, not another call. |
| link_channelA | Point a game at a channel that already exists: where its tickets get posted, and where the View channel button on its notifications goes. The same pairing /ticket config makes in Discord, without needing to be in the server. Take the id from list_artist_channels. Pass no channel to unlink. |
| get_channel_messagesA | Messages in a studio channel, oldest first, with author, time, text and attachment URLs. Pass the lastMessageId from the previous read as |
| send_channel_messageA | Say something in a studio channel as the bot, as plain text or as an embed β the card with a coloured bar, a title, fields and link buttons. Images can be attached either way. Meant for messages that were already agreed on β briefs, thank-yous, status notes β not for improvising a conversation with an artist. |
| upload_thumbnailA | Publish a local image as a thumbnail on a Roblox game. Roblox moderates asynchronously, so a Pending result is normal rather than a failure. |
| check_permissionsA | Everything this key is allowed to do to one game, probed rather than assumed: whether analytics are readable, whether the Roblox account behind the project can upload, delete and swap the live set, whether the game has a personalization config at all, whether auto-swap is armed, and whether Discord and its channel are wired up. Call this first when a write is about to happen, or when something failed and it is not obvious which credential was missing β every 'no' comes back with the reason and what would fix it. |
| set_project_credentialsA | Attach an Open Cloud API key and/or a .ROBLOSECURITY cookie to a game β the two things check_permissions reports missing. The key unlocks analytics; the cookie unlocks uploading, deleting and swapping the live set. Both are stored encrypted and never read back. Pass an empty string to clear one: clearing the cookie reverts the game to the shared default account. Owner only. Do not invent these values β they come from the user. |
| set_active_thumbnailsA | Change which of a game's thumbnails Roblox shows on the homepage. Ids can be either the asset ids get_thumbnails leads with or the internal thumbnail ids β both are accepted and resolved. mode 'replace' makes exactly the listed set live and everything else inactive; 'add' and 'remove' adjust the current set instead, which is what you usually want when acting on one thumbnail. The change is immediate and Roblox starts serving it to players; nothing is deleted either way, so an inactive variant can always be brought back. |
| delete_thumbnailA | Permanently remove a thumbnail from a Roblox game. This is not the same as taking it out of the live set β set_active_thumbnails with mode "remove" does that and keeps the image, which is almost always what is wanted. Roblox has no undo for a delete, and the analytics history for that asset goes with it. Only reach for this when the image should not exist on the game at all. |
| generate_thumbnailA | Make a new thumbnail image with the site's AI pipeline β the same one the generator page uses β from a prompt and at least one reference image. The prompt is rewritten against the studio style guide first unless enhance is turned off. The result is written to a file on this machine so it can be looked at, and saved to the project's history. Pass publish to send it straight to Roblox, which is only worth doing when the image has already been agreed on; otherwise generate, look at it, then call upload_thumbnail. |
| list_generationsA | Every thumbnail generated for a game, newest first, with the prompt behind it, the rewritten prompt the model actually saw, the references used and the stored image URL. Use it to find something made earlier and publish it with upload_generation, or to reuse a prompt that worked. |
| upload_generationA | Publish an image already in a project's history to Roblox, by its generation id from list_generations. Nothing is downloaded or re-uploaded β the site sends its own stored copy β and the resulting Roblox asset id is recorded against the generation, which is what later lets its analytics be traced back to the prompt that made it. |
| list_style_profilesA | The named style guides the prompt enhancer can be pointed at, with the instructions each one carries. Pass a name as |
| get_auto_swapA | Whether a game rotates its own thumbnails, on what schedule and rules, and what the last runs actually did. Auto-swap drops the worst-performing live thumbnails by QPTR and promotes replacements from the queue. A game that turned itself off reports why β that reason is the thing to act on. |
| configure_auto_swapA | Turn a game's automatic thumbnail rotation on or off and set its rules. Turning it on schedules the next run and clears any self-disabled flag. Every field is optional: only what is passed changes. Rotation pulls replacements from the queue, so a game with an empty queue will run and do nothing β check get_queue before turning it on. |
| run_auto_swapA | Fire a game's rotation once, immediately, without waiting for the schedule or needing it enabled. It applies the same rules β drop the worst live thumbnails by QPTR, promote from the queue β and changes what players see. A run that finds nothing worth swapping reports that rather than failing. |
| get_queueC | Thumbnails lined up to go live, in the order auto-swap will promote them. This is where rotation gets its replacements: an empty queue is why an enabled auto-swap runs and does nothing. |
| queue_thumbnailA | Line an existing thumbnail up to go live at the next rotation. It has to already be on the game β upload it first if it is not. Queuing does not change what players see; auto-swap promotes it when it drops something, or set_active_thumbnails can put it live straight away. |
| unqueue_thumbnailA | Remove an entry from the swap queue so auto-swap will not promote it. The thumbnail itself is untouched and stays on the game. |
| get_qptr_trendA | A game's daily click-through rate and impressions, to answer whether it is trending up or down rather than how one thumbnail is doing right now. Roblox only serves the last 30 days; anything older comes from the site's own archive, and days it has neither for come back empty rather than as a zero. |
| get_thumbnail_momentumA | Per-thumbnail direction over a window: whether each one's QPTR is climbing, sliding or flat, compared against its own earlier half rather than against the others. Use it to decide what to drop when a game's overall numbers are fine but something in the set is dragging. Needs stored history, so a game added recently will have nothing to compare. |
| export_thumbnail_reportA | Render a game's thumbnails and their figures, ordered by QPTR, into a PDF written to this machine β the shareable version of get_thumbnails, for sending to a client or an artist. Images are fetched and embedded, so this takes a few seconds. |
| get_game_infoA | What Roblox knows about a game β name, description, players, visits, likes, creator β from a game link, a place id or a universe id. It does not have to be a project on this account. The reply also says whether any configured Roblox account can edit its thumbnails, which is what decides whether adding it as a project would be read-only. |
| add_projectA | Put a Roblox game on this account so the rest of these tools can act on it. Takes a game link, place id or universe id, looks the game up, and pins it to whichever Roblox account can actually edit it β without that pin, writes default to an account with no access and fail. A game already claimed by someone else is refused rather than taken over. Follow it with check_permissions to see what still needs a credential. |
| search_roblox_gamesA | Search Roblox for games by name or keyword β for finding a game to add, or for looking at what comparable experiences are using as thumbnails. Results are what Roblox shows a signed-in account, so they are tailored rather than absolute. |
| list_ticketsD | Just the tickets on a game, without the plain notes get_notification_history mixes in β what was asked for, who answered, and for payment tickets whether the money has been marked paid. Use it to answer 'what is outstanding on this game'. |
| list_collaboratorsA | The people a project has been shared with, and any invite links still open. Owner only. A shared collaborator can read and act on the project but cannot see or change its stored credentials. |
| invite_collaboratorA | Create a single-use invite token for a project, good for seven days. Whoever redeems it on the site gains access to the project β they can read its thumbnails and act on it, but never see its stored credentials. Owner only. Hand the token to one person; it is spent on first use. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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