mcp.film

mcp.film / Story & Pre-Production / PenShot (story-shot-agent)

PenShot (story-shot-agent)

Communityby Community (neopen)freeverified Sep 18, 2026

Breaks screenplays into shot lists and generates Sora/Veo/Runway-ready video prompts.

What it does

An LLM-powered agent that parses scripts in any format, performs shot-by-shot breakdowns, and emits coherent text-to-video prompts with cross-shot character consistency. Runs as an MCP server, Python SDK, REST API, or LangGraph node — the missing link between a screenplay and a generation pipeline.

Connect

Claude Code
claude mcp add penshot -- python -m penshot.mcp_server --max-concurrent 5 --queue-size 500
Claude Desktop (claude_desktop_config.json)
{
  "mcpServers": {
    "penshot": {
      "command": "python",
      "args": [
        "-m",
        "penshot.mcp_server",
        "--max-concurrent",
        "5",
        "--queue-size",
        "500"
      ],
      "env": {
        "PENSHOT_LLM__DEFAULT__API_KEY": "YOUR_KEY_HERE"
      }
    }
  }
}
Cursor (.cursor/mcp.json)
{
  "mcpServers": {
    "penshot": {
      "command": "python",
      "args": [
        "-m",
        "penshot.mcp_server",
        "--max-concurrent",
        "5",
        "--queue-size",
        "500"
      ],
      "env": {
        "PENSHOT_LLM__DEFAULT__API_KEY": "YOUR_KEY_HERE"
      }
    }
  }
}
Auth: api_key · env PENSHOT_LLM__DEFAULT__API_KEY — Bring your own LLM and embedding endpoints — set PENSHOT_LLM__DEFAULT__{BASE_URL,API_KEY,MODEL_NAME} and the matching PENSHOT_EMBED__DEFAULT__* vars; OpenAI, Qwen, DeepSeek and Ollama are named as working providers

Sample tools

breakdown_scriptget_task_statusget_task_resultcancel_tasklist_tasksget_queue_statusget_stats

Field notes

Still growing and genuinely active: 203 stars (up from 139 in five weeks), last commit 17 Sep 2026, PyPI 0.3.7 shipped 2 Sep 2026, MIT. Seven tools, read from the server source rather than the README — breakdown_script, get_task_status, get_task_result, cancel_task, list_tasks, get_queue_status, get_stats — and the install line now carries the --max-concurrent/--queue-size flags the project's own example config uses. THE CATCH THAT BITES: the stdio server advertises every tool with an empty JSON-Schema parameter block, so your client sees no argument names and you have to spell the arguments out in the prompt; the FastAPI surface in mcp_http_server.py has full parameter descriptions but it is a plain REST façade on :8000, not MCP over HTTP, so do not expect a remote_url. Setup is heavier than the one-line install suggests — an LLM endpoint, an embedding model and PENSHOT_REDIS_URL all have to be in .env first, or use the published ghcr.io/neopen/penshot image with docker compose. The maintainers still say it is optimized in depth for Chinese scripts with other languages 'in continuous iteration'. Async is the sane mode: submit with breakdown_script, poll get_task_status, collect get_task_result — and note task success reports as 'success', not 'completed'. Directory finding, still true: no dedicated MCP exists for Final Draft, Celtx, WriterDuet, or Fountain — script writing itself is best done with your agent directly (Fountain is plain text), stored via the Notion or Google Drive MCPs.

Also in Story & Pre-Production

Pairs well with