Skip to main content
Glama
MCP Server Box

MCP Server Box

Box MCP Server

WARNING

This repository is discontinued and no longer maintained. Box now provides an officially supported hosted MCP server with the best experience and full functionality. Please migrate to the hosted MCP server: Set up the Box MCP Server →

Quick Start

Clone the repository:

git clone https://github.com/box-community/mcp-server-box.git
cd mcp-server-box

Homebrew (macOS)

brew install uv

WinGet (Windows)

winget install --id=astral-sh.uv  -e

On macOS and Linux

curl -LsSf https://astral.sh/uv/install.sh | sh

On Windows

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Set up the virtual environment and install dependencies:

uv sync

Set environment variables:

Set the following environment variables for Box authentication in a .env file or your system environment.

For comprehensive authentication configuration options, see the Authentication Guide.

Using OAuth2.0 with a Box App

BOX_CLIENT_ID = YOUR_CLIENT_ID
BOX_CLIENT_SECRET = YOUR_CLIENT_SECRET
BOX_REDIRECT_URL = http://localhost:8000/callback

# MCP Server Authentication (for HTTP transports)
BOX_MCP_SERVER_AUTH_TOKEN = YOUR_BOX_MCP_SERVER_AUTH_TOKEN
OAUTH_PROTECTED_RESOURCES_CONFIG_FILE = .oauth-protected-resource.json

Note:

  • The BOX_MCP_SERVER_AUTH_TOKEN is used to authenticate the MCP client to the MCP server when using --mcp-auth-type=token (independent of Box authentication)

Run the MCP server in STDIO mode:

uv run src/mcp_server_box.py

Related MCP server: Document Q&A MCP Server

Box Community MCP Server Tools

Below is a summary of the available tools:

Tools available

Description

box_tools_ai

AI-powered file and hub queries

box_tools_collaboration

Manage file/folder collaborations

box_tools_docgen

Document generation and template management

box_tools_files

File operations (read, upload, download)

box_tools_folders

Folder operations (list, create, delete, update)

box_tools_generic

Generic Box API utilities

box_tools_groups

Group management and queries

box_tools_metadata

Metadata template and instance management

box_tools_search

Search files and folders

box_tools_shared_links

Shared link management for files/folders/web-links

box_tools_tasks

Task and task assignment management

box_tools_users

User management and queries

box_tools_web_link

Web link creation and management

Box Community MCP Server Operations Details

Command line interface parameters

To run the MCP server with specific configurations, you can use the following command line parameters:

uv run src/mcp_server_box.py --help
usage: mcp_server_box.py [-h] [--transport {stdio,sse,http}] [--host HOST] [--port PORT] [--mcp-auth-type {oauth,token,none}] [--box-auth-type {oauth,ccg,jwt,mcp_client}]

Box Community MCP Server

options:
  -h, --help            show this help message and exit
  --transport {stdio,sse,http}
                        Transport type (default: stdio)
  --host HOST           Host for SSE/HTTP transport (default: localhost)
  --port PORT           Port for SSE/HTTP transport (default: 8005)
  --mcp-auth-type {oauth,token,none}
                        Authentication type for MCP server (default: token)
  --box-auth-type {oauth,ccg,jwt,mcp_client}
                        Authentication type for Box API (default: oauth)

For detailed information about authentication types, configurations, and use cases, see the Authentication Guide.

Claude Desktop Configuration

STDIO mode

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.

HTTP Mode

Assuming your MCP server is running on https://mcp.myserver.com/mcp

  1. Go to Claude -> Settings -> Connectors

  2. Select Add custom connector

  3. Configurations:

    1. Give it a name

    2. Enter the URL e.g. https://mcp.myserver.com/mcp

    3. Optionally enter the client id and client secret

  4. Click add

  5. Click connect. The OAuth flow should start. Complete the flow

  6. Back in Claude, click Configure. You should see all the tools available.

Available Tools

117 tools
box_ai_agent_info_by_id_toolC

Get information about a specific AI agent by ID. Args: ctx (Context): The context object containing the request and lifespan context. ai_agent_id (str): The ID of the AI agent to retrieve information for. Returns: dict: A dictionary containing the AI agent information.

Inputs: ai_agent_id (required).

box_ai_agents_list_toolC

List available AI agents in Box. Args: ctx (Context): The context object containing the request and lifespan context. limit (Optional[int]): Maximum number of items to return. Defaults to 1000. Returns: dict: A dictionary containing the list of AI agents.

Inputs: limit.

box_ai_agents_search_by_name_toolC

Search for AI agents in Box by name. Args: ctx (Context): The context object containing the request and lifespan context. name (str): The name filter to search for AI agents. limit (Optional[int]): Maximum number of items to return. Defaults to 1000. Returns: dict: A dictionary containing the list of matching AI agents.

Inputs: name (required), limit.

box_ai_ask_file_multi_toolC

Ask a question about multiple files using AI. Args: ctx (Context): The context object containing the request and lifespan context. file_ids (List[str]): A list of file IDs to ask about, example: ["1234567890", "0987654321"]. prompt (str): The question to ask. ai_agent_id (Optional[str]): The ID of the AI agent to use for the question. If None, the default AI agent will be used. Returns: dict: The AI response containing the answers to the questions for each file.

Inputs: file_ids (required), prompt (required), ai_agent_id.

box_ai_ask_file_single_toolC

Ask a question about a file using AI. Args: ctx (Context): The context object containing the request and lifespan context. file_id (str): The ID of the file to ask about, example: "1234567890". prompt (str): The question to ask. ai_agent_id (Optional[str]): The ID of the AI agent to use for the question. If None, the default AI agent will be used. Returns: dict: The AI response containing the answer to the question.

Inputs: file_id (required), prompt (required), ai_agent_id.

box_ai_ask_hub_toolB

Ask a question about a hub using AI. Args: ctx (Context): The context object containing the request and lifespan context. hub_id (str): The ID of the hub to ask about, example: "1234567890". prompt (str): The question to ask. ai_agent_id (Optional[str]): The ID of the AI agent to use for the question. If None, the default AI agent will be used. Returns: dict: The AI response containing the answer to the question.

Inputs: hub_id (required), prompt (required), ai_agent_id.

box_ai_extract_freeform_toolA

Extract or analyze information from one or more files using a natural language prompt and return a SINGLE response.

This tool provides maximum flexibility for data extraction and analysis. Instead of defining structured fields, you simply ask Box AI a question or give it instructions in natural language. When multiple files are provided, Box AI analyzes ALL files together to provide ONE comprehensive answer.

This is the most flexible extraction tool but provides unstructured results. Use structured extraction tools (template-based or field-based) when you need consistent, machine-readable output.

Use cases:

  • Single file analysis: "What are the key terms of this contract?"

  • Multiple files analysis: "Compare the pricing across these three proposals and summarize differences"

  • Complex questions: "Based on these financial documents, what are the main risk factors?"

  • Summarization: "Provide a 3-paragraph summary of the main points across these meeting notes"

NOT for batch processing: If you need to ask the same question about multiple files separately (e.g., "summarize each report individually"), call this tool once per file in a loop.

Args: ctx (Context): The context object containing the request and lifespan context. file_ids (List[str]): A list of file IDs to extract information from, example: ["1234567890", "0987654321"]. prompt (str): The fields to extract. ai_agent_id (Optional[str]): The ID of the AI agent to use for the extraction. If None, the default AI agent will be used. Returns: dict: The AI response containing the extracted information.

Inputs: file_ids (required), prompt (required), ai_agent_id.

box_ai_extract_structured_enhanced_using_fields_toolA

Extract structured data from one or more files using custom fields and return a SINGLE data instance (Enhanced version).

This enhanced tool analyzes the provided file(s) and extracts information based on custom field definitions you provide. When multiple files are provided, Box AI combines information from ALL files to create ONE complete data record.

Enhanced features:

  • Uses advanced AI models (e.g., Google Gemini) for improved accuracy

  • Better handling of complex document layouts and image quality

  • More robust extraction for handwritten or low-quality scans

  • Improved understanding of complex field relationships

Unlike template-based extraction, this tool allows you to define fields on-the-fly without creating a metadata template in Box first. This is useful for ad-hoc data extraction or when you need fields that don't match any existing template.

Use cases:

  • Single file: Extract custom fields from one document

  • Multiple files: Combine data from multiple sources into one data instance (e.g., extract patient info from medical records, lab results, and prescription images)

NOT for batch processing: If you need to extract data from multiple files as separate instances, call this tool once per file in a loop.

Args: ctx (Context): The context object containing the request and lifespan context. file_ids (List[str]): A list of file IDs to extract information from, example: ["1234567890", "0987654321"]. fields (List[dict[str, Any]]): The fields to extract from the files. Returns: dict: The AI response containing the extracted information.

Inputs: file_ids (required), fields (required).

box_ai_extract_structured_enhanced_using_template_toolA

Extract structured data from one or more files and return a SINGLE metadata instance (Enhanced version).

This enhanced tool analyzes the provided file(s) and extracts information to populate a single metadata instance based on the specified template. When multiple files are provided, Box AI combines information from ALL files to create ONE complete metadata record.

Enhanced features:

  • Uses advanced AI models (e.g., Google Gemini) for improved accuracy

  • Better handling of complex document layouts and image quality

  • More robust extraction for handwritten or low-quality scans

Use cases:

  • Single file: Extract metadata from one receipt, invoice, or document

  • Multiple files: Combine data from multiple sources into one metadata instance (e.g., extract project info from a proposal PDF, budget spreadsheet, and timeline image)

NOT for batch processing: If you need to extract metadata from multiple files as separate instances, call this tool once per file in a loop.

Args: ctx (Context): The context object containing the request and lifespan context. file_ids (List[str]): The IDs of the files to read. template_key (str): The key of the metadata template to use for the extraction. Example: "insurance_policy_template". Returns: dict: The extracted structured data in a json string format.

Inputs: file_ids (required), template_key (required).

box_ai_extract_structured_using_fields_toolA

Extract structured data from one or more files using custom fields and return a SINGLE data instance.

This tool analyzes the provided file(s) and extracts information based on custom field definitions you provide. When multiple files are provided, Box AI combines information from ALL files to create ONE complete data record.

Unlike template-based extraction, this tool allows you to define fields on-the-fly without creating a metadata template in Box first. This is useful for ad-hoc data extraction or when you need fields that don't match any existing template.

Use cases:

  • Single file: Extract custom fields from one document (e.g., extract "contract_value" and "signing_date" from a contract)

  • Multiple files: Combine data from multiple sources into one data instance (e.g., extract "total_project_cost" from both a proposal and budget document)

NOT for batch processing: If you need to extract data from multiple files as separate instances, call this tool once per file in a loop.

Args: ctx (Context): The context object containing the request and lifespan context. file_ids (List[str]): The IDs of the files to read. fields (List[dict[str, Any]]): The fields to extract from the files. example:[ { "type": "string", "key": "name", "displayName": "Name", "description": "Policyholder Name", }, { "type": "string", "key": "number", "displayName": "Number", "description": "Policy Number", }, { "type": "date", "key": "effectiveDate", "displayName": "Effective Date", "description": "Policy Effective Date", }, { "type": "enum", "key": "paymentTerms", "displayName": "Payment Terms", "description": "Frequency of payment per year", "options": [ {"key": "Monthly"}, {"key": "Quarterly"}, {"key": "Semiannual"}, {"key": "Annually"}, ], }, { "type": "multiSelect", "key": "coverageTypes", "displayName": "Coverage Types", "description": "Types of coverage for the policy", "prompt": "Look in the coverage type table and include all listed types.", "options": [ {"key": "Body Injury Liability"}, {"key": "Property Damage Liability"}, {"key": "Personal Damage Liability"}, {"key": "Collision"}, {"key": "Comprehensive"}, {"key": "Uninsured Motorist"}, {"key": "Something that does not exist"}, ], }, ]

ai_agent_id (Optional[str]): The ID of the AI agent to use for processing.

Returns: dict: The extracted structured data in a json string format.

Inputs: file_ids (required), fields (required), ai_agent_id.

box_ai_extract_structured_using_template_toolA

Extract structured data from one or more files and return a SINGLE metadata instance.

This tool analyzes the provided file(s) and extracts information to populate a single metadata instance based on the specified template. When multiple files are provided, Box AI combines information from ALL files to create ONE complete metadata record.

Use cases:

  • Single file: Extract metadata from one receipt, invoice, or document

  • Multiple files: Combine data from multiple sources into one metadata instance (e.g., extract customer info from both a contract PDF and a supporting letter)

NOT for batch processing: If you need to extract metadata from multiple files as separate instances, call this tool once per file in a loop.

Args: ctx (Context): The context object containing the request and lifespan context. 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 (Optional[str]): The ID of the AI agent to use for processing. Returns: dict: The extracted structured data in a json string format.

Inputs: file_ids (required), template_key (required), ai_agent_id.

box_authorize_app_toolC

Authorize the Box application. Start the Box app authorization process

return: str: Message

Inputs: no named parameters. Returns: result

box_collaboration_delete_toolC

Delete a specific collaboration. Args: ctx (Context): The MCP context. collaboration_id (str): The ID of the collaboration to delete. Returns: dict: A dictionary containing the result of the deletion or an error message.

Inputs: collaboration_id (required).

box_collaboration_file_group_by_group_id_toolB

Create a collaboration on a file with a group specified by group ID. Args: client (BoxClient): Authenticated Box client. file_id (str): The ID of the file to collaborate on. group_id (str): The ID of the group to collaborate with. role (str): The role to assign to the collaborator. Default is "editor". Available roles are editor, viewer, previewer, uploader, viewer_uploader, co-owner. is_access_only (Optional[bool]): If set to true, collaborators have access to shared items, but such items won't be visible in the All Files list. Additionally, collaborators won't see the path to the root folder for the shared item. expires_at (Optional[DateTime]): The expiration date of the collaboration. notify (Optional[bool]): Whether to notify the collaborator via email. Returns: Dict[str, Any]: Dictionary containing collaboration details or error message.

Inputs: file_id (required), group_id (required), role, is_access_only, +2 more.

box_collaboration_file_user_by_user_id_toolA

Create a collaboration on a file with a user specified by user ID. Args: client (BoxClient): Authenticated Box client. file_id (str): The ID of the file to collaborate on. user_id (str): The ID of the user to collaborate with. role (str): The role to assign to the collaborator. Default is "editor". Available roles are editor, viewer, previewer, uploader, viewer_uploader, co-owner. is_access_only (Optional[bool]): If set to true, collaborators have access to shared items, but such items won't be visible in the All Files list. Additionally, collaborators won't see the path to the root folder for the shared item. expires_at (Optional[DateTime]): The expiration date of the collaboration. notify (Optional[bool]): Whether to notify the collaborator via email. Returns: Dict[str, Any]: Dictionary containing collaboration details or error message.

Inputs: file_id (required), user_id (required), role, is_access_only, +2 more.

box_collaboration_file_user_by_user_login_toolA

Create a collaboration on a file with a user specified by user login (email). Args: client (BoxClient): Authenticated Box client. file_id (str): The ID of the file to collaborate on. user_login (str): The login (email) of the user to collaborate with. role (str): The role to assign to the collaborator. Default is "editor". Available roles are editor, viewer, previewer, uploader, viewer_uploader, co-owner. is_access_only (Optional[bool]): If set to true, collaborators have access to shared items, but such items won't be visible in the All Files list. Additionally, collaborators won't see the path to the root folder for the shared item. expires_at (Optional[DateTime]): The expiration date of the collaboration. notify (Optional[bool]): Whether to notify the collaborator via email. Returns: Dict[str, Any]: Dictionary containing collaboration details or error message.

Inputs: file_id (required), user_login (required), role, is_access_only, +2 more.

box_collaboration_folder_group_by_group_id_toolA

Create a collaboration on a folder with a group specified by group ID. Args: client (BoxClient): Authenticated Box client. folder_id (str): The ID of the folder to collaborate on. group_id (str): The ID of the group to collaborate with. role (str): The role to assign to the collaborator. Default is "editor". Available roles are editor, viewer, previewer, uploader, viewer_uploader, co-owner. is_access_only (Optional[bool]): If set to true, collaborators have access to shared items, but such items won't be visible in the All Files list. Additionally, collaborators won't see the path to the root folder for the shared item. expires_at (Optional[DateTime]): The expiration date of the collaboration. notify (Optional[bool]): Whether to notify the collaborator via email. Returns: Dict[str, Any]: Dictionary containing collaboration details or error message.

Inputs: folder_id (required), group_id (required), role, is_access_only, +3 more.

box_collaboration_folder_user_by_user_id_toolB

Create a collaboration on a folder with a user specified by user ID. Args: client (BoxClient): Authenticated Box client. folder_id (str): The ID of the folder to collaborate on. user_id (str): The ID of the user to collaborate with. role (str): The role to assign to the collaborator. Default is "editor". Available roles are editor, viewer, previewer, uploader, viewer_uploader, co-owner. is_access_only (Optional[bool]): If set to true, collaborators have access to shared items, but such items won't be visible in the All Files list. Additionally, collaborators won't see the path to the root folder for the shared item. expires_at (Optional[DateTime]): The expiration date of the collaboration. notify (Optional[bool]): Whether to notify the collaborator via email. Returns: Dict[str, Any]: Dictionary containing collaboration details or error message.

Inputs: folder_id (required), user_id (required), role, is_access_only, +3 more.

box_collaboration_folder_user_by_user_login_toolA

Create a collaboration on a folder with a user specified by user login (email). Args: client (BoxClient): Authenticated Box client. folder_id (str): The ID of the folder to collaborate on. user_login (str): The login (email) of the user to collaborate with. role (str): The role to assign to the collaborator. Default is "editor". Available roles are editor, viewer, previewer, uploader, viewer_uploader, co-owner. is_access_only (Optional[bool]): If set to true, collaborators have access to shared items, but such items won't be visible in the All Files list. Additionally, collaborators won't see the path to the root folder for the shared item. expires_at (Optional[DateTime]): The expiration date of the collaboration. notify (Optional[bool]): Whether to notify the collaborator via email. Returns: Dict[str, Any]: Dictionary containing collaboration details or error message.

Inputs: folder_id (required), user_login (required), role, is_access_only, +3 more.

box_collaboration_list_by_file_toolC

List all collaborations on a specific file. Args: ctx (Context): The MCP context. file_id (str): The ID of the file to list collaborations for. Returns: dict: A dictionary containing the list of collaborations or an error message.

Inputs: file_id (required).

box_collaboration_list_by_folder_toolC

List all collaborations on a specific folder. Args: ctx (Context): The MCP context. folder_id (str): The ID of the folder to list collaborations for. Returns: dict: A dictionary containing the list of collaborations or an error message.

Inputs: folder_id (required).

box_collaboration_update_toolB

Update a specific collaboration's role. Args: ctx (Context): The MCP context. collaboration_id (str): The ID of the collaboration to update. role (str): The new role to assign to the collaborator. Default is "editor". Available roles are editor, viewer, previewer, uploader, viewer_uploader, co-owner. status (Optional[str]): The status of the collaboration. Can be 'accepted' or 'rejected'. expires_at (Optional[datetime]): The new expiration date of the collaboration. can_view_path (Optional[bool]): Whether the collaborator can view the path to the root folder. Returns: dict: A dictionary containing the updated collaboration details or an error message.

Inputs: collaboration_id (required), role, status, expires_at, +1 more.

box_docgen_create_batch_toolA

Create a new Box Doc Gen batch to generate documents from a template.

Args: client (BoxClient): Authenticated Box client. docgen_template_id (str): ID of the Doc Gen template. destination_folder_id (str): ID of the folder to save the generated document. document_generation_data (List[Dict[str, Any]]): Data for document generation. example: [ { "generated_file_name": "Image test", "user_input": { "order": { "id": "12305", "date": "18-08-2023", "products": [ { "id": 1, "name": "A4 Papers", "type": "non-fragile", "quantity": 100, "price": 29, "amount": 2900 }, ] } } }, ] output_type (str): Output file type (only, "pdf" or "docx").

Returns: dict[str, Any]: Response containing batch creation status and details. If successful, contains a message with batch ID. If an error occurs, contains an "error" key with the error message.

Inputs: docgen_template_id (required), destination_folder_id (required), document_generation_data (required), output_type. Returns: object

box_docgen_create_single_file_from_user_input_toolB

Create a single document from a Doc Gen template using user input.

Args: client (BoxClient): Authenticated Box client. docgen_template_id (str): ID of the Doc Gen template. destination_folder_id (str): ID of the folder to save the generated document. user_input (dict[str, Any]): User input data for document generation. example: example: { "user_input": { "order": { "id": "12305", "date": "18-08-2023", "products": [ { "id": 1, "name": "A4 Papers", "type": "non-fragile", "quantity": 100, "price": 29, "amount": 2900 }, ] } } } generated_file_name (Optional[str]): Name for the generated document file. output_type (str): Output file type (only, "pdf" or "docx").

Returns: dict[str, Any]: Information about the created batch job.

Inputs: docgen_template_id (required), destination_folder_id (required), user_input (required), generated_file_name, +1 more. Returns: object

box_docgen_get_job_by_id_toolB

Retrieve a Box Doc Gen job by its ID.

Args: client (BoxClient): Authenticated Box client. job_id (str): ID of the Doc Gen job.

Returns: dict[str, Any]: Details of the specified Doc Gen job.

Inputs: job_id (required). Returns: object

box_docgen_list_jobs_by_batch_toolC

List Doc Gen jobs in a specific batch.

Args: client (BoxClient): Authenticated Box client. batch_id (str): ID of the Doc Gen batch. marker (str, optional): Pagination marker. limit (int, optional): Maximum number of items to return.

Returns: list[dict[str, Any]]: A list of Doc Gen jobs in the batch.

Inputs: batch_id (required), marker, limit. Returns: result

box_docgen_list_jobs_toolC

List all Box Doc Gen jobs for the current user.

Args: client (BoxClient): Authenticated Box client. marker (str, optional): Pagination marker. limit (int, optional): Maximum number of items to return.

Returns: list[dict[str, Any]]: A list of Doc Gen jobs.

Inputs: marker, limit. Returns: result

box_docgen_template_create_toolC

Mark a file as a Box Doc Gen template.

Args: client (BoxClient): Authenticated Box client. file_id (str): ID of the file to mark as template.

Returns: dict[str, Any]: Metadata of the created template.

Inputs: file_id (required). Returns: object

box_docgen_template_get_by_id_toolC

Retrieve details of a specific Box Doc Gen template.

Args: client (BoxClient): Authenticated Box client. template_id (str): ID of the template.

Returns: dict[str, Any]: Metadata of the template or an error message.

Inputs: template_id (required). Returns: object

box_docgen_template_get_by_name_toolC

Retrieve details of a specific Box Doc Gen template by name.

Args: client (BoxClient): Authenticated Box client. template_name (str): Name of the template.

Returns: dict[str, Any]: Metadata of the template or an error message.

Inputs: template_name (required). Returns: object

box_docgen_template_list_jobs_toolB

List Doc Gen jobs that used a specific template.

Args: client (BoxClient): Authenticated Box client. template_id (str): ID of the template. marker (str, optional): Pagination marker. limit (int, optional): Max items per page.

Returns: DocGenJobsV2025R0: A page of Doc Gen jobs for the template.

Inputs: template_id (required), marker, limit. Returns: result

box_docgen_template_list_tags_toolC

List all tags for a Box Doc Gen template.

Args: client (BoxClient): Authenticated Box client. template_id (str): ID of the template. template_version_id (str, optional): Specific version ID. marker (str, optional): Pagination marker. limit (int, optional): Max items per page.

Returns: list[dict[str, Any]]: A list of tags for the template or an error message.

Inputs: template_id (required), template_version_id, marker, limit. Returns: result

box_docgen_template_list_toolB

List all Box Doc Gen templates accessible to the user.

Args: client (BoxClient): Authenticated Box client. marker (str, optional): Pagination marker. limit (int, optional): Max items per page.

Returns: dict[str, Any] | list[dict[str, Any]]: A list of template metadata or an error message.

Inputs: marker, limit. Returns: result

box_file_copy_toolB

Copy a file to a specified destination folder in Box. Args: file_id (str): The ID of the file to copy. destination_folder_id (str): The ID of the destination folder. new_name (str, optional): Optional new name for the copied file. version_number (int, optional): Optional version number of the file to copy. Returns: dict[str, Any]: Dictionary containing the copied file information or error message.

Inputs: file_id (required), destination_folder_id (required), new_name, version_number. Returns: object

box_file_delete_toolC

Delete a file from Box. Args: file_id (str): The ID of the file to delete. Returns: dict[str, Any]: Dictionary containing success message or error.

Inputs: file_id (required). Returns: object

box_file_download_toolA

Download a file from Box and optionally save it locally.

Args: file_id (str): The ID of the file to download. save_file (bool, optional): Whether to save the file locally. Defaults to False. save_path (str, optional): Path where to save the file. If not provided but save_file is True, uses a temporary directory. Defaults to None.

Returns: dict[str, Any]: For text files: content as string. For images: base64-encoded string with metadata. For unsupported files: error message. If save_file is True, includes the path where the file was saved.

Inputs: file_id (required), save_file, save_path. Returns: object

box_file_info_toolC

Get information about a file in Box. Args: file_id (str): The ID of the file to get information about. return: dict[str, Any]: Information about the file.

Inputs: file_id (required). Returns: object

box_file_lock_toolB

Define a lock on a file to prevent it from being moved, renamed, or changed by anyone other than the lock creator. Args: file_id (str): The ID of the file to lock. lock_expires_at (str, optional): Optional expiration date/time for the lock in ISO 8601 format. is_download_prevented (bool, optional): Optional flag to prevent downloads while locked. Returns: dict[str, Any]: Dictionary containing the locked file information including lock details.

Inputs: file_id (required), lock_expires_at, is_download_prevented. Returns: object

box_file_move_toolC

Move a file to a specified destination folder in Box. Args: file_id (str): The ID of the file to move. destination_folder_id (str): The ID of the destination folder. Returns: dict[str, Any]: Dictionary containing the moved file information.

Inputs: file_id (required), destination_folder_id (required). Returns: object

box_file_rename_toolC

Rename a file in Box. Args: file_id (str): The ID of the file to rename. new_name (str): The new name for the file. Returns: dict[str, Any]: Dictionary containing the renamed file information.

Inputs: file_id (required), new_name (required). Returns: object

box_file_retention_date_clear_toolC

Clear/remove the retention date from a file in Box. Args: file_id (str): The ID of the file to update. Returns: dict[str, Any]: Dictionary containing the updated file information.

Inputs: file_id (required). Returns: object

box_file_retention_date_set_toolA

Set a retention date for a file in Box (cannot be shortened once set). Args: file_id (str): The ID of the file to update. retention_date (str): The retention date for the file in ISO 8601 format. Returns: dict[str, Any]: Dictionary containing the updated file information including retention date.

Inputs: file_id (required), retention_date (required). Returns: object

box_file_set_description_toolC

Set or update the description of a file in Box. Args: file_id (str): The ID of the file to update. description (str): The new description for the file. Returns: dict[str, Any]: Dictionary containing the updated file information.

Inputs: file_id (required), description (required). Returns: object

box_file_set_download_company_toolB

Set a file to be downloadable by company users (restricts external user downloads for viewer/editor roles). Args: file_id (str): The ID of the file to update. Returns: dict[str, Any]: Dictionary containing the updated file information.

Inputs: file_id (required). Returns: object

box_file_set_download_open_toolB

Allow anyone with access to the file to download it (overrides role-based download permissions). Args: file_id (str): The ID of the file to update. Returns: dict[str, Any]: Dictionary containing the updated file information.

Inputs: file_id (required). Returns: object

box_file_set_download_reset_toolC

Reset download permissions to default behavior based on collaboration roles. Args: file_id (str): The ID of the file to update. Returns: dict[str, Any]: Dictionary containing the updated file information.

Inputs: file_id (required). Returns: object

box_file_tag_add_toolA

Add a tag to a file in Box (prevents duplicates). Args: file_id (str): The ID of the file to add a tag to. tag (str): The tag to add. Returns: dict[str, Any]: Dictionary containing the updated file information including tags.

Inputs: file_id (required), tag (required). Returns: object

box_file_tag_list_toolB

List all tags associated with a file in Box. Args: file_id (str): The ID of the file to retrieve tags for. Returns: dict[str, Any]: Dictionary with list of tags or message if no tags found.

Inputs: file_id (required). Returns: object

box_file_tag_remove_toolC

Remove a tag from a file in Box. Args: file_id (str): The ID of the file to remove a tag from. tag (str): The tag to remove. Returns: dict[str, Any]: Dictionary containing the updated file information including tags.

Inputs: file_id (required), tag (required). Returns: object

box_file_text_extract_toolC

Extract text from a file in Box.

The result can be markdown or plain text. If a markdown representation is available, it will be preferred.

Args: file_id (str): The ID of the file to extract text from.

Returns: dict[str, Any]: The extracted text (markdown or plain text).

Inputs: file_id (required). Returns: object

box_file_thumbnail_download_toolB

Download the actual thumbnail image of a file. Args: file_id (str): The ID of the file. extension (str, optional): Image format ('png' or 'jpg', defaults to 'png'). min_height (int, optional): Minimum height in pixels (32-320). min_width (int, optional): Minimum width in pixels (32-320). max_height (int, optional): Maximum height in pixels (32-320). max_width (int, optional): Maximum width in pixels (32-320). Returns: dict[str, Any]: Dictionary with thumbnail image content in base64 or error message.

Inputs: file_id (required), extension, min_height, min_width, +2 more. Returns: object

box_file_thumbnail_url_toolA

Retrieve the URL for a thumbnail image of a file. Args: file_id (str): The ID of the file. extension (str, optional): Image format ('png' or 'jpg', defaults to 'png'). min_height (int, optional): Minimum height in pixels (32-320). min_width (int, optional): Minimum width in pixels (32-320). max_height (int, optional): Maximum height in pixels (32-320). max_width (int, optional): Maximum width in pixels (32-320). Returns: dict[str, Any]: Dictionary with thumbnail URL or message if not available.

Inputs: file_id (required), extension, min_height, min_width, +2 more. Returns: object

box_file_unlock_toolC

Remove a lock from a file in Box. Args: file_id (str): The ID of the file to unlock. Returns: dict[str, Any]: Dictionary containing the unlocked file information.

Inputs: file_id (required). Returns: object

box_file_upload_toolB

Upload content as a file to Box.

Args: content (str | bytes): The content to upload. Can be text or binary data. file_name (str): The name to give the file in Box. parent_folder_id (str): The ID of the destination folder. Defaults to root ("0").

Returns: dict[str, Any]: Information about the uploaded file including id and name.

Inputs: content (required), file_name (required), parent_folder_id (required). Returns: object

box_folder_copy_toolB

Copies a folder to a new location in Box.

Args: ctx: Context: The context containing Box client information folder_id (str): ID of the folder to copy. Can be string or int. destination_parent_folder_id (str): ID of the destination parent folder. Can be string or int. name (str, optional): New name for the copied folder. If not provided, original name is used. Returns: dict[str, Any]: Dictionary containing the copied folder object or error message

Inputs: folder_id (required), destination_parent_folder_id (required), name.

box_folder_create_toolB

Creates a new folder in Box. Args: ctx: Context: The context containing Box client information name (str): Name of the new folder parent_folder_id (str): ID of the parent folder where the new folder will be created, use "0" for root folder Returns: dict[str, Any]: Dictionary containing the created folder object or error message

Inputs: name (required), parent_folder_id.

box_folder_delete_toolB

Deletes a folder from Box.

Args: ctx: Context: The context containing Box client information folder_id (str): ID of the folder to delete. Can be string or int. recursive (bool, optional): Whether to delete recursively. Defaults to False. Returns: dict[str, Any]: Dictionary containing success message or error message

Inputs: folder_id (required), recursive.

box_folder_favorites_add_toolB

Adds a folder to the user's favorites in Box.

Args: ctx: Context: The context containing Box client information folder_id (str): ID of the folder to add to favorites.

Returns: dict[str, Any]: Dictionary containing the updated folder object or error message

Inputs: folder_id (required).

box_folder_favorites_remove_toolC

Removes a folder from the user's favorites in Box.

Args: ctx: Context: The context containing Box client information folder_id (str): ID of the folder to remove from favorites. Returns: dict[str, Any]: Dictionary containing the updated folder object or error message

Inputs: folder_id (required).

box_folder_info_toolC

Retrieve information about a specific folder in Box.

Args: ctx: Context: The context containing Box client information folder_id (str): ID of the folder to retrieve information for. Returns: dict[str, Any]: Dictionary containing folder information or error message.

Inputs: folder_id (required).

box_folder_items_list_toolC

List items in a Box folder with optional recursive traversal.

Args: ctx: Context: The context containing Box client information. folder_id (str): ID of the folder to list items from. is_recursive (bool, optional): Whether to recursively list subfolder contents. Defaults to False. limit (Optional[int], optional): Maximum items per API call. Defaults to 1000.

Returns: dict[str, Any]: Dictionary containing folder items list or error message.

Inputs: folder_id (required), is_recursive, limit.

box_folder_list_tags_toolC

Lists tags associated with a folder in Box.

Args: ctx: Context: The context containing Box client information. folder_id (str): ID of the folder to list tags for.

Returns: dict[str, Any]: Dictionary containing the list of tags or error message

Inputs: folder_id (required).

box_folder_move_toolC

Moves a folder to a new location in Box.

Args: ctx: Context: The context containing Box client information. folder_id (str): ID of the folder to move. destination_parent_folder_id (str): ID of the destination parent folder. Returns: dict[str, Any]: Dictionary containing the moved folder object or error message

Inputs: folder_id (required), destination_parent_folder_id (required).

box_folder_rename_toolC

Renames a folder in Box.

Args: ctx: Context: The context containing Box client information. folder_id (str): ID of the folder to rename. new_name (str): New name for the folder. Returns: dict[str, Any]: Dictionary containing the renamed folder object or error message

Inputs: folder_id (required), new_name (required).

box_folder_set_collaboration_toolB

Sets collaboration settings for a folder in Box. Args: ctx: Context: The context containing Box client information. folder_id (str): ID of the folder to set collaboration settings for. can_non_owners_invite (bool): Specifies if users who are not the owner of the folder can invite new collaborators to the folder. can_non_owners_view_collaborators (bool): Restricts collaborators who are not the owner of this folder from viewing other collaborations on this folder. is_collaboration_restricted_to_enterprise (bool): Specifies if new invites to this folder are restricted to users within the enterprise. This does not affect existing collaborations. Returns: dict[str, Any]: Dictionary containing the updated folder object or error message

Inputs: folder_id (required), can_non_owners_invite (required), can_non_owners_view_collaborators (required), is_collaboration_restricted_to_enterprise (required).

box_folder_set_description_toolC

Sets the description of a folder in Box.

Args: ctx: Context: The context containing Box client information. folder_id (str): ID of the folder to set description for. description (str): Description text to set for the folder. Returns: dict[str, Any]: Dictionary containing the updated folder object or error message

Inputs: folder_id (required), description (required).

box_folder_set_sync_toolB

Sets the sync state for a folder in Box.

Args: ctx: Context: The context containing Box client information. folder_id (str): ID of the folder to set sync state for. sync_state (str): Specifies whether a folder should be synced to a user's device or not. This is used by Box Sync (discontinued) and is not used by Box Drive. Value is one of synced,not_synced,partially_synced

Returns: dict[str, Any]: Dictionary containing the updated folder object or error message

Inputs: folder_id (required), sync_state (required).

box_folder_set_upload_email_toolA

Sets or removes the upload email address for a folder in Box.

Args: ctx: Context: The context containing Box client information. folder_id (str): ID of the folder to set the upload email for. folder_upload_email_access (Optional[str]): The upload email access level to set. If None, removes the upload email. When set to open it will accept emails from any email address. Value is one of open,collaborators

Returns: dict[str, Any]: Dictionary containing the updated folder object or error message

Inputs: folder_id (required), folder_upload_email_access.

box_folder_tag_add_toolC

Adds a tag to a folder in Box.

Args: ctx: Context: The context containing Box client information. folder_id (str): ID of the folder to add tag to. tag (str): Tag to add to the folder.

Returns: dict[str, Any]: Dictionary containing the updated folder object or error message

Inputs: folder_id (required), tag (required).

box_folder_tag_remove_toolC

Removes a tag from a folder in Box. Args: ctx: Context: The context containing Box client information. folder_id (str): ID of the folder to remove tag from. tag (str): Tag to remove from the folder. Returns: dict[str, Any]: Dictionary containing the updated folder object or error message

Inputs: folder_id (required), tag (required).

box_groups_list_by_user_toolC

List all groups that a specific user belongs to. Args: ctx (Context): The context object containing the request and lifespan context. user_id (str): The ID of the user whose groups are to be listed. Returns: dict: A dictionary containing the list of groups the user belongs to.

Inputs: user_id (required).

box_groups_list_members_toolC

List all members of a specific group. Args: ctx (Context): The context object containing the request and lifespan context. group_id (str): The ID of the group whose members are to be listed. Returns: dict: A dictionary containing the list of group members.

Inputs: group_id (required).

box_groups_search_toolC

Search for groups by name. This is a partial match search. Args: ctx (Context): The context object containing the request and lifespan context. query (str): The search query to match against group names. Returns: dict: A dictionary containing the list of matching groups.

Inputs: query (required).

box_metadata_delete_instance_on_file_toolC

Delete the metadata template instance associated with a specific file.

Args: ctx (Context): The context object containing the request and lifespan context. file_id (str): The ID of the file to delete the metadata from. template_key (str): The key of the metadata template.

Returns: dict: The response from the Box API after deleting the metadata.

Inputs: file_id (required), template_key (required).

box_metadata_get_instance_on_file_toolC

Get the metadata template instance associated with a specific file.

Args: ctx (Context): The context object containing the request and lifespan context. file_id (str): The ID of the file to get the metadata from. template_key (str): The key of the metadata template.

Returns: dict: The metadata instance associated with the file.

Inputs: file_id (required), template_key (required).

box_metadata_set_instance_on_file_toolB

Set a metadata template instance on a specific file.

Args: client (BoxClient): An authenticated Box client. template_key (str): The key of the metadata template to set. file_id (str): The ID of the file to set the metadata on. metadata (Dict[str, Any]): The metadata instance to set, as a dictionary. Metadata example: {'test_field': 'Test Value', 'date_field': '2023-10-01T00:00:00.000Z', 'float_field': 3.14, 'enum_field': 'option1', 'multiselect_field': ['option1', 'option2']}

Returns: dict: The response from the Box API after setting the metadata.

Inputs: template_key (required), file_id (required), metadata (required).

box_metadata_template_create_toolA

Create a new metadata template definition in Box. Args: ctx (Context): The context object containing the request and lifespan context. display_name (str): The display name of the metadata template. fields (List[Dict[str, Any]]): A list of fields to include in the template. Example:{"displayName": "Customer", "fields": [ { "type": "string", "key": "name", "displayName": "Name", "description": "The customer name", "hidden": false }, { "type": "date", "key": "last_contacted_at", "displayName": "Last Contacted At", "description": "When this customer was last contacted at", "hidden": false }, { "type": "enum", "key": "industry", "displayName": "Industry", "options": [ {"key": "Technology"}, {"key": "Healthcare"}, {"key": "Legal"} ] }, { "type": "multiSelect", "key": "role", "displayName": "Contact Role", "options": [ {"key": "Developer"}, {"key": "Business Owner"}, {"key": "Marketing"}, {"key": "Legal"}, {"key": "Sales"} ] } ] }

template_key (Optional[str]): An optional key for the metadata template. If not provided, a key will be generated.

Returns: dict: The created metadata template.

Inputs: display_name (required), fields (required), template_key.

box_metadata_template_get_by_key_toolC

Retrieve a metadata template by its key.

Args: ctx (Context): The context object containing the request and lifespan context. template_key (str): The key of the metadata template to retrieve.

Returns: dict: The metadata template associated with the provided key.

Inputs: template_key (required).

box_metadata_template_get_by_name_toolC

Retrieve a metadata template by its name.

Args: ctx (Context): The context object containing the request and lifespan context. template_name (str): The name of the metadata template to retrieve.

Returns: dict: The metadata template associated with the provided name.

Inputs: template_name (required).

box_metadata_template_list_toolC

List all metadata templates in Box.

Args: ctx (Context): The context object containing the request and lifespan context.

Returns: dict: A list of all metadata templates.

Inputs: no named parameters.

box_metadata_update_instance_on_file_toolC

Update the metadata template instance associated with a specific file.

Args: ctx (Context): The context object containing the request and lifespan context. 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): If True, remove data from fields not included in the metadata.

Returns: dict: The response from the Box API after updating the metadata.

Inputs: file_id (required), template_key (required), metadata (required), remove_non_included_data.

box_search_folder_by_name_toolC

Locate a folder in Box by its name.

Args: folder_name (str): The name of the folder to locate. return: List[dict]: The folder ID.

Inputs: folder_name (required). Returns: result

box_search_toolB

Search for files in Box with the given query.

Args: query (str): The query to search for. file_extensions (List[str]): The file extensions to search for, for example *.pdf content_types (List[SearchForContentContentTypes]): where to look for the information, possible values are: NAME DESCRIPTION, FILE_CONTENT, COMMENTS, TAG, ancestor_folder_ids (List[str]): The ancestor folder IDs to search in. return: List[dict]: The search results.

Inputs: query (required), file_extensions, where_to_look_for_query, ancestor_folder_ids. Returns: result

box_task_assign_by_email_toolC

Assign a Box task to a user via email. Args: ctx (Context): The context object containing the request and lifespan context. task_id (str): The ID of the task to assign. email (str): The email of the user to assign the task to. Returns: dict: The response from the Box API after assigning the task.

Inputs: task_id (required), email (required).

box_task_assign_by_user_id_toolC

Assign a Box task to a user via user ID. Args: ctx (Context): The context object containing the request and lifespan context. task_id (str): The ID of the task to assign. user_id (str): The ID of the user to assign the task to. Returns: dict: The response from the Box API after assigning the task.

Inputs: task_id (required), user_id (required).

box_task_assignment_details_toolC

Get details of a Box task assignment. Args: ctx (Context): The context object containing the request and lifespan context. assignment_id (str): The ID of the task assignment. Returns: dict: The response from the Box API with the task assignment details.

Inputs: assignment_id (required).

box_task_assignment_remove_toolC

Remove a Box task assignment. Args: ctx (Context): The context object containing the request and lifespan context. assignment_id (str): The ID of the task assignment to remove. Returns: dict: The response from the Box API after removing the task assignment.

Inputs: assignment_id (required).

box_task_assignments_list_toolC

List all assignments associated with a Box task. Args: ctx (Context): The context object containing the request and lifespan context. task_id (str): The ID of the task to list assignments for. Returns: dict: The response from the Box API with the list of task assignments.

Inputs: task_id (required).

box_task_assignment_update_toolB

Update a Box task assignment to mark it as complete or review outcome. Args: ctx (Context): The context object containing the request and lifespan context. assignment_id (str): The ID of the task assignment to update. is_positive_outcome (bool): For review tasks: True for approved, False for rejected. For complete tasks: True for completed, False for incomplete. message (str | None): Optional message or description for the task assignment update. Returns: dict: The response from the Box API after updating the task assignment.

Inputs: assignment_id (required), is_positive_outcome (required), message.

box_task_complete_create_toolC

Create a new completion task for a Box file. Args: ctx (Context): The context object containing the request and lifespan context. file_id (str): The ID of the file to create the task for. due_at (datetime | None): Optional due date for the task. message (str | None): Optional message or description for the task. requires_all_assignees_to_complete (bool): Whether all assignees must complete the task. Defaults to False. Returns: dict: The response from the Box API after creating the completion task.

Inputs: file_id (required), due_at, message, requires_all_assignees_to_complete.

box_task_details_toolC

Get details of a Box task. Args: ctx (Context): The context object containing the request and lifespan context. task_id (str): The ID of the task to retrieve details for. Returns: dict: The response from the Box API with the task details.

Inputs: task_id (required).

box_task_file_list_toolC

List all tasks associated with a Box file. Args: ctx (Context): The context object containing the request and lifespan context. file_id (str): The ID of the file to list tasks for. Returns: dict: The response from the Box API with the list of tasks.

Inputs: file_id (required).

box_task_remove_toolC

Remove a Box task. Args: ctx (Context): The context object containing the request and lifespan context. task_id (str): The ID of the task to remove. Returns: dict: The response from the Box API after removing the task.

Inputs: task_id (required).

box_task_review_create_toolC

Create a new review task for a Box file. Args: ctx (Context): The context object containing the request and lifespan context. file_id (str): The ID of the file to create the task for. due_at (datetime | None): Optional due date for the task. message (str | None): Optional message or description for the task. requires_all_assignees_to_complete (bool): Whether all assignees must complete the task. Defaults to False. Returns: dict: The response from the Box API after creating the review task.

Inputs: file_id (required), due_at, message, requires_all_assignees_to_complete.

box_task_update_toolC

Update a Box task. Args: ctx (Context): The context object containing the request and lifespan context. task_id (str): The ID of the task to update. due_at (datetime | None): Optional new due date for the task. message (str | None): Optional new message or description for the task. requires_all_assignees_to_complete (bool): Whether all assignees must complete the task. Defaults to False. Returns: dict: The response from the Box API after updating the task.

Inputs: task_id (required), due_at, message, requires_all_assignees_to_complete.

box_users_list_toolC

List all users in the Box account. Args: ctx (Context): The context object containing the request and lifespan context. Returns: dict: A dictionary containing the list of users.

Inputs: no named parameters.

box_users_locate_by_email_toolA

Locate a user by their email address. This is an exact match search. Args: ctx (Context): The context object containing the request and lifespan context. email (str): The email address of the user to locate. Returns: dict: A dictionary containing the user information if found, otherwise a message with no user found.

Inputs: email (required).

box_users_locate_by_name_toolB

Locate a user by their name. This is an exact match search. Args: ctx (Context): The context object containing the request and lifespan context. name (str): The name of the user to locate. Returns: dict: A dictionary containing the user information if found, otherwise a message with no user found.

Inputs: name (required).

box_users_search_by_name_or_email_toolC

Search for users by name or email. This is a partial match search. Args: ctx (Context): The context object containing the request and lifespan context. query (str): The search query to match against user names and email addresses. Returns: dict: A dictionary containing the list of matching users.

Inputs: query (required).

box_who_am_iB

Get the current user's information. This is also useful to check the connection status.

return: dict: The current user's information.

Inputs: no named parameters.

mcp_server_infoB

Returns information about the MCP server.

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.1/5.0

    Scored across 117 tools

    Disambiguation3/5

    Most tools have distinct purposes within their categories, but there is significant overlap in the AI extraction tools (e.g., box_ai_extract_freeform_tool vs. box_ai_extract_structured_using_fields_tool) and collaboration tools (multiple variations for files/folders with users/groups). The descriptions help differentiate them, but the sheer number of similar tools could cause confusion for an agent trying to select the right one.

    Naming Consistency4/5

    The naming follows a consistent snake_case pattern with a clear prefix (box_) and resource-action structure (e.g., box_file_download_tool, box_folder_create_tool). Minor deviations exist, such as box_who_am_i (no '_tool' suffix) and mcp_server_info (different prefix), but overall the convention is predictable and readable.

    Tool Count2/5

    With 117 tools, the count is excessive for a single server, even for a comprehensive Box API integration. This many tools will overwhelm agents and make navigation difficult. The scope is broad, but the tool set feels bloated with many fine-grained variations (e.g., separate collaboration tools for files/folders by user ID, login, or group ID) that could be consolidated.

    Completeness5/5

    The tool set provides extensive coverage of the Box domain, including files, folders, collaborations, metadata, AI features, tasks, shared links, users, groups, and document generation. It supports full CRUD operations and lifecycle management across all major resources, with no apparent gaps that would hinder agent workflows.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      C
      quality
      B
      maintenance
      Python-based server that provides AI-native access to Alfresco content management operations through the Model Context Protocol, enabling search, document lifecycle management, version control, and other content operations.
      15
      24 PyPI
      15
      Apache 2.0
    • A
      license
      Not graded
      quality
      D
      maintenance
      A Python-based MCP server that enables document-based question answering by processing PDF, TXT, and Markdown files through OpenAI's API. It provides hallucination-free responses based strictly on document content using semantic search and includes a web interface for management.
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI agents to manage Box files, folders, collaborations, and more via the Box API using tools for search, upload, and metadata operations.
      5 npm
      ISC