@yakirmar/mcp-toggl 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,124 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 380" role="img" aria-label="Calendar heatmap of April 2026 plus May 1: 26 active days, 219.6 hours total. Longest day Apr 2 at 18.2 hours. Most consistent stretch Apr 20 to 25 with 6 straight days of 9 to 14 hours.">
3
+ <title>April recap — 219.6 hrs across 26 active days</title>
4
+ <desc>Calendar heatmap showing daily hours tracked across April 2026 and May 1. Color intensity scales from light green (under 4 hours) to dark green (over 16 hours). Empty cells represent days with no entries. Off days: April 7, 11, 14-15, and 26.</desc>
5
+ <style>
6
+ .title { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 16px; font-weight: 500; fill: #2C2C2A; }
7
+ .subtitle { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 12px; fill: #5F5E5A; }
8
+ .day-label { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 11px; fill: #5F5E5A; }
9
+ .month-label { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 10px; fill: #888780; }
10
+ .legend-text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 11px; fill: #5F5E5A; }
11
+ .stat-label { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 12px; fill: #5F5E5A; }
12
+ .stat-value { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 22px; font-weight: 500; fill: #2C2C2A; }
13
+ .stat-sub { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 11px; fill: #888780; }
14
+ .note-label { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 12px; fill: #5F5E5A; }
15
+ .note-value { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 13px; font-weight: 500; fill: #2C2C2A; }
16
+ @media (prefers-color-scheme: dark) {
17
+ .title { fill: #F1EFE8; }
18
+ .subtitle { fill: #B4B2A9; }
19
+ .day-label { fill: #B4B2A9; }
20
+ .month-label { fill: #888780; }
21
+ .legend-text { fill: #B4B2A9; }
22
+ .stat-label { fill: #B4B2A9; }
23
+ .stat-value { fill: #F1EFE8; }
24
+ .stat-sub { fill: #888780; }
25
+ .note-label { fill: #B4B2A9; }
26
+ .note-value { fill: #F1EFE8; }
27
+ }
28
+ </style>
29
+
30
+ <text x="20" y="28" class="title">April recap — 219.6 hrs across 26 active days</text>
31
+ <text x="20" y="48" class="subtitle">Apr 1 → May 1 · daily hours tracked</text>
32
+
33
+ <text x="60" y="100" class="day-label" text-anchor="end">Mon</text>
34
+ <text x="60" y="136" class="day-label" text-anchor="end">Tue</text>
35
+ <text x="60" y="172" class="day-label" text-anchor="end">Wed</text>
36
+ <text x="60" y="208" class="day-label" text-anchor="end">Thu</text>
37
+ <text x="60" y="244" class="day-label" text-anchor="end">Fri</text>
38
+ <text x="60" y="280" class="day-label" text-anchor="end">Sat</text>
39
+ <text x="60" y="316" class="day-label" text-anchor="end">Sun</text>
40
+
41
+ <rect x="70" y="80" width="32" height="32" fill="#F1EFE8" rx="4" opacity="0.4" />
42
+ <rect x="70" y="116" width="32" height="32" fill="#F1EFE8" rx="4" opacity="0.4" />
43
+ <rect x="70" y="152" width="32" height="32" fill="#5DCAA5" rx="4" />
44
+ <rect x="70" y="188" width="32" height="32" fill="#085041" rx="4" />
45
+ <rect x="70" y="224" width="32" height="32" fill="#9FE1CB" rx="4" />
46
+ <rect x="70" y="260" width="32" height="32" fill="#9FE1CB" rx="4" />
47
+ <rect x="70" y="296" width="32" height="32" fill="#9FE1CB" rx="4" />
48
+
49
+ <rect x="106" y="80" width="32" height="32" fill="#5DCAA5" rx="4" />
50
+ <rect x="106" y="116" width="32" height="32" fill="#E8E5DA" rx="4" />
51
+ <rect x="106" y="152" width="32" height="32" fill="#9FE1CB" rx="4" />
52
+ <rect x="106" y="188" width="32" height="32" fill="#085041" rx="4" />
53
+ <rect x="106" y="224" width="32" height="32" fill="#1D9E75" rx="4" />
54
+ <rect x="106" y="260" width="32" height="32" fill="#E8E5DA" rx="4" />
55
+ <rect x="106" y="296" width="32" height="32" fill="#9FE1CB" rx="4" />
56
+
57
+ <rect x="142" y="80" width="32" height="32" fill="#1D9E75" rx="4" />
58
+ <rect x="142" y="116" width="32" height="32" fill="#E8E5DA" rx="4" />
59
+ <rect x="142" y="152" width="32" height="32" fill="#E8E5DA" rx="4" />
60
+ <rect x="142" y="188" width="32" height="32" fill="#0F6E56" rx="4" />
61
+ <rect x="142" y="224" width="32" height="32" fill="#5DCAA5" rx="4" />
62
+ <rect x="142" y="260" width="32" height="32" fill="#1D9E75" rx="4" />
63
+ <rect x="142" y="296" width="32" height="32" fill="#1D9E75" rx="4" />
64
+
65
+ <rect x="178" y="80" width="32" height="32" fill="#1D9E75" rx="4" />
66
+ <rect x="178" y="116" width="32" height="32" fill="#0F6E56" rx="4" />
67
+ <rect x="178" y="152" width="32" height="32" fill="#1D9E75" rx="4" />
68
+ <rect x="178" y="188" width="32" height="32" fill="#0F6E56" rx="4" />
69
+ <rect x="178" y="224" width="32" height="32" fill="#0F6E56" rx="4" />
70
+ <rect x="178" y="260" width="32" height="32" fill="#1D9E75" rx="4" />
71
+ <rect x="178" y="296" width="32" height="32" fill="#E8E5DA" rx="4" />
72
+
73
+ <rect x="214" y="80" width="32" height="32" fill="#5DCAA5" rx="4" />
74
+ <rect x="214" y="116" width="32" height="32" fill="#0F6E56" rx="4" />
75
+ <rect x="214" y="152" width="32" height="32" fill="#5DCAA5" rx="4" />
76
+ <rect x="214" y="188" width="32" height="32" fill="#5DCAA5" rx="4" />
77
+ <rect x="214" y="224" width="32" height="32" fill="#9FE1CB" rx="4" />
78
+ <rect x="214" y="260" width="32" height="32" fill="#F1EFE8" rx="4" opacity="0.4" />
79
+ <rect x="214" y="296" width="32" height="32" fill="#F1EFE8" rx="4" opacity="0.4" />
80
+
81
+ <text x="86" y="64" class="month-label" text-anchor="middle">Mar 30</text>
82
+ <text x="194" y="64" class="month-label" text-anchor="middle">Apr 13</text>
83
+ <text x="230" y="64" class="month-label" text-anchor="middle">Apr 27</text>
84
+
85
+ <g transform="translate(70, 348)">
86
+ <text x="0" y="0" class="legend-text">Less</text>
87
+ <rect x="32" y="-9" width="11" height="11" fill="#E8E5DA" rx="2" />
88
+ <rect x="48" y="-9" width="11" height="11" fill="#9FE1CB" rx="2" />
89
+ <rect x="64" y="-9" width="11" height="11" fill="#5DCAA5" rx="2" />
90
+ <rect x="80" y="-9" width="11" height="11" fill="#1D9E75" rx="2" />
91
+ <rect x="96" y="-9" width="11" height="11" fill="#0F6E56" rx="2" />
92
+ <rect x="112" y="-9" width="11" height="11" fill="#085041" rx="2" />
93
+ <text x="130" y="0" class="legend-text">More</text>
94
+ <text x="170" y="0" class="legend-text" fill="#888780">0h · &lt;4h · 4-8h · 8-12h · 12-16h · 16h+</text>
95
+ </g>
96
+
97
+ <g transform="translate(310, 80)">
98
+ <text x="0" y="14" class="stat-label">Total tracked</text>
99
+ <text x="0" y="42" class="stat-value">219.6</text>
100
+ <text x="74" y="42" class="stat-sub">hrs</text>
101
+
102
+ <text x="0" y="84" class="stat-label">Active days</text>
103
+ <text x="0" y="112" class="stat-value">26</text>
104
+ <text x="46" y="112" class="stat-sub">of 31 (84%)</text>
105
+
106
+ <text x="0" y="154" class="stat-label">Avg active day</text>
107
+ <text x="0" y="182" class="stat-value">8.4</text>
108
+ <text x="58" y="182" class="stat-sub">hrs</text>
109
+ </g>
110
+
111
+ <g transform="translate(530, 80)">
112
+ <text x="0" y="14" class="note-label">Longest day</text>
113
+ <text x="0" y="34" class="note-value">Apr 2 — 18.2 hrs</text>
114
+ <text x="0" y="52" class="stat-sub">"AI shit" + late call w/ Spence</text>
115
+
116
+ <text x="0" y="92" class="note-label">Best stretch</text>
117
+ <text x="0" y="112" class="note-value">Apr 20 → 25 · 6 days</text>
118
+ <text x="0" y="130" class="stat-sub">avg 11.9 hrs/day, no breaks</text>
119
+
120
+ <text x="0" y="170" class="note-label">Days off</text>
121
+ <text x="0" y="190" class="note-value">5 · Apr 7, 11, 14, 15, 26</text>
122
+ <text x="0" y="208" class="stat-sub">2 weekend pairs, mostly steady</text>
123
+ </g>
124
+ </svg>
@@ -0,0 +1,97 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 440" role="img" aria-label="Stacked bar chart of weekly hours by project, Apr 27 to May 1: Mon 2.5, Tue 15.8, Wed 6.9, Thu 2.2, Fri 5.2; total 32.7 hours across 7 projects">
3
+ <title>Week of Apr 27 — 32.7 hours across 7 projects</title>
4
+ <desc>Daily hours stacked by project. Tuesday peaks at 15.8 hours covering Business Development, AutoMem, Automation Hub, and MCP Servers. Wednesday is 6.9 hours of AI Learning. Friday is 5.2 hours, mostly Toggl MCP shipping work.</desc>
5
+ <style>
6
+ .title { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 16px; font-weight: 500; fill: #2C2C2A; }
7
+ .subtitle { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 12px; fill: #5F5E5A; }
8
+ .axis { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 11px; fill: #5F5E5A; }
9
+ .day-total { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 11px; font-weight: 500; fill: #2C2C2A; }
10
+ .legend-text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; font-size: 11px; fill: #2C2C2A; }
11
+ .grid { stroke: rgba(0,0,0,0.08); stroke-width: 1; }
12
+ @media (prefers-color-scheme: dark) {
13
+ .title { fill: #F1EFE8; }
14
+ .subtitle { fill: #B4B2A9; }
15
+ .axis { fill: #B4B2A9; }
16
+ .day-total { fill: #F1EFE8; }
17
+ .legend-text { fill: #F1EFE8; }
18
+ .grid { stroke: rgba(255,255,255,0.10); }
19
+ }
20
+ </style>
21
+
22
+ <text x="20" y="28" class="title">Week of Apr 27 — 32.7 hrs across 7 projects</text>
23
+ <text x="20" y="48" class="subtitle">Daily hours stacked by project · 31 entries</text>
24
+
25
+ <line x1="60" y1="80" x2="770" y2="80" class="grid" />
26
+ <text x="50" y="84" class="axis" text-anchor="end">16h</text>
27
+ <line x1="60" y1="145" x2="770" y2="145" class="grid" />
28
+ <text x="50" y="149" class="axis" text-anchor="end">12h</text>
29
+ <line x1="60" y1="210" x2="770" y2="210" class="grid" />
30
+ <text x="50" y="214" class="axis" text-anchor="end">8h</text>
31
+ <line x1="60" y1="275" x2="770" y2="275" class="grid" />
32
+ <text x="50" y="279" class="axis" text-anchor="end">4h</text>
33
+ <line x1="60" y1="340" x2="770" y2="340" class="grid" />
34
+ <text x="50" y="344" class="axis" text-anchor="end">0h</text>
35
+
36
+ <g>
37
+ <rect x="96" y="306.7" width="70" height="33.3" fill="#378ADD" />
38
+ <rect x="96" y="300.0" width="70" height="6.7" fill="#1D9E75" />
39
+ <text x="131" y="293" class="day-total" text-anchor="middle">2.5h</text>
40
+ <text x="131" y="360" class="axis" text-anchor="middle">Mon</text>
41
+ <text x="131" y="375" class="axis" text-anchor="middle">Apr 27</text>
42
+ </g>
43
+
44
+ <g>
45
+ <rect x="238" y="246.1" width="70" height="93.9" fill="#378ADD" />
46
+ <rect x="238" y="159.8" width="70" height="86.3" fill="#7F77DD" />
47
+ <rect x="238" y="113.2" width="70" height="46.6" fill="#1D9E75" />
48
+ <rect x="238" y="82.6" width="70" height="30.6" fill="#EF9F27" />
49
+ <text x="273" y="76" class="day-total" text-anchor="middle">15.8h</text>
50
+ <text x="273" y="360" class="axis" text-anchor="middle">Tue</text>
51
+ <text x="273" y="375" class="axis" text-anchor="middle">Apr 28</text>
52
+ </g>
53
+
54
+ <g>
55
+ <rect x="380" y="227.4" width="70" height="112.6" fill="#D85A30" />
56
+ <text x="415" y="220" class="day-total" text-anchor="middle">6.9h</text>
57
+ <text x="415" y="360" class="axis" text-anchor="middle">Wed</text>
58
+ <text x="415" y="375" class="axis" text-anchor="middle">Apr 29</text>
59
+ </g>
60
+
61
+ <g>
62
+ <rect x="522" y="326.2" width="70" height="13.8" fill="#378ADD" />
63
+ <rect x="522" y="307.5" width="70" height="18.7" fill="#D85A30" />
64
+ <rect x="522" y="303.9" width="70" height="3.6" fill="#1D9E75" />
65
+ <text x="557" y="297" class="day-total" text-anchor="middle">2.2h</text>
66
+ <text x="557" y="360" class="axis" text-anchor="middle">Thu</text>
67
+ <text x="557" y="375" class="axis" text-anchor="middle">Apr 30</text>
68
+ </g>
69
+
70
+ <g>
71
+ <rect x="664" y="338.05" width="70" height="1.95" fill="#378ADD" />
72
+ <rect x="664" y="312.85" width="70" height="25.2" fill="#1D9E75" />
73
+ <rect x="664" y="267.85" width="70" height="45.0" fill="#D4537E" />
74
+ <rect x="664" y="260.55" width="70" height="7.3" fill="#EF9F27" />
75
+ <rect x="664" y="255.35" width="70" height="5.2" fill="#888780" />
76
+ <text x="699" y="248" class="day-total" text-anchor="middle">5.2h</text>
77
+ <text x="699" y="360" class="axis" text-anchor="middle">Fri</text>
78
+ <text x="699" y="375" class="axis" text-anchor="middle">May 1</text>
79
+ </g>
80
+
81
+ <g transform="translate(20, 405)">
82
+ <rect x="0" y="0" width="10" height="10" fill="#378ADD" />
83
+ <text x="16" y="9" class="legend-text">Business Dev</text>
84
+ <rect x="108" y="0" width="10" height="10" fill="#D85A30" />
85
+ <text x="124" y="9" class="legend-text">AI Learning</text>
86
+ <rect x="208" y="0" width="10" height="10" fill="#7F77DD" />
87
+ <text x="224" y="9" class="legend-text">AutoMem</text>
88
+ <rect x="296" y="0" width="10" height="10" fill="#1D9E75" />
89
+ <text x="312" y="9" class="legend-text">Automation Hub</text>
90
+ <rect x="416" y="0" width="10" height="10" fill="#D4537E" />
91
+ <text x="432" y="9" class="legend-text">Toggl MCP</text>
92
+ <rect x="516" y="0" width="10" height="10" fill="#EF9F27" />
93
+ <text x="532" y="9" class="legend-text">MCP Servers</text>
94
+ <rect x="624" y="0" width="10" height="10" fill="#888780" />
95
+ <text x="640" y="9" class="legend-text">WPF Support</text>
96
+ </g>
97
+ </svg>
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@yakirmar/mcp-toggl",
3
+ "version": "1.1.0",
4
+ "description": "MCP server for Toggl Track integration with time tracking and reporting",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "mcpName": "io.github.yakirmar/mcp-toggl",
8
+ "bin": {
9
+ "mcp-toggl": "dist/index.js"
10
+ },
11
+ "scripts": {
12
+ "build": "rm -rf dist && tsc",
13
+ "postbuild": "chmod +x dist/index.js",
14
+ "dev": "tsx watch src/index.ts",
15
+ "start": "node dist/index.js",
16
+ "setup": "node scripts/setup.js",
17
+ "test": "vitest run",
18
+ "test:coverage": "vitest run --coverage",
19
+ "lint": "eslint src/ tests/",
20
+ "format": "prettier --write src/**/*.ts",
21
+ "prepublishOnly": "npm run build && npm test"
22
+ },
23
+ "keywords": [
24
+ "mcp",
25
+ "mcp-server",
26
+ "modelcontextprotocol",
27
+ "toggl",
28
+ "time-tracking",
29
+ "reporting",
30
+ "productivity"
31
+ ],
32
+ "author": "Very Good Plugins",
33
+ "contributors": [
34
+ "Yakir Marziano"
35
+ ],
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/yakirmar/mcp-toggl.git"
40
+ },
41
+ "homepage": "https://github.com/yakirmar/mcp-toggl#readme",
42
+ "bugs": {
43
+ "url": "https://github.com/yakirmar/mcp-toggl/issues"
44
+ },
45
+ "engines": {
46
+ "node": "^20.19.0 || >=22.12.0"
47
+ },
48
+ "publishConfig": {
49
+ "access": "public"
50
+ },
51
+ "files": [
52
+ "dist/",
53
+ "docs/images/*.svg",
54
+ "README.md",
55
+ "LICENSE"
56
+ ],
57
+ "dependencies": {
58
+ "@modelcontextprotocol/sdk": "^1.29.0",
59
+ "dotenv": "^17.4.2",
60
+ "node-fetch": "^3.3.2",
61
+ "zod": "^4.3.6"
62
+ },
63
+ "devDependencies": {
64
+ "@eslint/js": "^10.0.1",
65
+ "@types/node": "^25.6.0",
66
+ "@vitest/coverage-v8": "^4.1.5",
67
+ "eslint": "^10.2.1",
68
+ "eslint-config-prettier": "^10.1.8",
69
+ "prettier": "^3.1.0",
70
+ "tsx": "^4.6.0",
71
+ "typescript": "^6.0.3",
72
+ "typescript-eslint": "^8.59.1",
73
+ "vitest": "^4.1.5"
74
+ }
75
+ }