@opentabs-dev/opentabs-plugin-hack2hire 0.0.109

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 (73) hide show
  1. package/README.md +64 -0
  2. package/dist/adapter.iife.js +15864 -0
  3. package/dist/adapter.iife.js.map +7 -0
  4. package/dist/hack2hire-api.d.ts +18 -0
  5. package/dist/hack2hire-api.d.ts.map +1 -0
  6. package/dist/hack2hire-api.js +72 -0
  7. package/dist/hack2hire-api.js.map +1 -0
  8. package/dist/index.d.ts +14 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +54 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/tools/get-comment.d.ts +31 -0
  13. package/dist/tools/get-comment.d.ts.map +1 -0
  14. package/dist/tools/get-comment.js +21 -0
  15. package/dist/tools/get-comment.js.map +1 -0
  16. package/dist/tools/get-company-question-stats.d.ts +16 -0
  17. package/dist/tools/get-company-question-stats.d.ts.map +1 -0
  18. package/dist/tools/get-company-question-stats.js +34 -0
  19. package/dist/tools/get-company-question-stats.js.map +1 -0
  20. package/dist/tools/get-completed-question-count.d.ts +14 -0
  21. package/dist/tools/get-completed-question-count.d.ts.map +1 -0
  22. package/dist/tools/get-completed-question-count.js +35 -0
  23. package/dist/tools/get-completed-question-count.js.map +1 -0
  24. package/dist/tools/get-current-user.d.ts +15 -0
  25. package/dist/tools/get-current-user.d.ts.map +1 -0
  26. package/dist/tools/get-current-user.js +19 -0
  27. package/dist/tools/get-current-user.js.map +1 -0
  28. package/dist/tools/get-question-neighbors.d.ts +55 -0
  29. package/dist/tools/get-question-neighbors.d.ts.map +1 -0
  30. package/dist/tools/get-question-neighbors.js +42 -0
  31. package/dist/tools/get-question-neighbors.js.map +1 -0
  32. package/dist/tools/get-question.d.ts +27 -0
  33. package/dist/tools/get-question.d.ts.map +1 -0
  34. package/dist/tools/get-question.js +21 -0
  35. package/dist/tools/get-question.js.map +1 -0
  36. package/dist/tools/get-subscription.d.ts +14 -0
  37. package/dist/tools/get-subscription.d.ts.map +1 -0
  38. package/dist/tools/get-subscription.js +19 -0
  39. package/dist/tools/get-subscription.js.map +1 -0
  40. package/dist/tools/list-comment-replies.d.ts +32 -0
  41. package/dist/tools/list-comment-replies.d.ts.map +1 -0
  42. package/dist/tools/list-comment-replies.js +33 -0
  43. package/dist/tools/list-comment-replies.js.map +1 -0
  44. package/dist/tools/list-companies.d.ts +11 -0
  45. package/dist/tools/list-companies.d.ts.map +1 -0
  46. package/dist/tools/list-companies.js +21 -0
  47. package/dist/tools/list-companies.js.map +1 -0
  48. package/dist/tools/list-my-bookmarks.d.ts +24 -0
  49. package/dist/tools/list-my-bookmarks.d.ts.map +1 -0
  50. package/dist/tools/list-my-bookmarks.js +40 -0
  51. package/dist/tools/list-my-bookmarks.js.map +1 -0
  52. package/dist/tools/list-my-visits.d.ts +26 -0
  53. package/dist/tools/list-my-visits.d.ts.map +1 -0
  54. package/dist/tools/list-my-visits.js +40 -0
  55. package/dist/tools/list-my-visits.js.map +1 -0
  56. package/dist/tools/list-question-coding-problems.d.ts +10 -0
  57. package/dist/tools/list-question-coding-problems.d.ts.map +1 -0
  58. package/dist/tools/list-question-coding-problems.js +25 -0
  59. package/dist/tools/list-question-coding-problems.js.map +1 -0
  60. package/dist/tools/list-question-comments.d.ts +33 -0
  61. package/dist/tools/list-question-comments.d.ts.map +1 -0
  62. package/dist/tools/list-question-comments.js +45 -0
  63. package/dist/tools/list-question-comments.js.map +1 -0
  64. package/dist/tools/list-questions.d.ts +50 -0
  65. package/dist/tools/list-questions.d.ts.map +1 -0
  66. package/dist/tools/list-questions.js +71 -0
  67. package/dist/tools/list-questions.js.map +1 -0
  68. package/dist/tools/schemas.d.ts +438 -0
  69. package/dist/tools/schemas.d.ts.map +1 -0
  70. package/dist/tools/schemas.js +282 -0
  71. package/dist/tools/schemas.js.map +1 -0
  72. package/dist/tools.json +1823 -0
  73. package/package.json +68 -0
@@ -0,0 +1,1823 @@
1
+ {
2
+ "sdkVersion": "0.0.109",
3
+ "iconSvg": "<svg viewBox=\"0 -12 181 181\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"> <path d=\"M38.5 114L10.2426 85.7426C7.8995 83.3995 7.89949 79.6005 10.2426 77.2574L38.5 49\" stroke=\"black\" stroke-width=\"16\" stroke-linecap=\"round\"/> <path d=\"M143 114L171.257 85.7426C173.601 83.3995 173.601 79.6005 171.257 77.2574L143 49\" stroke=\"black\" stroke-width=\"16\" stroke-linecap=\"round\"/> <path d=\"M67.0137 70.8078L98.1864 27.6079C101.45 23.085 108.548 26.4929 107.06 31.868L96.5 70C111.575 70 120.123 87.4227 110.73 99.2146L81.398 136.04C77.9794 140.332 71.1436 136.781 72.6896 131.517L84 93H78.3666C66.9485 93 60.3323 80.067 67.0137 70.8078Z\" fill=\"black\"/> </svg>",
4
+ "iconInactiveSvg": "<svg viewBox=\"0 -12 181 181\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"> <path d=\"M38.5 114L10.2426 85.7426C7.8995 83.3995 7.89949 79.6005 10.2426 77.2574L38.5 49\" stroke=\"#999999\" stroke-width=\"16\" stroke-linecap=\"round\"/> <path d=\"M143 114L171.257 85.7426C173.601 83.3995 173.601 79.6005 171.257 77.2574L143 49\" stroke=\"#999999\" stroke-width=\"16\" stroke-linecap=\"round\"/> <path d=\"M67.0137 70.8078L98.1864 27.6079C101.45 23.085 108.548 26.4929 107.06 31.868L96.5 70C111.575 70 120.123 87.4227 110.73 99.2146L81.398 136.04C77.9794 140.332 71.1436 136.781 72.6896 131.517L84 93H78.3666C66.9485 93 60.3323 80.067 67.0137 70.8078Z\" fill=\"#999999\"/> </svg>",
5
+ "iconDarkSvg": "<svg viewBox=\"0 -12 181 181\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"> <path d=\"M38.5 114L10.2426 85.7426C7.8995 83.3995 7.89949 79.6005 10.2426 77.2574L38.5 49\" stroke=\"#ffffff\" stroke-width=\"16\" stroke-linecap=\"round\"/> <path d=\"M143 114L171.257 85.7426C173.601 83.3995 173.601 79.6005 171.257 77.2574L143 49\" stroke=\"#ffffff\" stroke-width=\"16\" stroke-linecap=\"round\"/> <path d=\"M67.0137 70.8078L98.1864 27.6079C101.45 23.085 108.548 26.4929 107.06 31.868L96.5 70C111.575 70 120.123 87.4227 110.73 99.2146L81.398 136.04C77.9794 140.332 71.1436 136.781 72.6896 131.517L84 93H78.3666C66.9485 93 60.3323 80.067 67.0137 70.8078Z\" fill=\"#ffffff\"/> </svg>",
6
+ "iconDarkInactiveSvg": "<svg viewBox=\"0 -12 181 181\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\"> <path d=\"M38.5 114L10.2426 85.7426C7.8995 83.3995 7.89949 79.6005 10.2426 77.2574L38.5 49\" stroke=\"#ffffff\" stroke-width=\"16\" stroke-linecap=\"round\"/> <path d=\"M143 114L171.257 85.7426C173.601 83.3995 173.601 79.6005 171.257 77.2574L143 49\" stroke=\"#ffffff\" stroke-width=\"16\" stroke-linecap=\"round\"/> <path d=\"M67.0137 70.8078L98.1864 27.6079C101.45 23.085 108.548 26.4929 107.06 31.868L96.5 70C111.575 70 120.123 87.4227 110.73 99.2146L81.398 136.04C77.9794 140.332 71.1436 136.781 72.6896 131.517L84 93H78.3666C66.9485 93 60.3323 80.067 67.0137 70.8078Z\" fill=\"#ffffff\"/> </svg>",
7
+ "tools": [
8
+ {
9
+ "name": "list_companies",
10
+ "displayName": "List Companies",
11
+ "description": "List every company that Hack2Hire tracks interview questions for, with the canonical URL key (e.g. \"amazon\", \"pinterest\"), display name, country, and a priority value used to rank companies in the UI. Use the `key` field to look up questions in `list_questions` (uppercased) or `get_company_question_stats`.",
12
+ "summary": "List all tracked companies",
13
+ "icon": "building-2",
14
+ "group": "Companies",
15
+ "input_schema": {
16
+ "type": "object",
17
+ "properties": {},
18
+ "additionalProperties": false
19
+ },
20
+ "output_schema": {
21
+ "type": "object",
22
+ "properties": {
23
+ "companies": {
24
+ "type": "array",
25
+ "items": {
26
+ "type": "object",
27
+ "properties": {
28
+ "key": {
29
+ "type": "string",
30
+ "description": "Lowercase canonical company key used in URL slugs (e.g., \"amazon\", \"pinterest\")."
31
+ },
32
+ "displayName": {
33
+ "type": "string",
34
+ "description": "Human-readable company name."
35
+ },
36
+ "aliases": {
37
+ "type": "array",
38
+ "items": {
39
+ "type": "string"
40
+ },
41
+ "description": "Alternative names that resolve to this company."
42
+ },
43
+ "priority": {
44
+ "type": "integer",
45
+ "minimum": -9007199254740991,
46
+ "maximum": 9007199254740991,
47
+ "description": "Listing priority — higher values surface first."
48
+ },
49
+ "country": {
50
+ "type": "string",
51
+ "description": "Two-letter country code (e.g., \"US\"), or empty if unknown."
52
+ }
53
+ },
54
+ "required": [
55
+ "key",
56
+ "displayName",
57
+ "aliases",
58
+ "priority",
59
+ "country"
60
+ ],
61
+ "additionalProperties": false
62
+ }
63
+ }
64
+ },
65
+ "required": [
66
+ "companies"
67
+ ],
68
+ "additionalProperties": false
69
+ }
70
+ },
71
+ {
72
+ "name": "get_company_question_stats",
73
+ "displayName": "Get Company Question Stats",
74
+ "description": "Get the breakdown of tracked questions for a specific company — the total count plus a count per question type (ALGORITHM, SD, ML_SD, BLOG). Also returns the count for every curated collection. Useful for showing how many questions are available before drilling into a list.",
75
+ "summary": "Question count breakdown for a company",
76
+ "icon": "chart-bar",
77
+ "group": "Companies",
78
+ "input_schema": {
79
+ "type": "object",
80
+ "properties": {
81
+ "company": {
82
+ "type": "string",
83
+ "description": "Company key in uppercase (e.g. \"PINTEREST\", \"AMAZON\"). Use list_companies to discover keys."
84
+ }
85
+ },
86
+ "required": [
87
+ "company"
88
+ ],
89
+ "additionalProperties": false
90
+ },
91
+ "output_schema": {
92
+ "type": "object",
93
+ "properties": {
94
+ "stats": {
95
+ "type": "object",
96
+ "properties": {
97
+ "company": {
98
+ "type": "string",
99
+ "description": "Company name (uppercase, e.g., \"AMAZON\")."
100
+ },
101
+ "total": {
102
+ "type": "integer",
103
+ "minimum": -9007199254740991,
104
+ "maximum": 9007199254740991,
105
+ "description": "Total questions tracked for this company."
106
+ },
107
+ "postTypeRecords": {
108
+ "type": "array",
109
+ "items": {
110
+ "type": "object",
111
+ "properties": {
112
+ "postType": {
113
+ "type": "string",
114
+ "description": "Post type bucket (ALGORITHM, SD, ML_SD, BLOG)."
115
+ },
116
+ "count": {
117
+ "type": "integer",
118
+ "minimum": -9007199254740991,
119
+ "maximum": 9007199254740991,
120
+ "description": "Number of questions in this bucket."
121
+ }
122
+ },
123
+ "required": [
124
+ "postType",
125
+ "count"
126
+ ],
127
+ "additionalProperties": false
128
+ },
129
+ "description": "Breakdown of question count by post type."
130
+ },
131
+ "updatedDate": {
132
+ "type": "string",
133
+ "description": "ISO 8601 timestamp of the last statistics refresh."
134
+ }
135
+ },
136
+ "required": [
137
+ "company",
138
+ "total",
139
+ "postTypeRecords",
140
+ "updatedDate"
141
+ ],
142
+ "additionalProperties": false
143
+ },
144
+ "selectedCollectionCounts": {
145
+ "type": "object",
146
+ "propertyNames": {
147
+ "type": "string"
148
+ },
149
+ "additionalProperties": {
150
+ "type": "integer",
151
+ "minimum": -9007199254740991,
152
+ "maximum": 9007199254740991
153
+ },
154
+ "description": "Number of questions in each curated collection (e.g. \"hack2hire-50-picks\")."
155
+ }
156
+ },
157
+ "required": [
158
+ "stats",
159
+ "selectedCollectionCounts"
160
+ ],
161
+ "additionalProperties": false
162
+ }
163
+ },
164
+ {
165
+ "name": "list_questions",
166
+ "displayName": "List Questions",
167
+ "description": "Search and filter Hack2Hire interview questions. Combine filters to narrow results: `companyTags` (uppercase, e.g. \"PINTEREST\") returns questions reportedly asked at that company; `type` (ALGORITHM, SD, ML_SD, BLOG) selects the question category; `algorithmTags` filters by topic (e.g. ARRAY, GREEDY, HASH_TABLE, HEAP, TRIE); `stages` filters by interview stage (SCREENING, OA, ONSITE, PHONE); `difficulty` is 1 (Easy), 2 (Medium), or 3 (Hard); `selectedCollectionKey` selects a curated list (e.g. \"hack2hire-50-picks\", \"engineering-problem-picks\"). Returns a paginated list with summary fields including the company frequency map, tags, difficulty, and locked/free status.",
168
+ "summary": "Search and filter interview questions",
169
+ "icon": "search",
170
+ "group": "Questions",
171
+ "input_schema": {
172
+ "type": "object",
173
+ "properties": {
174
+ "companyTags": {
175
+ "description": "Filter by company key in uppercase (e.g. \"PINTEREST\", \"AMAZON\"). Use list_companies to discover keys.",
176
+ "type": "string"
177
+ },
178
+ "type": {
179
+ "description": "Filter by question type — ALGORITHM (coding), SD (system design), ML_SD (ML system design), or BLOG.",
180
+ "type": "string",
181
+ "enum": [
182
+ "ALGORITHM",
183
+ "SD",
184
+ "ML_SD",
185
+ "BLOG"
186
+ ]
187
+ },
188
+ "algorithmTags": {
189
+ "description": "Filter by algorithm/topic tag (e.g. \"ARRAY\", \"GREEDY\", \"HASH_TABLE\", \"HEAP\", \"TRIE\", \"BACKTRACKING\", \"BREADTH_FIRST_SEARCH\", \"UNION_FIND\", \"SORTING\", \"CONCURRENCY\").",
190
+ "type": "string"
191
+ },
192
+ "stages": {
193
+ "description": "Filter by interview stage where the question is reported.",
194
+ "type": "string",
195
+ "enum": [
196
+ "SCREENING",
197
+ "OA",
198
+ "ONSITE",
199
+ "PHONE"
200
+ ]
201
+ },
202
+ "difficulty": {
203
+ "description": "Filter by difficulty — 1 (Easy), 2 (Medium), or 3 (Hard).",
204
+ "type": "integer",
205
+ "minimum": 1,
206
+ "maximum": 3
207
+ },
208
+ "selectedCollectionKey": {
209
+ "description": "Filter by curated collection key (e.g. \"hack2hire-50-picks\", \"engineering-problem-picks\", \"object-oriented-problem-picks\", \"system-simulation-problem-picks\", \"classic-ml-system-design-picks\", \"new-ml-system-design-picks\", \"ai-system-design-picks\", \"classic-system-design-picks\", \"customer-facing-system-design-picks\", \"infra-system-design-picks\", \"new-system-design-topic-picks\").",
210
+ "type": "string"
211
+ },
212
+ "sortBy": {
213
+ "description": "Sort order. \"isLocked\" (default) lists free questions first, then locked.",
214
+ "type": "string",
215
+ "enum": [
216
+ "isLocked",
217
+ "frequency",
218
+ "difficulty",
219
+ "createdDate"
220
+ ]
221
+ },
222
+ "page": {
223
+ "description": "Page number (default 1).",
224
+ "type": "integer",
225
+ "minimum": 1,
226
+ "maximum": 9007199254740991
227
+ },
228
+ "perPage": {
229
+ "description": "Results per page (default 10, max 100).",
230
+ "type": "integer",
231
+ "minimum": 1,
232
+ "maximum": 100
233
+ }
234
+ },
235
+ "additionalProperties": false
236
+ },
237
+ "output_schema": {
238
+ "type": "object",
239
+ "properties": {
240
+ "questions": {
241
+ "type": "array",
242
+ "items": {
243
+ "type": "object",
244
+ "properties": {
245
+ "id": {
246
+ "type": "string",
247
+ "description": "Post ID."
248
+ },
249
+ "type": {
250
+ "type": "string",
251
+ "description": "Post type — ALGORITHM, SD (system design), ML_SD (ML system design), or BLOG."
252
+ },
253
+ "title": {
254
+ "type": "string",
255
+ "description": "Post title."
256
+ },
257
+ "subtitle": {
258
+ "type": "string",
259
+ "description": "Post subtitle (empty when not set)."
260
+ },
261
+ "company": {
262
+ "type": "object",
263
+ "propertyNames": {
264
+ "type": "string"
265
+ },
266
+ "additionalProperties": {
267
+ "type": "object",
268
+ "properties": {
269
+ "frequency": {
270
+ "type": "integer",
271
+ "minimum": -9007199254740991,
272
+ "maximum": 9007199254740991
273
+ }
274
+ },
275
+ "required": [
276
+ "frequency"
277
+ ],
278
+ "additionalProperties": false
279
+ },
280
+ "description": "Map of company name to question frequency at that company."
281
+ },
282
+ "algorithmTags": {
283
+ "type": "array",
284
+ "items": {
285
+ "type": "string"
286
+ },
287
+ "description": "Algorithm/topic tags such as ARRAY, GREEDY, HASH_TABLE."
288
+ },
289
+ "stages": {
290
+ "type": "array",
291
+ "items": {
292
+ "type": "string"
293
+ },
294
+ "description": "Interview stages where this question appears (SCREENING, OA, ONSITE, PHONE)."
295
+ },
296
+ "difficulty": {
297
+ "type": "integer",
298
+ "minimum": -9007199254740991,
299
+ "maximum": 9007199254740991,
300
+ "description": "Difficulty level — 1 (Easy), 2 (Medium), or 3 (Hard)."
301
+ },
302
+ "frequency": {
303
+ "type": "integer",
304
+ "minimum": -9007199254740991,
305
+ "maximum": 9007199254740991,
306
+ "description": "Aggregate report frequency across all companies."
307
+ },
308
+ "isLocked": {
309
+ "type": "boolean",
310
+ "description": "Whether full content is gated behind a paid subscription."
311
+ },
312
+ "createdDate": {
313
+ "type": "string",
314
+ "description": "ISO 8601 timestamp when the post was created."
315
+ },
316
+ "firstPublishedDate": {
317
+ "type": "string",
318
+ "description": "ISO 8601 timestamp when first published, or empty if unpublished."
319
+ },
320
+ "lastReportSeenDate": {
321
+ "type": "string",
322
+ "description": "ISO 8601 timestamp of the most recent reported sighting, or empty if unknown."
323
+ },
324
+ "codingQuestionIds": {
325
+ "type": "array",
326
+ "items": {
327
+ "type": "string"
328
+ },
329
+ "description": "IDs of the coding questions associated with this post (used for comments and detail lookups)."
330
+ }
331
+ },
332
+ "required": [
333
+ "id",
334
+ "type",
335
+ "title",
336
+ "subtitle",
337
+ "company",
338
+ "algorithmTags",
339
+ "stages",
340
+ "difficulty",
341
+ "frequency",
342
+ "isLocked",
343
+ "createdDate",
344
+ "firstPublishedDate",
345
+ "lastReportSeenDate",
346
+ "codingQuestionIds"
347
+ ],
348
+ "additionalProperties": false
349
+ }
350
+ },
351
+ "total": {
352
+ "type": "integer",
353
+ "minimum": -9007199254740991,
354
+ "maximum": 9007199254740991,
355
+ "description": "Total number of questions matching the filters across all pages."
356
+ },
357
+ "page": {
358
+ "type": "integer",
359
+ "minimum": -9007199254740991,
360
+ "maximum": 9007199254740991,
361
+ "description": "Current page number."
362
+ },
363
+ "perPage": {
364
+ "type": "integer",
365
+ "minimum": -9007199254740991,
366
+ "maximum": 9007199254740991,
367
+ "description": "Results per page in this response."
368
+ }
369
+ },
370
+ "required": [
371
+ "questions",
372
+ "total",
373
+ "page",
374
+ "perPage"
375
+ ],
376
+ "additionalProperties": false
377
+ }
378
+ },
379
+ {
380
+ "name": "get_question",
381
+ "displayName": "Get Question",
382
+ "description": "Get the full detail of a single Hack2Hire interview question by its post ID, including the markdown content preview, company frequencies, algorithm tags, interview stages, difficulty, and the IDs of any associated coding questions (use those IDs with list_question_comments). For paid (locked) questions the contentPreview field returns a teaser only — full content requires a Hack2Hire premium subscription.",
383
+ "summary": "Get full detail of one question",
384
+ "icon": "file-text",
385
+ "group": "Questions",
386
+ "input_schema": {
387
+ "type": "object",
388
+ "properties": {
389
+ "postId": {
390
+ "type": "string",
391
+ "description": "Post ID — get this from list_questions."
392
+ }
393
+ },
394
+ "required": [
395
+ "postId"
396
+ ],
397
+ "additionalProperties": false
398
+ },
399
+ "output_schema": {
400
+ "type": "object",
401
+ "properties": {
402
+ "question": {
403
+ "type": "object",
404
+ "properties": {
405
+ "id": {
406
+ "type": "string",
407
+ "description": "Post ID."
408
+ },
409
+ "type": {
410
+ "type": "string",
411
+ "description": "Post type — ALGORITHM, SD (system design), ML_SD (ML system design), or BLOG."
412
+ },
413
+ "title": {
414
+ "type": "string",
415
+ "description": "Post title."
416
+ },
417
+ "subtitle": {
418
+ "type": "string",
419
+ "description": "Post subtitle (empty when not set)."
420
+ },
421
+ "company": {
422
+ "type": "object",
423
+ "propertyNames": {
424
+ "type": "string"
425
+ },
426
+ "additionalProperties": {
427
+ "type": "object",
428
+ "properties": {
429
+ "frequency": {
430
+ "type": "integer",
431
+ "minimum": -9007199254740991,
432
+ "maximum": 9007199254740991
433
+ }
434
+ },
435
+ "required": [
436
+ "frequency"
437
+ ],
438
+ "additionalProperties": false
439
+ },
440
+ "description": "Map of company name to question frequency at that company."
441
+ },
442
+ "algorithmTags": {
443
+ "type": "array",
444
+ "items": {
445
+ "type": "string"
446
+ },
447
+ "description": "Algorithm/topic tags such as ARRAY, GREEDY, HASH_TABLE."
448
+ },
449
+ "stages": {
450
+ "type": "array",
451
+ "items": {
452
+ "type": "string"
453
+ },
454
+ "description": "Interview stages where this question appears (SCREENING, OA, ONSITE, PHONE)."
455
+ },
456
+ "difficulty": {
457
+ "type": "integer",
458
+ "minimum": -9007199254740991,
459
+ "maximum": 9007199254740991,
460
+ "description": "Difficulty level — 1 (Easy), 2 (Medium), or 3 (Hard)."
461
+ },
462
+ "frequency": {
463
+ "type": "integer",
464
+ "minimum": -9007199254740991,
465
+ "maximum": 9007199254740991,
466
+ "description": "Aggregate report frequency across all companies."
467
+ },
468
+ "isLocked": {
469
+ "type": "boolean",
470
+ "description": "Whether full content is gated behind a paid subscription."
471
+ },
472
+ "createdDate": {
473
+ "type": "string",
474
+ "description": "ISO 8601 timestamp when the post was created."
475
+ },
476
+ "firstPublishedDate": {
477
+ "type": "string",
478
+ "description": "ISO 8601 timestamp when first published, or empty if unpublished."
479
+ },
480
+ "lastReportSeenDate": {
481
+ "type": "string",
482
+ "description": "ISO 8601 timestamp of the most recent reported sighting, or empty if unknown."
483
+ },
484
+ "codingQuestionIds": {
485
+ "type": "array",
486
+ "items": {
487
+ "type": "string"
488
+ },
489
+ "description": "IDs of the coding questions associated with this post (used for comments and detail lookups)."
490
+ },
491
+ "contentPreview": {
492
+ "type": "string",
493
+ "description": "Markdown preview of the question statement. For locked posts this is a teaser; for unlocked posts this is the full prompt."
494
+ },
495
+ "topic": {
496
+ "type": "string",
497
+ "description": "Topic grouping label, or empty when not set."
498
+ },
499
+ "estimatedReadingTimeInMinutes": {
500
+ "type": "integer",
501
+ "minimum": -9007199254740991,
502
+ "maximum": 9007199254740991,
503
+ "description": "Estimated reading time in minutes, or 0 if unknown."
504
+ }
505
+ },
506
+ "required": [
507
+ "id",
508
+ "type",
509
+ "title",
510
+ "subtitle",
511
+ "company",
512
+ "algorithmTags",
513
+ "stages",
514
+ "difficulty",
515
+ "frequency",
516
+ "isLocked",
517
+ "createdDate",
518
+ "firstPublishedDate",
519
+ "lastReportSeenDate",
520
+ "codingQuestionIds",
521
+ "contentPreview",
522
+ "topic",
523
+ "estimatedReadingTimeInMinutes"
524
+ ],
525
+ "additionalProperties": false
526
+ }
527
+ },
528
+ "required": [
529
+ "question"
530
+ ],
531
+ "additionalProperties": false
532
+ }
533
+ },
534
+ {
535
+ "name": "get_question_neighbors",
536
+ "displayName": "Get Question Neighbors",
537
+ "description": "Get the previous and next questions relative to a given post within a filtered, sorted list. Pass the same `company`, `type`, and `sortedBy` you would use in `list_questions` so the navigation matches the UI ordering. The previous or next field has empty values when the post is at the start or end of the list.",
538
+ "summary": "Get prev/next questions in a list",
539
+ "icon": "arrow-right-left",
540
+ "group": "Questions",
541
+ "input_schema": {
542
+ "type": "object",
543
+ "properties": {
544
+ "postId": {
545
+ "type": "string",
546
+ "description": "Post ID to anchor navigation around."
547
+ },
548
+ "company": {
549
+ "description": "Company key in uppercase (e.g. \"PINTEREST\"). Match the list_questions call you used.",
550
+ "type": "string"
551
+ },
552
+ "type": {
553
+ "description": "Post type filter.",
554
+ "type": "string",
555
+ "enum": [
556
+ "ALGORITHM",
557
+ "SD",
558
+ "ML_SD",
559
+ "BLOG"
560
+ ]
561
+ },
562
+ "sortedBy": {
563
+ "description": "Sort order. Defaults to \"isLocked\" — match the list_questions sortBy you used.",
564
+ "type": "string",
565
+ "enum": [
566
+ "isLocked",
567
+ "frequency",
568
+ "difficulty",
569
+ "createdDate"
570
+ ]
571
+ }
572
+ },
573
+ "required": [
574
+ "postId"
575
+ ],
576
+ "additionalProperties": false
577
+ },
578
+ "output_schema": {
579
+ "type": "object",
580
+ "properties": {
581
+ "previous": {
582
+ "type": "object",
583
+ "properties": {
584
+ "id": {
585
+ "type": "string",
586
+ "description": "Post ID."
587
+ },
588
+ "type": {
589
+ "type": "string",
590
+ "description": "Post type — ALGORITHM, SD (system design), ML_SD (ML system design), or BLOG."
591
+ },
592
+ "title": {
593
+ "type": "string",
594
+ "description": "Post title."
595
+ },
596
+ "subtitle": {
597
+ "type": "string",
598
+ "description": "Post subtitle (empty when not set)."
599
+ },
600
+ "company": {
601
+ "type": "object",
602
+ "propertyNames": {
603
+ "type": "string"
604
+ },
605
+ "additionalProperties": {
606
+ "type": "object",
607
+ "properties": {
608
+ "frequency": {
609
+ "type": "integer",
610
+ "minimum": -9007199254740991,
611
+ "maximum": 9007199254740991
612
+ }
613
+ },
614
+ "required": [
615
+ "frequency"
616
+ ],
617
+ "additionalProperties": false
618
+ },
619
+ "description": "Map of company name to question frequency at that company."
620
+ },
621
+ "algorithmTags": {
622
+ "type": "array",
623
+ "items": {
624
+ "type": "string"
625
+ },
626
+ "description": "Algorithm/topic tags such as ARRAY, GREEDY, HASH_TABLE."
627
+ },
628
+ "stages": {
629
+ "type": "array",
630
+ "items": {
631
+ "type": "string"
632
+ },
633
+ "description": "Interview stages where this question appears (SCREENING, OA, ONSITE, PHONE)."
634
+ },
635
+ "difficulty": {
636
+ "type": "integer",
637
+ "minimum": -9007199254740991,
638
+ "maximum": 9007199254740991,
639
+ "description": "Difficulty level — 1 (Easy), 2 (Medium), or 3 (Hard)."
640
+ },
641
+ "frequency": {
642
+ "type": "integer",
643
+ "minimum": -9007199254740991,
644
+ "maximum": 9007199254740991,
645
+ "description": "Aggregate report frequency across all companies."
646
+ },
647
+ "isLocked": {
648
+ "type": "boolean",
649
+ "description": "Whether full content is gated behind a paid subscription."
650
+ },
651
+ "createdDate": {
652
+ "type": "string",
653
+ "description": "ISO 8601 timestamp when the post was created."
654
+ },
655
+ "firstPublishedDate": {
656
+ "type": "string",
657
+ "description": "ISO 8601 timestamp when first published, or empty if unpublished."
658
+ },
659
+ "lastReportSeenDate": {
660
+ "type": "string",
661
+ "description": "ISO 8601 timestamp of the most recent reported sighting, or empty if unknown."
662
+ },
663
+ "codingQuestionIds": {
664
+ "type": "array",
665
+ "items": {
666
+ "type": "string"
667
+ },
668
+ "description": "IDs of the coding questions associated with this post (used for comments and detail lookups)."
669
+ }
670
+ },
671
+ "required": [
672
+ "id",
673
+ "type",
674
+ "title",
675
+ "subtitle",
676
+ "company",
677
+ "algorithmTags",
678
+ "stages",
679
+ "difficulty",
680
+ "frequency",
681
+ "isLocked",
682
+ "createdDate",
683
+ "firstPublishedDate",
684
+ "lastReportSeenDate",
685
+ "codingQuestionIds"
686
+ ],
687
+ "additionalProperties": false,
688
+ "description": "The previous question summary, or all-empty fields when none."
689
+ },
690
+ "next": {
691
+ "type": "object",
692
+ "properties": {
693
+ "id": {
694
+ "type": "string",
695
+ "description": "Post ID."
696
+ },
697
+ "type": {
698
+ "type": "string",
699
+ "description": "Post type — ALGORITHM, SD (system design), ML_SD (ML system design), or BLOG."
700
+ },
701
+ "title": {
702
+ "type": "string",
703
+ "description": "Post title."
704
+ },
705
+ "subtitle": {
706
+ "type": "string",
707
+ "description": "Post subtitle (empty when not set)."
708
+ },
709
+ "company": {
710
+ "type": "object",
711
+ "propertyNames": {
712
+ "type": "string"
713
+ },
714
+ "additionalProperties": {
715
+ "type": "object",
716
+ "properties": {
717
+ "frequency": {
718
+ "type": "integer",
719
+ "minimum": -9007199254740991,
720
+ "maximum": 9007199254740991
721
+ }
722
+ },
723
+ "required": [
724
+ "frequency"
725
+ ],
726
+ "additionalProperties": false
727
+ },
728
+ "description": "Map of company name to question frequency at that company."
729
+ },
730
+ "algorithmTags": {
731
+ "type": "array",
732
+ "items": {
733
+ "type": "string"
734
+ },
735
+ "description": "Algorithm/topic tags such as ARRAY, GREEDY, HASH_TABLE."
736
+ },
737
+ "stages": {
738
+ "type": "array",
739
+ "items": {
740
+ "type": "string"
741
+ },
742
+ "description": "Interview stages where this question appears (SCREENING, OA, ONSITE, PHONE)."
743
+ },
744
+ "difficulty": {
745
+ "type": "integer",
746
+ "minimum": -9007199254740991,
747
+ "maximum": 9007199254740991,
748
+ "description": "Difficulty level — 1 (Easy), 2 (Medium), or 3 (Hard)."
749
+ },
750
+ "frequency": {
751
+ "type": "integer",
752
+ "minimum": -9007199254740991,
753
+ "maximum": 9007199254740991,
754
+ "description": "Aggregate report frequency across all companies."
755
+ },
756
+ "isLocked": {
757
+ "type": "boolean",
758
+ "description": "Whether full content is gated behind a paid subscription."
759
+ },
760
+ "createdDate": {
761
+ "type": "string",
762
+ "description": "ISO 8601 timestamp when the post was created."
763
+ },
764
+ "firstPublishedDate": {
765
+ "type": "string",
766
+ "description": "ISO 8601 timestamp when first published, or empty if unpublished."
767
+ },
768
+ "lastReportSeenDate": {
769
+ "type": "string",
770
+ "description": "ISO 8601 timestamp of the most recent reported sighting, or empty if unknown."
771
+ },
772
+ "codingQuestionIds": {
773
+ "type": "array",
774
+ "items": {
775
+ "type": "string"
776
+ },
777
+ "description": "IDs of the coding questions associated with this post (used for comments and detail lookups)."
778
+ }
779
+ },
780
+ "required": [
781
+ "id",
782
+ "type",
783
+ "title",
784
+ "subtitle",
785
+ "company",
786
+ "algorithmTags",
787
+ "stages",
788
+ "difficulty",
789
+ "frequency",
790
+ "isLocked",
791
+ "createdDate",
792
+ "firstPublishedDate",
793
+ "lastReportSeenDate",
794
+ "codingQuestionIds"
795
+ ],
796
+ "additionalProperties": false,
797
+ "description": "The next question summary, or all-empty fields when none."
798
+ }
799
+ },
800
+ "required": [
801
+ "previous",
802
+ "next"
803
+ ],
804
+ "additionalProperties": false
805
+ }
806
+ },
807
+ {
808
+ "name": "list_question_coding_problems",
809
+ "displayName": "List Question Coding Problems",
810
+ "description": "List the coding problems associated with a post. Each post can have one or more coding problems — for example a multi-part interview question. Returns each coding problem ID and its type (SINGLE_STEP or MULTI_STEP). Use the returned IDs with `list_question_comments` to read comments anchored to the coding problem itself.",
811
+ "summary": "List coding problems for a post",
812
+ "icon": "code",
813
+ "group": "Questions",
814
+ "input_schema": {
815
+ "type": "object",
816
+ "properties": {
817
+ "postId": {
818
+ "type": "string",
819
+ "description": "Post ID — get this from list_questions or get_question."
820
+ }
821
+ },
822
+ "required": [
823
+ "postId"
824
+ ],
825
+ "additionalProperties": false
826
+ },
827
+ "output_schema": {
828
+ "type": "object",
829
+ "properties": {
830
+ "codingProblems": {
831
+ "type": "array",
832
+ "items": {
833
+ "type": "object",
834
+ "properties": {
835
+ "id": {
836
+ "type": "string",
837
+ "description": "Coding question ID."
838
+ },
839
+ "type": {
840
+ "type": "string",
841
+ "description": "Coding question type (e.g., SINGLE_STEP, MULTI_STEP)."
842
+ }
843
+ },
844
+ "required": [
845
+ "id",
846
+ "type"
847
+ ],
848
+ "additionalProperties": false
849
+ }
850
+ }
851
+ },
852
+ "required": [
853
+ "codingProblems"
854
+ ],
855
+ "additionalProperties": false
856
+ }
857
+ },
858
+ {
859
+ "name": "list_question_comments",
860
+ "displayName": "List Question Comments",
861
+ "description": "List comments on a Hack2Hire interview question or coding question. Provide either `postId` (top-level discussion on the post) or `codingQuestionId` (comments anchored to a specific coding question — get this ID from `get_question`'s `codingQuestionIds` field). Each comment includes the body, language label for code snippets, vote scores, view count, reply count, and author identity.",
862
+ "summary": "List comments on a question",
863
+ "icon": "message-circle",
864
+ "group": "Comments",
865
+ "input_schema": {
866
+ "type": "object",
867
+ "properties": {
868
+ "postId": {
869
+ "description": "Post ID — list discussion comments on the post itself.",
870
+ "type": "string"
871
+ },
872
+ "codingQuestionId": {
873
+ "description": "Coding question ID — list comments anchored to a specific coding question. Get this from get_question's codingQuestionIds field.",
874
+ "type": "string"
875
+ },
876
+ "page": {
877
+ "description": "Page number (default 1).",
878
+ "type": "integer",
879
+ "minimum": 1,
880
+ "maximum": 9007199254740991
881
+ },
882
+ "perPage": {
883
+ "description": "Results per page (default 10, max 50).",
884
+ "type": "integer",
885
+ "minimum": 1,
886
+ "maximum": 50
887
+ }
888
+ },
889
+ "additionalProperties": false
890
+ },
891
+ "output_schema": {
892
+ "type": "object",
893
+ "properties": {
894
+ "comments": {
895
+ "type": "array",
896
+ "items": {
897
+ "type": "object",
898
+ "properties": {
899
+ "id": {
900
+ "type": "string",
901
+ "description": "Comment ID."
902
+ },
903
+ "type": {
904
+ "type": "string",
905
+ "description": "Comment type — CODING_QUESTION (anchored to a coding question) or POST (anchored to a post)."
906
+ },
907
+ "title": {
908
+ "type": "string",
909
+ "description": "Comment title or label, or empty if not set."
910
+ },
911
+ "language": {
912
+ "type": "string",
913
+ "description": "Programming language label for code-only comments, or empty."
914
+ },
915
+ "upvoteCount": {
916
+ "type": "integer",
917
+ "minimum": -9007199254740991,
918
+ "maximum": 9007199254740991,
919
+ "description": "Number of upvotes."
920
+ },
921
+ "downvoteCount": {
922
+ "type": "integer",
923
+ "minimum": -9007199254740991,
924
+ "maximum": 9007199254740991,
925
+ "description": "Number of downvotes."
926
+ },
927
+ "voteScore": {
928
+ "type": "integer",
929
+ "minimum": -9007199254740991,
930
+ "maximum": 9007199254740991,
931
+ "description": "Combined vote score (upvotes minus downvotes)."
932
+ },
933
+ "viewCount": {
934
+ "type": "integer",
935
+ "minimum": -9007199254740991,
936
+ "maximum": 9007199254740991,
937
+ "description": "View count."
938
+ },
939
+ "replyCount": {
940
+ "type": "integer",
941
+ "minimum": -9007199254740991,
942
+ "maximum": 9007199254740991,
943
+ "description": "Number of replies on this comment."
944
+ },
945
+ "isAnonymous": {
946
+ "type": "boolean",
947
+ "description": "Whether the comment was posted anonymously."
948
+ },
949
+ "postId": {
950
+ "type": "string",
951
+ "description": "Post ID this comment is attached to, or empty."
952
+ },
953
+ "codingQuestionId": {
954
+ "type": "string",
955
+ "description": "Coding question ID this comment is attached to, or empty."
956
+ },
957
+ "user": {
958
+ "type": "object",
959
+ "properties": {
960
+ "alias": {
961
+ "type": "string",
962
+ "description": "Author username."
963
+ },
964
+ "avatar": {
965
+ "type": "string",
966
+ "description": "Author avatar URL, or empty if not set."
967
+ }
968
+ },
969
+ "required": [
970
+ "alias",
971
+ "avatar"
972
+ ],
973
+ "additionalProperties": false,
974
+ "description": "Author identity."
975
+ },
976
+ "displayName": {
977
+ "type": "string",
978
+ "description": "Author display name as shown in the UI."
979
+ },
980
+ "hasUserUpvoted": {
981
+ "type": "boolean",
982
+ "description": "Whether the requesting user has upvoted this comment."
983
+ },
984
+ "hasUserDownvoted": {
985
+ "type": "boolean",
986
+ "description": "Whether the requesting user has downvoted this comment."
987
+ },
988
+ "createdDate": {
989
+ "type": "string",
990
+ "description": "ISO 8601 timestamp when the comment was created."
991
+ },
992
+ "updatedDate": {
993
+ "type": "string",
994
+ "description": "ISO 8601 timestamp when the comment was last updated."
995
+ }
996
+ },
997
+ "required": [
998
+ "id",
999
+ "type",
1000
+ "title",
1001
+ "language",
1002
+ "upvoteCount",
1003
+ "downvoteCount",
1004
+ "voteScore",
1005
+ "viewCount",
1006
+ "replyCount",
1007
+ "isAnonymous",
1008
+ "postId",
1009
+ "codingQuestionId",
1010
+ "user",
1011
+ "displayName",
1012
+ "hasUserUpvoted",
1013
+ "hasUserDownvoted",
1014
+ "createdDate",
1015
+ "updatedDate"
1016
+ ],
1017
+ "additionalProperties": false
1018
+ }
1019
+ },
1020
+ "total": {
1021
+ "type": "integer",
1022
+ "minimum": -9007199254740991,
1023
+ "maximum": 9007199254740991,
1024
+ "description": "Total comments matching the filter across all pages."
1025
+ }
1026
+ },
1027
+ "required": [
1028
+ "comments",
1029
+ "total"
1030
+ ],
1031
+ "additionalProperties": false
1032
+ }
1033
+ },
1034
+ {
1035
+ "name": "list_comment_replies",
1036
+ "displayName": "List Comment Replies",
1037
+ "description": "List replies to a Hack2Hire comment. Each reply has the same shape as a top-level comment (body, vote scores, author, etc.).",
1038
+ "summary": "List replies to a comment",
1039
+ "icon": "corner-down-right",
1040
+ "group": "Comments",
1041
+ "input_schema": {
1042
+ "type": "object",
1043
+ "properties": {
1044
+ "commentId": {
1045
+ "type": "string",
1046
+ "description": "Parent comment ID — get this from list_question_comments."
1047
+ },
1048
+ "page": {
1049
+ "description": "Page number (default 1).",
1050
+ "type": "integer",
1051
+ "minimum": 1,
1052
+ "maximum": 9007199254740991
1053
+ },
1054
+ "perPage": {
1055
+ "description": "Results per page (default 10, max 50).",
1056
+ "type": "integer",
1057
+ "minimum": 1,
1058
+ "maximum": 50
1059
+ }
1060
+ },
1061
+ "required": [
1062
+ "commentId"
1063
+ ],
1064
+ "additionalProperties": false
1065
+ },
1066
+ "output_schema": {
1067
+ "type": "object",
1068
+ "properties": {
1069
+ "replies": {
1070
+ "type": "array",
1071
+ "items": {
1072
+ "type": "object",
1073
+ "properties": {
1074
+ "id": {
1075
+ "type": "string",
1076
+ "description": "Comment ID."
1077
+ },
1078
+ "type": {
1079
+ "type": "string",
1080
+ "description": "Comment type — CODING_QUESTION (anchored to a coding question) or POST (anchored to a post)."
1081
+ },
1082
+ "title": {
1083
+ "type": "string",
1084
+ "description": "Comment title or label, or empty if not set."
1085
+ },
1086
+ "language": {
1087
+ "type": "string",
1088
+ "description": "Programming language label for code-only comments, or empty."
1089
+ },
1090
+ "upvoteCount": {
1091
+ "type": "integer",
1092
+ "minimum": -9007199254740991,
1093
+ "maximum": 9007199254740991,
1094
+ "description": "Number of upvotes."
1095
+ },
1096
+ "downvoteCount": {
1097
+ "type": "integer",
1098
+ "minimum": -9007199254740991,
1099
+ "maximum": 9007199254740991,
1100
+ "description": "Number of downvotes."
1101
+ },
1102
+ "voteScore": {
1103
+ "type": "integer",
1104
+ "minimum": -9007199254740991,
1105
+ "maximum": 9007199254740991,
1106
+ "description": "Combined vote score (upvotes minus downvotes)."
1107
+ },
1108
+ "viewCount": {
1109
+ "type": "integer",
1110
+ "minimum": -9007199254740991,
1111
+ "maximum": 9007199254740991,
1112
+ "description": "View count."
1113
+ },
1114
+ "replyCount": {
1115
+ "type": "integer",
1116
+ "minimum": -9007199254740991,
1117
+ "maximum": 9007199254740991,
1118
+ "description": "Number of replies on this comment."
1119
+ },
1120
+ "isAnonymous": {
1121
+ "type": "boolean",
1122
+ "description": "Whether the comment was posted anonymously."
1123
+ },
1124
+ "postId": {
1125
+ "type": "string",
1126
+ "description": "Post ID this comment is attached to, or empty."
1127
+ },
1128
+ "codingQuestionId": {
1129
+ "type": "string",
1130
+ "description": "Coding question ID this comment is attached to, or empty."
1131
+ },
1132
+ "user": {
1133
+ "type": "object",
1134
+ "properties": {
1135
+ "alias": {
1136
+ "type": "string",
1137
+ "description": "Author username."
1138
+ },
1139
+ "avatar": {
1140
+ "type": "string",
1141
+ "description": "Author avatar URL, or empty if not set."
1142
+ }
1143
+ },
1144
+ "required": [
1145
+ "alias",
1146
+ "avatar"
1147
+ ],
1148
+ "additionalProperties": false,
1149
+ "description": "Author identity."
1150
+ },
1151
+ "displayName": {
1152
+ "type": "string",
1153
+ "description": "Author display name as shown in the UI."
1154
+ },
1155
+ "hasUserUpvoted": {
1156
+ "type": "boolean",
1157
+ "description": "Whether the requesting user has upvoted this comment."
1158
+ },
1159
+ "hasUserDownvoted": {
1160
+ "type": "boolean",
1161
+ "description": "Whether the requesting user has downvoted this comment."
1162
+ },
1163
+ "createdDate": {
1164
+ "type": "string",
1165
+ "description": "ISO 8601 timestamp when the comment was created."
1166
+ },
1167
+ "updatedDate": {
1168
+ "type": "string",
1169
+ "description": "ISO 8601 timestamp when the comment was last updated."
1170
+ }
1171
+ },
1172
+ "required": [
1173
+ "id",
1174
+ "type",
1175
+ "title",
1176
+ "language",
1177
+ "upvoteCount",
1178
+ "downvoteCount",
1179
+ "voteScore",
1180
+ "viewCount",
1181
+ "replyCount",
1182
+ "isAnonymous",
1183
+ "postId",
1184
+ "codingQuestionId",
1185
+ "user",
1186
+ "displayName",
1187
+ "hasUserUpvoted",
1188
+ "hasUserDownvoted",
1189
+ "createdDate",
1190
+ "updatedDate"
1191
+ ],
1192
+ "additionalProperties": false
1193
+ }
1194
+ },
1195
+ "total": {
1196
+ "type": "integer",
1197
+ "minimum": -9007199254740991,
1198
+ "maximum": 9007199254740991,
1199
+ "description": "Total replies across all pages."
1200
+ }
1201
+ },
1202
+ "required": [
1203
+ "replies",
1204
+ "total"
1205
+ ],
1206
+ "additionalProperties": false
1207
+ }
1208
+ },
1209
+ {
1210
+ "name": "get_comment",
1211
+ "displayName": "Get Comment",
1212
+ "description": "Get the full content of a single comment by ID, including its source code body (for code-snippet comments) or markdown text body (for prose comments). The list endpoints (`list_question_comments`, `list_comment_replies`) only return metadata — call this to read the actual content.",
1213
+ "summary": "Get the full content of a comment",
1214
+ "icon": "message-square",
1215
+ "group": "Comments",
1216
+ "input_schema": {
1217
+ "type": "object",
1218
+ "properties": {
1219
+ "commentId": {
1220
+ "type": "string",
1221
+ "description": "Comment ID — get this from list_question_comments or list_comment_replies."
1222
+ }
1223
+ },
1224
+ "required": [
1225
+ "commentId"
1226
+ ],
1227
+ "additionalProperties": false
1228
+ },
1229
+ "output_schema": {
1230
+ "type": "object",
1231
+ "properties": {
1232
+ "comment": {
1233
+ "type": "object",
1234
+ "properties": {
1235
+ "id": {
1236
+ "type": "string",
1237
+ "description": "Comment ID."
1238
+ },
1239
+ "type": {
1240
+ "type": "string",
1241
+ "description": "Comment type — CODING_QUESTION (anchored to a coding question) or POST (anchored to a post)."
1242
+ },
1243
+ "title": {
1244
+ "type": "string",
1245
+ "description": "Comment title or label, or empty if not set."
1246
+ },
1247
+ "language": {
1248
+ "type": "string",
1249
+ "description": "Programming language label for code-only comments, or empty."
1250
+ },
1251
+ "upvoteCount": {
1252
+ "type": "integer",
1253
+ "minimum": -9007199254740991,
1254
+ "maximum": 9007199254740991,
1255
+ "description": "Number of upvotes."
1256
+ },
1257
+ "downvoteCount": {
1258
+ "type": "integer",
1259
+ "minimum": -9007199254740991,
1260
+ "maximum": 9007199254740991,
1261
+ "description": "Number of downvotes."
1262
+ },
1263
+ "voteScore": {
1264
+ "type": "integer",
1265
+ "minimum": -9007199254740991,
1266
+ "maximum": 9007199254740991,
1267
+ "description": "Combined vote score (upvotes minus downvotes)."
1268
+ },
1269
+ "viewCount": {
1270
+ "type": "integer",
1271
+ "minimum": -9007199254740991,
1272
+ "maximum": 9007199254740991,
1273
+ "description": "View count."
1274
+ },
1275
+ "replyCount": {
1276
+ "type": "integer",
1277
+ "minimum": -9007199254740991,
1278
+ "maximum": 9007199254740991,
1279
+ "description": "Number of replies on this comment."
1280
+ },
1281
+ "isAnonymous": {
1282
+ "type": "boolean",
1283
+ "description": "Whether the comment was posted anonymously."
1284
+ },
1285
+ "postId": {
1286
+ "type": "string",
1287
+ "description": "Post ID this comment is attached to, or empty."
1288
+ },
1289
+ "codingQuestionId": {
1290
+ "type": "string",
1291
+ "description": "Coding question ID this comment is attached to, or empty."
1292
+ },
1293
+ "user": {
1294
+ "type": "object",
1295
+ "properties": {
1296
+ "alias": {
1297
+ "type": "string",
1298
+ "description": "Author username."
1299
+ },
1300
+ "avatar": {
1301
+ "type": "string",
1302
+ "description": "Author avatar URL, or empty if not set."
1303
+ }
1304
+ },
1305
+ "required": [
1306
+ "alias",
1307
+ "avatar"
1308
+ ],
1309
+ "additionalProperties": false,
1310
+ "description": "Author identity."
1311
+ },
1312
+ "displayName": {
1313
+ "type": "string",
1314
+ "description": "Author display name as shown in the UI."
1315
+ },
1316
+ "hasUserUpvoted": {
1317
+ "type": "boolean",
1318
+ "description": "Whether the requesting user has upvoted this comment."
1319
+ },
1320
+ "hasUserDownvoted": {
1321
+ "type": "boolean",
1322
+ "description": "Whether the requesting user has downvoted this comment."
1323
+ },
1324
+ "createdDate": {
1325
+ "type": "string",
1326
+ "description": "ISO 8601 timestamp when the comment was created."
1327
+ },
1328
+ "updatedDate": {
1329
+ "type": "string",
1330
+ "description": "ISO 8601 timestamp when the comment was last updated."
1331
+ },
1332
+ "code": {
1333
+ "type": "string",
1334
+ "description": "Source code body for code-snippet comments, or empty when the comment is a text discussion."
1335
+ },
1336
+ "content": {
1337
+ "type": "string",
1338
+ "description": "Markdown text body for prose comments, or empty when the comment is a code snippet."
1339
+ }
1340
+ },
1341
+ "required": [
1342
+ "id",
1343
+ "type",
1344
+ "title",
1345
+ "language",
1346
+ "upvoteCount",
1347
+ "downvoteCount",
1348
+ "voteScore",
1349
+ "viewCount",
1350
+ "replyCount",
1351
+ "isAnonymous",
1352
+ "postId",
1353
+ "codingQuestionId",
1354
+ "user",
1355
+ "displayName",
1356
+ "hasUserUpvoted",
1357
+ "hasUserDownvoted",
1358
+ "createdDate",
1359
+ "updatedDate",
1360
+ "code",
1361
+ "content"
1362
+ ],
1363
+ "additionalProperties": false
1364
+ }
1365
+ },
1366
+ "required": [
1367
+ "comment"
1368
+ ],
1369
+ "additionalProperties": false
1370
+ }
1371
+ },
1372
+ {
1373
+ "name": "get_current_user",
1374
+ "displayName": "Get Current User",
1375
+ "description": "Get the authenticated Hack2Hire user profile, including the user ID, email, public alias, avatar URL, account type, premium expiration date, account credit balance, account creation date, and last login timestamp.",
1376
+ "summary": "Get the authenticated user profile",
1377
+ "icon": "user",
1378
+ "group": "Account",
1379
+ "input_schema": {
1380
+ "type": "object",
1381
+ "properties": {},
1382
+ "additionalProperties": false
1383
+ },
1384
+ "output_schema": {
1385
+ "type": "object",
1386
+ "properties": {
1387
+ "user": {
1388
+ "type": "object",
1389
+ "properties": {
1390
+ "id": {
1391
+ "type": "string",
1392
+ "description": "User ID."
1393
+ },
1394
+ "email": {
1395
+ "type": "string",
1396
+ "description": "User email address."
1397
+ },
1398
+ "alias": {
1399
+ "type": "string",
1400
+ "description": "Public username displayed on comments and profile pages."
1401
+ },
1402
+ "avatar": {
1403
+ "type": "string",
1404
+ "description": "Avatar image URL, or empty if not set."
1405
+ },
1406
+ "accountType": {
1407
+ "type": "string",
1408
+ "description": "Account ownership type — typically OWNED for self-managed accounts."
1409
+ },
1410
+ "premiumExpiredDate": {
1411
+ "type": "string",
1412
+ "description": "ISO 8601 timestamp when premium access expires, or empty for free accounts."
1413
+ },
1414
+ "balance": {
1415
+ "type": "number",
1416
+ "description": "Account credit balance."
1417
+ },
1418
+ "createdDate": {
1419
+ "type": "string",
1420
+ "description": "ISO 8601 timestamp when the account was created."
1421
+ },
1422
+ "lastLoginDate": {
1423
+ "type": "string",
1424
+ "description": "ISO 8601 timestamp of the last login."
1425
+ }
1426
+ },
1427
+ "required": [
1428
+ "id",
1429
+ "email",
1430
+ "alias",
1431
+ "avatar",
1432
+ "accountType",
1433
+ "premiumExpiredDate",
1434
+ "balance",
1435
+ "createdDate",
1436
+ "lastLoginDate"
1437
+ ],
1438
+ "additionalProperties": false
1439
+ }
1440
+ },
1441
+ "required": [
1442
+ "user"
1443
+ ],
1444
+ "additionalProperties": false
1445
+ }
1446
+ },
1447
+ {
1448
+ "name": "get_subscription",
1449
+ "displayName": "Get Subscription",
1450
+ "description": "Get the authenticated user's subscription details — status (ACTIVE, CANCELED, EXPIRED, PENDING, TRIALING), payment method, plan duration code, current billing period start/end, and price.",
1451
+ "summary": "Get the current subscription details",
1452
+ "icon": "credit-card",
1453
+ "group": "Account",
1454
+ "input_schema": {
1455
+ "type": "object",
1456
+ "properties": {},
1457
+ "additionalProperties": false
1458
+ },
1459
+ "output_schema": {
1460
+ "type": "object",
1461
+ "properties": {
1462
+ "subscription": {
1463
+ "type": "object",
1464
+ "properties": {
1465
+ "id": {
1466
+ "type": "string",
1467
+ "description": "Subscription ID."
1468
+ },
1469
+ "userId": {
1470
+ "type": "string",
1471
+ "description": "Owning user ID."
1472
+ },
1473
+ "status": {
1474
+ "type": "string",
1475
+ "description": "Subscription status — typically ACTIVE, CANCELED, EXPIRED, PENDING, or TRIALING."
1476
+ },
1477
+ "paymentType": {
1478
+ "type": "string",
1479
+ "description": "Payment method used (e.g., CREDIT_CARD)."
1480
+ },
1481
+ "planType": {
1482
+ "type": "string",
1483
+ "description": "Plan duration code (e.g., MONTHLY, THREE_MONTH, ANNUAL)."
1484
+ },
1485
+ "currentPeriodStart": {
1486
+ "type": "string",
1487
+ "description": "ISO 8601 timestamp marking the start of the current billing period."
1488
+ },
1489
+ "currentPeriodEnd": {
1490
+ "type": "string",
1491
+ "description": "ISO 8601 timestamp marking the end of the current billing period."
1492
+ },
1493
+ "price": {
1494
+ "type": "number",
1495
+ "description": "Price charged for the current period, in the plan currency."
1496
+ }
1497
+ },
1498
+ "required": [
1499
+ "id",
1500
+ "userId",
1501
+ "status",
1502
+ "paymentType",
1503
+ "planType",
1504
+ "currentPeriodStart",
1505
+ "currentPeriodEnd",
1506
+ "price"
1507
+ ],
1508
+ "additionalProperties": false
1509
+ }
1510
+ },
1511
+ "required": [
1512
+ "subscription"
1513
+ ],
1514
+ "additionalProperties": false
1515
+ }
1516
+ },
1517
+ {
1518
+ "name": "list_my_bookmarks",
1519
+ "displayName": "List My Bookmarks",
1520
+ "description": "List the authenticated user's bookmarked interview questions. Each record includes the bookmark ID, the bookmarked post ID, when it was bookmarked, and a snapshot of the post (id, type, title, locked status). Optionally filter to a specific postId to check whether the user has bookmarked it.",
1521
+ "summary": "List my bookmarked questions",
1522
+ "icon": "bookmark",
1523
+ "group": "Account",
1524
+ "input_schema": {
1525
+ "type": "object",
1526
+ "properties": {
1527
+ "postId": {
1528
+ "description": "If provided, only return the bookmark record for this specific post ID (or empty if not bookmarked).",
1529
+ "type": "string"
1530
+ },
1531
+ "page": {
1532
+ "description": "Page number (default 1).",
1533
+ "type": "integer",
1534
+ "minimum": 1,
1535
+ "maximum": 9007199254740991
1536
+ },
1537
+ "perPage": {
1538
+ "description": "Results per page (default 25, max 999).",
1539
+ "type": "integer",
1540
+ "minimum": 1,
1541
+ "maximum": 999
1542
+ }
1543
+ },
1544
+ "additionalProperties": false
1545
+ },
1546
+ "output_schema": {
1547
+ "type": "object",
1548
+ "properties": {
1549
+ "bookmarks": {
1550
+ "type": "array",
1551
+ "items": {
1552
+ "type": "object",
1553
+ "properties": {
1554
+ "id": {
1555
+ "type": "string",
1556
+ "description": "Bookmark record ID."
1557
+ },
1558
+ "postId": {
1559
+ "type": "string",
1560
+ "description": "Post ID that was bookmarked."
1561
+ },
1562
+ "userId": {
1563
+ "type": "string",
1564
+ "description": "Owning user ID."
1565
+ },
1566
+ "createdDate": {
1567
+ "type": "string",
1568
+ "description": "ISO 8601 timestamp when the bookmark was created."
1569
+ },
1570
+ "updatedDate": {
1571
+ "type": "string",
1572
+ "description": "ISO 8601 timestamp when the bookmark was last updated."
1573
+ },
1574
+ "post": {
1575
+ "type": "object",
1576
+ "properties": {
1577
+ "id": {
1578
+ "type": "string",
1579
+ "description": "Post ID."
1580
+ },
1581
+ "type": {
1582
+ "type": "string",
1583
+ "description": "Post type (ALGORITHM, SD, ML_SD, BLOG)."
1584
+ },
1585
+ "title": {
1586
+ "type": "string",
1587
+ "description": "Post title."
1588
+ },
1589
+ "isLocked": {
1590
+ "type": "boolean",
1591
+ "description": "Whether the post requires a paid subscription."
1592
+ }
1593
+ },
1594
+ "required": [
1595
+ "id",
1596
+ "type",
1597
+ "title",
1598
+ "isLocked"
1599
+ ],
1600
+ "additionalProperties": false,
1601
+ "description": "Snapshot of the linked post."
1602
+ }
1603
+ },
1604
+ "required": [
1605
+ "id",
1606
+ "postId",
1607
+ "userId",
1608
+ "createdDate",
1609
+ "updatedDate",
1610
+ "post"
1611
+ ],
1612
+ "additionalProperties": false
1613
+ }
1614
+ },
1615
+ "total": {
1616
+ "type": "integer",
1617
+ "minimum": -9007199254740991,
1618
+ "maximum": 9007199254740991,
1619
+ "description": "Total bookmarks matching the filters across all pages."
1620
+ },
1621
+ "page": {
1622
+ "type": "integer",
1623
+ "minimum": -9007199254740991,
1624
+ "maximum": 9007199254740991
1625
+ },
1626
+ "perPage": {
1627
+ "type": "integer",
1628
+ "minimum": -9007199254740991,
1629
+ "maximum": 9007199254740991
1630
+ }
1631
+ },
1632
+ "required": [
1633
+ "bookmarks",
1634
+ "total",
1635
+ "page",
1636
+ "perPage"
1637
+ ],
1638
+ "additionalProperties": false
1639
+ }
1640
+ },
1641
+ {
1642
+ "name": "list_my_visits",
1643
+ "displayName": "List My Visits",
1644
+ "description": "List the authenticated user's recently visited interview questions, with the per-question reading status (NEW, READING, COMPLETED) and a snapshot of each linked post. Use this to find what the user has been working on or to filter by reading progress. Optionally filter to a specific postId to check the user's status on it.",
1645
+ "summary": "List my recently visited questions",
1646
+ "icon": "history",
1647
+ "group": "Account",
1648
+ "input_schema": {
1649
+ "type": "object",
1650
+ "properties": {
1651
+ "postId": {
1652
+ "description": "If provided, only return the visit record for this specific post ID (or empty if not visited).",
1653
+ "type": "string"
1654
+ },
1655
+ "page": {
1656
+ "description": "Page number (default 1).",
1657
+ "type": "integer",
1658
+ "minimum": 1,
1659
+ "maximum": 9007199254740991
1660
+ },
1661
+ "perPage": {
1662
+ "description": "Results per page (default 25, max 999).",
1663
+ "type": "integer",
1664
+ "minimum": 1,
1665
+ "maximum": 999
1666
+ }
1667
+ },
1668
+ "additionalProperties": false
1669
+ },
1670
+ "output_schema": {
1671
+ "type": "object",
1672
+ "properties": {
1673
+ "visits": {
1674
+ "type": "array",
1675
+ "items": {
1676
+ "type": "object",
1677
+ "properties": {
1678
+ "id": {
1679
+ "type": "string",
1680
+ "description": "Visit record ID."
1681
+ },
1682
+ "postId": {
1683
+ "type": "string",
1684
+ "description": "Post ID this record refers to."
1685
+ },
1686
+ "userId": {
1687
+ "type": "string",
1688
+ "description": "Owning user ID."
1689
+ },
1690
+ "readingStatus": {
1691
+ "type": "string",
1692
+ "description": "Reading status — NEW, READING, or COMPLETED."
1693
+ },
1694
+ "isManualSet": {
1695
+ "type": "boolean",
1696
+ "description": "Whether the status was set manually by the user."
1697
+ },
1698
+ "createdDate": {
1699
+ "type": "string",
1700
+ "description": "ISO 8601 timestamp when the record was created."
1701
+ },
1702
+ "updatedDate": {
1703
+ "type": "string",
1704
+ "description": "ISO 8601 timestamp when the record was last updated."
1705
+ },
1706
+ "post": {
1707
+ "type": "object",
1708
+ "properties": {
1709
+ "id": {
1710
+ "type": "string",
1711
+ "description": "Post ID."
1712
+ },
1713
+ "type": {
1714
+ "type": "string",
1715
+ "description": "Post type (ALGORITHM, SD, ML_SD, BLOG)."
1716
+ },
1717
+ "title": {
1718
+ "type": "string",
1719
+ "description": "Post title."
1720
+ },
1721
+ "isLocked": {
1722
+ "type": "boolean",
1723
+ "description": "Whether the post requires a paid subscription."
1724
+ }
1725
+ },
1726
+ "required": [
1727
+ "id",
1728
+ "type",
1729
+ "title",
1730
+ "isLocked"
1731
+ ],
1732
+ "additionalProperties": false,
1733
+ "description": "Snapshot of the linked post."
1734
+ }
1735
+ },
1736
+ "required": [
1737
+ "id",
1738
+ "postId",
1739
+ "userId",
1740
+ "readingStatus",
1741
+ "isManualSet",
1742
+ "createdDate",
1743
+ "updatedDate",
1744
+ "post"
1745
+ ],
1746
+ "additionalProperties": false
1747
+ }
1748
+ },
1749
+ "total": {
1750
+ "type": "integer",
1751
+ "minimum": -9007199254740991,
1752
+ "maximum": 9007199254740991,
1753
+ "description": "Total visit records matching the filters across all pages."
1754
+ },
1755
+ "page": {
1756
+ "type": "integer",
1757
+ "minimum": -9007199254740991,
1758
+ "maximum": 9007199254740991
1759
+ },
1760
+ "perPage": {
1761
+ "type": "integer",
1762
+ "minimum": -9007199254740991,
1763
+ "maximum": 9007199254740991
1764
+ }
1765
+ },
1766
+ "required": [
1767
+ "visits",
1768
+ "total",
1769
+ "page",
1770
+ "perPage"
1771
+ ],
1772
+ "additionalProperties": false
1773
+ }
1774
+ },
1775
+ {
1776
+ "name": "get_completed_question_count",
1777
+ "displayName": "Get Completed Question Count",
1778
+ "description": "Get how many questions the authenticated user has marked as COMPLETED, scoped to a single dimension. Provide exactly one of `company` (uppercase company key), `type` (ALGORITHM, SD, ML_SD, BLOG), or `selectedCollectionKey` (e.g. \"hack2hire-50-picks\"). Useful for showing study progress against a goal.",
1779
+ "summary": "Count completed questions in a scope",
1780
+ "icon": "check-circle",
1781
+ "group": "Account",
1782
+ "input_schema": {
1783
+ "type": "object",
1784
+ "properties": {
1785
+ "company": {
1786
+ "description": "Company key in uppercase (e.g. \"PINTEREST\", \"AMAZON\").",
1787
+ "type": "string"
1788
+ },
1789
+ "type": {
1790
+ "description": "Post type to count completed questions for.",
1791
+ "type": "string",
1792
+ "enum": [
1793
+ "ALGORITHM",
1794
+ "SD",
1795
+ "ML_SD",
1796
+ "BLOG"
1797
+ ]
1798
+ },
1799
+ "selectedCollectionKey": {
1800
+ "description": "Curated collection key (e.g. \"hack2hire-50-picks\").",
1801
+ "type": "string"
1802
+ }
1803
+ },
1804
+ "additionalProperties": false
1805
+ },
1806
+ "output_schema": {
1807
+ "type": "object",
1808
+ "properties": {
1809
+ "total": {
1810
+ "type": "integer",
1811
+ "minimum": -9007199254740991,
1812
+ "maximum": 9007199254740991,
1813
+ "description": "Number of questions marked COMPLETED in the requested scope."
1814
+ }
1815
+ },
1816
+ "required": [
1817
+ "total"
1818
+ ],
1819
+ "additionalProperties": false
1820
+ }
1821
+ }
1822
+ ]
1823
+ }