Skip to content

MCP (Model Context Protocol) ​

MCP is the open standard that lets an AI assistant call someone else's tools. FOTOhub runs an MCP server, so any MCP-capable client can generate and edit images, video, speech, music and 3D on our own GPUs — and be told exactly what each call cost.

FOTOhub is listed in the official MCP registry as app.fotohub/fotohub.

Pick your client ​

ClientHow you connectGuide
ChatGPTPublished in the app directory — search for FOTOhub and enable itFOTOhub in ChatGPT
Claude (web, Desktop, Code)Add a custom connector pointing at the server URL, then sign inFOTOhub in Claude
Cursor, VS Code, Windsurf, other IDEsConfig file with the server URL and an API keyIDE setup
Your own clientStreamable HTTP or local stdioProtocol reference

The server ​

https://apis.fotohub.app/mcp/     primary
https://mcp.fotohub.app/          dedicated hostname, same service

GET https://apis.fotohub.app/mcp/health is public and returns the live tool count — treat it as authoritative over any number written in these docs.

Transports: Streamable HTTP for remote clients, stdio for a local process.

Two ways to authenticate, and they bill differently ​

This is the single most important thing on this page.

CredentialHow you get itWhat it spends
OAuth 2.1 sign-inEnabling the ChatGPT app, or adding the Claude connector — the client registers itselfSubscription credits first, then the prepaid USD wallet. One call can be split across both.
fh_live_* API keyConsole → Keys, passed as Authorization: BearerThe prepaid USD wallet only.

The OAuth path needs no pre-registration: the server supports dynamic client registration, PKCE (S256) and refresh tokens. Discovery lives at /.well-known/oauth-authorization-server, with scopes mcp:read, mcp:write, mcp:image, mcp:video, mcp:audio, mcp:chat, mcp:training and mcp:billing.

Inline results, where the host supports them ​

The server publishes three UI resources — a gallery for anything that returns pictures, a player for video and audio, and a price table for model comparisons — so results render as components instead of link lists. Hosts that implement the MCP Apps UI extension draw them; every other client gets the text block, which is always sent alongside. Nothing is lost either way.

Skills ship with the server ​

Four workflow skills (fotohub-generation-basics, fotohub-product-photography, fotohub-short-video-ad, fotohub-brand-kit) are served directly by the server over the MCP skills extension. A client that supports it imports them on connect, which is what makes an assistant run the cut-out → background → shadow order correctly instead of guessing.

Quick start with an API key ​

If you are wiring up an IDE or your own client rather than ChatGPT or Claude, the shape is the same everywhere: the URL plus a Bearer token.

json
{
  "mcpServers": {
    "fotohub": {
      "url": "https://apis.fotohub.app/mcp/",
      "headers": { "Authorization": "Bearer fh_live_YOUR_API_KEY" }
    }
  }
}

VS Code's .vscode/mcp.json uses servers with "type": "http" instead of mcpServers. Per-IDE files are in the IDE setup guide.

Available tools (57) ​

The live count is served by GET https://apis.fotohub.app/mcp/health, which reads the registry rather than a constant — treat it as authoritative over this page.

The tool registry defines 60 tools. Three are gated off in production because the service behind them is not deployed, and a registered tool that 403s is worse than an absent one: generate_shorts (needs SHORTS_ENGINE_URL) and the two training tools create_training_job / get_training_status (need TRAINING_ENGINE_URL). That leaves the 57 below.

Two of those 57 are registered but inert: voice_clone and separate_stems appear in tools/list and answer successfully, but their implementations return a short "not yet available via MCP" message and never call a backend. They are marked ⚠️ in the tables. So 55 tools actually do work. Both capabilities exist in the FOTOhub dashboard; neither has a billed public endpoint behind it yet.

Image (8) ​

ToolDescription
generate_imageGenerate an image from a text prompt
edit_imageEdit an image (inpaint, background swap, outpaint)
upscale_imageAI super-resolution
remove_backgroundRemove the background from an image
enhance_promptRewrite an image prompt for better results
analyze_imageTags, colours, NSFW detection, OCR
style_transferApply an artistic style to an image
inpaint_imageRemove or replace objects in an image

Editing — image and video post-production (11) ​

ToolDescription
replace_backgroundSwap an image background
blur_backgroundDepth-aware background blur
add_shadowComposite a natural shadow
enhance_imageGeneral quality enhancement
denoise_imageNoise reduction
restore_facesFace restoration
depth_mapProduce a depth map
upscale_videoVideo super-resolution
transcode_videoRe-encode to another format or codec
add_watermarkOverlay a watermark
change_video_speedRetime a video

Video (6) ​

ToolDescription
generate_videoGenerate video from text (async — returns job_id)
image_to_videoAnimate a still image
extend_videoExtend an existing video
generate_storyMulti-scene film with voiceover
get_job_statusPoll any async job
add_subtitlesBurn subtitles into a video

Audio (6) ​

ToolDescription
text_to_speechSpeech synthesis, multiple voices and languages
generate_musicMusic from a description (async)
generate_sfxSound effects
transcribe_audioSpeech to text
voice_clone ⚠️Registered but disabled — returns a message pointing at the dashboard. It calls no backend.
separate_stems ⚠️Registered but disabled — returns a message pointing at the dashboard. It calls no backend.

3D (4) ​

ToolDescription
generate_3d_from_textText to 3D mesh
generate_3d_from_imageImage to 3D mesh
list_3d_modelsAvailable 3D engines, with prices and availability
get_3d_resultFetch a finished 3D job

Studio — UGC ads (6) ​

ToolDescription
create_ugc_projectStart a UGC ad project
list_ugc_projectsList your projects
estimate_ugc_costPrice a render before running it
set_ugc_blueprintSet the project blueprint
render_ugc_videoRender the ad
get_ugc_jobPoll a render

Chat (3) ​

ToolDescription
chat_completionLLM chat
translate_textTranslate between languages
gabriel_routeIntent classification — suggests the best action for a prompt

Pricing (3) ​

ToolDescription
get_priceThe rate for one model
estimate_costCost of a specific run before you make it
compare_pricesCompare models for the same job

Storage (4) ​

ToolDescription
list_bucketsYour buckets
list_filesFiles in a bucket
save_to_storageCopy a generated file into your own bucket before its link expires
get_download_linkFresh signed link for a stored file

Account (6) ​

ToolDescription
check_balancePrepaid USD wallet balance
list_modelsFull model catalogue with pricing
list_generationsGeneration history
get_usage_summaryUsage roll-up
get_transactionsWallet transactions
search_photosSemantic search over your library

Async Operations ​

Video generation, music creation, and training are asynchronous. They return a job_id — use get_job_status to poll for completion:

1. generate_video(prompt="A sunset over mountains") → job_id: "vid_abc123"
2. get_job_status(job_id="vid_abc123") → {status: "processing", progress: 45}
3. get_job_status(job_id="vid_abc123") → {status: "completed", video_url: "https://..."}

Resources ​

The server also exposes MCP resources for browsing:

URIDescription
fotohub://models/imageAvailable image generation models
fotohub://models/videoAvailable video generation models
fotohub://models/audioAvailable audio/music models
fotohub://pricingCurrent pricing table
fotohub://balanceYour prepaid USD wallet balance

Prompts ​

Pre-built prompt templates for common workflows:

PromptDescription
creative_briefGenerate a creative brief for a project
video_directorPlan a multi-scene video production
product_photoGenerate product photography

Protocol Details ​

  • Protocol version: 2025-03-26
  • Transport: Streamable HTTP (JSON-RPC 2.0 over POST, optional SSE)
  • Server endpoint: https://apis.fotohub.app/mcp/
  • Health check: GET https://apis.fotohub.app/mcp/health

Billing ​

What a call settles against depends on how you connected — see the two credentials above. An OAuth sign-in spends subscription credits first and falls through to the prepaid USD wallet; a raw fh_live_* key spends the wallet only. A single call can be split across both.

Every tool result states what was actually charged and what is left. Use that figure rather than an estimate.

Quoting is free. get_price, estimate_cost and compare_prices take nothing from your account, so price a video before you render one. check_balance reports what you have.

When both credits and wallet are exhausted the call fails with insufficient_funds before any GPU work starts, so an underfunded account costs you nothing but the round trip. Top up at fotohub.app/console.

Next ​

FOTOhub in ChatGPT · FOTOhub in Claude · IDE setup · Protocol reference