SAP / SAP/cloud-sdk-python

AgentGatewayClient.call_mcp_tool returns None instead of CallToolResult when MCP server responds with isError: true

Ouverte
#326 1 commentaire 0 réactions 1 personne assignée Voir sur GitHub

@thiagob y travaille déjà.

Depuis le 14/9/2026.

bug
Langage dominant
Python
Étoiles
28
Forks
42
Merge moyen
2 j 13 h
PR mergées (30 j)
35

Description

Describe the Bug

When AgentGatewayClient.call_mcp_tool is used to invoke an MCP tool and the MCP server returns a spec-compliant error response (isError: true, HTTP 200, SSE event: message), the method returns None instead of a CallToolResult. Any subsequent access on the return value raises AttributeError: 'NoneType' object has no attribute 'isError'.

The MCP server side is correct — a direct tools/call against the MCP endpoint returns a well-formed response (see Expected Behavior). The failure is in how call_mcp_tool parses the SSE response for the isError: true case.

Steps to Reproduce

Set up an AgentGatewayClient pointing to an MCP server deployed via Agent Gateway.
Discover tools via agw_client.list_mcp_tools(user_token=...) and locate a tool whose backend can return an error (e.g. a lookup tool called with an ID that does not exist).
Call await agw_client.call_mcp_tool(tool, user_token=..., =).
The MCP server returns HTTP 200 + SSE event: message with isError: true (confirmed via direct call — see Expected Behavior).
call_mcp_tool returns None.
Access result.isError → AttributeError: 'NoneType' object has no attribute 'isError'.

Expected Behavior

A direct tools/call to the same MCP server with the same arguments returns a well-formed, spec-compliant response (MCP protocol 2025-11-25):

HTTP 200 — text/event-stream

event: message
data: {
"result": {
"content": [{"type": "text", "text": "{"status":500,"error":"HTTP Error","message":"Tool call failed"}"}],
"isError": true
},
"jsonrpc": "2.0",
"id": 3
}
call_mcp_tool should parse this SSE event and return a CallToolResult with isError=True and content populated. If parsing fails for any reason, it should raise an exception — returning None silently is never a valid outcome.

Screenshots

No response

Used Versions

sap-cloud-sdk 0.48.2
fastapi 0.135.3
langchain-core 1.5.3
langchain-mcp-adapters (version — run uv pip list to confirm)

Code Examples
# Your code here
Stack Trace

AttributeError: 'NoneType' object has no attribute 'isError'

The above exception was the direct cause of the following exception:

File "app/clients/mcp_validation_rule_wrapper.py", line 197, in _call_tool
result = await _invoke_with_timeout(tool, arguments)

(exception originates inside sap_cloud_sdk.agentgateway internals

when accessing result.isError on the None returned by call_mcp_tool)

Log File

INFO [mcp_wrapper] call tool= args=[...]
INFO Negotiated protocol version: 2025-11-25
INFO Loaded 7 MCP tool(s) from Agent Gateway (deployed mode)
ERROR Unexpected error during tool invocation
ERROR [mcp_wrapper] tool= error=Tool invocation failed for '':
'NoneType' object has no attribute 'isError'
INFO [mcp_wrapper] done tool= duration_ms=9603 status=error

Affected Development Phase

Development

Impact

Impaired

Timeline

No response

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.