Skip to main content
Glama
README.md
<div align="center">

# ๐Ÿšฉ Flag MCP

<p align="center">
  <a href="./README.md">English</a> | <a href="./README_CN.md">็ฎ€ไฝ“ไธญๆ–‡</a>
</p>

<p align="center">
  <img src="images/hero-banner.jpg" alt="Flag MCP" width="800">
</p>

<p align="center">
  <em>"Every flag you plant changes the story."</em>
</p>

<p align="center">
  <strong>Plant your flag. Shape the route. Ship with confidence.</strong>
</p>

<p align="center">
  Human-in-the-loop interaction for AI coding workflows โ€” because in every great visual novel, <strong>you</strong> choose the route.
</p>

<p align="center">
  <a href="https://github.com/pauoliva/interactive-feedback-mcp/releases"><img src="https://img.shields.io/github/v/release/pauoliva/interactive-feedback-mcp?style=flat-square" alt="Release"></a>
  <a href="https://github.com/pauoliva/interactive-feedback-mcp/blob/main/LICENSE"><img src="https://img.shields.io/github/license/pauoliva/interactive-feedback-mcp?style=flat-square" alt="License"></a>
  <a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.11+-blue?style=flat-square" alt="Python"></a>
</p>

<p align="center">
  Designed for <a href="https://cursor.sh">Cursor</a> ยท <a href="https://claude.ai/download">Claude Desktop</a> ยท <a href="https://cline.bot">Cline</a> ยท <a href="https://codeium.com/windsurf">Windsurf</a>
</p>

<p align="center">
  <video src="images/demo.mp4" controls="controls" width="100%" style="max-width: 800px;"></video>
</p>

</div>

---

## โœจ What is "Flag"?

In visual novels and Galgames, a **"flag"** (ใƒ•ใƒฉใ‚ฐ) is the moment a choice triggers a new story branch. One decision changes everything.

**Flag MCP** brings that same power to AI-assisted coding. When your AI assistant hits a crossroads, it doesn't guess โ€” it **raises a flag** and waits for you to choose the route.

๐ŸŽฎ **You're the protagonist.** The AI waits at every branching point.

๐Ÿ’Ž **Every flag shapes the route.** No more speculative rewrites.

๐Ÿš€ **Rich interaction.** Text, screenshots, annotations โ€” your full arsenal.

This transforms AI coding from "hope it works" into **a narrative where you hold the controller.**

---

Scope of Application:
- Coding plans billed on a per-request basis.
- Developers who wish to control AI behavior.

## ๐Ÿ”ฅ Before & After

| โŒ Without Flag MCP | โœ… With Flag MCP |
|:--------------------:|:-----------------:|
| AI guesses โ†’ wrong code โ†’ painful rework | AI raises a flag โ†’ you choose โ†’ correct code |
| Multiple rounds of "wait, what did you mean?" | One structured dialog, crystal clear |
| Anxious: "What is the AI about to do?!" | Confident: every action confirmed by you |
| Helpless passenger | You are the route-setter |

---

## ๐ŸŽฏ Core Features

- ๐Ÿ–ฅ๏ธ **Dark Themed UI** โ€” A sleek native desktop dialog that fits your workflow
- โœ… **Route Choices** โ€” Structured predefined options (checkbox-style)
- ๐Ÿ’ฌ **Free Text** โ€” When the predefined routes aren't enough, write your own script
- ๐Ÿ“ท **Rich Media Arsenal**
  - Paste images from clipboard
  - Select local files
  - **Screenshot + Built-in Annotator** (rectangle, circle, arrow, pen, text, crop)
- ๐Ÿ–ผ๏ธ **Prompt Images** โ€” AI can show you images (local paths, `file://`, `http(s)://`)
- ๐Ÿ”’ **Security First** โ€” Remote images validated, size-limited, async loaded
- ๐ŸŽจ **macOS Optimized** โ€” Proper icon handling and visual polish

---

## ๐Ÿ“ฆ Installation

### Prerequisites

- Python `>= 3.11`
- [`uv`](https://github.com/astral-sh/uv) (recommended) or `pip`

### Quick Install

```bash
git clone https://github.com/pauoliva/interactive-feedback-mcp.git
cd interactive-feedback-mcp
uv sync
```

---

## โš™๏ธ Configuration

Add to your MCP client configuration:

**Cursor** (`mcp.json`) / **Claude Desktop** (`claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "interactive-feedback": {
      "command": "uv",
      "args": [
        "--directory",
        "/path/to/interactive-feedback-mcp",
        "run",
        "server.py"
      ],
      "timeout": 900000,
      "autoApprove": ["interactive_feedback"]
    }
  }
}
```

> โš ๏ธ **Note**: Timeout is in **milliseconds** for Cursor (`900000` = 15 min). Some clients use seconds โ€” adjust accordingly.

---

## ๐Ÿšฉ The `interactive_feedback` Tool

### Arguments

| Parameter | Type | Description |
|-----------|------|-------------|
| `message` | `string` | The question/prompt to display |
| `predefined_options` | `array` | Optional. Route choices for quick decisions |
| `message_images` | `array` | Optional. Images to show (local/remote URLs) |

### Returns

- Text feedback from user
- Optional image attachments (as MCP image content blocks)

---

## ๐Ÿง™ Pro Tips

### Recommended Agent Rules

Add this to your AI assistant's custom instructions:

```
If requirements are unclear, call interactive_feedback before implementing.
Present predefined options whenever possible โ€” give the user clear route choices.
Before finishing a task, call interactive_feedback once more for final confirmation.
```

### Environment Variables

| Variable | Default | Description |
|----------|---------|-------------|
| `INTERACTIVE_FEEDBACK_TIMEOUT_SEC` | `60000` | Max UI process lifetime |
| `INTERACTIVE_FEEDBACK_ICON` | โ€” | Custom app icon path |
| `INTERACTIVE_FEEDBACK_REMOTE_IMAGE_TIMEOUT_SEC` | `5` | Remote image fetch timeout |
| `INTERACTIVE_FEEDBACK_REMOTE_IMAGE_MAX_BYTES` | `10485760` | Max remote image size (10MB) |

---

## ๐Ÿ›ก๏ธ Security & Reliability

- โœ… Remote images validated by content-type (`image/*`)
- โœ… Large payloads rejected via size cap
- โœ… Async fetch keeps UI responsive
- โœ… Local files read only when explicitly referenced


---

## ๐Ÿ“„ License

MIT License โ€” fork it, flag it, ship it.

---

<div align="center">

**๐Ÿšฉ Plant your flag. Write your own route.**

*Made with ๐Ÿ’œ for developers who refuse to be NPCs in their own codebase.*

</div>

TDQS

A3.7/5.0

Scored across 1 tool

Disambiguation5/5

With only one tool available, there is no ambiguity or risk of tool misselection. The single tool has a clear, distinct purpose that does not overlap with any other tools.

Naming Consistency5/5

The single tool follows a clear snake_case naming convention. While 'interactive' is an adjective rather than a verb, there are no other tools to create inconsistency, so the naming pattern is uniform.

Tool Count2/5

A single tool is insufficient for the apparent 'Flag' domain suggested by the server name. Even for a minimal utility server, one generic feedback tool represents a severely undersized tool surface that likely cannot fulfill the server's intended purpose.

Completeness1/5

The server named 'Flag MCP' implies a feature flag or flagging domain, yet provides only a generic user feedback tool with no flag creation, management, querying, or lifecycle operations. This represents a severely incomplete surface for the stated purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues