@smartytalent/mcp-tools 0.1.33-dev.36 → 0.1.33-dev.38

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 (2) hide show
  1. package/dist/tools.json +976 -46
  2. package/package.json +1 -1
package/dist/tools.json CHANGED
@@ -16316,10 +16316,41 @@
16316
16316
  "inputSchema": {
16317
16317
  "type": "object",
16318
16318
  "properties": {
16319
+ "filterStatus": {
16320
+ "type": "string",
16321
+ "description": "Filter by template status.",
16322
+ "enum": [
16323
+ "draft",
16324
+ "active",
16325
+ "archived",
16326
+ "failed",
16327
+ "pending"
16328
+ ]
16329
+ },
16330
+ "filterCreatedFrom": {
16331
+ "type": "string",
16332
+ "description": "Filters results to include only those created from the specified date and time. The value must be in ISO 8601 format."
16333
+ },
16334
+ "filterCreatedTo": {
16335
+ "type": "string",
16336
+ "description": "Filters results to include only those created up to the specified date and time. The value must be in ISO 8601 format."
16337
+ },
16338
+ "filterModifiedFrom": {
16339
+ "type": "string",
16340
+ "description": "Filters results to include only those modified from the specified date and time. The value must be in ISO 8601 format."
16341
+ },
16342
+ "filterModifiedTo": {
16343
+ "type": "string",
16344
+ "description": "Filters results to include only those modified up to the specified date and time. The value must be in ISO 8601 format."
16345
+ },
16319
16346
  "pageSize": {
16320
16347
  "type": "integer",
16321
16348
  "description": "Specifies the number of items to retrieve per page. The maximum value is 100."
16322
16349
  },
16350
+ "pageNumber": {
16351
+ "type": "integer",
16352
+ "description": "Specifies the page number to retrieve. Used for traditional pagination."
16353
+ },
16323
16354
  "pageAfter": {
16324
16355
  "type": "string",
16325
16356
  "description": "Opaque base64-encoded cursor returned by a previous list response, used for forward cursor-based pagination. Pass the value verbatim; do not decode or mutate it."
@@ -16362,21 +16393,23 @@
16362
16393
  },
16363
16394
  "attributes": {
16364
16395
  "title": "AssessmentAttributesSchema",
16396
+ "description": "Template-only attributes for an assessment. The candidate's run of an\nassessment (answers, scores, evaluation, proctoring) lives on the\nAttempt resource - see AttemptAttributesSchema.",
16365
16397
  "type": "object",
16366
16398
  "properties": {
16367
16399
  "status": {
16368
16400
  "type": "string",
16401
+ "description": "Template lifecycle. Candidate-side state (inProgress/submitted/\nevaluated/etc.) lives on attempts. `pending` is a transient state\nset when the AI Generate Step Function is in flight - the row\nflips to `active` once questions land.",
16369
16402
  "enum": [
16370
- "pending",
16371
- "in_progress",
16372
- "completed",
16373
- "evaluated",
16374
- "expired",
16375
- "failed"
16403
+ "draft",
16404
+ "active",
16405
+ "archived",
16406
+ "failed",
16407
+ "pending"
16376
16408
  ]
16377
16409
  },
16378
16410
  "duration": {
16379
- "type": "integer"
16411
+ "type": "integer",
16412
+ "description": "Time limit for the candidate to complete the assessment, in minutes. Defaults to 30."
16380
16413
  },
16381
16414
  "antiCheatingLevel": {
16382
16415
  "type": "string",
@@ -16386,17 +16419,170 @@
16386
16419
  "RIGOROUS"
16387
16420
  ]
16388
16421
  },
16389
- "totalScore": {
16390
- "type": "number"
16391
- },
16392
16422
  "passingScore": {
16393
- "type": "number"
16394
- },
16395
- "passed": {
16396
- "type": "boolean"
16423
+ "type": "number",
16424
+ "description": "Score threshold (0-100) for `evaluation.passed=true` on attempts of this template. Defaults to 60."
16397
16425
  },
16398
16426
  "languageCode": {
16399
- "type": "string"
16427
+ "type": "string",
16428
+ "description": "Default language tag used when the candidate UI doesn't specify one (e.g. 'en-US', 'pl-PL')."
16429
+ },
16430
+ "name": {
16431
+ "type": "object",
16432
+ "description": "Multilingual template name. Keys are locale tags, values are the localized title.",
16433
+ "additionalProperties": {
16434
+ "type": "string"
16435
+ }
16436
+ },
16437
+ "description": {
16438
+ "type": "object",
16439
+ "description": "Multilingual template description shown to the candidate before they start.",
16440
+ "additionalProperties": {
16441
+ "type": "string"
16442
+ }
16443
+ },
16444
+ "questions": {
16445
+ "type": "array",
16446
+ "description": "Question bank. See QuestionSchema for per-type schemas.",
16447
+ "items": {
16448
+ "title": "QuestionSchema",
16449
+ "description": "A single assessment question. Eight question types - the optional\nfields below are interpreted based on `type`. See\n`Question.value` shapes in AnswerSchema for what the candidate\nsends back per type.\n\nSECURITY: `answerKey`, `scoringRubric`, and `options[].isCorrect`\nare stripped server-side before responses are returned to candidates\nvia /v1/guest/attempts/* - they are recruiter-only fields.",
16450
+ "type": "object",
16451
+ "required": [
16452
+ "questionId",
16453
+ "type"
16454
+ ],
16455
+ "properties": {
16456
+ "questionId": {
16457
+ "type": "string",
16458
+ "description": "Stable identifier (e.g. 'q1'). Candidates' answers reference this."
16459
+ },
16460
+ "type": {
16461
+ "type": "string",
16462
+ "enum": [
16463
+ "single-choice",
16464
+ "multiple-choice",
16465
+ "scale",
16466
+ "open-text",
16467
+ "ranking",
16468
+ "situational-judgment",
16469
+ "file-upload",
16470
+ "video-recording"
16471
+ ]
16472
+ },
16473
+ "category": {
16474
+ "type": "string",
16475
+ "description": "Free-form tag for analytics (e.g. 'soft-skills', 'hard-skills', 'general')."
16476
+ },
16477
+ "difficulty": {
16478
+ "type": "string",
16479
+ "enum": [
16480
+ "easy",
16481
+ "medium",
16482
+ "hard"
16483
+ ]
16484
+ },
16485
+ "points": {
16486
+ "type": "number",
16487
+ "description": "Maximum score for this question. Defaults to 1."
16488
+ },
16489
+ "required": {
16490
+ "type": "boolean"
16491
+ },
16492
+ "text": {
16493
+ "type": "object",
16494
+ "description": "Multilingual question text.",
16495
+ "additionalProperties": {
16496
+ "type": "string"
16497
+ }
16498
+ },
16499
+ "options": {
16500
+ "type": "array",
16501
+ "description": "Choices for single-choice / multiple-choice / ranking /\nsituational-judgment. Canonical shape is\n`{ id, text: { locale: string }, isCorrect?: bool }`. Bare\nlocale-map options exist in legacy data but are deprecated.",
16502
+ "items": {
16503
+ "type": "object",
16504
+ "properties": {
16505
+ "id": {
16506
+ "type": "string",
16507
+ "description": "Stable option id - candidates' answers reference this."
16508
+ },
16509
+ "text": {
16510
+ "type": "object",
16511
+ "additionalProperties": {
16512
+ "type": "string"
16513
+ }
16514
+ },
16515
+ "isCorrect": {
16516
+ "type": "boolean",
16517
+ "description": "Recruiter-only. Stripped server-side from guest responses."
16518
+ }
16519
+ }
16520
+ }
16521
+ },
16522
+ "scaleMin": {
16523
+ "type": "integer",
16524
+ "description": "Lower bound for `scale` type questions."
16525
+ },
16526
+ "scaleMax": {
16527
+ "type": "integer",
16528
+ "description": "Upper bound for `scale` type questions."
16529
+ },
16530
+ "scaleLabels": {
16531
+ "type": "object",
16532
+ "description": "Optional labels per step value, multilingual.\n`{ \"1\": { \"en-US\": \"Strongly disagree\" }, \"5\": { \"en-US\": \"Strongly agree\" } }`.",
16533
+ "additionalProperties": {
16534
+ "type": "object",
16535
+ "additionalProperties": {
16536
+ "type": "string"
16537
+ }
16538
+ }
16539
+ },
16540
+ "placeholder": {
16541
+ "type": "object",
16542
+ "description": "Multilingual placeholder text for `open-text` questions.",
16543
+ "additionalProperties": {
16544
+ "type": "string"
16545
+ }
16546
+ },
16547
+ "scenario": {
16548
+ "type": "object",
16549
+ "description": "Multilingual scenario body for `situational-judgment` questions.",
16550
+ "additionalProperties": {
16551
+ "type": "string"
16552
+ }
16553
+ },
16554
+ "acceptedFormats": {
16555
+ "type": "array",
16556
+ "description": "Accepted MIME or extension list for `file-upload` (e.g. ['.pdf', '.png']).",
16557
+ "items": {
16558
+ "type": "string"
16559
+ }
16560
+ },
16561
+ "maxDuration": {
16562
+ "type": "integer",
16563
+ "description": "Maximum recording length in seconds for `video-recording`."
16564
+ },
16565
+ "maxAttempts": {
16566
+ "type": "integer",
16567
+ "description": "Maximum recording retakes the candidate may use on `video-recording`."
16568
+ },
16569
+ "explanation": {
16570
+ "type": "object",
16571
+ "description": "Multilingual explanation shown post-submission on review screens.",
16572
+ "additionalProperties": {
16573
+ "type": "string"
16574
+ }
16575
+ },
16576
+ "answerKey": {
16577
+ "type": "string",
16578
+ "description": "Recruiter-only. The correct option id for `single-choice`. NEVER\nreturned by /v1/guest/attempts/* endpoints."
16579
+ },
16580
+ "scoringRubric": {
16581
+ "type": "string",
16582
+ "description": "Recruiter-only. Free-form scoring rubric the AI evaluator uses\nfor `open-text`. NEVER returned by guest endpoints."
16583
+ }
16584
+ }
16585
+ }
16400
16586
  },
16401
16587
  "timestamps": {
16402
16588
  "title": "ResourceTimestampsSchema",
@@ -16522,21 +16708,23 @@
16522
16708
  },
16523
16709
  "attributes": {
16524
16710
  "title": "AssessmentAttributesSchema",
16711
+ "description": "Template-only attributes for an assessment. The candidate's run of an\nassessment (answers, scores, evaluation, proctoring) lives on the\nAttempt resource - see AttemptAttributesSchema.",
16525
16712
  "type": "object",
16526
16713
  "properties": {
16527
16714
  "status": {
16528
16715
  "type": "string",
16716
+ "description": "Template lifecycle. Candidate-side state (inProgress/submitted/\nevaluated/etc.) lives on attempts. `pending` is a transient state\nset when the AI Generate Step Function is in flight - the row\nflips to `active` once questions land.",
16529
16717
  "enum": [
16530
- "pending",
16531
- "in_progress",
16532
- "completed",
16533
- "evaluated",
16534
- "expired",
16535
- "failed"
16718
+ "draft",
16719
+ "active",
16720
+ "archived",
16721
+ "failed",
16722
+ "pending"
16536
16723
  ]
16537
16724
  },
16538
16725
  "duration": {
16539
- "type": "integer"
16726
+ "type": "integer",
16727
+ "description": "Time limit for the candidate to complete the assessment, in minutes. Defaults to 30."
16540
16728
  },
16541
16729
  "antiCheatingLevel": {
16542
16730
  "type": "string",
@@ -16546,17 +16734,170 @@
16546
16734
  "RIGOROUS"
16547
16735
  ]
16548
16736
  },
16549
- "totalScore": {
16550
- "type": "number"
16551
- },
16552
16737
  "passingScore": {
16553
- "type": "number"
16554
- },
16555
- "passed": {
16556
- "type": "boolean"
16738
+ "type": "number",
16739
+ "description": "Score threshold (0-100) for `evaluation.passed=true` on attempts of this template. Defaults to 60."
16557
16740
  },
16558
16741
  "languageCode": {
16559
- "type": "string"
16742
+ "type": "string",
16743
+ "description": "Default language tag used when the candidate UI doesn't specify one (e.g. 'en-US', 'pl-PL')."
16744
+ },
16745
+ "name": {
16746
+ "type": "object",
16747
+ "description": "Multilingual template name. Keys are locale tags, values are the localized title.",
16748
+ "additionalProperties": {
16749
+ "type": "string"
16750
+ }
16751
+ },
16752
+ "description": {
16753
+ "type": "object",
16754
+ "description": "Multilingual template description shown to the candidate before they start.",
16755
+ "additionalProperties": {
16756
+ "type": "string"
16757
+ }
16758
+ },
16759
+ "questions": {
16760
+ "type": "array",
16761
+ "description": "Question bank. See QuestionSchema for per-type schemas.",
16762
+ "items": {
16763
+ "title": "QuestionSchema",
16764
+ "description": "A single assessment question. Eight question types - the optional\nfields below are interpreted based on `type`. See\n`Question.value` shapes in AnswerSchema for what the candidate\nsends back per type.\n\nSECURITY: `answerKey`, `scoringRubric`, and `options[].isCorrect`\nare stripped server-side before responses are returned to candidates\nvia /v1/guest/attempts/* - they are recruiter-only fields.",
16765
+ "type": "object",
16766
+ "required": [
16767
+ "questionId",
16768
+ "type"
16769
+ ],
16770
+ "properties": {
16771
+ "questionId": {
16772
+ "type": "string",
16773
+ "description": "Stable identifier (e.g. 'q1'). Candidates' answers reference this."
16774
+ },
16775
+ "type": {
16776
+ "type": "string",
16777
+ "enum": [
16778
+ "single-choice",
16779
+ "multiple-choice",
16780
+ "scale",
16781
+ "open-text",
16782
+ "ranking",
16783
+ "situational-judgment",
16784
+ "file-upload",
16785
+ "video-recording"
16786
+ ]
16787
+ },
16788
+ "category": {
16789
+ "type": "string",
16790
+ "description": "Free-form tag for analytics (e.g. 'soft-skills', 'hard-skills', 'general')."
16791
+ },
16792
+ "difficulty": {
16793
+ "type": "string",
16794
+ "enum": [
16795
+ "easy",
16796
+ "medium",
16797
+ "hard"
16798
+ ]
16799
+ },
16800
+ "points": {
16801
+ "type": "number",
16802
+ "description": "Maximum score for this question. Defaults to 1."
16803
+ },
16804
+ "required": {
16805
+ "type": "boolean"
16806
+ },
16807
+ "text": {
16808
+ "type": "object",
16809
+ "description": "Multilingual question text.",
16810
+ "additionalProperties": {
16811
+ "type": "string"
16812
+ }
16813
+ },
16814
+ "options": {
16815
+ "type": "array",
16816
+ "description": "Choices for single-choice / multiple-choice / ranking /\nsituational-judgment. Canonical shape is\n`{ id, text: { locale: string }, isCorrect?: bool }`. Bare\nlocale-map options exist in legacy data but are deprecated.",
16817
+ "items": {
16818
+ "type": "object",
16819
+ "properties": {
16820
+ "id": {
16821
+ "type": "string",
16822
+ "description": "Stable option id - candidates' answers reference this."
16823
+ },
16824
+ "text": {
16825
+ "type": "object",
16826
+ "additionalProperties": {
16827
+ "type": "string"
16828
+ }
16829
+ },
16830
+ "isCorrect": {
16831
+ "type": "boolean",
16832
+ "description": "Recruiter-only. Stripped server-side from guest responses."
16833
+ }
16834
+ }
16835
+ }
16836
+ },
16837
+ "scaleMin": {
16838
+ "type": "integer",
16839
+ "description": "Lower bound for `scale` type questions."
16840
+ },
16841
+ "scaleMax": {
16842
+ "type": "integer",
16843
+ "description": "Upper bound for `scale` type questions."
16844
+ },
16845
+ "scaleLabels": {
16846
+ "type": "object",
16847
+ "description": "Optional labels per step value, multilingual.\n`{ \"1\": { \"en-US\": \"Strongly disagree\" }, \"5\": { \"en-US\": \"Strongly agree\" } }`.",
16848
+ "additionalProperties": {
16849
+ "type": "object",
16850
+ "additionalProperties": {
16851
+ "type": "string"
16852
+ }
16853
+ }
16854
+ },
16855
+ "placeholder": {
16856
+ "type": "object",
16857
+ "description": "Multilingual placeholder text for `open-text` questions.",
16858
+ "additionalProperties": {
16859
+ "type": "string"
16860
+ }
16861
+ },
16862
+ "scenario": {
16863
+ "type": "object",
16864
+ "description": "Multilingual scenario body for `situational-judgment` questions.",
16865
+ "additionalProperties": {
16866
+ "type": "string"
16867
+ }
16868
+ },
16869
+ "acceptedFormats": {
16870
+ "type": "array",
16871
+ "description": "Accepted MIME or extension list for `file-upload` (e.g. ['.pdf', '.png']).",
16872
+ "items": {
16873
+ "type": "string"
16874
+ }
16875
+ },
16876
+ "maxDuration": {
16877
+ "type": "integer",
16878
+ "description": "Maximum recording length in seconds for `video-recording`."
16879
+ },
16880
+ "maxAttempts": {
16881
+ "type": "integer",
16882
+ "description": "Maximum recording retakes the candidate may use on `video-recording`."
16883
+ },
16884
+ "explanation": {
16885
+ "type": "object",
16886
+ "description": "Multilingual explanation shown post-submission on review screens.",
16887
+ "additionalProperties": {
16888
+ "type": "string"
16889
+ }
16890
+ },
16891
+ "answerKey": {
16892
+ "type": "string",
16893
+ "description": "Recruiter-only. The correct option id for `single-choice`. NEVER\nreturned by /v1/guest/attempts/* endpoints."
16894
+ },
16895
+ "scoringRubric": {
16896
+ "type": "string",
16897
+ "description": "Recruiter-only. Free-form scoring rubric the AI evaluator uses\nfor `open-text`. NEVER returned by guest endpoints."
16898
+ }
16899
+ }
16900
+ }
16560
16901
  },
16561
16902
  "timestamps": {
16562
16903
  "title": "ResourceTimestampsSchema",
@@ -16589,7 +16930,16 @@
16589
16930
  "description": "Delete Assessment",
16590
16931
  "inputSchema": {
16591
16932
  "type": "object",
16592
- "properties": {}
16933
+ "properties": {
16934
+ "permanentDelete": {
16935
+ "type": "string",
16936
+ "description": "When `true`, hard-delete the row. Otherwise sets status to archived.",
16937
+ "enum": [
16938
+ "true",
16939
+ "false"
16940
+ ]
16941
+ }
16942
+ }
16593
16943
  },
16594
16944
  "_meta": {
16595
16945
  "method": "DELETE",
@@ -16614,12 +16964,14 @@
16614
16964
  "name": "create_attempt",
16615
16965
  "description": "Create Attempt",
16616
16966
  "inputSchema": {
16967
+ "title": "CreateAttemptRequestBody",
16617
16968
  "type": "object",
16618
16969
  "required": [
16619
16970
  "data"
16620
16971
  ],
16621
16972
  "properties": {
16622
16973
  "data": {
16974
+ "title": "CreateAttemptRequestBodyData",
16623
16975
  "type": "object",
16624
16976
  "required": [
16625
16977
  "type",
@@ -16633,35 +16985,354 @@
16633
16985
  ]
16634
16986
  },
16635
16987
  "attributes": {
16988
+ "title": "AttemptAttributesSchema",
16636
16989
  "type": "object",
16637
16990
  "properties": {
16991
+ "status": {
16992
+ "type": "string",
16993
+ "description": "Attempt lifecycle. Set server-side; only `submitted` is candidate-writable (via guest PATCH).",
16994
+ "enum": [
16995
+ "pending",
16996
+ "inProgress",
16997
+ "submitted",
16998
+ "evaluated",
16999
+ "reviewed",
17000
+ "anonymized",
17001
+ "failed"
17002
+ ]
17003
+ },
16638
17004
  "languageCode": {
16639
- "type": "string"
17005
+ "type": "string",
17006
+ "description": "Locale the candidate is taking the assessment in (e.g. 'en-US')."
16640
17007
  },
16641
- "durationMinutes": {
16642
- "type": "number"
17008
+ "answers": {
17009
+ "type": "array",
17010
+ "description": "Candidate's answers, one per attempted question. See AnswerSchema.",
17011
+ "items": {
17012
+ "title": "AnswerSchema",
17013
+ "description": "A candidate's answer to one question. The `value` shape depends\non the question type - branch on `questionType` to know how to\nread it. File uploads (file-upload / video-recording question\ntypes) live in the separate `files` array, NOT in `value`. This\nmirrors the wire shape used by /v1/guest/attempts/{id} PATCH\nand avoids OpenAPI generator collisions on multiple array\nvariants in a single oneOf.",
17014
+ "type": "object",
17015
+ "required": [
17016
+ "questionId"
17017
+ ],
17018
+ "properties": {
17019
+ "questionId": {
17020
+ "type": "string",
17021
+ "description": "References QuestionSchema.questionId."
17022
+ },
17023
+ "questionType": {
17024
+ "type": "string",
17025
+ "description": "Mirror of the question's type for client-side discrimination.",
17026
+ "enum": [
17027
+ "single-choice",
17028
+ "multiple-choice",
17029
+ "scale",
17030
+ "open-text",
17031
+ "ranking",
17032
+ "situational-judgment",
17033
+ "file-upload",
17034
+ "video-recording"
17035
+ ]
17036
+ },
17037
+ "value": {
17038
+ "description": "Non-file answer payload. Discriminated by questionType:\n single-choice -> string (option id)\n multiple-choice -> string[] (option ids)\n scale -> number\n open-text -> string\n ranking -> string[] (option ids in order)\n situational-judgment -> { best: string; worst: string }\n file-upload -> usually empty / null (use `files`)\n video-recording -> usually empty / null (use `files`)",
17039
+ "oneOf": [
17040
+ {
17041
+ "type": "string",
17042
+ "description": "single-choice / open-text"
17043
+ },
17044
+ {
17045
+ "type": "number",
17046
+ "description": "scale"
17047
+ },
17048
+ {
17049
+ "type": "array",
17050
+ "items": {
17051
+ "type": "string"
17052
+ },
17053
+ "description": "multiple-choice / ranking - array of option ids"
17054
+ },
17055
+ {
17056
+ "type": "object",
17057
+ "description": "situational-judgment",
17058
+ "properties": {
17059
+ "best": {
17060
+ "type": "string"
17061
+ },
17062
+ "worst": {
17063
+ "type": "string"
17064
+ }
17065
+ }
17066
+ }
17067
+ ]
17068
+ },
17069
+ "files": {
17070
+ "type": "array",
17071
+ "description": "File / video uploads for `file-upload` and `video-recording`\nquestion types. Empty for all other types. Files are uploaded\nvia presigned PUT to S3 first; this carries the resulting\nreferences.",
17072
+ "items": {
17073
+ "title": "AnswerFileSchema",
17074
+ "description": "File reference for upload-type answers. fileUrl is the S3 path; FE never writes there directly - server issues presigned PUT.",
17075
+ "type": "object",
17076
+ "properties": {
17077
+ "fileUrl": {
17078
+ "type": "string",
17079
+ "description": "S3 location (s3://bucket/key) - resolves to a presigned download URL on the recruiter review screen."
17080
+ },
17081
+ "originalFilename": {
17082
+ "type": "string"
17083
+ },
17084
+ "contentType": {
17085
+ "type": "string"
17086
+ },
17087
+ "size": {
17088
+ "type": "integer",
17089
+ "description": "Bytes."
17090
+ }
17091
+ }
17092
+ }
17093
+ }
17094
+ }
17095
+ }
17096
+ },
17097
+ "evaluation": {
17098
+ "title": "AttemptEvaluationSchema",
17099
+ "description": "AI scoring output. Populated by the evaluation Step Function\nafter the candidate submits. Hidden from the candidate response\nwhile status is below `evaluated`.",
17100
+ "type": "object",
17101
+ "properties": {
17102
+ "status": {
17103
+ "type": "string",
17104
+ "enum": [
17105
+ "pending",
17106
+ "running",
17107
+ "done",
17108
+ "failed"
17109
+ ]
17110
+ },
17111
+ "overallScore": {
17112
+ "type": "number",
17113
+ "description": "Aggregate score 0-100."
17114
+ },
17115
+ "passingScore": {
17116
+ "type": "number",
17117
+ "description": "Threshold copied from the template at evaluation time."
17118
+ },
17119
+ "passed": {
17120
+ "type": "boolean"
17121
+ },
17122
+ "perQuestion": {
17123
+ "type": "array",
17124
+ "items": {
17125
+ "type": "object",
17126
+ "required": [
17127
+ "questionId",
17128
+ "score"
17129
+ ],
17130
+ "properties": {
17131
+ "questionId": {
17132
+ "type": "string"
17133
+ },
17134
+ "score": {
17135
+ "type": "number"
17136
+ },
17137
+ "maxScore": {
17138
+ "type": "number"
17139
+ },
17140
+ "feedback": {
17141
+ "type": "string",
17142
+ "description": "1-2 sentence explanation in the candidate's language."
17143
+ },
17144
+ "rubricMatched": {
17145
+ "type": "array",
17146
+ "items": {
17147
+ "type": "string"
17148
+ },
17149
+ "description": "Recruiter-only. Stripped from guest responses."
17150
+ }
17151
+ }
17152
+ }
17153
+ },
17154
+ "summary": {
17155
+ "type": "string",
17156
+ "description": "AI-generated 2-3 paragraph plain-language summary of the candidate's performance."
17157
+ },
17158
+ "evaluatedAt": {
17159
+ "type": "string",
17160
+ "format": "date-time"
17161
+ },
17162
+ "evaluatorVersion": {
17163
+ "type": "string"
17164
+ },
17165
+ "error": {
17166
+ "type": "string",
17167
+ "description": "Set only when status=failed."
17168
+ }
17169
+ }
17170
+ },
17171
+ "proctoring": {
17172
+ "title": "AttemptProctoringSchema",
17173
+ "description": "Anti-cheat telemetry collected by the candidate UI. Not used to block, only to inform recruiters.",
17174
+ "type": "object",
17175
+ "properties": {
17176
+ "tabSwitches": {
17177
+ "type": "integer"
17178
+ },
17179
+ "pasteEvents": {
17180
+ "type": "integer"
17181
+ },
17182
+ "focusLost": {
17183
+ "type": "integer",
17184
+ "description": "Total milliseconds the window was unfocused."
17185
+ },
17186
+ "suspiciousFlags": {
17187
+ "type": "array",
17188
+ "items": {
17189
+ "type": "string"
17190
+ }
17191
+ }
17192
+ }
17193
+ },
17194
+ "startedAt": {
17195
+ "type": "string",
17196
+ "format": "date-time",
17197
+ "description": "When the candidate first opened the attempt link (status pending->inProgress)."
17198
+ },
17199
+ "submittedAt": {
17200
+ "type": "string",
17201
+ "format": "date-time",
17202
+ "description": "When the candidate finalised their answers (status inProgress->submitted)."
17203
+ },
17204
+ "evaluatedAt": {
17205
+ "type": "string",
17206
+ "format": "date-time",
17207
+ "description": "When the AI evaluator wrote the evaluation block (status submitted->evaluated)."
16643
17208
  },
16644
17209
  "expiresAt": {
16645
17210
  "type": "string",
16646
- "format": "date-time"
17211
+ "format": "date-time",
17212
+ "description": "Hard cutoff for the candidate to start. After this, /v1/guest/attempts rejects with 410-style errors."
17213
+ },
17214
+ "durationMinutes": {
17215
+ "type": "integer",
17216
+ "description": "Time limit for the candidate to complete the attempt. Inherited from the template by default."
17217
+ },
17218
+ "evaluatorVersion": {
17219
+ "type": "string",
17220
+ "description": "Identifier of the AI scorer that produced the evaluation (e.g. 'gpt-5-mini-v1'). Bumped on re-evaluate."
17221
+ },
17222
+ "assessmentId": {
17223
+ "type": "string",
17224
+ "description": "FK to the assessment template - same id as relationships.assessment.data.id, exposed flat for filter convenience."
17225
+ },
17226
+ "candidateId": {
17227
+ "type": "string",
17228
+ "description": "FK to the candidate - same id as relationships.candidate.data.id."
17229
+ },
17230
+ "timestamps": {
17231
+ "title": "ResourceTimestampsSchema",
17232
+ "type": "object",
17233
+ "properties": {
17234
+ "created": {
17235
+ "type": "string",
17236
+ "format": "date-time"
17237
+ },
17238
+ "modified": {
17239
+ "type": "string",
17240
+ "format": "date-time"
17241
+ }
17242
+ }
16647
17243
  }
16648
17244
  }
16649
17245
  },
16650
17246
  "relationships": {
17247
+ "title": "AttemptRelationshipsSchema",
16651
17248
  "type": "object",
16652
- "required": [
16653
- "assessment",
16654
- "candidate"
16655
- ],
16656
17249
  "properties": {
16657
17250
  "assessment": {
16658
- "type": "object"
17251
+ "title": "AttemptRelationshipsAssessmentSchema",
17252
+ "type": "object",
17253
+ "properties": {
17254
+ "data": {
17255
+ "title": "AttemptRelationshipsAssessmentDataSchema",
17256
+ "type": "object",
17257
+ "properties": {
17258
+ "type": {
17259
+ "type": "string",
17260
+ "enum": [
17261
+ "assessments"
17262
+ ]
17263
+ },
17264
+ "id": {
17265
+ "type": "string"
17266
+ }
17267
+ }
17268
+ }
17269
+ },
17270
+ "description": "FK to the template this attempt is a run of."
16659
17271
  },
16660
17272
  "candidate": {
16661
- "type": "object"
17273
+ "title": "AttemptRelationshipsCandidateSchema",
17274
+ "type": "object",
17275
+ "properties": {
17276
+ "data": {
17277
+ "title": "AttemptRelationshipsCandidateDataSchema",
17278
+ "type": "object",
17279
+ "properties": {
17280
+ "type": {
17281
+ "type": "string",
17282
+ "enum": [
17283
+ "candidates"
17284
+ ]
17285
+ },
17286
+ "id": {
17287
+ "type": "string"
17288
+ }
17289
+ }
17290
+ }
17291
+ }
16662
17292
  },
16663
17293
  "job": {
16664
- "type": "object"
17294
+ "title": "AttemptRelationshipsJobSchema",
17295
+ "type": "object",
17296
+ "properties": {
17297
+ "data": {
17298
+ "title": "AttemptRelationshipsJobDataSchema",
17299
+ "type": "object",
17300
+ "properties": {
17301
+ "type": {
17302
+ "type": "string",
17303
+ "enum": [
17304
+ "jobs"
17305
+ ]
17306
+ },
17307
+ "id": {
17308
+ "type": "string"
17309
+ }
17310
+ }
17311
+ }
17312
+ },
17313
+ "description": "Denormalised from the assessment template - the role this attempt is screening for."
17314
+ },
17315
+ "report": {
17316
+ "title": "AttemptRelationshipsReportSchema",
17317
+ "type": "object",
17318
+ "properties": {
17319
+ "data": {
17320
+ "title": "AttemptRelationshipsReportDataSchema",
17321
+ "type": "object",
17322
+ "properties": {
17323
+ "type": {
17324
+ "type": "string",
17325
+ "enum": [
17326
+ "files"
17327
+ ]
17328
+ },
17329
+ "id": {
17330
+ "type": "string"
17331
+ }
17332
+ }
17333
+ }
17334
+ },
17335
+ "description": "Generated PDF report for this attempt's evaluation. Populated post-evaluation."
16665
17336
  }
16666
17337
  }
16667
17338
  }
@@ -16772,12 +17443,14 @@
16772
17443
  "name": "update_attempt",
16773
17444
  "description": "Update Attempt",
16774
17445
  "inputSchema": {
17446
+ "title": "UpdateAttemptRequestBody",
16775
17447
  "type": "object",
16776
17448
  "required": [
16777
17449
  "data"
16778
17450
  ],
16779
17451
  "properties": {
16780
17452
  "data": {
17453
+ "title": "UpdateAttemptRequestBodyData",
16781
17454
  "type": "object",
16782
17455
  "required": [
16783
17456
  "type",
@@ -16794,10 +17467,263 @@
16794
17467
  "type": "string"
16795
17468
  },
16796
17469
  "attributes": {
16797
- "type": "object"
16798
- },
16799
- "relationships": {
16800
- "type": "object"
17470
+ "title": "AttemptAttributesSchema",
17471
+ "type": "object",
17472
+ "properties": {
17473
+ "status": {
17474
+ "type": "string",
17475
+ "description": "Attempt lifecycle. Set server-side; only `submitted` is candidate-writable (via guest PATCH).",
17476
+ "enum": [
17477
+ "pending",
17478
+ "inProgress",
17479
+ "submitted",
17480
+ "evaluated",
17481
+ "reviewed",
17482
+ "anonymized",
17483
+ "failed"
17484
+ ]
17485
+ },
17486
+ "languageCode": {
17487
+ "type": "string",
17488
+ "description": "Locale the candidate is taking the assessment in (e.g. 'en-US')."
17489
+ },
17490
+ "answers": {
17491
+ "type": "array",
17492
+ "description": "Candidate's answers, one per attempted question. See AnswerSchema.",
17493
+ "items": {
17494
+ "title": "AnswerSchema",
17495
+ "description": "A candidate's answer to one question. The `value` shape depends\non the question type - branch on `questionType` to know how to\nread it. File uploads (file-upload / video-recording question\ntypes) live in the separate `files` array, NOT in `value`. This\nmirrors the wire shape used by /v1/guest/attempts/{id} PATCH\nand avoids OpenAPI generator collisions on multiple array\nvariants in a single oneOf.",
17496
+ "type": "object",
17497
+ "required": [
17498
+ "questionId"
17499
+ ],
17500
+ "properties": {
17501
+ "questionId": {
17502
+ "type": "string",
17503
+ "description": "References QuestionSchema.questionId."
17504
+ },
17505
+ "questionType": {
17506
+ "type": "string",
17507
+ "description": "Mirror of the question's type for client-side discrimination.",
17508
+ "enum": [
17509
+ "single-choice",
17510
+ "multiple-choice",
17511
+ "scale",
17512
+ "open-text",
17513
+ "ranking",
17514
+ "situational-judgment",
17515
+ "file-upload",
17516
+ "video-recording"
17517
+ ]
17518
+ },
17519
+ "value": {
17520
+ "description": "Non-file answer payload. Discriminated by questionType:\n single-choice -> string (option id)\n multiple-choice -> string[] (option ids)\n scale -> number\n open-text -> string\n ranking -> string[] (option ids in order)\n situational-judgment -> { best: string; worst: string }\n file-upload -> usually empty / null (use `files`)\n video-recording -> usually empty / null (use `files`)",
17521
+ "oneOf": [
17522
+ {
17523
+ "type": "string",
17524
+ "description": "single-choice / open-text"
17525
+ },
17526
+ {
17527
+ "type": "number",
17528
+ "description": "scale"
17529
+ },
17530
+ {
17531
+ "type": "array",
17532
+ "items": {
17533
+ "type": "string"
17534
+ },
17535
+ "description": "multiple-choice / ranking - array of option ids"
17536
+ },
17537
+ {
17538
+ "type": "object",
17539
+ "description": "situational-judgment",
17540
+ "properties": {
17541
+ "best": {
17542
+ "type": "string"
17543
+ },
17544
+ "worst": {
17545
+ "type": "string"
17546
+ }
17547
+ }
17548
+ }
17549
+ ]
17550
+ },
17551
+ "files": {
17552
+ "type": "array",
17553
+ "description": "File / video uploads for `file-upload` and `video-recording`\nquestion types. Empty for all other types. Files are uploaded\nvia presigned PUT to S3 first; this carries the resulting\nreferences.",
17554
+ "items": {
17555
+ "title": "AnswerFileSchema",
17556
+ "description": "File reference for upload-type answers. fileUrl is the S3 path; FE never writes there directly - server issues presigned PUT.",
17557
+ "type": "object",
17558
+ "properties": {
17559
+ "fileUrl": {
17560
+ "type": "string",
17561
+ "description": "S3 location (s3://bucket/key) - resolves to a presigned download URL on the recruiter review screen."
17562
+ },
17563
+ "originalFilename": {
17564
+ "type": "string"
17565
+ },
17566
+ "contentType": {
17567
+ "type": "string"
17568
+ },
17569
+ "size": {
17570
+ "type": "integer",
17571
+ "description": "Bytes."
17572
+ }
17573
+ }
17574
+ }
17575
+ }
17576
+ }
17577
+ }
17578
+ },
17579
+ "evaluation": {
17580
+ "title": "AttemptEvaluationSchema",
17581
+ "description": "AI scoring output. Populated by the evaluation Step Function\nafter the candidate submits. Hidden from the candidate response\nwhile status is below `evaluated`.",
17582
+ "type": "object",
17583
+ "properties": {
17584
+ "status": {
17585
+ "type": "string",
17586
+ "enum": [
17587
+ "pending",
17588
+ "running",
17589
+ "done",
17590
+ "failed"
17591
+ ]
17592
+ },
17593
+ "overallScore": {
17594
+ "type": "number",
17595
+ "description": "Aggregate score 0-100."
17596
+ },
17597
+ "passingScore": {
17598
+ "type": "number",
17599
+ "description": "Threshold copied from the template at evaluation time."
17600
+ },
17601
+ "passed": {
17602
+ "type": "boolean"
17603
+ },
17604
+ "perQuestion": {
17605
+ "type": "array",
17606
+ "items": {
17607
+ "type": "object",
17608
+ "required": [
17609
+ "questionId",
17610
+ "score"
17611
+ ],
17612
+ "properties": {
17613
+ "questionId": {
17614
+ "type": "string"
17615
+ },
17616
+ "score": {
17617
+ "type": "number"
17618
+ },
17619
+ "maxScore": {
17620
+ "type": "number"
17621
+ },
17622
+ "feedback": {
17623
+ "type": "string",
17624
+ "description": "1-2 sentence explanation in the candidate's language."
17625
+ },
17626
+ "rubricMatched": {
17627
+ "type": "array",
17628
+ "items": {
17629
+ "type": "string"
17630
+ },
17631
+ "description": "Recruiter-only. Stripped from guest responses."
17632
+ }
17633
+ }
17634
+ }
17635
+ },
17636
+ "summary": {
17637
+ "type": "string",
17638
+ "description": "AI-generated 2-3 paragraph plain-language summary of the candidate's performance."
17639
+ },
17640
+ "evaluatedAt": {
17641
+ "type": "string",
17642
+ "format": "date-time"
17643
+ },
17644
+ "evaluatorVersion": {
17645
+ "type": "string"
17646
+ },
17647
+ "error": {
17648
+ "type": "string",
17649
+ "description": "Set only when status=failed."
17650
+ }
17651
+ }
17652
+ },
17653
+ "proctoring": {
17654
+ "title": "AttemptProctoringSchema",
17655
+ "description": "Anti-cheat telemetry collected by the candidate UI. Not used to block, only to inform recruiters.",
17656
+ "type": "object",
17657
+ "properties": {
17658
+ "tabSwitches": {
17659
+ "type": "integer"
17660
+ },
17661
+ "pasteEvents": {
17662
+ "type": "integer"
17663
+ },
17664
+ "focusLost": {
17665
+ "type": "integer",
17666
+ "description": "Total milliseconds the window was unfocused."
17667
+ },
17668
+ "suspiciousFlags": {
17669
+ "type": "array",
17670
+ "items": {
17671
+ "type": "string"
17672
+ }
17673
+ }
17674
+ }
17675
+ },
17676
+ "startedAt": {
17677
+ "type": "string",
17678
+ "format": "date-time",
17679
+ "description": "When the candidate first opened the attempt link (status pending->inProgress)."
17680
+ },
17681
+ "submittedAt": {
17682
+ "type": "string",
17683
+ "format": "date-time",
17684
+ "description": "When the candidate finalised their answers (status inProgress->submitted)."
17685
+ },
17686
+ "evaluatedAt": {
17687
+ "type": "string",
17688
+ "format": "date-time",
17689
+ "description": "When the AI evaluator wrote the evaluation block (status submitted->evaluated)."
17690
+ },
17691
+ "expiresAt": {
17692
+ "type": "string",
17693
+ "format": "date-time",
17694
+ "description": "Hard cutoff for the candidate to start. After this, /v1/guest/attempts rejects with 410-style errors."
17695
+ },
17696
+ "durationMinutes": {
17697
+ "type": "integer",
17698
+ "description": "Time limit for the candidate to complete the attempt. Inherited from the template by default."
17699
+ },
17700
+ "evaluatorVersion": {
17701
+ "type": "string",
17702
+ "description": "Identifier of the AI scorer that produced the evaluation (e.g. 'gpt-5-mini-v1'). Bumped on re-evaluate."
17703
+ },
17704
+ "assessmentId": {
17705
+ "type": "string",
17706
+ "description": "FK to the assessment template - same id as relationships.assessment.data.id, exposed flat for filter convenience."
17707
+ },
17708
+ "candidateId": {
17709
+ "type": "string",
17710
+ "description": "FK to the candidate - same id as relationships.candidate.data.id."
17711
+ },
17712
+ "timestamps": {
17713
+ "title": "ResourceTimestampsSchema",
17714
+ "type": "object",
17715
+ "properties": {
17716
+ "created": {
17717
+ "type": "string",
17718
+ "format": "date-time"
17719
+ },
17720
+ "modified": {
17721
+ "type": "string",
17722
+ "format": "date-time"
17723
+ }
17724
+ }
17725
+ }
17726
+ }
16801
17727
  }
16802
17728
  }
16803
17729
  }
@@ -16899,6 +17825,8 @@
16899
17825
  }
16900
17826
  },
16901
17827
  "meta": {
17828
+ "title": "GuestMetaSchema",
17829
+ "description": "Auth context for unauthenticated /v1/guest/attempts/* writes.\ntenantId scopes the call; accessToken is the per-attempt token\nissued at create time. Token mismatch returns 404 (intentionally\nindistinguishable from \"attempt not found\" so we don't leak\nattempt existence).",
16902
17830
  "type": "object",
16903
17831
  "required": [
16904
17832
  "tenantId",
@@ -17039,6 +17967,8 @@
17039
17967
  }
17040
17968
  },
17041
17969
  "meta": {
17970
+ "title": "GuestMetaSchema",
17971
+ "description": "Auth context for unauthenticated /v1/guest/attempts/* writes.\ntenantId scopes the call; accessToken is the per-attempt token\nissued at create time. Token mismatch returns 404 (intentionally\nindistinguishable from \"attempt not found\" so we don't leak\nattempt existence).",
17042
17972
  "type": "object",
17043
17973
  "required": [
17044
17974
  "tenantId",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smartytalent/mcp-tools",
3
- "version": "0.1.33-dev.36",
3
+ "version": "0.1.33-dev.38",
4
4
  "description": "MCP tool definitions for SmartyTalent API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",