Skip to main content
Glama
README.md
# MCP fal.ai Integration

[![npm version](https://badge.fury.io/js/%40monsoft%2Fmcp-fal-ai.svg)](https://www.npmjs.com/package/@monsoft/mcp-fal-ai)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

An MCP (Model Context Protocol) server that integrates with [fal.ai](https://fal.ai) to provide seamless access to AI models for image generation, text processing, audio synthesis, and more. Use this package to connect AI agents like Cursor, Claude Desktop, ChatGPT, and other MCP-compatible tools to fal.ai's powerful AI model catalog.

## Features

✨ **8 Tools** for model discovery, execution, and job management  
šŸ”— **4 Resources** for configuration and documentation  
šŸ“ **1 Prompt** for image generation assistance  
šŸš€ **Dual Transport** support (stdio and SSE)  
šŸ”’ **Type-safe** with full TypeScript support  
šŸŽÆ **Zero dependencies** on fal.ai SDK (pure HTTP client)

---

## Installation

### NPM Package

```bash
npm install -g @monsoft/mcp-fal-ai
```

Or install locally in your project:

```bash
npm install @monsoft/mcp-fal-ai
```

### From Source

```bash
git clone https://github.com/Monsoft-Solutions/model-context-protocols.git
cd model-context-protocols/packages/mcp-fal-ai
npm install
npm run build
```

---

## Getting Your fal.ai API Key

Before using this MCP server, you need a fal.ai API key:

1. Visit [fal.ai dashboard](https://fal.ai/dashboard)
2. Sign up or log in with your account
3. Navigate to API Keys section
4. Create a new API key
5. Copy the key for configuration (next section)

---

## MCP Setup Instructions

Configure this MCP server in your AI agent by following the instructions for your specific tool.

### šŸŽÆ Cursor IDE

1. Open Cursor Settings (Cmd/Ctrl + ,)
2. Navigate to **Features** → **Model Context Protocol**
3. Click **Add MCP Server** or edit your MCP configuration file
4. Add the following configuration:

**Using global npm installation:**

```json
{
    "mcpServers": {
        "fal-ai": {
            "command": "mcp-fal-ai",
            "env": {
                "FAL_API_KEY": "your-fal-api-key-here"
            }
        }
    }
}
```

**Using npx:**

```json
{
    "mcpServers": {
        "fal-ai": {
            "command": "npx",
            "args": ["-y", "@monsoft/mcp-fal-ai"],
            "env": {
                "FAL_API_KEY": "your-fal-api-key-here"
            }
        }
    }
}
```

5. Save and restart Cursor
6. The fal.ai tools should now be available in your agent context

### šŸ¤– Claude Desktop

1. Locate your Claude Desktop configuration file:

    - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
    - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
    - **Linux**: `~/.config/Claude/claude_desktop_config.json`

2. Add or update the MCP server configuration:

```json
{
    "mcpServers": {
        "fal-ai": {
            "command": "npx",
            "args": ["-y", "@monsoft/mcp-fal-ai"],
            "env": {
                "FAL_API_KEY": "your-fal-api-key-here"
            }
        }
    }
}
```

3. Save the file and restart Claude Desktop
4. Look for the šŸ”Œ icon in Claude to verify the MCP server is connected

### šŸ’¬ ChatGPT (OpenAI Desktop or Custom Integration)

For ChatGPT with MCP support (if available):

1. Access your MCP configuration settings
2. Add the server using npx:

```json
{
    "mcpServers": {
        "fal-ai": {
            "command": "npx",
            "args": ["-y", "@monsoft/mcp-fal-ai"],
            "env": {
                "FAL_API_KEY": "your-fal-api-key-here"
            }
        }
    }
}
```

### šŸ› ļø Generic MCP Client

For any MCP-compatible client:

**Using stdio transport:**

```bash
FAL_API_KEY=your-api-key npx @monsoft/mcp-fal-ai
```

**Using SSE transport:**

```bash
FAL_API_KEY=your-api-key npx @monsoft/mcp-fal-ai --run-sse --port 3001
```

**Configuration options:**

```json
{
    "command": "npx",
    "args": ["-y", "@monsoft/mcp-fal-ai"],
    "env": {
        "FAL_API_KEY": "your-fal-api-key-here",
        "RUN_SSE": "false",
        "PORT": "3001"
    }
}
```

### šŸ”§ CLI Flags

You can also pass configuration via command-line flags:

- `--fal-api-key` or `-k`: Your fal.ai API key
- `--run-sse` or `-s`: Enable SSE transport (default: false)
- `--port` or `-p`: Port for SSE server (default: 3001)

Example:

```bash
npx @monsoft/mcp-fal-ai --fal-api-key YOUR_KEY --run-sse --port 3001
```

---

## Quick Start Examples

Once configured in your AI agent, you can use the fal.ai tools directly in your conversations:

### Example 1: Generate an Image

```
User: Use fal.ai to generate an image of a sunset over mountains

Agent: I'll help you generate that image using fal.ai.
1. First, let me search for image generation models...
   [calls: fal-search-models with keyword "image generation"]

2. I'll use the flux-pro model. Let me get its schema...
   [calls: fal-get-model-schema with modelId "fal-ai/flux-pro"]

3. Now I'll generate the image...
   [calls: fal-enqueue with proper parameters]

4. Checking status...
   [calls: fal-get-status with requestId]

5. Retrieving the result...
   [calls: fal-get-result with requestId]
```

### Example 2: List Available Models

```
User: What AI models are available on fal.ai?

Agent: Let me search for available models...
[calls: fal-list-models with limit 10]
```

### Example 3: Get Model Details

```
User: Show me the input parameters for the flux-pro model

Agent: I'll fetch the schema for that model...
[calls: fal-get-model-schema with modelId "fal-ai/flux-pro"]
```

---

## Available Tools

The MCP server exposes the following tools to AI agents:

### šŸ” Discovery Tools

#### `fal-list-models`

List all available models from fal.ai with optional pagination.

**Parameters:**

- `limit` (number, optional): Maximum number of models to return
- `page` (number, optional): Page number for pagination

**Example:**

```json
{
    "limit": 20,
    "page": 1
}
```

#### `fal-search-models`

Search for models by keywords with optional category and limit filtering.

**Parameters:**

- `keyword` (string, required): Search keyword (e.g., "image generation", "text to speech")
- `limit` (number, optional): Maximum number of results
- `category` (string, optional): Filter by category

**Example:**

```json
{
    "keyword": "image generation",
    "limit": 10
}
```

#### `fal-get-model-schema`

Get the OpenAPI schema for a specific model to understand its input/output parameters.

**Parameters:**

- `modelId` (string, required): Model identifier (e.g., "fal-ai/flux-pro")

**Example:**

```json
{
    "modelId": "fal-ai/flux-pro"
}
```

### ⚔ Execution Tools

#### `fal-run-sync`

Run a model synchronously (blocks until completion). Best for fast models.

**Parameters:**

- `modelId` (string, required): Model identifier
- `input` (object, required): Model-specific input parameters

**Example:**

```json
{
    "modelId": "fal-ai/flux-pro",
    "input": {
        "prompt": "A serene sunset over mountains",
        "image_size": "landscape_16_9"
    }
}
```

#### `fal-enqueue`

Queue a model execution asynchronously. Returns a request ID for status tracking.

**Parameters:**

- `modelId` (string, required): Model identifier
- `input` (object, required): Model-specific input parameters

**Returns:** `{ request_id: string }`

### šŸ“Š Status & Result Tools

#### `fal-get-status`

Check the status of an asynchronous job.

**Parameters:**

- `requestId` (string, required): Request ID from fal-enqueue
- `modelId` (string, required): Model identifier

**Returns:** Status object with state (IN_QUEUE, IN_PROGRESS, COMPLETED, FAILED)

#### `fal-get-result`

Retrieve the result of a completed asynchronous job.

**Parameters:**

- `requestId` (string, required): Request ID from fal-enqueue
- `modelId` (string, required): Model identifier

**Returns:** Model output (automatically downloads and embeds images as base64)

### šŸ›‘ Control Tools

#### `fal-cancel`

Cancel a running or queued asynchronous job.

**Parameters:**

- `requestId` (string, required): Request ID from fal-enqueue
- `modelId` (string, required): Model identifier

---

## Available Resources

The MCP server provides the following resources:

### `config://fal`

Configuration information about the current fal.ai connection.

### `docs://fal/usage`

Usage guide showing the typical workflow for generating images and running models.

### `docs://fal/tools-reference`

Quick reference documentation for all available tools.

### `fal-model://{modelId}/schema`

Dynamic resource that returns the OpenAPI schema for any model.

**Example:** `fal-model://fal-ai/flux-pro/schema`

---

## Available Prompts

### `review-fal-prompt`

A prompt template that helps improve image generation prompts for better fal.ai results.

**Parameters:**

- `prompt` (string): Your original image prompt

**Usage:** The agent can use this prompt to enhance your image generation requests.

---

## Developer Examples

The package includes several example scripts for testing and development:

### List Models Example

```bash
cd packages/mcp-fal-ai
npm run build
FAL_API_KEY=YOUR_KEY npm run example:list-models
```

This example demonstrates:

- Listing available models with pagination
- Searching for models by keyword
- Displaying model information

### Generate Image Example

```bash
FAL_API_KEY=YOUR_KEY npm run example:generate-nano-banana
```

This example shows:

- Enqueueing an image generation job
- Polling for job status with progress updates
- Retrieving the final result

### Get Model Schema Example

```bash
FAL_API_KEY=YOUR_KEY npm run example:get-model-schema
```

This example demonstrates:

- Fetching model schemas
- Understanding input/output parameters

---

## Implementation Status

āœ… **Core Functionality Complete**

- āœ… 8 MCP Tools (discovery, execution, status, control)
- āœ… 4 MCP Resources (config, documentation, model schemas)
- āœ… 1 MCP Prompt (prompt enhancement)
- āœ… Dual transport support (stdio & SSE)
- āœ… TypeScript with strict type safety
- āœ… Zod-based validation
- āœ… Custom error handling
- āœ… HTTP client (no SDK dependency)

🚧 **Potential Future Enhancements**

- [ ] File upload tool (`fal-upload-file`)
- [ ] Convenience tool with auto-polling (`fal-enqueue-and-wait`)
- [ ] Rate limit handling with exponential backoff
- [ ] Request logging with secret redaction
- [ ] Comprehensive test suite

---

## Project Structure

```
packages/mcp-fal-ai/
ā”œā”€ā”€ README.md                    # This file
ā”œā”€ā”€ package.json                 # NPM package configuration
ā”œā”€ā”€ tsconfig.json                # TypeScript configuration
ā”œā”€ā”€ src/
│   ā”œā”€ā”€ index.ts                 # CLI entry point
│   ā”œā”€ā”€ server/
│   │   └── index.ts             # MCP server (stdio/SSE)
│   ā”œā”€ā”€ config/
│   │   └── env.ts               # Environment validation (Zod)
│   ā”œā”€ā”€ services/
│   │   └── fal-client.ts        # HTTP client for fal.ai API
│   ā”œā”€ā”€ tools/
│   │   └── index.ts             # MCP tool implementations
│   ā”œā”€ā”€ resources/
│   │   └── index.ts             # MCP resource implementations
│   ā”œā”€ā”€ prompts/
│   │   └── index.ts             # MCP prompt implementations
│   ā”œā”€ā”€ types/
│   │   └── model.ts             # Type definitions
│   ā”œā”€ā”€ errors/
│   │   ā”œā”€ā”€ api-errors.ts        # HTTP error classes
│   │   └── environment-validation-error.ts
│   └── utils/                   # Utility functions
ā”œā”€ā”€ dist/                        # Compiled output (generated)
└── examples/                    # Example scripts
```

---

## Architecture Overview

### Execution Flow

```
AI Agent (Cursor, Claude, ChatGPT, etc.)
    ↓
MCP Server (stdio or SSE transport)
    ā”œā”€ 8 Tools (discovery, execution, status, control)
    ā”œā”€ 4 Resources (config, docs, schemas)
    └─ 1 Prompt (enhancement)
    ↓
FalClient (HTTP wrapper)
    ā”œā”€ Authentication (Key header)
    ā”œā”€ Request/Response handling
    └─ Error mapping
    ↓
fal.ai API
    ā”œā”€ https://fal.ai/api (models catalog)
    ā”œā”€ https://fal.run (sync execution)
    └─ https://queue.fal.run (async execution)
```

### Execution Modes

**Synchronous Mode** (`fal-run-sync`)

- Direct execution via `https://fal.run`
- Blocks until model completes
- Best for fast models (<30 seconds)
- Returns result immediately

**Asynchronous Mode** (`fal-enqueue` → `fal-get-status` → `fal-get-result`)

- Queue-based execution via `https://queue.fal.run`
- Returns request ID immediately
- Poll status until completion
- Best for long-running models

---

## Technical Details

### Type Safety

- āœ… Strict TypeScript mode enabled (`strict: true`)
- āœ… No `any` types (use `unknown` when type is uncertain)
- āœ… Explicit type annotations on all functions
- āœ… Zod schemas for runtime validation
- āœ… One type per file convention

### Error Handling

Custom error classes for different HTTP status codes:

```typescript
401 → UnauthorizedError     // Invalid API key
403 → ForbiddenError         // Access denied
404 → NotFoundError          // Model/endpoint not found
429 → RateLimitError         // Too many requests
5xx → ServerError            // fal.ai server error
4xx → ApiError               // Other client errors
```

### Environment Variables

Required:

- `FAL_API_KEY`: Your fal.ai API key

Optional:

- `RUN_SSE`: Enable SSE transport (default: `false`)
- `PORT`: SSE server port (default: `3001`)

---

## Dependencies

### Production

| Package                     | Purpose                    |
| --------------------------- | -------------------------- |
| `@modelcontextprotocol/sdk` | MCP server/client SDK      |
| `zod`                       | Runtime schema validation  |
| `zod-to-json-schema`        | Convert Zod to JSON Schema |
| `yargs`                     | CLI argument parsing       |
| `undici`                    | Fast HTTP client           |
| `express`                   | SSE server (when enabled)  |

### Development

| Package       | Purpose                       |
| ------------- | ----------------------------- |
| `typescript`  | TypeScript compiler           |
| `@types/node` | Node.js type definitions      |
| `shx`         | Cross-platform shell commands |

---

## Troubleshooting

### MCP Server Not Connecting

1. **Check API Key**: Ensure `FAL_API_KEY` is set correctly
2. **Restart Agent**: Restart your AI agent after configuration changes
3. **Check Logs**: Look for error messages in your agent's console
4. **Test Manually**: Run `FAL_API_KEY=xxx npx @monsoft/mcp-fal-ai` to test

### Tool Calls Failing

1. **Invalid Model ID**: Ensure model ID is correct (e.g., `fal-ai/flux-pro`)
2. **Invalid Input**: Check model schema with `fal-get-model-schema`
3. **API Key Issues**: Verify your API key has sufficient permissions
4. **Rate Limits**: You may be hitting fal.ai rate limits

### Common Issues

**Issue**: `Environment validation failed: FAL_API_KEY is required`
**Solution**: Set the `FAL_API_KEY` environment variable

**Issue**: `UnauthorizedError` when calling tools
**Solution**: Your API key may be invalid or expired

**Issue**: Tools not appearing in agent
**Solution**: Check MCP server configuration and restart agent

---

## Contributing

Contributions are welcome! Please follow these guidelines:

1. **Code Style**: Follow TypeScript best practices (see `typescript.rules`)
2. **MCP Patterns**: Follow MCP conventions (see `model-context-protocol.rules`)
3. **Type Safety**: Use strict TypeScript, avoid `any`
4. **Documentation**: Add JSDoc comments to public APIs
5. **Testing**: Test changes with example scripts
6. **Commits**: Use clear, descriptive commit messages

### Development Setup

```bash
git clone https://github.com/Monsoft-Solutions/model-context-protocols.git
cd model-context-protocols/packages/mcp-fal-ai
npm install
npm run build
```

### Running Examples

```bash
FAL_API_KEY=xxx npm run example:list-models
FAL_API_KEY=xxx npm run example:generate-nano-banana
FAL_API_KEY=xxx npm run example:get-model-schema
```

---

## Links & Resources

- šŸ“¦ [NPM Package](https://www.npmjs.com/package/@monsoft/mcp-fal-ai)
- šŸ™ [GitHub Repository](https://github.com/Monsoft-Solutions/model-context-protocols)
- šŸ”§ [fal.ai Documentation](https://docs.fal.ai)
- šŸŽØ [fal.ai Model Catalog](https://fal.ai/models)
- šŸ“– [MCP Specification](https://modelcontextprotocol.io)
- šŸ”‘ [fal.ai Dashboard](https://fal.ai/dashboard)

---

## License

MIT License - see LICENSE file for details

---

## Support

- šŸ› **Issues**: [GitHub Issues](https://github.com/Monsoft-Solutions/model-context-protocols/issues)
- šŸ’¬ **Discussions**: [GitHub Discussions](https://github.com/Monsoft-Solutions/model-context-protocols/discussions)
- šŸ“§ **Contact**: support@monsoftsolutions.com

---

**Package Version:** 0.1.0  
**Last Updated:** October 17, 2025  
**Status:** Production Ready āœ…

TDQS

B3.3/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a distinct purpose (cancel, enqueue, schema, result, status, list, run sync, search) with clear descriptions that differentiate async and sync operations.

Naming Consistency5/5

All tools follow a consistent 'fal-verb' pattern with hyphens, e.g., fal-list-models, fal-run-sync, making it predictable.

Tool Count5/5

8 tools is well-scoped for a model inference server, covering essential operations without unnecessary bloat or deficiency.

Completeness5/5

The tool surface covers the full lifecycle: discover models (list/search), get schema, run (sync/async), check status, get result, and cancel, leaving no obvious gaps.

Maintenance

ActivityInactive
ResponsivenessNo issues