Skip to main content
Pass the OpenAI mcp tool to let the model call tools on a remote MCP server alongside its web research. Parallel connects to the server, lists its tools, and calls them when they are useful for the question. The tools found on each server are reported as an mcp_list_tools output item and each call as an mcp_call item, in the same shapes OpenAI returns them. Use an mcp tool for a server you run or a provider your organization already licenses. For Data Connectors Parallel manages, use data_sources instead.

Add a server

server_description is accepted and ignored. Parallel does not run the OAuth flow for you; obtain a token separately and pass it as authorization or in headers:
A request may carry up to 10 mcp tools, but fewer usually gives better answers. MCP tools work on every reasoning.effort tier, and can be combined with a web_search tool and with data_sources.

Restrictions

  • Only servers using the Streamable HTTP transport are supported, and only their tools: MCP resources and prompts are not used.
  • require_approval must be "never". There is no approval round trip, so the response never contains mcp_approval_request items.
  • connector_id (OpenAI connectors), tunnel_id, and defer_loading are not supported and are rejected when set, including defer_loading: false.
  • allowed_tools must be a list of tool names. An empty list and the filter-object form ({"read_only": true}) are rejected.
  • allowed_tools names that match no tool on the server are ignored. If none match, the server is never called and its mcp_list_tools item reports the error.
Rejected tools return a 400 with the reason; see OpenAI Responses Compatibility.

Check server connections

A completed response contains one mcp_list_tools item per mcp tool, listing the tools the model could call on that server after allowed_tools filtering:
If Parallel can’t connect to the server or list its tools, tools is empty and error says why. The request still completes, on web research and any other servers:
A server that lists no tools, or none that match allowed_tools, is reported the same way. Connectors named in data_sources get an mcp_list_tools item only when they fail, with an empty tools list.

Read tool calls

A completed response contains one mcp_call item per tool call the model made, for your mcp tools and for the connectors you named in data_sources:
The model decides when a tool is useful, so a server may be called several times or not at all. A failed call does not fail the response. Calls to Index Partners are not reported. A failed call’s error is an object, in the same shape OpenAI returns: Read output by item type rather than by position. mcp_list_tools items, then mcp_call items, follow the web_search_call items and precede the message item in a non-streaming response, but follow the message item in a streamed one.
The response echoes your mcp tools on tools with credentials removed: headers and authorization are null, and any query string on server_url is replaced with ***. With streaming enabled, server connections and tool calls are reported once research finishes, after the answer’s text delta. Each mcp_list_tools item is sent as response.output_item.added, response.mcp_list_tools.completed or response.mcp_list_tools.failed, and response.output_item.done, then each mcp_call item the same way with response.mcp_call.completed or response.mcp_call.failed. The response.mcp_list_tools.in_progress, response.mcp_call.in_progress, and response.mcp_call_arguments.* events are not sent.