Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
Read your Pyunto Time Management schedule and log time from an AI assistant. E2EE project planning.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
PYUNTO_TM_API_KEY, PYUNTO_TM_BASE_URL, PYUNTO_TM_PASSWORD, PYUNTO_TM_PASSWORD_FILEValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"time-management": {
"command": "npx",
"args": [
"-y",
"@pyunto/tm-mcp"
],
"env": {
"PYUNTO_TM_API_KEY": "your-value",
"PYUNTO_TM_BASE_URL": "your-value",
"PYUNTO_TM_PASSWORD": "your-value",
"PYUNTO_TM_PASSWORD_FILE": "your-value"
}
}
}
}Run this in your terminal
claude mcp add time-management --env PYUNTO_TM_API_KEY=your-value --env PYUNTO_TM_BASE_URL=your-value --env PYUNTO_TM_PASSWORD=your-value --env PYUNTO_TM_PASSWORD_FILE=your-value -- npx -y @pyunto/tm-mcpFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"time-management": {
"command": "npx",
"args": [
"-y",
"@pyunto/tm-mcp"
],
"env": {
"PYUNTO_TM_API_KEY": "your-value",
"PYUNTO_TM_BASE_URL": "your-value",
"PYUNTO_TM_PASSWORD": "your-value",
"PYUNTO_TM_PASSWORD_FILE": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"time-management": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@pyunto/tm-mcp"
],
"env": {
"PYUNTO_TM_API_KEY": "your-value",
"PYUNTO_TM_BASE_URL": "your-value",
"PYUNTO_TM_PASSWORD": "your-value",
"PYUNTO_TM_PASSWORD_FILE": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
PYUNTO_TM_BASE_URL envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified against the domain pyunto.com (the registry checks domain ownership)
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: PYUNTO_TM_API_KEY, PYUNTO_TM_PASSWORD, PYUNTO_TM_PASSWORD_FILE
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.4.0) reached the registry 5 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, EmbeddedCI BenchPod
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Drive a BenchPod hardware-in-the-loop bench: power, flash, UART, I2C, CAN, analog and logic.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
MCP (Model Context Protocol) server for Pyunto Time Management. Connects Claude Code, Claude Desktop, Codex CLI, Cursor and any other MCP client to a Pyunto TM account so an assistant can read the schedule, summarise where the hours went, and log time.
User-facing setup instructions live at [https://tm.pyunto.com/docs/mcp.en.md](https://tm.pyunto.com/docs/mcp.en.md) (日本語: https://tm.pyunto.com/docs/mcp.ja.md). This file is the developer view.
| Tool | Scope |
|---|---|
whoami — account, key name, scopes, decryption status | — |
list_projects | projects:read |
list_tasks (filter by project or by a date the task covers) | projects:read |
list_time_blocks (range ≤ 92 days) | blocks:read |
time_summary (grouped by project / task / date) | record:read |
log_time (writes) | blocks:write |
update_time_block (writes) | blocks:write |
delete_time_block — one id, restorable for 14 days | blocks:delete |
list_deleted_time_blocks / restore_time_block | blocks:read / blocks:write |
create_task — a Gantt task with start and end dates | tasks:write |
complete_task — mark finished, or reopen | tasks:write |
update_task — rename, move dates, archive | tasks:write |
set_monthly_target — the budget the daily draft divides up | tasks:write |
Every tool returns JSON as text. Failures come back as isError results whose message names the fix (missing scope, wrong key, locked E2EE) rather than throwing at the transport level — an agent can act on that, a stack trace it cannot.
npx -y @pyunto/tm-mcp # what an MCP client config runs
This package lives in an npm-workspaces repository together with the SDK it depends on; build from the repository root so the workspace link is used:
npm install
npm run build # both packages npm test # sdk crypto round-trips + 25 MCP tool checks
Result: mcp/dist/cli.js, the executable stdio server (dist/index.js stays a side-effect-free module the tests can import).
Environment only — MCP clients spawn the process and inject env from their config file.
The server starts without an API key and answers tools/list — a client or a directory can see what it offers before anyone signs up. Calling a tool without one returns the same guidance as an isError rather than an opaque 401, and whoami reports the missing key instead of failing.
| Variable | Required | Default | Purpose |
|---|---|---|---|
PYUNTO_TM_API_KEY | for data | — | ptm_…, minted in Settings → Account → API keys. Listing the tools works without it |
PYUNTO_TM_BASE_URL | https://tm.pyunto.com | Self-hosted instances | |
PYUNTO_TM_PASSWORD | none | Unwraps the private key locally so E2EE names/memos decrypt | |
PYUNTO_TM_PASSWORD_FILE | none | Same, read from a file instead of the env |
{
"mcpServers": { "pyunto-tm": { "command": "npx", "args": ["-y", "@pyunto/tm-mcp"], "env": { "PYUNTO_TM_API_KEY": "ptm_…" } } } }
Content fields are encrypted in the user's browser; the server never holds the plaintext, and neither does this process by default. Given a password, the server's *password-wrapped* private key blob (GET /api/v1/keys, scope keys:read) is unwrapped here, in memory, and used to open each project's sealed DEK. The password is never transmitted and nothing is written to disk.
Without a password the server still answers everything schedule-shaped — ids, dates, times, durations, aggregates — and name fields come back empty with a NOTE: explaining why, so the model reports the limitation instead of inventing names.
src/index.ts tool definitions + implementations + server wiring
src/cli.ts the bin: calls start() test/tools.mjs stub /api/v1 server, exercises every tool and error path test/cli.mjs spawns the built bin (directly and via symlink) over real MCP
callTool(name, args) is exported for tests; start() attaches the transport and is called only by cli.ts.
delete_time_block is deliberately single-id: no range or filter delete is exposed, because an automated caller getting a range wrong destroys an unbounded amount of data that has no restore path. Its tool description requires the model to show the user the exact block first and get a yes for that block.
There is no delete_task for the same reason, and a sharper one: removing a task detaches every block that logged time against it (tasks.id ON DELETE SET NULL) and orphans its subtasks, with nothing to restore from. update_task offers archive instead — the task leaves every view and can be brought back.
tasks:write is separate from blocks:write on purpose. Recording time against a plan and rewriting the plan are different powers; a key given to something that only logs work should not be able to move deadlines.
update_task returns an array. Moving a task's dates drags its dependents along, and the caller is told what else moved rather than discovering it on the next read.