MCPcopy Index your code
hub / github.com/dev-mirzabicer/ticktick-sdk

github.com/dev-mirzabicer/ticktick-sdk @v0.4.3

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.4.3 ↗ · + Follow
1,260 symbols 3,893 edges 46 files 1,206 documented · 96%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

ticktick-sdk: A TickTick MCP Server & Full Python SDK

PyPI - Version Python 3.11+ License: MIT PyPI Downloads

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.

Table of Contents


Features

MCP Server

  • 43 Tools: Streamlined coverage of TickTick functionality
  • Batch Operations: All mutations accept lists (1-100 items) for bulk operations
  • AI-Ready: Works with Claude, GPT, and other MCP-compatible assistants
  • Dual Output: Markdown for humans, JSON for machines

Python Library

  • Full Async Support: Built on httpx for high-performance async operations
  • Batch Operations: Create, update, delete, complete up to 100 tasks in a single call
  • Complete Task Management: Create, read, update, delete, complete, move, pin tasks
  • Kanban Boards: Full column management (create, update, delete, move tasks between columns)
  • Project Organization: Projects, folders, kanban boards
  • Tag System: Hierarchical tags with colors
  • Habit Tracking: Full CRUD for habits with batch check-ins, streaks, and goals
  • Focus/Pomodoro: Access focus session data and statistics
  • User Analytics: Productivity scores, levels, completion rates

Developer Experience

  • Type-Safe: Full Pydantic v2 validation with comprehensive type hints
  • Well-Tested: 300+ tests covering both mock and live API interactions
  • Documented: Extensive docstrings and examples

Why This Library?

The Two-API Problem

TickTick 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.

Compared to Other Libraries

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:

  • MCP Server: Only ticktick-sdk provides AI assistant integration via Model Context Protocol
  • Unified API Routing: Automatically routes operations to V1 or V2 based on feature requirements
  • Full Habit CRUD: Complete habit management including check-ins, streaks, archive/unarchive
  • Async-First: Built on httpx for high-performance async operations

Installation

pip install ticktick-sdk

Requirements: - Python 3.11+ - TickTick account (free or Pro)


MCP Server Setup & Usage

Use TickTick with AI assistants like Claude through the Model Context Protocol.

Step 1: Register Your App

  1. Go to the TickTick Developer Portal
  2. Click "Create App"
  3. Fill in:
  4. App Name: e.g., "My TickTick MCP"
  5. Redirect URI: http://127.0.0.1:8080/callback
  6. Save your Client ID and Client Secret

Step 2: Get OAuth2 Access Token

Run 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 \
      ...
  1. Copy this token - You'll need it in the next step

Note: Sometimes the browser shows an "invalid credentials" error page. Just refresh the page and it should work.

SSH/Headless Users: Add --manual flag for a text-based flow that doesn't require a browser.

Step 3: Configure Your AI Assistant

Claude Code (Recommended)

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

Claude Desktop

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"
      }
    }
  }
}

Other MCP-Compatible Tools

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.

CLI Reference

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

Example Conversations

Once configured, you can ask Claude things like:

  • "What tasks do I have due today?"
  • "Create a task to call John tomorrow at 2pm"
  • "Show me my high priority tasks"
  • "Mark the grocery shopping task as complete"
  • "What's my current streak for the Exercise habit?"
  • "Check in my meditation habit for today"
  • "Create a new habit to drink 8 glasses of water daily"

Available MCP Tools (43 Total)

All mutation tools accept lists for batch operations (1-100 items).

Task Tools (Batch-Capable)

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

Project Tools

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

Folder Tools

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

Kanban Column Tools

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

Tag Tools

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

Habit Tools (Batch-Capable)

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

User & Analytics Tools

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

Python Library Setup & Usage

Use TickTick programmatically in your Python applications.

Setup

Step 1: Register Your App

Same as MCP setup - go to the TickTick Developer Portal and create an app.

Step 2: Create Your .env File

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

Step 3: Get OAuth2 Access Token

# Source your .env file first, or export the variables
ticktick-sdk auth

Copy the access token to your .env file.

Step 4: Verify Setup

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())

Quick Start

```python import async

Core symbols most depended-on inside this repo

_ensure_initialized
called by 63
src/ticktick_sdk/unified/api.py
get_client
called by 43
src/ticktick_sdk/server.py
handle_error
called by 43
src/ticktick_sdk/server.py
colorize
called by 37
src/ticktick_sdk/auth_cli.py
from_v2
called by 22
src/ticktick_sdk/models/tag.py
sync
called by 20
src/ticktick_sdk/client/client.py
connect
called by 19
src/ticktick_sdk/client/client.py
_get_json
called by 19
src/ticktick_sdk/api/base.py

Shape

Method 832
Class 248
Function 163
Route 17

Languages

Python100%

Modules by API surface

tests/conftest.py160 symbols
tests/test_client_tasks.py85 symbols
src/ticktick_sdk/client/client.py77 symbols
src/ticktick_sdk/unified/api.py75 symbols
src/ticktick_sdk/server.py71 symbols
src/ticktick_sdk/api/v2/client.py64 symbols
src/ticktick_sdk/api/v2/types.py55 symbols
src/ticktick_sdk/tools/inputs.py47 symbols
src/ticktick_sdk/tools/formatting.py47 symbols
tests/test_client_tags.py39 symbols
tests/test_client_projects.py38 symbols
tests/test_client_errors.py38 symbols

For agents

$ claude mcp add ticktick-sdk \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page