@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.
Files changed (70) hide show
  1. package/README.md +28 -0
  2. package/dist/tools/_shared.d.ts +16 -14
  3. package/dist/tools/_shared.d.ts.map +1 -1
  4. package/dist/tools/_shared.js +31 -20
  5. package/dist/tools/_shared.js.map +1 -1
  6. package/dist/tools/applications.d.ts +10 -0
  7. package/dist/tools/applications.d.ts.map +1 -1
  8. package/dist/tools/applications.js +87 -9
  9. package/dist/tools/applications.js.map +1 -1
  10. package/dist/tools/engagements.d.ts.map +1 -1
  11. package/dist/tools/engagements.js +44 -2
  12. package/dist/tools/engagements.js.map +1 -1
  13. package/dist/tools/index.d.ts +3 -2
  14. package/dist/tools/index.d.ts.map +1 -1
  15. package/dist/tools/index.js +12 -3
  16. package/dist/tools/index.js.map +1 -1
  17. package/dist/tools/interest_requests.d.ts +77 -0
  18. package/dist/tools/interest_requests.d.ts.map +1 -0
  19. package/dist/tools/interest_requests.js +219 -0
  20. package/dist/tools/interest_requests.js.map +1 -0
  21. package/dist/tools/jobs.d.ts +18 -3
  22. package/dist/tools/jobs.d.ts.map +1 -1
  23. package/dist/tools/jobs.js +177 -39
  24. package/dist/tools/jobs.js.map +1 -1
  25. package/dist/tools/payments.d.ts.map +1 -1
  26. package/dist/tools/payments.js +51 -2
  27. package/dist/tools/payments.js.map +1 -1
  28. package/dist/tools/profile/certifications.d.ts.map +1 -1
  29. package/dist/tools/profile/certifications.js +26 -0
  30. package/dist/tools/profile/certifications.js.map +1 -1
  31. package/dist/tools/profile/education.d.ts.map +1 -1
  32. package/dist/tools/profile/education.js +26 -4
  33. package/dist/tools/profile/education.js.map +1 -1
  34. package/dist/tools/profile/employment.d.ts.map +1 -1
  35. package/dist/tools/profile/employment.js +26 -4
  36. package/dist/tools/profile/employment.js.map +1 -1
  37. package/dist/tools/profile/industries.d.ts +9 -1
  38. package/dist/tools/profile/industries.d.ts.map +1 -1
  39. package/dist/tools/profile/industries.js +28 -3
  40. package/dist/tools/profile/industries.js.map +1 -1
  41. package/dist/tools/profile/resume.d.ts.map +1 -1
  42. package/dist/tools/profile/resume.js +0 -2
  43. package/dist/tools/profile/resume.js.map +1 -1
  44. package/dist/tools/profile/shared.d.ts +12 -11
  45. package/dist/tools/profile/shared.d.ts.map +1 -1
  46. package/dist/tools/profile/shared.js +9 -8
  47. package/dist/tools/profile/shared.js.map +1 -1
  48. package/dist/tools/profile_basic_photo_upload.d.ts.map +1 -1
  49. package/dist/tools/profile_basic_photo_upload.js +0 -2
  50. package/dist/tools/profile_basic_photo_upload.js.map +1 -1
  51. package/dist/tools/profile_basic_show.d.ts +53 -8
  52. package/dist/tools/profile_basic_show.d.ts.map +1 -1
  53. package/dist/tools/profile_basic_show.js +57 -13
  54. package/dist/tools/profile_basic_show.js.map +1 -1
  55. package/dist/tools/profile_basic_update.d.ts.map +1 -1
  56. package/dist/tools/profile_basic_update.js +0 -2
  57. package/dist/tools/profile_basic_update.js.map +1 -1
  58. package/dist/tools/profile_external_show.d.ts +15 -0
  59. package/dist/tools/profile_external_show.d.ts.map +1 -0
  60. package/dist/tools/profile_external_show.js +59 -0
  61. package/dist/tools/profile_external_show.js.map +1 -0
  62. package/dist/tools/timesheet.d.ts +15 -5
  63. package/dist/tools/timesheet.d.ts.map +1 -1
  64. package/dist/tools/timesheet.js +89 -6
  65. package/dist/tools/timesheet.js.map +1 -1
  66. package/package.json +2 -2
  67. package/dist/tools/output-schemas.d.ts +0 -115
  68. package/dist/tools/output-schemas.d.ts.map +0 -1
  69. package/dist/tools/output-schemas.js +0 -130
  70. 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 returns the typed payload.
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, and the payload is always the full
9
- * `ProfileShow` shape (callers project as needed). MCP is the LLM-facing
10
- * surface, so the description includes three example user-intent phrases
11
- * the model can match against.
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 that WOULD have been
15
- * sent to `mobile-gateway` no transport call. Diagnostic value: an
16
- * MCP client can verify the request shape before running.
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;AAKzE,OAAO,EAOL,KAAK,uBAAuB,EAC7B,MAAM,cAAc,CAAC;AAItB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,uBAAuB,GAAG,IAAI,CA6ClG"}
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 returns the typed payload.
11
+ * profile from both the mobile-gateway and the talent-profile surfaces
12
+ * and returns the merged payload.
12
13
  *
13
- * Auth token identifies the user, and the payload is always the full
14
- * `ProfileShow` shape (callers project as needed). MCP is the LLM-facing
15
- * surface, so the description includes three example user-intent phrases
16
- * the model can match against.
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 that WOULD have been
20
- * sent to `mobile-gateway` no transport call. Diagnostic value: an
21
- * MCP client can verify the request shape before running.
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
- "Pass `dryRun: true` to preview the request without firing the query.",
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
- const payload = await profile.basic.show(auth.token);
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;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,0BAA0B,CAAC;AAE7C;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,4BAA4B,CAAC,MAAiB,EAAE,GAA4B;IAC1F,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;QACE,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE;YACX,mGAAmG;YACnG,EAAE;YACF,sEAAsE;YACtE,EAAE;YACF,oDAAoD;YACpD,qCAAqC;YACrC,yCAAyC;YACzC,4CAA4C;SAC7C,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,8KAA8K,CAC/K;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,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;QAC/B,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"}
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;AAKtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,uBAAuB,GAAG,IAAI,CA6DpG"}
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;AACtB,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAErE,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;QACD,YAAY,EAAE,8BAA8B,CAAC,KAAK;KACnD,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"}
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. Tool
5
- * names use the `ttctl_` prefix and the canonical CLI path joined
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` and consumed by
17
- * `timesheet_show` / `timesheet_submit`.
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;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,uBAAuB,GAAG,IAAI,CA0L5F"}
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"}
@@ -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. Tool
22
- * names use the `ttctl_` prefix and the canonical CLI path joined
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` and consumed by
34
- * `timesheet_show` / `timesheet_submit`.
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
- return dryRunResponse(buildMcpDryRunPreview("PendingTimesheets", "mobile-gateway", {}, auth.token));
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":"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"}
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.1",
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.1"
40
+ "@ttctl/core": "^0.1.0-rc.3"
41
41
  },
42
42
  "scripts": {
43
43
  "clean": "rm -rf dist tsconfig.tsbuildinfo",