GifSnap by Rowix
Search GIFs and retrieve animated media URLs; show reactions in clients that support MCP Apps.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"gifsnap": {
"url": "https://gifsnap.com/plugins/chatgpt/mcp"
}
}
}Remote endpoints
https://gifsnap.com/plugins/chatgpt/mcpstreamable-httpWhat it can do
Tool inventory
Tools (2)
🟢react_with_gif(query, excludeIds)
Use this when GifSnap is selected for conversational GIF reactions. During that reaction chat, use one matching GIF for each casual social reply, including follow-ups like haha, xd, or laughter emojis, without requiring another @mention. Preserve the topic in query: cheeseburger hungry for a burger conversation, laughing for laughter, friendly wave for hello. On haha, xd, or laughter emojis, use query laughing, without reusing a previous burger/food/object topic. Preserve a subject only when the current message actually mentions it. The component displays one GIF; respond in TEXT ONLY alongside it, without an additional image or picker. Read reaction.description so you know what was displayed. Pass recent returned reaction.id values in excludeIds to avoid repeating GIFs. Respect stop or fewer-GIF requests and omit reactions for serious or purely factual tasks. Do not send transcripts or personal information.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Two to six search keywords for the current topic and action, such as cheeseburger hungry, cat laughing, friendly wave, or laughing. Keep concrete subjects: a burger conversation should not become generic excitement. For a laughter-only or emoji-only follow-up, use its present emotion, e.g. laughing; do not carry forward an old object such as burger unless the user mentions it again. No personal information or transcript."
},
"excludeIds": {
"default": [],
"description": "Up to five recent reaction.id values from this conversation to avoid repeating a GIF; omit on the first turn.",
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"mode": {
"type": "string",
"const": "reaction"
},
"reactionShown": {
"type": "boolean"
},
"reaction": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"description": {
"type": "string"
}
},
"required": [
"id",
"description"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"ok",
"empty",
"unsupported",
"error"
]
},
"message": {
"type": "string"
}
},
"required": [
"query",
"mode",
"reactionShown",
"reaction",
"status",
"message"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢search_gifs(query, limit)
Use this when the user explicitly wants to search, browse or compare GIF choices. Search by emotion, character or brief phrase and show up to 6 choices with optional copy/share controls. For the assistant's own conversational GIF response, use react_with_gif instead. Send only short keywords; omit personal data and conversation transcripts. This searches existing GIFs; it does not create images or send messages.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Two to six search keywords for the current topic and action, such as cheeseburger hungry, cat laughing, friendly wave, or laughing. Keep concrete subjects: a burger conversation should not become generic excitement. For a laughter-only or emoji-only follow-up, use its present emotion, e.g. laughing; do not carry forward an old object such as burger unless the user mentions it again. No personal information or transcript."
},
"limit": {
"default": 3,
"description": "Number of GIF choices to browse.",
"type": "integer",
"minimum": 1,
"maximum": 6
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"mode": {
"type": "string",
"enum": [
"reaction",
"search"
]
},
"gifs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"animationUrl": {
"type": "string",
"format": "uri"
},
"animationType": {
"type": "string",
"enum": [
"image",
"video/mp4",
"video/webm"
]
},
"posterUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"pageUrl": {
"type": "string",
"format": "uri"
},
"width": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"height": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id",
"title",
"url",
"animationUrl",
"animationType",
"posterUrl",
"pageUrl",
"width",
"height"
],
"additionalProperties": false
}
},
"status": {
"type": "string",
"enum": [
"ok",
"empty",
"unsupported",
"error"
]
},
"message": {
"type": "string"
}
},
"required": [
"query",
"mode",
"gifs",
"status",
"message"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}Community
Evidence