github / github/copilot-cli

Gemini Flash: one malformed MCP array enum breaks all prompts with HTTP 400

Aperta
#4,835 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

triage
Lingua principale
Shell
Stelle
11.2k
Fork
1.9k
Merge medio
14h 16m
PR unite (30g)
6

Descrizione

Type: Bug

Copilot CLI Version: 1.0.84-5
OS Version: Windows 11 x64
Model: gemini-3.7-flash

Summary

Having a single MCP tool whose schema contains an integer enum directly on an array property causes all requests to Gemini Flash to fail with an opaque HTTP 400 Bad Request error.

The error does not identify which MCP server, tool, or schema property caused the failure.

Steps to Reproduce
  1. Save schema-repro.mjs, gemini-bad.json, and gemini-fixed.json from the Reproducer files section below in the same directory. Node.js must be available.
  2. From that directory, run these native Copilot commands:
copilot --model gemini-3.7-flash --no-custom-instructions --additional-mcp-config "@gemini-bad.json" --available-tools schema_repro-probe_000 --allow-all-tools -p "Reply with exactly OK. Do not call tools."
copilot --model gemini-3.7-flash --no-custom-instructions --additional-mcp-config "@gemini-fixed.json" --available-tools schema_repro-probe_000 --allow-all-tools -p "Reply with exactly OK. Do not call tools."

Both commands advertise exactly one inert tool. There is no SDK dependency or shell helper.

The bad fixture defines:

{
  "type": "object",
  "properties": {
    "levels": {
      "type": ["array", "null"],
      "items": { "type": "integer" },
      "enum": [0, 1, 2, 3, 4, 25]
    }
  }
}
Actual Behaviour

The request immediately fails with:

Execution failed: 400 Bad Request (Request ID: ...)

Moving enum under items:

{
  "type": ["array", "null"],
  "items": {
    "type": "integer",
    "enum": [0, 1, 2, 3, 4, 25]
  }
}

completely resolves the issue and the request succeeds.

Native CLI results:

Input Schema Advertised tools Result
enum on array level 1 HTTP 400
enum under items 1 OK
Expected Behaviour

Copilot CLI should validate tool schemas client-side before sending them to the provider API, and report actionable errors identifying:

  • Server name
  • Tool name
  • Schema property path

For this fixture: schema_repro, probe_000, and /properties/levels/enum.

Failing that, the error message should include the provider's validation details instead of a generic 400 error.

Notes
  • Other schema constructs like plain integer enums ({"type": "integer", "enum": [0, 1]}) and nullable objects work fine.
  • Related to #4623, but specifically caused by array-level enums rather than nullable object unions.
Impact

A single malformed tool schema from any active MCP server silently breaks all model calls to Gemini without any indication of which server or tool is at fault.

Reproducer files
schema-repro.mjs
import { createInterface } from 'node:readline';

const mode = process.argv[2];
const count = Number(process.argv[3] ?? 1);
const allowedModes = ['array-enum-bad', 'array-enum-fixed', 'count'];

if (!allowedModes.includes(mode) ||
    !Number.isInteger(count) ||
    count < 1 ||
    count > 400) {
  throw new Error('Usage: node schema-repro.mjs array-enum-bad|array-enum-fixed|count [1..400]');
}

const levels = { type: ['array', 'null'], items: { type: 'integer' } };
if (mode === 'array-enum-bad') {
  levels.enum = [0, 1, 2, 3, 4, 25];
} else {
  levels.items.enum = [0, 1, 2, 3, 4, 25];
}

const tools = Array.from({ length: mode === 'count' ? count : 1 }, (_, index) => ({
  name: `probe_${String(index).padStart(3, '0')}`,
  description: 'Schema diagnostic only; performs no operation.',
  inputSchema: {
    type: 'object',
    properties: mode === 'count' ? { value: { type: 'string' } } : { levels },
  },
}));

for await (const line of createInterface({ input: process.stdin, crlfDelay: Infinity })) {
  if (!line.trim()) {
    continue;
  }
  const request = JSON.parse(line);
  if (request.id === undefined) {
    continue;
  }

  let result;
  if (request.method === 'initialize') {
    result = {
      protocolVersion: request.params.protocolVersion,
      capabilities: { tools: {} },
      serverInfo: { name: 'schema-repro', version: '1.0.0' },
    };
  } else if (request.method === 'tools/list') {
    result = { tools };
  } else if (request.method === 'tools/call') {
    result = {
      isError: true,
      content: [{ type: 'text', text: 'This diagnostic never executes an operation.' }],
    };
  } else if (request.method === 'ping') {
    result = {};
  } else {
    process.stdout.write(`${JSON.stringify({
      jsonrpc: '2.0',
      id: request.id,
      error: { code: -32601, message: 'Method not found' },
    })}\n`);
    continue;
  }

  process.stdout.write(`${JSON.stringify({ jsonrpc: '2.0', id: request.id, result })}\n`);
}
gemini-bad.json
{
  "mcpServers": {
    "schema_repro": {
      "type": "stdio",
      "command": "node",
      "args": ["schema-repro.mjs", "array-enum-bad"],
      "tools": ["*"]
    }
  }
}
gemini-fixed.json
{
  "mcpServers": {
    "schema_repro": {
      "type": "stdio",
      "command": "node",
      "args": ["schema-repro.mjs", "array-enum-fixed"],
      "tools": ["*"]
    }
  }
}

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con schema-repro.mjs, gemini-bad.json e gemini-fixed.json, quindi esegui i due comandi nativi di Copilot nei passaggi di riproduzione per confermare i casi che falliscono e quelli che passano. Traccia dove vengono gestiti gli schemi degli strumenti MCP prima dell’invio della richiesta Gemini. Il lavoro è completato quando gli enum malformati a livello di array producono un errore utile che nomina schema_repro, probe_000 e /properties/levels/enum, oppure espongono i dettagli di validazione del provider invece di un 400 generico.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
javascript, node.js
Ambito
api, cli
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Attiva
Chiarezza
Abbastanza chiara
Idoneità per principianti
50/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.