# ChatGPT / OpenAI MCP compatibility

Framehood works as a remote [MCP](/guide/mcp) server for any MCP-aware client,
including ChatGPT (Developer Mode / connectors) and other OpenAI Apps SDK
surfaces. ChatGPT's MCP client has a few constraints that differ from Claude's —
this page is a compatibility matrix so you know what to expect and how to work
around it. None of it requires special configuration; it's the same
`https://mcp.framehood.ai/mcp` endpoint and the same [tools](/reference/tools).

## Compatibility matrix

| Area | ChatGPT behavior | What to do |
|------|-------------------|-------------|
| **File parameters** | Attaching a file in the chat does **not** populate a tool's media field: ChatGPT only forwards an attachment to a param declared via OpenAI's `openai/fileParams` metadata, which Framehood's tools don't use (their media fields are plain strings). A known ChatGPT mobile-app bug can also send a bare string where a file-reference object is expected. | Give the tool a **URL, library `asset_id`, or data-URI string** instead of a chat attachment — the same as any other MCP client. To bring a file in, use `files(import_remote)` / `files(upload)` first, then pass the returned URL/`asset_id`. See [How to pass files from ChatGPT](#how-to-pass-files-from-chatgpt) below. |
| **Inline media preview** | ChatGPT does not reliably render an inline image/video preview from a URL inside a tool result. | Expect a clickable link in the response, not an inline thumbnail — open it to view the result. |
| **Long-running jobs** | ChatGPT does not hold open a long synchronous wait for slow generations (video, upscaling, training). | Submit the job, then poll `get_status(job_id=…)` until it reaches `succeeded`/`failed`. Submit → poll is the standard pattern for every client, but treat it as required (not optional) on ChatGPT. |
| **Notifications** | MCP notification support is limited on ChatGPT — don't expect a push update when a job finishes. | Poll `get_status` instead of waiting for a notification. |
| **Tool-invocation status** | On long-running tools (`image`/`video`/`audio`/`qa`), ChatGPT shows the short status text Framehood attaches while the call runs and once it returns (e.g. "Generating video…", then a submitted/queued note — remember async jobs return a `job_id` to poll, they aren't finished when the call returns). | Informational only — nothing to configure; other clients ignore this text. |

## How to pass files from ChatGPT

Framehood's media tools (`image`, `video`, `audio`, `qa`) accept a file as a URL,
a library `asset_id`, or a data-URI — see [what you can pass as a media
reference](/reference/tools#mcp-tools).

**Attaching a file in the ChatGPT conversation does not hand it to a Framehood
tool.** ChatGPT only forwards an attachment to a tool that declares it via
OpenAI's `openai/fileParams` metadata, which these tools do not — the media
fields (`image_url`, `video_url`, …) are plain string parameters. So a chat
attachment won't populate `image_url`, and asking ChatGPT to "use the file I
attached" will fail or send a wrong-shaped value.

Instead, give the tool a **URL or `asset_id`** (works from every client,
ChatGPT included):

- Already have a public URL? Pass it straight into the field (`image_url`,
  `video_url`, `audio_url`, or a string element of an array field like
  `reference_images` / `tracks` / `elements.*`).
- Have a file only in ChatGPT / on disk? Bring it into Framehood first —
  `files(import_remote, url=…)` to pull a hosted URL, or `files(upload, data=…)`
  with a base64/data-URI — then pass the returned URL or `asset_id`. Existing
  library assets already have an `asset_id` you can reuse.

(If you do see an unexpected bare string arrive in a file field, that's the
ChatGPT mobile-app file-reference bug noted above — pass a URL/`asset_id`
explicitly rather than an attachment.)

## Good to know

- Credits, pricing, and the model catalog behave identically from ChatGPT — see
  [Credits & plans](/guide/billing). Framehood never exposes provider names or
  upstream costs on any surface, ChatGPT included.
- Everything above is about the **MCP transport and client behavior**, not
  Framehood-specific limits — the same `image`/`video`/`audio`/`qa` toolset,
  actions, and parameters documented in the [tools reference](/reference/tools)
  apply unchanged.
- For the endpoint and general client setup, see the [MCP server](/guide/mcp)
  guide. **Auth is OAuth 2.1 only** on ChatGPT — the connector signs in through
  the OAuth flow and sends the access token it receives; ChatGPT can't present a
  Framehood API key (Bearer), so the API-key option in the MCP guide doesn't
  apply here.
