Server has 15 tools with consistent schemas and descriptions. Tool names follow verb-noun conventions (list_, create_, delete_, upload_, download_, rename_, get_, set_, directory_*). All tools have descriptions (avg ~70 chars) and input schemas with typed parameters. However, descriptions are terse and lack context on WHEN to use tools or prerequisites. Parameter descriptions are minimal (avg ~45 chars). Output schemas are not documented, tools return dataclass-serialized dicts but the LLM cannot predict structure without reading source. Error handling returns structured responses but lacks recovery guidance. Security checks for read-only mode exist but are not reflected in tool annotations. Overall: competent but missing optimization for LLM reasoning and composition.
Tools (15)
create_directorywriteauthsource verified
Create a new directory in the specified filesystem
create_filesystemwriteauthsource verified
Create a new ADLS2 filesystem (container)
delete_directorydestructiveauthsource verified
Delete a directory from the specified filesystem
delete_filesystemdestructiveauthsource verified
Delete an ADLS2 filesystem
directory_existsread onlyauthsource verified
Check if a directory exists in the specified filesystem
Tool descriptions are terse (avg ~70 chars) and lack context on WHEN to use a tool vs alternatives. Example: 'List all filesystems in the storage account' doesn't explain prerequisites (e.g., 'Requires Azure authentication') or when to call this before other operations.
Output schemas are not documented. Tools return dataclass instances serialized to dicts (e.g., DirectoryResponse with fields path, success, error), but the LLM has no schema reference to predict structure. Without documented outputs, downstream tools cannot safely compose.
Expand tool descriptions to 100-150 chars and include: (1) What it does, (2) WHEN to use it vs similar tools, (3) Key prerequisites. Example: 'List all filesystems in the storage account. Call this first to discover available containers before uploading or modifying files. Requires Azure authentication with read permissions.'
Document output schemas explicitly in tool descriptions or as separate schema references. Example: 'Returns DirectoryResponse with fields: {path: string, exists: bool, error: string}'. This enables LLMs to predict structure and compose downstream calls safely.
Add constraints and validation rules to parameter descriptions. Example: 'upload_file (path to file, max 5GB, relative to UPLOAD_ROOT, auto-overwrite if exists)'. Use enums for categorical params (e.g., if encryption mode is needed).
Enhance error messages with recovery guidance. Replace 'Failed to create directory' with 'Directory already exists at {path}. Try rename_directory to move it or check filesystem permissions. Available filesystems: {list}'. This guides the agent's next step.
Declare tool annotations in the @mcp.tool decorator: readOnlyHint=True for list_*, file_exists, directory_exists; destructiveHint=True for delete_*. This enables agents to reason about safety without parsing descriptions.
Add a search_filesystems(substring: str) tool to enable fuzzy discovery. Similarly, offer directory_search(filesystem, substring) for path discovery. This reduces friction when users provide natural-language names instead of exact identifiers.
Score history
Overall score trend
↓ 45 points across a rubric change (v1 → v2)
10/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-21
F
10
<=2025-11-25
v2
2026-03-09
D
55
-
v1
Check if a file exists in the specified filesystem
get_file_metadataread onlyauthsource verified
Get metadata of a file in the specified filesystem
get_file_propertiesread onlyauthsource verified
Get properties of a file in the specified filesystem
list_filesystemsread onlyauthsource verified
List all filesystems in the storage account
rename_directorywriteauthsource verified
Rename/move a directory within the specified filesystem
rename_filewriteauthsource verified
Rename/move a file within the specified filesystem
Parameter descriptions are minimal and lack constraints. Example: 'upload_file' parameter 'upload_file' has description 'Path to the file to upload (relative to UPLOAD_ROOT)' but does not specify: max file size, allowed extensions, or behavior if file exists. LLMs cannot infer these constraints.
Error handling returns structured responses but lacks recovery guidance. Example: DirectoryResponse includes 'error' field as free-text string. A failed operation returns 'Failed to create directory' with no hint on WHY or what to do next. Pattern requires: 'User not found. Try search_users() with a partial name.'
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) declared. Destructive tools (delete_filesystem, delete_directory) and read-only tools (list_filesystems, file_exists) should be marked with annotations so agents can reason about safety. Currently, the LLM must infer from description text alone.
No pagination support visible. 'directory_get_paths' accepts a recursive flag but does not document result limits or pagination. If a directory contains thousands of items, the response could exhaust context. Should include limit, offset, and total_count fields.
No dry-run or confirmation mechanism for destructive operations. delete_filesystem and delete_directory are irreversible. Pattern requires: support a dry-run step or explicit confirmation to prevent accidental data loss when agents make mistakes.
No natural identifiers or fuzzy matching. Tools require exact filesystem/directory names. If a user says 'upload to my data lake', the agent must know the exact filesystem name. No search or suggestion mechanism for discovering available filesystems by partial name match.
Implement pagination for directory_get_paths: add limit (default 50, max 1000) and offset parameters, return total_count and next_offset in response. This prevents context window exhaustion on large directories.
Add a confirm_delete_filesystem or dry_run parameter to destructive tools. Example: 'delete_filesystem(name, dry_run=True)' returns what would be deleted without actually deleting. LLM can review and confirm.
Batch operations for common loops. Example: add set_file_metadata_batch(filesystem, updates: [{path, key, value}, ...]) for bulk metadata updates instead of sequential calls.
Return chaining IDs in responses. Example: upload_file should return {success, file_path, filesystem, file_size} so agent can immediately call get_file_properties without a lookup.