vtiger-mcp 0.1.0 → 0.2.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.
- package/README.md +25 -4
- package/dist/cli/index.js +8 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/core/timesheet.js +101 -49
- package/dist/core/timesheet.js.map +1 -1
- package/dist/mcp/server.js +16 -28
- package/dist/mcp/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -161,16 +161,37 @@ vtiger update 17x1234 --set description="Revised notes"
|
|
|
161
161
|
(`<moduleId>x<recordId>`). Reference fields (owner, `related_to`,
|
|
162
162
|
`projectid`) expect these ids; the timesheet helpers resolve task names
|
|
163
163
|
to ids for you.
|
|
164
|
-
- **The timesheet module
|
|
165
|
-
|
|
166
|
-
generic `create_record` / `query` tools, or adjust the constants in
|
|
167
|
-
`src/core/timesheet.ts`.
|
|
164
|
+
- **The timesheet module is configurable** (see below). It defaults to
|
|
165
|
+
`TimeControl`; point it at your module without touching code.
|
|
168
166
|
- **Deletes are off by default.** Set `VTIGER_ALLOW_DELETE=true` only if you
|
|
169
167
|
want the agent/CLI to delete records (and your account has that right).
|
|
170
168
|
- **Security.** Your access key is a secret — keep it in your local `.env`
|
|
171
169
|
or client config only. Use HTTPS. Nothing is centralized; each user runs
|
|
172
170
|
their own copy with their own key.
|
|
173
171
|
|
|
172
|
+
## Configuring the timesheet module (other vtiger installs)
|
|
173
|
+
|
|
174
|
+
The timesheet helpers default to the `TimeControl` module with
|
|
175
|
+
`ProjectTask`/`Project` links. If your install uses different module or
|
|
176
|
+
field names, set these env vars (all optional) — no code changes needed:
|
|
177
|
+
|
|
178
|
+
| Variable | Default | Purpose |
|
|
179
|
+
|---|---|---|
|
|
180
|
+
| `VTIGER_TIMESHEET_MODULE` | `TimeControl` | Time-entry module |
|
|
181
|
+
| `VTIGER_TASK_MODULE` | `ProjectTask` | Module linked from an entry |
|
|
182
|
+
| `VTIGER_PROJECT_MODULE` | `Project` | Project module |
|
|
183
|
+
|
|
184
|
+
Advanced field-name overrides (rarely needed): `VTIGER_TS_DATE_START_FIELD`,
|
|
185
|
+
`VTIGER_TS_DATE_END_FIELD`, `VTIGER_TS_TIME_START_FIELD`,
|
|
186
|
+
`VTIGER_TS_TIME_END_FIELD`, `VTIGER_TS_RELATED_FIELD`, `VTIGER_TS_DESC_FIELD`,
|
|
187
|
+
`VTIGER_TS_HOURSTYPE_FIELD`, `VTIGER_TS_TOTAL_FIELD`, `VTIGER_TS_OWNER_FIELD`,
|
|
188
|
+
`VTIGER_TASK_NAME_FIELD`, `VTIGER_TASK_PROJECT_FIELD`,
|
|
189
|
+
`VTIGER_PROJECT_NAME_FIELD`. See [.env.example](.env.example) for the full
|
|
190
|
+
list and defaults.
|
|
191
|
+
|
|
192
|
+
> Whatever your modules are named, the generic `create_record`,
|
|
193
|
+
> `update_record`, `query`, and `describe_module` tools always work.
|
|
194
|
+
|
|
174
195
|
## License
|
|
175
196
|
|
|
176
197
|
[MIT](LICENSE) © ViralP17
|
package/dist/cli/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { readFileSync, existsSync } from "node:fs";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import { createClientFromEnv } from "../core/client.js";
|
|
5
|
-
import {
|
|
5
|
+
import { timesheetConfigFromEnv, findTasks, listProjects, buildTimesheetElement, listMyTimesheets, } from "../core/timesheet.js";
|
|
6
6
|
/**
|
|
7
7
|
* Thin CLI over the shared vtiger core client. Useful for quick testing,
|
|
8
8
|
* scripting, and for developers who prefer the terminal. Reads the same
|
|
@@ -100,6 +100,7 @@ async function main() {
|
|
|
100
100
|
return;
|
|
101
101
|
}
|
|
102
102
|
const client = createClientFromEnv();
|
|
103
|
+
const tsCfg = timesheetConfigFromEnv();
|
|
103
104
|
switch (command) {
|
|
104
105
|
case "whoami": {
|
|
105
106
|
await client.listTypes();
|
|
@@ -160,17 +161,17 @@ async function main() {
|
|
|
160
161
|
break;
|
|
161
162
|
}
|
|
162
163
|
case "projects":
|
|
163
|
-
print(await client
|
|
164
|
+
print(await listProjects(client, tsCfg));
|
|
164
165
|
break;
|
|
165
166
|
case "tasks":
|
|
166
|
-
print(await findTasks(client, args.positionals[0] ?? ""));
|
|
167
|
+
print(await findTasks(client, tsCfg, args.positionals[0] ?? ""));
|
|
167
168
|
break;
|
|
168
169
|
case "log-timesheet": {
|
|
169
170
|
await client.listTypes(); // ensure login -> userId
|
|
170
171
|
let taskId;
|
|
171
172
|
const task = flag(args, "task");
|
|
172
173
|
if (task) {
|
|
173
|
-
const matches = await findTasks(client, task);
|
|
174
|
+
const matches = await findTasks(client, tsCfg, task);
|
|
174
175
|
if (matches.length === 0)
|
|
175
176
|
throw new Error(`No task matches "${task}".`);
|
|
176
177
|
if (matches.length > 1) {
|
|
@@ -179,7 +180,7 @@ async function main() {
|
|
|
179
180
|
}
|
|
180
181
|
taskId = matches[0].id;
|
|
181
182
|
}
|
|
182
|
-
const element = buildTimesheetElement({
|
|
183
|
+
const element = buildTimesheetElement(tsCfg, {
|
|
183
184
|
date: flag(args, "date") ?? new Date().toISOString().slice(0, 10),
|
|
184
185
|
taskId,
|
|
185
186
|
startTime: flag(args, "start"),
|
|
@@ -189,12 +190,12 @@ async function main() {
|
|
|
189
190
|
hoursType: flag(args, "type"),
|
|
190
191
|
assignedUserId: client.userId ?? undefined,
|
|
191
192
|
});
|
|
192
|
-
print(await client.create(
|
|
193
|
+
print(await client.create(tsCfg.module, element));
|
|
193
194
|
break;
|
|
194
195
|
}
|
|
195
196
|
case "my-timesheets": {
|
|
196
197
|
await client.listTypes();
|
|
197
|
-
print(await listMyTimesheets(client, flag(args, "from"), flag(args, "to")));
|
|
198
|
+
print(await listMyTimesheets(client, tsCfg, flag(args, "from"), flag(args, "to")));
|
|
198
199
|
break;
|
|
199
200
|
}
|
|
200
201
|
default:
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/core/timesheet.js
CHANGED
|
@@ -1,22 +1,49 @@
|
|
|
1
1
|
import { isWebserviceId } from "./vtiger-id.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
2
|
+
const DEFAULTS = {
|
|
3
|
+
module: "TimeControl",
|
|
4
|
+
taskModule: "ProjectTask",
|
|
5
|
+
projectModule: "Project",
|
|
6
|
+
fields: {
|
|
7
|
+
dateStart: "date_start",
|
|
8
|
+
dateEnd: "date_end",
|
|
9
|
+
timeStart: "time_start",
|
|
10
|
+
timeEnd: "time_end",
|
|
11
|
+
relatedTo: "related_to",
|
|
12
|
+
description: "description",
|
|
13
|
+
hoursType: "hours_type",
|
|
14
|
+
totalTime: "totaltime",
|
|
15
|
+
owner: "assigned_user_id",
|
|
16
|
+
},
|
|
17
|
+
taskNameField: "projecttaskname",
|
|
18
|
+
taskProjectField: "projectid",
|
|
19
|
+
projectNameField: "projectname",
|
|
20
|
+
};
|
|
21
|
+
/** Read a timesheet config from env vars, falling back to the TimeControl defaults. */
|
|
22
|
+
export function timesheetConfigFromEnv(env = process.env) {
|
|
23
|
+
const pick = (name, fallback) => {
|
|
24
|
+
const v = env[name];
|
|
25
|
+
return v && v.trim() ? v.trim() : fallback;
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
module: pick("VTIGER_TIMESHEET_MODULE", DEFAULTS.module),
|
|
29
|
+
taskModule: pick("VTIGER_TASK_MODULE", DEFAULTS.taskModule),
|
|
30
|
+
projectModule: pick("VTIGER_PROJECT_MODULE", DEFAULTS.projectModule),
|
|
31
|
+
fields: {
|
|
32
|
+
dateStart: pick("VTIGER_TS_DATE_START_FIELD", DEFAULTS.fields.dateStart),
|
|
33
|
+
dateEnd: pick("VTIGER_TS_DATE_END_FIELD", DEFAULTS.fields.dateEnd),
|
|
34
|
+
timeStart: pick("VTIGER_TS_TIME_START_FIELD", DEFAULTS.fields.timeStart),
|
|
35
|
+
timeEnd: pick("VTIGER_TS_TIME_END_FIELD", DEFAULTS.fields.timeEnd),
|
|
36
|
+
relatedTo: pick("VTIGER_TS_RELATED_FIELD", DEFAULTS.fields.relatedTo),
|
|
37
|
+
description: pick("VTIGER_TS_DESC_FIELD", DEFAULTS.fields.description),
|
|
38
|
+
hoursType: pick("VTIGER_TS_HOURSTYPE_FIELD", DEFAULTS.fields.hoursType),
|
|
39
|
+
totalTime: pick("VTIGER_TS_TOTAL_FIELD", DEFAULTS.fields.totalTime),
|
|
40
|
+
owner: pick("VTIGER_TS_OWNER_FIELD", DEFAULTS.fields.owner),
|
|
41
|
+
},
|
|
42
|
+
taskNameField: pick("VTIGER_TASK_NAME_FIELD", DEFAULTS.taskNameField),
|
|
43
|
+
taskProjectField: pick("VTIGER_TASK_PROJECT_FIELD", DEFAULTS.taskProjectField),
|
|
44
|
+
projectNameField: pick("VTIGER_PROJECT_NAME_FIELD", DEFAULTS.projectNameField),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
20
47
|
/** Escape a value for safe inclusion inside a single-quoted VTQL string literal. */
|
|
21
48
|
export function escapeVtql(value) {
|
|
22
49
|
// VTQL is SQL-like; single quotes are the string delimiter. Double them to escape.
|
|
@@ -33,7 +60,7 @@ export function normalizeTime(t) {
|
|
|
33
60
|
return `${m[1].padStart(2, "0")}:${m[2]}:00`;
|
|
34
61
|
throw new Error(`Invalid time "${t}" (expected HH:MM or HH:MM:SS)`);
|
|
35
62
|
}
|
|
36
|
-
/** Convert an explicit total ("H:MM" or a number of
|
|
63
|
+
/** Convert an explicit total ("H:MM" or a number of minutes) to seconds. */
|
|
37
64
|
export function parseTotalToSeconds(total) {
|
|
38
65
|
const s = total.trim();
|
|
39
66
|
const hm = /^(\d{1,2}):(\d{2})$/.exec(s);
|
|
@@ -44,67 +71,92 @@ export function parseTotalToSeconds(total) {
|
|
|
44
71
|
throw new Error(`Invalid total "${total}" (expected "H:MM" or minutes)`);
|
|
45
72
|
}
|
|
46
73
|
/**
|
|
47
|
-
* Resolve a
|
|
48
|
-
*
|
|
49
|
-
*
|
|
74
|
+
* Resolve a task reference (used for the timesheet `related_to` field).
|
|
75
|
+
* Accepts either a webservice id (returned as-is) or a name to search for.
|
|
76
|
+
* Returns all matches so the caller can disambiguate.
|
|
50
77
|
*/
|
|
51
|
-
export async function findTasks(client, taskNameOrId) {
|
|
78
|
+
export async function findTasks(client, cfg, taskNameOrId) {
|
|
52
79
|
const trimmed = taskNameOrId.trim();
|
|
53
80
|
if (isWebserviceId(trimmed)) {
|
|
54
81
|
const rec = await client.retrieve(trimmed);
|
|
55
|
-
return [{ id: rec.id, name: rec.
|
|
82
|
+
return [{ id: rec.id, name: rec[cfg.taskNameField] ?? trimmed, projectId: rec[cfg.taskProjectField] }];
|
|
56
83
|
}
|
|
57
84
|
const like = escapeVtql(trimmed);
|
|
58
|
-
const rows = await client.query(`SELECT id,
|
|
85
|
+
const rows = await client.query(`SELECT id, ${cfg.taskNameField}, ${cfg.taskProjectField} FROM ${cfg.taskModule} WHERE ${cfg.taskNameField} LIKE '%${like}%' ORDER BY ${cfg.taskNameField} LIMIT 25;`);
|
|
59
86
|
return rows.map((r) => ({
|
|
60
87
|
id: r.id,
|
|
61
|
-
name: r.
|
|
62
|
-
projectId: r.
|
|
88
|
+
name: r[cfg.taskNameField],
|
|
89
|
+
projectId: r[cfg.taskProjectField],
|
|
63
90
|
}));
|
|
64
91
|
}
|
|
92
|
+
/** List projects the user can access (id + name). */
|
|
93
|
+
export async function listProjects(client, cfg) {
|
|
94
|
+
return client.query(`SELECT id, ${cfg.projectNameField} FROM ${cfg.projectModule} ORDER BY ${cfg.projectNameField} LIMIT 100;`);
|
|
95
|
+
}
|
|
65
96
|
/**
|
|
66
|
-
* Assemble a
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* seconds-based `totaltime` field.
|
|
97
|
+
* Assemble a timesheet `element` object for `client.create`, using the
|
|
98
|
+
* configured field names. When start/end times are given, the server
|
|
99
|
+
* computes the total itself — so we don't set the total field. An explicit
|
|
100
|
+
* `totalTime` (without times) is written to the seconds-based total field.
|
|
71
101
|
*/
|
|
72
|
-
export function buildTimesheetElement(input) {
|
|
102
|
+
export function buildTimesheetElement(cfg, input) {
|
|
103
|
+
const f = cfg.fields;
|
|
73
104
|
const element = {
|
|
74
|
-
|
|
75
|
-
|
|
105
|
+
[f.dateStart]: input.date,
|
|
106
|
+
[f.dateEnd]: input.date,
|
|
76
107
|
};
|
|
77
108
|
if (input.assignedUserId)
|
|
78
|
-
element.
|
|
109
|
+
element[f.owner] = input.assignedUserId;
|
|
79
110
|
if (input.taskId)
|
|
80
|
-
element.
|
|
111
|
+
element[f.relatedTo] = input.taskId;
|
|
81
112
|
if (input.projectId)
|
|
82
|
-
element.
|
|
113
|
+
element[cfg.taskProjectField] = input.projectId;
|
|
83
114
|
if (input.startTime)
|
|
84
|
-
element.
|
|
115
|
+
element[f.timeStart] = normalizeTime(input.startTime);
|
|
85
116
|
if (input.endTime)
|
|
86
|
-
element.
|
|
117
|
+
element[f.timeEnd] = normalizeTime(input.endTime);
|
|
87
118
|
if (input.activity)
|
|
88
|
-
element.description = input.activity;
|
|
119
|
+
element[f.description] = input.activity;
|
|
89
120
|
if (input.hoursType)
|
|
90
|
-
element.
|
|
91
|
-
// Only set
|
|
121
|
+
element[f.hoursType] = input.hoursType;
|
|
122
|
+
// Only set the total when we can't rely on server computation from times.
|
|
92
123
|
if (input.totalTime && !(input.startTime && input.endTime)) {
|
|
93
|
-
element.
|
|
124
|
+
element[f.totalTime] = parseTotalToSeconds(input.totalTime);
|
|
94
125
|
}
|
|
95
126
|
return element;
|
|
96
127
|
}
|
|
128
|
+
/** Map friendly update fields to the configured column names (for revise). */
|
|
129
|
+
export function buildTimesheetUpdate(cfg, input) {
|
|
130
|
+
const f = cfg.fields;
|
|
131
|
+
const values = {};
|
|
132
|
+
if (input.date) {
|
|
133
|
+
values[f.dateStart] = input.date;
|
|
134
|
+
values[f.dateEnd] = input.date;
|
|
135
|
+
}
|
|
136
|
+
if (input.startTime)
|
|
137
|
+
values[f.timeStart] = normalizeTime(input.startTime);
|
|
138
|
+
if (input.endTime)
|
|
139
|
+
values[f.timeEnd] = normalizeTime(input.endTime);
|
|
140
|
+
if (input.totalTime)
|
|
141
|
+
values[f.totalTime] = parseTotalToSeconds(input.totalTime);
|
|
142
|
+
if (input.activity)
|
|
143
|
+
values[f.description] = input.activity;
|
|
144
|
+
if (input.hoursType)
|
|
145
|
+
values[f.hoursType] = input.hoursType;
|
|
146
|
+
return values;
|
|
147
|
+
}
|
|
97
148
|
/** List the authenticated user's timesheet entries within a date range. */
|
|
98
|
-
export async function listMyTimesheets(client, from, to) {
|
|
149
|
+
export async function listMyTimesheets(client, cfg, from, to) {
|
|
150
|
+
const f = cfg.fields;
|
|
99
151
|
const clauses = [];
|
|
100
152
|
const uid = client.userId;
|
|
101
153
|
if (uid)
|
|
102
|
-
clauses.push(
|
|
154
|
+
clauses.push(`${f.owner} = '${uid}'`);
|
|
103
155
|
if (from)
|
|
104
|
-
clauses.push(
|
|
156
|
+
clauses.push(`${f.dateStart} >= '${escapeVtql(from)}'`);
|
|
105
157
|
if (to)
|
|
106
|
-
clauses.push(
|
|
158
|
+
clauses.push(`${f.dateStart} <= '${escapeVtql(to)}'`);
|
|
107
159
|
const where = clauses.length ? ` WHERE ${clauses.join(" AND ")}` : "";
|
|
108
|
-
return client.query(`SELECT
|
|
160
|
+
return client.query(`SELECT * FROM ${cfg.module}${where} ORDER BY ${f.dateStart} DESC LIMIT 100;`);
|
|
109
161
|
}
|
|
110
162
|
//# sourceMappingURL=timesheet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timesheet.js","sourceRoot":"","sources":["../../src/core/timesheet.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"timesheet.js","sourceRoot":"","sources":["../../src/core/timesheet.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -3,7 +3,9 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import { createClientFromEnv } from "../core/client.js";
|
|
6
|
-
import {
|
|
6
|
+
import { timesheetConfigFromEnv, findTasks, listProjects, buildTimesheetElement, buildTimesheetUpdate, listMyTimesheets, } from "../core/timesheet.js";
|
|
7
|
+
// Timesheet module/field names (defaults to TimeControl; override via env).
|
|
8
|
+
const tsCfg = timesheetConfigFromEnv();
|
|
7
9
|
/**
|
|
8
10
|
* MCP stdio server that exposes the vtiger portal to an AI agent AS the
|
|
9
11
|
* configured developer. Credentials come from env (VTIGER_URL /
|
|
@@ -29,7 +31,7 @@ function fail(err) {
|
|
|
29
31
|
const message = err instanceof Error ? err.message : String(err);
|
|
30
32
|
return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
|
|
31
33
|
}
|
|
32
|
-
const server = new McpServer({ name: "vtiger-mcp", version: "0.
|
|
34
|
+
const server = new McpServer({ name: "vtiger-mcp", version: "0.2.0" });
|
|
33
35
|
/**
|
|
34
36
|
* Register a tool with uniform error handling. `server.tool` is cast to
|
|
35
37
|
* sidestep the SDK's heavily-overloaded typings; the runtime contract
|
|
@@ -82,11 +84,11 @@ tool("whoami", "Return the authenticated developer's vtiger user id and profile
|
|
|
82
84
|
}
|
|
83
85
|
return ok({ userId: client.userId, user });
|
|
84
86
|
});
|
|
85
|
-
tool("list_my_projects", "List projects the developer can access (id + name), to pick a project for timesheet logging.", {}, async () => ok(await getClient()
|
|
86
|
-
tool("list_my_tasks",
|
|
87
|
-
tool("log_timesheet",
|
|
87
|
+
tool("list_my_projects", "List projects the developer can access (id + name), to pick a project for timesheet logging.", {}, async () => ok(await listProjects(getClient(), tsCfg)));
|
|
88
|
+
tool("list_my_tasks", `List tasks (id + name) the developer can access in the ${tsCfg.taskModule} module. Optionally filter by a task-name fragment. The task id is what a timesheet's link field points to.`, { nameContains: z.string().optional().describe("Optional substring to match against the task name.") }, async ({ nameContains }) => ok(await findTasks(getClient(), tsCfg, nameContains ?? "")));
|
|
89
|
+
tool("log_timesheet", `Log a daily timesheet entry in the ${tsCfg.module} module for the developer. Resolves a task by name or id, defaults the date to today and the owner to the current user, and computes total time from start/end when not given.`, {
|
|
88
90
|
date: z.string().optional().describe("Entry date YYYY-MM-DD. Defaults to today."),
|
|
89
|
-
task: z.string().optional().describe("
|
|
91
|
+
task: z.string().optional().describe("Task name (searched) or webservice id, linked as the entry's related field."),
|
|
90
92
|
startTime: z.string().optional().describe("Clock start HH:MM, e.g. '10:00'."),
|
|
91
93
|
endTime: z.string().optional().describe("Clock end HH:MM, e.g. '13:00'."),
|
|
92
94
|
totalTime: z.string().optional().describe("Explicit total HH:MM; computed from start/end if omitted."),
|
|
@@ -97,9 +99,9 @@ tool("log_timesheet", "Log a daily timesheet entry in the TimeControl module for
|
|
|
97
99
|
await client.listTypes(); // ensure login -> userId available
|
|
98
100
|
let taskId;
|
|
99
101
|
if (args.task) {
|
|
100
|
-
const matches = await findTasks(client, args.task);
|
|
102
|
+
const matches = await findTasks(client, tsCfg, args.task);
|
|
101
103
|
if (matches.length === 0) {
|
|
102
|
-
throw new Error(`No
|
|
104
|
+
throw new Error(`No task found matching "${args.task}". Use list_my_tasks to browse.`);
|
|
103
105
|
}
|
|
104
106
|
if (matches.length > 1) {
|
|
105
107
|
return ok({
|
|
@@ -110,7 +112,7 @@ tool("log_timesheet", "Log a daily timesheet entry in the TimeControl module for
|
|
|
110
112
|
}
|
|
111
113
|
taskId = matches[0].id;
|
|
112
114
|
}
|
|
113
|
-
const element = buildTimesheetElement({
|
|
115
|
+
const element = buildTimesheetElement(tsCfg, {
|
|
114
116
|
date: args.date ?? today(),
|
|
115
117
|
taskId,
|
|
116
118
|
startTime: args.startTime,
|
|
@@ -120,7 +122,7 @@ tool("log_timesheet", "Log a daily timesheet entry in the TimeControl module for
|
|
|
120
122
|
hoursType: args.hoursType,
|
|
121
123
|
assignedUserId: client.userId ?? undefined,
|
|
122
124
|
});
|
|
123
|
-
const created = await client.create(
|
|
125
|
+
const created = await client.create(tsCfg.module, element);
|
|
124
126
|
return ok({ created });
|
|
125
127
|
});
|
|
126
128
|
tool("list_my_timesheets", "List the developer's own timesheet entries, optionally within a date range (YYYY-MM-DD).", {
|
|
@@ -129,10 +131,10 @@ tool("list_my_timesheets", "List the developer's own timesheet entries, optional
|
|
|
129
131
|
}, async ({ from, to }) => {
|
|
130
132
|
const client = getClient();
|
|
131
133
|
await client.listTypes(); // ensure login -> userId available
|
|
132
|
-
return ok(await listMyTimesheets(client, from, to));
|
|
134
|
+
return ok(await listMyTimesheets(client, tsCfg, from, to));
|
|
133
135
|
});
|
|
134
|
-
tool("update_timesheet",
|
|
135
|
-
id: z.string().describe(
|
|
136
|
+
tool("update_timesheet", `Update fields on an existing ${tsCfg.module} timesheet entry (partial update).`, {
|
|
137
|
+
id: z.string().describe(`Webservice id of the ${tsCfg.module} record.`),
|
|
136
138
|
date: z.string().optional().describe("New date YYYY-MM-DD."),
|
|
137
139
|
startTime: z.string().optional(),
|
|
138
140
|
endTime: z.string().optional(),
|
|
@@ -140,21 +142,7 @@ tool("update_timesheet", "Update fields on an existing TimeControl timesheet ent
|
|
|
140
142
|
activity: z.string().optional(),
|
|
141
143
|
hoursType: z.string().optional(),
|
|
142
144
|
}, async ({ id, date, startTime, endTime, totalTime, activity, hoursType }) => {
|
|
143
|
-
const values = {};
|
|
144
|
-
if (date) {
|
|
145
|
-
values.date_start = date;
|
|
146
|
-
values.date_end = date;
|
|
147
|
-
}
|
|
148
|
-
if (startTime)
|
|
149
|
-
values.time_start = startTime;
|
|
150
|
-
if (endTime)
|
|
151
|
-
values.time_end = endTime;
|
|
152
|
-
if (totalTime)
|
|
153
|
-
values.totaltime = totalTime;
|
|
154
|
-
if (activity)
|
|
155
|
-
values.description = activity;
|
|
156
|
-
if (hoursType)
|
|
157
|
-
values.hours_type = hoursType;
|
|
145
|
+
const values = buildTimesheetUpdate(tsCfg, { date, startTime, endTime, totalTime, activity, hoursType });
|
|
158
146
|
return ok(await getClient().revise({ id, ...values }));
|
|
159
147
|
});
|
|
160
148
|
async function main() {
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAe,MAAM,KAAK,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAgB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vtiger-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "MCP server + CLI for vtiger CRM — log timesheets and create/update records in any module via an AI agent, using each user's own webservice access key (row-level access preserved).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|