donetick-mcp-server


Namedonetick-mcp-server JSON
Version 0.3.0 PyPI version JSON
download
home_pageNone
SummaryMCP server for Donetick chores management with JWT authentication, Full API support, and 13 MCP tools
upload_time2025-11-04 03:36:21
maintainerNone
docs_urlNone
authorNone
requires_python>=3.11
licenseMIT
keywords mcp donetick chores api claude
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Donetick MCP Server

[![PyPI version](https://badge.fury.io/py/donetick-mcp-server.svg)](https://pypi.org/project/donetick-mcp-server/)
[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![GitHub](https://img.shields.io/badge/github-jason1365%2Fdonetick--mcp--server-blue?logo=github)](https://github.com/jason1365/donetick-mcp-server)

A production-ready Model Context Protocol (MCP) server for [Donetick](https://donetick.com) chores management. Enables Claude and other MCP-compatible AI assistants to interact with your Donetick instance through a secure, rate-limited API.

## Breaking Changes in v2.0.0

**Important**: Version 2.0.0 introduces breaking changes to authentication. If you're upgrading from v1.x, please read the [Migration Guide](MIGRATION.md).

**What Changed**:
- Authentication now uses JWT with username/password (instead of API tokens)
- API endpoints switched from eAPI to Full API
- 9 previously non-functional features now work (frequency metadata, rolling schedules, multiple assignees, assignment strategies, nagging notifications, pre-due notifications, private chores, points, sub-tasks)
- Premium membership no longer required for advanced features

**Quick Migration**:
1. Replace `DONETICK_API_TOKEN` environment variable with `DONETICK_USERNAME` and `DONETICK_PASSWORD`
2. Update your `.env` file or Claude Desktop configuration
3. Restart the server

See the [Migration Guide](MIGRATION.md) for detailed instructions.

## Features

- **13 MCP Tools**: Complete chore management (list, get, create, complete, delete), label organization (list, create, update, delete), circle member information, user management (list circle users, get user profile)
- **Full Chore Configuration**: All 26+ fields now working including frequency metadata, rolling schedules, multiple assignees, assignment strategies, notifications, labels, priority, points, sub-tasks, and more
- **JWT Authentication**: Automatic token management with transparent refresh
- **Smart Caching**: Intelligent caching for get_chore operations (60s TTL by default)
- **Rate Limiting**: Token bucket algorithm prevents API overload
- **Retry Logic**: Exponential backoff with jitter for resilient operations
- **Async/Await**: Non-blocking operations using httpx
- **Input Validation**: Pydantic field validators with sanitization
- **Security Hardened**: HTTPS enforcement, sanitized logging, secure error messages, JWT token security
- **Docker Support**: Containerized deployment with security best practices
- **Comprehensive Testing**: Unit and integration tests with pytest
- **Type Safety**: Pydantic models for request/response validation

## Quick Start

**Easiest installation (Claude Code CLI):**

```bash
claude mcp add donetick uvx donetick-mcp-server@latest
```

Then configure your Donetick credentials when prompted.

**Or install manually with uvx:**

```bash
# Install uv (one-time setup)
curl -LsSf https://astral.sh/uv/install.sh | sh

# Add to Claude Desktop config
# ~/.config/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "donetick": {
      "command": "uvx",
      "args": ["--refresh", "donetick-mcp-server"],
      "env": {
        "DONETICK_BASE_URL": "https://your-instance.com",
        "DONETICK_USERNAME": "your_username",
        "DONETICK_PASSWORD": "your_password"
      }
    }
  }
}
```

**Benefits:**
- ✅ No installation required - runs directly from PyPI
- ✅ Auto-updates with `--refresh` flag
- ✅ Isolated environment - no conflicts
- ✅ Works on Windows, macOS, Linux

## Requirements

- Donetick instance (self-hosted or cloud)
- Donetick account credentials (username and password)
- **For uvx method:** `uv` installed (see Quick Start)
- **For other methods:** Python 3.11 or higher

## Installation

### Option 1: uvx (Recommended - No Installation Required)

See [Quick Start](#quick-start) above.

The `--refresh` flag ensures you always get the latest version when Claude Desktop restarts.

### Option 2: Docker

1. **Clone the repository**:
   ```bash
   git clone https://github.com/jason1365/donetick-mcp-server.git
   cd donetick-mcp-server
   ```

2. **Create `.env` file**:
   ```bash
   cp .env.example .env
   # Edit .env with your configuration
   ```

3. **Configure environment variables**:
   ```env
   DONETICK_BASE_URL=https://your-instance.com
   DONETICK_USERNAME=your_username
   DONETICK_PASSWORD=your_password
   LOG_LEVEL=INFO
   ```

4. **Build and run**:
   ```bash
   docker-compose build
   docker-compose up -d
   ```

### Option 3: pip install (For System Integration)

If you want to install globally or in a virtual environment:

```bash
# Install from PyPI
pip install donetick-mcp-server

# Or install for development
git clone https://github.com/jason1365/donetick-mcp-server.git
cd donetick-mcp-server
pip install -e .

# Run the server
donetick-mcp-server
# Or: python -m donetick_mcp.server
```

Then configure Claude Desktop to use the installed command:

```json
{
  "mcpServers": {
    "donetick": {
      "command": "donetick-mcp-server",
      "env": {
        "DONETICK_BASE_URL": "https://your-instance.com",
        "DONETICK_USERNAME": "your_username",
        "DONETICK_PASSWORD": "your_password"
      }
    }
  }
}
```

## Authentication

v2.0.0 uses JWT-based authentication with your Donetick credentials.

**What You Need**:
- Your Donetick username (same as web login)
- Your Donetick password (same as web login)

**How It Works**:
1. Server logs in with your credentials on startup
2. JWT token received and stored in memory
3. Token automatically refreshed before expiration
4. No manual token management required

**Security**:
- Credentials stored only in environment variables or `.env` file
- JWT tokens kept in memory only (never persisted to disk)
- Automatic token refresh prevents session expiration
- HTTPS required for all connections

## Claude Desktop Integration

**Easiest Method - Claude Code CLI:**

```bash
claude mcp add donetick uvx donetick-mcp-server@latest
```

**Or manually edit the configuration file:**

**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
**Linux**: `~/.config/Claude/claude_desktop_config.json`

### uvx Configuration (Recommended)

```json
{
  "mcpServers": {
    "donetick": {
      "command": "uvx",
      "args": ["--refresh", "donetick-mcp-server"],
      "env": {
        "DONETICK_BASE_URL": "https://your-instance.com",
        "DONETICK_USERNAME": "your_username",
        "DONETICK_PASSWORD": "your_password"
      }
    }
  }
}
```

**Note:** The `--refresh` flag automatically updates to the latest version.

### Docker Configuration

```json
{
  "mcpServers": {
    "donetick": {
      "command": "docker",
      "args": [
        "exec",
        "-i",
        "donetick-mcp-server",
        "python",
        "-m",
        "donetick_mcp.server"
      ]
    }
  }
}
```

### pip install Configuration

```json
{
  "mcpServers": {
    "donetick": {
      "command": "donetick-mcp-server",
      "env": {
        "DONETICK_BASE_URL": "https://your-instance.com",
        "DONETICK_USERNAME": "your_username",
        "DONETICK_PASSWORD": "your_password"
      }
    }
  }
}
```

After updating the configuration, restart Claude Desktop.

## Available Tools

### 1. list_chores

List all chores with optional filtering.

**Parameters**:
- `filter_active` (boolean, optional): Filter by active status
- `assigned_to_user_id` (integer, optional): Filter by assigned user ID

**Example**:
```
List all active chores assigned to me
```

### 2. get_chore

Get details of a specific chore by ID.

**Parameters**:
- `chore_id` (integer, required): The chore ID

**Example**:
```
Show me details of chore 123
```

### 3. create_chore

Create a new chore with full configuration support.

**Basic Parameters**:
- `name` (string, required): Chore name (1-200 characters)
- `description` (string, optional): Chore description (max 5000 characters)
- `due_date` (string, optional): Due date in YYYY-MM-DD or RFC3339 format
- `created_by` (integer, optional): Creator user ID

**Recurrence/Frequency Parameters**:
- `frequency_type` (string, optional): How often chore repeats - "once", "daily", "weekly", "monthly", "yearly", "interval_based" (default: "once")
- `frequency` (integer, optional): Frequency multiplier, e.g., 1=weekly, 2=biweekly (default: 1)
- `frequency_metadata` (object, optional): Additional frequency config like `{"days": [1,3,5], "time": "09:00"}`
- `is_rolling` (boolean, optional): Rolling schedule (next due based on completion) vs fixed (default: false)

**User Assignment Parameters**:
- `assigned_to` (integer, optional): Primary assigned user ID
- `assignees` (array, optional): Multiple assignees as `[{"userId": 1}, {"userId": 2}]`
- `assign_strategy` (string, optional): Assignment strategy - "least_completed", "round_robin", "random" (default: "least_completed")

**Notification Parameters**:
- `notification` (boolean, optional): Enable notifications (default: false)
- `nagging` (boolean, optional): Enable nagging/reminder notifications (default: false)
- `predue` (boolean, optional): Enable pre-due date notifications (default: false)

**Organization Parameters**:
- `priority` (integer, optional): Priority level 1-5 (1=lowest, 5=highest)
- `labels` (array, optional): Label tags like `["cleaning", "outdoor"]`

**Status Parameters**:
- `is_active` (boolean, optional): Active status - inactive chores are hidden (default: true)
- `is_private` (boolean, optional): Private chore visible only to creator (default: false)

**Gamification Parameters**:
- `points` (integer, optional): Points awarded for completion

**Advanced Parameters**:
- `sub_tasks` (array, optional): Sub-tasks/checklist items

**Examples**:
```
Create a simple one-time chore:
Create a chore called "Take out trash" due on 2025-11-10

Create a recurring chore with notifications:
Create a weekly chore "Clean kitchen" every Monday at 9am with priority 4,
enable nagging notifications, and assign it to user 1

Create an advanced chore:
Create a chore "Grocery shopping" that repeats weekly on Mondays and Wednesdays,
assign to users 1 and 2 using round robin strategy, with priority 3,
labels "shopping" and "outdoor", and award 10 points
```

### 4. complete_chore

Mark a chore as complete.

**Parameters**:
- `chore_id` (integer, required): The chore ID
- `completed_by` (integer, optional): User ID who completed it

**Example**:
```
Mark chore 123 as complete
```

### 5. delete_chore

Delete a chore permanently. **Only the creator can delete**.

**Parameters**:
- `chore_id` (integer, required): The chore ID

**Example**:
```
Delete chore 123
```

### 6. get_circle_members

Get all members in your circle (household/team). Shows who you can assign chores to.

**Parameters**: None

**Returns**:
- User ID
- Username
- Display name
- Role (admin/member)
- Active status
- Points and redeemed points

**Example**:
```
Show me who's in my household
Who can I assign chores to?
List all circle members
```

## Configuration

### Environment Variables

| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `DONETICK_BASE_URL` | Yes | - | Your Donetick instance URL (must use HTTPS) |
| `DONETICK_USERNAME` | Yes | - | Your Donetick username |
| `DONETICK_PASSWORD` | Yes | - | Your Donetick password |
| `LOG_LEVEL` | No | INFO | Logging level (DEBUG, INFO, WARNING, ERROR) |
| `RATE_LIMIT_PER_SECOND` | No | 10.0 | Requests per second limit |
| `RATE_LIMIT_BURST` | No | 10 | Maximum burst size |

### Rate Limiting

The server implements a token bucket rate limiter to prevent API overload:

- **Default**: 10 requests per second with burst capacity of 10
- **Conservative**: Starts conservative and can be increased based on your Donetick instance
- **Respects 429**: Automatically backs off when rate limited by the API

### Retry Logic

- **Exponential backoff** with jitter for transient failures
- **Maximum 3 retries** for most operations
- **Smart retry**: Only retries on 5xx errors and 429 (rate limit)
- **No retry on 4xx**: Client errors fail immediately (except 429)

## Development

### Running Tests

```bash
# Install dev dependencies
pip install -e ".[dev]"

# Run all tests
pytest

# Run with coverage
pytest --cov=donetick_mcp --cov-report=html

# Run specific test file
pytest tests/test_client.py

# Run with verbose output
pytest -v
```

### Project Structure

```
donetick-mcp-server/
├── src/donetick_mcp/
│   ├── __init__.py
│   ├── server.py          # MCP server implementation
│   ├── client.py           # Donetick API client
│   ├── models.py           # Pydantic data models
│   └── config.py           # Configuration management
├── tests/
│   ├── test_client.py      # API client tests
│   └── test_server.py      # MCP server tests
├── tmp/                    # Temporary files (gitignored)
├── Dockerfile
├── docker-compose.yml
├── pyproject.toml
└── README.md
```

**Note**: The `tmp/` directory is used for temporary test scripts and analysis files during development. It's gitignored and not included in releases.

## API Documentation

This server uses the Donetick Full API with JWT authentication. Official documentation:
- **API Docs**: https://docs.donetick.com/
- **GitHub**: https://github.com/donetick/donetick

### Important Notes

1. **Authentication**: Uses JWT Bearer tokens (automatically managed)
2. **Full Feature Support**: All 26+ chore creation fields now working
3. **Automatic Token Refresh**: JWT tokens refreshed transparently
4. **Circle Scoped**: All operations are scoped to your circle (household/team)
5. **No Premium Required**: Advanced features work with standard accounts

## Troubleshooting

### Common Issues

**"DONETICK_BASE_URL environment variable is required"**
- Make sure your `.env` file exists and is properly formatted
- For Docker: ensure environment variables are passed in docker-compose.yml

**"Rate limited, waiting..."**
- The server is respecting API rate limits
- Consider reducing `RATE_LIMIT_PER_SECOND` if this happens frequently

**"Connection refused" or timeout errors**
- Verify your Donetick instance URL is correct
- Check that your Donetick instance is accessible
- Ensure firewall rules allow outbound connections

**"401 Unauthorized" or "Invalid credentials"**
- Verify your username and password are correct
- Check that your account is not locked or disabled
- Ensure you can login to Donetick web interface with the same credentials
- Check for typos in environment variables

**Tools not showing in Claude**
- Restart Claude Desktop after configuration changes
- Check Claude Desktop logs for errors
- Verify the configuration file path is correct

### Debugging

Enable debug logging:

```bash
export LOG_LEVEL=DEBUG
```

Or in Docker:

```yaml
environment:
  - LOG_LEVEL=DEBUG
```

View Docker logs:

```bash
docker-compose logs -f donetick-mcp
```

## Security

- **Credentials**: Never commit credentials to version control (use `.env` file)
- **JWT Tokens**: Stored in memory only, never persisted to disk
- **Automatic Token Refresh**: Prevents session expiration without user intervention
- **Docker Isolation**: Runs as non-root user in container
- **Resource Limits**: Memory and CPU limits prevent resource exhaustion
- **Input Validation**: Pydantic models validate all inputs
- **HTTPS Required**: Server enforces HTTPS for all Donetick connections

## Contributing

Contributions are welcome! Please:

1. Fork the repository
2. Create a feature branch
3. Add tests for new functionality
4. Ensure all tests pass
5. Submit a pull request

## License

MIT License - see LICENSE file for details

## Acknowledgments

- [Donetick](https://donetick.com) - Open source chores management
- [Model Context Protocol](https://modelcontextprotocol.io) - MCP specification
- [Anthropic](https://anthropic.com) - MCP SDK and Claude

## Support

- **Issues**: https://github.com/jason1365/donetick-mcp-server/issues
- **Donetick Docs**: https://docs.donetick.com
- **MCP Docs**: https://modelcontextprotocol.io

---

Built with ❤️ for the Donetick and MCP communities

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "donetick-mcp-server",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": null,
    "keywords": "mcp, donetick, chores, api, claude",
    "author": null,
    "author_email": "Jason <jason1365@users.noreply.github.com>",
    "download_url": "https://files.pythonhosted.org/packages/24/a8/ad60ce22ea5b292afbcd338dae7652db443589f8b78ff2af400025a99f71/donetick_mcp_server-0.3.0.tar.gz",
    "platform": null,
    "description": "# Donetick MCP Server\n\n[![PyPI version](https://badge.fury.io/py/donetick-mcp-server.svg)](https://pypi.org/project/donetick-mcp-server/)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![GitHub](https://img.shields.io/badge/github-jason1365%2Fdonetick--mcp--server-blue?logo=github)](https://github.com/jason1365/donetick-mcp-server)\n\nA production-ready Model Context Protocol (MCP) server for [Donetick](https://donetick.com) chores management. Enables Claude and other MCP-compatible AI assistants to interact with your Donetick instance through a secure, rate-limited API.\n\n## Breaking Changes in v2.0.0\n\n**Important**: Version 2.0.0 introduces breaking changes to authentication. If you're upgrading from v1.x, please read the [Migration Guide](MIGRATION.md).\n\n**What Changed**:\n- Authentication now uses JWT with username/password (instead of API tokens)\n- API endpoints switched from eAPI to Full API\n- 9 previously non-functional features now work (frequency metadata, rolling schedules, multiple assignees, assignment strategies, nagging notifications, pre-due notifications, private chores, points, sub-tasks)\n- Premium membership no longer required for advanced features\n\n**Quick Migration**:\n1. Replace `DONETICK_API_TOKEN` environment variable with `DONETICK_USERNAME` and `DONETICK_PASSWORD`\n2. Update your `.env` file or Claude Desktop configuration\n3. Restart the server\n\nSee the [Migration Guide](MIGRATION.md) for detailed instructions.\n\n## Features\n\n- **13 MCP Tools**: Complete chore management (list, get, create, complete, delete), label organization (list, create, update, delete), circle member information, user management (list circle users, get user profile)\n- **Full Chore Configuration**: All 26+ fields now working including frequency metadata, rolling schedules, multiple assignees, assignment strategies, notifications, labels, priority, points, sub-tasks, and more\n- **JWT Authentication**: Automatic token management with transparent refresh\n- **Smart Caching**: Intelligent caching for get_chore operations (60s TTL by default)\n- **Rate Limiting**: Token bucket algorithm prevents API overload\n- **Retry Logic**: Exponential backoff with jitter for resilient operations\n- **Async/Await**: Non-blocking operations using httpx\n- **Input Validation**: Pydantic field validators with sanitization\n- **Security Hardened**: HTTPS enforcement, sanitized logging, secure error messages, JWT token security\n- **Docker Support**: Containerized deployment with security best practices\n- **Comprehensive Testing**: Unit and integration tests with pytest\n- **Type Safety**: Pydantic models for request/response validation\n\n## Quick Start\n\n**Easiest installation (Claude Code CLI):**\n\n```bash\nclaude mcp add donetick uvx donetick-mcp-server@latest\n```\n\nThen configure your Donetick credentials when prompted.\n\n**Or install manually with uvx:**\n\n```bash\n# Install uv (one-time setup)\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n\n# Add to Claude Desktop config\n# ~/.config/Claude/claude_desktop_config.json\n{\n  \"mcpServers\": {\n    \"donetick\": {\n      \"command\": \"uvx\",\n      \"args\": [\"--refresh\", \"donetick-mcp-server\"],\n      \"env\": {\n        \"DONETICK_BASE_URL\": \"https://your-instance.com\",\n        \"DONETICK_USERNAME\": \"your_username\",\n        \"DONETICK_PASSWORD\": \"your_password\"\n      }\n    }\n  }\n}\n```\n\n**Benefits:**\n- \u2705 No installation required - runs directly from PyPI\n- \u2705 Auto-updates with `--refresh` flag\n- \u2705 Isolated environment - no conflicts\n- \u2705 Works on Windows, macOS, Linux\n\n## Requirements\n\n- Donetick instance (self-hosted or cloud)\n- Donetick account credentials (username and password)\n- **For uvx method:** `uv` installed (see Quick Start)\n- **For other methods:** Python 3.11 or higher\n\n## Installation\n\n### Option 1: uvx (Recommended - No Installation Required)\n\nSee [Quick Start](#quick-start) above.\n\nThe `--refresh` flag ensures you always get the latest version when Claude Desktop restarts.\n\n### Option 2: Docker\n\n1. **Clone the repository**:\n   ```bash\n   git clone https://github.com/jason1365/donetick-mcp-server.git\n   cd donetick-mcp-server\n   ```\n\n2. **Create `.env` file**:\n   ```bash\n   cp .env.example .env\n   # Edit .env with your configuration\n   ```\n\n3. **Configure environment variables**:\n   ```env\n   DONETICK_BASE_URL=https://your-instance.com\n   DONETICK_USERNAME=your_username\n   DONETICK_PASSWORD=your_password\n   LOG_LEVEL=INFO\n   ```\n\n4. **Build and run**:\n   ```bash\n   docker-compose build\n   docker-compose up -d\n   ```\n\n### Option 3: pip install (For System Integration)\n\nIf you want to install globally or in a virtual environment:\n\n```bash\n# Install from PyPI\npip install donetick-mcp-server\n\n# Or install for development\ngit clone https://github.com/jason1365/donetick-mcp-server.git\ncd donetick-mcp-server\npip install -e .\n\n# Run the server\ndonetick-mcp-server\n# Or: python -m donetick_mcp.server\n```\n\nThen configure Claude Desktop to use the installed command:\n\n```json\n{\n  \"mcpServers\": {\n    \"donetick\": {\n      \"command\": \"donetick-mcp-server\",\n      \"env\": {\n        \"DONETICK_BASE_URL\": \"https://your-instance.com\",\n        \"DONETICK_USERNAME\": \"your_username\",\n        \"DONETICK_PASSWORD\": \"your_password\"\n      }\n    }\n  }\n}\n```\n\n## Authentication\n\nv2.0.0 uses JWT-based authentication with your Donetick credentials.\n\n**What You Need**:\n- Your Donetick username (same as web login)\n- Your Donetick password (same as web login)\n\n**How It Works**:\n1. Server logs in with your credentials on startup\n2. JWT token received and stored in memory\n3. Token automatically refreshed before expiration\n4. No manual token management required\n\n**Security**:\n- Credentials stored only in environment variables or `.env` file\n- JWT tokens kept in memory only (never persisted to disk)\n- Automatic token refresh prevents session expiration\n- HTTPS required for all connections\n\n## Claude Desktop Integration\n\n**Easiest Method - Claude Code CLI:**\n\n```bash\nclaude mcp add donetick uvx donetick-mcp-server@latest\n```\n\n**Or manually edit the configuration file:**\n\n**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\n**Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\n**Linux**: `~/.config/Claude/claude_desktop_config.json`\n\n### uvx Configuration (Recommended)\n\n```json\n{\n  \"mcpServers\": {\n    \"donetick\": {\n      \"command\": \"uvx\",\n      \"args\": [\"--refresh\", \"donetick-mcp-server\"],\n      \"env\": {\n        \"DONETICK_BASE_URL\": \"https://your-instance.com\",\n        \"DONETICK_USERNAME\": \"your_username\",\n        \"DONETICK_PASSWORD\": \"your_password\"\n      }\n    }\n  }\n}\n```\n\n**Note:** The `--refresh` flag automatically updates to the latest version.\n\n### Docker Configuration\n\n```json\n{\n  \"mcpServers\": {\n    \"donetick\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"exec\",\n        \"-i\",\n        \"donetick-mcp-server\",\n        \"python\",\n        \"-m\",\n        \"donetick_mcp.server\"\n      ]\n    }\n  }\n}\n```\n\n### pip install Configuration\n\n```json\n{\n  \"mcpServers\": {\n    \"donetick\": {\n      \"command\": \"donetick-mcp-server\",\n      \"env\": {\n        \"DONETICK_BASE_URL\": \"https://your-instance.com\",\n        \"DONETICK_USERNAME\": \"your_username\",\n        \"DONETICK_PASSWORD\": \"your_password\"\n      }\n    }\n  }\n}\n```\n\nAfter updating the configuration, restart Claude Desktop.\n\n## Available Tools\n\n### 1. list_chores\n\nList all chores with optional filtering.\n\n**Parameters**:\n- `filter_active` (boolean, optional): Filter by active status\n- `assigned_to_user_id` (integer, optional): Filter by assigned user ID\n\n**Example**:\n```\nList all active chores assigned to me\n```\n\n### 2. get_chore\n\nGet details of a specific chore by ID.\n\n**Parameters**:\n- `chore_id` (integer, required): The chore ID\n\n**Example**:\n```\nShow me details of chore 123\n```\n\n### 3. create_chore\n\nCreate a new chore with full configuration support.\n\n**Basic Parameters**:\n- `name` (string, required): Chore name (1-200 characters)\n- `description` (string, optional): Chore description (max 5000 characters)\n- `due_date` (string, optional): Due date in YYYY-MM-DD or RFC3339 format\n- `created_by` (integer, optional): Creator user ID\n\n**Recurrence/Frequency Parameters**:\n- `frequency_type` (string, optional): How often chore repeats - \"once\", \"daily\", \"weekly\", \"monthly\", \"yearly\", \"interval_based\" (default: \"once\")\n- `frequency` (integer, optional): Frequency multiplier, e.g., 1=weekly, 2=biweekly (default: 1)\n- `frequency_metadata` (object, optional): Additional frequency config like `{\"days\": [1,3,5], \"time\": \"09:00\"}`\n- `is_rolling` (boolean, optional): Rolling schedule (next due based on completion) vs fixed (default: false)\n\n**User Assignment Parameters**:\n- `assigned_to` (integer, optional): Primary assigned user ID\n- `assignees` (array, optional): Multiple assignees as `[{\"userId\": 1}, {\"userId\": 2}]`\n- `assign_strategy` (string, optional): Assignment strategy - \"least_completed\", \"round_robin\", \"random\" (default: \"least_completed\")\n\n**Notification Parameters**:\n- `notification` (boolean, optional): Enable notifications (default: false)\n- `nagging` (boolean, optional): Enable nagging/reminder notifications (default: false)\n- `predue` (boolean, optional): Enable pre-due date notifications (default: false)\n\n**Organization Parameters**:\n- `priority` (integer, optional): Priority level 1-5 (1=lowest, 5=highest)\n- `labels` (array, optional): Label tags like `[\"cleaning\", \"outdoor\"]`\n\n**Status Parameters**:\n- `is_active` (boolean, optional): Active status - inactive chores are hidden (default: true)\n- `is_private` (boolean, optional): Private chore visible only to creator (default: false)\n\n**Gamification Parameters**:\n- `points` (integer, optional): Points awarded for completion\n\n**Advanced Parameters**:\n- `sub_tasks` (array, optional): Sub-tasks/checklist items\n\n**Examples**:\n```\nCreate a simple one-time chore:\nCreate a chore called \"Take out trash\" due on 2025-11-10\n\nCreate a recurring chore with notifications:\nCreate a weekly chore \"Clean kitchen\" every Monday at 9am with priority 4,\nenable nagging notifications, and assign it to user 1\n\nCreate an advanced chore:\nCreate a chore \"Grocery shopping\" that repeats weekly on Mondays and Wednesdays,\nassign to users 1 and 2 using round robin strategy, with priority 3,\nlabels \"shopping\" and \"outdoor\", and award 10 points\n```\n\n### 4. complete_chore\n\nMark a chore as complete.\n\n**Parameters**:\n- `chore_id` (integer, required): The chore ID\n- `completed_by` (integer, optional): User ID who completed it\n\n**Example**:\n```\nMark chore 123 as complete\n```\n\n### 5. delete_chore\n\nDelete a chore permanently. **Only the creator can delete**.\n\n**Parameters**:\n- `chore_id` (integer, required): The chore ID\n\n**Example**:\n```\nDelete chore 123\n```\n\n### 6. get_circle_members\n\nGet all members in your circle (household/team). Shows who you can assign chores to.\n\n**Parameters**: None\n\n**Returns**:\n- User ID\n- Username\n- Display name\n- Role (admin/member)\n- Active status\n- Points and redeemed points\n\n**Example**:\n```\nShow me who's in my household\nWho can I assign chores to?\nList all circle members\n```\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Required | Default | Description |\n|----------|----------|---------|-------------|\n| `DONETICK_BASE_URL` | Yes | - | Your Donetick instance URL (must use HTTPS) |\n| `DONETICK_USERNAME` | Yes | - | Your Donetick username |\n| `DONETICK_PASSWORD` | Yes | - | Your Donetick password |\n| `LOG_LEVEL` | No | INFO | Logging level (DEBUG, INFO, WARNING, ERROR) |\n| `RATE_LIMIT_PER_SECOND` | No | 10.0 | Requests per second limit |\n| `RATE_LIMIT_BURST` | No | 10 | Maximum burst size |\n\n### Rate Limiting\n\nThe server implements a token bucket rate limiter to prevent API overload:\n\n- **Default**: 10 requests per second with burst capacity of 10\n- **Conservative**: Starts conservative and can be increased based on your Donetick instance\n- **Respects 429**: Automatically backs off when rate limited by the API\n\n### Retry Logic\n\n- **Exponential backoff** with jitter for transient failures\n- **Maximum 3 retries** for most operations\n- **Smart retry**: Only retries on 5xx errors and 429 (rate limit)\n- **No retry on 4xx**: Client errors fail immediately (except 429)\n\n## Development\n\n### Running Tests\n\n```bash\n# Install dev dependencies\npip install -e \".[dev]\"\n\n# Run all tests\npytest\n\n# Run with coverage\npytest --cov=donetick_mcp --cov-report=html\n\n# Run specific test file\npytest tests/test_client.py\n\n# Run with verbose output\npytest -v\n```\n\n### Project Structure\n\n```\ndonetick-mcp-server/\n\u251c\u2500\u2500 src/donetick_mcp/\n\u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u251c\u2500\u2500 server.py          # MCP server implementation\n\u2502   \u251c\u2500\u2500 client.py           # Donetick API client\n\u2502   \u251c\u2500\u2500 models.py           # Pydantic data models\n\u2502   \u2514\u2500\u2500 config.py           # Configuration management\n\u251c\u2500\u2500 tests/\n\u2502   \u251c\u2500\u2500 test_client.py      # API client tests\n\u2502   \u2514\u2500\u2500 test_server.py      # MCP server tests\n\u251c\u2500\u2500 tmp/                    # Temporary files (gitignored)\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 docker-compose.yml\n\u251c\u2500\u2500 pyproject.toml\n\u2514\u2500\u2500 README.md\n```\n\n**Note**: The `tmp/` directory is used for temporary test scripts and analysis files during development. It's gitignored and not included in releases.\n\n## API Documentation\n\nThis server uses the Donetick Full API with JWT authentication. Official documentation:\n- **API Docs**: https://docs.donetick.com/\n- **GitHub**: https://github.com/donetick/donetick\n\n### Important Notes\n\n1. **Authentication**: Uses JWT Bearer tokens (automatically managed)\n2. **Full Feature Support**: All 26+ chore creation fields now working\n3. **Automatic Token Refresh**: JWT tokens refreshed transparently\n4. **Circle Scoped**: All operations are scoped to your circle (household/team)\n5. **No Premium Required**: Advanced features work with standard accounts\n\n## Troubleshooting\n\n### Common Issues\n\n**\"DONETICK_BASE_URL environment variable is required\"**\n- Make sure your `.env` file exists and is properly formatted\n- For Docker: ensure environment variables are passed in docker-compose.yml\n\n**\"Rate limited, waiting...\"**\n- The server is respecting API rate limits\n- Consider reducing `RATE_LIMIT_PER_SECOND` if this happens frequently\n\n**\"Connection refused\" or timeout errors**\n- Verify your Donetick instance URL is correct\n- Check that your Donetick instance is accessible\n- Ensure firewall rules allow outbound connections\n\n**\"401 Unauthorized\" or \"Invalid credentials\"**\n- Verify your username and password are correct\n- Check that your account is not locked or disabled\n- Ensure you can login to Donetick web interface with the same credentials\n- Check for typos in environment variables\n\n**Tools not showing in Claude**\n- Restart Claude Desktop after configuration changes\n- Check Claude Desktop logs for errors\n- Verify the configuration file path is correct\n\n### Debugging\n\nEnable debug logging:\n\n```bash\nexport LOG_LEVEL=DEBUG\n```\n\nOr in Docker:\n\n```yaml\nenvironment:\n  - LOG_LEVEL=DEBUG\n```\n\nView Docker logs:\n\n```bash\ndocker-compose logs -f donetick-mcp\n```\n\n## Security\n\n- **Credentials**: Never commit credentials to version control (use `.env` file)\n- **JWT Tokens**: Stored in memory only, never persisted to disk\n- **Automatic Token Refresh**: Prevents session expiration without user intervention\n- **Docker Isolation**: Runs as non-root user in container\n- **Resource Limits**: Memory and CPU limits prevent resource exhaustion\n- **Input Validation**: Pydantic models validate all inputs\n- **HTTPS Required**: Server enforces HTTPS for all Donetick connections\n\n## Contributing\n\nContributions are welcome! Please:\n\n1. Fork the repository\n2. Create a feature branch\n3. Add tests for new functionality\n4. Ensure all tests pass\n5. Submit a pull request\n\n## License\n\nMIT License - see LICENSE file for details\n\n## Acknowledgments\n\n- [Donetick](https://donetick.com) - Open source chores management\n- [Model Context Protocol](https://modelcontextprotocol.io) - MCP specification\n- [Anthropic](https://anthropic.com) - MCP SDK and Claude\n\n## Support\n\n- **Issues**: https://github.com/jason1365/donetick-mcp-server/issues\n- **Donetick Docs**: https://docs.donetick.com\n- **MCP Docs**: https://modelcontextprotocol.io\n\n---\n\nBuilt with \u2764\ufe0f for the Donetick and MCP communities\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "MCP server for Donetick chores management with JWT authentication, Full API support, and 13 MCP tools",
    "version": "0.3.0",
    "project_urls": {
        "Changelog": "https://github.com/jason1365/donetick-mcp-server/releases",
        "Documentation": "https://github.com/jason1365/donetick-mcp-server#readme",
        "Homepage": "https://github.com/jason1365/donetick-mcp-server",
        "Issues": "https://github.com/jason1365/donetick-mcp-server/issues",
        "Repository": "https://github.com/jason1365/donetick-mcp-server"
    },
    "split_keywords": [
        "mcp",
        " donetick",
        " chores",
        " api",
        " claude"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5ef91e8c23975e8238b2ffcff4908e5096299e1608998e030941ddce5dcc770a",
                "md5": "c54a202f93d69b3d3b56527e009c2d89",
                "sha256": "87d102209a19569ec60d440d999878833d0ee5fcdf4ed611c31a2f7954c0e2d4"
            },
            "downloads": -1,
            "filename": "donetick_mcp_server-0.3.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "c54a202f93d69b3d3b56527e009c2d89",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 30016,
            "upload_time": "2025-11-04T03:36:20",
            "upload_time_iso_8601": "2025-11-04T03:36:20.725682Z",
            "url": "https://files.pythonhosted.org/packages/5e/f9/1e8c23975e8238b2ffcff4908e5096299e1608998e030941ddce5dcc770a/donetick_mcp_server-0.3.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "24a8ad60ce22ea5b292afbcd338dae7652db443589f8b78ff2af400025a99f71",
                "md5": "290be5ef20d5e18b2052b0919856826e",
                "sha256": "dbb49af9d9b4100144c4930b3de5ba5583d9cec2419edb3af5400325ca0e18b6"
            },
            "downloads": -1,
            "filename": "donetick_mcp_server-0.3.0.tar.gz",
            "has_sig": false,
            "md5_digest": "290be5ef20d5e18b2052b0919856826e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 38267,
            "upload_time": "2025-11-04T03:36:21",
            "upload_time_iso_8601": "2025-11-04T03:36:21.970796Z",
            "url": "https://files.pythonhosted.org/packages/24/a8/ad60ce22ea5b292afbcd338dae7652db443589f8b78ff2af400025a99f71/donetick_mcp_server-0.3.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-11-04 03:36:21",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "jason1365",
    "github_project": "donetick-mcp-server",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "donetick-mcp-server"
}
        
Elapsed time: 2.31412s