Large Language ModelsGenerate imagesGenerate videos

ChatGPT MCP Connector: How to Add a Custom MCP Server

A hands on tutorial for adding a custom MCP server to ChatGPT. Switch on developer mode, fill in the connector form, choose OAuth or no authentication, test the server with a tunnel, fix the common errors, and add image and video tools.

ChatGPT MCP Connector: How to Add a Custom MCP Server
Cristian Da Conceicao
Founder of Picasso IA

You have a server that does something useful, and you want ChatGPT to call it from an ordinary chat. The door exists, and it is a single form. The catch is that the form hides four or five traps that make a perfectly healthy server look broken. This tutorial runs the whole path, from switching on developer mode to approving the first tool call, and it flags each trap before you step on it. You will build a tiny test server, expose it with a tunnel, fix the errors people hit most, and then see how image and video tools from PicassoIA can plug into the same connector.

Yellow fiber optic cable plugged into a network switch

What a Custom MCP Connector Is

MCP in Plain Words

The Model Context Protocol (MCP) is an open standard that lets an AI client call tools on a server. The server publishes a list of tools. Each tool has a name, a plain-English description and a JSON schema for its inputs. The client reads that list, decides when a tool helps, and sends a structured request. The server answers with data or performs an action.

In ChatGPT, a custom MCP connector is the settings entry that points ChatGPT at one of those servers. Once it is saved, your tools appear in chats next to the built-in ones.

Why Add Your Own Server

Built-in connectors handle popular apps. Your own server handles everything else:

  • Private data: tickets, orders, inventory, a database nobody else can see.
  • Actions: create a draft, start a render, post a status update.
  • One codebase, many clients: the same server can usually be added to other MCP clients too.
  • Logic in code, not prompts: validation, rate limits and permissions live where they belong.

💡 Remote only. ChatGPT talks to remote MCP servers. A server that runs as a local process over stdio, the way many desktop tools do, has to be wrapped in an HTTP endpoint before ChatGPT can reach it.

Before You Touch ChatGPT

Plan and Workspace Requirements

Developer mode began as a beta for Plus and Pro accounts on the web. Workspace plans such as Business, Enterprise and Edu reach it through an admin-controlled permission instead of a personal toggle. OpenAI has adjusted which plans get write actions, and has moved the switch between menus more than once, so treat any plan list (including this one) as a moving target. If your screen differs from the steps below, check OpenAI's current help article on developer mode.

In a workspace, the permission usually sits in the permissions and roles area of workspace settings. If the switch is missing for you, ask an admin before blaming your server.

Your Server Needs a Public URL

ChatGPT connects from OpenAI's infrastructure, not from your laptop. That has three consequences:

  1. The URL must be reachable from the public internet.
  2. It must use HTTPS.
  3. Servers behind a VPN or a private network will not connect.

ChatGPT accepts two remote transports:

TransportWorks with ChatGPTTypical URLNotes
Streamable HTTPYeshttps://your-domain.com/mcpBest choice for a new server
SSE (Server-Sent Events)Yeshttps://your-domain.com/sseOlder style, still accepted
stdio (local process)NononeWrap it in an HTTP server first

Low angle view down a data center aisle between server racks

Turn On Developer Mode

Custom connectors sit behind a switch, because a custom server can read and change real data. Here is the path:

  1. Click your profile icon in the bottom-left corner and open Settings.
  2. Open Connectors. Newer builds label this page Apps & Connectors.
  3. Find the Developer mode switch near the bottom of the page and turn it on. On some accounts it sits under Security instead.
  4. Accept the warning. It appears because a server you add can act on your behalf.

Once the switch is on, a Create button appears on the connectors page.

💡 Can't find the switch? The setting has moved during 2026. Search the settings window for the word "developer" before you decide your plan lacks it.

Woman working on a laptop at a cafe table with a settings screen

Add the Connector Step by Step

Fill In the Form

Click Create and fill in these fields:

FieldWhat to enterTip
NameA short label such as "Order Lookup"This is what you pick in the chat menu
DescriptionOne or two sentences about what the server doesThe model reads it when deciding whether to call a tool, so write it like an instruction
IconOptionalHelps you spot it in a long list
MCP server URLThe full HTTPS URL including the path, such as https://api.example.com/mcpA missing path is a very common cause of failure
AuthenticationNo authentication or OAuthDetails in the next section

Tick the checkbox confirming that you trust the application, then click Create.

Top-down view of a desk with a notebook diagram, laptop and coffee

Pick No Authentication or OAuth

OptionUse it whenRisk
No authenticationPublic, read-only data, or a throwaway test serverAnyone who finds the URL can call your tools
OAuthAnything tied to a user account, private data or write actionsYou must run or connect an OAuth provider

With OAuth, ChatGPT sends you to your identity provider's login page right after you click Create. Sign in, click allow, and you land back in ChatGPT with the connector authorized.

Whichever provider you use, ask for the narrowest permissions your tools need. A connector that only reads orders should never hold permission to refund them, because the permissions you grant are the ceiling on the damage a bad tool call can do.

Start with no authentication on a test server that returns harmless data. Move to OAuth before the server touches anything real.

Hardware security token plugged into a laptop USB port

Use It in a Chat

  1. Start a new chat and click the plus icon.
  2. Choose More, then Developer mode.
  3. Select your connector as a source.
  4. Ask for something the server can do, such as "list my open orders".
  5. ChatGPT proposes a tool call and shows the arguments.
  6. Read them, then click Confirm.

For the first few tests, name the connector in your prompt: "Using Order Lookup, list my open orders." Naming it removes one variable. Once the tool works, drop the name and see whether ChatGPT picks it on its own, which tells you whether your description is doing its job.

💡 Read the confirmation card. In developer mode every tool call is shown to you before it runs. That card is your last checkpoint, so skim the arguments instead of clicking through.

Build a Tiny Server to Test

Close-up of hands typing on a mechanical board in a home office

Run It Locally

A harmless tool is the fastest way to prove the connection works before you point ChatGPT at real data. This one counts words, using the official Python SDK:

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("hello-connector", stateless_http=True)

@mcp.tool()
def word_count(text: str) -> int:
    """Count the words in a block of text.
    Use when the user asks how long a draft is."""
    return len(text.split())

if __name__ == "__main__":
    mcp.run(transport="streamable-http")

Four habits make a tool easy for a model to use:

  • One job per tool. lookup_order and refund_order beat a single manage_order.
  • Plain names. Verbs and nouns the model can match to a request.
  • Typed arguments. Strings, numbers and enums in the schema, never one free-form blob.
  • Short outputs. Return the fields that answer the question, not the whole database row.

Install the SDK with pip install "mcp[cli]" and run the file. With the SDK defaults at the time of writing, the endpoint is http://127.0.0.1:8000/mcp. If your version uses another port or path, its docs will say so.

Before ChatGPT ever sees the server, point the MCP Inspector at it:

npx @modelcontextprotocol/inspector

Choose the Streamable HTTP transport, paste the local URL, connect, and list the tools. If word_count shows up and runs, the server is healthy and any later failure belongs to the network or the form.

Expose It With a Tunnel

A tunnel gives your local port a public HTTPS address:

ngrok http 8000

Cloudflare's cloudflared tunnel --url http://localhost:8000 does the same job. Copy the HTTPS address it prints, add /mcp, and paste that into the MCP server URL field.

💡 Free tunnel URLs rotate. Restart the tunnel and the address changes, which breaks the connector. Re-create it with the new URL, or move to a stable domain once the test works.

Fix the Errors That Block You

Common Errors and Fixes

SymptomLikely causeFix
Connector fails to createURL is HTTP, local, or behind a VPNUse a public HTTPS address or a tunnel
Not found on connectWrong or missing path (/, /mcp, /sse)Open the exact URL in the Inspector first
Connects but shows zero toolsThe tool list request errors outRead your server logs for the list request
OAuth login loopsRedirect address not allowed by the providerAdd the callback address your provider's setup page asks for
Tools never get calledDescriptions are vagueSay when to use each tool, and when not to
Worked yesterday, fails todayTunnel address rotatedRe-create the connector with the new URL

Debug in this order, and stop at the first step that fails. First, open the Inspector and connect to the exact URL. Second, request that URL from a terminal with curl and confirm it answers over HTTPS. Third, read your server logs while you click Create. Only then suspect ChatGPT or the form. Working from the server outward saves you from tweaking settings that were never broken.

Developer leaning back in a chair, frustrated at a laptop

When Tools Look Stale

You changed the tool list, but ChatGPT still shows the old one. Open the connector's settings and use the refresh option. If that does nothing, delete the connector and add it again, which forces a fresh read of the server.

One more detail worth knowing: OpenAI's documentation describes a search tool that returns candidate results and a fetch tool that returns one document by ID for features such as deep research. A server with only custom tools can work in developer mode yet stay invisible to those features.

Keep It Safe in Production

Prompt Injection and Write Actions

Text your server returns becomes text the model reads. A support ticket, a web page or a shared document can carry hidden instructions meant to steer the model into calling a tool you never intended. OpenAI's own warning is blunt: watch for prompt injection and review every tool call, especially write actions.

Build with that in mind:

  • Separate read tools from write tools. Keep write tools narrow and few.
  • Require an explicit ID for anything destructive, never a vague search string.
  • Add a confirmation argument to deletes and payments.
  • Keep secrets out of tool output. If the model sees a token, assume it can repeat it.
  • Log every call with arguments, user and result, so you can trace a bad action.
  • Rate limit the server, because a looping model can call a tool far faster than a person.

Security engineer reviewing printed access logs in a meeting room

Add Image and Video Tools

Wrap PicassoIA Models in Tools

The most satisfying connectors produce something you can see. PicassoIA offers a developer API at https://api.picassoia.com/v1, authenticated with a bearer token that starts with pia_sk_. The endpoints follow the Replicate style: a POST to /v1/models/{owner}/{name}/predictions starts a job, and a GET on /v1/predictions/{id} polls it. Four models are available through the API and MCP:

Jobs are asynchronous, so build two tools instead of one: a starter that returns a prediction ID, and a checker that returns the output once the job finishes. ChatGPT can call the checker until the result is ready.

import os
import httpx

PIA = "https://api.picassoia.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PICASSOIA_TOKEN']}"}

@mcp.tool()
def start_image(prompt: str) -> dict:
    """Start an image job. Returns an id to pass to get_result."""
    r = httpx.post(
        f"{PIA}/models/picassoia/picassoia-image/predictions",
        headers=HEADERS, json={"input": {"prompt": prompt}}, timeout=30,
    )
    r.raise_for_status()
    return {"id": r.json()["id"]}

@mcp.tool()
def get_result(prediction_id: str) -> dict:
    """Check a job. Returns status and, when finished, the output."""
    r = httpx.get(f"{PIA}/predictions/{prediction_id}", headers=HEADERS, timeout=30)
    r.raise_for_status()
    data = r.json()
    return {"status": data.get("status"), "output": data.get("output")}

Treat this as a sketch. The request body follows the Replicate convention, so confirm the exact input fields on the model page before you ship it.

Some limits shape the design. An account runs at most 5 predictions at once, and that count is shared across tokens and MCP connections. Prompts top out at 4,000 characters, and a single request body at 10 MB. Access terms and pricing live on the PicassoIA pricing page, so read them before promising anyone a free tier.

💡 Prefer not to host anything? PicassoIA also offers hosted MCP connections, managed at picassoia.com/en/mcp/accounts after you sign in. Check which clients a connection supports before you rely on it in ChatGPT.

Use GPT 5.6 Sol on PicassoIA

Tool descriptions matter more than the code behind them, because the model picks tools by reading them. An LLM can sharpen yours in a few minutes:

  1. Open the GPT 5.6 Sol page on PicassoIA.
  2. Paste your tool names, descriptions and input schemas as JSON, so nothing gets lost.
  3. Ask: "Rewrite each description so a model knows exactly when to call this tool and when not to."
  4. Ask for ten test prompts: five that should trigger the tool and five that should not.
  5. Run all ten in your connector chat. Note every miss, adjust the description, and repeat.

For a second opinion on wording, paste the same material into Claude Sonnet 5 and compare the two rewrites. Keep whichever description is shorter and more specific.

Photographer arranging printed landscape photos in a bright studio

Your Next Experiment

Build the word counter first and watch that first tool call appear in a chat. Then give the connector something to show. Add the image starter, ask ChatGPT for a photo of an ordinary scene, and change one detail per request: the lens, the light, the time of day. Small edits teach you more about prompts than any long description does.

When you want finished pictures without writing a server, open PicassoIA and try creating your own images with PicassoIA Image, refine them with PicassoIA Image Editor Pro, and bring a favorite to life with PicassoIA Video. Pick one prompt, run it three ways, and keep the version that makes you look twice.

Share this article