ComposioHQ/composio · error · ValidationError

Failed to update MCP server {server_id}

Error message

Failed to update MCP server {server_id}

What it means

Raised when MCP.update(server_id, ...) fails to apply updates through client.mcp.update — any exception during the PATCH/PUT call (invalid params, bad ID, backend error) is wrapped into this ValidationError with the server_id in the message.

Source

Thrown at python/composio/core/models/mcp.py:411

                update_params["toolkits"] = toolkit_names
                update_params["auth_config_ids"] = auth_config_ids

            if allowed_tools is not None:
                update_params["custom_tools"] = allowed_tools

            if manually_manage_connections is not None:
                update_params[
                    "managed_auth_via_composio"
                ] = not manually_manage_connections

            # Use the MCP update endpoint
            response = self._client.mcp.update(server_id, **update_params)

            return response

        except Exception as e:
            raise ValidationError(f"Failed to update MCP server {server_id}") from e

    def delete(self, server_id: str) -> t.Dict[str, t.Any]:
        """
        Permanently delete an MCP server configuration.

        :param server_id: The unique identifier of the MCP server to delete
        :return: Deletion result

        Example:
            >>> # Delete a server
            >>> result = composio.experimental.mcp.delete('mcp_12345')
            >>>
            >>> if result['deleted']:
            ...     print(f"Server {result['id']} has been successfully deleted")
            >>> else:
            ...     print(f"Failed to delete server {result['id']}")
        """
        try:

View on GitHub (pinned to 64b1b85502)

Solutions

  1. Check e.__cause__ for the exact backend error
  2. Confirm the server still exists via composio.mcp.get(server_id) before updating
  3. Validate toolkit slugs in the toolkits argument against composio.toolkits.list()
  4. Upgrade composio to match the current backend API
Defensive patterns

Strategy: try-catch

Validate before calling

if composio.mcp.get(server_id) is None:
    raise ValueError('server missing')

Try / catch

try:
    composio.mcp.update(server_id, name=new_name)
except ValidationError as e:
    logger.error('update failed: %s', e.__cause__)
    raise

Prevention

When it happens

Trigger: Calling composio.mcp.update() with a nonexistent server_id, an empty/invalid update payload, or when the generated client rejects the keyword arguments passed as update_params.

Common situations: Passing toolkit names that don't exist, renaming to a duplicate name, SDK version drift where update() signature changed, stale server_id.

Related errors


AI-assisted analysis of ComposioHQ/composio@64b1b85502 (2026-08-28). Data as JSON: /api/errors/cbac8bd7ebd87c21. Report an issue: GitHub.