-
Notifications
You must be signed in to change notification settings - Fork 69
Description
Describe the bug
When using the official tableau-mcp Python client (v1.8.0) with Tableau Online, I encounter repeated Pydantic validation warnings for notifications. The warnings do not seem to affect the main functionality (queries still return correct results), but they flood the logs and indicate a mismatch between the notification types sent by Tableau Online and the client models.
Steps to reproduce
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
conf = {
"TableauMCP": {
"transport": "streamable_http", # or "sse"
"url": "https://<my_ec2_server>/tableau-mcp/",
"timeout": 600,
"headers": None
}
}
async def main():
client = MultiServerMCPClient(conf)
tools = await client.get_tools()
# This fails with validation errors
res = await tools[13].coroutine(
filter='workbookName:eq:Roaming Dashboard KPIs,projectName:eq:TEST-EXPLORER,name:eq:Roaming dashboard'
) # 13th tool is 'list-views' tool
print(res)
asyncio.run(main())Key points:
The client expects strongly-typed notifications like notifications/cancelled, notifications/progress, etc.
Tableau Online MCP server sends generic notifications/message logs, which do not satisfy the client’s Pydantic validation.
As a result, tools[any_i].coroutine(...) does not return results.
Expected behavior:
The client should handle generic notifications/message types gracefully, or provide a way to ignore unknown notification types.
Queries like the above should succeed and return the expected data from Tableau Online.
Logs
WARNING:root:Failed to validate notification: 11 validation errors for ServerNotification
CancelledNotification.method
Input should be 'notifications/cancelled' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
CancelledNotification.params.requestId
Field required [type=missing, input_value={'level': 'info', 'logger... "params": {}\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.method
Input should be 'notifications/progress' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ProgressNotification.params.progressToken
Field required [type=missing, input_value={'level': 'info', 'logger... "params": {}\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.params.progress
Field required [type=missing, input_value={'level': 'info', 'logger... "params": {}\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
LoggingMessageNotification.params.data
Field required [type=missing, input_value={'level': 'info', 'logger... "params": {}\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceUpdatedNotification.method
Input should be 'notifications/resources/updated' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ResourceUpdatedNotification.params.uri
Field required [type=missing, input_value={'level': 'info', 'logger... "params": {}\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceListChangedNotification.method
Input should be 'notifications/resources/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ToolListChangedNotification.method
Input should be 'notifications/tools/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
PromptListChangedNotification.method
Input should be 'notifications/prompts/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error. Message was: method='notifications/message' params={'level': 'info', 'logger': 'rest-api', 'message': '{\n "timestamp": "2025-09-16T10:03:51.927Z",\n "currentLogLevel": "debug",\n "message": {\n "type": "request",\n "requestId": 1,\n "method": "post",\n "url": "https://dub01.online.tableau.com/auth/signin",\n "headers": {\n "Accept": "application/json, text/plain, */*",\n "User-Agent": "tableau-mcp/1.8.0"\n },\n "data": {\n "credentials": "<redacted>"\n },\n "params": {}\n }\n}'} jsonrpc='2.0'
WARNING:root:Failed to validate notification: 11 validation errors for ServerNotification
CancelledNotification.method
Input should be 'notifications/cancelled' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
CancelledNotification.params.requestId
Field required [type=missing, input_value={'level': 'info', 'logger...acted>"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.method
Input should be 'notifications/progress' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ProgressNotification.params.progressToken
Field required [type=missing, input_value={'level': 'info', 'logger...acted>"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.params.progress
Field required [type=missing, input_value={'level': 'info', 'logger...acted>"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
LoggingMessageNotification.params.data
Field required [type=missing, input_value={'level': 'info', 'logger...acted>"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceUpdatedNotification.method
Input should be 'notifications/resources/updated' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ResourceUpdatedNotification.params.uri
Field required [type=missing, input_value={'level': 'info', 'logger...acted>"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceListChangedNotification.method
Input should be 'notifications/resources/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ToolListChangedNotification.method
Input should be 'notifications/tools/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
PromptListChangedNotification.method
Input should be 'notifications/prompts/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error. Message was: method='notifications/message' params={'level': 'info', 'logger': 'rest-api', 'message': '{\n "timestamp": "2025-09-16T10:03:52.133Z",\n "currentLogLevel": "debug",\n "message": {\n "type": "response",\n "requestId": 1,\n "url": "https://dub01.online.tableau.com/auth/signin",\n "status": 200,\n "headers": {\n "date": "Tue, 16 Sep 2025 10:03:52 GMT",\n "content-type": "application/json;charset=utf-8",\n "content-length": "231",\n "connection": "keep-alive",\n "vary": "Accept-Encoding",\n "x-content-type-options": "nosniff",\n "x-ua-compatible": "IE=Edge",\n "x-xss-protection": "1; mode=block",\n "referrer-policy": "strict-origin-when-cross-origin",\n "global-session-header": "MTAuNzcuNi41OjgwODA=",\n "p3p": "CP=\\"NON\\"",\n "x-tableau": "Tableau Server",\n "strict-transport-security": "max-age=31536000; includeSubDomains, max-age=31536000; includeSubDomains",\n "server": "sfdcedge",\n "x-sfdc-request-id": "03afadd9a5c6aece2d782aaf77fdc2bb",\n "x-request-id": "03afadd9a5c6aece2d782aaf77fdc2bb"\n },\n "data": {\n "credentials": "<redacted>"\n }\n }\n}'} jsonrpc='2.0'
WARNING:root:Failed to validate notification: 11 validation errors for ServerNotification
CancelledNotification.method
Input should be 'notifications/cancelled' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
CancelledNotification.params.requestId
Field required [type=missing, input_value={'level': 'info', 'logger...hboard"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.method
Input should be 'notifications/progress' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ProgressNotification.params.progressToken
Field required [type=missing, input_value={'level': 'info', 'logger...hboard"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.params.progress
Field required [type=missing, input_value={'level': 'info', 'logger...hboard"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
LoggingMessageNotification.params.data
Field required [type=missing, input_value={'level': 'info', 'logger...hboard"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceUpdatedNotification.method
Input should be 'notifications/resources/updated' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ResourceUpdatedNotification.params.uri
Field required [type=missing, input_value={'level': 'info', 'logger...hboard"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceListChangedNotification.method
Input should be 'notifications/resources/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ToolListChangedNotification.method
Input should be 'notifications/tools/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
PromptListChangedNotification.method
Input should be 'notifications/prompts/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error. Message was: method='notifications/message' params={'level': 'info', 'logger': 'rest-api', 'message': '{\n "timestamp": "2025-09-16T10:03:52.134Z",\n "currentLogLevel": "debug",\n "message": {\n "type": "request",\n "requestId": 1,\n "method": "get",\n "url": "https://dub01.online.tableau.com/sites/6249780c-ddbe-46cb-8afa-bf32adb268ee/views?includeUsageStatistics=true&filter=workbookName%3Aeq%3ARoaming+Dashboard+KPIs%2CprojectName%3Aeq%3ATEST-EXPLORER%2Cname%3Aeq%3ARoaming+dashboard&pageSize=undefined&pageNumber=undefined",\n "headers": {\n "Accept": "application/json, text/plain, */*",\n "X-Tableau-Auth": "<redacted>",\n "User-Agent": "tableau-mcp/1.8.0"\n },\n "params": {\n "includeUsageStatistics": true,\n "filter": "workbookName:eq:Roaming Dashboard KPIs,projectName:eq:TEST-EXPLORER,name:eq:Roaming dashboard"\n }\n }\n}'} jsonrpc='2.0'
WARNING:root:Failed to validate notification: 11 validation errors for ServerNotification
CancelledNotification.method
Input should be 'notifications/cancelled' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
CancelledNotification.params.requestId
Field required [type=missing, input_value={'level': 'info', 'logger... }\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.method
Input should be 'notifications/progress' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ProgressNotification.params.progressToken
Field required [type=missing, input_value={'level': 'info', 'logger... }\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.params.progress
Field required [type=missing, input_value={'level': 'info', 'logger... }\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
LoggingMessageNotification.params.data
Field required [type=missing, input_value={'level': 'info', 'logger... }\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceUpdatedNotification.method
Input should be 'notifications/resources/updated' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ResourceUpdatedNotification.params.uri
Field required [type=missing, input_value={'level': 'info', 'logger... }\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceListChangedNotification.method
Input should be 'notifications/resources/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ToolListChangedNotification.method
Input should be 'notifications/tools/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
PromptListChangedNotification.method
Input should be 'notifications/prompts/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error. Message was: method='notifications/message' params={'level': 'info', 'logger': 'rest-api', 'message': '{\n "timestamp": "2025-09-16T10:03:52.441Z",\n "currentLogLevel": "debug",\n "message": {\n "type": "response",\n "requestId": 1,\n "url": "https://dub01.online.tableau.com/sites/6249780c-ddbe-46cb-8afa-bf32adb268ee/views",\n "status": 200,\n "headers": {\n "date": "Tue, 16 Sep 2025 10:03:52 GMT",\n "content-type": "application/json;charset=utf-8",\n "content-length": "365",\n "connection": "keep-alive",\n "x-ua-compatible": "IE=Edge",\n "strict-transport-security": "max-age=31536000; includeSubDomains, max-age=31536000; includeSubDomains",\n "x-tableau": "Tableau Server",\n "referrer-policy": "strict-origin-when-cross-origin",\n "vary": "Accept-Encoding",\n "x-xss-protection": "1; mode=block",\n "x-content-type-options": "nosniff",\n "p3p": "CP=\\"NON\\"",\n "global-session-header": "MTAuNzcuNDMuMTQ2OjgwODA=",\n "server": "sfdcedge",\n "x-sfdc-request-id": "c6219c4ad34b162f930f7f225a3d91a5",\n "x-request-id": "c6219c4ad34b162f930f7f225a3d91a5"\n },\n "data": {\n "pagination": {\n "pageNumber": "1",\n "pageSize": "100",\n "totalAvailable": "1"\n },\n "views": {\n "view": [\n {\n "workbook": {\n "id": "a0c62e8c-5c4f-439f-9a37-bc05ef9f1559"\n },\n "owner": {\n "id": "b67bfa91-f564-4c54-968d-153f5cde1154"\n },\n "project": {\n "id": "d438fa93-476c-4157-ade1-eca9fa9f0c81"\n },\n "tags": {},\n "usage": {\n "totalViewCount": "37"\n },\n "location": {\n "id": "d438fa93-476c-4157-ade1-eca9fa9f0c81",\n "type": "Project"\n },\n "id": "97ae0863-891c-4dbb-91fe-732f8ca4b1cd",\n "name": "Roaming Dashboard",\n "contentUrl": "RoamingDashboardKPIs/sheets/RoamingDashboard",\n "createdAt": "2025-08-12T10:05:50Z",\n "updatedAt": "2025-08-12T10:05:50Z",\n "viewUrlName": "RoamingDashboard"\n }\n ]\n }\n }\n }\n}'} jsonrpc='2.0'
WARNING:root:Failed to validate notification: 11 validation errors for ServerNotification
CancelledNotification.method
Input should be 'notifications/cancelled' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
CancelledNotification.params.requestId
Field required [type=missing, input_value={'level': 'info', 'logger.../1.8.0"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.method
Input should be 'notifications/progress' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ProgressNotification.params.progressToken
Field required [type=missing, input_value={'level': 'info', 'logger.../1.8.0"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.params.progress
Field required [type=missing, input_value={'level': 'info', 'logger.../1.8.0"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
LoggingMessageNotification.params.data
Field required [type=missing, input_value={'level': 'info', 'logger.../1.8.0"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceUpdatedNotification.method
Input should be 'notifications/resources/updated' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ResourceUpdatedNotification.params.uri
Field required [type=missing, input_value={'level': 'info', 'logger.../1.8.0"\n }\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceListChangedNotification.method
Input should be 'notifications/resources/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ToolListChangedNotification.method
Input should be 'notifications/tools/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
PromptListChangedNotification.method
Input should be 'notifications/prompts/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error. Message was: method='notifications/message' params={'level': 'info', 'logger': 'rest-api', 'message': '{\n "timestamp": "2025-09-16T10:03:52.442Z",\n "currentLogLevel": "debug",\n "message": {\n "type": "request",\n "requestId": 1,\n "method": "post",\n "url": "https://dub01.online.tableau.com/auth/signout",\n "headers": {\n "Accept": "application/json, text/plain, */*",\n "X-Tableau-Auth": "<redacted>",\n "User-Agent": "tableau-mcp/1.8.0"\n }\n }\n}'} jsonrpc='2.0'
WARNING:root:Failed to validate notification: 11 validation errors for ServerNotification
CancelledNotification.method
Input should be 'notifications/cancelled' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
CancelledNotification.params.requestId
Field required [type=missing, input_value={'level': 'info', 'logger... "data": ""\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.method
Input should be 'notifications/progress' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ProgressNotification.params.progressToken
Field required [type=missing, input_value={'level': 'info', 'logger... "data": ""\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ProgressNotification.params.progress
Field required [type=missing, input_value={'level': 'info', 'logger... "data": ""\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
LoggingMessageNotification.params.data
Field required [type=missing, input_value={'level': 'info', 'logger... "data": ""\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceUpdatedNotification.method
Input should be 'notifications/resources/updated' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ResourceUpdatedNotification.params.uri
Field required [type=missing, input_value={'level': 'info', 'logger... "data": ""\n }\n}'}, input_type=dict]
For further information visit https://errors.pydantic.dev/2.11/v/missing
ResourceListChangedNotification.method
Input should be 'notifications/resources/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
ToolListChangedNotification.method
Input should be 'notifications/tools/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error
PromptListChangedNotification.method
Input should be 'notifications/prompts/list_changed' [type=literal_error, input_value='notifications/message', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/literal_error. Message was: method='notifications/message' params={'level': 'info', 'logger': 'rest-api', 'message': '{\n "timestamp": "2025-09-16T10:03:52.618Z",\n "currentLogLevel": "debug",\n "message": {\n "type": "response",\n "requestId": 1,\n "url": "https://dub01.online.tableau.com/auth/signout",\n "status": 204,\n "headers": {\n "date": "Tue, 16 Sep 2025 10:03:52 GMT",\n "connection": "keep-alive",\n "x-tableau": "Tableau Server",\n "referrer-policy": "strict-origin-when-cross-origin",\n "strict-transport-security": "max-age=31536000; includeSubDomains, max-age=31536000; includeSubDomains",\n "x-ua-compatible": "IE=Edge",\n "x-content-type-options": "nosniff",\n "p3p": "CP=\\"NON\\"",\n "x-xss-protection": "1; mode=block",\n "global-session-header": "MTAuNzcuMTAzLjI0ODo4MDgw",\n "server": "sfdcedge",\n "x-sfdc-request-id": "a04e7abf1adee983164705f92b60ac26",\n "x-request-id": "a04e7abf1adee983164705f92b60ac26"\n },\n "data": ""\n }\n}'} jsonrpc='2.0'