MCP Integration | Flask
Flask MCP Integration
Connect Flask to Claude and other AI assistants via the Model Context Protocol.
How to connect
- In Claude (claude.ai or Claude Code), open the connector / integration settings and add a new MCP server.
- Use the connection details below. You'll be redirected to Flask to authorize access to your team.
- Once connected, ask Claude things like “summarize the feedback on our latest cut” or “what has the team been working on this week?”
| Server URL | https://api.flask.do/api/mcp/mcp |
| Authentication | OAuth 2.0 with Dynamic Client Registration (RFC 7591) |
| Transport | Streamable HTTP (POST only; SSE not supported) |
| Capabilities | Read + write: reads your data, uploads videos (from a URL or a local file), and creates/edits feedback comments as you, under the same permission rules as the app; it cannot delete anything |
| Requirements | Free or paid Flask account |
Quick connect by client
One command connects the server to Claude Code and Cursor and installs the review-loop skill:
npx flask-feedback
Claude Code:
claude mcp add --transport http flask https://api.flask.do/api/mcp/mcp
Cursor: Add to Cursor(one-click install)
claude.ai / Claude Desktop: Settings → Connectors → add the server URL above.
Agent skill
The review-loop playbook (upload, share the link right away, wait for feedback, iterate with versions) is also an installable skill for Claude Code, Cursor, Codex, and any other agent that reads skills:
npx skills add tryflask/skills
Available tools
Most tools are read-only. The tools that write are the upload tools ( upload_video imports a video from a URL, and upload_file_start / upload_file_complete upload a local file from your machine) and the feedback tools ( feedback_post creates a comment, feedback_update edits one). Every write acts as your user under the exact permission rules the app enforces: commenting requires comment access, editing a comment's text is author-only, and tags are your team's existing tags. The MCP never deletes anything, and never creates recordings, drawings, or image attachments.
Browse
- contents: list the team's top level, or open a folder to see its child folders and assets. Every asset item carries the asset id, its current version id, the version count, whether it has a brief, its media fields, the asset link (always the newest version) and a pinned link to the current version
Feedback
- feedback_list: list top-level feedback on an asset (its current version) or on one exact version (text comments + voice/screen recordings), each with its tags by name; items also flag attached images and standalone drawings so the agent knows to fetch the visuals
- feedback_get: get a single feedback item with its full reply thread, including the recording's full verbatim transcript and its visual references — the pointing phrases (“this”, “over here”) paired with the recording time each was spoken
- wait_for_feedback: long-poll that returns new feedback the moment it's left (blocks up to ~45s per call); lets agents listen for your review in near real time instead of polling
- feedback_post(write): create a comment on an asset as you (it lands on the asset's current version, or on the exact version you name), optionally anchored to a video timestamp, tagged with your team's existing tags, or threaded as a reply — e.g. importing feedback from an email with timestamps into the right moments of the video
- feedback_update(write): edit a feedback item — text and timestamp on your own comments; tags/statuses (like marking feedback “Done”) on any item you can comment on
- get_annotated_frames: returns curated supplementary visuals with the transcript marked
[FRAME N]: the media under review with the reviewer's drawing rendered in, plus their shared screen when they demonstrated something (e.g. a Photoshop or Figma mockup they pulled up). Also works on text comments: standalone drawings are rendered onto the exact frame they were drawn over, and attached images are returned as frames. The transcript is the primary feedback; webcam frames are not included - get_frame: drill into a recording for more visual detail: the exact frame at a specific recording time, or when a particular word or phrase was spoken, plus a transcript snippet around that moment. Feed it a phrase from the item's visual references to see exactly what a “this”, “here” or “that” was pointing at
Every feedback item includes its tags as readable names. Each recording is one comment: the text body is the AI-organized feedback, the recording object carries the full verbatim transcript plus visual_references (the pointing phrases with the recording time each was spoken), and play_url is a deep link that opens the recording at the right moment. (A few recordings made before August 2026 may still appear as sibling comments sharing one recording.)
Search & activity
- search: unified search across folders, assets, and feedback in one call
- recent_activity: the latest feedback (text + recording) newest first — across the whole team, or scoped to one folder with a date window and pagination; each item carries the asset it belongs to, the version it was left on and its version number
- feedback_stats: aggregate feedback counts across many assets in one call — per asset and per version (v1, v2, …), split by type, tag, and author, scoped to the team, a folder, or one asset, with an optional date window. Assets that have a brief but no version yet are listed too. Built for trend questions like “are v1 notes trending down for this client?”
Tags & permissions
- tags: list the team's tags and the share of feedback each tag covers, scoped to the team, a folder (its whole subtree), or a single asset (across all its versions)
- permission_get: see who has access to a folder or an asset and at what level (permissions live on the asset; its versions inherit them)
Media
- asset_status: check the processing status and progress of a video — by version id, or by asset id (its current version); reports
no_versionsfor an asset that has a brief but no media yet - upload_video(write): import a video from a public URL (direct file link or Google Drive) as a new asset, or as a new version of an existing one; returns the new version id to poll with
asset_status, the asset id and both links - upload_file_start(write): start uploading a local video file (up to 5GB); creates the asset and returns its shareable link immediately plus a presigned upload URL
- upload_file_complete(write): finalize a local upload and start processing; the video is watchable via preview playback while it processes
Every asset is a container for its versions (v1, v2, …) and owns the title, folder, sharing, tags and an optional brief. All upload tools accept version_of (the asset id, or any of its version ids) to upload as a new version instead of a separate asset. Upload results carry asset_id (the new version, the id to poll and to leave feedback on), container_id (the asset), url (the asset link, which always shows the newest version) and version_url (a link pinned to that exact version).
Uploading via MCP is free for up to 100 assets, no subscription required. Beyond that, upgrade at flask.do/plan.
Use cases
Catch up on team feedback
See what your team has been giving feedback on, with links to jump into each conversation.
“What feedback did my team leave this week?”
Summarize feedback on a video
Get a structured summary grouped by theme, with verbatim quotes, timestamps, and clickable links back to each item.
“Summarize all the feedback on the ‘loading screens’ cut and group it by theme”
Turn voice notes into action items
AI transcripts of every voice/screen recording mean Claude can pull concrete action items straight out of casual feedback.
“Pull every action item from the voice recordings on the latest cut”
Upload a video from your workflow
Hand Claude a link or a local file (a finished cut, an agent-rendered video) and have it uploaded straight into the right folder, ready for feedback. The share link works immediately, and in an interactive session with a desktop browser the agent can open it for you automatically, for the first upload and every new version.
“Upload this Drive link to the ‘Q3 launch’ folder and tell me when it’s ready”
“Upload ~/renders/final_cut_v3.mp4 to the ‘Q3 launch’ folder and give me the share link”
Find specific feedback across projects
Search across folders, assets, and feedback at once.
“Did anyone mention the intro pacing? Show me the exact comments and links”
Import feedback from anywhere
Feedback arriving outside Flask — an email, a Slack thread, meeting notes — gets posted onto the asset as timestamped comments, so it lands at the exact moments it refers to.
“The client emailed notes on the launch video — add each point as a comment at the right timestamp”
Triage by tag
Use tag distribution to spot the busiest themes across a folder or asset.
“Which tags are most used in the ‘Product Decisions’ folder?”
Data handling
- The server only accesses data explicitly requested by the user via a tool call; no background sync, no proactive scraping
- The MCP connection is stateless. Requested changes are stored in Flask; eligible private-beta teams use ordinary Markdown for asset descriptions, script narration and skill content, including stable file links and images. Flask displays rich formatting while MCP reads and writes the same text. Files remain access-controlled; the latest description and skill content are stored without added version history.
- Teams in that private beta can install a skill onto their own machine as ordinary files. Flask returns a short-lived signed link to an archive of that skill's files, which the agent downloads straight from object storage into its skills directory — the file contents are never routed through the model's context. Downloading requires read access to the skill; editing it still goes through the normal per-file writes.
- All data transmission is encrypted via HTTPS/TLS
- The MCP only writes when you ask it to — uploading a video (from a URL or a local file) or creating/editing a feedback comment as you, under the same permission rules as the app; the public tool catalog does not delete existing data. Team-gated experimental packs have additional capabilities shown to eligible connections
- Email addresses are never exposed in MCP responses (only display name and avatar)
- Tool discovery (initialize / tools list) is public and returns only the static tool catalog, so directory health checks can inspect the server; every actual tool call requires OAuth
- Every connected agent is listed at flask.do/ai-agents, where you can revoke one at any time — revoking is instant — it deletes that client's sessions and invalidates its refresh tokens, and because every request is re-validated against Supabase, the agent's next call fails immediately
Support
If you run into any issues with the Flask MCP integration, reach out at hello@flask.do.
For more about how we handle your data, see our Privacy Policy.