Cookies keep FreeInd working. Optional analytics require your permission; ads for free accounts are served by Google, which shows its own consent message where required. Read our cookie policy.
Give your agent the same image, video, audio, and tool pipeline as the dashboard. One remote MCP endpoint, authenticated with your own FreeInd API key.
Endpoint
https://free.ind.in/mcp/generation — Streamable HTTP transport, bearer auth, per-caller sessions. Nothing to install for clients that support remote MCP.
MCP (Model Context Protocol) is the integration standard used by Claude, Cursor, VS Code, OpenCode, and other agents. Instead of writing glue code, your agent discovers the tools below and calls them directly. The server is a thin client over the public REST API, so every tool obeys the same scopes, credits, plan limits, and rate limits as a raw API call.
Typical flows an agent can complete end to end:
Authenticate with a FreeInd API key, exactly like the REST API. The key is passed through to the API on every call, so the agent can only do what the key allows.
Authorization: Bearer fi_live_...
# Generate at https://free.ind.in/dashboard/api-keys
# Recommended scopes: generations.read, generations.write, assets.read, usage.read, wallet.read
# Add workflows.read + workflows.write for list_workflows / run_workflow.Generation tools also need workspaceId and userId so the server can verify the caller is an active member of that workspace before spending credits. Find both under Dashboard → Settings, or call GET /v1/me while signed in to copy your user id.
Key handling
The endpoint does not persist your key: it opens one in-memory session per connection and forwards the bearer token. Revoke the key in the dashboard to cut the agent off immediately.
claude mcp add --transport http freeind https://free.ind.in/mcp/generation \
--header "Authorization: Bearer fi_live_..."Claude Desktop does not speak remote HTTP directly; bridge it with mcp-remote. Add this to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows), then restart the app.
{
"mcpServers": {
"freeind": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://free.ind.in/mcp/generation",
"--header",
"Authorization: Bearer fi_live_..."
]
}
}
}{
"mcpServers": {
"freeind": {
"url": "https://free.ind.in/mcp/generation",
"headers": {
"Authorization": "Bearer fi_live_..."
}
}
}
}{
"servers": {
"freeind": {
"type": "http",
"url": "https://free.ind.in/mcp/generation",
"headers": {
"Authorization": "Bearer fi_live_..."
}
}
}
}{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"freeind": {
"type": "remote",
"url": "https://free.ind.in/mcp/generation",
"headers": {
"Authorization": "Bearer fi_live_..."
},
"enabled": true
}
}
}Point the client at the URL and pass the bearer header. The transport is Streamable HTTP; the server opens a session on initialize and returns an Mcp-Session-Id header to send on follow-up requests. A minimal handshake:
curl -sS https://free.ind.in/mcp/generation \
-H "Authorization: Bearer fi_live_..." \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{
"protocolVersion":"2025-06-18",
"capabilities":{},
"clientInfo":{"name":"curl","version":"1.0"}
}}'The generation server exposes 19 tools. Every generation tool takes workspaceId and userId in addition to the arguments below.
| Tool | What it does | Key arguments |
|---|---|---|
| list_models | Models available to the workspace, with prices and parameter schemas. | workspaceId, userId |
| suggest_models | Picks 3+ models that fit a brief and explains why. | brief, workspaceId, userId |
| create_generation | Starts a generation using one of the suggested models. | modelId, params, inputs?, paymentMode? |
| get_generation | Status, timing, and error details for one generation. | generationId |
| list_generations | Recent history filtered by mode, status, or model. | filters? |
| wait_for_generation | Long-polls until the job finishes, with a timeout. | generationId, timeoutSeconds? |
| get_generation_outputs | Output assets and download URLs for a finished job. | generationId |
| cancel_generation | Cancels a queued or running generation. | generationId |
| create_generations_batch | Creates up to 25 generations in one call. | items[] |
| get_balance | Credit balance and wallet state. | workspaceId, userId |
| get_usage | Credits, spend, and generation counts for a date range. | from?, to? |
| list_workflows | free.flow pipelines and templates. | templatesOnly? |
| run_workflow | Starts a workflow run with flow-input values. | workflowId, input |
| get_workflow_run | Run status and per-step progress. | runId |
| create_slide_deck | Brief → designed deck, one image per slide. | brief, slideCount, style? |
| get_slide_deck | Deck status, slide text, asset ids, and export state. | deckId |
| create_podcast_episode | Multi-voice episode with optional music and outro. | title, speakers, segments |
| create_audiobook | Long text → one narrated audio file. | title, text, voice? |
| get_audiobook | Audiobook status, chunk progress, and output asset. | jobId |
The full input schemas are discoverable through MCP itself (tools/list) so agents fill arguments correctly without a separate spec.
The server deliberately enforces model choice: an agent must call suggest_models and let the user pick before create_generation will accept a model. This prevents surprise spending on a premium model.
User: Make a moody product shot of a black espresso machine.
Agent → suggest_models({ brief: "moody product shot, black espresso machine", workspaceId, userId })
Server → 3 models with credit prices and why each fits.
User picks "GPT Image 1".
Agent → create_generation({ modelId, params: {
mode: "text_to_image",
prompt: "black espresso machine, dark moody studio, hard rim light, steam",
aspectRatio: "4:3"
}, workspaceId, userId })
Server → { generationId, status: "queued", estimated: 40 credits }
Agent → wait_for_generation({ generationId })
Server → { status: "succeeded" }
Agent → get_generation_outputs({ generationId })
Server → image URLs the agent can show or download.The same server can run over stdio from this repository. Set a key in the environment and point your client at the built entry point:
# Run the server locally over stdio (development / self-hosting)
FREEIND_API_URL=https://free.ind.in \
FREEIND_API_KEY=fi_live_... \
node apps/mcp-generation/dist/index.cjs{
"mcpServers": {
"freeind": {
"command": "node",
"args": ["apps/mcp-generation/dist/index.cjs"],
"env": {
"FREEIND_API_URL": "https://free.ind.in",
"FREEIND_API_KEY": "fi_live_..."
}
}
}
}HTTP runs with npm --prefix apps/mcp-generation run start:http on port 4006 at /mcp.
userId is not an active member of workspaceId. Copy both from the same workspace.suggest_models and pass one of the returned ids.paymentMode: "direct" for a one-time checkout.workflows.read / workflows.write to the API key.Need raw HTTP instead? The API reference documents every endpoint the MCP tools call, plus the Postman collection.