Six apps configured. All working. Then Groq Desktop: every single tool call failed with a JSON schema error. The bug was inside Groq's own source code — and they didn't know it existed yet.
Claude Desktop: working. Cursor: working. Windsurf: working. VS Code: working. Continue: working. Groq Desktop — the brand new AI desktop app from the company behind the fastest LLM inference on the planet: every single tool call fails with the same error, every time.
400 {"error":{"message":"invalid JSON schema for tool vektor_recall,
tools[0].function.parameters: `additionalProperties:false` must be
set on every object","type":"invalid_request_error"}}
The error is clear enough: Groq's API requires additionalProperties: false on every object in a tool schema. Fair enough — some APIs are stricter than others. So we added it to every one of our 34 tool schemas. Repacked, reinstalled, retested.
Same error. Different wording this time:
400 {"error":{"message":"invalid JSON schema for tool vektor_recall,
tools[0].function.parameters: /required: `required` is required to be
supplied and to be an array including every key in properties.
The following properties must be listed in `required`: top_k"}}
Now Groq is complaining that optional properties aren't in the required array. top_k is optional — that's the point. It has a default value. But Groq's strict mode demands every property be listed as required.
We could fix our schemas. But something felt wrong. These errors shouldn't be coming from Groq's API directly — they should be coming from Groq Desktop's MCP-to-OpenAI converter. We looked at our tool schemas in Claude Desktop. They worked fine. Same schemas. Why would Groq's API see them differently?
Groq Desktop is open source on GitHub. We cloned it, built it from source, and started searching. The MCP integration has to convert tool schemas from MCP format (inputSchema) to OpenAI function-calling format (parameters) before sending them to the API. That conversion lives in electron/chatHandler.js.
Line 80. Right there in the source:
// Sanitize schema: Reconstruction Strategy
// Instead of copying, we rebuild the schema from scratch
let safeSchema = {
type: "object",
properties: {}
// Removed 'required' init here to add it only if needed
// Removed 'additionalProperties' to be less strict/prone to validation errors
};"Removed 'additionalProperties' to be less strict/prone to validation errors." — Their own comment. The thing they removed to avoid validation errors was causing validation errors.
The irony is perfect. They removed additionalProperties: false to avoid validation errors — but Groq's own API now requires it. Their fix for one problem created a worse problem downstream.
And the required array bug was the same pattern: they only copied required from the original schema if it existed and had items. Optional properties with defaults — like our top_k — never made it into required. Groq's strict mode then rejected the schema because a property existed that wasn't listed as required.
The fix was surgical. In chatHandler.js, after the schema reconstruction block, we added three lines:
// Rebuild required only if it has items (existing code)
if (Array.isArray(schema.required) && schema.required.length > 0) {
safeSchema.required = [...schema.required];
}
// FIX 1 + 2: Groq API requires ALL properties in required[]
// and additionalProperties: false on every object
const allKeys = Object.keys(safeSchema.properties);
if (allKeys.length > 0) safeSchema.required = allKeys;
safeSchema.additionalProperties = false;Three lines. That's it. Force all property keys into required. Add additionalProperties: false. Rebuild Groq Desktop. Install. Test.
ToolVektor recall
The memory has been successfully stored and recalled.
"Groq Desktop fixed 13 April 2026"
id: 16, score: 1.0
Score of 1.0. Perfect recall. All 34 tools working in Groq Desktop.
The moment the fix worked, the next question was obvious: what about our customers? Anyone who installs VEKTOR and tries to use it with Groq Desktop will hit the exact same two errors. They'll think VEKTOR is broken. They'll give up. They'll leave a one-star review.
We couldn't wait for Groq to push a fix. So we built the patch into our setup wizard. When the wizard detects Groq Desktop is installed, it automatically applies the chatHandler.js fix before writing the MCP config. The customer never sees an error. They never know the bug existed.
// When Groq Desktop is detected, patch it silently
if (app.name === 'Groq Desktop') {
const patched = patchGroqDesktop(app.detect);
if (patched) {
tick('Groq Desktop schema fix applied automatically');
}
writeMcpConfig(app.configPath, serverEntry, rootKey);
} ✓ Groq Desktop schema fix applied automatically
✓ Groq Desktop configured → settings.json
✓ Profile: dev (15 tools — dev optimised)
· Restart Groq Desktop to apply changes
This is what good developer tooling looks like. You don't document the bug and hope users read it. You find it, fix it, automate the fix, and ship it. The user experience should be perfect even when the underlying ecosystem isn't.
The dragons are slain. In Part 3 we zoom out — what is VEKTOR actually, why does local-first memory matter, and what does a 34-tool MCP server give you that a simple chatbot doesn't.