{"openapi":"3.1.0","info":{"title":"Flowback API","version":"1.0.0","summary":"Workspace-scoped feedback, issues, and insights for AI agents.","description":"Flowback's public API is a hosted Model Context Protocol (MCP) server: a single JSON-RPC 2.0 endpoint over Streamable HTTP. Call the standard MCP methods (`initialize`, `tools/list`, `tools/call`) to drive the tools listed under `x-mcp.tools`; each tool's input schema is generated from the live server's registry. Also reachable at https://www.flowback.co/api/mcp. Human-readable reference: https://www.flowback.co/docs/api-reference.","contact":{"name":"Flowback","url":"https://www.flowback.co/contact"}},"servers":[{"url":"https://mcp.flowback.co","description":"Hosted MCP server"}],"security":[{"bearerAuth":[]}],"paths":{"/mcp":{"post":{"operationId":"mcp","summary":"MCP JSON-RPC 2.0 endpoint (Streamable HTTP)","description":"Speaks the Model Context Protocol over Streamable HTTP. Send JSON-RPC 2.0 requests; tool invocations use method `tools/call` with the tool name and arguments. Requires a workspace API key (`fb_sk_…`) as a Bearer token.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"JSON-RPC response. Tool-level failures (insufficient scope, not found, validation) are returned in-band as MCP tool errors.","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"},"description":"Workspace per-minute request limit."},"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests remaining in the current window."},"X-RateLimit-Reset":{"schema":{"type":"integer"},"description":"Unix time the window resets."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"401":{"description":"Missing, malformed, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcError"}}}},"429":{"description":"Rate limit exceeded (workspace/minute, workspace/day, or per-key/minute).","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcError"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Workspace-scoped API key (`fb_sk_…`), created in the dashboard under Settings → Integrations → API & MCP. Keys carry read or read+write scopes chosen at creation."}},"schemas":{"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","number"]},"method":{"type":"string","description":"MCP method, e.g. `initialize`, `tools/list`, or `tools/call`."},"params":{"type":"object"}}},"JsonRpcResponse":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","number","null"]},"result":{"type":"object"},"error":{"$ref":"#/components/schemas/JsonRpcError/properties/error"}}},"JsonRpcError":{"type":"object","required":["jsonrpc","error"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","number","null"]},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer","description":"JSON-RPC error code, e.g. -32001 for auth and rate-limit errors."},"message":{"type":"string","description":"Human-readable explanation including how to fix the error."}}}}},"list_statuses_input":{"type":"object","properties":{}},"list_channels_input":{"type":"object","properties":{"status":{"type":"string","enum":["active","paused"]},"type":{"type":"string","enum":["internal","external"]}}},"list_campaigns_input":{"type":"object","properties":{"channel":{"description":"Channel slug","type":"string"},"status":{"type":"string","enum":["draft","active","closed"]}}},"list_labels_input":{"type":"object","properties":{}},"list_submissions_input":{"type":"object","properties":{"channel":{"description":"Channel slug","type":"string"},"campaign":{"description":"Campaign share slug (from list_campaigns) — only submissions collected through that campaign","type":"string"},"category":{"type":"string"},"submitter":{"description":"Matches submitter name or email (case-insensitive)","type":"string"},"since":{"description":"ISO 8601 timestamp — only submissions created after this","type":"string"},"has_issue":{"description":"true: only submissions with a linked issue; false: only orphans","type":"boolean"},"status":{"description":"Filter by submission status. 'draft' shows submissions still in the Inbox awaiting approval; 'published' shows those already approved/processed.","type":"string","enum":["draft","published"]},"inbox":{"description":"Sugar for the Inbox query: returns submissions matching `status='draft' OR seen_at IS NULL` (everything currently in the Inbox). Use this when the user asks 'what's in the inbox?'.","type":"boolean"},"kind":{"description":"Filter by submission kind (FB-69E57B): 'feedback' (default intake), 'survey_response' (campaign-collected), 'request' (asks captured from channels).","type":"string","enum":["feedback","survey_response","request"]},"open":{"description":"Lifecycle filter for non-feedback kinds: true returns only unresolved (open) submissions — the review queue; false returns only resolved (closed) ones. Feedback submissions have no open/close lifecycle and are excluded when this is set.","type":"boolean"},"source":{"description":"Filter by where the submission came from: 'posthog' or 'sentry' for error-tracking drafts, 'intake' for human-submitted feedback. Combine with inbox=true to find error drafts awaiting triage (e.g. 'check the inbox for errors').","type":"string","enum":["posthog","sentry","intake"]},"search":{"description":"Keyword match on title and PRD markdown","type":"string"},"sort":{"default":"created","type":"string","enum":["created"]},"order":{"default":"desc","type":"string","enum":["asc","desc"]},"page":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991},"per_page":{"default":25,"type":"integer","minimum":1,"maximum":100}}},"get_submission_input":{"type":"object","properties":{"submission_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Submission UUID"}},"required":["submission_id"]},"list_issues_input":{"type":"object","properties":{"status":{"description":"Status name (e.g. 'In Progress') or bucket ('backlog' | 'under_review' | 'in_progress' | 'completed' | 'cancelled')","type":"string"},"priority":{"description":"Priority name: 'Urgent' | 'High' | 'Medium' | 'Low' | 'No priority'","type":"string"},"channel":{"description":"Channel slug","type":"string"},"category_tag":{"description":"Category classification (e.g. 'bug', 'feature', 'chore', 'docs'). Case-insensitive exact match.","type":"string"},"assignee":{"description":"Matches assignee_name or assignee's email (case-insensitive)","type":"string"},"labels":{"description":"Returns issues whose labels array overlaps with any of these","type":"array","items":{"type":"string"}},"since":{"description":"ISO 8601 timestamp — only issues updated after this","type":"string"},"search":{"description":"Keyword match on title and AI summary","type":"string"},"include_hidden":{"default":false,"description":"Include hidden issues. Archived issues are still excluded unless include_archived is true.","type":"boolean"},"include_archived":{"default":false,"description":"Include archived issues. Defaults to false to match the dashboard backlog views.","type":"boolean"},"sort":{"default":"updated","type":"string","enum":["updated","priority","created"]},"order":{"default":"desc","type":"string","enum":["asc","desc"]},"page":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991},"per_page":{"default":25,"type":"integer","minimum":1,"maximum":100}}},"get_issue_input":{"type":"object","properties":{"issue_id":{"type":"string","description":"UUID, native reference number, or external URL"}},"required":["issue_id"]},"list_insights_input":{"type":"object","properties":{"type":{"description":"Only insights of this type","type":"string","enum":["feature_request","pain_point","regression","opportunity","trend","risk"]},"status":{"default":"active","description":"'active' (default) = new + acknowledged, matching the dashboard's default view; 'all' = every non-archived insight; or one exact status","type":"string","enum":["active","all","new","acknowledged","converted","implemented","dismissed"]},"theme":{"description":"Case-insensitive substring match on the theme label","type":"string"},"min_score":{"description":"Only insights scoring at or above this. Score is an open-ended composite (reach × momentum × urgency × source diversity), so use it for relative cutoffs, not percentages.","type":"number"},"limit":{"default":25,"type":"integer","minimum":1,"maximum":100}}},"get_insight_input":{"type":"object","properties":{"insight_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Insight UUID (from list_insights)"}},"required":["insight_id"]},"create_issue_input":{"type":"object","properties":{"title":{"type":"string","minLength":1,"description":"Short issue title."},"description":{"description":"Optional initial body (markdown). Use update_issue with update_mode='section' later to grow this into a plan or add notes.","type":"string"},"priority":{"description":"Priority name (e.g. 'Urgent', 'High') case-insensitive, or integer 0..4 (0=No priority, 1=Urgent, 2=High, 3=Medium, 4=Low). Defaults to null ('No priority') if omitted.","anyOf":[{"type":"string"},{"type":"integer","minimum":0,"maximum":4}]},"channel":{"description":"Channel UUID or slug. If omitted, lands in the workspace's 'mcp' channel (created automatically). Pass a slug to override.","type":"string"},"status":{"description":"Status name (case-insensitive, e.g. 'Backlog', 'Under Review'). Defaults to the workspace default if omitted.","type":"string"},"category_tag":{"type":"string"},"labels":{"type":"array","items":{"type":"string"}},"github_pr_url":{"description":"Link a GitHub pull request to the new issue (e.g. 'https://github.com/owner/repo/pull/123'). Records the PR so the issue can advance automatically when the PR merges and the change ships.","type":"string"},"transcript":{"description":"Filtered session turns (user + assistant text only; skip tool calls and thinking). Renders in the Agent Transcript tab. Auto-overflows to a session-transcript.md attachment past 200 turns or 200KB.","type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string"}},"required":["role","content"]}},"attachments":{"description":"Up to 5 inline UTF-8 text files. 512KB per file, 1MB total. Use for markdown plans, notes, or local context.","maxItems":5,"type":"array","items":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string"},"mime":{"type":"string"}},"required":["filename","content"]}},"agent_metadata":{"description":"Caller context. Populate whatever you know (model, session_id, started_at, cwd, git_branch, surface).","type":"object","properties":{"model":{"type":"string"},"session_id":{"type":"string"},"started_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"cwd":{"type":"string"},"git_branch":{"type":"string"},"surface":{"type":"string"}}},"idempotency_key":{"description":"Client-generated UUID. A retry with the same key returns the existing issue instead of creating a duplicate. Generate one per logical attempt, not per retry.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["title"]},"create_draft_input":{"type":"object","properties":{"title":{"type":"string","minLength":1,"description":"Short title for the draft."},"prd_markdown":{"type":"string","minLength":1,"description":"Description / brief / PRD body in markdown. Pass whatever you have — a one-liner, a brief, or a full plan."},"channel":{"description":"Channel UUID or slug. If omitted, lands in the workspace's 'mcp' channel (created automatically). Pass a slug to override.","type":"string"},"category_tag":{"type":"string"},"suggested_priority":{"description":"Optional priority name (e.g. 'High', 'Low'). Stored verbatim as a hint for the human triaging the draft.","type":"string"},"transcript":{"description":"Filtered session turns (user + assistant text only; skip tool calls and thinking). Renders in the Agent Transcript tab. Auto-overflows to a session-transcript.md attachment past 200 turns or 200KB.","type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["user","assistant"]},"content":{"type":"string"}},"required":["role","content"]}},"attachments":{"description":"Up to 5 inline UTF-8 text files. 512KB per file, 1MB total. Use for markdown plans, notes, or local context.","maxItems":5,"type":"array","items":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string"},"mime":{"type":"string"}},"required":["filename","content"]}},"agent_metadata":{"description":"Caller context. Populate whatever you know (model, session_id, started_at, cwd, git_branch, surface).","type":"object","properties":{"model":{"type":"string"},"session_id":{"type":"string"},"started_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"cwd":{"type":"string"},"git_branch":{"type":"string"},"surface":{"type":"string"}}},"idempotency_key":{"description":"Client-generated UUID. A retry with the same key returns the existing draft instead of inserting a duplicate. Generate one per logical attempt, not per retry.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["title","prd_markdown"]},"update_issue_input":{"type":"object","properties":{"issue_id":{"type":"string","description":"Issue identifier: UUID, native reference (e.g. 'FB-123'), external URL, or bare external key (e.g. 'ENG-42')."},"priority":{"description":"Priority name (e.g. 'Urgent', 'High') case-insensitive, or integer 0..4 (0=No priority, 1=Urgent, 2=High, 3=Medium, 4=Low).","anyOf":[{"type":"string"},{"type":"integer","minimum":0,"maximum":4}]},"title":{"type":"string","minLength":1},"description":{"type":"string"},"category_tag":{"description":"Category classification (e.g. 'bug', 'feature', 'chore', 'docs'). Pass an empty string to clear it.","type":"string"},"channel":{"description":"Reassign the issue to a different channel. Channel UUID or slug (same shapes as create_issue). Omit to leave unchanged.","type":"string"},"labels":{"description":"Replace the issue's labels with this set (whole-array replace, not add/remove). Pass [] to clear all labels. Free-form and case-insensitively de-duplicated; call list_labels to see what's already in use.","type":"array","items":{"type":"string"}},"github_pr_url":{"description":"Link a GitHub pull request to this issue (e.g. 'https://github.com/owner/repo/pull/123'). Records the PR so the issue can advance automatically when the PR merges and the change ships. Pass an empty string to clear the link.","type":"string"},"update_mode":{"description":"How to combine the `description` argument with the existing description: 'replace' (default) overwrites it; 'append'/'prepend' add to the end/start with a blank-line separator; 'section' inserts or replaces a `## {section}` block (requires the `section` argument).","type":"string","enum":["replace","append","prepend","section"]},"section":{"description":"Section heading name to write to (used only when update_mode='section'). Recommended: 'Plan' for implementation plans, 'Notes' for post-work observations, 'Findings' for diagnosis output, 'Context' for background. Free-form — any name is accepted.","type":"string"},"attachments":{"description":"Append files to the issue (append-only — does not replace existing attachments). Up to 5 files per call, 3MB each / 3MB total. Text files (md/txt/csv/json/log): pass content as UTF-8. Binary (png/jpg/gif/webp/heic/pdf/docx/xlsx/pptx/mp3/m4a/wav): pass base64 content with encoding='base64'. Video and zip are not accepted inline. Per-issue cap is 20; cancelled/archived issues are frozen.","maxItems":5,"type":"array","items":{"type":"object","properties":{"filename":{"type":"string","minLength":1,"maxLength":200},"content":{"type":"string"},"mime":{"type":"string"},"encoding":{"description":"How `content` is encoded: 'utf8' (default) for text files, 'base64' for binary (images, pdf, audio, office docs).","type":"string","enum":["utf8","base64"]}},"required":["filename","content"]}}},"required":["issue_id"]},"update_issue_status_input":{"type":"object","properties":{"issue_id":{"type":"string","description":"Issue identifier: UUID, native reference (e.g. 'FB-123'), external URL, or bare external key (e.g. 'ENG-42')."},"status":{"type":"string","description":"Status name (case-insensitive) or workspace_status UUID."}},"required":["issue_id","status"]},"link_issues_input":{"type":"object","properties":{"issue_id":{"type":"string","description":"First issue — the subject of the relation verb. UUID, native reference (e.g. 'FB-123'), external URL, or bare external key."},"counterpart_issue_id":{"type":"string","description":"Second issue — the object of the relation verb. Same identifier shapes."},"relation":{"type":"string","enum":["duplicate_of","has_duplicate","related","blocks","blocked_by","parent_of","subissue_of"],"description":"How the first issue relates to the second, e.g. relation='blocks' means the first issue blocks the second; relation='subissue_of' means the first is a sub-issue of the second."}},"required":["issue_id","counterpart_issue_id","relation"]},"unlink_issues_input":{"type":"object","properties":{"issue_id":{"type":"string","description":"First issue. UUID, native reference (e.g. 'FB-123'), external URL, or bare external key."},"counterpart_issue_id":{"type":"string","description":"Second issue. Same identifier shapes."},"relation":{"description":"Which relation to remove, read from the first issue's perspective (e.g. 'blocks'). Only needed when the pair holds more than one relation.","type":"string","enum":["duplicate_of","has_duplicate","related","blocks","blocked_by","parent_of","subissue_of"]}},"required":["issue_id","counterpart_issue_id"]},"create_issue_comment_input":{"type":"object","properties":{"issue_id":{"type":"string","description":"Issue identifier: UUID, native reference (e.g. 'FB-123'), external URL, or bare external key (e.g. 'ENG-42')."},"body":{"type":"string","minLength":1,"description":"Comment body in markdown."}},"required":["issue_id","body"]},"decline_submission_input":{"type":"object","properties":{"submission_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Submission UUID"}},"required":["submission_id"]},"snooze_submission_input":{"type":"object","properties":{"submission_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Submission UUID"}},"required":["submission_id"]},"resolve_submission_input":{"type":"object","properties":{"submission_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Submission UUID"},"action":{"description":"Defaults to 'resolve' (close).","type":"string","enum":["resolve","reopen"]},"note":{"description":"Optional resolution note kept on the record (resolve only) — e.g. the answer given, or why no action is needed.","type":"string"}},"required":["submission_id"]}}},"x-mcp":{"transport":"streamable-http","manifest":"https://www.flowback.co/.well-known/mcp.json","tools":[{"name":"list_statuses","title":"List workspace statuses","description":"Returns every status configured in this workspace. Statuses are the available values for an issue's state (e.g. Backlog, In Progress, Completed).","readOnly":true,"inputSchema":{"$ref":"#/components/schemas/list_statuses_input"}},{"name":"list_channels","title":"List channels","description":"Returns feedback intake channels for this workspace. Filter by status (active/paused) or type (internal/external).","readOnly":true,"inputSchema":{"$ref":"#/components/schemas/list_channels_input"}},{"name":"list_campaigns","title":"List campaigns","description":"Returns feedback campaigns (time-boxed collection runs under a channel) for this workspace. Filter by channel slug or status (draft/active/closed). Use a campaign's share_slug with list_submissions' `campaign` filter to see its responses.","readOnly":true,"inputSchema":{"$ref":"#/components/schemas/list_campaigns_input"}},{"name":"list_labels","title":"List workspace labels","description":"Returns the labels currently in use across the workspace's issues, each with a usage count (most-used first). Labels are free-form — there is no fixed registry — so this reflects what has actually been applied. Use it to reuse an existing label rather than create a near-duplicate when calling create_issue or update_issue.","readOnly":true,"inputSchema":{"$ref":"#/components/schemas/list_labels_input"}},{"name":"list_submissions","title":"List submissions","description":"Returns feedback submissions (raw intake before they become issues). Filter by channel, campaign, category, submitter, date, search, status ('draft' vs 'published'), kind ('feedback'/'survey_response'/'request'), open (unresolved non-feedback rows — the review queue), source ('posthog'/'sentry'/'intake'), or by whether they're in the Inbox (inbox=true). Use kind='survey_response' with open=true to find campaign responses awaiting review; use status='draft' or inbox=true to find drafts created via create_draft.","readOnly":true,"inputSchema":{"$ref":"#/components/schemas/list_submissions_input"}},{"name":"get_submission","title":"Get submission","description":"Returns full detail for a single submission: metadata, conversation, PRD markdown, image URLs, and linked issue if any.","readOnly":true,"inputSchema":{"$ref":"#/components/schemas/get_submission_input"}},{"name":"list_issues","title":"List issues","description":"Returns issues in this workspace. Supports rich filtering (status, priority, channel, category_tag, assignee, labels, date, search) and pagination.","readOnly":true,"inputSchema":{"$ref":"#/components/schemas/list_issues_input"}},{"name":"get_issue","title":"Get issue","description":"Full detail for a single issue, including comments, linked submissions, relations to other issues (duplicates, blockers, parent/sub-issues), external links, and recent sync events. Accepts a UUID, a native reference number (e.g. 'FB-123'), or an external URL (Linear).","readOnly":true,"inputSchema":{"$ref":"#/components/schemas/get_issue_input"}},{"name":"list_insights","title":"List insights","description":"Returns AI-generated, evidence-backed insights for this workspace — ranked claims distilled nightly from feedback (feature requests, pain points, regressions, opportunities, trends, risks), best score first. Filter by type, status, theme, or minimum score. Every metric is computed from the underlying evidence, never model-generated. Use get_insight for the evidence verbatims behind a claim.","readOnly":true,"inputSchema":{"$ref":"#/components/schemas/list_insights_input"}},{"name":"get_insight","title":"Get insight","description":"Full detail for a single insight: the claim, recommendation, SQL-computed metrics, and every evidence verbatim with the source submission or issue it came from. Use list_insights to discover insight IDs.","readOnly":true,"inputSchema":{"$ref":"#/components/schemas/get_insight_input"}},{"name":"create_issue","title":"Create issue","description":"Creates a new issue directly on the board (skips the Inbox). Use this when the agent has clear intent — e.g. \"create an issue to fix X\" — or to \"save this session to Flowback\" as an issue with its transcript. For half-formed ideas that need human triage, use create_draft instead. Lands in the workspace's 'mcp' channel by default; pass channel=<slug> to override. Optional inputs attach the current session transcript, markdown files, and agent metadata, which render in the issue's Agent Transcript / Attachments tabs. Transcript: filter to user/assistant text only — skip tool calls and thinking. Read the session JSONL at most once per session. Status defaults to the workspace default (typically 'Backlog'); pass status=<name> (e.g. 'Under Review') to override. Priority defaults to 'No priority' if omitted. Pass github_pr_url to link a GitHub pull request, so the issue can advance automatically once it merges and ships. Idempotency: generate one UUID per logical attempt (not per retry).","readOnly":false,"inputSchema":{"$ref":"#/components/schemas/create_issue_input"}},{"name":"create_draft","title":"Create draft (Inbox)","description":"Creates a draft submission in the Inbox for human triage. Use this for half-formed ideas or terminal-scoped plans (\"draft this with plan.md attached\", \"queue this for review\") rather than create_issue. Optional inputs let you attach the current session transcript, markdown files, and agent metadata. Three usage modes (all agent-side, no flag): (a) summary in description + file as attachment, (b) file content as the description, (c) file as both description and attachment. Transcript: filter to user/assistant text only — skip tool calls and thinking. Read the session JSONL at most once per session and reuse the parsed turns across draft calls. Idempotency: generate one UUID per logical draft attempt (not per retry).","readOnly":false,"inputSchema":{"$ref":"#/components/schemas/create_draft_input"}},{"name":"update_issue","title":"Update issue","description":"Updates an issue's priority, title, description, category_tag, channel, labels, github_pr_url, and/or attachments. Accepts the same identifier shapes as get_issue. Pass channel (UUID or slug) to reassign the issue to a different channel. Pass labels to replace the issue's label set (whole-array replace; use list_labels to discover existing labels). Pass github_pr_url to link the GitHub pull request you opened for this issue (empty string clears it). Pass attachments to add files to the issue (append-only; rendered in the Attachments tab). Description writes support update_mode: 'replace' (default), 'append', 'prepend', or 'section'. Use update_mode='section' with section='Plan' (or 'Notes', 'Findings', etc.) to iteratively grow an issue — e.g. start with a brief, later append a ## Plan, then add ## Notes after the work is done. Returns the refreshed issue and any non-fatal warnings. At least one of priority/title/description/category_tag/channel/labels/github_pr_url/attachments is required.","readOnly":false,"inputSchema":{"$ref":"#/components/schemas/update_issue_input"}},{"name":"update_issue_status","title":"Update issue status","description":"Moves an issue to a different status. Accepts the same identifier shapes as get_issue for issue_id. Status accepts a name (case-insensitive, e.g. 'In Progress') or a workspace_status UUID. Returns the refreshed issue and any non-fatal warnings (e.g. no Linear mapping configured).","readOnly":false,"inputSchema":{"$ref":"#/components/schemas/update_issue_status_input"}},{"name":"link_issues","title":"Link issues","description":"Links two issues with a typed relation, read from the first issue's perspective: 'related', 'duplicate_of' / 'has_duplicate', 'blocks' / 'blocked_by', or 'parent_of' / 'subissue_of' (use parent_of/subissue_of to structure a master issue with sub-issues). Each pair can hold one live edge per relation type; to flip a directional edge, unlink_issues first. Relations appear in get_issue and on both issues' dashboards.","readOnly":false,"inputSchema":{"$ref":"#/components/schemas/link_issues_input"}},{"name":"unlink_issues","title":"Unlink issues","description":"Removes a relation between two issues. If the pair is linked by more than one relation, pass `relation` (from the first issue's perspective, as in link_issues) to pick which one; the error for an ambiguous pair lists the candidates. Removing an AI-suggested relation also stops it from being re-suggested.","readOnly":false,"inputSchema":{"$ref":"#/components/schemas/unlink_issues_input"}},{"name":"create_issue_comment","title":"Create issue comment","description":"Adds a comment to an existing issue. Mirrors to Linear / GitHub automatically when those integrations are linked. Use comments for post-work notes, decisions, deviations, or any running commentary that doesn't belong in the description (the spec). Accepts the same identifier shapes as get_issue.","readOnly":false,"inputSchema":{"$ref":"#/components/schemas/create_issue_comment_input"}},{"name":"decline_submission","title":"Decline submission","description":"Declines an inbox draft submission: removes it from the inbox and stops future PostHog/Sentry occurrences of the same fingerprint from creating new drafts. Only draft submissions can be declined. Idempotent.","readOnly":false,"inputSchema":{"$ref":"#/components/schemas/decline_submission_input"}},{"name":"snooze_submission","title":"Snooze submission","description":"Snoozes an inbox draft submission: removes it from the inbox but resurfaces it the next time the same PostHog/Sentry fingerprint produces an event. Only available for draft submissions sourced from PostHog or Sentry.","readOnly":false,"inputSchema":{"$ref":"#/components/schemas/snooze_submission_input"}},{"name":"resolve_submission","title":"Resolve submission","description":"Closes a non-feedback submission (kind 'survey_response' or 'request'): marks it resolved with an optional note, removing it from the open review queue. Pass action='reopen' to reverse a close. Feedback submissions have no open/close lifecycle (use approve/decline flows); drafts resolve via approval. Never emails the submitter.","readOnly":false,"inputSchema":{"$ref":"#/components/schemas/resolve_submission_input"}}]}}