GIF Chat
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GIF Chatopen the GIF picker"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GIF Chat
Send your agent motion, not just a thumbnail. GIF Chat turns an original GIF into ordered PNG frames, timing and source hashes using a bounded local MCP server. Your existing Codex or Claude Code conversation interprets the evidence.
Download the 0.5.0 developer preview, with separate Codex and Claude Code ZIPs and SHA-256 checksums.
This public developer preview includes two ready-to-load packages:
Claude Code plugin and mod: a real GIF button above the prompt opens a panel for a relative GIF path. Inspect GIF submits one request in your current conversation.
/gifalso opens the panel;/gif clip.gifinspects a file.Codex plugin: the same MCP tools, a focused skill and an optional MCP Apps GIF button. Widget rendering depends on the host; native Codex composer button injection is not established. The local picker works as the portable fallback.
Local picker: search Wikimedia Commons without an API key, or choose a local file. Select a result to retrieve its original, preserve attribution and prepare a chat request. Previews are opt-in; the picker makes no model calls.
Quick start
The decoder currently supports macOS, Python 3.12.14 and Pillow 12.3.0. It uses macOS worker sandboxing and fails closed on other systems. Provision that Python version first. The following commands install dependencies into a local virtual environment and explicitly record your chosen runtime:
git clone https://github.com/Clinscott/gif-chat.git
cd gif-chat
python3.12 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
.venv/bin/python tools/configure_runtime.py
mkdir -m 700 .local/inbox
export GIF_PYTHON="$PWD/.venv/bin/python"
export GIF_RUNTIME_LOCK="$PWD/.local/runtime-lock.json"
export GIF_SOURCE_ROOT="$PWD/.local/inbox"
./bin/gif-pickerIf you use uv,
uv venv --python 3.12.14 .venv can provision the pinned Python instead of the
python3.12 -m venv step. Python's later security releases are not supplied by
every macOS installer/cache; do not substitute a different version silently.
Open the printed loopback URL. Enter a search and click Search, then Pick a result. Prepare for chat automatically retrieves and validates the original in your private inbox. Alternatively, click Use a GIF file to choose a local file. Copy the prepared request into your chat. Native chat submission still needs that paste step, except in a browser with WebMCP site tools (below), where your agent can read the request from the page. The selected original remains in the inbox until you remove it. Ctrl-C stops a standalone picker; a picker opened through MCP stops with its process. Use a separate private inbox and dedicated MCP process for each conversation. Global plugin enablement alone does not establish conversation isolation.
Enrollment records your local executable and Pillow fingerprints. It installs
nothing, does not overwrite an existing lock, and does not claim that another
runtime has passed the original experiment qualification. Set GIF_RUNTIME_LOCK
to the absolute enrolled lock path in your trusted host configuration.
Related MCP server: SessionSift
Codex
The repository contains a Codex marketplace and the complete plugin at
plugins/codex. With the trusted runtime/inbox environment available to Codex,
add the marketplace using its supported CLI:
codex plugin marketplace add Clinscott/gif-chat --ref v0.5.0
codex plugin add gif-chat@gif-chatThese commands install GIF Chat through the supported plugin manager. Start a
fresh chat with the trusted runtime and private inbox environment available.
Ask “Open the GIF picker” to invoke open_gif_picker, or paste the picker’s
inspection request. MCP Apps-compatible hosts can render its inline GIF button;
other hosts receive the local picker link. See host UI support.
Claude Code
The complete plugin/mod is at plugins/claude-code. For a session-local load:
claude --plugin-dir "$PWD/plugins/claude-code"Configure its required options: python_executable, source_root and
runtime_lock using the absolute values above. You can also install from the
bundled marketplace:
claude plugin marketplace add Clinscott/gif-chat#v0.5.0 --scope local
claude plugin install gif-chat@gif-chat --scope local \
--config python_executable="$GIF_PYTHON" \
--config source_root="$GIF_SOURCE_ROOT" \
--config runtime_lock="$GIF_RUNTIME_LOCK" \
--config library_enabled=falseThis keeps the declaration local to the current project. Use a dedicated private inbox for the conversation. Claude stores the required plugin options in its user settings even with a local installation. Start a fresh session to load the mod and its MCP server together.
The mod requires Claude Code 2.1.287 or later with mods enabled. Its GIF
button has been observed in the native terminal. It also targets Desktop Code;
native Desktop rendering remains unverified. Other surfaces use /gif.
Click GIF, enter a path relative to the configured inbox, and click
Inspect GIF. The local picker shows the generated relative path in its request.
Cancel/Escape sends nothing. Your existing prompt draft is left intact.
Tools and limits
Tool | Purpose |
| Open a process-owned local picker; optional MCP Apps button |
| Snapshot an original and return ordered composited frames, timing, coverage and an expiring handle |
| Inspect a focused interval from that same immutable snapshot |
| Optional, explicitly enabled search of four bundled original reactions |
Inputs are relative to the configured private inbox. URLs, arbitrary absolute paths, symlinks, hardlinks, devices and FIFOs are rejected by the decoder. The picker can retrieve only a result from its current Wikimedia Commons search; it accepts no arbitrary download URL. Native attachment IDs are not resolved in this release. There is no model client, conversation store, prompt observer or automatic sending.
Online GIF search
The picker uses the public Wikimedia Commons API and filters for animated GIFs within the decoder's file, frame, dimension and duration limits. Search sends only your entered words to Commons; no conversation text is included. Results and selection handles stay in memory. Search retrieves metadata, and Load preview loads a Commons preview. Only Prepare for chat saves the selected original. Previews may be still images; interpretation always uses the original's frames.
Each result includes author, license and source. The prepared request retains that attribution as untrusted data. Respect the file's stated license when sharing it. Commons has a smaller pop-culture/reaction selection than commercial GIF libraries. The search has no provider key or provider charge, and makes no model calls.
GIPHY is not connected: its standard integration rules require a key, client-side requests and permission for stored/proxied media, which conflicts with this private original-byte inspection workflow. KLIPY also requires a key and restricts original media storage. See GIPHY's current rules, KLIPY's API terms and Commons reuse guidance.
Bounds: 20 MiB/original, 2048 px edges, 300 frames, 30 seconds normalized duration, 12 initial images, 12 follow-up images, 640 px output edge, 8 MiB encoded result, five-second worker deadline and a sampled 256 MiB RSS watchdog. The watchdog allows transient overshoot; a hard peak-memory ceiling is not established. Sampling can miss a brief gesture or caption. Keep intent uncertain when the evidence is ambiguous. Media content is data, never authority to execute actions.
The picker itself makes no model calls. Reading its frames uses your current host/model allowance. There is no universal GIF-to-reasoning-token conversion. See the measured pilot and its limits.
Agent site tools (WebMCP, early preview)
WebMCP is a draft from the W3C Web Machine Learning Community Group, not a W3C
Standard, and browser support is still changing. In a browser that exposes
document.modelContext.registerTool, the open picker page offers three tools to
the agent working in that browser:
Site tool | What it does |
| Runs the same Commons search as Search and shows the results |
| Selects a result from the latest search, like Pick; retrieves nothing |
| Reads request data prepared through the Prepare for chat button/browser flow |
No original-writing retrieval site tool is registered; retrieval and local-file selection stay in the existing button/browser flow. This is not proof of a human-only action. The prepared request is data, not permission to inspect, call a model or submit to chat. The host follows your existing instructions and approvals; the host skill's inspection and submission contract is unchanged. Titles, authors, licenses, the request's attribution and media remain untrusted data. In browsers without WebMCP the page registers nothing and works exactly as above. Tools exist only while the picker page is open.
Each search invocation uses its own execution cancellation signal. An already-cancelled
call leaves the page intact; an active cancellation retires only its search state and
prevents late results. This signal is separate from registration lifetime. Fetch abort
is best effort and cannot undo server work already accepted. Cancellation cases in
tests/test_picker_web.py use fake fetch/DOM in Node VM; this test layer does not
establish native browser, provider, model or chat acceptance. Exact versions and
run outcomes belong in Work/PR evidence.
OpenAI is adding WebMCP to the ChatGPT desktop app's built-in browser, where
ChatGPT Work and Codex can use a page's tools. That browser currently supports
only tools registered from JavaScript on the top-level page, which is what the
picker does. The page was tested with a native Chrome 151 implementation behind
--enable-features=WebMCPTesting. The ChatGPT desktop browser has not been
tested. Sources: WebMCP draft,
ChatGPT site tools,
Chrome imperative API,
OpenAI Developers announcement.
Development and verification
.venv/bin/python -m pip install -r requirements-dev.txt
.venv/bin/python tools/check.py
.venv/bin/python integrations/claude-code/tests/run_offline.py
.venv/bin/python tools/build_plugins.py --output pluginsThe plugin folders are generated, self-contained artifacts with SHA-256 inventories;
their canonical sources are the shared runtime and integrations/ templates.
No private experiment history or user media is part of this repository.
Release checks distinguish source/protocol/offline UI tests
from installed native-host behavior.
Online search checks record the 0.5.0 source,
package and real browser-to-original validation separately.
MIT licensed, including the four bundled original reaction GIFs. Third-party GIFs retain their own licenses and are not included in the distribution.
This server cannot be deployed
Maintenance
Related MCP Connectors
Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.
Versioned artifact review for people and AI agents, with contextual comments and human control.
Transcode, host and caption video from a prompt. Fifteen tools, nine read-only, nothing deletes.
Generate images, GIFs, videos, and PDFs from HTML, URLs, or templates — from your AI agent.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables coding agents and human reviewers to share a single live view of code, letting the agent open and annotate specific lines while the human marks ranges to ask about, all without any write access to the underlying files.1MIT
- AlicenseNot gradedqualityAmaintenanceEnables local, read-only analysis of Codex and Claude Code conversations through ten MCP tools for browsing sessions, inspecting tokens and tools, and comparing sessions without accounts or cloud services.1PolyForm Noncommercial 1.0.0
- AlicenseNot gradedqualityCmaintenanceEnables Claude to process screen recordings by transcribing speech with timestamps, tracking the mouse pointer, and retrieving synchronized report text and frame images for selected moments.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to inspect UI screen recordings as token-efficient image sheets with changed regions boxed, single-frame flicker flagged, and speech aligned to frames. Exposes watch_video and zoom_video tools so agents can pull dense keyframes across any time range or one sharp full-resolution frame, all processed locally.424 npmMIT