ChatGPT App MCP tool calls blocked by OpenAI safety checks before reaching MCP server

Hi OpenAI team,

we are seeing a read-only ChatGPT App MCP tool call being blocked by OpenAI safety checks before it reaches our MCP server.

The tool output is:

This tool call was blocked by OpenAI’s safety checks. Please double check what you are sending.

The trace shows:

{
  "externalCallTimeMs": null,
  "responseMetadata": null,
  "state": null
}

Because externalCallTimeMs is null and we see no corresponding server logs, this appears to be blocked before the MCP request is sent.

Example tool call

{
  "originIds": ["FRA", "DUS"],
  "destinationIds": ["IBZ", "PMI"],
  "departureMonths": ["2026-07-01", "2026-08-01"],
  "journeyType": "ONE_WAY",
  "passengers": {
    "adults": 1,
    "adolescents": 0,
    "children": 0,
    "infants": 0
  },
  "localeId": "en_US"
}

This is a benign read-only flight search.

We also tested equivalent payloads using destinationRegionId and alias fields like originAirports, destinationAirports, and travelMonths; all were blocked in the same way.

What we checked

  • MCP endpoint authentication works.
  • The server can be reached and tool definitions load.
  • Direct calls through another MCP/client path work.
  • The backend returns valid flight offer data for these routes/months.
  • The tool does not create, update, delete, book, send, or mutate anything.
  • Tool metadata is aligned with Apps SDK guidance:
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: false
    • _meta.securitySchemes: [{ "type": "noauth" }]
    • widget resources use text/html;profile=mcp-app

Question

Could you help identify why this read-only MCP tool call is being blocked before reaching the MCP server?

Is there a way to get more specific diagnostics for the safety-block reason, or is this possibly a false positive?

Bumping this for visibility. I am seeing this as well. Many benign queries are being blocked in my app as well. All of which were previously working fine.

Getting the same issue, was working fine yesterday

same issue here and it was working fine previously

I have also seen this fail since sometime yesterday. Absolutely benign calls are getting blocked. For example, I send this to my personal MCP server for GItea to retrieve a file:

{
"repo": "mcp-diagnostic-harness",
"path": "pyproject.toml",
"ref": "main"
}

This is the reply I get:

“This tool call was blocked by OpenAI’s safety checks. Please double check what you are sending.”

Additionally, I am seeing “Error in message stream” messages appear in the middle of the model replying lately as well.

Tom

Seeing the same issue as well!

I get the same issue, which started 2 days go. I’ve tried extensive testing in the past 2 days, tried with the browser and the desktop. It is not an issue with platform - I’ve tried with a .Net api and a node.js api. Tools that do not require parameters execute successfully. But Tools that accept one or more parameters are inconsistently blocked by ChatGPT. Once a block occurs in a window, that window is effectively poisoned. The request doesn’t even hit the mcp endpoint server. It’s clearly the Chatgpt client blocking the send request.

I’m facing the same issue.

i am seeing this as well, and I’ve got both claude code and GPT working on this - what we’re finding is that files getting the block error, when retried, pass and don’t return the error

I’m seeing intermittent MCP tool-call failures in ChatGPT where benign filesystem-style connector calls are blocked by OpenAI before they reach my MCP server.

The error shown in ChatGPT is:


This tool call was blocked by OpenAI's safety checks. Please double check what you are sending.

When this happens, the MCP server receives no request and logs nothing. So the failure appears to happen in ChatGPT/OpenAI’s pre-dispatch safety layer, not in my server code.

The connector is a root-only virtual filesystem connector with tools similar to:


list_dir
read_file
read_text_range
write_file
move_path
trash_path
delete_path
search
fetch

The schema is clean and small. The root connector exposes only those tools. The same connector successfully handles normal read/write/list operations.

Repro-style observations

A benign read-only call such as:


{
  "tool": "read_file",
  "arguments": {
    "path": "/STARTUP_FILE.md"
  }
}

sometimes fails with the OpenAI safety-check message before reaching the server.

The same exact call can later succeed unchanged.

In one test sequence, the pattern looked like this:


read_file("/STARTUP_FILE.md")        -> blocked by OpenAI safety checks
read_file("/STARTUP_FILE.md")        -> blocked by OpenAI safety checks
read_text_range("/STARTUP_FILE.md")  -> blocked by OpenAI safety checks
read_file("/safe/startup.md")        -> succeeds
read_file("/STARTUP_FILE.md")        -> succeeds
read_file("/STARTUP_FILE.md")        -> succeeds
read_file("/STARTUP_FILE.md")        -> blocked again
read_file("/STARTUP_FILE.md")        -> blocked again
read_file("/safe/startup.md")        -> succeeds

The two files had the same benign content. Only the virtual path/filename differed.

In a later timed test, the same suspicious-looking path did not reproduce the block:


read_file("/STARTUP_FILE.md")                 -> succeeds
wait ~10 sec
read_file("/STARTUP_FILE.md")                 -> succeeds
wait ~30 sec
read_file("/STARTUP_FILE.md")                 -> succeeds
wait ~60 sec
read_file("/STARTUP_FILE.md")                 -> succeeds
wait ~60 sec
read_file("/STARTUP_FILE.md")                 -> succeeds
read_text_range("/STARTUP_FILE.md", 1, 12)    -> succeeds
fetch("/STARTUP_FILE.md")                     -> succeeds
list_dir("/")                                 -> succeeds
search("STARTUP_FILE.md")                     -> succeeds

This suggests the block is not deterministic by tool name, path, filename, or content alone.

Things I checked

The server-side connector returns structured error buckets for real server errors, such as:


filesystem/path error
permission/convention refusal
response/size limit
connector/server error

But the OpenAI safety-check failure does not return any connector bucket, and there is no server log entry. That strongly suggests the request is blocked before dispatch.

I also tested path/filename variants. These did not by themselves reproduce the block:


/lowercase.md
/UPPERCASE.md
/two_words.md
/two-words.md
/wake.md
/gpt.md
/wake_gpt.md
/wake-gpt.md
/WAKE_GPT.md

So caps and underscores alone do not appear to be the trigger.

Current hypothesis

This looks like a transient ChatGPT/OpenAI-side preflight false positive, possibly involving some warm/cold state or temporary trust/cache behavior.

A suspicious-looking parameterized filesystem call may block when “cold,” then equivalent or repeated calls may pass after a benign connector call succeeds. Later, after some unknown state change or timeout, the same call may block again.

Current workaround

Operational workaround for now:


1. If a call gets the OpenAI safety-check block, do not immediately treat the MCP server as broken.
2. Wait a few seconds.
3. Retry once.
4. If it still blocks, retry with a narrower or plainer call shape:
   - avoid bare root "/" if a named subdirectory will do
   - use specific virtual paths
   - avoid broad scans/searches unless necessary
   - prefer bounded reads for larger files
   - use a less instruction-looking filename/path where possible
5. Check server logs: if there is no request, it was likely blocked before MCP dispatch.

It would help if ChatGPT surfaced whether the block happened pre-dispatch and exposed a stable error code/category separate from connector/server errors.

I was receiving the same issue yesterday, however my requests seem to be going through now (touch wood).

Whilst not ideal, I found it helps listing all your tools as non-destructive.

Same here. on an app that is in production for a few months now, a simple read operation is not working. The model can discover them, but can’t call some of the tools

At the moment, though, the runtime is still only surfacing the tool schemas rather than allowing me to execute those Glinded tool calls. I can inspect their signatures, but I can't actually invoke

No matter how many times I try, it won’t work.

BUT, if I do retry the ask with a thinking model (GPT 5.5 Thinking Mini) it solves it and it works.

Same here! App in production for some months. Getting a lot of user complaints currently! This is a large scale regression (at least for us).

@OpenAI_Support Please investigate ASAP.

Same here, this seems unnecessary given we ourselves have given the permission to run certain tools without filters. Please at the very least keep this safety filtering optional as it otherwise hampers our existing workflows.

Hey all, we’re aware of the issues and are working to tune things.

Thank you.

One best practice though, as ChatGPT Apps getting more traction. We need a status dashboard for things like this. The forum and normal “support” channel isn’t enough for large scale ChatGPT apps. Simply not professional. I understand that it is pretty new, but for the future, there has to be more trust and thrust. :slight_smile: