Hi OpenAI team,
I’m seeing an Android-specific issue with a custom ChatGPT App built with the Apps SDK / MCP and a widget UI.
The issue is easiest to reproduce with a destructive tool: delete_zone.
On ChatGPT web and iOS, the native confirmation modal appears every time for this tool, and after approval the MCP server receives the call and the zone is deleted correctly.
On ChatGPT Android, the same tool is blocked before reaching the MCP server.
Environment
-
App type: ChatGPT App / Apps SDK / MCP
-
UI: Apps SDK widget registered with registerAppResource
-
Some tools use registerAppTool
-
App status: dev mode
-
Backend: Node MCP server
-
Platforms where it works:
-
ChatGPT web: confirmation modal appears, then tool executes
-
ChatGPT iOS: confirmation modal appears, then tool executes
-
-
Platform with issue:
- ChatGPT Android
-
Android devices tested:
-
Pixel 6a, Android 16
-
another Android device with the same behavior
-
Tool involved
The tool is delete_zone, registered in the same MCP server as the widget app.
It is a destructive tool and is annotated accordingly:
annotations: {
readOnlyHint: false,
openWorldHint: false,
destructiveHint: true,
}
The tool is expected to delete an existing zone from an App map after user confirmation.
Expected behavior
On Android, ChatGPT should behave like web and iOS:
-
The assistant prepares the delete_zone call.
-
ChatGPT displays the native confirmation modal.
-
The user approves.
-
The MCP server receives the delete_zone tool call.
-
The zone is deleted.
Actual behavior on Android
On Android, the confirmation flow fails before the tool reaches the MCP server.
The call is blocked by ChatGPT/OpenAI safety controls, or the confirmation UI does not complete correctly.
When this happens:
-
no delete_zone request reaches the MCP server;
-
there is no MCP server log for the tool call;
-
the zone is not deleted;
-
the assistant reports that it could not execute the tool.
Behavior on web and iOS
On web and iOS, the same delete_zone flow works consistently:
-
the native confirmation modal appears every time;
-
after approval, the MCP server receives the call;
-
the tool executes successfully.
This makes the issue appear Android-specific, not backend-specific.
Important comparison
Other tools in the same app can execute on Android when no native confirmation modal is triggered.
For example, a simple create_map flow can succeed on Android.
So MCP authentication and basic tool execution work on Android. The issue appears specifically related to Android’s native confirmation / safety flow for destructive tools in a widget-based Apps SDK app.
Widget context
This is not a plain MCP-only app. The app includes a widget UI:
-
widget resource registered with registerAppResource
-
map visualization rendered through the widget
-
tools such as visualize_map use widget metadata
-
some tools are registered with registerAppTool
The delete_zone tool belongs to the same widget-based Apps SDK app.
Reproduction steps
-
Open ChatGPT Android.
-
Use the custom Apps SDK app in dev mode.
-
Ask the app to delete an existing zone, for example:
Delete the zone named [zone name]
-
ChatGPT prepares the destructive delete_zone tool call.
-
On web/iOS, the confirmation modal appears and the tool works.
-
On Android, the flow fails before the MCP server receives the tool call.
MCP server evidence
When the tool works, MCP logs show a delete_zone call.
When it fails on Android, no delete_zone call appears in the MCP logs, which means the block happens before the request reaches the MCP server.
Impact
This breaks destructive actions on Android for the app.
For safety reasons, delete_zone should remain annotated as destructive, so changing the annotation to avoid confirmation is not a good workaround.
Question
Is this a known issue with the ChatGPT Android app and Apps SDK widget apps in dev mode?
Is there a recommended way to make native confirmation modals for destructive tools reliable on Android, or to obtain more diagnostics when a destructive tool call is blocked before reaching the MCP server?
