Skip to main content
Glama

Pyunto Time Management — integrations

Open-source client libraries for Pyunto Time Management, a time-management and project-planning service with end-to-end encryption.

Package

What it is

@pyunto/tm-sdk

TypeScript client for the public REST API (v1), with client-side E2EE decryption

@pyunto/tm-mcp

MCP (Model Context Protocol) server — connects Claude Code, Claude Desktop, Codex CLI, Cursor and other AI clients to an account

The service itself is not open source. This repository contains only the client side: HTTP calls against the documented public API, plus the crypto needed to decrypt your own data locally. There is nothing here that talks to the database, handles billing, or holds a key.

Why this part is public

The MCP server can be given your account password so it can decrypt project and task names. That is a lot to ask of a program you cannot read, so this is the part we publish: you can verify for yourself that the password is used only to unwrap the private key in your own process, and is never transmitted.

See sdk/src/crypto.ts for the primitives and mcp/src/index.ts for how they're used.

Related MCP server: tyme-mcp

Quick start (MCP)

No clone needed — the published package runs straight from npm:

claude mcp add pyunto-tm \
  --env PYUNTO_TM_API_KEY=ptm_your_key \
  -- npx -y @pyunto/tm-mcp

Full setup instructions, including Claude Desktop, Codex CLI and Cursor: https://tm.pyunto.com/docs/mcp.en.md (日本語: https://tm.pyunto.com/docs/mcp.ja.md).

Get an API key from Settings → Account → API keys in the app. Scopes decide what an integration may read or write, and a key can be revoked at any time.

Quick start (SDK)

npm install @pyunto/tm-sdk
import { PyuntoTM } from "@pyunto/tm-sdk";

const tm = new PyuntoTM({ apiKey: process.env.PTM_KEY! });

// Dates, durations and aggregates need no key material at all
const record = await tm.serviceRecord("2026-08-01", "2026-08-31");

// Names and memos are encrypted; unlock decrypts them locally
await tm.unlock(process.env.PTM_PASSWORD!);
const projects = await tm.projects({ decrypt: true });

Development

npm workspaces; Node 18+.

npm install
npm run build     # both packages
npm test          # sdk crypto round-trips + mcp tools against a stub API

mcp depends on @pyunto/tm-sdk by version, so the published package resolves it from the registry while local development links the workspace copy.

Security

Found a problem in this code, or in the service? Please report it privately rather than opening a public issue: support@pyunto.com.

Licence

MIT — see LICENSE.

Available Tools

10 tools
delete_time_blockA

Permanently delete ONE recorded time block, along with any files attached to it. Before calling it you MUST show the user the block you are about to delete (date, start and end time, project, task and memo, from list_time_blocks) and get an explicit yes for that specific block. Never infer the block from a vague instruction, and never delete several blocks because the user described a range — confirm and delete them one at a time. A deleted block can be put back with restore_time_block for 14 days, after which it and its attachments are purged for good and cannot be recovered; say so when you report the deletion, and do not tell the user the deletion is irreversible. Requires the blocks:delete scope, which is separate from blocks:write and has to be granted deliberately.

Inputs: block_id (required).

list_deleted_time_blocksA

Time blocks that were deleted but can still be restored, newest first, each with the date it was deleted and the deadline for putting it back. Use it to find the block_id for restore_time_block when the user says they deleted something by mistake. Requires the blocks:read scope.

Inputs: no named parameters.

list_projectsA

List every project the account can see, with id, name, colour and role (owner/editor/viewer). Use it to resolve a project name the user typed into the project_id other tools need. Requires the projects:read scope.

Inputs: no named parameters.

list_tasksA

List Gantt tasks (and subtasks) with their id, project, name and date range. Filter to one project with project_id. Use it to resolve a task name into the task_id that log_time takes. Requires the projects:read scope.

Inputs: active_on, project_id.

list_time_blocksA

The individual time blocks logged between two dates (inclusive, max 92 days), with start/end times, duration, project, task and memo. This is the detailed schedule; use time_summary when you only need totals. Requires blocks:read.

Inputs: date_to (required), date_from (required).

log_timeA

Record a block of worked time on the calendar. Writes to the user's real schedule, so confirm the project, date and times with them before calling it. Requires the blocks:write scope; for an end-to-end-encrypted project a memo additionally needs PYUNTO_TM_PASSWORD so it can be encrypted locally.

Inputs: end (required), date (required), start (required), project_id (required), +2 more.

restore_time_blockA

Put a deleted time block back on the calendar, along with any files that were attached to it. Get block_id from list_deleted_time_blocks. Works only within the 14-day recovery window; after that the block is gone for good. Requires the blocks:write scope.

Inputs: block_id (required).

time_summaryA

Total hours logged between two dates (inclusive, max 92 days), grouped by project, by task, or by day. This is the tool to answer 'how much time did I spend on X' and to write a work log or diary entry. Requires record:read.

Inputs: date_to (required), date_from (required), group_by.

update_time_blockA

Change an already-recorded time block: its date, start/end times, memo, or the task it counts towards. Get block_id from list_time_blocks. Only the fields you pass change. Tell the user what the block currently says and what it will say before calling this. Requires the blocks:write scope; changing a memo on an end-to-end-encrypted project also needs PYUNTO_TM_PASSWORD, and project_id so the memo is encrypted under the right key.

Inputs: block_id (required), end, date, memo, +3 more.

whoamiA

Who this MCP server is connected as: account email, API key name, granted scopes, server URL, and whether end-to-end-encrypted names can be decrypted. Call this first when a tool fails, to see which scopes are missing.

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.3/5.0

    Scored across 10 tools

    Disambiguation5/5

    Each tool targets a clearly distinct resource or action: projects, tasks, active time blocks, summaries, deleted blocks, logging, updating, deleting, restoring, and identity. Descriptions explicitly resolve potential overlaps, such as list_time_blocks versus time_summary and list_deleted_time_blocks versus list_time_blocks.

    Naming Consistency4/5

    The set is mostly consistent snake_case with verb_noun or list_noun patterns, such as list_tasks, log_time, delete_time_block, and restore_time_block. Minor deviations are whoami (single word) and time_summary (noun phrase rather than verb_noun), but readability remains high.

    Tool Count5/5

    10 tools is well-scoped for a time-tracking server, and each tool has a clear role without obvious redundancy. The count sits comfortably in the ideal range and does not feel thin or heavy.

    Completeness4/5

    The time-block lifecycle is fully covered: log, list, update, delete, restore, and list deleted blocks. Minor gaps include read-only projects and tasks (no create/update/delete for those resources) and no direct get_time_block_by_id, but the core time-management workflows are present.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers