Filesystem MCP server tool surface audit

A96/100composite score
Token footprint
~2,797
Tools
14
Findings
24
Scanned

Engine mcp-surface-lint@0.3.3 · reported as secure-filesystem-server v0.2.0

The Filesystem MCP server exposes 14 tools whose definitions cost approximately 2,797 tokens in every single conversation, whether or not any of them is ever called. Against the 19 static rules in the catalogue it scores 96 out of 100 — grade A — raising 24 scored findings in 2 of the six categories.

Its strongest category is surface at 100/100; the weakest is design at 84/100. It is catalogued here under Developer Tools, alongside other servers agents reach for in the same kind of work.

Token footprint

At 2,797 tokens the surface takes about 1% of a 200,000-token context window, and it takes it on every turn — this is rent, not a one-off cost. That averages 200 tokens per tool definition, counted with the o200k_base encoding.

That lands exactly on the Developer Tools median of 2,797 tokens.

surface100
naming100
descriptions100
schemas89
annotations100
design84

Findings

Every finding below names the rule behind it and the tool it fired on.

The largest group is `schemas/param-desc-missing`, with 18 findings. Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes. On this surface it fires on `read_file`, `read_text_file` and `read_media_file`, among 9 others.

4 findings come from `design/list-no-limit`. A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less. On this surface it fires on `list_directory`, `list_directory_with_sizes` and `search_files`, among 1 others.

`design/overlap-cluster` contributes one finding. Tools whose descriptions substantially overlap force the model to pick between near-synonyms — the classic cause of wrong-tool calls. Clusters are usually one tool wearing several names; consolidate with include-flags or a mode parameter. It applies to the surface as a whole rather than to one tool.

Filesystem's surface raises one further rule — `schemas/loose` — listed in full below.

warn 24 findings

Findings that measurably degrade tool selection.

design/list-no-limitlist_directory
"list_directory" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_directory_with_sizes
"list_directory_with_sizes" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

"search_files" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

design/list-no-limitlist_allowed_directories
"list_allowed_directories" implies list/search output but has no limit or pagination parameter — result size is unbounded.

A list/search tool with no limit or pagination parameter can dump an unbounded payload into the context window. The caller must be able to ask for less.

2 tools have overlapping descriptions (trigram Jaccard up to 0.86) — consolidation candidates.

Tools whose descriptions substantially overlap force the model to pick between near-synonyms — the classic cause of wrong-tool calls. Clusters are usually one tool wearing several names; consolidate with include-flags or a mode parameter.

list_directory, list_directory_with_sizes

schemas/looselist_allowed_directories
Bare "type: object" with no properties at /inputSchema — the model has nothing to go on.

Loose schemas (bare objects, untyped arrays, open additionalProperties) turn schema validation off exactly where the model is most likely to hallucinate argument shapes.

Parameter "path" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "path" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "path" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "path" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "content" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "path" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "edits" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "path" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "path" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

schemas/param-desc-missinglist_directory_with_sizes
Parameter "path" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "path" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "excludePatterns" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "source" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "destination" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "path" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "pattern" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "excludePatterns" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

Parameter "path" has no description.

Undescribed parameters get filled by guesswork. Every property the model must populate deserves a sentence saying what it means and what shape it takes.

What this surface does well

4 of the six categories come through clean: surface, naming, descriptions and annotations. In practice that means the surface stays inside a sensible tool and token budget, the tool names follow one convention end to end, every tool carries a description long enough to disambiguate it and read and write operations are machine-distinguishable before a client runs them.

Tool inventory

`read_media_file` is the most expensive definition at 288 tokens — about 10% of the whole surface — against 147 for `list_allowed_directories`. Every tool carries a description, ranging from 85 to 457 characters.

All 14 declare annotations, so a client can tell a read from a write before running one. Input schemas average 2 top-level parameters and nest 3 levels deep at their worst, with 1 tool taking no input at all.

All 14 tools as published, heaviest first. Token counts use the o200k_base encoding and are approximate.

Every tool on this surface with its token cost and schema shape.
ToolTokensDescriptionParamsRequiredDepthAnnotations
read_media_file288234 chars111yes
read_text_file254457 chars311yes
edit_file243185 chars323yes
search_files217424 chars322yes
read_multiple_files209324 chars112yes
directory_tree200360 chars212yes
list_directory_with_sizes199323 chars211yes
move_file190325 chars221yes
read_file17785 chars311yes
create_directory175310 chars111yes
write_file172228 chars221yes
list_directory164309 chars111yes
get_file_info160296 chars111yes
list_allowed_directories147248 chars000yes

How this compares

Filesystem ranks 3 of 5 scanned Developer Tools servers, exactly on the category median of 96.

The closest comparisons in this directory are Playwright, Chrome DevTools and Context7, which sit nearest on score and face the same kind of surface-design pressure.

Category
Developer Tools
Rank in category
3
Category median score
96
Category median tokens
2,797
Want this surface fixed, not just measured?

A fix plan turns these findings into an ordered set of changes with the token saving of each one.

Get a fix plan

This page is a static analysis of Filesystem's published tools/list surface on the date shown. It is not a security review, a performance benchmark, or a judgement of the product behind the surface. Read how the score is computed, or browse every audited server.