archal 0.9.8 → 0.9.9

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 (39) hide show
  1. package/README.md +163 -93
  2. package/bin/archal.cjs +3 -3
  3. package/dist/index.cjs +82301 -0
  4. package/dist/index.d.cts +1 -0
  5. package/dist/seed/dynamic-generator.cjs +45640 -0
  6. package/dist/seed/dynamic-generator.d.cts +67 -0
  7. package/dist/vitest/chunk-RKYS44AS.js +2216 -0
  8. package/dist/vitest/chunk-YJICENME.js +1230 -0
  9. package/dist/vitest/chunk-YV6BH6DO.js +45974 -0
  10. package/dist/vitest/index.cjs +51963 -0
  11. package/dist/vitest/index.d.ts +398 -0
  12. package/dist/vitest/index.js +2669 -0
  13. package/dist/vitest/runtime/hosted-session-reaper.cjs +29349 -0
  14. package/dist/vitest/runtime/hosted-session-reaper.d.ts +2 -0
  15. package/dist/vitest/runtime/hosted-session-reaper.js +58 -0
  16. package/dist/vitest/runtime/setup-files.d.ts +2 -0
  17. package/dist/vitest/runtime/setup-files.js +27 -0
  18. package/dist/vitest/src-JGHX6UKK.js +94 -0
  19. package/package.json +15 -19
  20. package/twin-assets/discord/fidelity.json +113 -0
  21. package/twin-assets/discord/tools.json +1953 -0
  22. package/twin-assets/github/fidelity.json +13 -0
  23. package/twin-assets/github/tools.json +21818 -0
  24. package/twin-assets/google-workspace/fidelity.json +19 -0
  25. package/twin-assets/google-workspace/tools.json +10191 -0
  26. package/twin-assets/jira/fidelity.json +40 -0
  27. package/twin-assets/jira/tools.json +17387 -0
  28. package/twin-assets/linear/fidelity.json +18 -0
  29. package/twin-assets/linear/tools.json +6496 -0
  30. package/twin-assets/ramp/fidelity.json +22 -0
  31. package/twin-assets/ramp/tools.json +2610 -0
  32. package/twin-assets/slack/fidelity.json +20 -0
  33. package/twin-assets/slack/tools.json +7301 -0
  34. package/twin-assets/stripe/fidelity.json +22 -0
  35. package/twin-assets/stripe/tools.json +15284 -0
  36. package/twin-assets/supabase/fidelity.json +13 -0
  37. package/twin-assets/supabase/tools.json +2973 -0
  38. package/dist/vitest.d.ts +0 -1
  39. package/dist/vitest.js +0 -23
@@ -0,0 +1,2610 @@
1
+ {
2
+ "twin": "ramp",
3
+ "tools": [
4
+ {
5
+ "name": "activate-card",
6
+ "description": "Activate a card by its last four digits",
7
+ "inputSchema": {
8
+ "type": "object",
9
+ "description": "Activate a card by its last four digits.\n\nActivates an unactivated card for the user. If the last four digits do not match\nany of the user's cards, returns available card last-four values so the correct\ndigits can be provided.",
10
+ "properties": {
11
+ "last_four": {
12
+ "title": "Last Four",
13
+ "type": "string"
14
+ }
15
+ },
16
+ "required": [
17
+ "last_four"
18
+ ],
19
+ "title": "ActivateCard"
20
+ },
21
+ "hidden": false
22
+ },
23
+ {
24
+ "name": "answer-policy-question",
25
+ "description": "Get an answer to a question about the expense policy or funds (amount, restrictions, etc)",
26
+ "inputSchema": {
27
+ "type": "object",
28
+ "description": "Get an answer to a question about the expense policy or funds (amount, restrictions, etc).\n\nUse this tool when the user asks about expense policy rules, spending limits,\nfund restrictions, or whether certain purchases are allowed under company policy.",
29
+ "properties": {
30
+ "include_restrictions": {
31
+ "default": true,
32
+ "title": "Include Restrictions",
33
+ "type": "boolean"
34
+ },
35
+ "question": {
36
+ "title": "Question",
37
+ "type": "string"
38
+ }
39
+ },
40
+ "required": [
41
+ "question"
42
+ ],
43
+ "title": "AnswerPolicyQuestion"
44
+ },
45
+ "hidden": false,
46
+ "annotations": {
47
+ "readOnlyHint": true
48
+ }
49
+ },
50
+ {
51
+ "name": "approve-or-reject-bill",
52
+ "description": "Approve or reject a bill that requires approval",
53
+ "inputSchema": {
54
+ "type": "object",
55
+ "description": "Approve or reject a bill that requires approval.\n\nUse this tool when the user wants to approve or reject a bill that is pending their approval.\nYou can find bills for approval by the current user by using the GetBillsForApproval tool.\nBefore using this tool, ask the user if they would like to include a reason or note\nfor their decision. Reason is optional, so you may call this tool with no reason\nif the user declines to provide one.",
56
+ "properties": {
57
+ "action_type": {
58
+ "enum": [
59
+ "APPROVE",
60
+ "REJECT"
61
+ ],
62
+ "title": "Action Type",
63
+ "type": "string"
64
+ },
65
+ "bill_id": {
66
+ "description": "The UUID of the bill to approve or reject.",
67
+ "title": "Bill Id",
68
+ "type": "string"
69
+ },
70
+ "reason": {
71
+ "default": null,
72
+ "nullable": true,
73
+ "title": "Reason",
74
+ "type": "string"
75
+ }
76
+ },
77
+ "required": [
78
+ "action_type",
79
+ "bill_id"
80
+ ],
81
+ "title": "ApproveOrRejectBill"
82
+ },
83
+ "hidden": false
84
+ },
85
+ {
86
+ "name": "approve-or-reject-reimbursement",
87
+ "description": "Approve or reject an employee reimbursement request for an out-of-pocket expense",
88
+ "inputSchema": {
89
+ "type": "object",
90
+ "description": "Approve or reject an employee reimbursement request for an out-of-pocket expense.\n\nUse this tool when the user wants to approve or reject a reimbursement.\nReimbursements are employee-submitted requests for reimbursement of out-of-pocket expenses.\nCommon usage patterns: \"approve this reimbursement\", \"reject the expense\", \"yes, reimburse them\", \"no, don't reimburse this\".\nThis tool is specifically for employee reimbursements and is NOT for approving/rejecting card transactions\nor unified requests (spend allocations, purchase orders).",
91
+ "properties": {
92
+ "action": {
93
+ "description": "The action to take on the reimbursement: approve or reject.",
94
+ "enum": [
95
+ "approve",
96
+ "reject"
97
+ ],
98
+ "title": "ReimbursementAction",
99
+ "type": "string"
100
+ },
101
+ "reimbursement_id": {
102
+ "description": "The ID of the reimbursement to approve or reject.",
103
+ "title": "Reimbursement Id",
104
+ "type": "string"
105
+ },
106
+ "thoughts": {
107
+ "default": null,
108
+ "description": "Your internal reasoning about why you chose to approve or reject this reimbursement. This helps explain your decision-making process and is used for audit purposes. Include relevant details like policy compliance, receipt quality, amount reasonableness, etc.",
109
+ "nullable": true,
110
+ "title": "Thoughts",
111
+ "type": "string"
112
+ },
113
+ "user_reason": {
114
+ "default": null,
115
+ "description": "Optional notes from the user explaining their approval or rejection decision. This will be recorded in the approval history and may be visible to other approvers and the reimbursement submitter. Use this when the user provides context like 'approve it because...' or 'reject because...'.",
116
+ "nullable": true,
117
+ "title": "User Reason",
118
+ "type": "string"
119
+ }
120
+ },
121
+ "required": [
122
+ "action",
123
+ "reimbursement_id"
124
+ ],
125
+ "title": "ApproveOrRejectReimbursement"
126
+ },
127
+ "hidden": false
128
+ },
129
+ {
130
+ "name": "approve-or-reject-request",
131
+ "description": "Approve or reject a pending unified request for spend allocation (fund), purchase order, or procurement approval",
132
+ "inputSchema": {
133
+ "type": "object",
134
+ "description": "Approve or reject a pending unified request for spend allocation (fund), purchase order, or procurement approval.\n\nUse this tool when a user wants to approve or reject a specific request they have identified or referenced.\nCommon usage patterns: \"approve this request\", \"reject this request\", \"accept the request\", \"deny this\",\n\"authorize this\", \"yes approve it\", \"decline this request\".\nThis tool is specifically for unified requests (spend allocations, purchase orders, procurement approvals)\nand is NOT for approving expenses like corporate card transactions or reimbursements.\nThe user must have proper approval authority for the request.",
135
+ "properties": {
136
+ "action": {
137
+ "enum": [
138
+ "APPROVE",
139
+ "REJECT"
140
+ ],
141
+ "title": "RequestAction",
142
+ "type": "string",
143
+ "description": "The action to perform: APPROVE or REJECT"
144
+ },
145
+ "request_uuid": {
146
+ "description": "The unified request to act upon",
147
+ "nullable": true,
148
+ "title": "Request Uuid",
149
+ "type": "string"
150
+ },
151
+ "thoughts": {
152
+ "description": "Your reasoning about whether to approve or reject this request. Consider: did the user clearly indicate whether they wanted to approve or reject?",
153
+ "title": "Thoughts",
154
+ "type": "string"
155
+ }
156
+ },
157
+ "required": [
158
+ "action",
159
+ "request_uuid",
160
+ "thoughts"
161
+ ],
162
+ "title": "ApproveOrRejectRequest"
163
+ },
164
+ "hidden": false
165
+ },
166
+ {
167
+ "name": "approve-or-reject-transaction",
168
+ "description": "Approve or reject a transaction awaiting your review",
169
+ "inputSchema": {
170
+ "type": "object",
171
+ "description": "Approve or reject a transaction awaiting your review.\n\nUse this tool when the user wants to approve a transaction, send it back for\nrevisions, or require the cardholder to repay the full amount. The acting user\nmust have the proper approval authority for the transaction. If the user provides\na written justification (e.g., “reject this because the receipt is missing”), pass\nthat verbatim via `user_reason`—do not invent your own rationale.",
172
+ "properties": {
173
+ "action": {
174
+ "enum": [
175
+ "APPROVE",
176
+ "REJECT_AND_REQUEST_CHANGES",
177
+ "REJECT_AND_REQUEST_FULL_REPAYMENT"
178
+ ],
179
+ "title": "TransactionAction",
180
+ "type": "string",
181
+ "description": "Action to perform: APPROVE, REJECT_AND_REQUEST_CHANGES (send back to cardholder with requested revisions), or REJECT_AND_REQUEST_FULL_REPAYMENT (require employee repayment)."
182
+ },
183
+ "thoughts": {
184
+ "description": "Your internal reasoning summarizing what the user asked for and why this tool should be invoked.",
185
+ "title": "Thoughts",
186
+ "type": "string"
187
+ },
188
+ "transaction_id": {
189
+ "description": "The transaction to act on",
190
+ "title": "Transaction Id",
191
+ "type": "string"
192
+ },
193
+ "user_reason": {
194
+ "default": null,
195
+ "description": "Explanation written by the USER for their decision. Required when requesting changes or full repayment, and should only contain text the user explicitly provided.",
196
+ "nullable": true,
197
+ "title": "User Reason",
198
+ "type": "string"
199
+ }
200
+ },
201
+ "required": [
202
+ "action",
203
+ "thoughts",
204
+ "transaction_id"
205
+ ],
206
+ "title": "ApproveOrRejectTransaction"
207
+ },
208
+ "hidden": false
209
+ },
210
+ {
211
+ "name": "ask-help-center",
212
+ "description": "Ask a question and get an answer from Ramp's help center",
213
+ "inputSchema": {
214
+ "type": "object",
215
+ "description": "Ask a question and get an answer from Ramp's help center.\n\nThis tool uses an LLM to read through relevant help center articles and extract\nthe most pertinent information to answer your question. It provides synthesized answers\ncombining multiple sources with extracted relevant snippets and source attribution.\n\nIMPORTANT: If you have other tools that can actually perform the action a user is asking about,\nyou should use those tools instead of or in addition to providing help center information.\nFor example, if a user says \"how can I upload a receipt\", you should tell them they can\nupload a receipt in the chat directly, even if you also find a help center article that\nexplains how to upload receipts in the web app.\n\nUse this tool when you need to:\n- Ask specific questions about Ramp products and features\n- Get answers that combine information from multiple articles\n- Understand complex workflows\n- Get direct answers rather than searching through full articles",
216
+ "properties": {
217
+ "question": {
218
+ "description": "The question to ask about Ramp's help center documentation",
219
+ "title": "Question",
220
+ "type": "string"
221
+ }
222
+ },
223
+ "required": [
224
+ "question"
225
+ ],
226
+ "title": "AskHelpCenter"
227
+ },
228
+ "hidden": false,
229
+ "annotations": {
230
+ "readOnlyHint": true
231
+ }
232
+ },
233
+ {
234
+ "name": "attach-receipt-to-transaction",
235
+ "description": "Attach an existing receipt to a transaction",
236
+ "inputSchema": {
237
+ "type": "object",
238
+ "description": "Attach an existing receipt to a transaction.\n\nUse this tool when the user wants to link an already-created receipt to a specific transaction.\nThe receipt must have been previously created (e.g. via CreateReceipt).",
239
+ "properties": {
240
+ "receipt_uuid": {
241
+ "description": "UUID of the receipt to attach. This should come from a previously created receipt.",
242
+ "title": "Receipt Uuid",
243
+ "type": "string"
244
+ },
245
+ "transaction_uuid": {
246
+ "description": "UUID of the transaction to attach the receipt to.",
247
+ "title": "Transaction Uuid",
248
+ "type": "string"
249
+ }
250
+ },
251
+ "required": [
252
+ "receipt_uuid",
253
+ "transaction_uuid"
254
+ ],
255
+ "title": "AttachReceiptToTransaction"
256
+ },
257
+ "hidden": false
258
+ },
259
+ {
260
+ "name": "create-trip",
261
+ "description": "Create a new trip for the acting user",
262
+ "inputSchema": {
263
+ "type": "object",
264
+ "description": "Create a new trip for the acting user.",
265
+ "properties": {
266
+ "are_trip_dates_from_booking_receipt_or_user_input": {
267
+ "title": "Are Trip Dates From Booking Receipt Or User Input",
268
+ "type": "boolean"
269
+ },
270
+ "destinations": {
271
+ "description": "Required trip destination(s). Infer from available evidence (for example merchant/location context, travel context, or user input). Ask the user only when destination cannot be inferred.",
272
+ "items": {
273
+ "properties": {
274
+ "end_date": {
275
+ "default": null,
276
+ "description": "End date for this location",
277
+ "format": "date-time",
278
+ "nullable": true,
279
+ "title": "End Date",
280
+ "type": "string"
281
+ },
282
+ "location": {
283
+ "properties": {
284
+ "city": {
285
+ "default": null,
286
+ "description": "City name",
287
+ "nullable": true,
288
+ "title": "City",
289
+ "type": "string"
290
+ },
291
+ "country": {
292
+ "default": null,
293
+ "description": "Country name",
294
+ "nullable": true,
295
+ "title": "Country",
296
+ "type": "string"
297
+ },
298
+ "lat": {
299
+ "default": 0,
300
+ "description": "Latitude of the location",
301
+ "title": "Lat",
302
+ "type": "number"
303
+ },
304
+ "lng": {
305
+ "default": 0,
306
+ "description": "Longitude of the location",
307
+ "title": "Lng",
308
+ "type": "number"
309
+ },
310
+ "state": {
311
+ "default": null,
312
+ "description": "State name",
313
+ "nullable": true,
314
+ "title": "State",
315
+ "type": "string"
316
+ },
317
+ "timezone": {
318
+ "default": null,
319
+ "description": "Timezone",
320
+ "nullable": true,
321
+ "title": "Timezone",
322
+ "type": "string"
323
+ }
324
+ },
325
+ "title": "TravelLocation",
326
+ "type": "object",
327
+ "description": "The location details"
328
+ },
329
+ "start_date": {
330
+ "default": null,
331
+ "description": "Start date for this location",
332
+ "format": "date-time",
333
+ "nullable": true,
334
+ "title": "Start Date",
335
+ "type": "string"
336
+ }
337
+ },
338
+ "required": [
339
+ "location"
340
+ ],
341
+ "title": "TripLocation",
342
+ "type": "object"
343
+ },
344
+ "title": "Destinations",
345
+ "type": "array"
346
+ },
347
+ "end_date": {
348
+ "default": null,
349
+ "description": "End date of the trip",
350
+ "format": "date-time",
351
+ "nullable": true,
352
+ "title": "End Date",
353
+ "type": "string"
354
+ },
355
+ "name": {
356
+ "description": "Name for the trip (e.g., 'NYC Conference', 'Client Visit'). Follow patterns for user's other trip names that have similar purpose, use month/yyyy to disambiguate if multiple trips with same name",
357
+ "title": "Name",
358
+ "type": "string"
359
+ },
360
+ "rationale": {
361
+ "description": "How you found out or inferred the field values for the trip",
362
+ "title": "Rationale",
363
+ "type": "string"
364
+ },
365
+ "start_date": {
366
+ "default": null,
367
+ "description": "Start date of the trip",
368
+ "format": "date-time",
369
+ "nullable": true,
370
+ "title": "Start Date",
371
+ "type": "string"
372
+ },
373
+ "trip_purpose": {
374
+ "default": null,
375
+ "description": "The purpose of the trip for incorporating into the trip name",
376
+ "nullable": true,
377
+ "title": "Trip Purpose",
378
+ "type": "string"
379
+ }
380
+ },
381
+ "required": [
382
+ "are_trip_dates_from_booking_receipt_or_user_input",
383
+ "name",
384
+ "rationale"
385
+ ],
386
+ "title": "CreateTrip"
387
+ },
388
+ "hidden": false
389
+ },
390
+ {
391
+ "name": "edit-reimbursement",
392
+ "description": "Edit a reimbursement field",
393
+ "inputSchema": {
394
+ "type": "object",
395
+ "description": "Edit a reimbursement field. The only supported edit types are memo, funds, and accounting category.\nThis tool allows updating specific fields of a reimbursement that the user has\npermission to edit. Provide at least one field to update.\n\nAfter successfully editing the reimbursement:\n1. Check missing_items to see what is required\n2. For items that CAN be filled via the agent (memo, accounting categories, funds):\n - Request the missing item from the user\n - Include the relevant suggestions (suggested_memos, suggested_codings, or suggested_funds)\n3. For items that CANNOT be filled via the agent (trip, attendee, mileage_locations, or if all agent-fillable items are complete):\n - ALWAYS provide the reimbursement_link URL as a clickable link in your response\n - Format it as markdown: [link text](reimbursement_link)\n - Example: \"You can complete your reimbursement here: [Complete reimbursement](https://app.ramp.com/s/reimbursements/xxx)\"\n\nItems are requested in this order: receipt, memo, accounting categories, funds.\n\nIf there are no missing items left, the agent should confirm with the user if they want to submit the reimbursement.",
396
+ "properties": {
397
+ "fund_uuid": {
398
+ "default": null,
399
+ "description": "UUID of the fund (spend allocation) to charge this reimbursement to",
400
+ "nullable": true,
401
+ "title": "Fund Uuid",
402
+ "type": "string"
403
+ },
404
+ "memo": {
405
+ "default": null,
406
+ "description": "The memo/description text to set for the reimbursement",
407
+ "nullable": true,
408
+ "title": "Memo",
409
+ "type": "string"
410
+ },
411
+ "reimbursement_uuid": {
412
+ "description": "UUID of the reimbursement to modify. Call GetReimbursements to determine the UUID if it cannot be obtained from context.",
413
+ "nullable": true,
414
+ "title": "Reimbursement Uuid",
415
+ "type": "string"
416
+ },
417
+ "tracking_category_selections": {
418
+ "default": null,
419
+ "description": "Tracking category assignments (e.g., category, department, project). Must provide both category and option_selection. For BOOLEAN and SINGLE_CHOICE tracking categories, option_selection should be the UUID of the tracking category option. For FREE_FORM_TEXT tracking categories, option_selection should be the freeform text value.",
420
+ "items": {
421
+ "description": "A tracking category assignment with both category and option.",
422
+ "properties": {
423
+ "category_uuid": {
424
+ "description": "UUID of the tracking category (the type of classification, e.g., 'Category', 'Department', or 'Project')",
425
+ "title": "Category Uuid",
426
+ "type": "string"
427
+ },
428
+ "option_selection": {
429
+ "description": "For BOOLEAN and SINGLE_CHOICE tracking categories: UUID of the specific tracking category option (e.g., UUID of 'Engineering' within 'Department'), or None to explicitly clear the field (only allowed when the business permits it). For FREE_FORM_TEXT tracking categories: the freeform text value to use (e.g., 'Project Alpha').",
430
+ "nullable": true,
431
+ "title": "Option Selection",
432
+ "type": "string"
433
+ },
434
+ "prefilled_suggested_coding_uuid": {
435
+ "default": null,
436
+ "description": "UUID of the suggested coding that was shown to the user as a prefill. Only set when the user is accepting a prefilled suggestion.",
437
+ "nullable": true,
438
+ "title": "Prefilled Suggested Coding Uuid",
439
+ "type": "string"
440
+ }
441
+ },
442
+ "required": [
443
+ "category_uuid",
444
+ "option_selection"
445
+ ],
446
+ "title": "TrackingCategorySelection",
447
+ "type": "object"
448
+ },
449
+ "nullable": true,
450
+ "title": "Tracking Category Selections",
451
+ "type": "array"
452
+ }
453
+ },
454
+ "required": [
455
+ "reimbursement_uuid"
456
+ ],
457
+ "title": "EditReimbursement"
458
+ },
459
+ "hidden": false
460
+ },
461
+ {
462
+ "name": "edit-transaction",
463
+ "description": "Edit a transaction field",
464
+ "inputSchema": {
465
+ "type": "object",
466
+ "description": "Edit a transaction field. The supported edit types are memo, funds, accounting category, trip, and attendees.\nThis tool allows updating specific fields of a transaction that the user has\npermission to edit. Provide at least one field to update.\n\nAfter successfully editing the transaction:\n1. Check missing_items to see what is required\n2. For items that CAN be filled via the agent (memo, accounting categories, funds, trip, attendees):\n - Request the missing item from the user\n - Include the relevant suggestions (suggested_memos, suggested_codings, or suggested_funds)\n3. For items that CANNOT be filled via the agent (if all agent-fillable items are complete):\n - ALWAYS provide the transaction_link URL as a clickable link in your response\n - Format it as markdown: [link text](transaction_link)\n - Example: \"You can complete your transaction here: [Complete transaction](https://app.ramp.com/transactions/xxx)\"\n\nItems are requested in this order: receipt, memo, accounting categories, funds, trip, attendees.\n\nIf there are no missing items left, the agent should confirm with the user if they want to submit the transaction.",
467
+ "properties": {
468
+ "attendee_selections": {
469
+ "description": "Attendee selections: attendee_uuids (Ramp users), non_ramp_attendees (external people), include_self_as_attendee (auto-add self). This is an upsert - provide the complete set.",
470
+ "properties": {
471
+ "attendee_uuids": {
472
+ "default": null,
473
+ "description": "UUIDs of Ramp user attendees. Obtainable via SearchUser or GetOrgChart or calendar data.",
474
+ "items": {
475
+ "type": "string"
476
+ },
477
+ "nullable": true,
478
+ "title": "Attendee Uuids",
479
+ "type": "array"
480
+ },
481
+ "include_self_as_attendee": {
482
+ "default": true,
483
+ "description": "Whether to automatically include the acting user as an attendee.",
484
+ "title": "Include Self As Attendee",
485
+ "type": "boolean"
486
+ },
487
+ "non_ramp_attendees": {
488
+ "default": null,
489
+ "description": "Free-text names of non-Ramp attendees. Last resort when SearchUser cannot find a matching Ramp user.",
490
+ "items": {
491
+ "type": "string"
492
+ },
493
+ "nullable": true,
494
+ "title": "Non Ramp Attendees",
495
+ "type": "array"
496
+ }
497
+ },
498
+ "title": "AttendeeSelections",
499
+ "type": "object",
500
+ "default": null,
501
+ "nullable": true
502
+ },
503
+ "fund_uuid": {
504
+ "default": null,
505
+ "description": "UUID of the fund (spend allocation) to charge this transaction to.",
506
+ "nullable": true,
507
+ "title": "Fund Uuid",
508
+ "type": "string"
509
+ },
510
+ "memo": {
511
+ "default": null,
512
+ "description": "The memo/description text to set for the transaction. Set to empty string ('') if clearing the memo.",
513
+ "nullable": true,
514
+ "title": "Memo",
515
+ "type": "string"
516
+ },
517
+ "tracking_category_selections": {
518
+ "default": null,
519
+ "description": "Tracking/accounting category assignments (e.g., category, department, project). Must provide both category and option_selection. For BOOLEAN and SINGLE_CHOICE tracking categories, option_selection should be the UUID of the tracking category option, or None to clear the field (only when user explicitly replies 'none' and the business allows it). For FREE_FORM_TEXT tracking categories, option_selection should be the freeform text value. Retrieve these from codings you suggest to the user. Only the codings that are to be updated need to be provided.",
520
+ "items": {
521
+ "description": "A tracking category assignment with both category and option.",
522
+ "properties": {
523
+ "category_uuid": {
524
+ "description": "UUID of the tracking category (the type of classification, e.g., 'Category', 'Department', or 'Project')",
525
+ "title": "Category Uuid",
526
+ "type": "string"
527
+ },
528
+ "option_selection": {
529
+ "description": "For BOOLEAN and SINGLE_CHOICE tracking categories: UUID of the specific tracking category option (e.g., UUID of 'Engineering' within 'Department'), or None to explicitly clear the field (only allowed when the business permits it). For FREE_FORM_TEXT tracking categories: the freeform text value to use (e.g., 'Project Alpha').",
530
+ "nullable": true,
531
+ "title": "Option Selection",
532
+ "type": "string"
533
+ },
534
+ "prefilled_suggested_coding_uuid": {
535
+ "default": null,
536
+ "description": "UUID of the suggested coding that was shown to the user as a prefill. Only set when the user is accepting a prefilled suggestion.",
537
+ "nullable": true,
538
+ "title": "Prefilled Suggested Coding Uuid",
539
+ "type": "string"
540
+ }
541
+ },
542
+ "required": [
543
+ "category_uuid",
544
+ "option_selection"
545
+ ],
546
+ "title": "TrackingCategorySelection",
547
+ "type": "object"
548
+ },
549
+ "nullable": true,
550
+ "title": "Tracking Category Selections",
551
+ "type": "array"
552
+ },
553
+ "transaction_uuid": {
554
+ "description": "UUID of the transaction to modify. Call GetUserTransactions to determine the UUID if it cannot be obtained from context.",
555
+ "nullable": true,
556
+ "title": "Transaction Uuid",
557
+ "type": "string"
558
+ },
559
+ "trip_selection": {
560
+ "description": "Trip selection configuration. Provide a trip_uuid to assign/change the transaction to a trip (or None to remove), or set mark_not_part_of_trip to True to mark as not part of any trip.",
561
+ "properties": {
562
+ "mark_not_part_of_trip": {
563
+ "default": false,
564
+ "description": "Whether to mark the transaction as not part of any trip (satisfies trip policy requirements without assigning to a specific trip).",
565
+ "title": "Mark Not Part Of Trip",
566
+ "type": "boolean"
567
+ },
568
+ "trip_uuid": {
569
+ "default": null,
570
+ "description": "UUID of the trip to assign this transaction to. Obtain a valid UUID from one of the Get/Create trip tools. Set to None to remove the trip from the transaction.",
571
+ "nullable": true,
572
+ "title": "Trip Uuid",
573
+ "type": "string"
574
+ }
575
+ },
576
+ "title": "TripSelection",
577
+ "type": "object",
578
+ "default": null,
579
+ "nullable": true
580
+ },
581
+ "user_submitted_fields": {
582
+ "description": "Fields where the user DIRECTLY provided the specific value in their message. Only include a field if the user explicitly stated that exact value. Do NOT include fields where you (the agent) decided/inferred the value based on context. Examples - INCLUDE in user_submitted_fields: User says 'Team lunch' -> include memo. User says 'Use the Travel fund' -> include fund_uuid. Examples - DO NOT INCLUDE: You decide to change fund based on memo content -> do not include fund_uuid. You infer tracking category from transaction details -> do not include tracking_category_selections.",
583
+ "items": {
584
+ "description": "Editable fields for EditTransaction tool.",
585
+ "enum": [
586
+ "attendee_selections",
587
+ "attendee_uuids",
588
+ "fund_uuid",
589
+ "memo",
590
+ "tracking_category_selections",
591
+ "trip_selection"
592
+ ],
593
+ "title": "EditableTransactionField",
594
+ "type": "string"
595
+ },
596
+ "title": "User Submitted Fields",
597
+ "type": "array"
598
+ }
599
+ },
600
+ "required": [
601
+ "transaction_uuid"
602
+ ],
603
+ "title": "EditTransaction"
604
+ },
605
+ "hidden": false
606
+ },
607
+ {
608
+ "name": "get-agent-card-creds",
609
+ "description": "Get a one-time payment token for a fund",
610
+ "inputSchema": {
611
+ "type": "object",
612
+ "description": "Get a one-time payment token for a fund. Handles card enrollment and purchase instructions automatically.",
613
+ "properties": {
614
+ "amount": {
615
+ "description": "Transaction amount as decimal string (e.g., '45.00')",
616
+ "title": "Amount",
617
+ "type": "string"
618
+ },
619
+ "currency_code": {
620
+ "description": "ISO 4217 currency code (e.g., 'USD')",
621
+ "title": "Currency Code",
622
+ "type": "string"
623
+ },
624
+ "fund_id": {
625
+ "description": "UUID of the fund to pay from",
626
+ "title": "Fund Id",
627
+ "type": "string"
628
+ },
629
+ "merchant_country_code": {
630
+ "description": "2-letter country code (e.g., 'US')",
631
+ "title": "Merchant Country Code",
632
+ "type": "string"
633
+ },
634
+ "merchant_name": {
635
+ "description": "Merchant name (e.g., 'Figma Inc')",
636
+ "title": "Merchant Name",
637
+ "type": "string"
638
+ },
639
+ "merchant_url": {
640
+ "description": "Merchant website URL (e.g., 'https://figma.com')",
641
+ "title": "Merchant Url",
642
+ "type": "string"
643
+ }
644
+ },
645
+ "required": [
646
+ "amount",
647
+ "currency_code",
648
+ "fund_id",
649
+ "merchant_country_code",
650
+ "merchant_name",
651
+ "merchant_url"
652
+ ],
653
+ "title": "GetAgentCardCreds"
654
+ },
655
+ "hidden": false,
656
+ "annotations": {
657
+ "readOnlyHint": true
658
+ }
659
+ },
660
+ {
661
+ "name": "get-agent-card-funds",
662
+ "description": "List funds that can be used for agent card payments",
663
+ "inputSchema": {
664
+ "type": "object",
665
+ "description": "List funds that can be used for agent card payments. Returns eligible funds with available balance.",
666
+ "properties": {},
667
+ "title": "GetAgentCardFunds"
668
+ },
669
+ "hidden": false,
670
+ "annotations": {
671
+ "readOnlyHint": true
672
+ }
673
+ },
674
+ {
675
+ "name": "get-bill-details",
676
+ "description": "Get comprehensive details about a specific bill including payment status, approval status, and all metadata",
677
+ "inputSchema": {
678
+ "type": "object",
679
+ "description": "Get comprehensive details about a specific bill including payment status, approval status, and all metadata.\n\nThis tool retrieves submitted bills only. For draft (provisional) bills that have\nnot yet been submitted, use GetDraftBillDetails instead.",
680
+ "properties": {
681
+ "bill_id": {
682
+ "description": "The UUID of the bill to retrieve details for",
683
+ "title": "Bill Id",
684
+ "type": "string"
685
+ }
686
+ },
687
+ "required": [
688
+ "bill_id"
689
+ ],
690
+ "title": "GetBillDetails"
691
+ },
692
+ "hidden": false,
693
+ "annotations": {
694
+ "readOnlyHint": true
695
+ }
696
+ },
697
+ {
698
+ "name": "get-bill-invoices",
699
+ "description": "Retrieve invoice file attachments for a bill",
700
+ "inputSchema": {
701
+ "type": "object",
702
+ "description": "Retrieve invoice file attachments for a bill.",
703
+ "properties": {
704
+ "bill_id": {
705
+ "description": "The UUID of the bill to retrieve invoices for",
706
+ "title": "Bill Id",
707
+ "type": "string"
708
+ }
709
+ },
710
+ "required": [
711
+ "bill_id"
712
+ ],
713
+ "title": "GetBillInvoices"
714
+ },
715
+ "hidden": false,
716
+ "annotations": {
717
+ "readOnlyHint": true
718
+ }
719
+ },
720
+ {
721
+ "name": "get-bills-for-approval",
722
+ "description": "Get bills that are pending approval from the current user",
723
+ "inputSchema": {
724
+ "type": "object",
725
+ "description": "Get bills that are pending approval from the current user.\n\nUse this tool when the user wants to see bills they need to approve or asks about\npending approvals. This returns only bills where the user is the next approver in\nthe approval chain.",
726
+ "properties": {
727
+ "limit": {
728
+ "default": 10,
729
+ "description": "Maximum number of bills to return",
730
+ "maximum": 50,
731
+ "minimum": 1,
732
+ "title": "Limit",
733
+ "type": "integer"
734
+ },
735
+ "page_cursor": {
736
+ "default": null,
737
+ "description": "Pagination cursor from a previous response's next_page_cursor. The only valid string values are encrypted cursor tokens from a previous response (long strings starting with 'gAAAAA'). For the first page, for no more results, or for anything that is not one of those encrypted tokens, pass None (never the string 'None').",
738
+ "nullable": true,
739
+ "title": "Page Cursor",
740
+ "type": "string"
741
+ }
742
+ },
743
+ "title": "GetBillsForApproval"
744
+ },
745
+ "hidden": false,
746
+ "annotations": {
747
+ "readOnlyHint": true
748
+ }
749
+ },
750
+ {
751
+ "name": "get-bookings",
752
+ "description": "Retrieves flight and hotel bookings for the user",
753
+ "inputSchema": {
754
+ "type": "object",
755
+ "description": "Retrieves flight and hotel bookings for the user.\n\nUse this tool when users ask about their:\n- Hotel bookings or reservations\n- Flight bookings\n- Travel bookings in general\n- Status of a recent booking request\n\nReturns both confirmed bookings and pending/failed booking requests in unified lists.\nCheck the status field: PENDING_APPROVAL, PROCESSING, or FAILED indicate unconfirmed requests.\nIf status is FAILED, the error_message field explains why.\n\nIMPORTANT: Cancelled and failed bookings do NOT block new bookings. If a user has a prior\nbooking with status CANCELLED or a failed request with status FAILED, they can still make\na new booking for the same route, hotel, or trip. Always allow the user to proceed with a\nnew search and booking when they ask to rebook after a cancellation or failure.\n\nIMPORTANT: When presenting results, use Rich Object References (ROR) format:\n- For hotels: [Hotel Name](hotel-uuid) e.g., [Marriott Downtown](abc123-def456)\n- For flights: [Flight Info](flight-uuid) e.g., [UA 100 SFO → JFK](abc123-def456)\nThe 'id' field in each booking is the UUID to use in the reference.",
756
+ "properties": {
757
+ "include_flights": {
758
+ "default": true,
759
+ "description": "Whether to include flight bookings",
760
+ "title": "Include Flights",
761
+ "type": "boolean"
762
+ },
763
+ "include_hotels": {
764
+ "default": true,
765
+ "description": "Whether to include hotel bookings",
766
+ "title": "Include Hotels",
767
+ "type": "boolean"
768
+ },
769
+ "limit": {
770
+ "default": 20,
771
+ "description": "Maximum number of bookings to return per type",
772
+ "maximum": 50,
773
+ "minimum": 1,
774
+ "title": "Limit",
775
+ "type": "integer"
776
+ }
777
+ },
778
+ "title": "GetBookings"
779
+ },
780
+ "hidden": false,
781
+ "annotations": {
782
+ "readOnlyHint": true
783
+ }
784
+ },
785
+ {
786
+ "name": "get-candidate-trips-for-transaction",
787
+ "description": "Fetch trips that could be relevant to the current transaction",
788
+ "inputSchema": {
789
+ "type": "object",
790
+ "description": "Fetch trips that could be relevant to the current transaction.\nReturns ongoing, upcoming, and recently completed trips for the acting user.",
791
+ "properties": {},
792
+ "title": "GetCandidateTripsForTransaction"
793
+ },
794
+ "hidden": false,
795
+ "annotations": {
796
+ "readOnlyHint": true
797
+ }
798
+ },
799
+ {
800
+ "name": "get-decline-explanation",
801
+ "description": "Get a detailed explanation of why a transaction was declined",
802
+ "inputSchema": {
803
+ "type": "object",
804
+ "description": "Get a detailed explanation of why a transaction was declined.\n\nIMPORTANT: Only call this tool on transactions that are already known to be\ndeclined. If you need to find declined transactions first, use GetUserTransactions\nwith state='declined'. Do NOT call this on approved or pending transactions —\nit will return a not_declined error.\n\nThis tool provides:\n- Human-readable explanation of the decline reason\n- Structured remediation actions the user or admin can take\n- The SMS/push notification message sent to the user\n- Transaction details (amount, merchant, card, timestamp)\n\nUse this when a user asks why their transaction was declined or what they can do about it.",
805
+ "properties": {
806
+ "transaction_uuid": {
807
+ "description": "The UUID of the declined transaction",
808
+ "title": "Transaction Uuid",
809
+ "type": "string"
810
+ }
811
+ },
812
+ "required": [
813
+ "transaction_uuid"
814
+ ],
815
+ "title": "GetDeclineExplanation"
816
+ },
817
+ "hidden": false,
818
+ "annotations": {
819
+ "readOnlyHint": true
820
+ }
821
+ },
822
+ {
823
+ "name": "get-draft-bill-details",
824
+ "description": "Get details about a draft (provisional) bill that has not yet been submitted for approval",
825
+ "inputSchema": {
826
+ "type": "object",
827
+ "description": "Get details about a draft (provisional) bill that has not yet been submitted for approval.\n\nUse this tool when the user is viewing a draft bill page (e.g. /bill-pay/bills/list/edit-draft/{uuid})\nor asks about a bill that hasn't been submitted yet. Draft bills are also known as provisional bills.\nReturns vendor info, amount, line items, memo, and other metadata for the draft.",
828
+ "properties": {
829
+ "bill_id": {
830
+ "description": "The UUID of the draft bill to retrieve details for",
831
+ "title": "Bill Id",
832
+ "type": "string"
833
+ }
834
+ },
835
+ "required": [
836
+ "bill_id"
837
+ ],
838
+ "title": "GetDraftBillDetails"
839
+ },
840
+ "hidden": false,
841
+ "annotations": {
842
+ "readOnlyHint": true
843
+ }
844
+ },
845
+ {
846
+ "name": "get-flight-booking-locations",
847
+ "description": "Resolves locations (airports/cities) available for booking a flight from user intent",
848
+ "inputSchema": {
849
+ "type": "object",
850
+ "description": "Resolves locations (airports/cities) available for booking a flight from user intent.\n\nReturns locations where flights can be booked from or to, which may include:\n- Individual airports (e.g., JFK, SFO, LAX)\n- City groups with multiple airports (e.g., NYC includes JFK, LGA, EWR)\n- Major travel destinations with flight availability",
851
+ "properties": {
852
+ "limit": {
853
+ "default": 5,
854
+ "description": "Maximum number of location results to return",
855
+ "title": "Limit",
856
+ "type": "integer"
857
+ },
858
+ "location_type": {
859
+ "default": "none",
860
+ "description": "Specific location type to search for: 'airport' for airports only, 'city' for cities only, or 'none' for both",
861
+ "enum": [
862
+ "airport",
863
+ "city",
864
+ "none"
865
+ ],
866
+ "title": "Location Type",
867
+ "type": "string"
868
+ },
869
+ "query": {
870
+ "description": "The location query from user intent (e.g., 'SF', 'San Francisco', 'NYC', 'JFK', 'Boston Logan')",
871
+ "title": "Query",
872
+ "type": "string"
873
+ }
874
+ },
875
+ "required": [
876
+ "query"
877
+ ],
878
+ "title": "GetFlightBookingLocations"
879
+ },
880
+ "hidden": false,
881
+ "annotations": {
882
+ "readOnlyHint": true
883
+ }
884
+ },
885
+ {
886
+ "name": "get-full-transaction-metadata",
887
+ "description": "View all details, memos, funds, and receipts for a specific transaction",
888
+ "inputSchema": {
889
+ "type": "object",
890
+ "description": "View all details, memos, funds, and receipts for a specific transaction.",
891
+ "properties": {
892
+ "id": {
893
+ "description": "Transaction id (from tool calls or metadata)",
894
+ "nullable": true,
895
+ "title": "Id",
896
+ "type": "string"
897
+ }
898
+ },
899
+ "required": [
900
+ "id"
901
+ ],
902
+ "title": "GetFullTransactionMetadata"
903
+ },
904
+ "hidden": false,
905
+ "annotations": {
906
+ "readOnlyHint": true
907
+ }
908
+ },
909
+ {
910
+ "name": "get-funds",
911
+ "description": "Retrieve funds (also known as cards or budgets) that belong to the current user or other users",
912
+ "inputSchema": {
913
+ "type": "object",
914
+ "description": "Retrieve funds (also known as cards or budgets) that belong to the current user or other users.\n\nUse this tool when users ask about:\n- Their funds, cards, or budgets (e.g., \"show me my funds\", \"what cards do I have?\")\n- What they can buy from a specific fund\n- Why their card is locked or not working (e.g., \"why is my card locked?\", \"why can't I use my card?\")\n- Fund balances, restrictions, or lock status\n\nWhen querying for a specific person's funds, first call GetOrgChart to get their UUID,\nthen use the user_uuids parameter. For queries about \"my funds\", use funds_to_retrieve=MY_FUNDS.\nTo search by fund name, use search_by_fund_display_name.\nFor card lock questions, set include_lock_info=True to get lock details.",
915
+ "properties": {
916
+ "for_transaction_id": {
917
+ "default": null,
918
+ "description": "When provided, retrieves only the funds that this specific transaction can be reassigned to. When this parameter is set, all other parameters are ignored.",
919
+ "nullable": true,
920
+ "title": "For Transaction Id",
921
+ "type": "string"
922
+ },
923
+ "funds_to_retrieve": {
924
+ "enum": [
925
+ "ALL_FUNDS",
926
+ "MY_FUNDS"
927
+ ],
928
+ "title": "FundsToRetrieve",
929
+ "type": "string",
930
+ "default": null,
931
+ "description": "Scope of funds to retrieve. Use MY_FUNDS ONLY when the user explicitly asks about 'my funds'. Use ALL_FUNDS for general searches (e.g., searching by fund name) or when no specific owner is mentioned. NEVER use this parameter when the user mentions a specific person - use user_uuids instead.",
932
+ "nullable": true
933
+ },
934
+ "include_balance": {
935
+ "default": false,
936
+ "description": "Did the user request something related to the balance of the fund? Is the user trying to check if they used their funds this week/month?",
937
+ "title": "Include Balance",
938
+ "type": "boolean"
939
+ },
940
+ "include_lock_info": {
941
+ "default": false,
942
+ "description": "Set to True when the user asks about locks (e.g., 'why is my card locked?', 'how do I unlock my card?'). Adds lock details for the fund and its members, including information about missing policy items.",
943
+ "title": "Include Lock Info",
944
+ "type": "boolean"
945
+ },
946
+ "include_members": {
947
+ "default": false,
948
+ "description": "Set to True when the user asks about who has access to a fund or who are the members of a fund. Returns the names of users who have access to each fund.",
949
+ "title": "Include Members",
950
+ "type": "boolean"
951
+ },
952
+ "include_restrictions": {
953
+ "default": false,
954
+ "description": "Set to True when the user asks about fund restrictions such as: merchant/vendor whitelists or blacklists, category whitelists or blacklists, transaction amount limits, auto-lock dates, expiration dates, or interval/reset dates. This adds a lot of context, so only include it if needed.",
955
+ "title": "Include Restrictions",
956
+ "type": "boolean"
957
+ },
958
+ "search_by_fund_display_name": {
959
+ "default": null,
960
+ "description": "Text search to filter by the display name of the fund itself (e.g., 'office supplies', 'conference budget', 'equipment fund'). This searches what the fund is called, NOT who owns it. NEVER use this parameter when the user mentions a person's name - person names are not fund display names. If searching by owner/person, use user_uuids instead.",
961
+ "nullable": true,
962
+ "title": "Search By Fund Display Name",
963
+ "type": "string"
964
+ },
965
+ "state": {
966
+ "enum": [
967
+ "ACTIVE",
968
+ "ARCHIVED",
969
+ "TERMINATED"
970
+ ],
971
+ "title": "SpendAllocationState",
972
+ "type": "string",
973
+ "default": null,
974
+ "description": "Filter funds by state. Use ACTIVE to show only active funds, TERMINATED for terminated funds, or ARCHIVED for archived funds. If not provided, returns funds in all states.",
975
+ "nullable": true
976
+ },
977
+ "user_uuids": {
978
+ "default": null,
979
+ "description": "REQUIRED when the user asks about a specific person's funds. Workflow: (1) First call GetOrgChart to find the person and get their UUID, (2) Then pass that UUID here. Use this for any query mentioning a person by name. Do NOT use funds_to_retrieve when asking about a specific person.",
980
+ "items": {
981
+ "type": "string"
982
+ },
983
+ "nullable": true,
984
+ "title": "User Uuids",
985
+ "type": "array"
986
+ }
987
+ },
988
+ "title": "GetUserFunds"
989
+ },
990
+ "hidden": false,
991
+ "annotations": {
992
+ "readOnlyHint": true
993
+ }
994
+ },
995
+ {
996
+ "name": "get-org-chart",
997
+ "description": "Get org chart for a user, including reporting chain and direct reports",
998
+ "inputSchema": {
999
+ "type": "object",
1000
+ "description": "Get org chart for a user, including reporting chain and direct reports.\n\nThis tool provides comprehensive org chart visibility including:\n- The user's position in the organization\n- Their direct reports (team members)\n- Their reporting chain (managers up the hierarchy)\n\nUse this tool whenever the user asks anything about their manager, team, or direct reports.",
1001
+ "properties": {
1002
+ "user_id": {
1003
+ "default": null,
1004
+ "nullable": true,
1005
+ "title": "User Id",
1006
+ "type": "string"
1007
+ }
1008
+ },
1009
+ "title": "GetOrgChart"
1010
+ },
1011
+ "hidden": false,
1012
+ "annotations": {
1013
+ "readOnlyHint": true
1014
+ }
1015
+ },
1016
+ {
1017
+ "name": "get-purchase-order-details",
1018
+ "description": "Get comprehensive details about a specific purchase order",
1019
+ "inputSchema": {
1020
+ "type": "object",
1021
+ "description": "Get comprehensive details about a specific purchase order.\n\nUse this after SearchPurchaseOrders or when the user is already looking at a\npurchase order and wants more detail, such as status, amount, vendor, or the\nassociated unified request ID.",
1022
+ "properties": {
1023
+ "purchase_order_id": {
1024
+ "description": "The UUID of the purchase order to retrieve details for",
1025
+ "title": "Purchase Order Id",
1026
+ "type": "string"
1027
+ }
1028
+ },
1029
+ "required": [
1030
+ "purchase_order_id"
1031
+ ],
1032
+ "title": "GetPurchaseOrderDetails"
1033
+ },
1034
+ "hidden": false,
1035
+ "annotations": {
1036
+ "readOnlyHint": true
1037
+ }
1038
+ },
1039
+ {
1040
+ "name": "get-reimbursements",
1041
+ "description": "Search and retrieve reimbursements with filters for users, text search,",
1042
+ "inputSchema": {
1043
+ "type": "object",
1044
+ "description": "Search and retrieve reimbursements with filters for users, text search,\namount ranges, tags, date ranges, approval status, and policy assessments.",
1045
+ "properties": {
1046
+ "from_date": {
1047
+ "default": null,
1048
+ "description": "Start date for filtering reimbursements (YYYY-MM-DD format). Only reimbursements on or after this date will be included. Example: '2024-01-01'",
1049
+ "nullable": true,
1050
+ "title": "From Date",
1051
+ "type": "string"
1052
+ },
1053
+ "include_policy_assessment": {
1054
+ "default": false,
1055
+ "description": "Whether to include AI policy assessment data for each reimbursement. When true, each reimbursement will include a recommended approval action (approve/reject/review) and rationale based on policy analysis. Most useful when reviewing reimbursements for approval.",
1056
+ "title": "Include Policy Assessment",
1057
+ "type": "boolean"
1058
+ },
1059
+ "include_suggestions": {
1060
+ "default": false,
1061
+ "description": "Whether to include suggested memos, codings, and funds for each reimbursement. Only set to true when the user specifically needs autofill suggestions for missing items. Increases response time significantly.",
1062
+ "title": "Include Suggestions",
1063
+ "type": "boolean"
1064
+ },
1065
+ "next_page_cursor": {
1066
+ "default": null,
1067
+ "description": "Use this to get additional results after the first page. Copy the next_page_cursor value from a previous response to continue pagination",
1068
+ "nullable": true,
1069
+ "title": "Next Page Cursor",
1070
+ "type": "string"
1071
+ },
1072
+ "page_size": {
1073
+ "default": 50,
1074
+ "description": "Maximum number of reimbursements to return in one request. Use smaller numbers (10-25) for quick overviews, larger numbers (50-200) for comprehensive analysis",
1075
+ "maximum": 200,
1076
+ "minimum": 1,
1077
+ "title": "Page Size",
1078
+ "type": "integer"
1079
+ },
1080
+ "reimbursement_uuids": {
1081
+ "default": null,
1082
+ "description": "Filter by reimbursement UUIDs",
1083
+ "items": {
1084
+ "type": "string"
1085
+ },
1086
+ "nullable": true,
1087
+ "title": "Reimbursement Uuids",
1088
+ "type": "array"
1089
+ },
1090
+ "reimbursements_to_retrieve": {
1091
+ "description": "Which set of reimbursements to search: your own reimbursements, reimbursements awaiting your approval, or all reimbursements across the business",
1092
+ "enum": [
1093
+ "all_reimbursements",
1094
+ "my_reimbursements",
1095
+ "reimbursements_awaiting_my_approval"
1096
+ ],
1097
+ "title": "ReimbursementSearchScope",
1098
+ "type": "string",
1099
+ "default": "all_reimbursements"
1100
+ },
1101
+ "search_string": {
1102
+ "default": null,
1103
+ "description": "Search for reimbursements with matching merchant name, memo, or cardholder name",
1104
+ "nullable": true,
1105
+ "title": "Search String",
1106
+ "type": "string"
1107
+ },
1108
+ "tags": {
1109
+ "default": null,
1110
+ "description": "Additional tag-based filters. Currently supported tags are User, ReimbursementStatus, ReimbursementType, SpendAllocation, and Merchant. You must provide actual UUIDs or enum values - use other tools to retrieve UUIDs if needed. If a user is asking about their own reimbursements, you must include the User tag with their UUID.",
1111
+ "items": {
1112
+ "description": "Tag filter for reimbursements search.\n\nFor user, spend allocation, and merchant tags, the tag_id should be the UUID of the entity.\nFor reimbursement status and type tags, the tag_id should be the enum value of the status or type.\n\nIMPORTANT: You must provide actual UUIDs or enum values as tag_id. Do NOT use empty strings, placeholder values,\nor generic identifiers - these will cause errors. If you don't know a UUID, use other available tools to retrieve it first.\n\nAvailable reimbursement statuses: DRAFT, PENDING, APPROVED, AWAITING_PAYMENT, PROCESSING, PAID, REJECTED, PAYMENT_ERROR\nAvailable reimbursement types: OUT_OF_POCKET, MILEAGE, PER_DIEM",
1113
+ "properties": {
1114
+ "tag_id": {
1115
+ "description": "The UUID or enum value for the tag",
1116
+ "title": "Tag Id",
1117
+ "type": "string"
1118
+ },
1119
+ "tag_type": {
1120
+ "description": "The type of search tag category",
1121
+ "enum": [
1122
+ "merchant",
1123
+ "reimbursement_status",
1124
+ "reimbursement_type",
1125
+ "spend_allocation",
1126
+ "user"
1127
+ ],
1128
+ "title": "Tag Type",
1129
+ "type": "string"
1130
+ }
1131
+ },
1132
+ "required": [
1133
+ "tag_id",
1134
+ "tag_type"
1135
+ ],
1136
+ "title": "ReimbursementTag",
1137
+ "type": "object"
1138
+ },
1139
+ "nullable": true,
1140
+ "title": "Tags",
1141
+ "type": "array"
1142
+ },
1143
+ "to_date": {
1144
+ "default": null,
1145
+ "description": "End date for filtering reimbursements (YYYY-MM-DD format). Only reimbursements on or before this date will be included. Example: '2024-12-31'",
1146
+ "nullable": true,
1147
+ "title": "To Date",
1148
+ "type": "string"
1149
+ }
1150
+ },
1151
+ "title": "GetReimbursements"
1152
+ },
1153
+ "hidden": false,
1154
+ "annotations": {
1155
+ "readOnlyHint": true
1156
+ }
1157
+ },
1158
+ {
1159
+ "name": "get-reimbursements-for-approval",
1160
+ "description": "Get reimbursements that require approval from the current user",
1161
+ "inputSchema": {
1162
+ "type": "object",
1163
+ "description": "Get reimbursements that require approval from the current user.\n\nReturns employee reimbursements pending approval. Use specifically when users ask about reimbursements, out-of-pocket expenses, or reimbursement approvals. Do NOT use for card transactions or purchase requests. Only shows reimbursements where the current user has approval authority. Includes policy assessment data and recommended actions to help with approval decisions.",
1164
+ "properties": {
1165
+ "limit": {
1166
+ "default": 10,
1167
+ "title": "Limit",
1168
+ "type": "integer"
1169
+ }
1170
+ },
1171
+ "title": "GetReimbursementsForApproval"
1172
+ },
1173
+ "hidden": false,
1174
+ "annotations": {
1175
+ "readOnlyHint": true
1176
+ }
1177
+ },
1178
+ {
1179
+ "name": "get-requests-to-review",
1180
+ "description": "Get requests that require the current user's review and approval",
1181
+ "inputSchema": {
1182
+ "type": "object",
1183
+ "description": "Get requests that require the current user's review and approval.\n\nReturns purchase orders, fund requests, and procurement requests pending approval. Essential tool for checking request approvals - always use when users ask about approvals, pending items, approval queue, or need to review anything. Does not include expenses like transactions and reimbursements (use separate tools for those). Results include requester details, amounts, dates, and approval status.\nOnly handles lookups, does not take any action.",
1184
+ "properties": {
1185
+ "page_size": {
1186
+ "default": 50,
1187
+ "description": "Number of requests to return per page (1-100)",
1188
+ "maximum": 100,
1189
+ "minimum": 1,
1190
+ "title": "Page Size",
1191
+ "type": "integer"
1192
+ },
1193
+ "request_types": {
1194
+ "description": "Types of spend requests to include (defaults to all types: PURCHASE_ORDER, SPEND_ALLOCATION, APPROVAL_ONLY, PROCUREMENT_SPEND_ALLOCATION)",
1195
+ "items": {
1196
+ "enum": [
1197
+ "APPROVAL_ONLY",
1198
+ "PROCUREMENT_SPEND_ALLOCATION",
1199
+ "PURCHASE_ORDER",
1200
+ "SPEND_ALLOCATION",
1201
+ "TRAVEL"
1202
+ ],
1203
+ "title": "UnifiedSpendRequestType",
1204
+ "type": "string"
1205
+ },
1206
+ "title": "Request Types",
1207
+ "type": "array"
1208
+ },
1209
+ "start": {
1210
+ "default": null,
1211
+ "description": "Pagination cursor for next page",
1212
+ "nullable": true,
1213
+ "title": "Start",
1214
+ "type": "string"
1215
+ },
1216
+ "thoughts": {
1217
+ "description": "Is the user trying approve funds or purchase orders? Should we also check if there are transactions/reimbursements to approve via other tools? Is the user looking for _what_ to approve (use this tool) or actually trying to approve an object we already looked up (which should be another tool)?",
1218
+ "title": "Thoughts",
1219
+ "type": "string"
1220
+ }
1221
+ },
1222
+ "required": [
1223
+ "thoughts"
1224
+ ],
1225
+ "title": "GetRequestsToReview"
1226
+ },
1227
+ "hidden": false,
1228
+ "annotations": {
1229
+ "readOnlyHint": true
1230
+ }
1231
+ },
1232
+ {
1233
+ "name": "get-simplified-user-detail",
1234
+ "description": "Get the current user's details",
1235
+ "inputSchema": {
1236
+ "type": "object",
1237
+ "description": "Get the current user's details.\n\nReturns multiple results for users that are part of multiple businesses.",
1238
+ "properties": {},
1239
+ "title": "GetSimplifiedUserDetail"
1240
+ },
1241
+ "hidden": false,
1242
+ "annotations": {
1243
+ "readOnlyHint": true
1244
+ }
1245
+ },
1246
+ {
1247
+ "name": "get-tracking-categories",
1248
+ "description": "Retrieve all active tracking categories for the current business",
1249
+ "inputSchema": {
1250
+ "type": "object",
1251
+ "description": "Retrieve all active tracking categories for the current business.\n\nTracking categories are used to organize and categorize transactions in the accounting system.\nCommon examples include:\n- Departments (e.g., Engineering, Sales, Marketing)\n- Classes or Business Units\n- Locations (e.g., US East, US West)\n- Projects\n- Customers\n- Cost Centers\n\nThis tool returns only the tracking category metadata, not the available options.\nTo get the options for a specific tracking category, use GetTrackingCategoryOptions.\n\nThis tool should mainly be used as a helper tool to identify tracking categories when users want to set\naccounting categories on transactions.",
1252
+ "properties": {
1253
+ "include_hidden": {
1254
+ "default": false,
1255
+ "description": "Set to True to include hidden categories. By default, only visible categories are returned.",
1256
+ "title": "Include Hidden",
1257
+ "type": "boolean"
1258
+ },
1259
+ "transaction_uuid": {
1260
+ "default": null,
1261
+ "description": "UUID of the transaction being coded. When provided, ensures the correct business context is used to look up tracking categories.",
1262
+ "nullable": true,
1263
+ "title": "Transaction Uuid",
1264
+ "type": "string"
1265
+ }
1266
+ },
1267
+ "title": "GetTrackingCategories"
1268
+ },
1269
+ "hidden": false,
1270
+ "annotations": {
1271
+ "readOnlyHint": true
1272
+ }
1273
+ },
1274
+ {
1275
+ "name": "get-tracking-category-options",
1276
+ "description": "Retrieve options for a specific tracking category with optional search",
1277
+ "inputSchema": {
1278
+ "type": "object",
1279
+ "description": "Retrieve options for a specific tracking category with optional search.\n\nUse this tool to get the available options (e.g., specific departments, locations, projects)\nfor a tracking category. This tool supports pagination for tracking categories that have\nlarge numbers of options (some businesses can have millions of options). It is highly encouraged\nto use the query_string parameter to filter options by name when possible.\n\nWhen being used to set a coding for a transaction, you MUST pass the transaction_uuid parameter and set include_hidden to False\nto filter out hidden options based on subsidiary/conditional filtering. The transaction_uuid should only not be set when\ndoing generic searches over tracking category options.\n\nSearch behavior:\n- When query_string is provided and semantic search is enabled (via feature flag), the tool uses\n turbopuffer semantic search combined with ILIKE for better results. Pagination is not supported\n in this mode and falls back to the paginated endpoint on failure.\n- Otherwise, the tool uses simple ILIKE filtering with pagination support.\n\nWorkflow:\n1. First call GetTrackingCategories to get the list of tracking categories\n2. Then call this tool with the tracking_category_uuid to get the options, using query_string when possible and the transaction_uuid to be coded\n3. If next_page_cursor is returned, call again with that cursor to get more results if necessary\n\nThis tool should mainly be used to identify tracking category options when users want to set\naccounting categories on transactions. There is no need to use this tool if the user wants to use a\nsuggested coding that we already know the option UUID for.",
1280
+ "properties": {
1281
+ "include_hidden": {
1282
+ "default": false,
1283
+ "description": "Set to True to include hidden options. By default, only visible options are returned.",
1284
+ "title": "Include Hidden",
1285
+ "type": "boolean"
1286
+ },
1287
+ "next_page_cursor": {
1288
+ "default": null,
1289
+ "description": "Use this to get additional results after the first page. Copy the next_page_cursor value from a previous response to continue pagination",
1290
+ "nullable": true,
1291
+ "title": "Next Page Cursor",
1292
+ "type": "integer"
1293
+ },
1294
+ "page_size": {
1295
+ "default": 50,
1296
+ "description": "Maximum number of options to return in one request. Use smaller numbers (10-25) for quick overviews, larger numbers (50-100) for comprehensive views",
1297
+ "minimum": 1,
1298
+ "title": "Page Size",
1299
+ "type": "integer"
1300
+ },
1301
+ "query_string": {
1302
+ "default": null,
1303
+ "description": "Optional search string to filter options by name. Useful for finding specific options.",
1304
+ "nullable": true,
1305
+ "title": "Query String",
1306
+ "type": "string"
1307
+ },
1308
+ "tracking_category_uuid": {
1309
+ "description": "UUID of the tracking category to get options for. Obtain this from GetTrackingCategories.",
1310
+ "title": "Tracking Category Uuid",
1311
+ "type": "string"
1312
+ },
1313
+ "transaction_uuid": {
1314
+ "default": null,
1315
+ "description": "UUID of the transaction to filter options for when coding it. When provided, applies conditional filtering based on the transaction's user, department, location, etc. to exclude options that are hidden for that specific transaction context.",
1316
+ "nullable": true,
1317
+ "title": "Transaction Uuid",
1318
+ "type": "string"
1319
+ }
1320
+ },
1321
+ "required": [
1322
+ "tracking_category_uuid"
1323
+ ],
1324
+ "title": "GetTrackingCategoryOptions"
1325
+ },
1326
+ "hidden": false,
1327
+ "annotations": {
1328
+ "readOnlyHint": true
1329
+ }
1330
+ },
1331
+ {
1332
+ "name": "get-transaction-missing-items",
1333
+ "description": "Check what receipts, memos, or accounting items are missing from a specific transaction",
1334
+ "inputSchema": {
1335
+ "type": "object",
1336
+ "description": "Check what receipts, memos, or accounting items are missing from a specific transaction.",
1337
+ "properties": {
1338
+ "id": {
1339
+ "description": "Transaction id (based on metadata or tool calls).",
1340
+ "nullable": true,
1341
+ "title": "Id",
1342
+ "type": "string"
1343
+ }
1344
+ },
1345
+ "required": [
1346
+ "id"
1347
+ ],
1348
+ "title": "GetTransactionMissingItems"
1349
+ },
1350
+ "hidden": false,
1351
+ "annotations": {
1352
+ "readOnlyHint": true
1353
+ }
1354
+ },
1355
+ {
1356
+ "name": "get-transaction-suggested-memos",
1357
+ "description": "Get AI-suggested memo/note options for a specific transaction",
1358
+ "inputSchema": {
1359
+ "type": "object",
1360
+ "description": "Get AI-suggested memo/note options for a specific transaction.",
1361
+ "properties": {
1362
+ "id": {
1363
+ "description": "The ID of the transaction to retrieve suggested memos for.",
1364
+ "nullable": true,
1365
+ "title": "Id",
1366
+ "type": "string"
1367
+ }
1368
+ },
1369
+ "required": [
1370
+ "id"
1371
+ ],
1372
+ "title": "GetTransactionSuggestedMemos"
1373
+ },
1374
+ "hidden": false,
1375
+ "annotations": {
1376
+ "readOnlyHint": true
1377
+ }
1378
+ },
1379
+ {
1380
+ "name": "get-transactions",
1381
+ "description": "Search and retrieve expense transactions from Ramp",
1382
+ "inputSchema": {
1383
+ "type": "object",
1384
+ "description": "Search and retrieve expense transactions from Ramp\n\nThis tool helps you find card transactions. Use this tool when users want to:\n- View their recent transactions or expenses\n- Search for specific purchases by merchant, amount, or description\n- Find transactions that need approval\n- Analyze spending patterns\n- Review transactions by specific team members\n- Look up transactions with missing documentation and retrieve suggestions\n- View declined transactions (set state='declined')\n\nThe tool returns structured transaction data including amounts, merchants, dates,\nemployee names, policy compliance status, and missing documentation requirements + suggestions\n\nIMPORTANT: By default, declined transactions are NOT included in results. If a user asks\nabout declined, rejected, or failed transactions, you MUST set state='declined' to include them.\n\nIf the transaction the user is looking for or discussing is not returned, try again\nwith a different business_uuid — the user may have accounts across multiple businesses.\nYou can call this tool multiple times with different business_uuid values to get\ntransactions from all businesses for a given user.",
1385
+ "properties": {
1386
+ "business_uuid": {
1387
+ "default": null,
1388
+ "description": "The business UUID to scope the transaction search to. When the user has multiple businesses, use this to specify which business to query. If not available from context, retrieve it from GetSimplifiedUserDetail. If not provided, defaults to the first user's business.",
1389
+ "nullable": true,
1390
+ "title": "Business Uuid",
1391
+ "type": "string"
1392
+ },
1393
+ "details_to_include_in_response": {
1394
+ "default": null,
1395
+ "description": "Additional detailed information to include for each transaction. Options: policy assessment data (for reviewers approving transactions), missing documentation details (what receipts or approvals are needed), suggestions for transaction items (memos, codings, and funds), and submitted items (receipts, trips, attendees, and accounting categories currently on the transaction)",
1396
+ "items": {
1397
+ "enum": [
1398
+ "policy_assessment_for_reviewers",
1399
+ "submitted_items",
1400
+ "suggestions_for_transaction_items",
1401
+ "transaction_documentation_and_missing_items"
1402
+ ],
1403
+ "title": "DetailedField",
1404
+ "type": "string"
1405
+ },
1406
+ "nullable": true,
1407
+ "title": "Details To Include In Response",
1408
+ "type": "array"
1409
+ },
1410
+ "filters": {
1411
+ "description": "Advanced filters to narrow down transactions by specific criteria like merchant categories, spending allocations, or business trips. Multiple filters use conjunction logic (AND) - e.g., merchant='Starbucks' AND fund='Marketing Budget'",
1412
+ "properties": {
1413
+ "filters": {
1414
+ "description": "List of filter criteria to apply. All filters are combined with AND logic",
1415
+ "items": {
1416
+ "description": "A single filter to apply to transaction search.",
1417
+ "properties": {
1418
+ "filter": {
1419
+ "description": "The specific value to filter by. Must match exactly for categories (e.g., 'Taxi and Rideshare', 'Airlines'). Can be partial match for merchant, spend_allocation, trip, and tracking_category.",
1420
+ "title": "Filter",
1421
+ "type": "string"
1422
+ },
1423
+ "filter_type": {
1424
+ "description": "Type of filter to apply:\n- 'category': Expense category. Valid categories: Airlines, Car Rental, Lodging, Taxi and Rideshare, Fuel and Gas, Restaurants, Alcohol and Bars, Office supplies and cleaning, Office, Electronics, Clothing, Books and Newspapers, General Merchandise, Streaming Services, Entertainment, Supermarkets and Grocery Stores, Medical, Pet, Shipping, Utilities, Professional Services, Advertising, Fees and Financial institutions, Taxes and tax preparation, Other\n- 'merchant': Specific merchant/vendor name like 'Starbucks', 'Amazon', 'Uber', 'Delta Airlines'\n- 'spend_allocation': Spending allocation/budget/fund name like 'Marketing Budget', 'Engineering Fund', 'Wellness Stipend'\n- 'trip': Business trip/event/conference name. IMPORTANT: Trip names are the EVENT names (e.g., 'ERP Conference', 'Q4 Sales Offsite', 'Client Summit 2024'), NOT city/location names. When a user asks about 'travel to/from [city] for [event]', the trip filter should be the EVENT name (e.g., 'ERP Conference'), not the destination city (e.g., 'New York City'). Cities mentioned are travel origins/destinations, not trip names.\n- 'tracking_category': Accounting coding / tracking category option name or code. Use this to filter transactions by their accounting coding values (e.g., 'Engineering', 'Marketing', 'US East', 'ENG-001'). Searches across all active tracking categories (Department, Cost Center, GL Account, etc.). Only available for businesses with a connected accounting integration.",
1425
+ "enum": [
1426
+ "category",
1427
+ "merchant",
1428
+ "spend_allocation",
1429
+ "tracking_category",
1430
+ "trip"
1431
+ ],
1432
+ "title": "Filter Type",
1433
+ "type": "string"
1434
+ }
1435
+ },
1436
+ "required": [
1437
+ "filter",
1438
+ "filter_type"
1439
+ ],
1440
+ "title": "FilterCriteria",
1441
+ "type": "object"
1442
+ },
1443
+ "title": "Filters",
1444
+ "type": "array"
1445
+ }
1446
+ },
1447
+ "required": [
1448
+ "filters"
1449
+ ],
1450
+ "title": "Filter",
1451
+ "type": "object",
1452
+ "default": null,
1453
+ "nullable": true
1454
+ },
1455
+ "from_date": {
1456
+ "default": null,
1457
+ "description": "Start date for filtering transactions (YYYY-MM-DD format). Only transactions on or after this date will be included. Example: '2024-01-01'",
1458
+ "nullable": true,
1459
+ "title": "From Date",
1460
+ "type": "string"
1461
+ },
1462
+ "include_count": {
1463
+ "default": true,
1464
+ "description": "Whether to include the total count of matching transactions in the response. Set to false only if you just need the transaction data and want faster responses",
1465
+ "title": "Include Count",
1466
+ "type": "boolean"
1467
+ },
1468
+ "next_page_cursor": {
1469
+ "default": null,
1470
+ "description": "Use this to get additional results after the first page. Copy the next_page_cursor value from a previous response to continue pagination",
1471
+ "nullable": true,
1472
+ "title": "Next Page Cursor",
1473
+ "type": "string"
1474
+ },
1475
+ "page_size": {
1476
+ "default": 50,
1477
+ "description": "Maximum number of transactions to return in one request. Use smaller numbers (10-25) for quick overviews, larger numbers (50-200) for comprehensive analysis",
1478
+ "maximum": 200,
1479
+ "minimum": 1,
1480
+ "title": "Page Size",
1481
+ "type": "integer"
1482
+ },
1483
+ "reason_memo_merchant_or_user_name_text_search": {
1484
+ "default": null,
1485
+ "description": "Text search across merchant names, transaction descriptions/memos, and employee names. Must be at least 3 characters long. Examples: 'Starbucks', 'office supplies', 'John Smith'. Trip names, attendees and fund budget names are not searchable from this field",
1486
+ "nullable": true,
1487
+ "title": "Reason Memo Merchant Or User Name Text Search",
1488
+ "type": "string"
1489
+ },
1490
+ "sort": {
1491
+ "description": "How to sort the results. You can sort by user (employee name), merchant name, or transaction date in ascending or descending order. By default we sort by transaction date descending",
1492
+ "properties": {
1493
+ "direction": {
1494
+ "enum": [
1495
+ "asc",
1496
+ "desc"
1497
+ ],
1498
+ "title": "SortDirection",
1499
+ "type": "string",
1500
+ "description": "Sort order: ascending or descending"
1501
+ },
1502
+ "sort_by": {
1503
+ "description": "Which field to sort by",
1504
+ "enum": [
1505
+ "merchant",
1506
+ "transaction_date",
1507
+ "user"
1508
+ ],
1509
+ "title": "SortBy",
1510
+ "type": "string"
1511
+ }
1512
+ },
1513
+ "required": [
1514
+ "direction",
1515
+ "sort_by"
1516
+ ],
1517
+ "title": "Sort",
1518
+ "type": "object",
1519
+ "nullable": true
1520
+ },
1521
+ "state": {
1522
+ "description": "Filter transactions by their state. Use 'declined' when the user asks about declined or failed transactions. Use 'pending' for pending/processing transactions, 'cleared' for completed transactions, or 'all' to include all states. When not specified, only non-declined transactions are returned by default.",
1523
+ "enum": [
1524
+ "all",
1525
+ "cleared",
1526
+ "declined",
1527
+ "pending"
1528
+ ],
1529
+ "title": "TransactionStateFilter",
1530
+ "type": "string",
1531
+ "default": null,
1532
+ "nullable": true
1533
+ },
1534
+ "to_date": {
1535
+ "default": null,
1536
+ "description": "End date for filtering transactions (YYYY-MM-DD format). Only transactions on or before this date will be included. Example: '2024-12-31'",
1537
+ "nullable": true,
1538
+ "title": "To Date",
1539
+ "type": "string"
1540
+ },
1541
+ "transactions_to_retrieve": {
1542
+ "description": "Which set of transactions to search: your own transactions, transactions awaiting your approval, all company transactions (if you have access), or transactions made by your team members",
1543
+ "enum": [
1544
+ "all_transactions_across_entire_business",
1545
+ "my_transactions",
1546
+ "transactions_awaiting_my_approval",
1547
+ "transactions_made_by_my_team"
1548
+ ],
1549
+ "title": "TransactionSearchScope",
1550
+ "type": "string"
1551
+ }
1552
+ },
1553
+ "required": [
1554
+ "transactions_to_retrieve"
1555
+ ],
1556
+ "title": "GetUserTransactions"
1557
+ },
1558
+ "hidden": false,
1559
+ "annotations": {
1560
+ "readOnlyHint": true
1561
+ }
1562
+ },
1563
+ {
1564
+ "name": "get-user-trips",
1565
+ "description": "Fetch trips for the acting user with optional filters",
1566
+ "inputSchema": {
1567
+ "type": "object",
1568
+ "description": "Fetch trips for the acting user with optional filters.",
1569
+ "properties": {
1570
+ "cursor": {
1571
+ "default": null,
1572
+ "description": "Opaque bookmark returned by the API for pagination.",
1573
+ "nullable": true,
1574
+ "title": "Cursor",
1575
+ "type": "string"
1576
+ },
1577
+ "page_size": {
1578
+ "default": null,
1579
+ "description": "Optional number of trips to return per page.",
1580
+ "maximum": 100,
1581
+ "minimum": 1,
1582
+ "nullable": true,
1583
+ "title": "Page Size",
1584
+ "type": "integer"
1585
+ },
1586
+ "status": {
1587
+ "default": null,
1588
+ "description": "Optional trip status filter.",
1589
+ "enum": [
1590
+ "completed",
1591
+ "ongoing",
1592
+ "upcoming"
1593
+ ],
1594
+ "nullable": true,
1595
+ "title": "Status",
1596
+ "type": "string"
1597
+ }
1598
+ },
1599
+ "title": "GetUserTrips"
1600
+ },
1601
+ "hidden": false,
1602
+ "annotations": {
1603
+ "readOnlyHint": true
1604
+ }
1605
+ },
1606
+ {
1607
+ "name": "list-cards",
1608
+ "description": "List active cards for the current user",
1609
+ "inputSchema": {
1610
+ "type": "object",
1611
+ "description": "List active cards for the current user.",
1612
+ "properties": {},
1613
+ "title": "ListCards"
1614
+ },
1615
+ "hidden": false,
1616
+ "annotations": {
1617
+ "readOnlyHint": true
1618
+ }
1619
+ },
1620
+ {
1621
+ "name": "lock-or-unlock-card",
1622
+ "description": "Lock or unlock a card",
1623
+ "inputSchema": {
1624
+ "type": "object",
1625
+ "description": "Lock or unlock a card.\n\nUse this tool when:\n- A user wants to temporarily lock their card (lock)\n- A user wants to unlock a previously locked card (unlock)\n\nIMPORTANT: Locking a card is a destructive action. Before calling this tool with action='lock', you MUST:\n1. Confirm the card details with the user (show them which card will be affected)\n2. Explain that locking the card will prevent all transactions until unlocked\n3. Ask the user to explicitly confirm they want to lock the card (e.g., \"Yes, lock my card\")\n4. Only proceed if the user has explicitly confirmed the action\n\nDo NOT lock a card based on assumptions about suspicious activity or compromised cards.\nThe user must explicitly request and confirm the lock action.\n\nFor unlocking, confirmation is not required since this is a non-destructive action.",
1626
+ "properties": {
1627
+ "action": {
1628
+ "enum": [
1629
+ "lock",
1630
+ "unlock"
1631
+ ],
1632
+ "title": "Action",
1633
+ "type": "string"
1634
+ },
1635
+ "id": {
1636
+ "description": "The UUID of the card to lock or unlock.",
1637
+ "title": "Id",
1638
+ "type": "string"
1639
+ }
1640
+ },
1641
+ "required": [
1642
+ "action",
1643
+ "id"
1644
+ ],
1645
+ "title": "LockOrUnlockCard"
1646
+ },
1647
+ "hidden": false
1648
+ },
1649
+ {
1650
+ "name": "mark-transaction-missing-receipt",
1651
+ "description": "Flag a transaction as having no receipt",
1652
+ "inputSchema": {
1653
+ "type": "object",
1654
+ "description": "Flag a transaction as having no receipt.\n\nShould be called whenever the user says \"OOPS\" or if the user says something along the lines of \"I did not receive a receipt ...\". If the user already flagged the transaction as having no receipt, then you may need to call the ProvideNoReceiptReason tool.",
1655
+ "properties": {
1656
+ "transaction_uuid": {
1657
+ "description": "What transaction are they talking about? If they said OOPS, they are referring to the latest transaction.",
1658
+ "nullable": true,
1659
+ "title": "Transaction Uuid",
1660
+ "type": "string"
1661
+ }
1662
+ },
1663
+ "required": [
1664
+ "transaction_uuid"
1665
+ ],
1666
+ "title": "MarkTransactionMissingReceipt"
1667
+ },
1668
+ "hidden": false
1669
+ },
1670
+ {
1671
+ "name": "post-comment",
1672
+ "description": "Post a comment on a Ramp object (transaction, bill, reimbursement, etc)",
1673
+ "inputSchema": {
1674
+ "type": "object",
1675
+ "description": "Post a comment on a Ramp object (transaction, bill, reimbursement, etc).\n\nIf there is any ambiguity as to whether the user's message is meant to be\nposted to the thread, ask them for confirmation first: 'Do you want me to post that\nas a comment reply on your [XYZ] transaction/reimbursement/bill/etc?'.\n\nHow can you determine if the user's message is meant to be a reply to a comment?\n - If the only other messages in the conversation history are notifications about comments or mentions in Ramp, that is a very strong signal that the user's most recent message is meant to be a reply to the comment thread. In this case, you may use this tool immediately to post the comment without confirmation.\n - If a recent assistant message is a notification about a comment or mention, that is a strong signal that the user's most recent message is meant to be a reply to that comment. Even if their reply seems irrelevant or unrelated to Ramp, you may ask \"Would you like me to post that as a comment on your...?\" - prefer asking the user instead of refusing to serve the request at all.",
1676
+ "properties": {
1677
+ "mention_user_uuids": {
1678
+ "description": "List of user UUIDs to @-mention in the comment. If the user is replying to a recent comment or mention notification from the assistant, you must use this to set the UUID of the user they are replying to. The mentioned users will be notified and their names will be prepended to the comment message as @-mentions. Extract user UUIDs from the context when the user wants to mention someone (e.g., 'tell Bob that...' -> find Bob's UUID and include it here). If the user's message includes Slack-formatted @-mentions, use the ResolveSlackMention tool to turn those into user UUIDs",
1679
+ "items": {
1680
+ "type": "string"
1681
+ },
1682
+ "title": "Mention User Uuids",
1683
+ "type": "array"
1684
+ },
1685
+ "message": {
1686
+ "description": "The comment message text. If the user sends 'its done' -> post 'its done' to the comment thread. If the user sends 'its done' -> DO NOT post 'The receipt has been uploaded.' or any other variation. Do not correct spelling or punctuation or grammar. Do not include user @-mentions in this field - use mention_user_uuids instead and they will be added automatically. You may also replace Slack-formatted @-mentions with a user's full name by resolving it with the ResolveSlackMention tool.",
1687
+ "title": "Message",
1688
+ "type": "string"
1689
+ },
1690
+ "ramp_object_type": {
1691
+ "description": "Type of the Ramp object. Valid options are: 'reimbursement', 'transaction', 'bill', 'card', 'spend_request', 'spend_intent', 'ticket', 'payee', 'booking_request', 'provisional_bill', or 'vendor_payment'.",
1692
+ "enum": [
1693
+ "bill",
1694
+ "booking_request",
1695
+ "card",
1696
+ "payee",
1697
+ "provisional_bill",
1698
+ "reimbursement",
1699
+ "spend_intent",
1700
+ "spend_request",
1701
+ "ticket",
1702
+ "transaction",
1703
+ "vendor_payment"
1704
+ ],
1705
+ "title": "RampObjectType",
1706
+ "type": "string"
1707
+ },
1708
+ "ramp_object_uuid": {
1709
+ "description": "UUID of the Ramp object to post a comment on. This can be extracted from notification messages.",
1710
+ "title": "Ramp Object Uuid",
1711
+ "type": "string"
1712
+ }
1713
+ },
1714
+ "required": [
1715
+ "message",
1716
+ "ramp_object_type",
1717
+ "ramp_object_uuid"
1718
+ ],
1719
+ "title": "PostComment"
1720
+ },
1721
+ "hidden": false
1722
+ },
1723
+ {
1724
+ "name": "provide-no-receipt-reason",
1725
+ "description": "Only call this tool if we directly ask for a no receipt reason",
1726
+ "inputSchema": {
1727
+ "type": "object",
1728
+ "description": "Only call this tool if we directly ask for a no receipt reason. If a user is trying to mark their transaction as no receipt, use the MarkTransactionMissingReceipt tool. If the user is responding to a message that is asking for a reason for the user's receipt, then call this tool.",
1729
+ "properties": {
1730
+ "reason": {
1731
+ "description": "The reason the user is providing for not having a receipt.",
1732
+ "title": "Reason",
1733
+ "type": "string"
1734
+ },
1735
+ "transaction_uuid": {
1736
+ "description": "What transaction are they talking about? If they said OOPS, they are referring to the latest transaction.",
1737
+ "nullable": true,
1738
+ "title": "Transaction Uuid",
1739
+ "type": "string"
1740
+ }
1741
+ },
1742
+ "required": [
1743
+ "reason",
1744
+ "transaction_uuid"
1745
+ ],
1746
+ "title": "ProvideNoReceiptReason"
1747
+ },
1748
+ "hidden": false
1749
+ },
1750
+ {
1751
+ "name": "search-bills",
1752
+ "description": "Search for bills using natural language queries like vendor names, amounts, or invoice numbers",
1753
+ "inputSchema": {
1754
+ "type": "object",
1755
+ "description": "Search for bills using natural language queries like vendor names, amounts, or invoice numbers.",
1756
+ "properties": {
1757
+ "include_paid": {
1758
+ "default": true,
1759
+ "description": "Whether to include paid bills in results",
1760
+ "title": "Include Paid",
1761
+ "type": "boolean"
1762
+ },
1763
+ "limit": {
1764
+ "default": 10,
1765
+ "description": "Maximum number of bills to return (max 50)",
1766
+ "minimum": 1,
1767
+ "title": "Limit",
1768
+ "type": "integer"
1769
+ },
1770
+ "page_cursor": {
1771
+ "default": null,
1772
+ "description": "Pagination cursor from a previous response's next_page_cursor. The only valid string values are encrypted cursor tokens from a previous response (long strings starting with 'gAAAAA'). For the first page, for no more results, or for anything that is not one of those encrypted tokens, pass None (never the string 'None').",
1773
+ "nullable": true,
1774
+ "title": "Page Cursor",
1775
+ "type": "string"
1776
+ },
1777
+ "query": {
1778
+ "description": "Search for this string in payee name, invoice number, or payment ID of the bill. Examples: 'UPS' or 'Corodata' or 'INV-1722'. Will find partial matches (e.g. 'UPS' will find 'UPS Store' and '1722' will find 'INV-1722').",
1779
+ "title": "Query",
1780
+ "type": "string"
1781
+ }
1782
+ },
1783
+ "required": [
1784
+ "query"
1785
+ ],
1786
+ "title": "SearchBills"
1787
+ },
1788
+ "hidden": false,
1789
+ "annotations": {
1790
+ "readOnlyHint": true
1791
+ }
1792
+ },
1793
+ {
1794
+ "name": "search-purchase-orders",
1795
+ "description": "Search for purchase orders using structured purchase order filters",
1796
+ "inputSchema": {
1797
+ "type": "object",
1798
+ "description": "Search for purchase orders using structured purchase order filters.",
1799
+ "properties": {
1800
+ "filters": {
1801
+ "description": "Structured purchase order filters. For free-text vendor / PO / owner lookup, set filters.search. You can also provide status, payee, owner, or other PurchaseOrderQueryV2Filters fields.",
1802
+ "properties": {
1803
+ "accounting_sync_task_statuses": {
1804
+ "default": null,
1805
+ "items": {
1806
+ "description": "The status of a purchase order accounting provider sync task to display on FE",
1807
+ "enum": [
1808
+ "COMPLETED",
1809
+ "FAILED",
1810
+ "IN_PROGRESS",
1811
+ "NOT_SYNCED"
1812
+ ],
1813
+ "title": "PurchaseOrderAccountingSyncTaskStatusToDisplay",
1814
+ "type": "string"
1815
+ },
1816
+ "nullable": true,
1817
+ "title": "Accounting Sync Task Statuses",
1818
+ "type": "array"
1819
+ },
1820
+ "available_for_agreement_linking": {
1821
+ "default": null,
1822
+ "nullable": true,
1823
+ "title": "Available For Agreement Linking",
1824
+ "type": "boolean"
1825
+ },
1826
+ "bill_to_address_ids": {
1827
+ "default": null,
1828
+ "items": {
1829
+ "type": "string"
1830
+ },
1831
+ "nullable": true,
1832
+ "title": "Bill To Address Ids",
1833
+ "type": "array"
1834
+ },
1835
+ "coordinator_ids": {
1836
+ "default": null,
1837
+ "items": {
1838
+ "type": "string"
1839
+ },
1840
+ "nullable": true,
1841
+ "title": "Coordinator Ids",
1842
+ "type": "array"
1843
+ },
1844
+ "created_by_user_uuids": {
1845
+ "default": null,
1846
+ "items": {
1847
+ "type": "string"
1848
+ },
1849
+ "nullable": true,
1850
+ "title": "Created By User Uuids",
1851
+ "type": "array"
1852
+ },
1853
+ "currencies": {
1854
+ "default": null,
1855
+ "items": {
1856
+ "description": "We attempted to dynamically create this class from the ISO4217Currency and CryptoCurrency enums.\nHowever, mypy was not able to infer the type of the Currency enum; so we manually added the currencies to the enum.",
1857
+ "enum": [
1858
+ "AED",
1859
+ "AFN",
1860
+ "ALL",
1861
+ "AMD",
1862
+ "ANG",
1863
+ "AOA",
1864
+ "ARS",
1865
+ "AUD",
1866
+ "AWG",
1867
+ "AZN",
1868
+ "BAM",
1869
+ "BBD",
1870
+ "BDT",
1871
+ "BGN",
1872
+ "BHD",
1873
+ "BIF",
1874
+ "BMD",
1875
+ "BND",
1876
+ "BOB",
1877
+ "BOV",
1878
+ "BRL",
1879
+ "BSD",
1880
+ "BTN",
1881
+ "BWP",
1882
+ "BYN",
1883
+ "BZD",
1884
+ "CAD",
1885
+ "CDF",
1886
+ "CHE",
1887
+ "CHF",
1888
+ "CHW",
1889
+ "CLF",
1890
+ "CLP",
1891
+ "CNH",
1892
+ "CNY",
1893
+ "COP",
1894
+ "COU",
1895
+ "CRC",
1896
+ "CUC",
1897
+ "CUP",
1898
+ "CVE",
1899
+ "CZK",
1900
+ "DJF",
1901
+ "DKK",
1902
+ "DOP",
1903
+ "DZD",
1904
+ "EGP",
1905
+ "ERN",
1906
+ "ETB",
1907
+ "EUR",
1908
+ "EURC",
1909
+ "FJD",
1910
+ "FKP",
1911
+ "GBP",
1912
+ "GEL",
1913
+ "GHS",
1914
+ "GIP",
1915
+ "GMD",
1916
+ "GNF",
1917
+ "GTQ",
1918
+ "GYD",
1919
+ "HKD",
1920
+ "HNL",
1921
+ "HRK",
1922
+ "HTG",
1923
+ "HUF",
1924
+ "IDR",
1925
+ "ILS",
1926
+ "INR",
1927
+ "IQD",
1928
+ "IRR",
1929
+ "ISK",
1930
+ "JMD",
1931
+ "JOD",
1932
+ "JPY",
1933
+ "KES",
1934
+ "KGS",
1935
+ "KHR",
1936
+ "KMF",
1937
+ "KPW",
1938
+ "KRW",
1939
+ "KWD",
1940
+ "KYD",
1941
+ "KZT",
1942
+ "LAK",
1943
+ "LBP",
1944
+ "LKR",
1945
+ "LRD",
1946
+ "LSL",
1947
+ "LYD",
1948
+ "MAD",
1949
+ "MDL",
1950
+ "MGA",
1951
+ "MKD",
1952
+ "MMK",
1953
+ "MNT",
1954
+ "MOP",
1955
+ "MRU",
1956
+ "MUR",
1957
+ "MVR",
1958
+ "MWK",
1959
+ "MXN",
1960
+ "MXV",
1961
+ "MYR",
1962
+ "MZN",
1963
+ "NAD",
1964
+ "NGN",
1965
+ "NIO",
1966
+ "NOK",
1967
+ "NPR",
1968
+ "NZD",
1969
+ "OMR",
1970
+ "PAB",
1971
+ "PEN",
1972
+ "PGK",
1973
+ "PHP",
1974
+ "PKR",
1975
+ "PLN",
1976
+ "PYG",
1977
+ "QAR",
1978
+ "RON",
1979
+ "RSD",
1980
+ "RUB",
1981
+ "RWF",
1982
+ "SAR",
1983
+ "SBD",
1984
+ "SCR",
1985
+ "SDG",
1986
+ "SEK",
1987
+ "SGD",
1988
+ "SHP",
1989
+ "SLE",
1990
+ "SLL",
1991
+ "SOS",
1992
+ "SRD",
1993
+ "SSP",
1994
+ "STN",
1995
+ "SVC",
1996
+ "SYP",
1997
+ "SZL",
1998
+ "THB",
1999
+ "TJS",
2000
+ "TMT",
2001
+ "TND",
2002
+ "TOP",
2003
+ "TRY",
2004
+ "TTD",
2005
+ "TWD",
2006
+ "TZS",
2007
+ "UAH",
2008
+ "UGX",
2009
+ "USD",
2010
+ "USDB",
2011
+ "USDC",
2012
+ "USN",
2013
+ "UYI",
2014
+ "UYU",
2015
+ "UYW",
2016
+ "UZS",
2017
+ "VED",
2018
+ "VES",
2019
+ "VND",
2020
+ "VUV",
2021
+ "WST",
2022
+ "XAD",
2023
+ "XAF",
2024
+ "XAG",
2025
+ "XAU",
2026
+ "XBA",
2027
+ "XBB",
2028
+ "XBC",
2029
+ "XBD",
2030
+ "XCD",
2031
+ "XCG",
2032
+ "XDR",
2033
+ "XOF",
2034
+ "XPD",
2035
+ "XPF",
2036
+ "XPT",
2037
+ "XSU",
2038
+ "XTS",
2039
+ "XUA",
2040
+ "XXX",
2041
+ "YER",
2042
+ "ZAR",
2043
+ "ZMW",
2044
+ "ZWG",
2045
+ "ZWL"
2046
+ ],
2047
+ "title": "Currency",
2048
+ "type": "string"
2049
+ },
2050
+ "nullable": true,
2051
+ "title": "Currencies",
2052
+ "type": "array"
2053
+ },
2054
+ "custom_form_response_filters": {
2055
+ "default": null,
2056
+ "items": {
2057
+ "properties": {
2058
+ "custom_form_collection_id": {
2059
+ "title": "Custom Form Collection Id",
2060
+ "type": "integer"
2061
+ },
2062
+ "form_field_filters": {
2063
+ "additionalProperties": {
2064
+ "$ref": "#/components/schemas/FormFieldFilterRequestBody"
2065
+ },
2066
+ "title": "Form Field Filters",
2067
+ "type": "object"
2068
+ }
2069
+ },
2070
+ "required": [
2071
+ "custom_form_collection_id",
2072
+ "form_field_filters"
2073
+ ],
2074
+ "title": "PurchaseOrderCustomFormResponseFilter",
2075
+ "type": "object"
2076
+ },
2077
+ "nullable": true,
2078
+ "title": "Custom Form Response Filters",
2079
+ "type": "array"
2080
+ },
2081
+ "entity_uuids": {
2082
+ "default": null,
2083
+ "items": {
2084
+ "type": "string"
2085
+ },
2086
+ "nullable": true,
2087
+ "title": "Entity Uuids",
2088
+ "type": "array"
2089
+ },
2090
+ "has_virtual_card": {
2091
+ "default": null,
2092
+ "nullable": true,
2093
+ "title": "Has Virtual Card",
2094
+ "type": "boolean"
2095
+ },
2096
+ "include_deleted": {
2097
+ "default": false,
2098
+ "title": "Include Deleted",
2099
+ "type": "boolean"
2100
+ },
2101
+ "is_renewal_request": {
2102
+ "default": null,
2103
+ "nullable": true,
2104
+ "title": "Is Renewal Request",
2105
+ "type": "boolean"
2106
+ },
2107
+ "last_emailed_at_after": {
2108
+ "default": null,
2109
+ "nullable": true,
2110
+ "title": "Last Emailed At After",
2111
+ "type": "string"
2112
+ },
2113
+ "last_emailed_at_before": {
2114
+ "default": null,
2115
+ "nullable": true,
2116
+ "title": "Last Emailed At Before",
2117
+ "type": "string"
2118
+ },
2119
+ "latest_version_emailed_to_vendor": {
2120
+ "default": null,
2121
+ "nullable": true,
2122
+ "title": "Latest Version Emailed To Vendor",
2123
+ "type": "boolean"
2124
+ },
2125
+ "next_approver_user_uuids": {
2126
+ "default": null,
2127
+ "items": {
2128
+ "type": "string"
2129
+ },
2130
+ "nullable": true,
2131
+ "title": "Next Approver User Uuids",
2132
+ "type": "array"
2133
+ },
2134
+ "page_type": {
2135
+ "description": "Represents the type of page where the PurchaseOrders are displayed.",
2136
+ "enum": [
2137
+ "DEFAULT",
2138
+ "RECEIVING"
2139
+ ],
2140
+ "title": "PurchaseOrderPageType",
2141
+ "type": "string",
2142
+ "default": null,
2143
+ "nullable": true
2144
+ },
2145
+ "payee": {
2146
+ "properties": {
2147
+ "include_null": {
2148
+ "default": false,
2149
+ "title": "Include Null",
2150
+ "type": "boolean"
2151
+ },
2152
+ "payee_uuids": {
2153
+ "items": {
2154
+ "type": "string"
2155
+ },
2156
+ "title": "Payee Uuids",
2157
+ "type": "array"
2158
+ }
2159
+ },
2160
+ "title": "PurchaseOrderPayeeFilter",
2161
+ "type": "object",
2162
+ "default": null,
2163
+ "nullable": true
2164
+ },
2165
+ "payee_uuids": {
2166
+ "default": null,
2167
+ "deprecated": true,
2168
+ "description": "Deprecated: use payee.payee_uuids",
2169
+ "items": {
2170
+ "type": "string"
2171
+ },
2172
+ "nullable": true,
2173
+ "title": "Payee Uuids",
2174
+ "type": "array"
2175
+ },
2176
+ "purchase_order_ids": {
2177
+ "default": null,
2178
+ "items": {
2179
+ "type": "string"
2180
+ },
2181
+ "nullable": true,
2182
+ "title": "Purchase Order Ids",
2183
+ "type": "array"
2184
+ },
2185
+ "purchase_order_statuses": {
2186
+ "default": null,
2187
+ "items": {
2188
+ "description": "Describes the status of a PurchaseOrder that we display to users\n\nA PO created in Ramp can have the following statuses:\n- OPEN\n- PARTIALLY_BILLED\n- FULLY_BILLED\n- CLOSED\n\nAn Imported PO can have the following statuses:\n- OPEN\n- FULLY_BILLED\n- CLOSED\n- DELETED",
2189
+ "enum": [
2190
+ "CLOSED",
2191
+ "DELETED",
2192
+ "FULLY_BILLED",
2193
+ "OPEN",
2194
+ "PARTIALLY_BILLED"
2195
+ ],
2196
+ "title": "PurchaseOrderStatusToDisplay",
2197
+ "type": "string"
2198
+ },
2199
+ "nullable": true,
2200
+ "title": "Purchase Order Statuses",
2201
+ "type": "array"
2202
+ },
2203
+ "receipt_statuses": {
2204
+ "default": null,
2205
+ "items": {
2206
+ "description": "Represents the receipt status of the PO.\nA PO is considered to be `FULLY_RECEIVED` if and only if all of the PO line\nitems have been received.",
2207
+ "enum": [
2208
+ "FULLY_RECEIVED",
2209
+ "NOT_RECEIVED",
2210
+ "OVER_RECEIVED",
2211
+ "PARTIALLY_RECEIVED"
2212
+ ],
2213
+ "title": "PurchaseOrderReceiptStatus",
2214
+ "type": "string"
2215
+ },
2216
+ "nullable": true,
2217
+ "title": "Receipt Statuses",
2218
+ "type": "array"
2219
+ },
2220
+ "requires_user_action": {
2221
+ "default": null,
2222
+ "nullable": true,
2223
+ "title": "Requires User Action",
2224
+ "type": "boolean"
2225
+ },
2226
+ "search": {
2227
+ "title": "Search",
2228
+ "type": "string"
2229
+ },
2230
+ "ship_to_address_ids": {
2231
+ "default": null,
2232
+ "items": {
2233
+ "type": "string"
2234
+ },
2235
+ "nullable": true,
2236
+ "title": "Ship To Address Ids",
2237
+ "type": "array"
2238
+ },
2239
+ "sources": {
2240
+ "default": null,
2241
+ "items": {
2242
+ "description": "Represents the creation source of a PurchaseOrder.\n\n- RAMP: PurchaseOrder created in Ramp\n- ACCOUNTING_PROVIDER: PurchaseOrder imported from an accounting provider\n- DEVELOPER_API: PurchaseOrder created via the Developer API",
2243
+ "enum": [
2244
+ "ACCOUNTING_PROVIDER",
2245
+ "DEVELOPER_API",
2246
+ "RAMP"
2247
+ ],
2248
+ "title": "PurchaseOrderCreationSource",
2249
+ "type": "string"
2250
+ },
2251
+ "nullable": true,
2252
+ "title": "Sources",
2253
+ "type": "array"
2254
+ },
2255
+ "spend_end_date_after": {
2256
+ "default": null,
2257
+ "nullable": true,
2258
+ "title": "Spend End Date After",
2259
+ "type": "string"
2260
+ },
2261
+ "spend_end_date_before": {
2262
+ "default": null,
2263
+ "nullable": true,
2264
+ "title": "Spend End Date Before",
2265
+ "type": "string"
2266
+ },
2267
+ "spend_intent_uuids": {
2268
+ "default": null,
2269
+ "items": {
2270
+ "type": "string"
2271
+ },
2272
+ "nullable": true,
2273
+ "title": "Spend Intent Uuids",
2274
+ "type": "array"
2275
+ },
2276
+ "spend_request_owner_uuids": {
2277
+ "default": null,
2278
+ "items": {
2279
+ "type": "string"
2280
+ },
2281
+ "nullable": true,
2282
+ "title": "Spend Request Owner Uuids",
2283
+ "type": "array"
2284
+ },
2285
+ "spend_request_statuses": {
2286
+ "items": {
2287
+ "enum": [
2288
+ "APPROVED",
2289
+ "DRAFT",
2290
+ "REJECTED",
2291
+ "SUBMITTED"
2292
+ ],
2293
+ "title": "SpendRequestStatus",
2294
+ "type": "string"
2295
+ },
2296
+ "title": "Spend Request Statuses",
2297
+ "type": "array"
2298
+ },
2299
+ "spend_request_uuids": {
2300
+ "default": null,
2301
+ "items": {
2302
+ "type": "string"
2303
+ },
2304
+ "nullable": true,
2305
+ "title": "Spend Request Uuids",
2306
+ "type": "array"
2307
+ },
2308
+ "spend_start_date_after": {
2309
+ "default": null,
2310
+ "nullable": true,
2311
+ "title": "Spend Start Date After",
2312
+ "type": "string"
2313
+ },
2314
+ "spend_start_date_before": {
2315
+ "default": null,
2316
+ "nullable": true,
2317
+ "title": "Spend Start Date Before",
2318
+ "type": "string"
2319
+ },
2320
+ "tags": {
2321
+ "items": {
2322
+ "properties": {
2323
+ "id": {
2324
+ "title": "Id",
2325
+ "type": "string"
2326
+ },
2327
+ "type": {
2328
+ "description": "This enum represents all possible categories of filters that can be applied to a\ntable search across all of Ramp.\n\nSubsets of these categories are used in different surfaces, such as transactions,\nreimbursements, bills, and reporting. The specific subsets used by each surface\nis declared below.\n\nThe values of these enums are persisted in the database as a part of saved table\nviews and reports, and thus they should never be renamed or deleted without migrating\nall saved table views and reports first, or ensuring that said enums are not\ncurrently being persisted in the database.\n\nSimilarly, each surface should not remove any supported categories without ensuring\nthat the categories are not currently being used in any saved table views or reports\nfor that surface.",
2329
+ "enum": [
2330
+ "absolute_approval_group",
2331
+ "accounting_status",
2332
+ "accrual_readiness",
2333
+ "affected_entity_owner",
2334
+ "ap_entity_type",
2335
+ "ap_events_currency",
2336
+ "approval_group",
2337
+ "approval_policy",
2338
+ "approval_status",
2339
+ "approver",
2340
+ "ar_customer",
2341
+ "assignee",
2342
+ "automatic_flag_severity",
2343
+ "bill",
2344
+ "bill_approval_status",
2345
+ "bill_paid_status",
2346
+ "bill_pay_vendor_owner",
2347
+ "bill_payment_status",
2348
+ "booked_by_name",
2349
+ "budget_column",
2350
+ "budget_non_ramp_entity",
2351
+ "business_vendor",
2352
+ "business_vendor_payee",
2353
+ "canonical_vendor",
2354
+ "card_type",
2355
+ "category",
2356
+ "compliance_flag",
2357
+ "department",
2358
+ "direct_team",
2359
+ "due_aging_bucket",
2360
+ "entity",
2361
+ "event_actor_type",
2362
+ "expense_group",
2363
+ "expense_policy_acting_user",
2364
+ "expense_type",
2365
+ "external_integration",
2366
+ "frontend_navigation",
2367
+ "future_approver",
2368
+ "healthcare_provider",
2369
+ "intake_spend_request_owner",
2370
+ "invoice_ocr",
2371
+ "invoice_submitter",
2372
+ "ironclad_workflow_schema",
2373
+ "limit_currency",
2374
+ "location",
2375
+ "manager",
2376
+ "merchant",
2377
+ "next_approver",
2378
+ "paid_in_currency",
2379
+ "paid_status",
2380
+ "payee",
2381
+ "payee_custom_field_string_value",
2382
+ "payee_custom_record_field_value",
2383
+ "payee_external_vendor_id",
2384
+ "payee_internal_vendor_id",
2385
+ "payee_name",
2386
+ "payee_owner",
2387
+ "payee_permissioned",
2388
+ "payee_request",
2389
+ "payment_run",
2390
+ "payment_type",
2391
+ "physical_card",
2392
+ "policy_assessment",
2393
+ "procurement_spend_request_currency",
2394
+ "procurement_spend_request_vendor",
2395
+ "program_currency",
2396
+ "provisional_bill",
2397
+ "purchase_order_currency",
2398
+ "purchase_order_spend_intent",
2399
+ "purchase_order_spend_request",
2400
+ "purchase_order_status",
2401
+ "receipt_availability",
2402
+ "receipt_verification_status",
2403
+ "received_aging_bucket",
2404
+ "reimbursement",
2405
+ "reimbursement_approval_status",
2406
+ "reimbursement_paid_status",
2407
+ "reimbursement_paid_status_v2",
2408
+ "reimbursement_policy_assessment_recommended_decision",
2409
+ "reimbursement_state",
2410
+ "reimbursement_status",
2411
+ "reimbursement_type",
2412
+ "relative_approval_group",
2413
+ "repayment_status",
2414
+ "reporting",
2415
+ "request_number",
2416
+ "review_prediction_agreement",
2417
+ "reviewer_action",
2418
+ "spend_allocation",
2419
+ "spend_intent",
2420
+ "spend_intent_custom_form_field",
2421
+ "spend_intent_custom_form_response",
2422
+ "spend_request",
2423
+ "spend_type",
2424
+ "statement",
2425
+ "statement_currency",
2426
+ "submission_policy",
2427
+ "submission_policy_requirements_status",
2428
+ "task_status",
2429
+ "task_type",
2430
+ "team",
2431
+ "tracking_category",
2432
+ "transaction",
2433
+ "transaction_approval_status",
2434
+ "transaction_charge_status",
2435
+ "transaction_paid_status",
2436
+ "transaction_policy_assessment_recommended_decision",
2437
+ "transaction_recommended_reviewer_action",
2438
+ "transaction_repayment_state",
2439
+ "travel_confirmation_number",
2440
+ "travel_location",
2441
+ "travel_merchant",
2442
+ "traveler_name",
2443
+ "trip",
2444
+ "trip_destination",
2445
+ "unified_request_coordinator",
2446
+ "unified_request_currency",
2447
+ "unified_request_owner",
2448
+ "user",
2449
+ "user_approved",
2450
+ "user_custom_field"
2451
+ ],
2452
+ "title": "SearchTagCategory",
2453
+ "type": "string"
2454
+ }
2455
+ },
2456
+ "required": [
2457
+ "id",
2458
+ "type"
2459
+ ],
2460
+ "title": "PurchaseOrderQueryV2Tag",
2461
+ "type": "object"
2462
+ },
2463
+ "title": "Tags",
2464
+ "type": "array"
2465
+ },
2466
+ "three_way_match_enabled": {
2467
+ "default": null,
2468
+ "nullable": true,
2469
+ "title": "Three Way Match Enabled",
2470
+ "type": "boolean"
2471
+ }
2472
+ },
2473
+ "title": "PurchaseOrderQueryV2Filters",
2474
+ "type": "object"
2475
+ },
2476
+ "limit": {
2477
+ "default": 10,
2478
+ "description": "Maximum number of purchase orders to return (max 50)",
2479
+ "maximum": 50,
2480
+ "minimum": 1,
2481
+ "title": "Limit",
2482
+ "type": "integer"
2483
+ },
2484
+ "page_cursor": {
2485
+ "default": null,
2486
+ "description": "Pagination cursor from a previous response's next_page_cursor. The only valid string values are encrypted cursor tokens from a previous response (long strings starting with 'gAAAAA'). For the first page, for no more results, or for anything that is not one of those encrypted tokens, pass None (never the string 'None').",
2487
+ "nullable": true,
2488
+ "title": "Page Cursor",
2489
+ "type": "string"
2490
+ }
2491
+ },
2492
+ "title": "SearchPurchaseOrders"
2493
+ },
2494
+ "hidden": false,
2495
+ "annotations": {
2496
+ "readOnlyHint": true
2497
+ }
2498
+ },
2499
+ {
2500
+ "name": "search-unified-requests",
2501
+ "description": "Search for unified requests using free-text and structured request filters",
2502
+ "inputSchema": {
2503
+ "type": "object",
2504
+ "properties": {
2505
+ "limit": {
2506
+ "type": "integer"
2507
+ },
2508
+ "page_cursor": {
2509
+ "type": "string",
2510
+ "nullable": true
2511
+ }
2512
+ }
2513
+ },
2514
+ "hidden": false,
2515
+ "annotations": {
2516
+ "readOnlyHint": true
2517
+ }
2518
+ },
2519
+ {
2520
+ "name": "search-user",
2521
+ "description": "Search for users within the business by name",
2522
+ "inputSchema": {
2523
+ "type": "object",
2524
+ "description": "Search for users within the business by name.\n\nUse this for attaching attendees to transactions. The search is case-insensitive and matches partial names. Results are ordered by relevance (recent attendees and teammates appear first). If no transaction id is provided, the latest transaction will be used for search.",
2525
+ "properties": {
2526
+ "search": {
2527
+ "description": "Name or partial name to search for (e.g., 'john', 'smith', 'john smith')",
2528
+ "title": "Search",
2529
+ "type": "string"
2530
+ },
2531
+ "transaction_id": {
2532
+ "description": "UUID of the transaction to use as context for the search. If not provided, uses the user's most recent transaction.",
2533
+ "nullable": true,
2534
+ "title": "Transaction Id",
2535
+ "type": "string"
2536
+ }
2537
+ },
2538
+ "required": [
2539
+ "search",
2540
+ "transaction_id"
2541
+ ],
2542
+ "title": "SearchUser"
2543
+ },
2544
+ "hidden": false,
2545
+ "annotations": {
2546
+ "readOnlyHint": true
2547
+ }
2548
+ },
2549
+ {
2550
+ "name": "submit-reimbursement",
2551
+ "description": "Submit a draft out-of-pocket reimbursement for approval",
2552
+ "inputSchema": {
2553
+ "type": "object",
2554
+ "description": "Submit a draft out-of-pocket reimbursement for approval.\n\nIf the submission fails, the agent should follow up with the user based on the error returned from the endpoint.\nIf it is due to outstanding missing items, the agent should recheck missing_items via the GetReimbursements tool and provide suggestions for the user.\nIf only nonsupported missing items are present (trip, attendee, mileage_locations), the agent should provide the reimbursement_link URL as a clickable link in the response.",
2555
+ "properties": {
2556
+ "reimbursement_uuid": {
2557
+ "description": "UUID of the reimbursement to submit for approval. Call GetReimbursements to determine the UUID if it cannot be obtained from context.",
2558
+ "nullable": true,
2559
+ "title": "Reimbursement Uuid",
2560
+ "type": "string"
2561
+ }
2562
+ },
2563
+ "required": [
2564
+ "reimbursement_uuid"
2565
+ ],
2566
+ "title": "SubmitReimbursement"
2567
+ },
2568
+ "hidden": false
2569
+ },
2570
+ {
2571
+ "name": "upload-receipt-file",
2572
+ "description": "Upload a receipt from base64-encoded file content",
2573
+ "inputSchema": {
2574
+ "type": "object",
2575
+ "description": "Upload a receipt from base64-encoded file content.\n\nUse this tool to create a receipt from raw file data (PNG, JPEG, PDF, HEIC, WEBP).\nOptionally attach it to a transaction by providing a transaction UUID.\nThis tool is designed for external callers (CLI, MCP) that have the file content directly.",
2576
+ "properties": {
2577
+ "content_type": {
2578
+ "description": "MIME type of the file, e.g. \"image/png\".",
2579
+ "title": "Content Type",
2580
+ "type": "string"
2581
+ },
2582
+ "file_content_base64": {
2583
+ "description": "Base64-encoded file content (PNG, JPEG, PDF, HEIC, WEBP).",
2584
+ "title": "File Content Base64",
2585
+ "type": "string"
2586
+ },
2587
+ "filename": {
2588
+ "description": "Original filename with extension, e.g. \"receipt.png\".",
2589
+ "title": "Filename",
2590
+ "type": "string"
2591
+ },
2592
+ "transaction_uuid": {
2593
+ "default": null,
2594
+ "description": "Optional UUID of a transaction to auto-attach the receipt to.",
2595
+ "nullable": true,
2596
+ "title": "Transaction Uuid",
2597
+ "type": "string"
2598
+ }
2599
+ },
2600
+ "required": [
2601
+ "content_type",
2602
+ "file_content_base64",
2603
+ "filename"
2604
+ ],
2605
+ "title": "UploadReceiptFile"
2606
+ },
2607
+ "hidden": false
2608
+ }
2609
+ ]
2610
+ }