KIMAI MCP Server
Enables LLMs to interact with KIMAI 2 time tracking for managing timesheets, projects, activities, customers, and generating reports.
README
KIMAI MCP Server
A Model Context Protocol (MCP) server for KIMAI 2 time tracking application. This server enables Large Language Models to interact with KIMAI for time tracking, project management, and reporting.
Features
Time Tracking
- Start/Stop Time Entries: Begin and end time tracking in real-time
- Create Time Entries: Add historical time entries with custom start/end times
- Update Time Entries: Modify existing entries (times, descriptions, tags)
- Delete Time Entries: Remove incorrect or duplicate entries
- Query Time Entries: Search and filter timesheets by project, activity, customer, user, date range, and status
Project & Activity Management
- List Projects & Activities: Browse available projects and activities
- Create Projects: Set up new projects under customers
- Create Activities: Define new work types (global or project-specific)
- Update Projects & Activities: Modify names, visibility, billable status, and colors
Customer Management
- List Customers: View all customers
- Create Customers: Add new clients with currency preferences
- Update Customers: Modify customer information and settings
Reporting & Analytics
- Timesheet Summaries: Generate reports with total hours, billable vs non-billable time
- Project Breakdowns: See time distribution across projects
- Activity Analysis: Analyze time spent on different activity types
- Flexible Filtering: Filter reports by user, customer, project, activity, and date range
Prerequisites
- KIMAI 2: A running KIMAI 2 instance (version 2.0 or higher)
- Python: Python 3.10 or higher
- API Token: Bearer token from your KIMAI user profile
Installation
Quick Setup (Recommended)
-
Clone or download this repository:
cd /projects/personal/kimai-mcp -
Run the setup script:
./setup.sh -
Edit
.envfile with your KIMAI credentials:nano .env # or use your preferred editor -
Test the connection:
source .venv/bin/activate python3 test_connection.py
Manual Setup
-
Install dependencies using uv:
uv venv uv pip install -r requirements.txt -
Configure environment variables:
cp .env.example .env # Edit .env with your KIMAI URL and API token
Generate KIMAI API Token
- Log into your KIMAI instance
- Navigate to: User Profile > API
- Click "Create New Token"
- Copy the token and add it to your
.envfile
Configuration
Environment Variables
The server requires two environment variables:
| Variable | Description | Example |
|---|---|---|
KIMAI_BASE_URL |
Base URL of your KIMAI instance | http://localhost:8001 |
KIMAI_API_TOKEN |
Bearer token for API authentication | <token_here> |
Claude Code Configuration
To use this MCP server with Claude Code (CLI), add it to your MCP settings file.
Location: ~/.claude/mcp_settings.json or your project's .claude/mcp_settings.json
Add the following configuration:
{
"mcpServers": {
"kimai": {
"command": "/projects/personal/kimai-mcp/.venv/bin/python",
"args": ["/projects/personal/kimai-mcp/server.py"],
"env": {
"KIMAI_BASE_URL": "http://localhost:8001",
"KIMAI_API_TOKEN": "<your_api_token_here>"
}
}
}
}
Important Notes:
- Use absolute paths for both
commandandargs - Replace
/projects/personal/kimai-mcpwith your actual installation path - Replace
<your_api_token_here>with your KIMAI API token - The Python binary should point to your virtual environment
After adding the configuration, restart Claude Code to load the MCP server. You can verify it's loaded by checking for KIMAI-related tools.
Claude Desktop Configuration
Add this MCP server to your Claude Desktop configuration:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"kimai": {
"command": "/projects/personal/kimai-mcp/.venv/bin/python",
"args": ["/projects/personal/kimai-mcp/server.py"],
"env": {
"KIMAI_BASE_URL": "http://localhost:8001",
"KIMAI_API_TOKEN": "your_api_token_here"
}
}
}
}
Note: Make sure to use absolute paths and point to the Python binary in your virtual environment.
Available Tools
Timesheet Tools
list_timesheets
List timesheet entries with filtering options.
Parameters:
user(optional): Filter by user IDcustomer(optional): Filter by customer IDproject(optional): Filter by project IDactivity(optional): Filter by activity IDactive(optional): Filter for running timesheets onlyexported(optional): Filter by export statusbegin(optional): Start date filter (ISO 8601)end(optional): End date filter (ISO 8601)page(default: 1): Page number for paginationsize(default: 50): Results per page (max 100)format(default: "json"): Response format ("json" or "markdown")
Example:
List all running timesheets
Show me timesheets for project 1 from last week
get_timesheet
Get detailed information about a specific timesheet.
Parameters:
id: Timesheet ID (required)format: Response format ("json" or "markdown")
Example:
Get details for timesheet #1245
start_timesheet
Start tracking time for a project and activity.
Parameters:
project: Project ID (required)activity: Activity ID (required)description(optional): Work descriptiontags(optional): Comma-separated tags
Example:
Start tracking time for project 1, activity 355
Start timer for "Code Review" on project 2
stop_timesheet
Stop a running timesheet entry.
Parameters:
id: Timesheet ID to stop (required)
Example:
Stop timesheet #1245
create_timesheet
Create a time entry with specific start/end times.
Parameters:
project: Project ID (required)activity: Activity ID (required)begin: Start datetime in ISO 8601 format (required)end(optional): End datetime (omit for running entry)description(optional): Work descriptiontags(optional): Comma-separated tags
Example:
Create a timesheet for yesterday from 9am to 5pm on project 1, activity 355
Log 3 hours of work for project 2, activity 10
update_timesheet
Update an existing timesheet entry.
Parameters:
id: Timesheet ID (required)begin(optional): New start datetimeend(optional): New end datetimedescription(optional): Updated descriptiontags(optional): Updated tags
Example:
Update timesheet #1245 with description "Fixed bug in authentication"
Change the end time of timesheet #1244 to 6pm
delete_timesheet
Delete a timesheet entry.
Parameters:
id: Timesheet ID (required)
Example:
Delete timesheet #1245
Project Tools
list_projects
List all projects with filtering.
Parameters:
customer(optional): Filter by customer IDvisible(optional): Filter by visibilitypage(default: 1): Page numbersize(default: 50): Results per pageformat(default: "json"): Response format
Example:
List all projects
Show me projects for customer 1
get_project
Get details about a specific project.
Parameters:
id: Project ID (required)format: Response format
Example:
Get details for project #1
create_project
Create a new project.
Parameters:
name: Project name (required)customer: Customer ID (required)visible(default: true): Visibilitybillable(default: true): Billable statuscolor(optional): Hex color code
Example:
Create a new project "Website Redesign" for customer 1
update_project
Update a project's details.
Parameters:
id: Project ID (required)name(optional): New namevisible(optional): New visibilitybillable(optional): New billable statuscolor(optional): New color
Example:
Rename project #1 to "Mobile App Development"
Make project #2 non-billable
Activity Tools
list_activities
List all activities.
Parameters:
project(optional): Filter by project IDvisible(optional): Filter by visibilitypage(default: 1): Page numbersize(default: 50): Results per pageformat(default: "json"): Response format
Example:
List all activities
Show activities for project 1
get_activity
Get details about a specific activity.
Parameters:
id: Activity ID (required)format: Response format
Example:
Get details for activity #355
create_activity
Create a new activity.
Parameters:
name: Activity name (required)project(optional): Project ID (omit for global)visible(default: true): Visibilitybillable(default: true): Billable statuscolor(optional): Hex color code
Example:
Create a new activity called "Code Review"
Create a global activity "Meeting"
update_activity
Update an activity's details.
Parameters:
id: Activity ID (required)name(optional): New namevisible(optional): New visibilitybillable(optional): New billable statuscolor(optional): New color
Example:
Rename activity #355 to "Senior Code Review"
Customer Tools
list_customers
List all customers.
Parameters:
visible(optional): Filter by visibilitypage(default: 1): Page numbersize(default: 50): Results per pageformat(default: "json"): Response format
Example:
List all customers
get_customer
Get details about a specific customer.
Parameters:
id: Customer ID (required)format: Response format
Example:
Get details for customer #1
create_customer
Create a new customer.
Parameters:
name: Customer name (required)currency(default: "USD"): 3-letter currency codevisible(default: true): Visibilitybillable(default: true): Billable statuscolor(optional): Hex color code
Example:
Create a new customer "Acme Corporation" with EUR currency
update_customer
Update a customer's details.
Parameters:
id: Customer ID (required)name(optional): New namecurrency(optional): New currencyvisible(optional): New visibilitybillable(optional): New billable statuscolor(optional): New color
Example:
Change customer #1 currency to CAD
Reporting Tools
get_timesheet_summary
Generate summary reports of timesheet data.
Parameters:
user(optional): Filter by user IDcustomer(optional): Filter by customer IDproject(optional): Filter by project IDactivity(optional): Filter by activity IDbegin(optional): Start date (ISO 8601)end(optional): End date (ISO 8601)format(default: "markdown"): Response format
Example:
Generate a timesheet report for this week
Show me total hours for project 1 this month
Summary of all billable hours for customer 1
Usage Examples
Time Tracking Workflow
User: Start tracking time for the FNLR project
Claude: [Uses list_projects to find "First Nations Land Register"]
[Uses list_activities to find appropriate activity]
[Uses start_timesheet with project=1, activity=355]
User: Stop the timer
Claude: [Uses list_timesheets with active=true to find running entry]
[Uses stop_timesheet with the ID]
User: Add a description "Implemented authentication feature"
Claude: [Uses update_timesheet to add description]
Reporting Workflow
User: How much time did I spend on project 1 this week?
Claude: [Uses get_timesheet_summary with project=1, date filters]
[Returns markdown report with breakdown]
User: Show me all my timesheets from yesterday
Claude: [Uses list_timesheets with date filters, format=markdown]
[Returns formatted list of entries]
Project Setup Workflow
User: Create a new customer "Acme Corp" and project "Website Redesign"
Claude: [Uses create_customer with name="Acme Corp"]
[Uses create_project with the new customer ID]
[Uses create_activity for common tasks]
User: What activities are available for this project?
Claude: [Uses list_activities with the new project ID]
Response Formats
The server supports two response formats:
JSON Format
Structured data ideal for programmatic processing:
{
"id": 1245,
"project": 1,
"activity": 355,
"begin": "2025-11-05T15:36:00+0100",
"end": "2025-11-05T18:10:00+0100",
"duration": 9240
}
Markdown Format
Human-readable format ideal for reports and summaries:
## Timesheet #1245
**Status:** ✓ Completed
**Project ID:** 1
**Activity ID:** 355
**Duration:** 2.57 hours (9240 seconds)
Error Handling
The server provides clear, actionable error messages:
- Authentication errors: Check your API token
- Not found errors: Verify IDs exist
- Validation errors: Review parameter formats
- Network errors: Verify KIMAI URL is accessible
All errors include suggestions for resolution.
Development
Testing the Server
# Set environment variables
export KIMAI_BASE_URL=http://localhost:8001
export KIMAI_API_TOKEN=your_token
# Run the server directly (will wait for stdio input)
python server.py
Project Structure
kimai-mcp/
├── server.py # Main MCP server implementation
├── requirements.txt # Python dependencies
├── .env.example # Environment variable template
└── README.md # This file
Troubleshooting
Server won't start
- Check Python version (3.10+ required)
- Verify all dependencies are installed:
pip install -r requirements.txt - Ensure environment variables are set
API errors
- Verify KIMAI instance is running and accessible
- Check API token is valid (not expired)
- Ensure token has appropriate permissions
Empty results
- Check filters are not too restrictive
- Verify data exists in KIMAI
- Try without filters first
Contributing
Contributions are welcome! Please ensure:
- Code follows Python best practices
- Pydantic models validate all inputs
- Error messages are clear and actionable
- Documentation is updated
License
This project is open source and available under the MIT License.
Support
For issues or questions:
- KIMAI documentation: https://www.kimai.org/documentation/
- MCP documentation: https://modelcontextprotocol.io/
Changelog
v1.0.0 (2025-11-06)
- Initial release
- Full timesheet management (CRUD operations)
- Project, activity, and customer management
- Summary reporting and analytics
- Support for JSON and Markdown response formats
- Comprehensive error handling
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.