The tools array on /api/chat is only meaningful if the model's template knows how to render tool definitions and how to parse a tool call back out of the generated text. Ollama does not error when you send tools to a model whose template lacks that support. The request succeeds and the model answers in prose, so an agent loop that waits for a tool_calls field simply never gets one.
Check support by running ollama show on the tag and reading the template and capabilities rather than assuming a model family behaves the way its hosted counterpart does; quantized community rebuilds sometimes ship a template that dropped tool handling.
The same template dependency applies to structured output. The format field accepts a JSON schema and constrains decoding, which is more reliable than asking for JSON in the prompt, but small local models still produce schema-valid output that is semantically wrong more often than hosted models do. Validate the parsed object against your own rules, not just the schema.