← Registry

Content Tools

flask.do

Manages feedback on assets, allowing browsing, listing, retrieving, and posting feedback.

1 endpoint17 known toolsFirst detected July 25, 2026Last detected September 6, 2026

ENDPOINT 1

https://api.flask.do/api/mcp/mcp

No auth detected

MCP server metadata

Name
flask
Version
1.0.0
Capabilities
tools.listChangedprompts.listChangedresources.listChanged
Server instructions

You are connected to Flask — a video collaboration platform where creative teams give feedback on videos with voice, camera, and screen recordings instead of typing. AI extracts summaries and transcripts from recordings. All tools operate on the user's active team. No team switching needed. ## Data Model - **Folder** = a project container (itself an asset of type "folder", nestable). Folders organize work but are OPTIONAL — there is no required "root folder". Root simply means an asset with no parent; assets can live directly at the team's top level. You do NOT need a folder to upload. - **Asset** = media item, inside a folder OR at the team root. Types: video, youtube, image, blank, link. Feedback lives on assets, not folders. - **Version stack** = an asset with multiple versions (v1, v2, ...). The stack's link always shows the newest version. When uploading a new iteration of something that already exists in Flask, pass version_of on the upload tools instead of creating a separate asset. - **Feedback** = annotation on an asset. type "text" has a written `content` body. type "recording" has a voice/camera/screen recording — ONE recording is ONE comment — exposed in the `recording` object: `transcript` (the recording's full verbatim transcript; the comment's `content` is the AI-organized version of the same feedback), `visual_references` (the deictic phrases the reviewer spoke — "this", "over here", "that gradient" — each with the `recording_time` it was said), `recording_url`, `recording_duration`. The transcript is the primary feedback; get_annotated_frames(element_id) returns curated supplementary visuals (the media under review with the reviewer's drawing, plus shared SCREEN frames - never webcam). When a pointing word is unresolved, take its phrase from `visual_references` and call get_frame(element_id, word) — or get_frame(element_id, at) for a raw time — to see exactly what was being pointed at. Any feedback item (including type "text") can also carry visual attachments: `images` (attached image files) and `has_drawing: true` (a drawing made directly on the asset, no recording involved). When either is present, call get_annotated_frames(element_id) to see them - the drawing is rendered onto the exact frame it was drawn over. - **Tag** = label for organizing feedback, scoped to a team. Each feedback item carries a `tags` array of `{ id, name }` derived from the comment's inline tag mentions — use the names directly, no lookup needed. tags() reports team-wide distribution. Tags (including statuses like "Done") are team-scoped and collaborative: feedback_post applies them at creation and feedback_update can add/remove them on ANY feedback item you can comment on - but only tags that already exist in the team (create new tags in the Flask app). ## Navigation 1. contents() → team root: folders AND assets that live at the top level 2. contents(folder_id) → child folders + assets 3. feedback_list(asset_id) → feedback on an asset 4. feedback_get(element_id) → feedback item + full reply thread 5. get_annotated_frames(element_id) → curated supplementary visuals (drawings + shared screen; never webcam) with the transcript marked [FRAME N]. get_frame(element_id, at|word) drills deeper to a specific moment or spoken word. Most tools are read-only. The tools that write are: the three upload tools (upload_video imports from a URL; upload_file_start + upload_file_complete upload a local file), and the two feedback write tools (feedback_post creates a comment, feedback_update edits one). All writes act AS the connected user under the exact permission rules the app enforces. The MCP cannot delete anything, and cannot create recordings, drawings, or image attachments. A key write use case: importing feedback that lives outside Flask (an email, a Slack thread, meeting notes) into the asset it refers to. Convert any timestamps in the source (like "at 1:32") to seconds and pass them as timestamp so each comment is anchored to the right moment; feedback without a usable timestamp becomes a general comment. ## Tools - Browse: contents - Feedback: feedback_list, feedback_get - Feedback: wait_for_feedback — long-poll that blocks up to ~45s and returns new feedback the moment it is left. Loop it (pass next_since each time) to listen continuously. Prefer this over repeatedly calling feedback_list. - Feedback (WRITE): feedback_post — create a comment on an asset as the connected user. Pass timestamp (seconds) whenever the source material has one; omit it for a general note. tags applies existing team tags by name; reply_to threads under an existing item. - Feedback (WRITE): feedback_update — edit a feedback item. Text/timestamp changes are allowed only on the user's own comments; add_tags/remove_tags (team tags and statuses, by name) work on any item with comment access — e.g. add "Done" to mark feedback resolved. - Visual: get_annotated_frames — for a recording item, returns curated supplementary frames + the transcript marked [FRAME N]. The transcript is the primary feedback; these frames show the media under review with the reviewer's drawing rendered in, plus their shared SCREEN when they demonstrated something (never webcam). Also works on text comments with visual attachments: a standalone drawing (has_drawing: true) is rendered onto the frame it was drawn over, and attached images (images array) come back as frames. Use it whenever feedback references something visually ("this", "here", "look at this", "let me show you") or carries images / has_drawing. Up to 12 images returned inline. - Visual drill-down: get_frame — get the exact frame at a recording time (at) or when a word/phrase was spoken (word); use when get_annotated_frames did not resolve a 'this/here/that' reference, or to see a moment the transcript mentions. Returns the asset frame at that moment plus any active shared screen, and a transcript snippet around it. - Tags: tags — lists the team's tags and reports the share of each tag (plus "untagged") across the chosen scope (team, folder_id, or asset_id) - Search: search — unified search across folders, assets, and feedback in one call - Activity: recent_activity — latest feedback (text + recording) newest-first. Scope with folder_id to read one client's/project's feedback across all its assets in one call; narrow with since/until; page with offset. Items carry the asset and its version number. - Insights: feedback_stats — aggregate feedback counts across many assets in ONE call: per asset and per version (v1, v2, ...), split by type, tag, and author, with first/last feedback timestamps. Scope by folder_id, asset_id, or whole team; window with from/to. Use for trend questions ("are v1 notes trending down for this client?", "what tags dominate?") instead of calling feedback_list per asset. - Media: asset_status — check processing status/progress of a video asset - Sharing: permission_get - Upload (WRITE): upload_video — import a video from a public URL (direct file link or Google Drive). folder_id is OPTIONAL — omit it to upload to the team's top level (root). Returns asset_id; then poll asset_status until "ready". - Upload (WRITE): upload_file_start — start uploading a LOCAL video file (max 5GB). folder_id is OPTIONAL — omit it to upload to the team root. Returns the shareable link immediately plus a presigned URL and the exact curl command to upload the bytes. - Upload (WRITE): upload_file_complete — call after the curl upload finishes; verifies the file and starts processing. The video is watchable at its link right away via preview playback while it processes. - Versioning: all upload tools accept version_of (an existing asset or stack id) to upload as a NEW VERSION instead of a separate asset. The response then includes version_stack_url — a stable link that always shows the newest version. ## Review Loop (uploading work for a user to review) When you upload something for the user to review, run this loop: 1. upload_file_start, then IMMEDIATELY give the user the flask.do link — before uploading the bytes. They can open it right away and watch the upload and processing live. Never make them wait for "ready". If you can open a browser on the user's machine (an interactive session with a desktop display — not a headless/CI/SSH run), also open the link for them so the window appears automatically (the upload tool's next_step gives the exact per-OS command); otherwise just share it as text. This applies to new versions too — open the version stack link when you upload a revision. 2. curl the bytes, call upload_file_complete. The video is watchable instantly (preview playback) — do not poll asset_status or wait for processing. 3. Call wait_for_feedback(asset_id) to block until the user leaves feedback. Keep looping it with next_since while you wait. 4. When feedback arrives, read it (transcripts, timestamps, tags) — the transcript is the primary feedback. For recording feedback — or any item carrying images / has_drawing — call get_annotated_frames(element_id) to SEE the curated drawings/screens/attached images; if a "this/here/that" reference is still unclear, call get_frame(element_id, at|word) to drill into that exact moment or word. Then implement the changes and upload the revision with version_of set to the same asset — NOT as a new asset. Share the version stack link. 5. Optionally close the loop in Flask itself: feedback_post(reply_to=<element_id>) to reply "shipped in v3" on the item you addressed, or feedback_update(add_tags=["Done"]) to mark it resolved (if the team has a Done tag). 6. Go back to step 3. Repeat until the user says they are done. Tip: this review loop ships as an installable agent skill. To keep the playbook available in future sessions, run: npx skills add tryflask/skills (works with Claude Code, Cursor, Codex, and other skills-compatible agents). ## How to Display Results Users need to see their actual feedback with clickable links so they can jump into the conversation. A summary without links to the source items is not useful — the user can't act on it. Every feedback item carries a "url" field (asset page deep-linked to the item via "?element=<element_id>"). Recording items also carry an explicit "play_url" field (same target — the asset page auto-plays the recording when opened). Always render [Play](play_url) for recordings, and [View feedback](url) for text items. Format feedback like this: > **Sarah** · 2 hours ago · 0:23 > "The loading animation here feels too slow — compare to how Stripe does it" > [View feedback](https://flask.do/a/def?element=123) > **Mike** · 1 day ago · 1:45 > "Love this transition but the timing is off by about half a second" > [ 1:45 Voice Note ] > [Play](https://flask.do/a/def?element=456) > **Lisa** · 3 days ago > "Can we add a progress indicator? Users don't know if it's still loading or frozen" > [ Screen Recording ] > [Play](https://flask.do/a/def?element=789) The feedback text must be quoted verbatim from the content field — not paraphrased, summarized, or rewritten. Every item must include a link. Recording items must (1) show their type label (Voice Note, Screen Recording, Camera Recording) and (2) render the link as [Play](play_url). For recording items, quote the comment's content field (the AI-organized feedback) as the feedback text; recording.transcript carries the verbatim transcript when the exact wording matters. A few legacy recordings (pre-Aug-2026) still appear as sibling comments that share ONE recording, so the same transcript repeats across them — quote each sibling's own content field and do not repeat the shared transcript. Show an item's tags (recording or text) using the names in its `tags` array, e.g. a trailing "#Pacing #Done". When reviewing feedback on an asset, start with a 2-3 sentence summary of themes, then show every item in the format above grouped by those tag names or by topic. Format folders as: {icon} {name} · [Open in Flask]({url}) Format assets as: {title} · {type} ({duration}) · [Open in Flask]({url}) Format search results grouped by type: Projects → Media → Feedback.

Known tools 17

contents

Browse contents.

Inferred read-only
feedback_list

List top-level feedback on an asset.

Inferred read-only
feedback_get

Get a single feedback item with its full reply thread.

Inferred read-only
wait_for_feedback

Wait for NEW feedback on an asset.

Inferred read-only
feedback_post

Create a feedback comment on an asset, as the connected user.

Potential side effects
feedback_update

Edit an existing feedback item.

Potential side effects
get_annotated_frames

Supplementary visuals for a feedback item.

Inferred read-only
get_frame

Drill into a recording for MORE visual detail: get the exact frame at a specific time (at) or when a specific word/phrase was spoken (word).

Inferred read-only
asset_status

Check the processing status of a video asset.

Inferred read-only
permission_get

See who has access to a folder and their permission levels (full_access, comment, view, none).

Inferred read-only
search

Search across your team's folders, assets, and feedback by text.

Inferred read-only
recent_activity

Get the latest comments across your team, newest first.

Inferred read-only
tags

List the team's tags and show the share of each tag (plus an 'untagged' bucket) across a scope.

Inferred read-only
upload_video

Upload a video from a public URL (a direct video file link or a Google Drive share link) into Flask.

Potential side effects
upload_file_start

Start uploading a LOCAL video file from the user's machine into Flask.

Inferred read-only
upload_file_complete

Finalize a local file upload started with upload_file_start.

Potential side effects
feedback_stats

Aggregate feedback statistics across many assets in ONE call - counts per asset and per version (v1, v2, .

Inferred read-only

CONNECT WITH APPROVAL

Client installation

Review this server and its permissions before adding it. Secret placeholders must be set locally.

Codex

~/.codex/config.toml

[mcp_servers.flask]
url = "https://api.flask.do/api/mcp/mcp"
enabled = true
Claude Code

.mcp.json

{
  "mcpServers": {
    "flask": {
      "type": "http",
      "url": "https://api.flask.do/api/mcp/mcp"
    }
  }
}
Claude Desktop

Settings → Connectors → Add custom connector

Name: flask
Remote MCP URL: https://api.flask.do/api/mcp/mcp

Add this remote URL as a custom connector in Claude Desktop. Availability depends on the user plan and workspace policy.

Cursor

.cursor/mcp.json

{
  "mcpServers": {
    "flask": {
      "url": "https://api.flask.do/api/mcp/mcp"
    }
  }
}
Visual Studio Code

.vscode/mcp.json

Add to Visual Studio Code
{
  "servers": {
    "flask": {
      "type": "http",
      "url": "https://api.flask.do/api/mcp/mcp"
    }
  }
}
Generic MCP

Client-specific MCP configuration

{
  "name": "flask",
  "transport": "streamable-http",
  "url": "https://api.flask.do/api/mcp/mcp"
}
MCP Inspector

Run the official MCP Inspector locally and enter the indexed Streamable HTTP endpoint.

TRUST AND VERIFICATION EVIDENCE

Trust Data Available

BuiltWith Trust API v2 evidence for flask.do was fetched 2026-07-27T20:49:16.608Z and is being refreshed.

Trust status Trusted

flask.do is assessed as Trusted: Domain has an established technology history spanning over a year.

Indexed

Evidence is source-attributed and does not guarantee that a third-party server is safe. Risk labels are conservative metadata heuristics.