A comprehensive async Python SDK for TickTick with MCP (Model Context Protocol) server support.
Use TickTick programmatically from Python, or let AI assistants manage your tasks.
httpx for high-performance async operationsTickTick has two different APIs:
| API | Type | What We Use It For |
|---|---|---|
| V1 (OAuth2) | Official, documented | Project with all tasks, basic operations |
| V2 (Session) | Unofficial, reverse-engineered | Tags, folders, habits, focus, subtasks, and more |
The official V1 API is limited. Most of TickTick's power features (tags, habits, focus tracking) are only available through the undocumented V2 web API. This library combines both, routing each operation to the appropriate API automatically.
Based on analysis of the actual source code of available TickTick Python libraries:
| Feature | ticktick-sdk | pyticktick | ticktick-py | tickthon | ticktick-python |
|---|---|---|---|---|---|
| I/O Model | Async | Async | Sync | Sync | Sync |
| Type System | Pydantic V2 | Pydantic V2 | Dicts | attrs | addict |
| MCP Server | Yes | No | No | No | No |
| Habits | Full CRUD | No | Basic | Basic | No |
| Focus/Pomo | Yes | Yes | Yes | Yes | No |
| Unified V1+V2 | Smart Routing | Separate | Both | V2 only | V2 only |
| Subtasks | Advanced | Batch | Yes | Basic | Basic |
| Tags | Full (merge/rename) | Yes | Yes | Yes | No |
Key Differentiators:
httpx for high-performance async operationspip install ticktick-sdk
Requirements: - Python 3.11+ - TickTick account (free or Pro)
Use TickTick with AI assistants like Claude through the Model Context Protocol.
http://127.0.0.1:8080/callbackRun the auth command with your credentials:
TICKTICK_CLIENT_ID=your_client_id \
TICKTICK_CLIENT_SECRET=your_client_secret \
ticktick-sdk auth
This will: 1. Open your browser to TickTick's authorization page 2. Authorize the app - Click "Authorize" to grant access 3. Return to terminal - After authorizing, you'll see output like this:
============================================================
SUCCESS! Here is your access token:
============================================================
a]234abc-5678-90de-f012-34567890abcd
============================================================
NEXT STEPS:
For Claude Code users:
Run (replace YOUR_* placeholders):
claude mcp add ticktick \
-e TICKTICK_CLIENT_ID=YOUR_CLIENT_ID \
...
Note: Sometimes the browser shows an "invalid credentials" error page. Just refresh the page and it should work.
SSH/Headless Users: Add
--manualflag for a text-based flow that doesn't require a browser.
claude mcp add ticktick \
-e TICKTICK_CLIENT_ID=your_client_id \
-e TICKTICK_CLIENT_SECRET=your_client_secret \
-e TICKTICK_ACCESS_TOKEN=your_access_token \
-e TICKTICK_USERNAME=your_email \
-e TICKTICK_PASSWORD=your_password \
-- ticktick-sdk
Note: For
TICKTICK_ACCESS_TOKEN, paste the token you copied from Step 2.
Verify it's working:
claude mcp list # See all configured servers
/mcp # Within Claude Code, check server status
Add to your Claude Desktop config:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"ticktick": {
"command": "ticktick-sdk",
"env": {
"TICKTICK_CLIENT_ID": "your_client_id",
"TICKTICK_CLIENT_SECRET": "your_client_secret",
"TICKTICK_ACCESS_TOKEN": "your_access_token",
"TICKTICK_USERNAME": "your_email",
"TICKTICK_PASSWORD": "your_password"
}
}
}
}
This server works with any tool that supports the Model Context Protocol, which includes most modern AI assistants and IDEs. The configuration is similar - you just need to provide the command (ticktick-sdk) and the environment variables shown above.
The ticktick-sdk command provides several subcommands:
| Command | Description |
|---|---|
ticktick-sdk |
Start the MCP server (default) |
ticktick-sdk server |
Start the MCP server (explicit) |
ticktick-sdk server --host HOST |
Use specific API host (ticktick.com or dida365.com) |
ticktick-sdk server --enabledModules MODULES |
Enable only specific tool modules (comma-separated) |
ticktick-sdk server --enabledTools TOOLS |
Enable only specific tools (comma-separated) |
ticktick-sdk auth |
Get OAuth2 access token (opens browser) |
ticktick-sdk auth --manual |
Get OAuth2 access token (SSH-friendly) |
ticktick-sdk --version |
Show version information |
ticktick-sdk --help |
Show help message |
Tool Filtering (reduces context window usage for AI assistants):
# Enable only task and project tools
ticktick-sdk server --enabledModules tasks,projects
# Enable specific tools only
ticktick-sdk server --enabledTools ticktick_create_tasks,ticktick_list_tasks
# Available modules: tasks, projects, folders, columns, tags, habits, user, focus
Once configured, you can ask Claude things like:
All mutation tools accept lists for batch operations (1-100 items).
| Tool | Description |
|---|---|
ticktick_create_tasks |
Create 1-50 tasks with titles, dates, tags, etc. |
ticktick_get_task |
Get task details by ID |
ticktick_list_tasks |
List tasks (active/completed/abandoned/deleted via status filter) |
ticktick_update_tasks |
Update 1-100 tasks (includes column assignment) |
ticktick_complete_tasks |
Complete 1-100 tasks |
ticktick_delete_tasks |
Delete 1-100 tasks (moves to trash) |
ticktick_move_tasks |
Move 1-50 tasks between projects |
ticktick_set_task_parents |
Set parent-child relationships for 1-50 tasks |
ticktick_unparent_tasks |
Remove parent relationships from 1-50 tasks |
ticktick_search_tasks |
Search tasks by text |
ticktick_pin_tasks |
Pin or unpin 1-100 tasks |
| Tool | Description |
|---|---|
ticktick_list_projects |
List all projects |
ticktick_get_project |
Get project details with tasks |
ticktick_create_project |
Create a new project |
ticktick_update_project |
Update project properties |
ticktick_delete_project |
Delete a project |
| Tool | Description |
|---|---|
ticktick_list_folders |
List all folders |
ticktick_create_folder |
Create a folder |
ticktick_rename_folder |
Rename a folder |
ticktick_delete_folder |
Delete a folder |
| Tool | Description |
|---|---|
ticktick_list_columns |
List columns for a kanban project |
ticktick_create_column |
Create a kanban column |
ticktick_update_column |
Update column name or order |
ticktick_delete_column |
Delete a kanban column |
| Tool | Description |
|---|---|
ticktick_list_tags |
List all tags |
ticktick_create_tag |
Create a tag with color |
ticktick_update_tag |
Update tag properties (includes rename via label) |
ticktick_delete_tag |
Delete a tag |
ticktick_merge_tags |
Merge two tags |
| Tool | Description |
|---|---|
ticktick_habits |
List all habits |
ticktick_habit |
Get habit details |
ticktick_habit_sections |
List sections (morning/afternoon/night) |
ticktick_create_habit |
Create a new habit |
ticktick_update_habit |
Update habit properties (includes archive/unarchive) |
ticktick_delete_habit |
Delete a habit |
ticktick_checkin_habits |
Check in 1-50 habits (supports backdating) |
ticktick_habit_checkins |
Get check-in history |
| Tool | Description |
|---|---|
ticktick_get_profile |
Get user profile |
ticktick_get_status |
Get account status |
ticktick_get_statistics |
Get productivity stats |
ticktick_get_preferences |
Get user preferences |
ticktick_focus_heatmap |
Get focus heatmap data |
ticktick_focus_by_tag |
Get focus time by tag |
Use TickTick programmatically in your Python applications.
Same as MCP setup - go to the TickTick Developer Portal and create an app.
Create a .env file in your project directory:
# V1 API (OAuth2)
TICKTICK_CLIENT_ID=your_client_id_here
TICKTICK_CLIENT_SECRET=your_client_secret_here
TICKTICK_REDIRECT_URI=http://127.0.0.1:8080/callback
TICKTICK_ACCESS_TOKEN= # Will be filled in Step 3
# V2 API (Session)
TICKTICK_USERNAME=your_ticktick_email@example.com
TICKTICK_PASSWORD=your_ticktick_password
# Optional
TICKTICK_TIMEOUT=30
# Source your .env file first, or export the variables
ticktick-sdk auth
Copy the access token to your .env file.
import asyncio
from ticktick_sdk import TickTickClient
async def test():
async with TickTickClient.from_settings() as client:
profile = await client.get_profile()
print(f'Connected as: {profile.display_name}')
asyncio.run(test())
```python import async
$ claude mcp add ticktick-sdk \
-- python -m otcore.mcp_server <graph>