Flag MCP
<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
Scored across 1 tool
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.
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.
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.
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.