Skip to content

Pydantic validation errors on notifications/message from Tableau Online MCP server #106

@SuleymanSuleymanzade

Description

@SuleymanSuleymanzade

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'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions