manovagyanik1/clipy-mcp

๐ŸŽฅ Multimedia Process
0 Views
0 Installs

๐Ÿ“‡ โ˜๏ธ ๐ŸŽ ๐ŸชŸ ๐Ÿง - Read your Clipy screen recordings from any agent: search your library, fetch timestamped transcripts, AI summaries, and key moments with video frames (click markers burned in) as inline images. Read-only, free API key. npx -y @clipy/mcp

Quick Install

One-Click IDE Configuration
claude_desktop_config.json
{
  "mcpServers": {
    "manovagyanik1-clipy-mcp": {
      "command": "uvx",
      "args": [
        "manovagyanik1-clipy-mcp"
      ]
    }
  }
}
Or

Using an AI coding agent (Claude Code, Cursor, etc.)? Copy a ready-made prompt that tells it to fetch the setup instructions and install this server for you.

Documentation Overview

@clipy/mcp

Give your AI agent access to your Clipy screen recordings.

Developed in the Clipy monorepo. A public mirror for browsing the source and filing issues lives at github.com/manovagyanik1/clipy-mcp (MIT), kept in sync with each npm release.

This is a Model Context Protocol (MCP) server. It lets Claude, Cursor, Windsurf, and other MCP-capable agents search your recordings and read their transcripts and AI summaries โ€” so you can do things like "turn this bug-report recording into a Linear ticket" without leaving your agent โ€” and, with the record tool, record a web app headlessly and get it back as a Clipy recording ("build the feature, then record the outcome").

The read tools need the recordings:read scope, which every key gets by default. The write tools โ€” record, the session tools (start_recording, add_marker, add_chapter, stop_recording, abort_recording), and replace_transcript โ€” additionally need the key to carry the ingest scope ("Record & upload"), which the server enforces. A recordings:read-only key can read your recordings but cannot create, modify, or delete anything.

Setup

This is a headless server process, so it authenticates with a Clipy API key in the CLIPY_API_KEY env var (it looks like clipy_sk_live_โ€ฆ). The easiest way to get one is the Clipy CLI's browser login:

npx @clipy/cli@latest login

It opens your browser; click Approve once. The key is saved to ~/.config/clipy/config.json โ€” copy its apiKey value into CLIPY_API_KEY when you add the server below.

Prefer to mint one by hand? Create a key at https://clipy.online/settings/api-keys instead (it's shown only once โ€” copy it immediately).

Then add the server to your MCP client.

Never inline your key into the server's launch command โ€” e.g. "command": "sh", "args": ["-c", "CLIPY_API_KEY=โ€ฆ npx -y @clipy/mcp"]. Command-line arguments are visible to every local process via the process table (ps, /proc), so a key placed there is effectively world-readable on the machine. Always put it in the env block, exactly as every example below does. (The one-time claude mcp add --env โ€ฆ / codex mcp add --env โ€ฆ helpers below write that env block for you โ€” they expose the key only in the argv of that single setup command, never in the long-running server's.)

Claude Code

The --scope user flag installs Clipy globally for every project. Without it, claude mcp add defaults to local scope (the current folder only):

claude mcp add --scope user clipy --env CLIPY_API_KEY=clipy_sk_live_xxx -- npx -y @clipy/mcp

Codex

This writes the server to your global ~/.codex/config.toml, so it's available in every Codex session:

codex mcp add clipy --env CLIPY_API_KEY=clipy_sk_live_xxx -- npx -y @clipy/mcp

Or add it to ~/.codex/config.toml by hand:

[mcp_servers.clipy]
command = "npx"
args = ["-y", "@clipy/mcp"]
env = { CLIPY_API_KEY = "clipy_sk_live_xxx" }

Claude Desktop / Cursor / Windsurf

Edit the matching user-level config (claude_desktop_config.json, ~/.cursor/mcp.json, or the Windsurf MCP config) directly:

{
  "mcpServers": {
    "clipy": {
      "command": "npx",
      "args": ["-y", "@clipy/mcp"],
      "env": { "CLIPY_API_KEY": "clipy_sk_live_xxx" }
    }
  }
}

Tools

ToolWhat it does
search_recordingsSearch your recordings by keyword (title + description).
list_recordingsList your most recent recordings.
get_recordingMetadata for one recording (status, duration, transcript/summary status).
get_transcriptThe full timestamped transcript + plaintext.
get_summaryThe AI summary: TL;DR, key points, action items.
wait_for_artifactsPoll until a recording's transcript/summary finish processing.
download_recordingDownload the MP4 locally so you can clip it or extract frames yourself (e.g. with ffmpeg).
get_key_momentsKey moments: timestamps, captions, and click coordinates.
get_agent_contextThe full agent-context bundle (summary + key moments + transcript) as markdown.
recordRecord a web app headlessly and upload it as a Clipy recording; returns its share + agent-context URLs. Accepts a type (recording kind), viewports (sweep several screen sizes into one video), storageState / userDataDir+profileDirectory / initScript (record behind a login), and timestamped notes that become the (silent) recording's transcript. Needs Playwright in this server's environment and an ingest-scoped key (see below).
start_recordingStart a recording session that keeps recording while you work (drive the page with your own browser tools, run commands, โ€ฆ). Accepts type, storageState / userDataDir+profileDirectory / initScript, and exposeCdp (get a CDP endpoint + in-page window.__clipyMark/window.__clipyChapter bridge to drive the recorded page). Auto-stops + uploads at maxSeconds (default 600) so it can never run away.
add_markerDrop a narration marker into the active session (live clock, or backdate with atSeconds) โ€” markers become the recording's transcript chapters. Can carry evidence in one of two provenances: clipy-verified (assertSelector / assertText / assertUrl) where Clipy checks the page itself, or driver-attested (observed + verdict) where you report what your own tooling saw. Clipy-verified outcomes render with a verdict glyph (โœ“ pass, โœ— failure that can abort via failMode, โš  unverified โ€” never a silent pass); driver-attested ones render with a weaker-looking hedge glyph (โ‰ˆ) so the two are never mistaken at a glance, and they are tallied in separate segments. Navigations + console errors are added automatically as [auto] marks.
add_chapterDrop a === CHAPTER: <label> === boundary into the active session โ€” split a recording into named sections (ideal for before/after demos).
stop_recordingFinish the session: close the browser, upload, return the share + agent-context URLs.
abort_recordingDiscard the active session; nothing is uploaded.
list_context_documentsList the user's context documents โ€” YouTube videos and local video files they imported with clipy context import, so agents can read them. A separate library from their own screen recordings.
get_context_documentOne context document's metadata: source, duration, tags, the server's classification (video type, whether visual evidence is needed, planned moments), and which transcript/frames exist. Not the transcript itself.
read_context_documentRead a context document as compiled markdown โ€” header, metadata, then the timestamped transcript with frame captions interleaved. Takes startMs/endMs so you can walk a two-hour video section by section instead of flooding your context.
replace_transcriptReplace a recording's transcript with text you author (needs the ingest scope). Fix a bad speech-to-text pass, translate, or enrich a silent agent capture; the summary regenerates automatically. Marked as agent-edited, never passed off as speech-to-text.

Read tools accept a recording's public id (the slug in its share URL) or the full https://clipy.online/video/<id> URL.

Capturing the real screen is CLI-only. These tools record a headless Chromium page. To record the actual Mac screen or a specific window (ScreenCaptureKit โ€” the real logged-in browser), use the Clipy CLI: clipy record --source mac-screen --window "<app>".

Using record

record opens a URL in a headless Chromium (works in CI / cloud sandboxes, no display), records for a few seconds, and streams it into Clipy โ€” then returns the id so you can call wait_for_artifacts and get_agent_context to read it back. It needs:

  1. Playwright in the environment running this MCP server:
    npm install -g playwright && npx playwright install chromium
    
  2. An API key with the "Record & upload" (ingest) permission โ€” choose it when you mint the key at clipy.online/settings/api-keys.

Parameters: url (required, http/https), durationSeconds (default 15, max 300, applied per viewport pass), name, description, type (recording kind โ€” bug_report, feature_request, product_demo, walkthrough_tutorial, feedback_review, discussion_talk, other, plus aliases), viewports (e.g. mobile,desktop or 390x844,1440x900 โ€” recorded sequentially into one video, frame sized to the largest, each pass slow-scrolled and auto-chaptered), storageState / initScript (paths, never logged), notes, and width/height (default 1280ร—720, ignored when viewports is set).

Recording behind a login. storageState seeds exactly what its JSON contains (cookies + localStorage) but can't reproduce a whole browser identity (IndexedDB, service workers, some cross-origin auth). For a full identity, pass userDataDir โ€” Chrome's user-data root (macOS: ~/Library/Application Support/Google/Chrome) โ€” in one of two modes:

  • Copy a named profile (recommended). Add profileDirectory ("Profile 1", "Default", โ€ฆ โ€” the exact folder from chrome://version โ†’ Profile Path). Clipy copies that profile into a temporary root and records the copy, so your real profile is never opened or modified and the copy is deleted after upload. The tool result discloses the copy (profile name, bytes, and a warning if Chrome was running while it was copied).

    โš ๏ธ macOS: cookie logins may not survive the copy. Chrome encrypts cookies with the Chrome Safe Storage Keychain key; the recorder's bundled Chromium looks for Chromium Safe Storage. So on macOS a copied profile can produce a browser that looks like your identity but is silently logged out wherever the session is cookie-based โ€” localStorage/ Preferences-based sessions still work. This is a pre-existing Playwright-vs-Chrome constraint, not something the copy introduces, and the copy disclosure repeats it. If the recording lands logged out, that's why. Record the real browser with the CLI's clipy record --source mac-screen, or drive your own browser and attach evidence via add_marker's observed/verdict.

  • Open the Default profile directly. Omit profileDirectory. Clipy opens the root's Default profile and writes to it, so it's refused while a live Chrome holds it locked โ€” quit Chrome first. When the dir looks like a real Chrome root, the result carries a userDataDirWarning saying so and pointing you at profileDirectory (ephemeral copy) or the CLI's --source mac-screen instead. Prefer those unless you specifically want in-place use.

Playwright strips Chromium's --profile-directory (it always loads Default from whatever dir it's given), so copying is the only way to record a named profile. Pointing userDataDir at a profile subdir (.../Chrome/Default) is refused โ€” launching from there would silently record a blank, logged-out profile.

storageState and userDataDir are mutually exclusive; profileDirectory requires userDataDir.

Check the camera before you work

record and start_recording both return a source object describing what is actually being recorded, resolved fresh at start time โ€” the post-redirect url, the page title, and the recording viewport:

"source": {
  "kind": "headless_browser",
  "title": "Orders โ€” Admin",
  "url": "https://app.example.com/orders",
  "viewport": { "width": 1280, "height": 720 }
}

Compare it against the surface your driver is acting on before doing minutes of work. This exists because driver-attested evidence proves what the driver observed and nothing ties it to what the camera saw โ€” it's entirely possible to produce truthful marks over footage of the wrong thing. Clipy will never focus or foreground a window or tab for you; pointing the driver and the camera at the same surface is the caller's job.

kind is always headless_browser here: these tools record a headless page Clipy owns. Capturing a real application window or display is CLI-only (clipy record --source mac-screen --window "<app>"), so no window id or window title is reported โ€” an empty or invented one would be exactly the kind of false confidence this field exists to prevent.

Evidence on a marker: two provenances

add_marker can carry evidence in exactly one of two provenances โ€” they are tallied and rendered separately, never pooled:

ProvenanceHowWhat it means
clipy-verifiedassertSelector / assertText / assertUrlClipy checked the recorded page itself. Strongest evidence. Renders [assert โœ“ verified-by-clipy; โ€ฆ], or [ASSERT โœ— verified-by-clipy; โ€ฆ], or [ASSERT โš  clipy could not evaluate โ€” โ€ฆ] when it couldn't check.
driver-attestedobserved + verdict (both required)You report what your own tooling saw. Clipy vouches only that you said it โ€” not that it verified it โ€” which is falsifiable against the recorded frames. Renders with a hedge glyph rather than a verdict glyph: [โ‰ˆ ASSERT driver-attested; observed=โ€ฆ], or [โ‰ˆ FAILED driver-attested; observed=โ€ฆ].

Use driver-attested when your agent drives its own browser/tooling while Clipy records (e.g. --source mac-screen on the CLI) or when there's no Clipy-owned page to assert against. It's weaker than clipy-verified but far stronger than plain prose. The transcript's leading [verification] note segments the two, e.g. [verification] 3 clipy-verified: 2 passed, 1 failed ยท 2 driver-attested: 2 passed, 0 failed.

Driving the recorded page over CDP (start_recording + exposeCdp: true)

Pass exposeCdp: true to start_recording and the recording browser opens a Chrome DevTools Protocol endpoint; the result returns cdpHttpUrl + cdpUrl. Connect your own Playwright and drive the page while Clipy records it:

const { chromium } = require("playwright");
const browser = await chromium.connectOverCDP(cdpHttpUrl);
const page = browser.contexts()[0].pages()[0]; // the page being recorded
await page.goto("http://localhost:3000/settings");
await browser.close();                          // detaches; the recording keeps going

It's off by default โ€” while it's open, any local process can attach to that browser. CLIPY_DISABLE_CDP=1 is a hard kill switch that forces it off. Gotchas: the recorded page is contexts()[0].pages()[0] (a new context you open won't be captured); page.viewportSize() reads null over a CDP attach; and to change the viewport use newCDPSession + Emulation.setDeviceMetricsOverride, not setViewportSize.

In-page bridge (zero extra tool calls). When exposeCdp is on, the recorded page also exposes window.__clipyMark(text, opts?) and window.__clipyChapter(label), so your CDP driver can drop asserted marks/chapters from inside the page:

await page.evaluate(() =>
  window.__clipyMark("saved the form", { assertSelector: ".toast", assertText: "Saved" }),
);
await page.evaluate(() => window.__clipyChapter("AFTER โ€” fix applied"));

opts mirrors add_marker (assertSelector / assertText / assertUrl / failMode); assertText requires assertSelector (the call rejects otherwise), and a failed assert with failMode: "abort" discards the session โ€” same annotations and tally as the tools.

Config

Env varRequiredDefaultNotes
CLIPY_API_KEYyesโ€”Your personal key from /settings/api-keys.
CLIPY_API_URLnohttps://clipy.onlineOverride for self-hosted/staging.

Privacy

Your key only ever reads your own recordings. Revoke it any time at /settings/api-keys. The server runs locally on your machine; your key is never sent anywhere except to the Clipy API over HTTPS.

Related MCP Servers

06ketan/slideshot

๐Ÿ“‡ ๐Ÿ  ๐ŸŽ ๐ŸชŸ ๐Ÿง - Convert HTML to PDF/PNG/WebP/PPTX slide carousels with 11 themes (LinkedIn, Instagram, pitch decks, infographics). Pixel-perfect Puppeteer rendering, dimension-aware reflow for portrait/landscape, token-efficient JSON mode. npx slideshot-mcp.

๐ŸŽฅ Multimedia Process0 views
1000ri-jp/atsurae

๐Ÿ โ˜๏ธ ๐ŸŽ ๐ŸชŸ ๐Ÿง - AI-powered video editing MCP server with 10 tools for timeline editing, 5-layer compositing, semantic operations, and FFmpeg rendering (1920x1080, 30fps H.264+AAC).

๐ŸŽฅ Multimedia Process0 views
a-y-ibrahim/after-effects-mcp

๐Ÿ“‡ ๐Ÿ  ๐ŸŽ ๐ŸชŸ - Control Adobe After Effects from any MCP client: arbitrary ExtendScript, background rendering, deep comp/layer inspection, and first-class Arabic/RTL & multilingual support (works on AE in any UI language). 47 tools.

๐ŸŽฅ Multimedia Process0 views
AceDataCloud/MCPSuno

๐Ÿ โ˜๏ธ - Suno AI music generation, lyrics, covers, and vocal extraction via Ace Data Cloud API.

๐ŸŽฅ Multimedia Process0 views

Engagement

Views
0
Installs
0
Upvotes
0

Views and upvotes are unique per visitor network (hashed IP). Installs count copy actions.

Status

Health: Not checked yet

We have not completed a health check for this listing yet.

No check timestamp yet.

Unclaimed listing (imported or pending owner verification). Claim it โ†’
โ˜… Spotlight Slot

Feature Your MCP Server

Get maximum visibility for your server across our directory, search results, and detail pages.

Spotlight Your Server

Own this project?

This directory is pre-filled from public sources. Claim via GitHub README, site badge, or DNS TXT to get the verified badge and attach your website.

Claim this listing

Promote this listing

Optional paid placement. Free listings stay free forever.

Share & Embed

Add our SVG badge (dark/light directory styles) or embeddable widget to your site.