The Box MCP Server is a Python project that integrates with the Box API to perform various operations such as file search, text extraction, AI-based querying, and data extraction. It leverages the box-sdk-gen
library and provides a set of tools to interact with Box files and folders.
The Model Context Protocol (MCP) is a framework designed to standardize the way models interact with various data sources and services. In this project, MCP is used to facilitate seamless integration with the Box API, enabling efficient and scalable operations on Box files and folders. The Box MCP Server project aims to provide a robust and flexible solution for managing and processing Box data using advanced AI and machine learning techniques.
box_who_am_i
Get your current user information and check connection status.
box_authorize_app_tool
Start the Box application authorization process.
box_search_tool
Search for files in Box.
query
(str): The query to search for.file_extensions
(List[str], optional): File extensions to filter results.where_to_look_for_query
(List[str], optional): Locations to search (e.g. NAME, DESCRIPTION, FILE_CONTENT, COMMENTS, TAG).ancestor_folder_ids
(List[str], optional): List of folder IDs in which to search.box_read_tool
Read the text content of a Box file.
Parameters:
file_id
(str): ID of the file to readReturns: File content
box_ask_ai_tool
Ask Box AI about a file.
Parameters:
file_id
(str): ID of the fileprompt
(str): Question for the AIReturns: AI response
box_hubs_ask_ai_tool
Ask Box AI about a hub. There is currently no way via API to discover a hub ID, so you must know the ID to use this tool. We will fix this in the future.
Parameters:
hubs_id
(str): ID of the hubprompt
(str): Question for the AIReturns: AI response
box_search_folder_by_name
Locate a folder by name.
Parameters:
folder_name
(str): Name of the folderReturns: Folder ID
box_ai_extract_data
Extract data from a file using AI.
Parameters:
file_id
(str): ID of the filefields
(str): Fields to extractReturns: Extracted data in JSON format
box_list_folder_content_by_folder_id
List folder contents.
Parameters:
folder_id
(str): ID of the folderis_recursive
(bool): Whether to list recursivelyReturns: Folder content in JSON format with id, name, type, and description
box_manage_folder_tool
Create, update, or delete folders in Box.
Parameters:
action
(str): Action to perform: "create", "delete", or "update"folder_id
(str, optional): ID of the folder (required for delete/update)name
(str, optional): Folder name (required for create, optional for update)parent_id
(str, optional): Parent folder ID (required for create, optional for update)description
(str, optional): Folder description (optional for update)recursive
(bool, optional): Whether to delete recursively (optional for delete)Returns: Status message with folder details
box_search_folder_by_name_tool
Locate a folder in Box by its name.
folder_name
(str): Name of the folder.box_ai_ask_file_single_tool
Query Box AI regarding a single file.
file_id
(str): The file identifier.prompt
(str): Query or instruction for the AI.ai_agent_id
(str, optional): The ID of the AI agent to use.box_ai_ask_file_multi_tool
Query Box AI using multiple files.
file_ids
(List[str]): List of file IDs.prompt
(str): Instruction for the AI based on the aggregate content.ai_agent_id
(str, optional): The ID of the AI agent to use.box_ai_ask_hub_tool
Ask Box AI about a hub.
hubs_id
(str): ID of the hub.prompt
(str): Question for the AI.ai_agent_id
(str, optional): The ID of the AI agent to use.box_ai_extract_freeform_tool
Extract data from files using AI with a freeform prompt.
file_ids
(List[str]): The IDs of the files to read.prompt
(str): The freeform prompt to guide the AI extraction.ai_agent_id
(str, optional): The ID of the AI agent to use.box_ai_extract_structured_using_fields_tool
Extract structured data from files using AI with specified fields.
file_ids
(List[str]): The IDs of the files to read.fields
(List[dict]): The fields to extract from the files.ai_agent_id
(str, optional): The ID of the AI agent to use.box_ai_extract_structured_using_template_tool
Extract structured data from files using AI with a specified template.
file_ids
(List[str]): The IDs of the files to read.template_key
(str): The ID of the template to use for extraction.ai_agent_id
(str, optional): The ID of the AI agent to use.box_ai_extract_structured_enhanced_using_fields_tool
Extract structured data from files using AI with enhanced processing and specified fields.
file_ids
(List[str]): The IDs of the files to read.fields
(List[dict]): The fields to extract from the files.box_ai_extract_structured_enhanced_using_template_tool
Extract structured data from files using AI with enhanced processing and a template.
file_ids
(List[str]): The IDs of the files to read.template_key
(str): The ID of the template to use for extraction.box_read_tool
Read the text content of a Box file.
file_id
(str): The ID of the file to be read.box_list_folder_content_by_folder_id
List a folder's content using its ID.
folder_id
(str): Folder ID.is_recursive
(bool, optional): Whether to list the content recursively.box_manage_folder_tool
Create, update, or delete a folder in Box.
action
(str): Action to perform: "create", "delete", or "update".folder_id
(str, optional): Folder ID (required for delete and update).name
(str, optional): Folder name (required for create, optional for update).parent_id
(str, optional): Parent folder ID (defaults to "0" for root).description
(str, optional): Description for the folder (for update).recursive
(bool, optional): For recursive delete.box_upload_file_from_path_tool
Upload a file to Box from a local filesystem path.
file_path
(str): Local file path.folder_id
(str, optional): Destination folder ID (defaults to "0").new_file_name
(str, optional): New file name (if not provided, uses the original file name).box_upload_file_from_content_tool
Upload content as a file to Box.
content
(str | bytes): Content to upload (text or binary).file_name
(str): The name to assign the file.folder_id
(str, optional): Destination folder ID (defaults to "0").is_base64
(bool, optional): Indicates if the provided content is base64 encoded.box_download_file_tool
Download a file from Box.
file_id
(str): The ID of the file to download.save_file
(bool, optional): Whether to save the file locally.save_path
(str, optional): The local path where the file should be saved.box_metadata_template_create_tool
Create a metadata template.
display_name
(str): The display name of the metadata template.fields
(List[Dict]): A list of fields to include in the template.template_key
(str, optional): An optional key for the metadata template.box_metadata_template_get_by_key_tool
Retrieve a metadata template by its key.
template_name
(str): The key of the metadata template to retrieve.box_metadata_template_get_by_name_tool
Retrieve a metadata template by its name.
template_name
(str): The name of the metadata template to retrieve.box_metadata_set_instance_on_file_tool
Set a metadata instance on a file.
template_key
(str): The key of the metadata template.file_id
(str): The ID of the file to set the metadata on.metadata
(dict): The metadata to set.box_metadata_get_instance_on_file_tool
Get a metadata instance on a file.
file_id
(str): The ID of the file to get the metadata from.template_key
(str): The key of the metadata template.box_metadata_update_instance_on_file_tool
Update a metadata instance on a file.
file_id
(str): The ID of the file to update the metadata on.template_key
(str): The key of the metadata template.metadata
(dict): The metadata to update.remove_non_included_data
(bool, optional): If True, remove data from fields not included in the metadata.box_metadata_delete_instance_on_file_tool
Delete a metadata instance on a file.
file_id
(str): The ID of the file to delete the metadata from.template_key
(str): The key of the metadata template.box_docgen_create_batch_tool
Generate documents using a Box Doc Gen template and a local JSON file.
file_id
(str): Template file ID.destination_folder_id
(str): Folder ID where generated documents should be stored.user_input_file_path
(str): Path to a JSON file with input data.output_type
(str, optional): Output format (default is "pdf").box_docgen_get_job_tool
Fetch a single Doc Gen job by its ID.
job_id
(str): The job identifier.box_docgen_list_jobs_tool
List all Doc Gen jobs associated with the current user.
marker
(str | None, optional): Pagination marker.limit
(int | None, optional): Maximum number of jobs to return.box_docgen_list_jobs_by_batch_tool
List Doc Gen jobs belonging to a specific batch.
batch_id
(str): The batch identifier.marker
(str | None, optional): Pagination marker.limit
(int | None, optional): Maximum number of jobs to return.box_docgen_template_create_tool
Mark a file as a Box Doc Gen template.
file_id
(str): File ID to mark as a template.box_docgen_template_list_tool
List all available Box Doc Gen templates.
marker
(str | None, optional): Pagination marker.limit
(int | None, optional): Maximum number of templates to list.box_docgen_template_delete_tool
Remove the Doc Gen template marking from a file.
template_id
(str): The template identifier.box_docgen_template_get_by_id_tool
Retrieve details of a specific Doc Gen template.
template_id
(str): The template identifier.box_docgen_template_list_tags_tool
List all tags associated with a Box Doc Gen template.
template_id
(str): The template ID.template_version_id
(str | None, optional): Specific version ID.marker
(str | None, optional): Pagination marker.limit
(int | None, optional): Maximum number of tags to return.box_docgen_template_list_jobs_tool
List all Doc Gen jobs that used a specific template.
template_id
(str): The template identifier.marker
(str | None, optional): Pagination marker.limit
(int | None, optional): Maximum number of jobs to list.Clone the repository:
git clone https://github.com/box-community/mcp-server-box.git
cd mcp-server-box
Install uv
if not installed yet:
2.1 MacOS+Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
2.2 Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Create and set up our project:
3.1 MacOS+Linux
# Create virtual environment and activate it
uv venv
source .venv/bin/activate
# Lock the dependencies
uv lock
3.2 Windows
# Create virtual environment and activate it
uv venv
.venv\Scripts\activate
# Lock the dependencies
uv lock
Create a .env
file in the root directory and add your Box API credentials:
BOX_CLIENT_ID=your_client_id
BOX_CLIENT_SECRET=your_client_secret
The MCP server supports four transport methods: stdio (default), SSE (Server-Sent Events), HTTP (StreamableHttp), and FastAPI.
uv --directory /path/to/mcp-server-box run src/mcp_server_box.py
Edit your claude_desktop_config.json
:
code ~/Library/Application\ Support/Claude/claude_desktop_config.json
Add the configuration:
{
"mcpServers": {
"mcp-server-box": {
"command": "uv",
"args": [
"--directory",
"/path/to/mcp-server-box",
"run",
"src/mcp_server_box.py"
]
}
}
}
Restart Claude if it is running.
Open your IDE with Cursor.
In settings, select Cursor settings
.
In the left nav, select MCP
.
In the top-left, click Add new global MCP server
.
Paste the following JSON (update for your local values):
{
"mcpServers": {
"box": {
"command": "uv",
"args": [
"--directory",
"/path/to/mcp-server-box",
"run",
"src/mcp_server_box.py"
]
}
}
}
Save and close the mcp.json file, and restart if necessary.
The project includes comprehensive test suites for both unit tests and integration tests to verify Box API functionality.
The project includes two types of tests:
Unit Tests - Mock-based tests that don't require Box API access:
test_box_tools_ai.py
- Tests for AI functionality toolstest_box_tools_generic.py
- Tests for generic Box operationstest_box_tools_metadata.py
- Tests for metadata operationstest_box_tools_search.py
- Tests for search functionalitytest_server_context.py
- Tests for server context managementtest_mcp_server_box.py
- Tests for MCP server functionalityIntegration Tests - Tests that require actual Box API access (with _orig
suffix):
test_box_tools_files_orig.py
test_box_tools_metadata_orig.py
test_box_tools_search_orig.py
Unit tests use mocks and don't require Box API credentials:
# Run all unit tests
pytest tests/test_box_tools_*.py tests/test_server_context.py tests/test_mcp_server_box.py
# Run specific unit test files
pytest tests/test_box_tools_ai.py
pytest tests/test_box_tools_generic.py
pytest tests/test_box_tools_metadata.py
# Run with coverage
pytest --cov=src tests/
Integration tests require Box API credentials and valid file/folder IDs in your Box account:
.env
file_orig.py
) uses hardcoded IDs for Box files and folderstests/test_box_tools_files_orig.py
, replace "1728677291168"
with a valid file ID# Run integration tests
pytest tests/test_*_orig.py
# Run specific integration test
pytest tests/test_box_tools_files_orig.py
# Run all tests (unit + integration)
pytest
# Run with detailed output
pytest -v
# Run with print statements
pytest -v -s
The test suite uses:
pytest
- Test frameworkpytest-asyncio
- For async test supportpytest-cov
- For coverage reportingunittest.mock
- For mocking external dependenciesIf you receive the error Error: spawn uv ENOENT
on MacOS when running the MCP server with Claude Desktop, you may:
Remove uv and reinstall it with Homebrew: brew install uv
Or provide the full path to the uv executable in your configuration:
/Users/shurrey/.local/bin/uv --directory /Users/shurrey/local/mcp-server-box run src/mcp_server_box.py
[!NOTE] Make sure your Box API credentials in
.env
are correctly set.