---
title: "Remote MCP servers in API requests · MCP tool calling in the EU"
description: "Connect remote MCP servers to model requests with the OpenAI Responses mcp tool. The API lists and calls the server's tools for you, processed in the EU."
canonical: "https://inference.eu/api/mcp/"
language: "en"
---

POST /v1/responses

# MCP tool: call remote MCP servers from your API requests

The Model Context Protocol (MCP) is an open standard for exposing tools to language models. Many products now publish an MCP server for their data. With the \`mcp\` tool in the Responses API, you add a server to a request and the inference.eu API connects to it, lists its tools, and calls them while the model works on your task, without you writing the tool loop yourself.

[Contact sales](https://inference.eu/contact/)[Example request](#example)

1.  01API format: OpenAI
2.  02EU data centres
3.  03Covered by one DPA

POST /v1/responses

```
curl https://api.inference.eu/v1/responses \
  -H "Authorization: Bearer $INFERENCE_EU_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-oss-120b",
    "tools": [{
      "type": "mcp",
      "server_label": "crm",
      "server_description": "Customer records and open support cases",
      "server_url": "https://mcp.example.eu/mcp",
      "headers": {"Authorization": "Bearer '"$CRM_MCP_TOKEN"'"},
      "allowed_tools": ["search_customers", "get_open_cases"],
      "require_approval": "never"
    }],
    "input": "Which open cases does Müller Logistik GmbH have, and how old is the oldest one?"
  }'
```

## What the MCP tool does

Add an entry with `type: "mcp"` to the `tools` array of a `POST /v1/responses` request. Give it a `server_label`, which names the server in the output, and the `server_url` of a remote MCP server that speaks the streamable HTTP transport. An optional `server_description` helps the model decide when the server is useful.

When the request runs, the API fetches the server's tool list and makes those tools available to the model. If the model decides to use one, the API calls the server, passes the result back to the model, and continues until the model has an answer. The calls are made from our infrastructure in the EU.

## Authentication, filtering and approval

Most servers need credentials. Pass them in `headers`, for example an `Authorization` header with a token for that service. Headers are used for the call and are not returned in the response, but use a token with the narrowest scope the task needs.

`allowed_tools` limits which of the server's tools the model may see, which keeps the prompt smaller and the behaviour predictable. `require_approval` controls whether a call needs your confirmation first: `never` runs calls automatically, `always` pauses each one, and an object with `always` and `never` lists sets it per tool. Use approval for tools that change data, such as creating tickets or sending messages.

## Reading the output

The `output` array shows what happened in order. An `mcp_list_tools` item records the tools the server offered. Each call appears as an `mcp_call` item with the `server_label`, the tool `name`, the JSON `arguments` and the `output` the server returned, or an `error`. The final `message` item contains the answer, also available as `output_text` in the SDKs.

When approval is required, the response contains an `mcp_approval_request` item instead. To continue, send a new request with `previous_response_id` and an input item of type `mcp_approval_response` that references the request's `id` and sets `approve` to `true` or `false`.

## Errors and edge cases

If the server cannot be reached, rejects the credentials or returns an invalid tool list, the request fails with an error that names the `server_label`, or the `mcp_call` item carries the error so the model can explain it. Check that the URL is public over HTTPS and that the token is valid.

The model sees whatever the server returns, so only connect servers you trust; tool output can contain instructions that try to steer the model. Long tool lists and large results use input tokens, so filter with `allowed_tools`. Data sent to a third-party MCP server is processed by that service under its own terms, so check where it runs.

## Remote MCP servers

Endpoint

POST /v1/responses

Category

Tools

API format

OpenAI

Base URL

api.inference.eu/v1

Processing

EU data centres

Training on your data

Never

## Remote MCP servers: common questions

The questions buyers, developers and legal teams ask us most. Something missing? Ask us directly.

It is a service that exposes tools over the Model Context Protocol on an HTTPS URL. A CRM, a ticketing system or an internal database can publish one, and any MCP-capable client can then discover and call its tools. The \`mcp\` tool lets the inference.eu API act as that client during a request.

Yes. The tool definition with \`type\`, \`server\_label\`, \`server\_url\`, \`headers\`, \`allowed\_tools\` and \`require\_approval\`, and the output items \`mcp\_list\_tools\`, \`mcp\_call\` and \`mcp\_approval\_request\`, follow the OpenAI Responses API. Code written for that format works after you change the base URL, key and model.

With function calling you define each tool and run it in your own code. With the MCP tool, the tools are defined by the server and the API calls the server for you. Function calling gives you full control; MCP saves you writing integrations for services that already offer a server.

Pass the credentials the server expects in \`headers\`, usually \`{"Authorization": "Bearer <token>"}\`. Create a token with the narrowest permissions the task needs, keep it on your server rather than in client-side code, and rotate it like any other secret.

Yes. Set \`require\_approval\` to \`always\`, or list specific tools under \`always\`. The response then contains an \`mcp\_approval\_request\`. Show it to a person, then continue with \`previous\_response\_id\` and an \`mcp\_approval\_response\` that approves or rejects the call.

No. The API connects to servers over HTTPS, so the server must be reachable on a public URL using the streamable HTTP transport. To use a local stdio server, run it behind an MCP gateway or proxy that exposes it over HTTPS with authentication.

The model and the calls to the server run on our infrastructure in the EU. What the server does with the data depends on who runs it and where. If data residency matters, choose MCP servers hosted in Europe or run your own, and check the provider's terms.

Yes. One \`tools\` array can contain several \`mcp\` entries and your own \`function\` tools. The API calls MCP servers itself, while function calls are returned to your code as usual. The model can use both kinds in the same task.

[Ask a question](https://inference.eu/contact/)

## Related

[API overview](https://inference.eu/api/)

-   [ResponsesUse the OpenAI Responses API format with open-weight models on inference.eu. Typed output items, built-in tools and multi-turn state, processed in the EU.Endpoints](https://inference.eu/api/responses/)
-   [Tool callingLet open models call your functions and APIs with OpenAI-compatible tool calling. Define tools, run the loop, handle arguments, processed in the EU.Guides](https://inference.eu/api/tool-calling/)
-   [Web searchLet open models search the web during a request with the OpenAI Responses web\_search tool. Current answers with source citations, run from the EU.Tools](https://inference.eu/api/web-search/)
-   [Code executionLet open models write and run Python in a sandbox with the OpenAI Responses code\_interpreter tool. Data analysis, calculations and files, run in the EU.Tools](https://inference.eu/api/code-execution/)

## Move your AI workloads to EU infrastructure

Tell us which models you use and roughly how much traffic you have. We reply within one working day with pricing and next steps.

-   Reply within one working day
-   Pricing for your volume
-   DPA ready to sign
