Skip to content

Schema error using MCP server with Gemini 2.5 #1250

Closed
@rectalogic

Description

@rectalogic

Initial Checks

Description

Gemini chokes on $schema in the JSON schema returned by MCP servers.

> GEMINI_API_KEY=XXX uv run --with pydantic-ai client.py
Secure MCP Filesystem Server running on stdio
Allowed directories: [ '/private/tmp' ]
Traceback (most recent call last):
  File "/private/tmp/client.py", line 15, in <module>
    asyncio.run(main())
  File "/Users/aw/.local/share/uv/python/cpython-3.11.10-macos-aarch64-none/lib/python3.11/asyncio/runners.py", line 190, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/Users/aw/.local/share/uv/python/cpython-3.11.10-macos-aarch64-none/lib/python3.11/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/aw/.local/share/uv/python/cpython-3.11.10-macos-aarch64-none/lib/python3.11/asyncio/base_events.py", line 654, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/private/tmp/client.py", line 11, in main
    result = await agent.run('Summarize the file client.py')
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/aw/Library/Caches/uv/archive-v0/UT4lACLsamDruEsIvP3Xe/lib/python3.11/site-packages/pydantic_ai/agent.py", line 327, in run
    async for _ in agent_run:
  File "/Users/aw/Library/Caches/uv/archive-v0/UT4lACLsamDruEsIvP3Xe/lib/python3.11/site-packages/pydantic_ai/agent.py", line 1414, in __anext__
    next_node = await self._graph_run.__anext__()
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/aw/Library/Caches/uv/archive-v0/UT4lACLsamDruEsIvP3Xe/lib/python3.11/site-packages/pydantic_graph/graph.py", line 782, in __anext__
    return await self.next(self._next_node)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/aw/Library/Caches/uv/archive-v0/UT4lACLsamDruEsIvP3Xe/lib/python3.11/site-packages/pydantic_graph/graph.py", line 760, in next
    self._next_node = await node.run(ctx)
                      ^^^^^^^^^^^^^^^^^^^
  File "/Users/aw/Library/Caches/uv/archive-v0/UT4lACLsamDruEsIvP3Xe/lib/python3.11/site-packages/pydantic_ai/_agent_graph.py", line 262, in run
    return await self._make_request(ctx)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/aw/Library/Caches/uv/archive-v0/UT4lACLsamDruEsIvP3Xe/lib/python3.11/site-packages/pydantic_ai/_agent_graph.py", line 314, in _make_request
    model_response, request_usage = await ctx.deps.model.request(
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/aw/Library/Caches/uv/archive-v0/UT4lACLsamDruEsIvP3Xe/lib/python3.11/site-packages/pydantic_ai/models/gemini.py", line 131, in request
    async with self._make_request(
  File "/Users/aw/.local/share/uv/python/cpython-3.11.10-macos-aarch64-none/lib/python3.11/contextlib.py", line 210, in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/aw/Library/Caches/uv/archive-v0/UT4lACLsamDruEsIvP3Xe/lib/python3.11/site-packages/pydantic_ai/models/gemini.py", line 227, in _make_request
    raise ModelHTTPError(status_code=status_code, model_name=self.model_name, body=r.text)
pydantic_ai.exceptions.ModelHTTPError: status_code: 400, model_name: gemini-2.5-pro-exp-03-25, body: {
  "error": {
    "code": 400,
    "message": "Invalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[0].parameters': Cannot find field.\nInvalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[1].parameters': Cannot find field.\nInvalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[2].parameters': Cannot find field.\nInvalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[3].parameters': Cannot find field.\nInvalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[4].parameters': Cannot find field.\nInvalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[5].parameters': Cannot find field.\nInvalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[6].parameters': Cannot find field.\nInvalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[7].parameters': Cannot find field.\nInvalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[8].parameters': Cannot find field.\nInvalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[9].parameters': Cannot find field.",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "tools.function_declarations[0].parameters",
            "description": "Invalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[0].parameters': Cannot find field."
          },
          {
            "field": "tools.function_declarations[1].parameters",
            "description": "Invalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[1].parameters': Cannot find field."
          },
          {
            "field": "tools.function_declarations[2].parameters",
            "description": "Invalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[2].parameters': Cannot find field."
          },
          {
            "field": "tools.function_declarations[3].parameters",
            "description": "Invalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[3].parameters': Cannot find field."
          },
          {
            "field": "tools.function_declarations[4].parameters",
            "description": "Invalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[4].parameters': Cannot find field."
          },
          {
            "field": "tools.function_declarations[5].parameters",
            "description": "Invalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[5].parameters': Cannot find field."
          },
          {
            "field": "tools.function_declarations[6].parameters",
            "description": "Invalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[6].parameters': Cannot find field."
          },
          {
            "field": "tools.function_declarations[7].parameters",
            "description": "Invalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[7].parameters': Cannot find field."
          },
          {
            "field": "tools.function_declarations[8].parameters",
            "description": "Invalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[8].parameters': Cannot find field."
          },
          {
            "field": "tools.function_declarations[9].parameters",
            "description": "Invalid JSON payload received. Unknown name \"$schema\" at 'tools.function_declarations[9].parameters': Cannot find field."
          }
        ]
      }
    ]
  }
}

Example Code

import asyncio
from pydantic_ai import Agent
from pydantic_ai.mcp import MCPServerStdio

server = MCPServerStdio('npx', ['-y', '@modelcontextprotocol/server-filesystem', '.'])
agent = Agent('gemini-2.5-pro-exp-03-25', mcp_servers=[server])


async def main():
    async with agent.run_mcp_servers():
        result = await agent.run('Summarize the file client.py')
    print(result.data)

if __name__ == "__main__":
    asyncio.run(main())

Python, Pydantic AI & LLM client version

Python 3.11.10
Pydantic 0.0.44
LLM gemini-2.5-pro-exp-03-25

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions