@timesheetai/mcp 0.1.0-alpha.4 → 0.1.0-alpha.7
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.
- package/README.md +40 -50
- package/dist/client.d.ts +34 -3
- package/dist/client.js +15 -3
- package/dist/client.js.map +1 -1
- package/dist/config.js +3 -1
- package/dist/config.js.map +1 -1
- package/dist/server.js +61 -15
- package/dist/server.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
# @timesheetai/mcp
|
|
2
2
|
|
|
3
|
-
> **Alpha:** TimesheetAI is currently in early access at
|
|
4
|
-
> [alpha.timesheetai.app](https://alpha.timesheetai.app). Sign up there to get
|
|
5
|
-
> an account, then create an API key from **Account Portal → API Keys**.
|
|
3
|
+
> **Alpha:** TimesheetAI is currently in early access at [alpha.timesheetai.app](https://alpha.timesheetai.app). Sign up there to get an account, then create an API key from **Account Portal → API Keys**.
|
|
6
4
|
|
|
7
|
-
A [Model Context Protocol](https://modelcontextprotocol.io) server for
|
|
8
|
-
**TimesheetAI** — a timesheet app built for developers. It lets AI agents
|
|
9
|
-
(Codex, Claude Code, Claude Desktop, Cursor, …) read your projects and log time
|
|
10
|
-
on your behalf, without leaving your editor.
|
|
5
|
+
A [Model Context Protocol](https://modelcontextprotocol.io) server for **TimesheetAI** — a timesheet app built for developers. It lets AI agents (Codex, Claude Code, Claude Desktop, Cursor, …) read your projects and log time on your behalf, without leaving your editor.
|
|
11
6
|
|
|
12
|
-
Motivating workflow: at the end of the day, ask your agent to summarize what it
|
|
13
|
-
worked on and have it call `add_time_entry` to record the time directly.
|
|
7
|
+
Motivating workflow: at the end of the day, ask your agent to summarize what it worked on and have it call `create_time_entry` to record the time directly.
|
|
14
8
|
|
|
15
9
|

|
|
16
10
|
|
|
@@ -18,43 +12,44 @@ worked on and have it call `add_time_entry` to record the time directly.
|
|
|
18
12
|
|
|
19
13
|
## Tools
|
|
20
14
|
|
|
21
|
-
| Tool
|
|
22
|
-
|
|
|
23
|
-
| `list_workspaces`
|
|
24
|
-
| `list_projects`
|
|
25
|
-
| `list_entries`
|
|
26
|
-
| `
|
|
27
|
-
| `
|
|
15
|
+
| Tool | What it does |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| `list_workspaces` | List the workspaces your API key can access. |
|
|
18
|
+
| `list_projects` | List active projects and their active tasks (gives you `projectId`/`taskId`). Pass `search` to filter by approximate project name (handles typos/abbreviations). |
|
|
19
|
+
| `list_entries` | List your time entries for any date (defaults to today), or an inclusive date range up to 7 days by adding `endDate`. |
|
|
20
|
+
| `create_project` | Create a new project. Check `list_projects` first — never create a duplicate. |
|
|
21
|
+
| `create_task` | Create a new task under an existing project. Check `list_projects` first. |
|
|
22
|
+
| `create_time_entry` | Log one entry: `projectId`, optional `taskId`, `date`, `start`, `end`, `description`. |
|
|
23
|
+
| `delete_time_entry` | Delete one of your own entries by its numeric `id`. |
|
|
28
24
|
|
|
29
|
-
Times are **wall-clock** (`HH:mm`), dates are `YYYY-MM-DD`. "Today" defaults to
|
|
30
|
-
this machine's local date.
|
|
25
|
+
Times are **wall-clock** (`HH:mm`), dates are `YYYY-MM-DD`. "Today" defaults to this machine's local date.
|
|
31
26
|
|
|
32
|
-
`
|
|
33
|
-
client generates one per call automatically; to make a retry of the *same*
|
|
34
|
-
logical add safe, pass the same `clientRefId` again — the backend returns the
|
|
35
|
-
existing entry instead of creating a duplicate.
|
|
27
|
+
`create_time_entry` is **idempotent** on an optional `clientRefId` (UUID). The client generates one per call automatically; to make a retry of the _same_ logical add safe, pass the same `clientRefId` again — the backend returns the existing entry instead of creating a duplicate.
|
|
36
28
|
|
|
37
|
-
`
|
|
38
|
-
overlaps an existing entry on the same date, the backend returns a `409 overlap`
|
|
39
|
-
error with a `conflicts` array listing the colliding entries. Exact-duplicate
|
|
40
|
-
retries (same `clientRefId`) bypass the overlap check and are idempotent.
|
|
29
|
+
`create_time_entry` also enforces an **overlap guard**: if the requested time span overlaps an existing entry on the same date, the backend returns a `409 overlap` error with a `conflicts` array listing the colliding entries. Exact-duplicate retries (same `clientRefId`) bypass the overlap check and are idempotent.
|
|
41
30
|
|
|
42
|
-
`delete_time_entry` requires the numeric `id` returned by `
|
|
43
|
-
|
|
31
|
+
`delete_time_entry` requires the numeric `id` returned by `create_time_entry` or `list_entries`. Entries in a locked (submitted/approved) week cannot be deleted.
|
|
32
|
+
|
|
33
|
+
`list_entries` fetches a single day by default (today when `date` is omitted). To pull a whole work week in one call, pass both `date` (start) and `endDate` (inclusive end), up to a 7-day span:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
list_entries({ date: "2026-08-24", endDate: "2026-08-28" })
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
A range longer than 7 days, or an `endDate` before `date`, is rejected with an `invalid_date_range` error.
|
|
44
40
|
|
|
45
41
|
## Configuration
|
|
46
42
|
|
|
47
43
|
The server needs two settings:
|
|
48
44
|
|
|
49
|
-
| Setting
|
|
50
|
-
|
|
|
51
|
-
| API key
|
|
52
|
-
| Backend base URL
|
|
45
|
+
| Setting | Env var | Default |
|
|
46
|
+
| ---------------- | ---------------------- | ------------------------------- |
|
|
47
|
+
| API key | `TIMESHEETAI_API_KEY` | _(required)_ |
|
|
48
|
+
| Backend base URL | `TIMESHEETAI_BASE_URL` | `https://alpha.timesheetai.app` |
|
|
53
49
|
|
|
54
50
|
Create an API key at [alpha.timesheetai.app](https://alpha.timesheetai.app) under **Account Portal → API Keys**.
|
|
55
51
|
|
|
56
|
-
Set them via your MCP host's `env` block (recommended), or in
|
|
57
|
-
`~/.config/timesheetai/config.json`:
|
|
52
|
+
Set them via your MCP host's `env` block (recommended), or in `~/.config/timesheetai/config.json`:
|
|
58
53
|
|
|
59
54
|
```json
|
|
60
55
|
{
|
|
@@ -67,10 +62,7 @@ Environment variables take precedence over the config file.
|
|
|
67
62
|
|
|
68
63
|
## Host setup
|
|
69
64
|
|
|
70
|
-
> **Alpha release:** the package is published under the `alpha` npm dist-tag while it
|
|
71
|
-
> targets the alpha backend, so install it as **`@timesheetai/mcp@alpha`** (a plain
|
|
72
|
-
> `@timesheetai/mcp` has no `latest` yet). The alpha endpoint is the built-in default,
|
|
73
|
-
> so `TIMESHEETAI_BASE_URL` is optional below.
|
|
65
|
+
> **Alpha release:** the package is published under the `alpha` npm dist-tag while it targets the alpha backend, so install it as **`@timesheetai/mcp@alpha`** (a plain `@timesheetai/mcp` has no `latest` yet). The alpha endpoint is the built-in default, so `TIMESHEETAI_BASE_URL` is optional below.
|
|
74
66
|
|
|
75
67
|
### Claude Desktop
|
|
76
68
|
|
|
@@ -84,10 +76,10 @@ Environment variables take precedence over the config file.
|
|
|
84
76
|
"args": ["-y", "@timesheetai/mcp@alpha"],
|
|
85
77
|
"env": {
|
|
86
78
|
"TIMESHEETAI_API_KEY": "ak_...",
|
|
87
|
-
"TIMESHEETAI_BASE_URL": "https://alpha.timesheetai.app"
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
79
|
+
"TIMESHEETAI_BASE_URL": "https://alpha.timesheetai.app",
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
91
83
|
}
|
|
92
84
|
```
|
|
93
85
|
|
|
@@ -122,9 +114,7 @@ TIMESHEETAI_API_KEY=ak_... \
|
|
|
122
114
|
|
|
123
115
|
## How it works
|
|
124
116
|
|
|
125
|
-
This package is a thin **stdio MCP server** that proxies tool calls to the
|
|
126
|
-
TimesheetAI backend over authenticated HTTP. No database credentials or secrets
|
|
127
|
-
are ever exposed to the agent.
|
|
117
|
+
This package is a thin **stdio MCP server** that proxies tool calls to the TimesheetAI backend over authenticated HTTP. No database credentials or secrets are ever exposed to the agent.
|
|
128
118
|
|
|
129
119
|
```
|
|
130
120
|
Agent (Claude, Codex, …)
|
|
@@ -139,9 +129,9 @@ TimesheetAI backend
|
|
|
139
129
|
**Typical agent flow:**
|
|
140
130
|
|
|
141
131
|
1. `list_projects` (optionally with `search`) → get `projectId` and `taskId`
|
|
142
|
-
2. `
|
|
143
|
-
3. `
|
|
144
|
-
4. `
|
|
132
|
+
2. If not found: `create_project` then `create_task` to set them up first
|
|
133
|
+
3. `create_time_entry` → log the entry (idempotent on `clientRefId`)
|
|
134
|
+
4. `list_entries` → verify what was logged
|
|
135
|
+
5. `delete_time_entry` → correct a mistake
|
|
145
136
|
|
|
146
|
-
**Time format:** all times are wall-clock (`HH:mm`), dates `YYYY-MM-DD`.
|
|
147
|
-
The agent resolves "today" to an explicit date — the server never infers timezones.
|
|
137
|
+
**Time format:** all times are wall-clock (`HH:mm`), dates `YYYY-MM-DD`. The agent resolves "today" to an explicit date — the server never infers timezones.
|
package/dist/client.d.ts
CHANGED
|
@@ -42,7 +42,16 @@ export type TimeEntry = {
|
|
|
42
42
|
isBillable: boolean;
|
|
43
43
|
description: string;
|
|
44
44
|
};
|
|
45
|
-
export type
|
|
45
|
+
export type CreateProjectInput = {
|
|
46
|
+
name: string;
|
|
47
|
+
workspace?: string;
|
|
48
|
+
};
|
|
49
|
+
export type CreateTaskInput = {
|
|
50
|
+
projectId: number;
|
|
51
|
+
name: string;
|
|
52
|
+
workspace?: string;
|
|
53
|
+
};
|
|
54
|
+
export type CreateTimeEntryInput = {
|
|
46
55
|
projectId: number;
|
|
47
56
|
taskId?: number;
|
|
48
57
|
date: string;
|
|
@@ -68,15 +77,37 @@ export declare class TimesheetClient {
|
|
|
68
77
|
};
|
|
69
78
|
projects: Project[];
|
|
70
79
|
}>;
|
|
71
|
-
listEntries(date: string, workspace?: string): Promise<{
|
|
80
|
+
listEntries(date: string, endDate?: string, workspace?: string): Promise<{
|
|
72
81
|
workspace: {
|
|
73
82
|
id: string;
|
|
74
83
|
name: string;
|
|
75
84
|
};
|
|
76
85
|
date: string;
|
|
86
|
+
endDate?: string;
|
|
77
87
|
entries: TimeEntry[];
|
|
78
88
|
}>;
|
|
79
|
-
|
|
89
|
+
createProject(input: CreateProjectInput): Promise<{
|
|
90
|
+
workspace: {
|
|
91
|
+
id: string;
|
|
92
|
+
name: string;
|
|
93
|
+
};
|
|
94
|
+
project: {
|
|
95
|
+
id: number;
|
|
96
|
+
name: string;
|
|
97
|
+
};
|
|
98
|
+
}>;
|
|
99
|
+
createTask(input: CreateTaskInput): Promise<{
|
|
100
|
+
workspace: {
|
|
101
|
+
id: string;
|
|
102
|
+
name: string;
|
|
103
|
+
};
|
|
104
|
+
task: {
|
|
105
|
+
id: number;
|
|
106
|
+
name: string;
|
|
107
|
+
projectId: number;
|
|
108
|
+
};
|
|
109
|
+
}>;
|
|
110
|
+
createTimeEntry(input: CreateTimeEntryInput): Promise<{
|
|
80
111
|
workspace: {
|
|
81
112
|
id: string;
|
|
82
113
|
name: string;
|
package/dist/client.js
CHANGED
|
@@ -58,10 +58,22 @@ export class TimesheetClient {
|
|
|
58
58
|
listProjects(workspace, search) {
|
|
59
59
|
return this.request(`/api/mcp/v1/projects${queryString({ workspace, search })}`);
|
|
60
60
|
}
|
|
61
|
-
listEntries(date, workspace) {
|
|
62
|
-
return this.request(`/api/mcp/v1/entries${queryString({ date, workspace })}`);
|
|
61
|
+
listEntries(date, endDate, workspace) {
|
|
62
|
+
return this.request(`/api/mcp/v1/entries${queryString({ date, endDate, workspace })}`);
|
|
63
63
|
}
|
|
64
|
-
|
|
64
|
+
createProject(input) {
|
|
65
|
+
return this.request("/api/mcp/v1/projects", {
|
|
66
|
+
method: "POST",
|
|
67
|
+
body: JSON.stringify(input),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
createTask(input) {
|
|
71
|
+
return this.request("/api/mcp/v1/tasks", {
|
|
72
|
+
method: "POST",
|
|
73
|
+
body: JSON.stringify(input),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
createTimeEntry(input) {
|
|
65
77
|
// Stable idempotency key per logical add: reuse a caller-supplied id, else
|
|
66
78
|
// generate one here (before the request) so a transport-level retry of THIS
|
|
67
79
|
// body hits the backend's idempotency path instead of duplicating.
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEf;IACA;IAEA;IAJlB,YACkB,MAAc,EACd,IAAY,EAC5B,OAAe,EACC,OAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QAEZ,YAAO,GAAP,OAAO,CAAU;QAGjC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -29,7 +29,9 @@ export function describeEndpoint(baseUrl) {
|
|
|
29
29
|
if (host === `alpha.${PRODUCTION_HOST}`) {
|
|
30
30
|
return { production: false, label: "ALPHA test endpoint" };
|
|
31
31
|
}
|
|
32
|
-
if (host === "localhost" ||
|
|
32
|
+
if (host === "localhost" ||
|
|
33
|
+
host.startsWith("localhost:") ||
|
|
34
|
+
host.startsWith("127.0.0.1")) {
|
|
33
35
|
return { production: false, label: "local dev endpoint" };
|
|
34
36
|
}
|
|
35
37
|
return { production: false, label: "non-production endpoint" };
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,iFAAiF;AACjF,MAAM,CAAC,MAAM,gBAAgB,GAAG,+BAA+B,CAAC;AAEhE;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAEjD,kDAAkD;AAClD,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAI9C,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,OAAO,eAAe,EAAE,EAAE,CAAC;QAClE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,eAAe,EAAE,EAAE,CAAC;QACxC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC7D,CAAC;IACD,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -21,7 +21,10 @@ function fail(err) {
|
|
|
21
21
|
}
|
|
22
22
|
return {
|
|
23
23
|
content: [
|
|
24
|
-
{
|
|
24
|
+
{
|
|
25
|
+
type: "text",
|
|
26
|
+
text: `Error: ${err?.message ?? String(err)}`,
|
|
27
|
+
},
|
|
25
28
|
],
|
|
26
29
|
isError: true,
|
|
27
30
|
};
|
|
@@ -34,6 +37,47 @@ export function createServer(config = loadConfig()) {
|
|
|
34
37
|
name: "timesheetai",
|
|
35
38
|
version: "0.1.0",
|
|
36
39
|
});
|
|
40
|
+
server.registerTool("create_project", {
|
|
41
|
+
title: "Create project",
|
|
42
|
+
description: "Creates a new project. IMPORTANT: Always call list_projects first with the intended name as the search term. Only call this tool if no matching active project is found — never create a duplicate.",
|
|
43
|
+
inputSchema: {
|
|
44
|
+
name: z
|
|
45
|
+
.string()
|
|
46
|
+
.describe("Project name. Must be unique within the workspace."),
|
|
47
|
+
workspace: z.string().describe(WORKSPACE_DESC).optional(),
|
|
48
|
+
},
|
|
49
|
+
}, async ({ name, workspace }) => {
|
|
50
|
+
try {
|
|
51
|
+
const result = await client.createProject({ name, workspace });
|
|
52
|
+
return ok(result, `Created project "${result.project.name}".`);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
return fail(err);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
server.registerTool("create_task", {
|
|
59
|
+
title: "Create task",
|
|
60
|
+
description: "Creates a new task under an existing project. IMPORTANT: Always call list_projects first to check whether the task already exists under the target project. Only call this tool if the task is confirmed to not exist yet — never create a duplicate.",
|
|
61
|
+
inputSchema: {
|
|
62
|
+
projectId: z
|
|
63
|
+
.number()
|
|
64
|
+
.int()
|
|
65
|
+
.positive()
|
|
66
|
+
.describe("ID of the project to add the task to. Obtain from list_projects."),
|
|
67
|
+
name: z
|
|
68
|
+
.string()
|
|
69
|
+
.describe("Task name. Must be unique within the project."),
|
|
70
|
+
workspace: z.string().describe(WORKSPACE_DESC).optional(),
|
|
71
|
+
},
|
|
72
|
+
}, async ({ projectId, name, workspace }) => {
|
|
73
|
+
try {
|
|
74
|
+
const result = await client.createTask({ projectId, name, workspace });
|
|
75
|
+
return ok(result, `Created task "${result.task.name}".`);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
return fail(err);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
37
81
|
server.registerTool("list_workspaces", {
|
|
38
82
|
title: "List workspaces",
|
|
39
83
|
description: "List the TimesheetAI workspaces your API key can access. Use when a tool reports that a workspace must be specified.",
|
|
@@ -48,7 +92,7 @@ export function createServer(config = loadConfig()) {
|
|
|
48
92
|
});
|
|
49
93
|
server.registerTool("list_projects", {
|
|
50
94
|
title: "List projects",
|
|
51
|
-
description: "List active projects and their active tasks. Call this first to get the projectId and taskId needed by
|
|
95
|
+
description: "List active projects and their active tasks. Call this first to get the projectId and taskId needed by create_time_entry. Pass search to filter by approximate name — matches project names first; if no project matches, falls back to task names across all projects.",
|
|
52
96
|
inputSchema: {
|
|
53
97
|
workspace: z.string().describe(WORKSPACE_DESC).optional(),
|
|
54
98
|
search: z
|
|
@@ -65,26 +109,31 @@ export function createServer(config = loadConfig()) {
|
|
|
65
109
|
}
|
|
66
110
|
});
|
|
67
111
|
server.registerTool("list_entries", {
|
|
68
|
-
title: "List
|
|
69
|
-
description: "List your own time entries for
|
|
112
|
+
title: "List time entries",
|
|
113
|
+
description: "List your own time entries for a date or an inclusive date range (max 7 days). Defaults to today (this machine's local date) when no date is given. Provide both date (start) and endDate to fetch a range such as a work week in one call.",
|
|
70
114
|
inputSchema: {
|
|
71
115
|
date: z
|
|
72
116
|
.string()
|
|
73
117
|
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
74
|
-
.describe("
|
|
118
|
+
.describe("Start day to list, YYYY-MM-DD. Defaults to today. Range start when endDate is given.")
|
|
119
|
+
.optional(),
|
|
120
|
+
endDate: z
|
|
121
|
+
.string()
|
|
122
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
123
|
+
.describe("Optional inclusive end day, YYYY-MM-DD. Must be on or after date and within 6 days of it (max 7-day span). Omit to list a single day.")
|
|
75
124
|
.optional(),
|
|
76
125
|
workspace: z.string().describe(WORKSPACE_DESC).optional(),
|
|
77
126
|
},
|
|
78
|
-
}, async ({ date, workspace }) => {
|
|
127
|
+
}, async ({ date, endDate, workspace }) => {
|
|
79
128
|
try {
|
|
80
129
|
const day = date ?? localToday();
|
|
81
|
-
return ok(await client.listEntries(day, workspace));
|
|
130
|
+
return ok(await client.listEntries(day, endDate, workspace));
|
|
82
131
|
}
|
|
83
132
|
catch (err) {
|
|
84
133
|
return fail(err);
|
|
85
134
|
}
|
|
86
135
|
});
|
|
87
|
-
server.registerTool("
|
|
136
|
+
server.registerTool("create_time_entry", {
|
|
88
137
|
title: "Add a time entry",
|
|
89
138
|
description: "Log a single time entry. Resolve projectId/taskId via list_projects first. Time is wall-clock; the date defaults to today.",
|
|
90
139
|
inputSchema: {
|
|
@@ -112,10 +161,7 @@ export function createServer(config = loadConfig()) {
|
|
|
112
161
|
.string()
|
|
113
162
|
.regex(/^([01]\d|2[0-3]):[0-5]\d$/)
|
|
114
163
|
.describe(`End ${TIME_DESC} Must be after start.`),
|
|
115
|
-
description: z
|
|
116
|
-
.string()
|
|
117
|
-
.describe("What was worked on.")
|
|
118
|
-
.optional(),
|
|
164
|
+
description: z.string().describe("What was worked on.").optional(),
|
|
119
165
|
isBillable: z
|
|
120
166
|
.boolean()
|
|
121
167
|
.describe("Override billable flag. Defaults to the task/project default.")
|
|
@@ -127,9 +173,9 @@ export function createServer(config = loadConfig()) {
|
|
|
127
173
|
.describe("Idempotency key (UUID). Reuse the SAME value when retrying the same logical add so it is not duplicated. Omit to auto-generate (no retry protection).")
|
|
128
174
|
.optional(),
|
|
129
175
|
},
|
|
130
|
-
}, async ({ projectId, taskId, date, start, end, description, isBillable, workspace, clientRefId }) => {
|
|
176
|
+
}, async ({ projectId, taskId, date, start, end, description, isBillable, workspace, clientRefId, }) => {
|
|
131
177
|
try {
|
|
132
|
-
const result = await client.
|
|
178
|
+
const result = await client.createTimeEntry({
|
|
133
179
|
projectId,
|
|
134
180
|
taskId,
|
|
135
181
|
date: date ?? localToday(),
|
|
@@ -150,7 +196,7 @@ export function createServer(config = loadConfig()) {
|
|
|
150
196
|
});
|
|
151
197
|
server.registerTool("delete_time_entry", {
|
|
152
198
|
title: "Delete a time entry",
|
|
153
|
-
description: "Delete one of your own time entries by its numeric id. The id is returned by
|
|
199
|
+
description: "Delete one of your own time entries by its numeric id. The id is returned by create_time_entry and list_entries. Entries in a locked (submitted/approved) week cannot be deleted.",
|
|
154
200
|
inputSchema: {
|
|
155
201
|
entryId: z
|
|
156
202
|
.number()
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAOxD,SAAS,EAAE,CAAC,IAAa,EAAE,OAAgB;IACzC,MAAM,IAAI,GAAG,OAAO;QAClB,CAAC,CAAC,GAAG,OAAO,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAClD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAClC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,IAAI,CAAC,GAAY;IACxB,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YACxE,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE;YACP,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@timesheetai/mcp",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.7",
|
|
4
4
|
"description": "MCP server for TimesheetAI (alpha) — connect AI agents (Claude, Codex, Cursor) to your timesheet. Sign up at alpha.timesheetai.app.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"comment:dist-tag": "Published under the `alpha` npm dist-tag while DEFAULT_BASE_URL points at alpha. Install with `@timesheetai/mcp@alpha`. At production launch: flip DEFAULT_BASE_URL to production, bump to a stable version, and publish to `latest`.",
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"node": ">=20"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
25
|
-
"zod": "^4.3
|
|
24
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
25
|
+
"zod": "^4.4.3"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.10.0",
|