Grok 4.5: 351 tools fail with HTTP 400 instead of reporting the 350-tool limit
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 50/100
Direção de pesquisa
Comece executando os dois comandos nativos do Copilot com grok-350.json e grok-351.json, usando schema-repro.mjs para confirmar as contagens isoladas de ferramentas. Rastreie o caminho da solicitação CLI que constrói a lista de ferramentas anunciada e trata a resposta do Grok; considera-se concluído quando 350 ferramentas continuam tendo sucesso e 351 produz um erro de limite acionável antes da solicitação HTTP.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Type: Bug
Copilot CLI Version: 1.0.84-5
OS Version: Windows 11 x64
Model: grok-4.5
Summary
When the total number of advertised tools exceeds 350, requests to grok-4.5 fail with HTTP 400 Bad Request.
Copilot CLI does not enforce or report the tool count limit before making the API call.
Steps to Reproduce
- Use a test MCP configuration with no other user/plugin MCP servers enabled, so they do not add to the count.
- Save
schema-repro.mjs,grok-350.json, andgrok-351.jsonfrom the Reproducer files section below in the same directory. Node.js must be available. - From that directory, run these native Copilot commands:
copilot --model grok-4.5 --no-custom-instructions --disable-builtin-mcps --disable-mcp-server computer-use --additional-mcp-config "@grok-350.json" --available-tools "mcp:*" --allow-all-tools -p "Reply with exactly OK. Do not call tools."
copilot --model grok-4.5 --no-custom-instructions --disable-builtin-mcps --disable-mcp-server computer-use --additional-mcp-config "@grok-351.json" --available-tools "mcp:*" --allow-all-tools -p "Reply with exactly OK. Do not call tools."
The fixture tools have unique names and identical simple schemas. mcp:* excludes native CLI tools; the MCP-only precondition isolates the fixture's 350/351 count. There is no SDK dependency or shell helper.
Actual Behaviour
With 350 tools:
- Request succeeds with exit code 0.
With 351 tools:
- Request immediately fails with:
Execution failed: 400 Bad Request (Request ID: ...)
Comparison:
| Tool Count | Model | Result |
|---|---|---|
| 350 tools | grok-4.5 | OK (exit 0) |
| 351 tools | grok-4.5 | HTTP 400 (exit 1) |
The debug tool-surface records confirm exactly 350 and 351 advertised tools for these two runs.
Expected Behaviour
Copilot CLI should track provider-specific limits:
- Enforce a tool count budget before sending the request.
- If tool count exceeds 350 for Grok, report an actionable error explaining that the active tool count (351) exceeds Grok's maximum limit of 350 tools.
- Alternatively, defer tools via tool search rather than sending the entire catalog upfront.
Notes
- Tested with inert synthetic tools with identical simple schemas (
{"type":"object","properties":{"value":{"type":"string"}}}). - The issue is purely triggered by the total number of advertised tools, regardless of whether tools are actually invoked by the model.
Impact
Users with multiple MCP servers easily exceed 350 tools in aggregate (native + MCP tools), causing Grok to become completely unusable across the entire session with an unhelpful 400 error.
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`);
}
grok-350.json
{
"mcpServers": {
"schema_repro": {
"type": "stdio",
"command": "node",
"args": ["schema-repro.mjs", "count", "350"],
"tools": ["*"]
}
}
}
grok-351.json
{
"mcpServers": {
"schema_repro": {
"type": "stdio",
"command": "node",
"args": ["schema-repro.mjs", "count", "351"],
"tools": ["*"]
}
}
}
- Linguagem predominante
- Shell
- Estrelas
- 11.2k
- Forks
- 1.9k
- Merge médio
- 17h 6min
- PRs com merge (30d)
- 5
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de github/copilot-cli
-
area:sessions
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
github/copilot-cli#4996 ·
Mantenedores costumam responder em até 1 dia
-
triage
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 88/100
github/copilot-cli#4963 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 75/100
github/copilot-cli#4932 ·
Mantenedores costumam responder em até 1 dia
-
triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
github/copilot-cli#4909 ·
Mantenedores costumam responder em até 1 dia
-
triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
github/copilot-cli#4906 ·
Mantenedores costumam responder em até 1 dia
Todas as issues de github/copilot-cli
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
quickemu-project/quickemu#1960 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
-
review-drift
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
oxidecomputer/hansei#14 ·
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 90/100
sclorg/s2i-ruby-container#656 ·
-
[BUG] `mo clean` deletes DiagnosticReports directory and breaks crash reportingTalvez já em andamento @md786-dotcom assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
Mantenedores costumam responder em até 1 dia