Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions analytics_mcp/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,30 @@
)

mcp_tools = [adk_to_mcp_tool_type(tool) for tool in tools]


def _fix_additional_properties(schema: dict) -> None:
"""Recursively convert non-boolean additionalProperties to boolean.

Some MCP clients (Claude Desktop, OpenAI Codex) expect
additionalProperties to be a boolean, not a schema object.
See https://github.com/googleanalytics/google-analytics-mcp/issues/40
"""
if not isinstance(schema, dict):
return
if "additionalProperties" in schema and not isinstance(
schema["additionalProperties"], bool
):
schema["additionalProperties"] = True
for value in schema.values():
if isinstance(value, dict):
_fix_additional_properties(value)
elif isinstance(value, list):
for item in value:
if isinstance(item, dict):
_fix_additional_properties(item)


# Update the inputSchema for tools that do not have parameters.
# TODO: This is a bug in the ADK and can be removed once it is fixed.
# https://github.com/google/adk-python/issues/948
Expand All @@ -82,6 +106,8 @@
for prop in tool.inputSchema.get("properties", {}).values():
if "anyOf" in prop and prop.get("type") == "null":
del prop["type"]
# Fix non-boolean additionalProperties that break some MCP clients
_fix_additional_properties(tool.inputSchema)


@app.list_tools()
Expand Down