Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Printing Press CLI for Morgen. Morgen calendar & tasks API CLI — unified access to calendars, events, tasks, and tags across connected providers
.claude/skills/mvanhorn-pp-morgen/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 21% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 160% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -1% | 0% |
<!-- GENERATED FILE — DO NOT EDIT. This file is a verbatim mirror of library/productivity/morgen/SKILL.md, regenerated post-merge by tools/generate-skills/. Hand-edits here are silently overwritten on the next regen. Edit the library/ source instead. See the repository agent guide, section "Generated artifacts: registry.json, cli-skills/". -->
This skill drives the morgen-pp-cli binary. You must verify the CLI is installed before invoking any command from this skill. If it is missing, install it first:
$HOME/.local/bin on macOS/Linux and %LOCALAPPDATA%\Programs\PrintingPress\bin on Windows:bash npx -y @mvanhorn/printing-press-library install morgen --cli-only
morgen-pp-cli --version$PATH for the agent/runtime that will invoke this skill.If the npx install fails (no Node, offline, etc.), fall back to a direct Go install (requires Go 1.26.6 or newer). This installs into $GOPATH/bin (default $HOME/go/bin), so add that directory to $PATH instead:
bashgo install github.com/mvanhorn/printing-press-library/library/productivity/morgen/cmd/morgen-pp-cli@latest
If --version reports "command not found" after install, the runtime cannot see the binary directory on $PATH. Do not proceed with skill commands until verification succeeds.
Morgen calendar & tasks API CLI — unified access to calendars, events, tasks, and tags across connected providers
These capabilities aren't available in any other tool for this API.
agenda — Unified chronological day view merging calendar events and due tasks across all connected accounts._Reach for this to see everything on a day in one call instead of querying events per calendar and tasks separately._
bash morgen-pp-cli agenda --date 2026-06-16
calendars — List calendars and update Morgen-specific calendar metadata
morgen-pp-cli calendars list — List calendars across all connected accountsmorgen-pp-cli calendars update — Update Morgen-specific metadata for a calendar (busy, color, name overrides)events — List, create, update, and delete calendar events
morgen-pp-cli events create — Create an event in a calendarmorgen-pp-cli events delete — Delete an event. Use --series-update-mode for recurring events.morgen-pp-cli events list — List events from one or more calendars in a time windowmorgen-pp-cli events update — Update an event (patch). Use --series-update-mode for recurring events.integrations — View connected accounts and available providers (read-only; connect/disconnect happens in the Morgen app)
morgen-pp-cli integrations accounts — List connected calendar/task accountsmorgen-pp-cli integrations providers — List available integration providers (Google, Microsoft 365, iCloud, Todoist, etc.)tags — Manage tags
morgen-pp-cli tags create — Create a tagmorgen-pp-cli tags delete — Delete a tagmorgen-pp-cli tags get — Get a single tag by IDmorgen-pp-cli tags list — List tagsmorgen-pp-cli tags update — Update a tagtasks — Manage tasks across connected task providers
morgen-pp-cli tasks close — Mark a task completemorgen-pp-cli tasks create — Create a taskmorgen-pp-cli tasks delete — Delete a taskmorgen-pp-cli tasks get — Get a single task by IDmorgen-pp-cli tasks list — List tasksmorgen-pp-cli tasks move — Reorder or re-parent a taskmorgen-pp-cli tasks reopen — Reopen a completed taskmorgen-pp-cli tasks update — Update a task (patch)When you know what you want to do but not which command does it, ask the CLI directly:
bashmorgen-pp-cli which "<capability in your own words>"
which resolves a natural-language capability query to the best matching command from this CLI's curated feature index. Exit code 0 means at least one match; exit code 2 means no confident match — fall back to --help or use a narrower query.
Run morgen-pp-cli auth setup to print the URL and steps for getting a key (add --launch to open the URL). Then set:
bashexport MORGEN_API_KEY="<your-key>"
Or persist it in ~/.config/morgen/config.toml.
Run morgen-pp-cli doctor to verify setup.
Add --agent to any command. Expands to: --json --compact --no-input --no-color --yes.
--select keeps a subset of fields. Dotted paths descend into nested structures; arrays traverse element-wise. Critical for keeping context small on verbose APIs:bash morgen-pp-cli calendars list --agent --select id,name,status
--dry-run shows the request without sending--idempotent only when an already-existing create should count as successCommands that read from the local store or the API wrap output in a provenance envelope:
json{ "meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."}, "results": <data> }
Parse .results for data and .meta.source to know whether it's live or local. A human-readable N results (live) summary is printed to stderr only when stdout is a terminal AND no machine-format flag (--json, --csv, --compact, --quiet, --plain, --select) is set — piped/agent consumers and explicit-format runs get pure JSON on stdout.
When you (or the agent) notice something off about this CLI, record it:
morgen-pp-cli feedback "the --since flag is inclusive but docs say exclusive"
morgen-pp-cli feedback --stdin < notes.txt
morgen-pp-cli feedback list --json --limit 10Entries are stored locally at ~/.local/share/morgen-pp-cli/feedback.jsonl. They are never POSTed unless MORGEN_FEEDBACK_ENDPOINT is set AND either --send is passed or MORGEN_FEEDBACK_AUTO_SEND=true. Default behavior is local-only.
Write what surprised you, not a bug report. Short, specific, one line: that is the part that compounds.
Every command accepts --deliver <sink>. The output goes to the named sink in addition to (or instead of) stdout, so agents can route command results without hand-piping. Three sinks are supported:
| Sink | Effect | |------|--------| | stdout | Default; write to stdout only | | file:<path> | Atomically write output to <path> (tmp + rename) | | webhook:<url> | POST the output body to the URL (application/json or application/x-ndjson when --compact) |
Unknown schemes are refused with a structured error naming the supported set. Webhook failures return non-zero and log the URL + HTTP status on stderr.
A profile is a saved set of flag values, reused across invocations. Use it when a scheduled agent calls the same command every run with the same configuration - HeyGen's "Beacon" pattern.
morgen-pp-cli profile save briefing --json
morgen-pp-cli --profile briefing calendars list
morgen-pp-cli profile list --json
morgen-pp-cli profile show briefing
morgen-pp-cli profile delete briefing --yesExplicit flags always win over profile values; profile values win over defaults. agent-context lists all available profiles under available_profiles so introspecting agents discover them at runtime.
| Code | Meaning | |------|---------| | 0 | Success | | 2 | Usage error (wrong arguments) | | 3 | Resource not found | | 4 | Authentication required | | 5 | API error (upstream issue) | | 7 | Rate limited (wait and retry) | | 10 | Config error |
Parse $ARGUMENTS:
help, or --help → show morgen-pp-cli --help outputinstall → ends with mcp → MCP installation; otherwise → see Prerequisites above--agent)bash go install github.com/mvanhorn/printing-press-library/library/productivity/morgen/cmd/morgen-pp-mcp@latest
bash claude mcp add morgen-pp-mcp -- morgen-pp-mcp
claude mcp listwhich morgen-pp-cliIf not found, offer to install (see Prerequisites at the top of this skill).
--agent flag:bash morgen-pp-cli <command> [subcommand] [args] --agent
morgen-pp-cli <command> --help.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 5,032 | 14,620 | +191% | 1 | 1 | 0% | 800 | 2,707 | +238% | 0 | 0 | — |
case-02 | fail→fail | 16,022 | 5,454 | -66% | 1 | 1 | 0% | 790 | 2,567 | +225% | 0 | 0 | — |
case-03 | fail→fail | 19,899 | 5,894 | -70% | 1 | 1 | 0% | 2,575 | 2,782 | +8% | 0 | 0 | — |
case-04 | pass→pass | 19,367 | 9,858 | -49% | 1 | 1 | 0% | 2,659 | 4,146 | +56% | 0 | 0 | — |
case-05 | pass→pass | 9,301 | 9,921 | +7% | 1 | 1 | 0% | 1,771 | 4,463 | +152% | 0 | 0 | — |
case-06 | pass→pass | 12,231 | 12,295 | +1% | 1 | 1 | 0% | 2,564 | 4,226 | +65% | 0 | 0 | — |
case-07 | fail→pass | 10,768 | 3,000 | -72% | 1 | 1 | 0% | 1,756 | 2,999 | +71% | 0 | 0 | — |
case-08 | fail→pass | 18,123 | 3,414 | -81% | 1 | 1 | 0% | 2,559 | 3,087 | +21% | 0 | 0 | — |
case-09 | fail→pass | 8,215 | 3,049 | -63% | 1 | 1 | 0% | 1,156 | 3,006 | +160% | 0 | 0 | — |
case-10 | fail→pass | 12,591 | 2,918 | -77% | 1 | 1 | 0% | 2,059 | 2,977 | +45% | 0 | 0 | — |
case-11 | fail→pass | 17,935 | 4,710 | -74% | 1 | 1 | 0% | 3,087 | 3,059 | -1% | 0 | 0 | — |
case-12 | fail→pass | 23,094 | 2,552 | -89% | 1 | 1 | 0% | 3,418 | 2,875 | -16% | 0 | 0 | — |
case-13 | fail→fail | 13,710 | 6,491 | -53% | 1 | 1 | 0% | 1,679 | 2,706 | +61% | 0 | 0 | — |
case-14 | fail→pass | 8,053 | 3,138 | -61% | 1 | 1 | 0% | 1,230 | 2,967 | +141% | 0 | 0 | — |
case-15 | fail→pass | 20,497 | 2,916 | -86% | 1 | 1 | 0% | 3,467 | 2,919 | -16% | 0 | 0 | — |
case-16 | fail→pass | 13,183 | 5,804 | -56% | 1 | 1 | 0% | 2,196 | 2,842 | +29% | 0 | 0 | — |
case-17 | fail→pass | 7,495 | 2,916 | -61% | 1 | 1 | 0% | 1,307 | 2,936 | +125% | 0 | 0 | — |
case-18 | fail→pass | 7,888 | 2,860 | -64% | 1 | 1 | 0% | 1,087 | 2,811 | +159% | 0 | 0 | — |
case-19 | fail→pass | 13,283 | 6,847 | -48% | 1 | 1 | 0% | 2,359 | 2,997 | +27% | 0 | 0 | — |
case-20 | fail→pass | 14,567 | 2,818 | -81% | 1 | 1 | 0% | 2,423 | 2,866 | +18% | 0 | 0 | — |
case-21 | fail→fail | 6,842 | 5,477 | -20% | 1 | 1 | 0% | 1,218 | 2,658 | +118% | 0 | 0 | — |
case-22 | fail→pass | 5,860 | 6,792 | +16% | 1 | 1 | 0% | 1,049 | 3,048 | +191% | 0 | 0 | — |
case-23 | fail→pass | 17,168 | 2,087 | -88% | 1 | 1 | 0% | 2,363 | 2,731 | +16% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 18 counted toward the lift figure. The other 5 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +65 percentage points is the difference between those two pass rates over the 18 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.