This library provides a drop-in replacement for @langchain/google-genai
that fixes Gemini's 400 Bad Request errors when using LangChain.js with MCP servers.
Automatically transforms schemas with unsupported constructs (e.g., anyOf, allOf) into Gemini-compatible JSON.
The schema error usually looks like:
[GoogleGenerativeAI Error]: ... [400 Bad Request] Invalid JSON payload received.
This error typically occurs when using MultiServerMCPClient().
This library prevents its cascading failures where one complex server breaks the entire MCP integration.
Replace:
import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
...
const llm = new ChatGoogleGenerativeAI({ ... });
with:
import { ChatGoogleGenerativeAIEx } from '@h1deya/langchain-google-genai-ex';
...
const llm = new ChatGoogleGenerativeAIEx({ ... });
That's it! No configuration, no additional steps.
This automatically fixes:
You can easily switch back to the original ChatGoogleGenerativeAI
when its schema handling improves,
or when the MCP server's schema improves to meet Gemini's strict requirements.
A simple usage example, which is ready to clone and run, can be found here.
This library addresses compatibility issues present as of September 5, 2025, with LangChain.js (@langchain/core) v0.3.72 and @langchain/google-genai v0.2.16.
Below we'll explain what and how this library works in detail:
Before installing, make sure you have:
@langchain/core
and @langchain/mcp-adaptersTested with @langchain/core@0.3.72 and @langchain/google-genai@0.2.16.
npm i @h1deya/langchain-google-genai-ex
If you've ever tried using Google Gemini together with LangChain.js and MCP servers with complex schemas, you may have run into this error:
[GoogleGenerativeAI Error]: Error fetching from
https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent:
[400 Bad Request] Invalid JSON payload received.
Unknown name "anyOf" at 'tools[0].function_declarations[8]...
This typically occurs when you configure multiple MCP servers using MultiServerMCPClient,
especially when some of the servers have complex schemas.
If you searched for GoogleGenerativeAIFetchError: [GoogleGenerativeAI Error] 400 Bad Request,
the following sections explain the cause and how to workaround it when using LangChain.
The MCP servers I have encountered so far that have failed are:
@notionhq/notion-mcp-server@1.9.0(run withnpx)airtable-mcp-server@1.6.1(run withnpx)mcp-server-fetch==2025.4.7(run withuvx)
anyOf).@google/genai),
but LangChain.js users cannot leverage it due to architectural incompatibility.For many developers, this can make Gemini difficult to use with LangChain.js and some MCP servers.
Even if only one incompatible MCP server is included in the MCP definitions passed to MultiServerMCPClient,
all subsequent MCP usage starts failing with the 400 Bad Request error.
This library handles all these schema incompatibilities through schema transformation, converting complex MCP tool schemas into Gemini-friendly formats, so you can focus on building instead of debugging schema errors.
// import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
import { ChatGoogleGenerativeAIEx } from '@h1deya/langchain-google-genai-ex';
import { createReactAgent } from '@langchain/langgraph/prebuilt';
import { MultiServerMCPClient } from '@langchain/mcp-adapters';
import { HumanMessage } from '@langchain/core/messages';
// The following Fetch MCP server causes "400 Bad Request"
const client = new MultiServerMCPClient({
mcpServers: {
fetch: {
command: "uvx",
args: ["mcp-server-fetch==2025.4.7"]
}
}
});
const mcpTools = await client.getTools();
// const llm = new ChatGoogleGenerativeAI({ model: "gemini-2.5-flash" });
const llm = new ChatGoogleGenerativeAIEx({ model: "gemini-2.5-flash"} );
const agent = createReactAgent({ llm, tools: mcpTools });
// This works! No more schema errors
const result = await agent.invoke({
messages: [new HumanMessage("Read the top news headlines on bbc.com")]
});
console.log(result.messages[result.messages.length - 1].content);
await client.close();
A simple usage example, which is ready to clone and run, can be found here.
Key Benefits:
Want to see exactly what schema transformations are happening? Set the environment variable to get detailed logs:
LANGCHAIN_GOOGLE_GENAI_EX_VERBOSE=true
Example output:
🔧 Transforming 3 MCP tool(s) for Gemini compatibility...
✅ get-alerts: No transformation needed (simple schema)
✅ get-forecast: No transformation needed (simple schema)
🔄 fetch: 2 exclusive bound(s) converted, 1 unsupported format(s) removed (uri)
📊 Summary: 1/3 tool(s) required schema transformation
When to use verbose logging:
The verbose output helps you understand:
ChatGoogleGenerativeAIEx extends the original class, so you get everything:
allOf/anyOf/oneOf to equivalent object structures$ref and $defs by flattening definitions["string", "null"] to nullable propertiesrequired fields that don't exist in properties$ref definitions that aren't available, they're simplified to a generic object.oneOf/allOf are simplified, which may loosen or slightly change validation rules.These adjustments keep most MCP tools working, but rare edge cases could behave differently from the original schema. Please report issues you encounter using Issue.
See this design decision document for the implementation details.
Can be found here