feat(files-mcp): business wrappers and Pydantic request models

Adds files_mcp/tools/requests.py with 9 Pydantic body models (one per
tool, since fastapi-mcp passes args as JSON body) and
files_mcp/tools/files.py with 9 thin wrappers that call path_guard
then fs_ops and return model_dump() form. Adds tests/unit/test_files_tool.py
covering happy path, sandbox escape, and KeyError/FileExistsError
propagation for each wrapper.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Claude
2026-06-30 17:57:02 +08:00
co-authored by Claude Fable 5
parent 01f5e54a66
commit 36da3f7024
4 changed files with 255 additions and 0 deletions
+58
View File
@@ -0,0 +1,58 @@
# coding=utf-8
"""
@Time :2026/6/30
@Author :tao.chen
Pydantic body models for the FastAPI route layer. fastapi-mcp passes
tool args as a JSON body, so every tool needs a model (even single-arg
ones) — dict-typed query params would 422.
"""
from pydantic import BaseModel, Field
class CreateFileRequest(BaseModel):
path: str
content: str
overwrite: bool = False
class ReadFileRequest(BaseModel):
path: str
class UpdateFileRequest(BaseModel):
path: str
content: str
class DeleteFileRequest(BaseModel):
path: str
recursive: bool = False
class ListDirRequest(BaseModel):
path: str
recursive: bool = False
max_depth: int = Field(default=1, ge=0)
class StatRequest(BaseModel):
path: str
class SearchRequest(BaseModel):
path: str
pattern: str
recursive: bool = True
class MoveRequest(BaseModel):
src: str
dst: str
overwrite: bool = False
class CopyRequest(BaseModel):
src: str
dst: str
overwrite: bool = False