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>
59 lines
1011 B
Python
59 lines
1011 B
Python
# 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
|