arcade-mcp/toolkits/dropbox/arcade_dropbox/tools/files.py
Renato Byrro c1e8fc795a
Dropbox Toolkit (#332)
Basic tools to list items in a folder, search for files / folders, and
download a file content.
2025-03-27 18:34:10 -03:00

47 lines
1.5 KiB
Python

from typing import Annotated, Optional
from arcade.sdk import ToolContext, tool
from arcade.sdk.auth import Dropbox
from arcade.sdk.errors import ToolExecutionError
from arcade_dropbox.constants import Endpoint
from arcade_dropbox.exceptions import DropboxApiError
from arcade_dropbox.utils import parse_dropbox_path, send_dropbox_request
@tool(
requires_auth=Dropbox(
scopes=["files.content.read"],
)
)
async def download_file(
context: ToolContext,
file_path: Annotated[
Optional[str],
"The path of the file to download. E.g. '/AcmeInc/Reports/Q1_2025.txt'. Defaults to None.",
] = None,
file_id: Annotated[
Optional[str],
"The ID of the file to download. E.g. 'id:a4ayc_80_OEAAAAAAAAAYa'. Defaults to None.",
] = None,
) -> Annotated[dict, "Contents of the specified file"]:
"""Downloads the specified file.
Note: either one of `file_path` or `file_id` must be provided.
"""
if not file_path and not file_id:
raise ToolExecutionError("Either `file_path` or `file_id` must be provided.")
if file_path and file_id:
raise ToolExecutionError("Only one of `file_path` or `file_id` can be provided.")
try:
result = await send_dropbox_request(
context.get_auth_token_or_empty(),
endpoint=Endpoint.DOWNLOAD_FILE,
path=parse_dropbox_path(file_path) or file_id,
)
except DropboxApiError as api_error:
return {"error": api_error.message}
return {"file": result}