Try this first

Give Rover these two tools at the same time:

{
    "name": "read_file",
    "description": "Read a file.",
    "input_schema": {
        "type": "object",
        "properties": {"path": {"type": "string"}},
        "required": ["path"],
    },
},
{
    "name": "get_file_info",
    "description": "Get information about a file.",
    "input_schema": {
        "type": "object",
        "properties": {"path": {"type": "string"}},
        "required": ["path"],
    },
},

Now ask: “How big is notes.txt?”

Then ask: “What does notes.txt say?”

Watch which tool it picks each time. It will get at least one wrong, and it will look
arbitrary.

What you just did

Read the two descriptions as the model does — as the only information available.

“Read a file” and “Get information about a file”. Is the contents of a file information about
the file? Obviously yes. Is size something you get by reading? Arguably.

The boundary between these two tools does not exist in the text. The model is not confused.
You were ambiguous, and it is guessing.

The fix is a boundary, not a warning

The instinct is to add emphasis: "Get information about a file. NOT the contents." That
helps a little, and it is the wrong shape of fix.

Say what each one is for, and let the boundary fall out:

{
    "name": "read_file",
    "description": (
        "Return the full text contents of a file. "
        "Use this when you need to know what is written inside the file."
    ),
    ...
},
{
    "name": "get_file_info",
    "description": (
        "Return a file's size in bytes and when it was last modified. "
        "Does not return the file's contents. "
        "Use this to check whether a file is large before reading it."
    ),
    ...
},

Now the two questions have obvious answers, and one description even tells the model how the
tools work together.

The three causes of wrong tool choice

When a model picks badly, it is nearly always one of these:

Symptom Cause Fix
Picks between two similar tools inconsistently Overlapping descriptions Name the boundary in both
Ignores a tool that obviously applies No trigger sentence Add “Use this when…”
Calls a tool constantly, including when useless Emphasis language, or too-broad description Remove the shouting, narrow the scope
Sends wrong argument types Missing property descriptions, or no enum Describe every property

Note what is not on that list: “the model is not good enough”. That is occasionally true. It
is not the first thing to check, and it is the only item on the list you cannot fix.

When you have too many tools

Two tools with a fuzzy boundary is a writing problem. Twenty tools with fuzzy boundaries is a
design problem.

If two tools take the same arguments and return similar things, they are usually one tool
with a parameter. Fewer, clearly bounded tools beat a large menu of near-duplicates — for the
model and for you.

If you cannot state the boundary between two tools in one sentence, the model cannot infer
it from your descriptions.

Try this before the next lesson

Write descriptions for list_files and search_files that make the boundary unambiguous.
Then ask Rover: “Which file mentions the plumber?”

It should search, not list. If it lists, your search description has no trigger sentence.