free_tool
One tool schema, every provider
Claude, GPT and Gemini all take function definitions, but in three different shapes with three different rules. Paste a JSON Schema, an example object, or a TypeScript interface and get a clean, paste-ready tool definition for each, with the features that do not translate flagged for you.
Detected: example JSON
const tools = [
{
"name": "get_weather",
"description": "Get the current weather and a short forecast for a location. Call this when the user asks about weather, temperature, or conditions.",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string"
},
"unit": {
"type": "string"
},
"days": {
"type": "integer"
},
"include_hourly": {
"type": "boolean"
}
},
"required": [
"location",
"unit",
"days",
"include_hourly"
],
"additionalProperties": false
}
},
];No translation issues for Anthropic: every feature in your input maps cleanly to this provider.
Wiring tools into an agent loop and watching it loop, stall, or call the wrong one? I build agent loops that terminate, retry safely, and stay inside a token budget, so the tools you define actually get used the way you meant.
Make your agent production-ready: book a callPure codegen that runs entirely in your browser and uploads nothing. There is no YAML or full TypeScript compiler here: the TS reader handles one top-level interface with primitive, array and inline-object fields, and falls back to a string with a note for types it cannot resolve. Always check the generated schema against the provider docs before shipping.
why_it_matters
The same tool, three incompatible schemas
Anthropic wants input_schema, OpenAI wants a function wrapper with strict: true, and Gemini wants functionDeclarations whose parameters are an OpenAPI 3.0 subset. Hand-porting one definition to all three is where a missing required field or an unsupported keyword quietly breaks tool calling.
OpenAI strict mode insists every property appear in required and that additionalProperties is false. Gemini drops additionalProperties, most format values, and oneOf entirely. This generator normalizes one schema into each provider's accepted subset and tells you, per provider, exactly what it had to change.
faq
Questions & answers
- What does the LLM Tool Schema Generator produce?
- From one input it emits a paste-ready tool definition for three providers: Anthropic (tools with name, description and input_schema), OpenAI (tools with type function, a function wrapper and strict true), and Google Gemini (tools with functionDeclarations). You set the tool name and description, and it renders each provider's exact shape.
- What input does it accept?
- A JSON Schema object, a plain example JSON object, or a TypeScript interface. If you paste an example, it infers a schema from the values, treating every field as required. If you paste an interface, a small reader turns primitive, array, string-literal-union and inline-object fields into a schema. Auto-detect picks the format, or you can force one.
- How does it handle OpenAI strict mode?
- OpenAI strict mode requires that every property appear in required and that additionalProperties is false, so the generator adds both. If your schema marked some fields optional, it lists them in required anyway and adds a note telling you to make truly optional fields nullable, for example type set to the value or null, rather than leaving them out.
- Why does the Gemini output drop some of my fields' settings?
- Gemini's parameters are an OpenAPI 3.0 subset, so the generator drops additionalProperties, drops format values it does not support (keeping date-time and enum), and rewrites or removes oneOf and anyOf. Each change is listed in the per-provider compatibility notes so you know exactly what did not translate.
- Does it support YAML, and how complete is the TypeScript reader?
- There is no YAML parsing: paste JSON or a TypeScript interface instead. The TS reader is not a full compiler. It reads one top-level interface with primitive, array, string-literal-union and inline-object fields, and falls back to a string with a note for generics, references to other named types, or any or unknown.
- Is my schema sent anywhere?
- No. All parsing and code generation run entirely in your browser with no network call, so the schema you paste and the definitions it generates never leave the page. Always check the output against the current provider docs before shipping.
Building an agent that calls these tools?
A clean schema is step one. The loop around it, when it stops, how it retries, how it stays inside a token budget, is what decides whether the agent ships. That's the kind of review I do. Book a call, or leave your email.
Prefer proof first? See how this plays out in real case studies →