flow-mcp
by alarconcesar
README.md
# Google Flow MCP šØ
[](https://python.org)
[](https://modelcontextprotocol.io)
[](LICENSE)
**MCP server for generating images via Google Flow ā no daily quota limits.**
Claude Code (or any MCP client) can generate images using Google Flow's
`batchGenerateImages` API *directly* through a Playwright browser context
with your saved authentication, bypassing the Flow Agent chat quota (~10
images/day).
## Features
- **Text-to-Image** ā generate images from text prompts
- **Image-to-Image** ā use a reference image (pass `reference_image`)
- **No quota limits** ā calls the API directly, not through the chat
- **Persistent browser pool** ā reuses Chrome across generations (faster)
- **Auto-retry** ā refreshes auth token if it expires
- **Progress reporting** ā shows generation progress in Claude Code
- **No external CLI dependencies** ā includes its own auth/login
- **Cross-platform** ā Windows, macOS, Linux (incl. headless)
## Requirements
| Dependency | Notes |
|------------|-------|
| **Python 3.11+** (or [uv](https://docs.astral.sh/uv/)) | |
| **Google Chrome** or Playwright's Chromium | For authentication & generation |
| **Xvfb** (Linux headless only) | For `auth login` only (MCP server runs headless) |
## Installation
### Prerequisites
- **Python 3.11+**
- **Google Chrome** (for authentication)
- **Playwright browsers** (for generation)
### Install from PyPI (recommended)
```bash
pip install flow-mcp
# Or with uv:
# uv pip install flow-mcp
# Install Playwright browsers
playwright install chromium
# Authenticate with Google Flow
flow-mcp auth login
```
### Or install from GitHub
```bash
git clone https://github.com/alarconcesar/flow-mcp.git
cd flow-mcp
uv pip install -e .
playwright install chromium
flow-mcp auth login
```
## Usage with Claude Code
Add to your `.claude/settings.json`:
```json
{
"mcpServers": {
"flow-image-server": {
"command": "uv",
"args": ["run", "flow-mcp"]
}
}
}
```
Restart Claude Code. The `generate_image` tool will be available.
### Parameters
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `prompt` | string | **required** | Text description of the image |
| `model` | enum | `nano-pro` | `nano2`, `nano-pro`, `narwhal`, `gem_pix_2` |
| `count` | integer | `1` | Number of images (1ā4) |
| `aspect` | enum | `9:16` | `9:16`, `16:9`, `1:1`, `4:3`, `3:4` |
| `reference_image` | string | optional | Path to a local image for I2I |
### Examples
**Text-to-Image:**
```
Generate an image of a cyberpunk city at night, neon lights, 16:9
```
**Image-to-Image:**
```
Take this photo and make it cyberpunk style,
reference_image: /Users/me/photo.jpg
```
## CLI commands
```bash
flow-mcp # Start MCP server (stdio mode)
flow-mcp auth login # Authenticate with Google Flow
flow-mcp auth list # List saved profiles
flow-mcp help # Show help
```
## Environment variables
| Variable | Default | Description |
|----------|---------|-------------|
| `GFLOW_PROFILE` | auto-detected | Profile name |
| `GFLOW_CLI_HOME` | *platform default* | gflow-cli data directory |
| `GFLOW_OUTPUT_DIR` | temp directory | Where to save generated images |
## Troubleshooting
### Auth expired
```
flow-mcp auth login
```
### Content filter
Google Flow silently blocks certain prompts (returns `None`).
Try rephrasing ā avoid violence, NSFW, or trademarked content.
### Linux headless
```bash
# Only needed for authentication (the MCP server itself runs headless)
Xvfb :99 -screen 0 1280x720x24 &
DISPLAY=:99 flow-mcp auth login --browser internal
```
The MCP server (`flow-mcp`) now runs completely headless ā no Xvfb needed for generation.
### Profile not found
```bash
flow-mcp auth list # list profiles
flow-mcp auth login # create a new profile
```
## Project structure
```
flow-mcp/
āāā src/
ā āāā flow_mcp/
ā āāā __init__.py # Package metadata & logging config
ā āāā __main__.py # CLI entry point (auth, server)
ā āāā server.py # FastMCP tool definition
ā āāā generator.py # Core generation logic
ā āāā browser.py # Playwright context & token capture
ā āāā browser_pool.py # Persistent browser context pool
ā āāā auth.py # Login, profile list commands
ā āāā profile.py # Profile resolution
ā āāā recaptcha.py # reCAPTCHA token minting
ā āāā chrome_helpers.py # Chrome detection
ā āāā constants.py # Shared constants
āāā pyproject.toml
āāā LICENSE (MIT)
āāā README.md
```
## License
MIT ā see [LICENSE](LICENSE).
TDQS
A4.4/5.0
Scored across 1 tool
Disambiguation5/5
With only one tool, there is no possibility for confusion or overlap between tools. The single tool has a clear, distinct purpose.
Naming Consistency5/5
The sole tool uses a consistent verb_noun pattern (generate_image). With only one tool, naming consistency is inherently maintained.
Tool Count3/5
The server has only one tool, which is on the low end of reasonable scope. While the tool itself is feature-rich, a single tool may feel insufficient for a full image generation service.
Completeness4/5
The tool covers a wide range of image generation capabilities (text-to-image, image-to-image, upscaling, multiple models and resolutions). Minor gaps like model listing or configuration retrieval are absent but not critical for core functionality.
Maintenance
ActivitySlowing
ResponsivenessNo issues