@themkn/clockify-mcp 0.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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -0
  3. package/SECURITY.md +20 -0
  4. package/config.example.json +4 -0
  5. package/dist/clockify/client.d.ts +53 -0
  6. package/dist/clockify/client.js +181 -0
  7. package/dist/clockify/client.js.map +1 -0
  8. package/dist/clockify/errors.d.ts +7 -0
  9. package/dist/clockify/errors.js +15 -0
  10. package/dist/clockify/errors.js.map +1 -0
  11. package/dist/clockify/types.d.ts +111 -0
  12. package/dist/clockify/types.js +2 -0
  13. package/dist/clockify/types.js.map +1 -0
  14. package/dist/config.d.ts +9 -0
  15. package/dist/config.js +49 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.js +24 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/server.d.ts +24 -0
  21. package/dist/server.js +63 -0
  22. package/dist/server.js.map +1 -0
  23. package/dist/tools/clients.d.ts +2 -0
  24. package/dist/tools/clients.js +60 -0
  25. package/dist/tools/clients.js.map +1 -0
  26. package/dist/tools/coerce.d.ts +11 -0
  27. package/dist/tools/coerce.js +43 -0
  28. package/dist/tools/coerce.js.map +1 -0
  29. package/dist/tools/meta.d.ts +2 -0
  30. package/dist/tools/meta.js +21 -0
  31. package/dist/tools/meta.js.map +1 -0
  32. package/dist/tools/projects.d.ts +2 -0
  33. package/dist/tools/projects.js +101 -0
  34. package/dist/tools/projects.js.map +1 -0
  35. package/dist/tools/shape.d.ts +92 -0
  36. package/dist/tools/shape.js +50 -0
  37. package/dist/tools/shape.js.map +1 -0
  38. package/dist/tools/tags.d.ts +2 -0
  39. package/dist/tools/tags.js +54 -0
  40. package/dist/tools/tags.js.map +1 -0
  41. package/dist/tools/tasks.d.ts +2 -0
  42. package/dist/tools/tasks.js +78 -0
  43. package/dist/tools/tasks.js.map +1 -0
  44. package/dist/tools/timeEntries.d.ts +2 -0
  45. package/dist/tools/timeEntries.js +161 -0
  46. package/dist/tools/timeEntries.js.map +1 -0
  47. package/package.json +39 -0
@@ -0,0 +1,78 @@
1
+ import { z } from "zod";
2
+ import { shapeTask } from "./shape.js";
3
+ import { zPositiveInt } from "./coerce.js";
4
+ const idString = z.string().min(1).refine((s) => !s.includes("/"), "must not contain '/'");
5
+ const ListInput = z
6
+ .object({
7
+ projectId: idString,
8
+ name: z.string().min(1).optional(),
9
+ page: zPositiveInt().optional(),
10
+ pageSize: zPositiveInt(200).optional(),
11
+ })
12
+ .strict();
13
+ const CreateInput = z
14
+ .object({
15
+ projectId: idString,
16
+ name: z.string().min(1),
17
+ assigneeIds: z.array(idString).optional(),
18
+ estimate: z.string().min(1).optional(),
19
+ status: z.enum(["ACTIVE", "DONE"]).optional(),
20
+ })
21
+ .strict();
22
+ const UpdateInput = z
23
+ .object({
24
+ projectId: idString,
25
+ id: idString,
26
+ name: z.string().min(1).optional(),
27
+ assigneeIds: z.array(idString).optional(),
28
+ estimate: z.string().min(1).optional(),
29
+ status: z.enum(["ACTIVE", "DONE"]).optional(),
30
+ })
31
+ .strict();
32
+ const DeleteInput = z.object({ projectId: idString, id: idString }).strict();
33
+ const c = (ctx) => ctx.client;
34
+ export const taskTools = [
35
+ {
36
+ name: "list_tasks",
37
+ description: "List tasks belonging to a project.",
38
+ schema: ListInput,
39
+ handler: async (input, ctx) => {
40
+ const i = input;
41
+ const raw = await c(ctx).listTasks(ctx.config.workspaceId, i.projectId, {
42
+ name: i.name,
43
+ page: i.page,
44
+ pageSize: i.pageSize,
45
+ });
46
+ return raw.map(shapeTask);
47
+ },
48
+ },
49
+ {
50
+ name: "create_task",
51
+ description: "Create a task under a project.",
52
+ schema: CreateInput,
53
+ handler: async (input, ctx) => {
54
+ const { projectId, ...body } = input;
55
+ return shapeTask(await c(ctx).createTask(ctx.config.workspaceId, projectId, body));
56
+ },
57
+ },
58
+ {
59
+ name: "update_task",
60
+ description: "Patch a task. Any field omitted is left unchanged.",
61
+ schema: UpdateInput,
62
+ handler: async (input, ctx) => {
63
+ const { projectId, id, ...body } = input;
64
+ return shapeTask(await c(ctx).updateTask(ctx.config.workspaceId, projectId, id, body));
65
+ },
66
+ },
67
+ {
68
+ name: "delete_task",
69
+ description: "Delete a task.",
70
+ schema: DeleteInput,
71
+ handler: async (input, ctx) => {
72
+ const { projectId, id } = input;
73
+ await c(ctx).deleteTask(ctx.config.workspaceId, projectId, id);
74
+ return { deleted: true, id };
75
+ },
76
+ },
77
+ ];
78
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from "../server.js";
2
+ export declare const timeEntryTools: ToolDefinition<unknown>[];
@@ -0,0 +1,161 @@
1
+ import { z } from "zod";
2
+ import { shapeTimeEntry } from "./shape.js";
3
+ import { zBoolean, zPositiveInt } from "./coerce.js";
4
+ const idString = z.string().min(1).refine((s) => !s.includes("/"), "must not contain '/'");
5
+ const isoDateTime = z.string().min(1).describe("ISO 8601 timestamp (e.g. 2026-04-12T09:00:00Z)");
6
+ const ListInput = z
7
+ .object({
8
+ start: isoDateTime.optional(),
9
+ end: isoDateTime.optional(),
10
+ projectId: idString.optional(),
11
+ descriptionContains: z.string().min(1).optional(),
12
+ page: zPositiveInt().optional(),
13
+ pageSize: zPositiveInt(200).optional(),
14
+ })
15
+ .strict();
16
+ const GetInput = z.object({ id: idString }).strict();
17
+ const CreateInput = z
18
+ .object({
19
+ start: isoDateTime,
20
+ end: isoDateTime.optional(),
21
+ description: z.string().optional(),
22
+ projectId: idString.optional(),
23
+ taskId: idString.optional(),
24
+ tagIds: z.array(idString).optional(),
25
+ billable: zBoolean().optional(),
26
+ })
27
+ .strict();
28
+ const UpdateInput = z
29
+ .object({
30
+ id: idString,
31
+ start: isoDateTime.optional(),
32
+ end: isoDateTime.optional(),
33
+ description: z.string().optional(),
34
+ projectId: idString.optional(),
35
+ taskId: idString.optional(),
36
+ tagIds: z.array(idString).optional(),
37
+ billable: zBoolean().optional(),
38
+ })
39
+ .strict();
40
+ const DeleteInput = z.object({ id: idString }).strict();
41
+ const StartInput = z
42
+ .object({
43
+ description: z.string().optional(),
44
+ projectId: idString.optional(),
45
+ taskId: idString.optional(),
46
+ tagIds: z.array(idString).optional(),
47
+ billable: zBoolean().optional(),
48
+ start: isoDateTime.optional(),
49
+ })
50
+ .strict();
51
+ const StopInput = z.object({ end: isoDateTime.optional() }).strict();
52
+ const Empty = z.object({}).strict();
53
+ function c(ctx) {
54
+ return ctx.client;
55
+ }
56
+ async function findRunning(ctx) {
57
+ const items = await c(ctx).listTimeEntries(ctx.config.workspaceId, ctx.user.id, {
58
+ inProgress: true,
59
+ });
60
+ return items[0] ?? null;
61
+ }
62
+ export const timeEntryTools = [
63
+ {
64
+ name: "list_time_entries",
65
+ description: "List the current user's time entries. Filter by ISO start/end window, projectId, or a substring of description. Returns compact objects: id, description, start, end, durationSeconds, projectId, projectName, taskId, tagIds, billable.",
66
+ schema: ListInput,
67
+ handler: async (input, ctx) => {
68
+ const i = input;
69
+ const raw = await c(ctx).listTimeEntries(ctx.config.workspaceId, ctx.user.id, {
70
+ start: i.start,
71
+ end: i.end,
72
+ project: i.projectId,
73
+ description: i.descriptionContains,
74
+ page: i.page,
75
+ pageSize: i.pageSize,
76
+ });
77
+ return raw.map(shapeTimeEntry);
78
+ },
79
+ },
80
+ {
81
+ name: "get_time_entry",
82
+ description: "Fetch a single time entry by id.",
83
+ schema: GetInput,
84
+ handler: async (input, ctx) => {
85
+ const { id } = input;
86
+ const raw = await c(ctx).getTimeEntry(ctx.config.workspaceId, id);
87
+ return shapeTimeEntry(raw);
88
+ },
89
+ },
90
+ {
91
+ name: "create_time_entry",
92
+ description: "Create a completed time entry. Requires ISO start; provide end to make it closed (recommended for logging past work).",
93
+ schema: CreateInput,
94
+ handler: async (input, ctx) => {
95
+ const body = input;
96
+ const raw = await c(ctx).createTimeEntry(ctx.config.workspaceId, body);
97
+ return shapeTimeEntry(raw);
98
+ },
99
+ },
100
+ {
101
+ name: "update_time_entry",
102
+ description: "Patch an existing time entry. Any field omitted is left unchanged.",
103
+ schema: UpdateInput,
104
+ handler: async (input, ctx) => {
105
+ const { id, ...rest } = input;
106
+ const raw = await c(ctx).updateTimeEntry(ctx.config.workspaceId, id, rest);
107
+ return shapeTimeEntry(raw);
108
+ },
109
+ },
110
+ {
111
+ name: "delete_time_entry",
112
+ description: "Delete a time entry by id.",
113
+ schema: DeleteInput,
114
+ handler: async (input, ctx) => {
115
+ const { id } = input;
116
+ await c(ctx).deleteTimeEntry(ctx.config.workspaceId, id);
117
+ return { deleted: true, id };
118
+ },
119
+ },
120
+ {
121
+ name: "start_timer",
122
+ description: "Start a running time entry. Fails with an error if another timer is already running — stop it first.",
123
+ schema: StartInput,
124
+ handler: async (input, ctx) => {
125
+ const i = input;
126
+ const running = await findRunning(ctx);
127
+ if (running) {
128
+ throw new Error(`A timer is already running (id ${running.id}). Stop it before starting a new one.`);
129
+ }
130
+ const raw = await c(ctx).createTimeEntry(ctx.config.workspaceId, {
131
+ start: i.start ?? new Date().toISOString(),
132
+ description: i.description,
133
+ projectId: i.projectId,
134
+ taskId: i.taskId,
135
+ tagIds: i.tagIds,
136
+ billable: i.billable,
137
+ });
138
+ return shapeTimeEntry(raw);
139
+ },
140
+ },
141
+ {
142
+ name: "stop_timer",
143
+ description: "Stop the currently running timer. Uses now as the end time if `end` is omitted.",
144
+ schema: StopInput,
145
+ handler: async (input, ctx) => {
146
+ const { end } = input;
147
+ const raw = await c(ctx).stopRunningTimer(ctx.config.workspaceId, ctx.user.id, end ?? new Date().toISOString());
148
+ return shapeTimeEntry(raw);
149
+ },
150
+ },
151
+ {
152
+ name: "get_running_timer",
153
+ description: "Return the currently running time entry, or null if none.",
154
+ schema: Empty,
155
+ handler: async (_input, ctx) => {
156
+ const running = await findRunning(ctx);
157
+ return running ? shapeTimeEntry(running) : null;
158
+ },
159
+ },
160
+ ];
161
+ //# sourceMappingURL=timeEntries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeEntries.js","sourceRoot":"","sources":["../../src/tools/timeEntries.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@themkn/clockify-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for managing Clockify time entries, projects, tasks, tags, and clients.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "clockify-mcp": "./dist/index.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "SECURITY.md",
15
+ "LICENSE",
16
+ "config.example.json"
17
+ ],
18
+ "engines": {
19
+ "node": ">=24"
20
+ },
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "start": "node dist/index.js",
24
+ "dev": "tsc --watch",
25
+ "test": "vitest run",
26
+ "test:watch": "vitest",
27
+ "typecheck": "tsc --noEmit",
28
+ "audit": "npm audit --audit-level=high"
29
+ },
30
+ "dependencies": {
31
+ "@modelcontextprotocol/sdk": "^1.29.0",
32
+ "zod": "^4.3.6"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^25.6.0",
36
+ "typescript": "^6.0.2",
37
+ "vitest": "^4.1.4"
38
+ }
39
+ }