Allows MCP clients to interact with Toggl Track, enabling time tracking, project management, and workspace operations through natural language.
-
create_project
- Description: Creates a new project in a specified Toggl workspace.
- Input:
name(str): The name of the project to be created. This is a required field.workspace_name(str, optional): The name of the workspace where the project will be created. If not provided, it defaults to the user's default workspace.active(bool, optional): Specifies whether the project is active. Defaults toTrue.billable(bool, optional): Specifies whether the project is billable. Defaults toFalse.client_id(int, optional): The ID of the client associated with the project.color(str, optional): The hex color code assigned to the project (e.g., "#FF0000").is_private(bool, optional): Specifies whether the project is private. Defaults toTrue.start_date(str, optional): The start date of the project in ISO 8601 format (e.g., "YYYY-MM-DD").end_date(str, optional): The end date of the project in ISO 8601 format (e.g., "YYYY-MM-DD").estimated_hours(int, optional): The estimated number of hours for the project.template(bool, optional): Specifies whether the project is a template. Defaults toFalse.template_id(int, optional): The ID of the template to use for creating the project.
- Output: JSON response containing the data of the newly created project.
-
delete_project
- Description: Deletes a project identified by its name within a specified workspace.
- Input:
project_name(str): The exact name of the project to be deleted. This is a required field.workspace_name(str, optional): The name of the workspace containing the project. If not provided, it defaults to the user's default workspace.
- Output: A confirmation message (str) indicating the successful deletion of the project.
-
update_projects
- Description: Performs bulk updates on multiple projects within a specified workspace using patch operations.
- Input:
project_names(List[str]): A list containing the names of the projects to be updated. This is a required field.operations(List[dict]): A list of patch operations to apply to the selected projects. Each operation is a dictionary specifying the operation type (op), the field path (path), and the new value (value) (e.g.,{"op": "replace", "path": "/active", "value": false}). This is a required field.workspace_name(str, optional): The name of the workspace containing the projects. If not provided, it defaults to the user's default workspace.
- Output: JSON response containing the data of the updated projects.
-
get_all_projects
- Description: Retrieves a list of all projects within a specified workspace.
- Input:
workspace_name(str, optional): The name of the workspace from which to retrieve projects. If not provided, it defaults to the user's default workspace.
- Output: JSON response containing a list of project data objects found in the specified workspace.
-
new_time_entry
- Description: Creates a new time entry. Can be used to start a timer (if only
startis provided or neitherstartnordurationare provided) or log a completed time entry (ifstartandstop, orstartanddurationare provided). - Input:
description(str): The description for the time entry.workspace_name(str, optional): Name of the workspace. Defaults to the user's default workspace.project_name(str, optional): Name of the project to associate the time entry with.tags(List[str], optional): A list of tag names to apply to the time entry.start(str, optional): The start time of the entry in ISO 8601 format (e.g., "2023-10-26T10:00:00Z"). Defaults to the current time if creating a running entry.stop(str, optional): The stop time of the entry in ISO 8601 format. If provided, creates a completed entry.duration(int, optional): The duration of the entry in seconds. Ifstartis provided butstopis not,durationdetermines the stop time. Ifstartis not provided, a negative duration starts a running timer.billable(bool, optional): Whether the time entry should be marked as billable. Defaults to False.created_with(str, optional): The name of the application creating the entry. Defaults to "MCP".
- Output: JSON response containing the data of the created time entry.
- Description: Creates a new time entry. Can be used to start a timer (if only
-
stop_time_entry
- Description: Stops the currently running time entry.
- Input:
workspace_name(str, optional): Name of the workspace where the entry is running. Defaults to the user's default workspace.
- Output: JSON response containing the data of the stopped time entry.
-
delete_time_entry
- Description: Deletes a specific time entry by its description and start time.
- Input:
time_entry_description(str): The exact description of the time entry to delete.start_time(str): The exact start time of the entry in ISO 8601 format used for identification.workspace_name(str, optional): Name of the workspace containing the entry. Defaults to the user's default workspace.
- Output: Success confirmation message (str) upon successful deletion.
-
get_current_time_entry
- Description: Fetches the details of the currently running time entry.
- Input: None (implicitly uses the user's context).
- Output: JSON response containing the data of the currently running time entry, or None if no time entry is currently running.
-
update_time_entry
- Description: Updates attributes of an existing time entry identified by its description and start time.
- Input:
time_entry_description(str): The current description of the time entry to update.start_time(str): The exact start time of the entry in ISO 8601 format used for identification.workspace_name(str, optional): Name of the workspace containing the entry. Defaults to the user's default workspace.new_description(str, optional): New description for the time entry.project_name(str, optional): New project name to associate with the entry. Set to empty string "" to remove project association.tags(List[str], optional): A new list of tag names. This will replace all existing tags. Provide an empty list[]to remove all tags.new_start(str, optional): New start time in ISO 8601 format.new_stop(str, optional): New stop time in ISO 8601 format.billable(bool, optional): New billable status.
- Output: JSON response containing the data of the updated time entry.
-
get_time_entries_for_range
- Description: Retrieves time entries within a specified date range, defined by offsets from the current day.
- Input:
from_day_offset(int): The start day offset from today (e.g., 0 for today, -1 for yesterday, -7 for a week ago).to_day_offset(int): The end day offset from today (e.g., 0 for today, 1 for tomorrow). The range includes both the start and end dates.workspace_name(str, optional): Name of the workspace to fetch entries from. Defaults to the user's default workspace.
- Output: JSON response containing a list of time entries found within the specified date range.
- Python 3.11+
- Toggl Track account
- uv installed for dependency management
Create a .env file inside of the mcp_toggl_server folder with:
EMAIL=your_toggl_email
PASSWORD=your_toggl_passwordIf you are using Toggl API tokens:
EMAIL=xxxx
PASSWORD="api_token"Where xxxx indicates your personal token
First install uv:
- For MacOS/Linux:
bash curl -LsSf https://astral.sh/uv/install.sh | sh
- For Windows:
bash powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Make sure to restart your terminal afterwards to ensure that the uv command gets picked up.
Now let's clone the repository and set up the project:
git clone [repository-url]
cd mcp_toggl_server
uv venv
uv pip install --all- Configure the MCP Server in
.vscode/mcp.json:
"servers": {
"toggl": {
"type": "stdio",
"command": "uv",
"args": [
"--directory",
"/ABSOLUTE/PATH/TO/PARENT/FOLDER/mcp_toggl_server",
"run",
"toggl_mcp_server.py"],
"envFile": "${workspaceFolder}/mcp_toggl_server/.env"
}
}-
Update the configuration:
- Replace
/ABSOLUTE/PATH/TO/PARENT/FOLDER/mcp_toggl_serverwith the absolute path to the server - You may need to put the full path to the uv executable in the command field. You can get this by running which uv on MacOS/Linux or where uv on Windows
- Replace
-
Enable the server:
- Look for the start button when hovering over the server configuration
/.vscode/mcp.json - Click start to let Copilot discover available tools
- Switch to agent mode in Copilot
- Look for the start button when hovering over the server configuration
For detailed setup instructions, see:
The Toggl MCP Server works with any MCP-compatible client. For integration steps:
- For Claude Desktop, visit the MCP Quick Start Guide
- For other MCP clients, consult their respective documentation for server configuration
Note: Configuration typically involves specifying the server path and environment variables similar to the VS Code setup above.
To run in development:
EMAIL=your_toggl_email PASSWORD=your_toggl_password mcp dev toggl_mcp_server.pyThis MCP server is licensed under the MIT License.