{"record":{"id":"7cf718ed1b368b75","repo":"github/github-mcp-server","slug":"field-filters-must-be-an-array","errorCode":null,"errorMessage":"field_filters must be an array","messagePattern":"field_filters must be an array","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/github/issues.go","lineNumber":3077,"sourceCode":"\traw, ok := args[\"field_filters\"]\n\tif !ok {\n\t\treturn nil, nil\n\t}\n\n\tvar entries []map[string]any\n\tswitch v := raw.(type) {\n\tcase []any:\n\t\tfor _, f := range v {\n\t\t\tentry, ok := f.(map[string]any)\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"each field_filters entry must be an object\")\n\t\t\t}\n\t\t\tentries = append(entries, entry)\n\t\t}\n\tcase []map[string]any:\n\t\tentries = v\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"field_filters must be an array\")\n\t}\n\n\tfilters := make([]rawFieldFilter, 0, len(entries))\n\tfor _, entry := range entries {\n\t\tfieldName, err := RequiredParam[string](entry, \"field_name\")\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"field_filters entry: %s\", err.Error())\n\t\t}\n\t\tvalue, err := RequiredParam[string](entry, \"value\")\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"field_filters entry %q: %s\", fieldName, err.Error())\n\t\t}\n\t\tfilters = append(filters, rawFieldFilter{Name: fieldName, Value: value})\n\t}\n\treturn filters, nil\n}\n\n// resolveFieldFilters matches each raw filter against a known field definition and","sourceCodeStart":3059,"sourceCodeEnd":3095,"githubUrl":"https://github.com/github/github-mcp-server/blob/0ea1f775a7c73eff1bd2e25904d01136756bbfe2/pkg/github/issues.go#L3059-L3095","documentation":"parseRawFieldFilters rejects a field_filters argument whose top-level value is neither []any nor []map[string]any — i.e. not a JSON array. Only the array forms are accepted; anything else (string, object, number) is a caller error.","triggerScenarios":"Passing field_filters as a single object ({\"field_name\":...}) or as a delimited string (\"Status=Bug\") instead of an array of objects.","commonSituations":"An LLM wraps a single filter in braces instead of brackets; a script serializes a map where a list was expected.","solutions":["Wrap filters in a JSON array: field_filters must be a list of objects","Pass an empty array or omit field_filters entirely when no field filtering is wanted"],"exampleFix":"// before\n{\"field_filters\":{\"field_name\":\"Status\",\"value\":\"Bug\"}}\n// after\n{\"field_filters\":[{\"field_name\":\"Status\",\"value\":\"Bug\"}]}","handlingStrategy":"type-guard","validationCode":"func normalizeFieldFilters(v any) ([]any, error) {\n\tswitch t := v.(type) {\n\tcase []any:\n\t\treturn t, nil\n\tcase map[string]any: // single entry -> wrap\n\t\treturn []any{t}, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"field_filters must be an array of objects\")\n\t}\n}","typeGuard":"func isFieldFiltersArray(v any) bool {\n\t_, ok1 := v.([]any)\n\t_, ok2 := v.([]map[string]any)\n\treturn ok1 || ok2\n}","tryCatchPattern":null,"preventionTips":["Omit field_filters when unused rather than sending an empty non-array value","Serialize from a typed slice of structs so JSON shape is guaranteed"],"tags":["validation","field-filters","issues","input-shape"],"backgroundTag":null,"analyzedSha":"0ea1f775a7c73eff1bd2e25904d01136756bbfe2","analyzedAt":"2026-08-15T18:10:19.804Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}