@ttctl/mcp 0.1.0-rc.1 → 0.1.0-rc.3
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 +28 -0
- package/dist/tools/_shared.d.ts +16 -14
- package/dist/tools/_shared.d.ts.map +1 -1
- package/dist/tools/_shared.js +31 -20
- package/dist/tools/_shared.js.map +1 -1
- package/dist/tools/applications.d.ts +10 -0
- package/dist/tools/applications.d.ts.map +1 -1
- package/dist/tools/applications.js +87 -9
- package/dist/tools/applications.js.map +1 -1
- package/dist/tools/engagements.d.ts.map +1 -1
- package/dist/tools/engagements.js +44 -2
- package/dist/tools/engagements.js.map +1 -1
- package/dist/tools/index.d.ts +3 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +12 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/interest_requests.d.ts +77 -0
- package/dist/tools/interest_requests.d.ts.map +1 -0
- package/dist/tools/interest_requests.js +219 -0
- package/dist/tools/interest_requests.js.map +1 -0
- package/dist/tools/jobs.d.ts +18 -3
- package/dist/tools/jobs.d.ts.map +1 -1
- package/dist/tools/jobs.js +177 -39
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/payments.d.ts.map +1 -1
- package/dist/tools/payments.js +51 -2
- package/dist/tools/payments.js.map +1 -1
- package/dist/tools/profile/certifications.d.ts.map +1 -1
- package/dist/tools/profile/certifications.js +26 -0
- package/dist/tools/profile/certifications.js.map +1 -1
- package/dist/tools/profile/education.d.ts.map +1 -1
- package/dist/tools/profile/education.js +26 -4
- package/dist/tools/profile/education.js.map +1 -1
- package/dist/tools/profile/employment.d.ts.map +1 -1
- package/dist/tools/profile/employment.js +26 -4
- package/dist/tools/profile/employment.js.map +1 -1
- package/dist/tools/profile/industries.d.ts +9 -1
- package/dist/tools/profile/industries.d.ts.map +1 -1
- package/dist/tools/profile/industries.js +28 -3
- package/dist/tools/profile/industries.js.map +1 -1
- package/dist/tools/profile/resume.d.ts.map +1 -1
- package/dist/tools/profile/resume.js +0 -2
- package/dist/tools/profile/resume.js.map +1 -1
- package/dist/tools/profile/shared.d.ts +12 -11
- package/dist/tools/profile/shared.d.ts.map +1 -1
- package/dist/tools/profile/shared.js +9 -8
- package/dist/tools/profile/shared.js.map +1 -1
- package/dist/tools/profile_basic_photo_upload.d.ts.map +1 -1
- package/dist/tools/profile_basic_photo_upload.js +0 -2
- package/dist/tools/profile_basic_photo_upload.js.map +1 -1
- package/dist/tools/profile_basic_show.d.ts +53 -8
- package/dist/tools/profile_basic_show.d.ts.map +1 -1
- package/dist/tools/profile_basic_show.js +57 -13
- package/dist/tools/profile_basic_show.js.map +1 -1
- package/dist/tools/profile_basic_update.d.ts.map +1 -1
- package/dist/tools/profile_basic_update.js +0 -2
- package/dist/tools/profile_basic_update.js.map +1 -1
- package/dist/tools/profile_external_show.d.ts +15 -0
- package/dist/tools/profile_external_show.d.ts.map +1 -0
- package/dist/tools/profile_external_show.js +59 -0
- package/dist/tools/profile_external_show.js.map +1 -0
- package/dist/tools/timesheet.d.ts +15 -5
- package/dist/tools/timesheet.d.ts.map +1 -1
- package/dist/tools/timesheet.js +89 -6
- package/dist/tools/timesheet.js.map +1 -1
- package/package.json +2 -2
- package/dist/tools/output-schemas.d.ts +0 -115
- package/dist/tools/output-schemas.d.ts.map +0 -1
- package/dist/tools/output-schemas.js +0 -130
- package/dist/tools/output-schemas.js.map +0 -1
|
@@ -1,19 +1,64 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { profile } from "@ttctl/core";
|
|
3
|
+
import type { ProfileShowQuery } from "@ttctl/core";
|
|
2
4
|
import { type ToolRegistrationContext } from "./_shared.js";
|
|
5
|
+
/**
|
|
6
|
+
* Merged payload returned by `ttctl_profile_basic_show`. Mirrors the
|
|
7
|
+
* CLI's `BasicShowPayload` shape (`packages/cli/src/commands/profile/
|
|
8
|
+
* basic/show.ts`) so the read surface speaks the same vocabulary across
|
|
9
|
+
* MCP and CLI clients.
|
|
10
|
+
*
|
|
11
|
+
* `profile` carries the mobile-gateway `ProfileShowQuery` (identity, role,
|
|
12
|
+
* vertical, skills, hours, rate); `basicInfo` carries the talent-profile
|
|
13
|
+
* `BasicInfo` projection (`bio`, `headline`, `languages`). The two come
|
|
14
|
+
* from different GraphQL surfaces — the mobile-gateway `Profile` type does
|
|
15
|
+
* NOT publish `about` / `quote`, hence the dedicated `getBasicInfo()`
|
|
16
|
+
* companion shipped in #127.
|
|
17
|
+
*
|
|
18
|
+
* `basicInfo` is `null` when the secondary `getBasicInfo()` call failed in
|
|
19
|
+
* a non-session-level way (network blip, talent-profile `GRAPHQL_ERROR`).
|
|
20
|
+
* Session-level failures (`AuthRevokedError`, `Cf403Error`) propagate as
|
|
21
|
+
* tool errors — they indicate the bearer is no longer accepted, and the
|
|
22
|
+
* primary `show()` call would have hit them too.
|
|
23
|
+
*/
|
|
24
|
+
export interface BasicShowPayload {
|
|
25
|
+
profile: ProfileShowQuery;
|
|
26
|
+
basicInfo: profile.basic.BasicInfo | null;
|
|
27
|
+
}
|
|
3
28
|
/**
|
|
4
29
|
* Register the `ttctl_profile_basic_show` MCP tool. Mirrors the
|
|
5
30
|
* `ttctl profile basic show` CLI leaf — fetches the signed-in user's
|
|
6
|
-
* profile from the mobile-gateway and
|
|
31
|
+
* profile from both the mobile-gateway and the talent-profile surfaces
|
|
32
|
+
* and returns the merged payload.
|
|
33
|
+
*
|
|
34
|
+
* Two-call read surface (parity with CLI's post-#129 path, closed in
|
|
35
|
+
* this PR for MCP per #340):
|
|
36
|
+
*
|
|
37
|
+
* 1. `profile.basic.show()` → `mobile-gateway` for identity, role,
|
|
38
|
+
* vertical, skills, hours, rate.
|
|
39
|
+
* 2. `profile.basic.getBasicInfo()` → `talent_profile/graphql` for
|
|
40
|
+
* `bio` (`Profile.about`), `headline` (`Profile.quote`), and
|
|
41
|
+
* `languages`.
|
|
42
|
+
*
|
|
43
|
+
* Errors from the secondary `getBasicInfo()` call are non-fatal: the
|
|
44
|
+
* tool swallows non-session failures and renders `basicInfo: null`, so a
|
|
45
|
+
* glitch on the secondary surface doesn't blank the whole show. Session-
|
|
46
|
+
* level errors (`AuthRevokedError`, `Cf403Error`) still propagate — they
|
|
47
|
+
* indicate the bearer is no longer valid; the primary `show()` would
|
|
48
|
+
* have hit them too.
|
|
7
49
|
*
|
|
8
|
-
* Auth token identifies the user
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
50
|
+
* Auth token identifies the user. MCP is the LLM-facing surface, so the
|
|
51
|
+
* description includes example user-intent phrases the model can match
|
|
52
|
+
* against, and reflects the bio/headline/languages coverage added in
|
|
53
|
+
* this PR.
|
|
12
54
|
*
|
|
13
55
|
* Dry-run path (issue #165): when `dryRun: true`, the tool returns a
|
|
14
|
-
* structured preview of the `ProfileShow` query
|
|
15
|
-
*
|
|
16
|
-
*
|
|
56
|
+
* structured preview of the primary `ProfileShow` query — no transport
|
|
57
|
+
* call. The preview shows only the mobile-gateway operation; the
|
|
58
|
+
* secondary `GET_BASIC_INFO` call on the talent-profile surface is also
|
|
59
|
+
* dispatched on the apply path but is not part of the preview envelope
|
|
60
|
+
* (single-op envelope is the cross-cutting dry-run contract; the
|
|
61
|
+
* secondary read is an implementation detail of the merged response).
|
|
17
62
|
*/
|
|
18
63
|
export declare function registerProfileBasicShowTool(server: McpServer, ctx: ToolRegistrationContext): void;
|
|
19
64
|
//# sourceMappingURL=profile_basic_show.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile_basic_show.d.ts","sourceRoot":"","sources":["../../src/tools/profile_basic_show.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"profile_basic_show.d.ts","sourceRoot":"","sources":["../../src/tools/profile_basic_show.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,OAAO,EAOL,KAAK,uBAAuB,EAC7B,MAAM,cAAc,CAAC;AAItB;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,uBAAuB,GAAG,IAAI,CAqElG"}
|
|
@@ -8,36 +8,60 @@ const TOOL_NAME = "ttctl_profile_basic_show";
|
|
|
8
8
|
/**
|
|
9
9
|
* Register the `ttctl_profile_basic_show` MCP tool. Mirrors the
|
|
10
10
|
* `ttctl profile basic show` CLI leaf — fetches the signed-in user's
|
|
11
|
-
* profile from the mobile-gateway and
|
|
11
|
+
* profile from both the mobile-gateway and the talent-profile surfaces
|
|
12
|
+
* and returns the merged payload.
|
|
12
13
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* Two-call read surface (parity with CLI's post-#129 path, closed in
|
|
15
|
+
* this PR for MCP per #340):
|
|
16
|
+
*
|
|
17
|
+
* 1. `profile.basic.show()` → `mobile-gateway` for identity, role,
|
|
18
|
+
* vertical, skills, hours, rate.
|
|
19
|
+
* 2. `profile.basic.getBasicInfo()` → `talent_profile/graphql` for
|
|
20
|
+
* `bio` (`Profile.about`), `headline` (`Profile.quote`), and
|
|
21
|
+
* `languages`.
|
|
22
|
+
*
|
|
23
|
+
* Errors from the secondary `getBasicInfo()` call are non-fatal: the
|
|
24
|
+
* tool swallows non-session failures and renders `basicInfo: null`, so a
|
|
25
|
+
* glitch on the secondary surface doesn't blank the whole show. Session-
|
|
26
|
+
* level errors (`AuthRevokedError`, `Cf403Error`) still propagate — they
|
|
27
|
+
* indicate the bearer is no longer valid; the primary `show()` would
|
|
28
|
+
* have hit them too.
|
|
29
|
+
*
|
|
30
|
+
* Auth token identifies the user. MCP is the LLM-facing surface, so the
|
|
31
|
+
* description includes example user-intent phrases the model can match
|
|
32
|
+
* against, and reflects the bio/headline/languages coverage added in
|
|
33
|
+
* this PR.
|
|
17
34
|
*
|
|
18
35
|
* Dry-run path (issue #165): when `dryRun: true`, the tool returns a
|
|
19
|
-
* structured preview of the `ProfileShow` query
|
|
20
|
-
*
|
|
21
|
-
*
|
|
36
|
+
* structured preview of the primary `ProfileShow` query — no transport
|
|
37
|
+
* call. The preview shows only the mobile-gateway operation; the
|
|
38
|
+
* secondary `GET_BASIC_INFO` call on the talent-profile surface is also
|
|
39
|
+
* dispatched on the apply path but is not part of the preview envelope
|
|
40
|
+
* (single-op envelope is the cross-cutting dry-run contract; the
|
|
41
|
+
* secondary read is an implementation detail of the merged response).
|
|
22
42
|
*/
|
|
23
43
|
export function registerProfileBasicShowTool(server, ctx) {
|
|
24
44
|
server.registerTool(TOOL_NAME, {
|
|
25
45
|
title: "Show profile basic info",
|
|
26
46
|
description: [
|
|
27
|
-
"Fetch the signed-in user's Toptal Talent profile (identity, role, vertical, skills, hours, rate).",
|
|
47
|
+
"Fetch the signed-in user's Toptal Talent profile (identity, role, vertical, skills, hours, rate, bio, headline, languages).",
|
|
28
48
|
"",
|
|
29
|
-
"
|
|
49
|
+
"Returns the merged read payload from both the mobile-gateway (`profile`) and the talent-profile (`basicInfo`) surfaces. `basicInfo.bio` mirrors `Profile.about`; `basicInfo.headline` mirrors `Profile.quote`. `basicInfo` is `null` when the secondary read call fails non-fatally.",
|
|
50
|
+
"",
|
|
51
|
+
"Pass `dryRun: true` to preview the primary request without firing the query.",
|
|
30
52
|
"",
|
|
31
53
|
"Example user prompts that should map to this tool:",
|
|
32
54
|
' - "What\'s on my Toptal profile?"',
|
|
33
55
|
' - "Show me my Toptal Talent details."',
|
|
34
56
|
' - "What\'s my hourly rate and vertical?"',
|
|
57
|
+
' - "Show my bio and headline."',
|
|
58
|
+
' - "What languages do I have set?"',
|
|
35
59
|
].join("\n"),
|
|
36
60
|
inputSchema: {
|
|
37
61
|
dryRun: z
|
|
38
62
|
.boolean()
|
|
39
63
|
.optional()
|
|
40
|
-
.describe("Preview the request without executing. Returns `{ ok: true, dryRun: true, preview: DryRunPreview }` with operationName + variables + redacted bearer header. Default: false."),
|
|
64
|
+
.describe("Preview the request without executing. Returns `{ ok: true, dryRun: true, preview: DryRunPreview }` with operationName + variables + redacted bearer header for the primary ProfileShow query. Default: false."),
|
|
41
65
|
},
|
|
42
66
|
}, async (input) => {
|
|
43
67
|
const auth = await ctx.loadTokenForTool(TOOL_NAME);
|
|
@@ -46,9 +70,9 @@ export function registerProfileBasicShowTool(server, ctx) {
|
|
|
46
70
|
if (input.dryRun === true) {
|
|
47
71
|
return dryRunResponse(buildMcpDryRunPreview("ProfileShow", "mobile-gateway", {}, auth.token));
|
|
48
72
|
}
|
|
73
|
+
let profilePayload;
|
|
49
74
|
try {
|
|
50
|
-
|
|
51
|
-
return jsonResponse(payload);
|
|
75
|
+
profilePayload = await profile.basic.show(auth.token);
|
|
52
76
|
}
|
|
53
77
|
catch (err) {
|
|
54
78
|
const typed = ttctlErrorToToolResponseOrNull(err);
|
|
@@ -59,6 +83,26 @@ export function registerProfileBasicShowTool(server, ctx) {
|
|
|
59
83
|
}
|
|
60
84
|
return genericErrorResponse(TOOL_NAME, err);
|
|
61
85
|
}
|
|
86
|
+
let basicInfo;
|
|
87
|
+
try {
|
|
88
|
+
basicInfo = await profile.basic.getBasicInfo(auth.token);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
// Session-level errors (AuthRevokedError, Cf403Error) propagate —
|
|
92
|
+
// the user's bearer is no longer valid and they need to act on it.
|
|
93
|
+
// The primary `show()` call would have hit the same issue, so the
|
|
94
|
+
// user must be told. Anything else (NETWORK_ERROR, GRAPHQL_ERROR
|
|
95
|
+
// on the talent-profile surface) is non-fatal: the primary payload
|
|
96
|
+
// landed, so the tool returns the partial result with
|
|
97
|
+
// `basicInfo: null`. Mirrors the CLI's post-#129 read-handler
|
|
98
|
+
// policy in `packages/cli/src/commands/profile/basic/show.ts`.
|
|
99
|
+
const typed = ttctlErrorToToolResponseOrNull(err);
|
|
100
|
+
if (typed !== null)
|
|
101
|
+
return typed;
|
|
102
|
+
basicInfo = null;
|
|
103
|
+
}
|
|
104
|
+
const payload = { profile: profilePayload, basicInfo };
|
|
105
|
+
return jsonResponse(payload);
|
|
62
106
|
});
|
|
63
107
|
}
|
|
64
108
|
//# sourceMappingURL=profile_basic_show.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile_basic_show.js","sourceRoot":"","sources":["../../src/tools/profile_basic_show.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAGpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"profile_basic_show.js","sourceRoot":"","sources":["../../src/tools/profile_basic_show.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAGpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,GAEb,MAAM,cAAc,CAAC;AAEtB,MAAM,SAAS,GAAG,0BAA0B,CAAC;AA0B7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAiB,EAAE,GAA4B;IAC1F,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE;YACX,6HAA6H;YAC7H,EAAE;YACF,sRAAsR;YACtR,EAAE;YACF,8EAA8E;YAC9E,EAAE;YACF,oDAAoD;YACpD,qCAAqC;YACrC,yCAAyC;YACzC,4CAA4C;YAC5C,iCAAiC;YACjC,qCAAqC;SACtC,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,gNAAgN,CACjN;SACJ;KACF,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,mBAAmB,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,cAAc,CAAC,qBAAqB,CAAC,aAAa,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAChG,CAAC;QAED,IAAI,cAAgC,CAAC;QACrC,IAAI,CAAC;YACH,cAAc,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;YAClD,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YACjC,IAAI,GAAG,YAAY,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC9C,OAAO,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,oBAAoB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,SAAyC,CAAC;QAC9C,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kEAAkE;YAClE,mEAAmE;YACnE,kEAAkE;YAClE,iEAAiE;YACjE,mEAAmE;YACnE,sDAAsD;YACtD,8DAA8D;YAC9D,+DAA+D;YAC/D,MAAM,KAAK,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;YAClD,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YACjC,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,OAAO,GAAqB,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;QACzE,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile_basic_update.d.ts","sourceRoot":"","sources":["../../src/tools/profile_basic_update.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,EAML,KAAK,uBAAuB,EAC7B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"profile_basic_update.d.ts","sourceRoot":"","sources":["../../src/tools/profile_basic_update.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,EAML,KAAK,uBAAuB,EAC7B,MAAM,cAAc,CAAC;AAItB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,uBAAuB,GAAG,IAAI,CA4DpG"}
|
|
@@ -4,7 +4,6 @@ import { profile } from "@ttctl/core";
|
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import { ttctlErrorToToolResponseOrNull } from "../errors.js";
|
|
6
6
|
import { domainErrorResponse, dryRunResponse, genericErrorResponse, isToolErrorResponse, jsonResponse, } from "./_shared.js";
|
|
7
|
-
import { profileBasicUpdateOutputSchema } from "./output-schemas.js";
|
|
8
7
|
const TOOL_NAME = "ttctl_profile_basic_update";
|
|
9
8
|
/**
|
|
10
9
|
* Register the `ttctl_profile_basic_update` MCP tool. Mirrors the
|
|
@@ -66,7 +65,6 @@ export function registerProfileBasicUpdateTool(server, ctx) {
|
|
|
66
65
|
.optional()
|
|
67
66
|
.describe("Preview the request without executing. Returns `{ ok: true, dryRun: true, preview: DryRunPreview }` carrying the `UPDATE_BASIC_INFO` operation + redacted bearer header. No transport (read or write) is invoked. Default: false."),
|
|
68
67
|
},
|
|
69
|
-
outputSchema: profileBasicUpdateOutputSchema.shape,
|
|
70
68
|
}, async (input) => {
|
|
71
69
|
const auth = await ctx.loadTokenForTool(TOOL_NAME);
|
|
72
70
|
if (isToolErrorResponse(auth))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile_basic_update.js","sourceRoot":"","sources":["../../src/tools/profile_basic_update.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAGpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,GAEb,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"profile_basic_update.js","sourceRoot":"","sources":["../../src/tools/profile_basic_update.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAGpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,GAEb,MAAM,cAAc,CAAC;AAEtB,MAAM,SAAS,GAAG,4BAA4B,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,8BAA8B,CAAC,MAAiB,EAAE,GAA4B;IAC5F,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EAAE;YACX,yFAAyF;YACzF,yEAAyE;YACzE,EAAE;YACF,oDAAoD;YACpD,oFAAoF;YACpF,uDAAuD;YACvD,wCAAwC;YACxC,4DAA4D;SAC7D,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,WAAW,EAAE;YACX,GAAG,EAAE,CAAC;iBACH,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,4LAA4L,CAC7L;YACH,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,sGAAsG,CACvG;YACH,MAAM,EAAE,CAAC;iBACN,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,mOAAmO,CACpO;SACJ;KACF,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,mBAAmB,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,MAAM,OAAO,GAAgC,EAAE,CAAC;QAChD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACrD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEpE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;YAChG,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;YAClD,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YACjC,IAAI,GAAG,YAAY,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC9C,OAAO,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,oBAAoB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type ToolRegistrationContext } from "./_shared.js";
|
|
3
|
+
/**
|
|
4
|
+
* Register the `ttctl_profile_external_show` MCP tool. Mirrors the
|
|
5
|
+
* `ttctl profile external show` CLI leaf — the primary read for the
|
|
6
|
+
* stored external profile URLs (linkedin / github / website / twitter /
|
|
7
|
+
* behance / dribbble) plus `id` and the last talent-side edit timestamp.
|
|
8
|
+
*
|
|
9
|
+
* This is the read counterpart of `ttctl_profile_external_update`. Agents
|
|
10
|
+
* should use this instead of a no-op update to inspect current URL state
|
|
11
|
+
* (a no-op update is a write-disguised-as-read and risks an unintended
|
|
12
|
+
* write). Closes the read-side asymmetry documented in issue #343.
|
|
13
|
+
*/
|
|
14
|
+
export declare function registerProfileExternalShowTool(server: McpServer, ctx: ToolRegistrationContext): void;
|
|
15
|
+
//# sourceMappingURL=profile_external_show.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile_external_show.d.ts","sourceRoot":"","sources":["../../src/tools/profile_external_show.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,EAOL,KAAK,uBAAuB,EAC7B,MAAM,cAAc,CAAC;AAWtB;;;;;;;;;;GAUG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,uBAAuB,GAAG,IAAI,CA6CrG"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 Oleksii PELYKH
|
|
3
|
+
import { profile } from "@ttctl/core";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { ttctlErrorToToolResponseOrNull } from "../errors.js";
|
|
6
|
+
import { buildMcpDryRunPreview, domainErrorResponse, dryRunResponse, genericErrorResponse, isToolErrorResponse, jsonResponse, } from "./_shared.js";
|
|
7
|
+
const TOOL_NAME = "ttctl_profile_external_show";
|
|
8
|
+
const DRY_RUN_FIELD = z
|
|
9
|
+
.boolean()
|
|
10
|
+
.optional()
|
|
11
|
+
.describe("Preview the request without executing. Returns `{ ok: true, dryRun: true, preview }` with operationName + variables + redacted bearer header. Default: false.");
|
|
12
|
+
/**
|
|
13
|
+
* Register the `ttctl_profile_external_show` MCP tool. Mirrors the
|
|
14
|
+
* `ttctl profile external show` CLI leaf — the primary read for the
|
|
15
|
+
* stored external profile URLs (linkedin / github / website / twitter /
|
|
16
|
+
* behance / dribbble) plus `id` and the last talent-side edit timestamp.
|
|
17
|
+
*
|
|
18
|
+
* This is the read counterpart of `ttctl_profile_external_update`. Agents
|
|
19
|
+
* should use this instead of a no-op update to inspect current URL state
|
|
20
|
+
* (a no-op update is a write-disguised-as-read and risks an unintended
|
|
21
|
+
* write). Closes the read-side asymmetry documented in issue #343.
|
|
22
|
+
*/
|
|
23
|
+
export function registerProfileExternalShowTool(server, ctx) {
|
|
24
|
+
server.registerTool(TOOL_NAME, {
|
|
25
|
+
title: "Show stored external profile URLs",
|
|
26
|
+
description: [
|
|
27
|
+
"Read the talent's stored external profile URLs (linkedin, github, website, twitter, behance, dribbble) plus the last talent-side edit timestamp.",
|
|
28
|
+
"",
|
|
29
|
+
"This is the READ counterpart of ttctl_profile_external_update — use it to inspect current URL state instead of a no-op update (a no-op update is a write-disguised-as-read).",
|
|
30
|
+
"",
|
|
31
|
+
"Example user prompts that should map to this tool:",
|
|
32
|
+
' - "What are my current external profile links?"',
|
|
33
|
+
' - "Show me my stored LinkedIn / GitHub / website URLs."',
|
|
34
|
+
' - "What Twitter handle is on my Toptal profile?"',
|
|
35
|
+
].join("\n"),
|
|
36
|
+
inputSchema: { dryRun: DRY_RUN_FIELD },
|
|
37
|
+
}, async (input) => {
|
|
38
|
+
const auth = await ctx.loadTokenForTool(TOOL_NAME);
|
|
39
|
+
if (isToolErrorResponse(auth))
|
|
40
|
+
return auth;
|
|
41
|
+
if (input.dryRun === true) {
|
|
42
|
+
return dryRunResponse(buildMcpDryRunPreview("getExternalProfiles", "talent-profile", { profileId: profile.basic.DRY_RUN_PROFILE_ID_PLACEHOLDER }, auth.token));
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const result = await profile.external.show(auth.token);
|
|
46
|
+
return jsonResponse(result);
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
const typed = ttctlErrorToToolResponseOrNull(err);
|
|
50
|
+
if (typed !== null)
|
|
51
|
+
return typed;
|
|
52
|
+
if (err instanceof profile.external.ProfileError) {
|
|
53
|
+
return domainErrorResponse(TOOL_NAME, err);
|
|
54
|
+
}
|
|
55
|
+
return genericErrorResponse(TOOL_NAME, err);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=profile_external_show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile_external_show.js","sourceRoot":"","sources":["../../src/tools/profile_external_show.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAGpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,GAEb,MAAM,cAAc,CAAC;AAEtB,MAAM,SAAS,GAAG,6BAA6B,CAAC;AAEhD,MAAM,aAAa,GAAG,CAAC;KACpB,OAAO,EAAE;KACT,QAAQ,EAAE;KACV,QAAQ,CACP,+JAA+J,CAChK,CAAC;AAEJ;;;;;;;;;;GAUG;AACH,MAAM,UAAU,+BAA+B,CAAC,MAAiB,EAAE,GAA4B;IAC7F,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;QACE,KAAK,EAAE,mCAAmC;QAC1C,WAAW,EAAE;YACX,kJAAkJ;YAClJ,EAAE;YACF,8KAA8K;YAC9K,EAAE;YACF,oDAAoD;YACpD,mDAAmD;YACnD,2DAA2D;YAC3D,oDAAoD;SACrD,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,WAAW,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;KACvC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,mBAAmB,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO,cAAc,CACnB,qBAAqB,CACnB,qBAAqB,EACrB,gBAAgB,EAChB,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAC3D,IAAI,CAAC,KAAK,CACX,CACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;YAClD,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YACjC,IAAI,GAAG,YAAY,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;gBACjD,OAAO,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,oBAAoB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { type ToolRegistrationContext } from "./_shared.js";
|
|
3
3
|
/**
|
|
4
|
-
* Register the `ttctl_timesheet_*` MCP tools per the #13 spec
|
|
5
|
-
*
|
|
6
|
-
* with `_`:
|
|
4
|
+
* Register the `ttctl_timesheet_*` MCP tools per the #13 spec, plus
|
|
5
|
+
* the #374 pending-list pagination sibling. Tool names use the
|
|
6
|
+
* `ttctl_` prefix and the canonical CLI path joined with `_`:
|
|
7
7
|
*
|
|
8
8
|
* - `ttctl_timesheet_list`
|
|
9
|
+
* - `ttctl_timesheet_pending_list` (#374)
|
|
9
10
|
* - `ttctl_timesheet_show`
|
|
10
11
|
* - `ttctl_timesheet_submit`
|
|
11
12
|
*
|
|
@@ -13,12 +14,21 @@ import { type ToolRegistrationContext } from "./_shared.js";
|
|
|
13
14
|
* fields. Identity model:
|
|
14
15
|
*
|
|
15
16
|
* - `BillingCycle.id` — the "timesheet id" returned by
|
|
16
|
-
* `timesheet_list`
|
|
17
|
-
* `timesheet_show` /
|
|
17
|
+
* `timesheet_list` / `timesheet_pending_list`
|
|
18
|
+
* and consumed by `timesheet_show` /
|
|
19
|
+
* `timesheet_submit`.
|
|
18
20
|
* - `JobActivityItem.id` — the "engagement id" exposed by
|
|
19
21
|
* `engagements_list`. Passed via
|
|
20
22
|
* `engagement` to scope.
|
|
21
23
|
*
|
|
24
|
+
* **`timesheet_pending_list` pagination divergence** (#374, per
|
|
25
|
+
* ADR-007 row 3): the viewer-wide `PendingTimesheets` wire op
|
|
26
|
+
* accepts ONLY a `pagination: { limit: Int }` input — no `offset`,
|
|
27
|
+
* no cursor — so this tool exposes `limit` rather than the
|
|
28
|
+
* offset-style `page` / `perPage` used by jobs / applications /
|
|
29
|
+
* engagements / payouts. Surface-honest: MCP keys mirror wire arg
|
|
30
|
+
* keys.
|
|
31
|
+
*
|
|
22
32
|
* Submit is destructive — its tool description explicitly warns
|
|
23
33
|
* humans, and per #13 the CLI gates on `--confirm` / TTY interactive
|
|
24
34
|
* confirm. The MCP side has no analogous gate (LLM clients are
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timesheet.d.ts","sourceRoot":"","sources":["../../src/tools/timesheet.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,OAAO,EAAyC,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAmBnG
|
|
1
|
+
{"version":3,"file":"timesheet.d.ts","sourceRoot":"","sources":["../../src/tools/timesheet.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,OAAO,EAAyC,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAmBnG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,uBAAuB,GAAG,IAAI,CA8Q5F"}
|
package/dist/tools/timesheet.js
CHANGED
|
@@ -18,11 +18,12 @@ const DRY_RUN_FIELD = z
|
|
|
18
18
|
*/
|
|
19
19
|
const SUBMIT_AUTO_RESOLVE_PLACEHOLDER = "<auto-resolved-at-apply-time>";
|
|
20
20
|
/**
|
|
21
|
-
* Register the `ttctl_timesheet_*` MCP tools per the #13 spec
|
|
22
|
-
*
|
|
23
|
-
* with `_`:
|
|
21
|
+
* Register the `ttctl_timesheet_*` MCP tools per the #13 spec, plus
|
|
22
|
+
* the #374 pending-list pagination sibling. Tool names use the
|
|
23
|
+
* `ttctl_` prefix and the canonical CLI path joined with `_`:
|
|
24
24
|
*
|
|
25
25
|
* - `ttctl_timesheet_list`
|
|
26
|
+
* - `ttctl_timesheet_pending_list` (#374)
|
|
26
27
|
* - `ttctl_timesheet_show`
|
|
27
28
|
* - `ttctl_timesheet_submit`
|
|
28
29
|
*
|
|
@@ -30,12 +31,21 @@ const SUBMIT_AUTO_RESOLVE_PLACEHOLDER = "<auto-resolved-at-apply-time>";
|
|
|
30
31
|
* fields. Identity model:
|
|
31
32
|
*
|
|
32
33
|
* - `BillingCycle.id` — the "timesheet id" returned by
|
|
33
|
-
* `timesheet_list`
|
|
34
|
-
* `timesheet_show` /
|
|
34
|
+
* `timesheet_list` / `timesheet_pending_list`
|
|
35
|
+
* and consumed by `timesheet_show` /
|
|
36
|
+
* `timesheet_submit`.
|
|
35
37
|
* - `JobActivityItem.id` — the "engagement id" exposed by
|
|
36
38
|
* `engagements_list`. Passed via
|
|
37
39
|
* `engagement` to scope.
|
|
38
40
|
*
|
|
41
|
+
* **`timesheet_pending_list` pagination divergence** (#374, per
|
|
42
|
+
* ADR-007 row 3): the viewer-wide `PendingTimesheets` wire op
|
|
43
|
+
* accepts ONLY a `pagination: { limit: Int }` input — no `offset`,
|
|
44
|
+
* no cursor — so this tool exposes `limit` rather than the
|
|
45
|
+
* offset-style `page` / `perPage` used by jobs / applications /
|
|
46
|
+
* engagements / payouts. Surface-honest: MCP keys mirror wire arg
|
|
47
|
+
* keys.
|
|
48
|
+
*
|
|
39
49
|
* Submit is destructive — its tool description explicitly warns
|
|
40
50
|
* humans, and per #13 the CLI gates on `--confirm` / TTY interactive
|
|
41
51
|
* confirm. The MCP side has no analogous gate (LLM clients are
|
|
@@ -55,6 +65,11 @@ export function registerTimesheetTools(server, ctx) {
|
|
|
55
65
|
"`engagements_list`) to scope to one engagement (returns ALL cycles for",
|
|
56
66
|
"that engagement, regardless of submission state).",
|
|
57
67
|
"",
|
|
68
|
+
"For viewer-wide pagination, prefer `ttctl_timesheet_pending_list`",
|
|
69
|
+
"(#374) — it exposes the wire's `limit` input surface-honestly. This",
|
|
70
|
+
"tool keeps its pre-#374 shape (no pagination args) for backward",
|
|
71
|
+
"compatibility.",
|
|
72
|
+
"",
|
|
58
73
|
"Example user prompts:",
|
|
59
74
|
' - "Show my pending Toptal timesheets."',
|
|
60
75
|
' - "What timesheets do I need to submit?"',
|
|
@@ -80,7 +95,12 @@ export function registerTimesheetTools(server, ctx) {
|
|
|
80
95
|
// that branch in the preview so callers see the exact wire
|
|
81
96
|
// operation that would fire.
|
|
82
97
|
if (opts.engagement === undefined) {
|
|
83
|
-
|
|
98
|
+
// #374: PendingTimesheets is now parameterised with $limit;
|
|
99
|
+
// the dry-run preview surfaces the DEFAULT value the apply
|
|
100
|
+
// path will pass when the caller omits `limit` (which this
|
|
101
|
+
// pre-#374 tool always does — only the new
|
|
102
|
+
// `ttctl_timesheet_pending_list` exposes `limit`).
|
|
103
|
+
return dryRunResponse(buildMcpDryRunPreview("PendingTimesheets", "mobile-gateway", { limit: timesheet.DEFAULT_PENDING_LIMIT }, auth.token));
|
|
84
104
|
}
|
|
85
105
|
return dryRunResponse(buildMcpDryRunPreview("Timesheets", "mobile-gateway", { jobActivityItemId: opts.engagement }, auth.token));
|
|
86
106
|
}
|
|
@@ -92,6 +112,69 @@ export function registerTimesheetTools(server, ctx) {
|
|
|
92
112
|
return mapTimesheetError(err);
|
|
93
113
|
}
|
|
94
114
|
});
|
|
115
|
+
// `ttctl_timesheet_pending_list` (#374) — surface-honest viewer-wide
|
|
116
|
+
// pending pagination. Schema mirrors the wire arg name exactly:
|
|
117
|
+
// `{ limit? }` maps directly to `pagination: { limit: $limit }` on
|
|
118
|
+
// `Viewer.billingCycles`. See ADR-007 row 3 ("limit-only wrapper").
|
|
119
|
+
server.registerTool("ttctl_timesheet_pending_list", {
|
|
120
|
+
title: "List viewer-wide pending timesheets (limit-only pagination)",
|
|
121
|
+
description: [
|
|
122
|
+
"List the signed-in user's Toptal Talent viewer-wide pending billing",
|
|
123
|
+
"cycles — the timesheets that currently need submission. Use this",
|
|
124
|
+
"tool when the user wants to enumerate or paginate over their pending",
|
|
125
|
+
"timesheets and `ttctl_timesheet_list` (no pagination args) returns",
|
|
126
|
+
"a too-narrow window.",
|
|
127
|
+
"",
|
|
128
|
+
"**Pagination divergence** (#374, per ADR-007): unlike",
|
|
129
|
+
"`ttctl_jobs_list` / `ttctl_applications_list` / `ttctl_engagements_list`",
|
|
130
|
+
"/ `ttctl_payments_payouts_list` (offset-style with `page` /",
|
|
131
|
+
"`perPage`), this tool exposes ONLY `limit` because the underlying",
|
|
132
|
+
"wire field is `LimitPagination` (no `offset`, no cursor). MCP keys",
|
|
133
|
+
"mirror wire arg names verbatim. Default `limit` when omitted is 50",
|
|
134
|
+
"(the historical wire default).",
|
|
135
|
+
"",
|
|
136
|
+
"For the per-engagement variant (all cycles for one engagement,",
|
|
137
|
+
"regardless of submission state) use `ttctl_timesheet_list` with",
|
|
138
|
+
"the `engagement` arg — that wire op carries no pagination input.",
|
|
139
|
+
"",
|
|
140
|
+
"Example user prompts:",
|
|
141
|
+
' - "Show me 5 of my pending Toptal timesheets."',
|
|
142
|
+
' - "List my pending timesheets, limit 10."',
|
|
143
|
+
' - "What are the next few timesheets I need to submit?"',
|
|
144
|
+
].join("\n"),
|
|
145
|
+
inputSchema: {
|
|
146
|
+
limit: z
|
|
147
|
+
.number()
|
|
148
|
+
.int()
|
|
149
|
+
.positive()
|
|
150
|
+
.optional()
|
|
151
|
+
.describe("Maximum number of pending cycles to return. Maps to `pagination: { limit: $limit }` on the wire. Default 50 when omitted."),
|
|
152
|
+
dryRun: DRY_RUN_FIELD,
|
|
153
|
+
},
|
|
154
|
+
}, async (args) => {
|
|
155
|
+
const auth = await ctx.resolveToolAuth();
|
|
156
|
+
if (!auth.ok)
|
|
157
|
+
return auth.response;
|
|
158
|
+
const opts = {};
|
|
159
|
+
if (args.limit !== undefined)
|
|
160
|
+
opts.limit = args.limit;
|
|
161
|
+
if (args.dryRun === true) {
|
|
162
|
+
// Surface the actual wire variable (`limit`) the apply path
|
|
163
|
+
// will send. When the caller omits `limit`, the apply path
|
|
164
|
+
// defaults to {@link timesheet.DEFAULT_PENDING_LIMIT}; the
|
|
165
|
+
// preview surfaces the same default so the dry-run reflects
|
|
166
|
+
// the exact request shape.
|
|
167
|
+
const limit = args.limit ?? timesheet.DEFAULT_PENDING_LIMIT;
|
|
168
|
+
return dryRunResponse(buildMcpDryRunPreview("PendingTimesheets", "mobile-gateway", { limit }, auth.token));
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const items = await timesheet.list(auth.token, opts);
|
|
172
|
+
return successResponse(items);
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
return mapTimesheetError(err);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
95
178
|
server.registerTool("ttctl_timesheet_show", {
|
|
96
179
|
title: "Show one timesheet by id",
|
|
97
180
|
description: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timesheet.js","sourceRoot":"","sources":["../../src/tools/timesheet.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAGpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAgC,MAAM,cAAc,CAAC;AAEnG,MAAM,aAAa,GAAG,CAAC;KACpB,OAAO,EAAE;KACT,QAAQ,EAAE;KACV,QAAQ,CACP,+JAA+J,CAChK,CAAC;AAEJ;;;;;;;GAOG;AACH,MAAM,+BAA+B,GAAG,+BAA+B,CAAC;AAExE
|
|
1
|
+
{"version":3,"file":"timesheet.js","sourceRoot":"","sources":["../../src/tools/timesheet.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ttctl/mcp",
|
|
3
|
-
"version": "0.1.0-rc.
|
|
3
|
+
"version": "0.1.0-rc.3",
|
|
4
4
|
"description": "TTCtl MCP server exposing Toptal Talent operations to AI assistants",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
39
39
|
"zod": "^4.4.3",
|
|
40
|
-
"@ttctl/core": "^0.1.0-rc.
|
|
40
|
+
"@ttctl/core": "^0.1.0-rc.3"
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
43
|
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|