timemanager-mcp
A standalone stdio MCP server exposing your TimeManager tasks to a coding assistant. It uses the official MCP Python SDK (stable v1), Python 3.11+, and HTTPS requests to your hosted TimeManager API. It imports no TimeManager application code and needs no access to the private application repository.
Availability
Published to PyPI as timemanager-mcp; uvx timemanager-mcp works as shown
below. This directory is still the package's source of truth — it has not
yet been extracted into its own public repository (see "Independent
development and release").
Configure
- Open your TimeManager bot and run
/dev_token. Generate a token and save it immediately; it is shown once. Rotation invalidates the previous token. - Set
TIMEMANAGER_API_URLto the API origin (for example,https://your-timemanager.example) or its/api/v1root. - Set
TIMEMANAGER_TOKENto yourtm_pat_...token in the environment inherited by the MCP process. Keep it out of version-controlled files. - Register the command
uvxwith arguments["timemanager-mcp"]in your assistant's MCP server configuration.
There is no required task category: point the assistant at any task by ID and use your own judgment about which ones make sense to hand off.
A generic mcpServers configuration for clients using that format:
{
"mcpServers": {
"timemanager": {
"command": "uvx",
"args": ["timemanager-mcp"]
}
}
}
The parent process must pass both environment variables to this server. If a
client uses its own env settings, place credentials only in its private local
configuration. Variable interpolation syntax depends on the MCP client.
Tools
| Tool | Arguments | Behavior |
|---|---|---|
list_tasks |
optional status, category |
List up to 100 tasks |
get_task |
task_id |
Read full task detail |
fetch_task_attachment |
task_id, attachment_id |
Fetch one listed image or file, up to 20 MiB |
start_task |
task_id |
Mark a pending task in progress |
finish_task |
task_id |
Finish a pending/in-progress task |
IDs accept Mongo ObjectIds or short IDs such as 12 or #12. Status accepts
pending, scheduled, in_progress, completed, cancelled, or blocked.
Without a status, the API lists all statuses up to its default 100-task limit;
the API currently has no offset pagination. Use status filters to narrow results.
Results retain API task details, source metadata, and lifecycle effects. A
recurring task can reopen after finishing; inspect the completion field.
Lifecycle restrictions (including blocked or scheduled tasks) remain API-owned.
There are no create, edit, delete, or progress-note tools in this release.
get_task includes task.attachments with opaque attachment_id, kind,
filename, MIME type, and optional size. It does not download attachments.
Call fetch_task_attachment explicitly for an ID from that list. PNG, JPEG,
WebP, and GIF responses are native MCP image content; other files are embedded
binary resources with base64 content and their response MIME type. Client support
determines how files are displayed. The bridge writes no local files and follows
no attachment URLs. Downloads use the same authenticated API, with a 20 MiB
decoded-byte limit checked while streaming. Telegram file IDs and bot credentials
remain on the backend. Older tasks without captured attachment references have
an empty list; opening their original Telegram message remains available in the bot.
Every detail or lifecycle tool performs an authenticated task GET before its
task-ID operations, then uses the canonical ID from that GET. Mutations use a
fresh Idempotency-Key for each invocation. Reinvoking a tool starts a new
operation; inspect the task first if a previous request's outcome is
uncertain. The API enforces ownership using the token's identity: the same
token can access other external-client API endpoints directly, so keep it as
guarded as your account password.
License
MIT — see LICENSE.
Errors and transport
Expired, revoked, or invalid tokens produce /dev_token guidance. Other API
errors (including rate-limit responses) retain their HTTP status and JSON body
in the tool error, with token strings redacted. Network failures name
TIMEMANAGER_API_URL without printing secrets or raw exception details. There
are no retries: after an uncertain mutation, call get_task before trying again.
HTTPS is required except for localhost and literal loopback IPs. URLs with
credentials, query strings, or fragments are rejected. Redirects are never
followed, and environment proxy settings are disabled. Standard output is
reserved for MCP; configuration failures go to standard error.
Independent development and release
This package's tests are separate from the application's test suite:
uv run --extra dev pytest
uv run --extra dev ruff check src tests
uv run --extra dev mypy src
uv run --extra dev python -m build
When developing within the Dockerized application checkout, use the app's Docker workflow instead of installing dependencies on the host.
0.1.0 and 0.1.1 were published manually (uv publish with a personal API
token) from this staging directory, still inside the private application
repository. Remaining before treating this as a stable, fully authorized
release process:
- Extract this directory into a public repository (the license already travels with it — see LICENSE).
- Configure PyPI trusted publishing for that repository's release workflow, so future versions don't require a manually-held API token.
- Point this README's project URLs at the public repository once it exists.
No remote repository or publishing workflow is created by this staging directory yet.
Metadata
Release files for timemanager-mcp 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| timemanager_mcp-0.1.1.tar.gz | 12.4 kB | Without provenance | Details for timemanager_mcp-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| timemanager_mcp-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for timemanager_mcp-0.1.1-py3-none-any.whl |
Total release size: 23.2 kB
Release files / timemanager_mcp-0.1.1.tar.gz
| Download URL | timemanager_mcp-0.1.1.tar.gz |
|---|---|
| Size | 12.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9712b103a3cca2745be33aebdceab07dc25b1189121237d6b571485b8022c2b9
|
|
BLAKE2b-256 checksum How to use checksums |
f440a1ebc1b53b058a223eddee424c7de1f616aae2fcc975b2c5001343606b4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.16
|
Release files / timemanager_mcp-0.1.1-py3-none-any.whl
| Download URL | timemanager_mcp-0.1.1-py3-none-any.whl |
|---|---|
| Size | 10.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
99cf1417a332b3a4092d57f0b3d9e1f75518d4bf8f51a60aadb9443967ea4ef1
|
|
BLAKE2b-256 checksum How to use checksums |
08515acfd1f5302be64a5f301d016f31d3898d76b44358625b242bca8b126efe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.6.16
|
Security for timemanager-mcp 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.