TickTick Task Management
STDIOEnhanced TickTick workflow server with improved filtering capabilities for AI assistants.
Enhanced TickTick workflow server with improved filtering capabilities for AI assistants.
Enhance your TickTick workflow with this MCP server. Built upon the ticktick-py
library, it offers significantly improved filtering capabilities, allowing AI assistants and MCP-compatible applications (like Claude Desktop, VS Code Agent Mode, or mcp-use
) to interact with your tasks with greater precision and power.
This server provides comprehensive access to TickTick functionalities via MCP tools, categorized as follows:
Refer to the tool definitions within the src/ticktick_mcp/tools/
directory for detailed specifications.
This server utilizes the unofficial ticktick-py
library to interact with the TickTick API.
Register a TickTick Application: Before using the server, you need to register an application with TickTick to obtain API credentials. Follow these steps based on the ticktick-py
documentation:
Manage Apps
in the top right corner.+App Name
button. Provide a name for your application (e.g., "MCP Server").Client ID
and Client Secret
.OAuth Redirect URL
, enter a URL where you want to be redirected after authorizing the application. It doesn't need to be a live URL
http://localhost:8080/redirect
or http://127.0.0.1:8080/
are common choices for local development.Environment Variables: The server requires the TickTick API credentials you just obtained, plus your TickTick login details. By default, it looks for a .env
file located at ~/.config/ticktick-mcp/.env
.
~/.config/ticktick-mcp/
directory if it doesn't exist, but it's safer to create it manually..env
file manually within that directory.--dotenv-dir
command-line argument only when running the server directly via Python (see "Running the Server" below).The .env
file should contain:
TICKTICK_CLIENT_ID=your_client_id # Obtained in Step 1 TICKTICK_CLIENT_SECRET=your_client_secret # Obtained in Step 1 TICKTICK_REDIRECT_URI=your_redirect_uri # Entered in Step 1 (must match exactly) TICKTICK_USERNAME=your_ticktick_email # Your TickTick login email TICKTICK_PASSWORD=your_ticktick_password # Your TickTick login password (or app password if enabled)
ticktick-py
library will initiate an OAuth2 authentication flow.
TICKTICK_REDIRECT_URI
you specified.
code=
parameter) back into the terminal..token-oauth
file will be created in the same directory as your .env
file.You can run the server in two main ways:
1. Via an MCP Client (Recommended for AI Assistant Integration):
Configure your MCP client (like Claude Desktop, VS Code Agent Mode, etc.) to use the server. Example configuration:
{ "mcpServers": { "ticktick": { "command": "uvx", "args": [ "--from", "git+https://github.com/jen6/ticktick-mcp.git", "ticktick-mcp" // Optional: Add "--dotenv-dir", "/path/to/your/config" if needed, // but standard clients might not support passing extra args easily. ] } } }
This server provides the following tools for interacting with the TickTick task management service:
ticktick_create_task
title
(string): The title of the task. Required.projectId
(string, optional): ID of the project to add the task to.content
(string, optional): Additional details or notes for the task.desc
(string, optional): Description for the task.allDay
(boolean, optional): Set to True if the task spans the entire day.startDate
(string, optional): Start date/time in ISO 8601 format.dueDate
(string, optional): Due date/time in ISO 8601 format.timeZone
(string, optional): IANA timezone name (e.g., 'Asia/Seoul').reminders
(array of strings, optional): List of reminder triggers in RFC 5545 format.repeat
(string, optional): Recurring rule in RFC 5545 format.priority
(integer, optional): Task priority (0=None, 1=Low, 3=Medium, 5=High).sortOrder
(integer, optional): Custom sort order value.items
(array of objects, optional): List of subtask dictionaries.ticktick_update_task
task_object
(object): A dictionary with task properties to update including the task id
.ticktick_delete_tasks
task_ids
(string or array of strings): A single task ID or list of task IDs to delete.ticktick_complete_task
task_id
(string): The ID of the task to mark as complete.ticktick_move_task
task_id
(string): The ID of the task to move.new_project_id
(string): The ID of the destination project.ticktick_make_subtask
parent_task_id
(string): The ID of the task that will become the parent.child_task_id
(string): The ID of the task that will become the subtask.ticktick_get_by_id
obj_id
(string): The unique ID of the object to retrieve.ticktick_get_all
search
(string): The type of objects to retrieve (e.g., 'tasks', 'projects', 'tags').ticktick_get_tasks_from_project
project_id
(string): The ID of the project.ticktick_filter_tasks
filter_criteria
(object): Dictionary with filtering parameters such as:
status
(string): Task status ('uncompleted' or 'completed').project_id
(string, optional): Project ID to filter tasks by.tag_label
(string, optional): Tag name to filter tasks by.priority
(integer, optional): Priority level.due_start_date
(string, optional): ISO format start date for due date filter.due_end_date
(string, optional): ISO format end date for due date filter.completion_start_date
(string, optional): Start date for completion date filter.completion_end_date
(string, optional): End date for completion date filter.sort_by_priority
(boolean, optional): Sort results by priority.tz
(string, optional): Timezone for date interpretation.ticktick_convert_datetime_to_ticktick_format
datetime_iso_string
(string): The date/time string in ISO 8601 format.tz
(string): IANA timezone name to interpret the date/time.## Persona: Daily Stand-up Agent
- **Role**: AI agent integrated with the user's TickTick account to assist in daily work planning
- **Goal**: Help the user start their day efficiently, focus on key tasks, and break large tasks into manageable subtasks
---
## Core Features & Workflow
1. **Fetch Current Time**
- Retrieve current time using `time mcp`.
2. **Session Start & Data Loading**
- The user initiates the session with a command like "Start daily stand-up" or "Hello."
- Call TickTick MCP API to fetch all tasks due **today**.
- Optionally notify the user that data is loading (e.g., "Fetching today's and overdue tasks from TickTick…").
3. **Daily Briefing**
Good morning! Today's date is {YYYY-MM-DD}. Here's your daily stand-up from TickTick:
**Tasks Due Today:**
- Task Name 1
- Task Name 2
…
**Overdue Tasks:**
- Task Name 3
- Task Name 4
…
4. **Select Key Task**
> "Which of these tasks would you like to focus on first or must complete today?
> Or is there another important task you'd like to add?"
5. **Task Breakdown (Subtask Creation)**
- After the user selects a main task, suggest 2–5 specific subtasks needed to complete it.
- Example (if "Write project report" is selected):
1. Draft outline & table of contents (10 min)
2. Gather & analyze data (30 min)
3. Write section drafts (1 h)
4. Review & revise draft (30 min)
5. Final submission (10 min)
6. **Confirm & Add Subtasks**
- Ask the user to confirm or adjust the suggested subtasks:
> "Does this breakdown look good? Any changes?"
- Once approved, call MCP to add each subtask to TickTick, setting them as children of the main task if supported, naming them "[Main Task] – [Subtask]".
mcp.ticktick.addTask({
name: "[Main Task] – [Subtask]",
parentId: "..."
});
7. **Session Close**
> "All subtasks have been added to TickTick. Have a productive day! Anything else I can help with?"
---
## Additional Guidelines
- **Tone & Manner**: Friendly, proactive, and organized.
- **MCP Interface Examples**:
// Fetch today's due tasks
mcp.ticktick.getTasks({
filter_criteria: {
status: "uncompleted",
tz: "Asia/Seoul",
due_end_date: "2025-04-29"
}
});
// Add a subtask
mcp.ticktick.addTask({
name: "Project Report – Write Draft",
parentId: "task123"
});
- **Error Handling**: Inform the user and suggest retrying on MCP call failures.
- **Clarity**: Present task lists and subtask suggestions clearly.
- **Plan First**: Use `sequential thinking mcp` to plan steps before adding or modifying tasks.
Contributions are welcome! Please feel free to open an issue or submit a pull request.
This project is licensed under the MIT License - see the LICENSE file for details.