---
title: "Update MCP config"
method: PATCH
path: "/api/apps/platform/{app_id}/mcp/config"
---

# Update MCP config

`PATCH /api/apps/platform/{app_id}/mcp/config`

## Request

- Base URL: `https://app.base44.com`
- URL: `https://app.base44.com/api/apps/platform/{app_id}/mcp/config`
- Auth: HTTP bearer

<Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Changes how the app's MCP server authenticates clients, which tools it serves, or both. The app needs an MCP server first, which the builder sets up when you ask it to in chat.

Send only the keys you want to change. `tools` replaces the stored `tools` object whole, so read the current one with [Get MCP config](/api-reference/get-mcp-config), change it, and send all of it back.

Changes reach AI clients once you [deploy the app](/api-reference/deploy-an-app). The response shows the config as saved, and each tool's `published` tells you whether the live server already matches it.

Switching to `none` needs the app to be open to visitors without logging in. A workspace can also turn MCP off for its apps, or require `oauth`.

This is limited to 60 requests a minute for each app. Some workspaces have a different limit.

<Note>This endpoint accepts a personal API key belonging to a user with editor access to the app. A read-only key is refused, and workspace API keys are not accepted.</Note>

## Path parameters

- `app_id` string, required: ID of the app.

## Request body

- AppMcpConfigPatch: The MCP config keys to change.
  - `auth` 'none' | 'oauth', nullable: How clients authenticate. Either `"oauth"`, where clients sign in, or `"none"`, where anyone can call the entity read tools without signing in. Leave it out to keep the current mode.
  - `tools` object, nullable: The whole `tools` object, which replaces the stored one. `excluded_agents` lists agents to hold back. `entity_overrides` maps an entity name to the `operations` to serve, where an empty list holds the entity back. `functions` lists the custom tools, and one with `disabled` set to `true` is held back. Leave it out to keep the current tools.

## Response `200`

The config as saved, and its tools.

- AppMcpConfigResponse: The app's editable MCP config and the tools it resolves to.
  - `config` object, nullable: The editable config, or `null` when the app has no MCP server. It has `auth`, `login_path`, `consent_path`, and the `tools` object that [Update MCP config](/api-reference/update-mcp-config) replaces.
  - `tools` AppMcpToolRow[]: Every tool the config can serve, and whether it does.
    - `key` string, required: Stable ID of the row. Two rows can share a `name`, but never a `key`.
    - `name` string, required: Name AI clients call the tool by.
    - `kind` 'entity' | 'agent' | 'function', required: Where the tool comes from. Either `"entity"`, `"agent"`, or `"function"` for a custom tool.
    - `source` string, required: Entity, agent, or custom tool in the config that this row belongs to.
    - `operation` string, nullable: Entity operation the tool performs, or `null` for agent and custom tools. One of `read`, `create`, `update`, or `delete`.
    - `handler` string, nullable: Backend function a custom tool runs, or the server route path it calls (starting with `/`), or `null` for other tools.
    - `title` string, nullable: Display title of the tool, or `null` when it has none.
    - `description` string: What the tool does, as AI clients see it.
    - `read_only_hint` boolean: Whether the tool is marked as only reading data.
    - `exposed` boolean, required: Whether the config serves the tool.
    - `published` boolean, required: Whether the live server already matches `exposed`. It's `false` while a change waits for a publish.
  - `pending_removal` AppMcpLiveToolRow[]: Tools the live server still serves that the config no longer produces. The next publish removes them.
    - `name` string, required: Name AI clients call the tool by.
    - `kind` 'entity' | 'agent' | 'function', required: Where the tool comes from. Either `"entity"`, `"agent"`, or `"function"` for a custom tool.
    - `title` string, nullable: Display title of the tool, or `null` when it has none.
    - `description` string: What the tool does, as AI clients see it.
    - `read_only_hint` boolean: Whether the tool is marked as only reading data.

## Other responses

- `400`: The resulting config isn't valid. The detail lists each problem.
- `401`: Missing or invalid credentials.
- `403`: You don't have editor access to this app, it doesn't exist, or your API key is read-only. Also returned when the app's workspace has turned MCP off, or requires `oauth` and the config uses `none`.
- `404`: App not found, or it's outside the workspace your credential is scoped to.
- `409`: The app's main branch is protected (`reason` is `branch_protected`; the MCP config can only change on an unprotected main), the app has no MCP server yet, or you're switching to `none` and the app requires visitors to log in.
- `422`: The body isn't a JSON object, `auth` isn't `none` or `oauth`, or `tools` isn't an object.
- `429`: Too many MCP config updates for this app in the last minute.

## Changes

> 58 revisions in range; 1 not diffed.

- **2026-10-12** `5e139db2e643`: 1 info
  - the endpoint scheme security `PersonalAccessTokenAuth` was added to the API
- **2026-09-28** `347e2afcf94a`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/adexad/apis/base44-app-management-api/changes/api/apps/platform/:app_id/mcp/config/patch.md)

---

[API](https://skmtc.dev/adexad/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/adexad/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adexad/apis/base44-app-management-api/revisions/fa29e915c226?raw)
