npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

openscreen-tmcp

v0.2.0

Published

6-tool MCP proxy in front of OpenScreen's 25-tool video-editing server — action enums, honest hints, a bundled skill, far fewer tokens

Readme

openscreen-tmcp

A tiny MCP server that sits in front of OpenScreen's own MCP server and collapses its 25 tools into 6 — so any AI agent can edit video for far fewer tokens, with the house action-enum style and a bundled Agent Skill carrying the workflow knowledge.

graph LR
    A["Agent<br/>VS Code · Claude Code · Codex · Cursor"] -->|"stdio: 6 tools"| B["openscreen-tmcp<br/>tmcp + Valibot"]
    B -->|"fetch + Bearer token"| C["OpenScreen app<br/>127.0.0.1:47821/mcp<br/>25 tools"]
    C --> D["live editor document"]
    B -.->|"skills/openscreen/SKILL.md"| A

It is a proxy: every mutation is executed by OpenScreen. No editing logic is reimplemented, no session state is kept, and upstream's error wording is passed through verbatim.

Install

bunx --package openscreen-tmcp openscreen-tmcp

Configuration (e.g. VS Code mcp.json, Claude Code, Codex):

"openscreen-tmcp": {
  "command": "bunx",
  "args": ["--package", "openscreen-tmcp", "openscreen-tmcp"],
  "env": {
    "OPENSCREEN_MCP_URL": "http://127.0.0.1:47821/mcp",
    // paste the header value verbatim, "Bearer " included:
    "OPENSCREEN_MCP_AUTHORIZATION": "Bearer <token from OpenScreen>",
    // or just the bare token — the env var OpenScreen's own Codex setup uses:
    // "OPENSCREEN_MCP_TOKEN": "<token from OpenScreen>"
  }
}

Get the URL and token from the OpenScreen app: AI settings → MCP server → copy the shown command. The agent never sees the token. OPENSCREEN_MCP_AUTHORIZATION wins if both are set.

Optional: OPENSCREEN_TMCP_TIMEOUT_MS (default 15000) and OPENSCREEN_TMCP_DEBUG=true (verbose stderr logging).

The 6 tools

| Tool | Actions | Absorbs upstream | | --------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | read | project, cursor, transcript, words, frames, upstream | getCurrentDocument, getCursorTrack, getTranscript, getTranscriptWords + a local coverage report + local ffmpeg frame rendering | | trim | add, addMany, set, remove | addTrim, addTrims, setTrim, removeTrim | | clip | setRange, move, remove, replace | setClipRange, moveClip, removeClip, replaceTimeline | | effect | add, set, remove × kind ∈ zoom | speed | annotation | camera | audio | 11 effect ops + removeModifier | | caption | wordId + text | setWordText | | apply | ordered batch of the above | — |

Coverage is exact: 4 + 4 + 4 + 12 + 1 = 25, proved by test/coverage.test.ts — if OpenScreen ever renames a tool, that test fails with the unmapped name.

Annotations stay honest after consolidation: read is the only readOnlyHint: true tool (that's why the single transcript write lives alone in caption), every edit tool carries destructiveHint: true.

read with action: "frames" is local: ffmpeg renders the recording as an image, a contact sheet of evenly spaced frames or one still at an exact second, with timestamps burned in when a caption font is found (a false burnIn in the reply means none were drawn). It is how an agent sees the video before it edits.

The rule that matters

Two time bases — never mix them. trim and clip sourceStartSec/sourceEndSec are SOURCE seconds (inside the original file); everything in effect is VIRTUAL seconds (on the edited timeline, after cuts). So: cut first, then decorate. The full workflow lives in the bundled skill.

apply is ordered, not atomic — OpenScreen has no transaction, so it stops at the first failure and reports exactly which ops landed.

Development

bun install     # dependencies
bun test        # 77 tests: apply, client, config, coverage, dispatch, frames, resolve
bunx tsc --noEmit
bun run dev     # watch mode

The upstream endpoint is hand-rolled (fetch + JSON-RPC, ~150 lines) because tmcp ships no client package and @modelcontextprotocol/sdk is out of bounds for this repo — see plan/client-leg.md.

License

MIT