Mr Farts

Mr Farts Developer Docs

Access Fart Sounds, Music, Videos and content.

Last updated: 9 October 2026 · Publisher: HUGO FM GAMES (hugo.fm)

Overview

Fart Sounds is an MCP server that plays Mr Farts fart sounds, songs and cartoons inside AI assistants. Playback tools open an embedded player (an MCP Apps interface) that plays the audio or video in the chat.

Mr Farts started as Big Fart, an Alexa skill.

Connect

HostServer addressSign-in
ChatGPThttps://fart.shoutoutgames.com/mcpNone
Claudehttps://claude.mrfarts.io/mcpNo sign-in
Other MCP clientsEither addressNone
Any HTTP client (REST)https://fart.shoutoutgames.com/v1, see the REST API docsNone

ChatGPT

In ChatGPT developer mode, add a custom app with the server address https://fart.shoutoutgames.com/mcp and no authentication. Then ask for a fart and tap Enable sound in the player.

Claude

  1. In Claude, open Customize > Connectors.
  2. Choose Add custom connector.
  3. Enter the URL exactly: https://claude.mrfarts.io/mcp
  4. For authentication, choose No sign-in.
  5. Ask for a fart, then tap Enable sound in the player.

Use the Claude address exactly as shown, with no trailing slash and no query string. Claude derives the player's domain from the exact connector address. With a trailing slash or query string, the player does not load.

Any MCP client

TransportStreamable HTTP. Send POST with Content-Type: application/json and Accept: application/json, text/event-stream. Each request gets one complete response.
SessionsStateless. The server does not issue an Mcp-Session-Id.
AuthenticationNone
Protocol versionsAnswers 2025-06-18 and 2025-11-25
PlayerMCP Apps resource ui://mrfarts/player/v2.html. Optional: results are usable without it.
MediaMP3 and MP4 on https://assets.mrfarts.tv
curl -s https://fart.shoutoutgames.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

How the two addresses differ

Both addresses serve the same 13 tools, the same inputs and the same structuredContent. They differ in presentation, in the player address (mcpUrl) and in the player domain Claude needs. Claude connectors that still use /mcp get the Claude presentation too.

 /mcp (ChatGPT and other clients)claude.mrfarts.io/mcp
Tool titlesNot setSet, for example "Play a Fart"
Result text, playback toolsWhat is playing, plus a suggestionThe same, plus up to 3 direct media links
Result text, browse_fartsNumber of matchesThe same, plus one id: title line per item
Server instructionsWritten for ChatGPTA neutral description of the tools

Tools

The model can call 9 tools. Read means the tool changes nothing. Write means the tool changes only our own anonymous player session. No tool reads or changes user accounts, sends messages, publishes anything or spends money. No tool is a sensitive write.

ToolAccessWhat it doesInputs
fartWritePlays a fart: random by default, or a named sound, animal, person-name joke, seasonal pack, extreme, fart of the day, or 1–100 sounds in a row.selection, category, personName, mode, count, locale, timezone
play_fart_musicWritePlays a Mr Farts song by title, catalogue ID or at random.selection, locale, timezone
play_fart_cartoonWritePlays a Mr Farts cartoon video by title, catalogue ID or at random.selection, locale, timezone
start_fart_countdownWriteShows a countdown in the player, then plays a fart.seconds, locale, timezone
fart_weatherWritePlays the Mr Farts "windy weather" joke. It does not get real weather.locale, timezone
fart_timeWriteShows a clock and tells the time with fart sounds.locale, timezone
fart_prankWritePlays the "come closer" prank with on-screen text and sound.locale, timezone
browse_fartsReadSearches the catalogue and returns IDs that the playback tools accept. Does not change playback or open the player.category, query, offset, limit, locale, timezone
show_playerWriteReopens the player without playing anything.locale, timezone

Inputs

Every input is optional. Input objects are strict: an unknown property is rejected with an input validation error.

InputTypeUsed byNotes
selectionstring, 1–150 charactersfart, play_fart_music, play_fart_cartoonA catalogue ID such as sounds:24, or a name or synonym from the user. Omit for a random choice. Unknown names play a random item.
categorysounds, animal, music, cartoon, christmas, easter, halloween or valentinefart, browse_fartsLimits the choice or the search to one pack.
personNamestring, 1–100 charactersfartFirst name for the person-name joke.
moderandom, extreme or dailyfartdaily is the fart of the day, picked from the date in the user's timezone.
countinteger, 1–100fartNumber of sounds in a row. Default 1.
secondsinteger, 1–1800start_fart_countdownCountdown length. Default 60.
querystring, up to 150 charactersbrowse_fartsSearch text. Empty lists the whole category.
offsetinteger, 0–1000browse_fartsDefault 0.
limitinteger, 1–100browse_fartsDefault 30.
localestring, up to 20 charactersAll 9 toolsFor example en-US, de-DE, fr-FR or es-ES.
timezonestring, up to 80 charactersAll 9 toolsAn IANA name such as Europe/London.

If locale or timezone is missing, the server uses the hints the host sends (ChatGPT sends openai/locale and openai/userLocation), then the session's saved values, then en-US and UTC.

Outputs

Tool annotations: readOnlyHint is true only for browse_farts. openWorldHint is false for every tool. destructiveHint is true only for control_player (see below).

Player-only tools

Four more tools exist only for the embedded player. Each one declares _meta.ui.visibility: ["app"], so hosts that render MCP Apps hide them from the model. The model never needs them. A host that does not render the player has no reason to call them.

ToolAccessPurposeInputs
control_playerWriteStops, replays or plays another item from the same pack, or turns video on or off for the next selection. The player uses it for its Home button (stop) and its Video switch. Marked destructiveHint: true because stop cancels playback.sessionId, action (stop, replay, next, video_on, video_off), optional operationId, locale, timezone
player_requestWriteRuns a player button, such as a sound picked from the player's list, in the player's own session.sessionId, tool (any model-facing tool except show_player), args (checked against that tool's inputs), optional operationId
sync_playerWriteThe player polls it about once a second to receive new commands and renew a short lease, so only one player per session plays at a time.sessionId, widgetToken, instanceId (UUID), afterRevision (integer, 0 or more), optional takeover
acknowledge_playbackWriteThe player claims a command before playing it, then reports what happened.sessionId, widgetToken, instanceId, revision (integer, 1 or more), status (claimed, playing, ended, stopped, blocked, failed)

These tools need credentials from a previous result. show_player and every playback tool return sessionId, widgetToken and mcpUrl in _meta. control_player and player_request go through the host and need only sessionId. sync_player and acknowledge_playback go straight from the player to mcpUrl and also need widgetToken. Called with made-up values, they return the session-expired error.

Repeating a control_player or player_request call with the same operationId does not repeat the command. The result has duplicate: true.

Player sessions

Each player works in an anonymous session that is deleted 24 hours after it was last used. In ChatGPT, one conversation keeps one session. Claude sends no conversation identifier, so each Claude request starts a new session, and an open player switches to the newest one.

Example request and response

Request:

POST https://fart.shoutoutgames.com/mcp
Content-Type: application/json
Accept: application/json, text/event-stream

{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"fart","arguments":{"selection":"wet"}}}

Response from /mcp (shortened). Clients that accept text/event-stream receive the same JSON as a single SSE event (event: message / data: …).

{
  "jsonrpc": "2.0", "id": 1,
  "result": {
    "content": [{ "type": "text", "text": "Here comes Wet fart! Try: \"Play a wet fart!\"" }],
    "structuredContent": {
      "text": "Here comes Wet fart!",
      "selection": {
        "id": "sounds:24", "category": "sounds", "title": "Wet",
        "audioUrl": "https://assets.mrfarts.tv/farts/24.mp3",
        "videoUrl": "https://assets.mrfarts.tv/short-vid-farts/24.mp4"
      },
      "playbackStatus": "requested"
    },
    "_meta": { "sessionId": "…", "widgetToken": "…", "mcpUrl": "https://fart.shoutoutgames.com/mcp" }
  }
}

On claude.mrfarts.io/mcp, the same call returns the same structuredContent. The text adds the media link, and mcpUrl is https://claude.mrfarts.io/mcp:

Here comes Wet fart! Media: https://claude.mrfarts.io/media/farts/24.mp3 Try: "Play a wet fart!"

A browse_farts call with {"query":"wet","limit":3} on claude.mrfarts.io/mcp returns text like this:

4 matching items. All packs are free.
sounds:24: Wet
sounds:23: Wet and Squeaky
sounds:59: Wet and Grumpy
Try: "Play a Mr Farts cartoon!"

Example prompts

PromptToolExpected result
"Play a fart."fartA random fart plays. The text names it: "Here comes … fart!"
"Play a wet fart."fart with selection: "wet"The Wet fart (sounds:24) plays.
"Play a cow fart."fartThe cow fart from the animal pack plays.
"Do 50 farts in a row!"fart with count: 50A message such as "50 farts coming your way." (the wording varies). 50 farts play in a row.
"Play a Mr Farts song."play_fart_musicA song plays. The text says "Now Playing" and the title.
"Play a fart cartoon."play_fart_cartoonA Mr Farts cartoon video plays.
"Fart in 10 seconds."start_fart_countdown with seconds: 10"Farting will start in 10 seconds." A 10-second countdown, then a fart.
"What time is it in farts?"fart_timeA clock, and the time told with fart sounds.
"What fart sounds do you have?"browse_fartsA list of sounds with names and IDs. Nothing plays.
"What's the real weather in London tomorrow?"NoneFart Sounds should not be used. fart_weather is a joke, not a forecast.
"Buy me the premium fart pack."NoneNothing to buy. All content is free.

Errors and limits

Tool errors

Tool errors come back as a normal result with isError: true and a text message.

SituationMessage
Invalid argument (wrong type, out of range, unknown field)Names the tool and the field, for example Input validation error: Invalid arguments for tool fart: count: Too big: expected number to be <=100
Unknown timezoneUnknown timezone. Use an IANA timezone such as Europe/Budapest.
Player session expired, or a made-up sessionIdThis player session expired. Ask again to open a new player.
Wrong widgetTokenInvalid player credentials.
Another player holds playbackAnother player is active.
Replay before anything playedThere is nothing to replay yet. Ask for a fart first.
Same operationId used for a different commandoperationId was already used for a different command.
Temporary server problemThe player service is temporarily unavailable. Retry with the same operationId.

Unknown sound, song or cartoon names are not errors. A random item from that pack plays, and the result names what played.

HTTP status codes

StatusMeaning
405GET on the endpoint, for example when you open it in a browser. MCP clients use POST.
403A browser request from an origin that is not allowed.
413Request body over 100 KB.
429Rate limit exceeded. Wait a moment and retry.

Limits

Troubleshooting

Data and privacy

Full details: Privacy policy.

Support

Questions, bug reports and deletion requests: hugo.fm/contact.

Fart Sounds and Mr Farts are published by HUGO FM GAMES, a trading name of HUGO.FM Games Limited (company no. 14615936) (hugo.fm). Terms of use.

Mr Farts is made by HUGO FM GAMES.