Workhours Calendar MCP Server
Enables tracking worked hours by client, project, and task, with monthly/daily reports and natural language interaction through Claude.
README
Workhours Calendar
Track worked hours by client → project → task. At the end of the month, see how many hours went into each project or client, how long a task took, and what was worked on any given day — via REST API, Swagger UI, or by just asking Claude (MCP server + Claude Code plugin included).
Install
The only requirement is Docker.
Linux / macOS / Raspberry Pi:
curl -fsSL https://raw.githubusercontent.com/gifflet/workhours-calendar/main/install.sh | sh
Windows (PowerShell):
irm https://raw.githubusercontent.com/gifflet/workhours-calendar/main/install.ps1 | iex
The script pulls the prebuilt multi-arch images (amd64, arm64, arm/v7),
starts MongoDB and the API, and waits until everything is healthy:
- API: http://localhost:8001 — Swagger UI: http://localhost:8001/docs
- Data persists in the
workhours_mongovolume; containers restart with Docker on boot - Re-run the script anytime to update (data is kept)
WORKHOURS_PORTchanges the API port;MONGO_URLpoints to an external MongoDB (required on 32-bit ARM). Raspberry Pi 3/4 automatically getmongo:4.4, since MongoDB 5+ needs ARMv8.2-A.
Uninstall: docker rm -f workhours-api workhours-mongo && docker volume rm workhours_mongo
Use with Claude Code
Install the plugin once (user scope — available in every project):
/plugin marketplace add gifflet/workhours-calendar
/plugin install workhours@workhours-calendar
Then just ask in natural language:
"Log 2.5 hours today on the CI pipeline task of ACME's ERP project"
"How many hours did I work for ACME in August?"
"Which tasks did I work on yesterday?"
The plugin bundles the MCP server (prebuilt Docker image — nothing to clone or
build) and a skill that teaches the model the workflows: resolve names to ids,
create missing clients/projects/tasks on demand, and answer report questions
with a single tool call. Source: plugins/workhours.
API
Interactive docs at /docs (Swagger UI) and /redoc.
| Resource | Endpoints |
|---|---|
| Clients | POST/GET /clients, GET/PATCH/DELETE /clients/{id} |
| Projects | POST/GET /projects (filter by client_id), GET/PATCH/DELETE /projects/{id} |
| Tasks | POST/GET /tasks (filter by project_id, status), GET/PATCH/DELETE /tasks/{id} |
| Time entries | POST/GET /entries (filter by dates, task, project, client), GET/PATCH/DELETE /entries/{id} |
| Reports | GET /reports/monthly, GET /reports/daily, GET /reports/task/{task_id} |
| Health | GET /health (includes MongoDB status) |
- Dates use
YYYY-MM-DD; hours are decimal (1.5= 1h30). - A time entry needs a
task_idor aproject_id; client and project are denormalized into the entry automatically for fast reporting. - Deletes are guarded: a client/project/task with children or time entries can't be deleted (HTTP 409).
# Hours in August 2026, broken down by client, project, task and day
curl "http://localhost:8001/reports/monthly?year=2026&month=8"
# What was worked on a specific day
curl "http://localhost:8001/reports/daily?date=2026-08-12"
# Total effort spent on a task
curl "http://localhost:8001/reports/task/<task_id>"
Other MCP clients
The MCP server exposes 14 tools over stdio (create_client, log_hours,
monthly_report, daily_report, task_report, ...). To register it outside
the Claude Code plugin, run the published image with -i:
claude mcp add workhours \
-- docker run -i --rm \
--add-host host.docker.internal:host-gateway \
-e WORKHOURS_API_URL=http://host.docker.internal:8001 \
ghcr.io/gifflet/workhours-calendar-mcp:latest
The WORKHOURS_API_URL environment variable points the server at the API.
Development
# Everything in containers (builds locally)
docker compose up --build
# Or API on the host (needs MongoDB on localhost:27017 — uncomment the
# ports mapping in docker-compose.yaml to publish the mongodb service)
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/uvicorn app.main:app --reload --port 8001
The API reads MONGO_URL (default mongodb://localhost:27017) and MONGO_DB
(default workhours). The repo ships a project-scoped .mcp.json that runs
the MCP server from the local venv. Test it standalone with:
npx @modelcontextprotocol/inspector .venv/bin/python mcp_server/server.py
CI (.github/workflows/docker-build.yml) builds and publishes
ghcr.io/gifflet/workhours-calendar-api and ...-mcp for linux/amd64,
linux/arm64 and linux/arm/v7 on every push to main and on v* tags;
pull requests build without publishing.
app/ # FastAPI app (routers, schemas, Mongo access)
mcp_server/ # MCP stdio server calling the API
plugins/workhours/ # Claude Code plugin (skill + MCP via Docker image)
.claude-plugin/ # Plugin marketplace manifest
install.sh install.ps1 # One-command installers
Dockerfile Dockerfile.mcp # API and MCP server images
docker-compose.yaml
.github/workflows/docker-build.yml # Multi-arch build + publish to GHCR
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。