---
canonical_url: "https://docs.composio.dev/toolkits/ramp_mcp"
markdown_url: "https://docs.composio.dev/toolkits/ramp_mcp.md"
product: "platform"
version: null
last_updated: null
---

# Ramp MCP

Ramp MCP lets authorized users analyze spend and manage cards, bills, reimbursements, approvals, transactions, and other permitted Ramp resources.

- **Category:** model context protocol
- **Auth:** DCR_OAUTH
- **Composio-managed OAuth available?** No
- **Tools:** 213
- **Triggers:** 0
- **Slug:** `RAMP_MCP`
- **Version:** 00000000_00

## Tools

### Ramp activate card

**Slug:** `RAMP_MCP_RAMP_ACTIVATE_CARD`

Activates an unactivated card for the user. If the card is a physical card
awaiting delivery confirmation, call this tool first without confirm_delivery
to detect the state, then call again with confirm_delivery=True after the user
confirms the physical card has arrived.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `last_four` | string | Yes | Last four digits of the target card. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `confirm_delivery` | boolean | No | Set to true only after the user explicitly confirms the physical card has arrived. This completes activation for a card awaiting delivery confirmation. |

### Ramp add traveler loyalty program

**Slug:** `RAMP_MCP_RAMP_ADD_TRAVELER_LOYALTY_PROGRAM`

Compatibility route for callers that have not migrated to SetTravelerLoyaltyProgram

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `program_name` | string | Yes | Loyalty program name, such as Delta SkyMiles, Hilton Honors, or Hertz Gold Plus Rewards. |
| `loyalty_number` | string | Yes | Loyalty number for the loyalty program. |

### Ramp add user to shared fund

**Slug:** `RAMP_MCP_RAMP_ADD_USER_TO_SHARED_FUND`

Provide user_email for a human or agent_id for a standalone agent; role defaults to MEMBER.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `role` | string ("COOWNER" | "MEMBER") | No | Role to assign. Defaults to MEMBER. |
| `agent_id` | string | No | ID returned when the standalone agent was created |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `user_email` | string | No | Email of the human user to add |
| `spend_allocation_uuid` | string | Yes | UUID of the shared fund |
| `enable_sharing_if_needed` | boolean | No | Enable sharing atomically before adding the user when needed. |

### Ramp agent account numbers

**Slug:** `RAMP_MCP_RAMP_AGENT_ACCOUNT_NUMBERS`

Returns active agent-managed account numbers and all payment details
available for receiving funds.

### Ramp answer policy question

**Slug:** `RAMP_MCP_RAMP_ANSWER_POLICY_QUESTION`

Use this tool when the user asks about expense policy rules, spending limits,
fund restrictions, or whether certain purchases are allowed under company policy.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `question` | string | Yes |  |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `include_restrictions` | boolean | No |  |

### Ramp api keys

**Slug:** `RAMP_MCP_RAMP_API_KEYS`

Results are sorted by estimated cost in descending order, then by API key
ID in ascending order. A request can match at most 10,000 API keys. Use
the providers or statuses filter to narrow larger result sets.

Estimated cost is calculated for the requested period. All other fields
reflect current metadata for the API key, independent of the requested
dates. The statuses filter applies to each API key's current status.

### Ramp approve or reject bill

**Slug:** `RAMP_MCP_RAMP_APPROVE_OR_REJECT_BILL`

The authenticated user must be the next required approver on the bill's approval chain. Rejection is additionally allowed for bill-pay admins as an override, even when they are not the next approver. Find bills awaiting the authenticated user's approval with get-bills-for-approval. Some bills require step-up verification that agents cannot complete; in that case the error includes a redirect_url that the human user must open in a browser to finish the action there. Approving advances the bill's approval chain, exactly as approving in the Ramp web app does: depending on the business's payment-release settings, a bill that becomes fully approved with payment details and a payment date already set may proceed to payment automatically. After an approval, the response reports the bill's resulting payment state: whether any of its payments has been initiated (payment_initiated — this includes earlier partial payments; a chain-completing approval may have just added one) and the earliest such payment date (payment_date) — so you can inform the user. This tool never schedules payments or edits payment details; payment scheduling and release are managed in the Ramp web app — hand the user the bill_url returned on success.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `reason` | string | No |  |
| `bill_id` | string | Yes | The UUID of the bill to approve or reject. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `action_type` | string ("APPROVE" | "REJECT") | Yes |  |

### Ramp approve or reject reimbursement

**Slug:** `RAMP_MCP_RAMP_APPROVE_OR_REJECT_REIMBURSEMENT`

Use this tool when the user wants to approve or reject a reimbursement.
Reimbursements are employee-submitted requests for reimbursement of out-of-pocket expenses.
Common usage patterns: "approve this reimbursement", "reject the expense", "yes, reimburse them", "no, don't reimburse this".
This tool is specifically for employee reimbursements and is NOT for approving/rejecting card transactions
or unified requests (spend allocations, purchase orders).

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `action` | string | Yes | The action to take on the reimbursement: approve or reject. |
| `thoughts` | string | No | 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. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `user_reason` | string | No | 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...'. |
| `reimbursement_id` | string | Yes | The ID of the reimbursement to approve or reject. |

### Ramp approve or reject request

**Slug:** `RAMP_MCP_RAMP_APPROVE_OR_REJECT_REQUEST`

Use this tool when a user wants to approve or reject a specific request they have identified or referenced.
Common usage patterns: "approve this request", "reject this request", "accept the request", "deny this",
"authorize this", "yes approve it", "decline this request".
This tool is specifically for unified requests (spend allocations, purchase orders, procurement approvals)
and is NOT for approving expenses like corporate card transactions or reimbursements.
The user must have proper approval authority for the request.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `action` | string | Yes | The action to perform: APPROVE or REJECT |
| `reason` | string | No | Optional notes from the user explaining their approval or rejection decision. Recorded in the approval history and may be visible to other approvers and the requester. Use this when the user provides context like 'approve it because...' or 'reject because...'. |
| `thoughts` | string | Yes | Your reasoning about whether to approve or reject this request. Consider: did the user clearly indicate whether they wanted to approve or reject? |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `unified_request_id` | string | Yes | The unified request ID to act upon |

### Ramp approve or reject transaction

**Slug:** `RAMP_MCP_RAMP_APPROVE_OR_REJECT_TRANSACTION`

Use this tool when the user wants to approve a transaction, send it back for
revisions, or require the cardholder to repay the full amount. The acting user
must have the proper approval authority for the transaction. If the user provides
a written justification (e.g., “reject this because the receipt is missing”), pass
that verbatim via `user_reason`—do not invent your own rationale.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `action` | string | Yes | Action to perform: APPROVE, REJECT_AND_REQUEST_CHANGES (send back to cardholder with requested revisions), or REJECT_AND_REQUEST_FULL_REPAYMENT (require employee repayment). |
| `thoughts` | string | Yes | Your internal reasoning summarizing what the user asked for and why this tool should be invoked. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `user_reason` | string | No | Explanation written by the USER for their decision. Required when requesting changes or full repayment, and should only contain text the user explicitly provided. |
| `transaction_id` | string | Yes | The transaction to act on |

### Ramp archive spend allocation

**Slug:** `RAMP_MCP_RAMP_ARCHIVE_SPEND_ALLOCATION`

Archive a fund to prevent spend and hide it from users

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `spend_allocation_uuid` | string | Yes | The UUID of the spend allocation to archive |

### Ramp award sourcing event

**Slug:** `RAMP_MCP_RAMP_AWARD_SOURCING_EVENT`

closing its current RFX.

Prerequisites: grading must be complete on the current RFX, the event must
not already be awarded or pending award approval, and the payee must be an
active invited vendor on the RFX. When the business configures an award
approval policy, the award routes through that approval workflow instead
of awarding immediately (``submitted_for_approval`` is True and nothing is
decided yet). After a direct award, use
CreateDraftSpendRequestFromSourcingEvent to hand off into procurement.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `payee_uuid` | string | Yes | UUID of the winning vendor (payee) to award |
| `sourcing_event_id` | string | Yes | UUID of the sourcing event to award |

### Ramp cancel reimbursement payment

**Slug:** `RAMP_MCP_RAMP_CANCEL_REIMBURSEMENT_PAYMENT`

Cancel the payment on a reimbursement that has been approved but not yet paid out

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `notes` | string | No |  |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `reimbursement_uuid` | string | Yes | UUID of the reimbursement whose payment should be canceled. Call GetReimbursements to determine the UUID if it cannot be obtained from context. |

### Ramp close sourcing event

**Slug:** `RAMP_MCP_RAMP_CLOSE_SOURCING_EVENT`

Closing cascades to every non-terminal child RFX: each is transitioned to
CLOSED, which blocks further vendor submissions and grading and voids any
outstanding e-sign envelopes. Closed events are hidden from default list
views and become read-only. Use AwardSourcingEvent instead when a winning
vendor should be selected.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `sourcing_event_id` | string | Yes | UUID of the sourcing event to close |

### Ramp complete transaction revision

**Slug:** `RAMP_MCP_RAMP_COMPLETE_TRANSACTION_REVISION`

Use this after the cardholder has addressed the requested changes and explicitly
asks to mark the transaction revision complete. The completion refreshes the
corresponding task and starts Task Platform's sanction-lifting workflow.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `reason` | string | Yes | The cardholder's reason for completing the revision. Pass the user's own words; do not invent a reason. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `transaction_uuid` | string | Yes | UUID of the revision-requested transaction to complete. |

### Ramp create department

**Slug:** `RAMP_MCP_RAMP_CREATE_DEPARTMENT`

Department names are unique within the business (case-insensitive). If a
department with the requested name already exists, it is returned instead
of creating a duplicate.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `department_name` | string | Yes | Name of the department to create. |

### Ramp create draft bill

**Slug:** `RAMP_MCP_RAMP_CREATE_DRAFT_BILL`

Returns the draft UUID, initial version, and Ramp URL. This does not start approval, schedule, release, or initiate payment. Omitted fields remain empty, so the new draft may not yet be ready for submission.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `draft_bill` | string | Yes | Draft bill fields to set at creation. Do not include vendor fields; vendor_uuid is the only vendor input. |
| `vendor_uuid` | string | Yes | UUID of the existing vendor/payee for this draft bill. |

### Ramp create draft spend request from sourcing event

**Slug:** `RAMP_MCP_RAMP_CREATE_DRAFT_SPEND_REQUEST_FROM_SOURCING_EVENT`

spend request pre-filled with the winning vendor's context.

The draft is prefilled from the sourcing conversation, event details, and
(when ``rfx_id`` is passed) the awarded vendor's RFX responses. The user
reviews and submits the draft in procurement. ``payee_uuid`` defaults to
the awarded vendor and ``spend_intent_uuid`` defaults to the backend's
recommended spend program when omitted. This call runs LLM extraction and
can take a while.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | No | Optional UUID of the awarded RFX whose vendor responses should enrich the draft prefill. Must belong to the sourcing event. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `payee_uuid` | string | No | Optional vendor (payee) UUID for the spend request. Defaults to the sourcing event's awarded vendor. |
| `sourcing_event_id` | string | Yes | UUID of the sourcing event to draft a spend request from |
| `spend_intent_uuid` | string | No | Optional spend program UUID to draft under. Omit to let the backend pick the best-fit procurement spend program. |

### Ramp create fund request

**Slug:** `RAMP_MCP_RAMP_CREATE_FUND_REQUEST`

Always use this tool (never invent
URLs) and include the returned url in your next message. Prefer spend-program request
tools first when available; use this for one-off/default funds or when no program fits.
Infer fields from context; do not ask for more details unless the user asks.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `name` | string | No | Display name. Infer from context when possible. |
| `amount` | string | No | Requested spending limit (optional). Pass a decimal string like "5000.00" in the major currency unit, never minor units, a currency symbol, or thousands separators. |
| `currency` | string | No | 3-letter currency code (e.g. USD, EUR, GBP). Pass whenever the amount's currency is known; omitting it falls back to the form default. |
| `frequency` | string | No | Reset interval: DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY, or ANNUAL. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `description` | string | No | Reason for the request. |
| `request_type` | string ("general_expense" | "virtual_card") | No | general_expense (default) or virtual_card when explicitly requested. |

### Ramp create pending payee

**Slug:** `RAMP_MCP_RAMP_CREATE_PENDING_PAYEE`

Call SearchVendors first with include_draft=true. Reuse a suitable existing
vendor, including a pending vendor, instead of creating a duplicate. Never
create a duplicate to work around an existing vendor whose status is
INACTIVE — an admin must re-enable that vendor instead.

A vendor contact email is required; contact names are optional.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `name` | string | Yes | Vendor name |
| `contact` | string | Yes | Vendor contact with a required email address; contact names are optional |
| `website` | string | No | Vendor website |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `description` | string | No | Vendor description |

### Ramp create reimbursement from receipt

**Slug:** `RAMP_MCP_RAMP_CREATE_REIMBURSEMENT_FROM_RECEIPT`

Pass amount/currency_code/transaction_date/merchant to skip OCR.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `amount` | string | No | Receipt total in major units of currency_code (e.g. "18150.00"), never minor units, currency symbols, or thousands separators. When set, bypasses OCR. |
| `merchant` | string | No | Merchant name from the receipt. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `receipt_uuid` | string | Yes | Real Ramp Receipt UUID (not a chat file_id). Must come from Ramp/context; no placeholders. If unavailable, ask the user to upload a receipt. |
| `currency_code` | string | No | ISO 4217 code (e.g. USD, EUR). Pass whenever the receipt or user names a currency; otherwise defaults to the user's currency and can mislabel foreign spend. |
| `transaction_date` | string | No | Receipt transaction date (YYYY-MM-DD). |

### Ramp create rfx

**Slug:** `RAMP_MCP_RAMP_CREATE_RFX`

event in the same call.

Nothing is sent to vendors until the RFX is published. Use GetRFXDetail to
review the created questionnaire and InviteVendorsToRFX to add vendors
before publishing.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `name` | string | Yes | Name of the RFX |
| `rfx_type` | string | No | Type of RFX: RFI (Request for Information), RFP (Request for Proposal), or RFQ (Request for Quotation) |
| `sections` | array | Yes | Questionnaire sections, in the order shown to vendors |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `close_date` | string | No | RSVP deadline (YYYY-MM-DD) — the last date vendors can accept or reject the invitation. Must be in the future and on or before response_submission_deadline. Required before publishing. |
| `description` | string | No | Description of the RFX |
| `sourcing_event_id` | string | No | UUID of an existing sourcing event to create the RFX under. Omit to create a new sourcing event for this RFX. |
| `sourcing_event_name` | string | No | Name for the new sourcing event when sourcing_event_id is omitted. Defaults to the RFX name. Ignored when sourcing_event_id is set. |
| `response_submission_deadline` | string | No | Deadline for vendors to submit their RFX response (YYYY-MM-DD). Must be in the future and on or after close_date. Required before publishing. |

### Ramp create trip

**Slug:** `RAMP_MCP_RAMP_CREATE_TRIP`

Do not call this solely as a prerequisite for booking a flight or hotel;
SubmitFlightBooking and SubmitHotelBooking automatically select or create a trip when
trip_id is omitted. If the user explicitly asks to create a named trip in addition to
booking, call this once and pass the returned trip_uuid as trip_id to every related
SubmitFlightBooking and SubmitHotelBooking call.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `name` | string | Yes | 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 |
| `end_date` | string | No | End calendar date, or an RFC3339 datetime with an explicit offset. Datetime values containing a time must include an offset. |
| `rationale` | string | Yes | How you found out or inferred the field values for the trip |
| `start_date` | string | No | Start calendar date, or an RFC3339 datetime with an explicit offset. Datetime values containing a time must include an offset. |
| `destinations` | array | No | 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. |
| `trip_purpose` | string | No | Required purpose of the trip. Ask the user for the purpose if it is not provided. |
| `calendar_timezone` | string | No | IANA timezone used to interpret date-only start_date and end_date, for example America/New_York. Defaults to the acting user's valid preferred timezone. Ignored for offset-qualified datetime inputs. |
| `are_trip_dates_from_booking_receipt_or_user_input` | boolean | Yes |  |

### Ramp delete procurement draft

**Slug:** `RAMP_MCP_RAMP_DELETE_PROCUREMENT_DRAFT`

Delete an abandoned procurement draft owned by the acting user

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `spend_request_uuid` | string | Yes | Draft spend request UUID returned by draft_procurement_request. |

### Ramp delete reimbursement

**Slug:** `RAMP_MCP_RAMP_DELETE_REIMBURSEMENT`

Deletion is permanent and only allowed for reimbursements the acting user is
permitted to delete (their own drafts, or others' if they have write access).
Reimbursements that have progressed too far in the payment lifecycle cannot be
deleted; use CancelReimbursementPayment for approved-but-unpaid reimbursements.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `reimbursement_uuid` | string | Yes | UUID of the reimbursement to delete. Call GetReimbursements to determine the UUID if it cannot be obtained from context. |

### Ramp delete spend program

**Slug:** `RAMP_MCP_RAMP_DELETE_SPEND_PROGRAM`

Use this tool when an admin wants to permanently delete a spend program.
If the program has linked funds (spend allocations), the caller must specify
what to do with them via spend_intent_delete_action:

- "terminate": Close all linked funds.
- "transfer": Move funds to another spend program (requires transfer_to_spend_intent_uuid).
- "detach": Unlink funds from the program but keep them active.
- "bulk_lock": Lock all cards associated with linked funds (admin only).

If the program has no linked funds, spend_intent_delete_action can be omitted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `spend_intent_uuid` | string | Yes | UUID of the spend program to delete. |
| `spend_intent_delete_action` | string | No | Action to take for existing funds linked to this program. Required when the program has linked funds. Options: 'terminate' (close all funds), 'transfer' (move funds to another program — requires transfer_to_spend_intent_uuid), 'detach' (unlink funds but keep them active), 'bulk_lock' (lock all associated cards — admin only). |
| `transfer_to_spend_intent_uuid` | string | No | UUID of the spend program to transfer funds to. Required when spend_intent_delete_action is 'transfer'. |

### Ramp departments

**Slug:** `RAMP_MCP_RAMP_DEPARTMENTS`

Returns the departments available in the user's business, which can be
used as inputs to workflows that require department references. Each
department includes organizational metadata: its owners (managers),
active member count, and managing external firm, if any.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `name_filter` | string | No | Optional filter to search departments by name (case-insensitive partial match). |

### Ramp drawdown requests

**Slug:** `RAMP_MCP_RAMP_DRAWDOWN_REQUESTS`

Creates a wire drawdown request from an external bank account. The request
may require approval, and funds arrive only if the external bank fulfills it.
Requires an `X-Idempotency-Key` header.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `memo` | string | No | Optional reason for the funding request |
| `amount` | string | Yes | Amount to request in minor currency units |
| `agent_account_number_id` | string | No | Agent account number to receive the funds. If omitted, the banking account's primary account number is used |
| `external_bank_account_id` | string | Yes | External bank account to request funds from |

### Ramp duplicate reimbursement

**Slug:** `RAMP_MCP_RAMP_DUPLICATE_REIMBURSEMENT`

Duplicate an existing reimbursement as a new draft

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `reimbursement_uuid` | string | Yes | UUID of the reimbursement to duplicate. Call GetReimbursements to determine the UUID if it cannot be obtained from context. |

### Ramp edit reimbursement

**Slug:** `RAMP_MCP_RAMP_EDIT_REIMBURSEMENT`

Omitted fields stay unchanged; null/[] clear when editable.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `memo` | string | No | The memo/description text. Pass null to clear. |
| `amount` | string | No | The reimbursement amount, in the major unit of `currency_code` — pass a decimal string like "18150.00", never minor units, a currency symbol, or thousands separators. Must be a positive number. Only editable while the reimbursement is in DRAFT state. |
| `fund_uuid` | string | No | UUID of the fund (spend allocation) to charge this reimbursement to. Pass null to remove the fund assignment. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `trip_uuid` | string | No | Trip UUID to associate. Pass null to remove. |
| `currency_code` | string | No | ISO 4217 currency code (e.g. 'USD', 'EUR') for the reimbursement amount. Pass it whenever the amount's currency is known rather than relying on the existing value. Only editable while the reimbursement is in DRAFT state. Null is ignored. |
| `merchant_name` | string | No | Merchant name. Only editable while the reimbursement is in DRAFT state. Null is ignored. |
| `merchant_uuid` | string | No | Canonical merchant UUID from SearchMerchants. Only editable while the reimbursement is in DRAFT state. Null is ignored. |
| `reimbursement_date` | string | No | Date the expense was incurred. Use YYYY-MM-DD format. |
| `reimbursement_uuid` | string | Yes | UUID of the reimbursement to modify. Call GetReimbursements to determine the UUID if it cannot be obtained from context. |
| `attendee_user_uuids` | array | No | Ramp user UUIDs as attendees. Pass [] to clear. |
| `custom_record_values` | array | No | Custom record values (text/boolean/number). Pass [] to clear. Use column_id from state.custom_records. |
| `accounting_split_request` | string | No | Complete replacement for every split line on a draft. Omit for ordinary edits; null is treated as omitted and preserves existing split lines. A non-null payload must include every line with its amount, memo, and line-level tracking category selections. Required when changing the amount or currency of an existing split draft. |
| `tracking_category_selections` | array | No | Tracking category assignments. Pass [] to clear. See TrackingCategorySelection for field names and aliases. Source values from GetTrackingCategories, GetTrackingCategoryOptions, or suggested_codings. |

### Ramp edit transaction

**Slug:** `RAMP_MCP_RAMP_EDIT_TRANSACTION`

Returns the updated transaction, remaining missing items, and a transaction_link for fields the API cannot edit.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `memo` | string | No | The memo/description text to set for the transaction. Set to empty string ('') if clearing the memo. |
| `fund_uuid` | string | No | UUID of the fund (spend allocation) to charge this transaction to. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `trip_selection` | string | No | Trip selection configuration. Provide a trip_uuid to assign/change the transaction. Set trip_uuid=None to detach a wrong trip while leaving the transaction eligible for another trip. Set mark_not_part_of_trip=True only when the transaction genuinely is not part of any trip. |
| `transaction_uuid` | string | Yes | UUID of the transaction to modify. Call GetUserTransactions to determine the UUID if it cannot be obtained from context. |
| `attendee_selections` | string | No | Attendee selections: attendee_uuids (Ramp users; must be valid UUIDs, never integer IDs), non_ramp_attendees (external people), include_self_as_attendee (acting user is added automatically when include_self_as_attendee is True). This is an upsert - provide the complete set of attendees. Only provide this field when Attendees is in incomplete items, or when the user directly provides attendee values or asks to change attendees; a memo or business-purpose answer is not an attendee change by itself unless it directly identifies attendee names or an attendee change. |
| `user_submitted_fields` | array | No | Fields where the user DIRECTLY provided the specific value in their message. Always provide this field — use an empty list [] if no fields were user-specified. A value counts as directly provided when the user explicitly states it or unambiguously selects it from options you presented by number, index, or reference. Evaluate each updated field independently. Do NOT include fields where you (the agent) decided/inferred the value based on context. Valid values: 'memo', 'fund_uuid', 'tracking_category_selections', 'trip_selection', 'attendee_selections'. Examples - INCLUDE: 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'. |
| `tracking_category_selections` | array | No | Tracking/accounting category assignments (e.g., category, department, project). Each item requires `category_uuid` and `option_selection` — do NOT use `tracking_category_uuid` or `tracking_category_option_uuid` (those are response-only field names). 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 values from GetTrackingCategories, GetTrackingCategoryOptions, or suggested_codings. If user-provided context already contains a tracking_category_option_uuid, use that UUID directly as option_selection without calling GetTrackingCategoryOptions. Only the codings that are to be updated need to be provided. |

### Ramp edit user role on shared fund

**Slug:** `RAMP_MCP_RAMP_EDIT_USER_ROLE_ON_SHARED_FUND`

Change a shared-fund user's role between member and co-owner using user_email

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `new_role` | string ("COOWNER" | "MEMBER") | Yes | New role to assign: MEMBER or COOWNER |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `user_email` | string | Yes | Email of the user whose role to change |
| `spend_allocation_uuid` | string | Yes | UUID of the shared fund |

### Ramp enable shared fund access

**Slug:** `RAMP_MCP_RAMP_ENABLE_SHARED_FUND_ACCESS`

Use this when a user wants to turn an existing personal fund into a shared fund,
or when adding a member requires sharing to be enabled first.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `spend_allocation_uuid` | string | Yes | UUID of the fund to convert into a shared fund |

### Ramp enroll business in agent cards

**Slug:** `RAMP_MCP_RAMP_ENROLL_BUSINESS_IN_AGENT_CARDS`

Enroll the current business in agent cards for agentic commerce

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp estimate mileage reimbursement

**Slug:** `RAMP_MCP_RAMP_ESTIMATE_MILEAGE_REIMBURSEMENT`

Estimate the reimbursement amount for a given mileage distance based on the user's company rates

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `distance` | string | Yes | The distance traveled (e.g. 50.0) |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `distance_units` | string | No | The distance unit: MILES or KILOMETERS. Defaults to MILES. |
| `transaction_date` | string | No | The date of the trip. If not provided, today's date is used. |
| `vehicle_mileage_class` | string | No | The vehicle mileage class, required for some countries (e.g. France, Finland). |

### Ramp estimate per diem amount

**Slug:** `RAMP_MCP_RAMP_ESTIMATE_PER_DIEM_AMOUNT`

Estimate the per diem reimbursement amount for a trip given start/end dates and optional meal deductions

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `day_data` | array | No | Optional per-day meal and lodging breakdown, one entry per trip day. Required to reflect per-meal deductions: without it the estimate uses the full daily rate even when meals_provided is set. |
| `end_date` | string | Yes | End date of the per diem period (YYYY-MM-DD). |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `trip_uuid` | string | No | UUID of the trip to estimate per diem for. Can be omitted if not linked to a trip. |
| `start_date` | string | Yes | Start date of the per diem period (YYYY-MM-DD). |
| `meals_provided` | boolean | No | Whether meals are provided during the trip. |
| `deduct_weekends` | boolean | No | Whether to deduct weekends from the per diem calculation. |

### Ramp events

**Slug:** `RAMP_MCP_RAMP_EVENTS`

Get audit log events

### Ramp execute analyst query

**Slug:** `RAMP_MCP_RAMP_EXECUTE_ANALYST_QUERY`

First use the analyst catalog and read the domain docs for every table in the query; those docs define supported tables, columns, joins, and metric semantics.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `sql` | string | Yes | Read-only DuckDB SQL to execute against analyst tables. Read GetAnalystCatalog once per chat and domain docs when each physical analyst table is first referenced. Qualify FROM/JOIN tables as `analyst.<table>`, qualify every column with its table name or alias, use only documented analyst columns, include every non-aggregated SELECT expression in GROUP BY, filter/join UUID string literals against `*_uuid` columns (never integer `*_id` columns), and use DATE 'YYYY-MM-DD' literals for date comparisons. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `artifact_instance_id` | string | No | Analyst artifact instance to query. |

### Ramp fund x402 wallet

**Slug:** `RAMP_MCP_RAMP_FUND_X402_WALLET`

Before calling, use ListBusinessAccounts to obtain the source account UUID;
never guess it. Confirm the exact source account and positive USD amount with
the user before creating this irreversible transfer. MCP and CLI callers must
provide an idempotency key. Only active Increase USD accounts are supported.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `amount` | string | Yes | Exact positive USD amount the user confirmed for funding. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `idempotency_key` | string | No | Caller-generated UUID used to prevent duplicate funding. Reuse it only when retrying the same request. |
| `source_wallet_account_uuid` | string | Yes | UUID of the source Ramp Checking Account returned by ListBusinessAccounts. Never guess an account UUID. |

### Ramp get account balance history

**Slug:** `RAMP_MCP_RAMP_GET_ACCOUNT_BALANCE_HISTORY`

Use when the user asks about balance history for a specific account,
savings account trend, checking account balance over time, or the
balance trend for a specific Ramp Checking Account. This tool only
supports Ramp Checking Accounts, not Investment Accounts or Managed
Portfolios.

### Ramp get agent card creds

**Slug:** `RAMP_MCP_RAMP_GET_AGENT_CARD_CREDS`

Handles card enrollment and purchase instructions automatically.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `amount` | string | Yes | Transaction amount as decimal string (e.g., '45.00') |
| `fund_id` | string | Yes | UUID of the fund to pay from |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `merchant_url` | string | Yes | Merchant website URL (e.g., 'https://figma.com') |
| `currency_code` | string | Yes | ISO 4217 currency code (e.g., 'USD') |
| `merchant_name` | string | Yes | Merchant name (e.g., 'Figma Inc') |
| `merchant_country_code` | string | Yes | 2-letter country code (e.g., 'US') |

### Ramp get agent card funds

**Slug:** `RAMP_MCP_RAMP_GET_AGENT_CARD_FUNDS`

Returns eligible funds with available balance.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get ai token spend aggregates

**Slug:** `RAMP_MCP_RAMP_GET_AI_TOKEN_SPEND_AGGREGATES`

Aggregate AI token usage or estimated cost over a time window, grouped by caller-selected dimensions (provider, model, configuration, department, user, or API-key tag group)

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `end_at` | string | Yes | Exclusive UTC end of the window. ISO date or datetime. |
| `metric` | string ("cost" | "usage") | Yes | 'cost' for estimated dollar cost, 'usage' for token counts. |
| `models` | array | No | Restrict to these exact model names (from GetAiTokenSpendFilterOptions.filter_options.models). Combined with the model_families/model_* facet filters via intersection. |
| `rollup` | string | No | Time bucketing. 'all' returns a single bucket per group; 'daily'/'weekly'/'monthly' return one row per bucket per group. |
| `group_by` | array | No | Dimensions to break results down by. Valid for both metrics: 'provider', 'model', 'configuration_id', 'tag_group'. Only for metric='usage': 'user_uuid', 'department_uuid'. Only for metric='cost': 'cost_category'. |
| `start_at` | string | Yes | Inclusive UTC start of the window. ISO date or datetime. |
| `providers` | array | No | Restrict to these providers. Usage supports OPENAI, ANTHROPIC, CURSOR, GCP, and AWS. AWS supports business-wide usage only. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `user_uuids` | array | No | metric='usage' only: restrict to these user UUIDs. |
| `model_speed` | array | No | Restrict to these speed facet keys (from filter_options.model_speed). |
| `model_families` | array | No | Restrict to these model family keys (from GetAiTokenSpendFilterOptions.filter_options.model_families). |
| `model_thinking` | array | No | Restrict to these thinking-mode facet keys (from filter_options.model_thinking). |
| `department_uuids` | array | No | metric='usage' only: restrict to these department UUIDs. |
| `configuration_ids` | array | No | Restrict to these AI provider configuration UUIDs. |
| `tag_definition_id` | string | No | Required when group_by contains 'tag_group'; the tag definition (label group) UUID to bucket by. |
| `model_compute_tier` | array | No | Restrict to these compute-tier facet keys (from filter_options.model_compute_tier). |
| `model_context_window` | array | No | Restrict to these context-window facet keys (from filter_options.model_context_window). |
| `model_fine_tune_source` | array | No | Restrict to these fine-tune-source facet keys (from filter_options.model_fine_tune_source). |

### Ramp get ai token spend connections

**Slug:** `RAMP_MCP_RAMP_GET_AI_TOKEN_SPEND_CONNECTIONS`

Use GetAiTokenSpendCurrentSpend for actual vendor spend and GetAiTokenSpendAggregates for estimated token usage and cost.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get ai token spend current spend

**Slug:** `RAMP_MCP_RAMP_GET_AI_TOKEN_SPEND_CURRENT_SPEND`

Requires transaction, reimbursement, or bill read access.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get ai token spend filter options

**Slug:** `RAMP_MCP_RAMP_GET_AI_TOKEN_SPEND_FILTER_OPTIONS`

List the dimensions and values available for AI-spend aggregate queries: providers, models, model families/facets, departments, and API-key tag groups

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get analyst catalog

**Slug:** `RAMP_MCP_RAMP_GET_ANALYST_CATALOG`

Review the catalog before writing a query, then read domain docs for every table used.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `artifact_instance_id` | string | No | Analyst artifact instance whose catalog should be returned. |

### Ramp get analyst metric metadata

**Slug:** `RAMP_MCP_RAMP_GET_ANALYST_METRIC_METADATA`

Discover supported analyst metrics and starter SQL for aggregate business analysis

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `artifact_instance_id` | string | No | Analyst artifact instance whose metric metadata should be returned. |

### Ramp get analyst spend facts domain docs

**Slug:** `RAMP_MCP_RAMP_GET_ANALYST_SPEND_FACTS_DOMAIN_DOCS`

Read domain documentation for analyst.spend_facts before using it in an analyst query

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `artifact_instance_id` | string | No | Analyst artifact instance whose spend facts docs should be returned. |

### Ramp get analyst table domain docs

**Slug:** `RAMP_MCP_RAMP_GET_ANALYST_TABLE_DOMAIN_DOCS`

Read domain documentation for an analyst table before using it in an analyst query

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `qualified_name` | string | Yes | Schema-qualified analyst table whose domain docs should be returned. |
| `artifact_instance_id` | string | No | Analyst artifact instance whose table docs should be returned. |

### Ramp get attention feed

**Slug:** `RAMP_MCP_RAMP_GET_ATTENTION_FEED`

Use this tool to see what needs the user's attention right now: pending approvals,
missing receipts, overdue reviews, signatures, and similar action items that appear
on the Ramp homepage.

By default, the tool returns the default homepage sections with compact
LIST-hydrated task rows. To fetch more from a section, pass that section's
section_type and next_cursor back in sections.

For own-card GET_ATTENTION_FEED remediation, use this as the canonical task feed.
blocking_effects describes a task type's possible sanction, not proof that an item
caused the active lock. Use browser_handoff for user action in Ramp. For an
available CompleteTransactionRevision, inspect or edit the transaction and call
it with a nonblank reason. Re-read both tools and continue relevant overdue tasks;
success requires the task absent, blocking_task_count=0, and is_spendable=true.
Pending verification is not an unlock.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `sections` | array | No | Optional section pagination requests. Omit this to return the default homepage attention feed. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `fanout_timeout_seconds` | number | No | Timeout applied to task-feed section and hydration fanout work. |

### Ramp get authorized businesses

**Slug:** `RAMP_MCP_RAMP_GET_AUTHORIZED_BUSINESSES`

This tool returns all client businesses that the external firm (advisor console) user
has been granted access to. Use this to understand which businesses the user can
work with or to help them find a specific client.

Supports filtering by business display name and pagination for large lists.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `after` | string | No | Pagination cursor. Pass the 'next_cursor' from a previous response to get the next page. |
| `page_size` | integer | No | Number of results to return per page (max 500) |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `business_name_filter` | string | No | Optional filter to search businesses by display name (partial match supported) |

### Ramp get bank accounts

**Slug:** `RAMP_MCP_RAMP_GET_BANK_ACCOUNTS`

List bank accounts

### Ramp get bill amount summary

**Slug:** `RAMP_MCP_RAMP_GET_BILL_AMOUNT_SUMMARY`

Examples: total unpaid amount, total pending amount. Use when users ask
things like "How much do we owe in bills?" or "What's our total
outstanding bill amount?".

Bills in Ramp have two stages: draft bills (created/uploaded but not yet
submitted; use the draft-bill tools) and bills (submitted; they move through
approval, then scheduling, then payment). A draft keeps the same ID after
submission, but draft-only tools stop working on it once submitted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `max_amount` | number | No | Maximum bill amount to include |
| `min_amount` | number | No | Minimum bill amount to include |
| `due_date_to` | string | No | Only include bills with due date on or before this date (YYYY-MM-DD) |
| `vendor_name` | string | No | Filter by vendor name (partial match, minimum 3 characters). Example: 'Amazon' |
| `due_date_from` | string | No | Only include bills with due date on or after this date (YYYY-MM-DD) |
| `payment_status` | string | No | Filter by payment status: 'OPEN' (unpaid) or 'PAID' |

### Ramp get bill comments

**Slug:** `RAMP_MCP_RAMP_GET_BILL_COMMENTS`

Bills in Ramp have two stages: draft bills (created/uploaded but not yet
submitted; use the draft-bill tools) and bills (submitted; they move through
approval, then scheduling, then payment). A draft keeps the same ID after
submission, but draft-only tools stop working on it once submitted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `bill_id` | string | Yes | The UUID of the bill |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get bill details

**Slug:** `RAMP_MCP_RAMP_GET_BILL_DETAILS`

Requires a bill UUID and known submitted status. A UUID alone does not
establish submission: a draft keeps the same UUID after submission.
Not applicable to bills whose draft/submitted stage is unknown or to
unsubmitted drafts.

Returns bill metadata, payment status, and approval status. Submitted bills
include bills awaiting approval, scheduling, or payment.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `bill_id` | string | Yes | UUID of a bill whose submitted status is confirmed (is_draft=false). A UUID appearing in a report or another tool result does not itself confirm submission. Does not accept draft or unknown-stage bill UUIDs. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get bill history

**Slug:** `RAMP_MCP_RAMP_GET_BILL_HISTORY`

Returns a chronological event log — creation, submission, each
approval-chain action with actor and timestamp, and deletion. Use it to
answer questions like "who approved this bill?".

Bills in Ramp have two stages: draft bills (created/uploaded but not yet
submitted; use the draft-bill tools) and bills (submitted; they move through
approval, then scheduling, then payment). A draft keeps the same ID after
submission, but draft-only tools stop working on it once submitted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `bill_id` | string | Yes | The UUID of the bill to retrieve history for |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get bill invoices

**Slug:** `RAMP_MCP_RAMP_GET_BILL_INVOICES`

Returns the source documents backing the bill: for each attachment, the
filename, type, and a time-limited download URL (the URL expires after
about 3 days). Draft bills are not supported: draft attachments are not
retrievable through agent tools. get-draft-bill-details returns draft
metadata and a link to the draft page in the Ramp web app, where
attachments can be viewed.

Bills in Ramp have two stages: draft bills (created/uploaded but not yet
submitted; use the draft-bill tools) and bills (submitted; they move through
approval, then scheduling, then payment). A draft keeps the same ID after
submission, but draft-only tools stop working on it once submitted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `bill_id` | string | Yes | The UUID of the bill to retrieve invoices for |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get bill metrics

**Slug:** `RAMP_MCP_RAMP_GET_BILL_METRICS`

Use this to answer questions like "How many bills are pending approval?" or "How many overdue bills do we have?".

Bills in Ramp have two stages: draft bills (created/uploaded but not yet
submitted; use the draft-bill tools) and bills (submitted; they move through
approval, then scheduling, then payment). A draft keeps the same ID after
submission, but draft-only tools stop working on it once submitted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `is_draft` | boolean | No | If True, only count draft bills. If False, exclude drafts. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `to_due_date` | string | No | Only count bills with due date on or before this date (YYYY-MM-DD). Set to today's date to find overdue bills. |
| `vendor_name` | string | No | Search for bills from vendors matching this name (partial match) |
| `from_due_date` | string | No | Only count bills with due date on or after this date (YYYY-MM-DD). Useful for finding overdue bills when combined with a to_due_date in the past. |
| `payment_status` | string | No | Filter by payment status: 'OPEN' (unpaid) or 'PAID' |
| `status_summary` | string | No | Filter by detailed status summary. Options include: 'APPROVAL_PENDING', 'APPROVAL_REJECTED', 'PAYMENT_READY', 'PAYMENT_SCHEDULED', 'PAYMENT_PROCESSING', 'PAYMENT_COMPLETED', 'PAYMENT_ERROR', 'DRAFT_MISSING_INFO', 'DRAFT_READY', 'DRAFT_PARSING', 'AWAITING_RELEASE', 'PAYMENT_DETAILS_MISSING' |
| `approval_status` | string | No | Filter by approval chain status: 'PENDING', 'APPROVED', 'REJECTED' |

### Ramp get bills for approval

**Slug:** `RAMP_MCP_RAMP_GET_BILLS_FOR_APPROVAL`

Use this tool when the user wants to see bills they need to approve or asks
about pending approvals. This returns only bills where the authenticated
user is the next required approver in the approval chain.

Bills in Ramp have two stages: draft bills (created/uploaded but not yet
submitted; use the draft-bill tools) and bills (submitted; they move through
approval, then scheduling, then payment). A draft keeps the same ID after
submission, but draft-only tools stop working on it once submitted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum number of bills to return |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `page_cursor` | string | No | 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'). |

### Ramp get bill status

**Slug:** `RAMP_MCP_RAMP_GET_BILL_STATUS`

This tool does not determine required next actions: next_action_required is
always null (unavailable), not confirmation that no action is needed. Summary
labels describe recorded status. PAYMENT_DETAILS_MISSING indicates incomplete
details required for payment release; it does not identify the missing fields,
who must supply them, or whether a payment date can be selected.

Bills in Ramp have two stages: draft bills (created/uploaded but not yet
submitted; use the draft-bill tools) and bills (submitted; they move through
approval, then scheduling, then payment). A draft keeps the same ID after
submission, but draft-only tools stop working on it once submitted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `bill_id` | string | Yes | The UUID of the bill to check status for |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get booking details

**Slug:** `RAMP_MCP_RAMP_GET_BOOKING_DETAILS`

Call filtered GetBookings first when the booking UUID is unknown.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `booking_id` | string | Yes | Exact booking UUID returned by GetBookings. If unknown, call GetBookings with descriptive filters first. |

### Ramp get bookings

**Slug:** `RAMP_MCP_RAMP_GET_BOOKINGS`

Optionally identify existing bookings by city, hotel name, flight airline, flight number, booking reference, or travel date. Filters for the same booking type combine with AND; mixed hotel- and flight-specific filters match each type independently. Matching entries are returned up to limit for caller disambiguation, except include_past may return up to limit upcoming and limit past entries per type. Returns confirmed bookings and pending requests ordered upcoming-first (soonest next booking first, then past most recent first), with unsuccessful requests available via include_failed; check the status field and call GetBookingDetails for one entry's detailed state.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `city` | string | No | Optional case-insensitive partial city match against hotel cities and every flight segment's arrival city or airport code, including connections. Flight city names, abbreviations, and Ramp city IDs also match metro airports; exact airport IATA codes match only that airport. |
| `limit` | integer | No | Maximum number of bookings to return per type. With include_past=True, applies separately to upcoming and past bookings. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `hotel_name` | string | No | Optional case-insensitive partial hotel-name match applied only to hotels. When combined with flight-specific filters, each booking type is matched independently. |
| `travel_date` | string | No | Optional local calendar date that must inclusively overlap the flight's full itinerary or the hotel stay (YYYY-MM-DD). A travel_date on or before today implies include_past=True, so lookups for earlier dates also return completed bookings. |
| `include_cars` | boolean | No | Whether to include car rental bookings |
| `include_past` | boolean | No | Whether to include past/completed bookings (flights that have already landed, hotel stays that have ended, car rentals already returned). Defaults to False so that cancellation/modification requests operate on current and upcoming bookings only and never act on a past booking by mistake. Set to True ONLY when the user explicitly asks about their past, previous, or historical bookings. Implied automatically when travel_date is today or earlier. Pending/in-progress requests are always returned regardless of this flag. The limit is applied separately to upcoming and past bookings when this is True. |
| `flight_number` | string | No | Optional flight-number match against every segment. Spaces, punctuation, case, and leading zeroes in the numeric portion are ignored, so UA100, UA 0100, UA 100, ua-100, and the numeric portion 100 match. |
| `flight_airline` | string | No | Optional case-insensitive partial airline-name match against every flight segment, including connections. This filter applies only to flights; when combined with hotel_name, each booking type is matched independently. |
| `include_failed` | boolean | No | Whether to include unsuccessful terminal booking requests that did not produce a confirmed booking: errors, cancellations, and rejections, shown as FAILED, CANCELLED, and REJECTED. Defaults to False. Set to True when the user explicitly asks about an unsuccessful booking attempt OR when a recent request known from the current conversation is missing from the default result. Retry with this flag before describing a missing request's state; do not reuse its earlier pending state. Confirmed, pending, and in-progress bookings are always returned regardless of this flag. |
| `include_hotels` | boolean | No | Whether to include hotel bookings |
| `include_flights` | boolean | No | Whether to include flight bookings |
| `traveler_user_id` | string | No | Optional UUID of another user whose bookings to retrieve (resolve the person with GetAllReducedUsers, not LookupUser). Defaults to the acting user. Results are scoped to bookings the acting user is authorized to view; an unauthorized lookup returns empty lists. |
| `booking_reference` | string | No | Optional case-insensitive exact match against a confirmed flight booking reference, PNR, or airline confirmation number on any segment. Use this for the booking reference provided by the traveler; use flight_number for airline segment numbers. This filter applies only to confirmed flights. |
| `verification_mode` | boolean | No | Use only when determining whether Ramp can service an existing flight or hotel booking. Bounds all reads, includes past/completed bookings so a finished Ramp trip still counts as on-platform, and reports whether the result is incomplete; when incomplete, do not conclude that no Ramp booking exists. |

### Ramp get business statement date

**Slug:** `RAMP_MCP_RAMP_GET_BUSINESS_STATEMENT_DATE`

Get the business's statement billing schedule: the next statement close date, the configured statement close day of month, and the next card payment or autopay debit date

### Ramp get candidate trips for transaction

**Slug:** `RAMP_MCP_RAMP_GET_CANDIDATE_TRIPS_FOR_TRANSACTION`

Returns up to 10 ongoing, upcoming, and recently completed trips. Supports
general trip lookups as well as expense matching; no transaction is required.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get card statement balance

**Slug:** `RAMP_MCP_RAMP_GET_CARD_STATEMENT_BALANCE`

how much was due, how much has been paid, what's still outstanding, and
when the next payment is due.

Use this when the user asks about their card statement balance, why they
got a delinquency / outstanding balance notice after paying, what their
remaining balance is, or how their last payment was applied. Common
phrasings: "I paid X but still got an outstanding balance notice",
"what's my statement balance", "why am I still showing a balance".

Returns the most recent statement only. Doesn't include current-cycle
(post-statement-close) charges — those are surfaced via separate
transaction-listing tools when needed.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get decline explanation

**Slug:** `RAMP_MCP_RAMP_GET_DECLINE_EXPLANATION`

Returns the reason, remediation actions, user notification, and transaction details. Only valid for already-declined transactions.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `transaction_uuid` | string | Yes | The UUID of the declined transaction |

### Ramp get draft bill details

**Slug:** `RAMP_MCP_RAMP_GET_DRAFT_BILL_DETAILS`

Submitted bills, including those awaiting approval or payment, are not
supported. A draft link may be stale after submission.

Returns compact draft-bill metadata by default. Set return_line_items=true
to include the full editable payload with line items and tracking categories.

Bills in Ramp have two stages: draft bills (created/uploaded but not yet
submitted; use the draft-bill tools) and bills (submitted; they move through
approval, then scheduling, then payment). A draft keeps the same ID after
submission, but draft-only tools stop working on it once submitted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `bill_id` | string | Yes | The UUID of an active, unsubmitted draft bill. Pass only the UUID, not a full URL, invoice number, or payment ID. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `return_line_items` | boolean | No | When true, include the full editable payload inline, including line items and tracking-category detail. Leave false to return only a compact summary. |

### Ramp get employee submission policy requirements

**Slug:** `RAMP_MCP_RAMP_GET_EMPLOYEE_SUBMISSION_POLICY_REQUIREMENTS`

Returns the same summaries shown in the employee handbook's transaction requirements.

### Ramp get expense workflow context

**Slug:** `RAMP_MCP_RAMP_GET_EXPENSE_WORKFLOW_CONTEXT`

Provide exactly one expense UUID. Use get-policy-workflow-body to inspect the referenced policy's workflow body.

### Ramp get flight booking locations

**Slug:** `RAMP_MCP_RAMP_GET_FLIGHT_BOOKING_LOCATIONS`

Preserve the user's location wording in ``query``. When the user names a city or
metro area such as "NYC", set ``location_type=city``. A returned city
``search_code`` searches all supported airports in that metro; do not ask the
user to choose one airport when a city result is available.

Call this before SearchFlights for every departure or arrival location that the
user did not provide as an exact airport IATA code. If the results contain
multiple plausible locations, present the choices and wait for the user to
clarify; never choose a location on their behalf. Do not infer a location from
profile data, an area code, or a broad description such as "somewhere warm."

Returns locations where flights can be booked from or to, which may include:
- Individual airports (e.g., JFK, SFO, LAX)
- City groups with multiple airports (e.g., NYC includes JFK, LGA, EWR)
- Major travel destinations with flight availability

Pass a result's ``search_code`` straight into SearchFlights departure/arrival.
Cities search every airport in the metro area; airports search just that airport.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum number of location results to return |
| `query` | string | Yes | The exact location wording from the user (e.g., 'SF', 'San Francisco', 'NYC', 'JFK', 'Boston Logan'). Preserve abbreviations such as NYC; do not rewrite them before resolution. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `location_type` | string ("airport" | "city" | "none") | No | Specific location type: use 'city' when the user names a city or metro area such as NYC, 'airport' for a specific airport, or 'none' when the intent is genuinely unknown. |

### Ramp get full transaction metadata

**Slug:** `RAMP_MCP_RAMP_GET_FULL_TRANSACTION_METADATA`

Read the amount from `amount_decimal`, which is already in `currency`'s major unit
and needs no arithmetic. Ignore `amount_cents`; it is the same amount in minor units,
kept only for backwards compatibility.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `id` | string | Yes | Transaction id (from tool calls or metadata) |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get funds

**Slug:** `RAMP_MCP_RAMP_GET_FUNDS`

or permitted spend. For a named person's funds, resolve their UUID with GetOrgChart
and pass user_uuids. For the current user's funds, use MY_FUNDS. Search by fund name
with search_by_fund_display_name or look up a known UUID with fund_uuid.

When balance_info is returned, treat its remaining balance as authoritative for cleared
charges and pending authorizations. Do not subtract those amounts again. Never infer that
a booking is included merely because it is confirmed: a postpaid booking with no charge or
pending authorization is a future charge and has not yet reduced the remaining balance.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `state` | string | No | 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. |
| `cursor` | string | No | Cursor from a previous response. Reuse the same filters when paginating. |
| `fund_uuid` | string | No | UUID of a specific fund to look up. Use this when you already have a fund UUID and want to retrieve its details or balance. |
| `is_shared` | boolean | No | Filter by whether the fund is shared. Use true when the user asks for shared funds only. |
| `page_size` | integer | No | Maximum number of funds to return. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `user_uuids` | array | No | 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. |
| `include_balance` | boolean | No | 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? |
| `include_members` | boolean | No | Set to True when the user asks about who has access to a fund, who owns a fund, or who are the members of a fund. Returns each user with their access role (OWNER, COOWNER, MEMBER, COORDINATOR) so the fund owner can be identified. |
| `funds_to_retrieve` | string | No | 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. |
| `include_lock_info` | boolean | No | 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. |
| `for_transaction_id` | string | No | When provided, returns the other funds this transaction could be reassigned to (not the fund it was charged to or declined against). All other parameters are ignored. |
| `spend_intent_uuids` | array | No | Filter to funds issued from the specified spend program UUIDs. Resolve spend programs with ListSpendIntentsTool first, then pass the matching UUIDs here. |
| `agent_card_eligible` | boolean | No | Filter to funds that can be used for agent (virtual) card payments. Set True to return only funds that are active AND have virtual cards enabled — the only funds an agent card can be minted on. Set False to return the funds that cannot. Leave unset to return funds regardless of agent-card eligibility. Every returned fund also carries an `agent_card_eligible` flag. |
| `include_restrictions` | boolean | No | 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. |
| `search_by_fund_display_name` | string | No | 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. |

### Ramp get hotel rates

**Slug:** `RAMP_MCP_RAMP_GET_HOTEL_RATES`

Use this after the user picks a hotel from SearchHotels results and before booking. Every current room group and its rates for the stay are returned in all_rates; the returned rate.id values are the exact IDs to pass to SubmitHotelBooking. These rates are current options, not quotes - wait for the traveler to select one exact rate. When the result's all_rates_out_of_policy is true, every rate at this hotel is out of policy for the stay: tell the traveler, prefer offering an in-policy hotel from the SearchHotels results, and proceed with this hotel only if the traveler explicitly chooses to - booking will then require an oop_reason at SubmitHotelBooking.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `filters` | string | No | Optional rate-level preferences from the traveler's saved or current-trip preferences. Rates meeting more preferences rank higher in recommended_rates, but best-available fallbacks are still returned when nothing matches (see each group's unmet_preferences); all_rates remains the complete selectable inventory. |
| `hotel_id` | string | Yes | Hotel UUID from SearchHotels results. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `search_id` | string | No | Completed SearchHotels search_id for the selected hotel. Pass it when available so the result includes cached hotel metadata, including office travel details. |
| `num_adults` | integer | No |  |
| `check_in_date` | string | Yes | Hotel check-in date in YYYY-MM-DD format |
| `check_out_date` | string | Yes | Hotel check-out date in YYYY-MM-DD format |
| `traveler_user_id` | string | No | Traveler UUID when retrieving rates on behalf of another user. |
| `max_recommended_rates` | integer | No | Maximum number of best recommended room-rate options to return. Defaults to 3. Pass 0 to suppress recommendations entirely for a plain listing: the result then has an empty display_ui_recommended_cards, renders no rate cards, and every rate is presented as text. Card-less callers receive recommended_rates alongside the complete all_rates inventory. |

### Ramp get investment account balance

**Slug:** `RAMP_MCP_RAMP_GET_INVESTMENT_ACCOUNT_BALANCE`

Use this when the user asks about investment account balances, brokerage cash,
or the current balance of Ramp investment accounts. Returns all investment
accounts the business has, along with balances, status, yield, and earnings.

### Ramp get latest sync

**Slug:** `RAMP_MCP_RAMP_GET_LATEST_SYNC`

Use this when you need the latest sync status plus every intended and successful count exposed by Ramp's accounting latest-sync endpoint.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `sync_type` | string | Yes | Sync type to fetch, such as TRANSACTION_SYNC, BILL_SYNC, BILL_PAYMENT_SYNC, REIMBURSEMENT_SYNC, TRANSFER_SYNC, WALLET_TRANSFER_SYNC, or ACCRUAL_SYNC. |

### Ramp get managed portfolio account balance

**Slug:** `RAMP_MCP_RAMP_GET_MANAGED_PORTFOLIO_ACCOUNT_BALANCE`

Use this when the user asks about managed portfolio balances, managed
portfolio cash, or the current balance of Ramp managed portfolio accounts.
Returns all managed portfolio accounts the business has, along with balances,
market value, status, yield, and earnings.

### Ramp get missing items by user

**Slug:** `RAMP_MCP_RAMP_GET_MISSING_ITEMS_BY_USER`

Returns a paginated list of users you are allowed to view who have outstanding missing items, along with sample transactions. Use get-transaction-missing-items for per-transaction detail.

### Ramp get more tools

**Slug:** `RAMP_MCP_RAMP_GET_MORE_TOOLS`

Use this when the user's request cannot be completed with the available Ramp
tools. Describe the user's goal and the capability that would be needed.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `context` | string | Yes | The user's goal and the missing capability needed to accomplish it. Do not include secrets, credentials, or financial account details. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get my ai token spend aggregates

**Slug:** `RAMP_MCP_RAMP_GET_MY_AI_TOKEN_SPEND_AGGREGATES`

Aggregate the acting user's own AI token usage and estimated token cost over a time window, optionally grouped by provider and model

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `end_at` | string | Yes | Exclusive UTC end of the window. ISO date or datetime. |
| `models` | array | No | Restrict to these exact model names. |
| `rollup` | string | No | Time bucketing. 'all' returns a single bucket per group; 'daily'/'weekly'/'monthly' return one row per bucket per group. |
| `group_by` | array | No | Dimensions to break results down by. Supported: 'provider', 'model'. |
| `start_at` | string | Yes | Inclusive UTC start of the window. ISO date or datetime. |
| `providers` | array | No | Restrict to these providers. Supported: OPENAI, ANTHROPIC, CURSOR, GCP. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `model_speed` | array | No | Restrict to these speed facet keys. |
| `model_families` | array | No | Restrict to these model family keys. |
| `model_thinking` | array | No | Restrict to these thinking-mode facet keys. |
| `model_compute_tier` | array | No | Restrict to these compute-tier facet keys. |
| `model_context_window` | array | No | Restrict to these context-window facet keys. |
| `model_fine_tune_source` | array | No | Restrict to these fine-tune-source facet keys. |

### Ramp get office locations

**Slug:** `RAMP_MCP_RAMP_GET_OFFICE_LOCATIONS`

Use this to find office addresses when searching for hotels near an office or determining travel destinations.

The two shapes are complementary: ``office_locations`` has coordinates but no
street address, and ``company_address`` has a street address but no coordinates.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get org chart

**Slug:** `RAMP_MCP_RAMP_GET_ORG_CHART`

This tool provides comprehensive org chart visibility including:
- The user's position in the organization
- Their direct reports (team members)
- Their reporting chain (managers up the hierarchy)

Use this tool whenever the user asks anything about their manager, team, or direct reports.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `user_id` | string | No | Ramp user UUID to get the org chart for. Omit this field or pass null to get the org chart for the current user. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get outstanding reimbursements by currency

**Slug:** `RAMP_MCP_RAMP_GET_OUTSTANDING_REIMBURSEMENTS_BY_CURRENCY`

Get approved and failed reimbursements that would be affected by a bank account currency change

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `entity_uuid` | string | No | Optional entity UUID to check entity-level reimbursements instead of the current user's. |
| `new_currency` | string | Yes | The currency code of the new bank account (e.g. 'USD', 'EUR', 'GBP'). |

### Ramp get pending travel requests

**Slug:** `RAMP_MCP_RAMP_GET_PENDING_TRAVEL_REQUESTS`

Use this when a user asks about travel requests they need to approve.
Returns pending flight, hotel, and car rental booking requests that require action.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `page_size` | integer | No | Number of pending travel requests to return per page. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `next_page_cursor` | string | No | Cursor from the previous response. Omit for the first page and pass the returned value unchanged for subsequent pages. |

### Ramp get policies

**Slug:** `RAMP_MCP_RAMP_GET_POLICIES`

List policy versions for a standalone Agent Wallet

### Ramp get policy details

**Slug:** `RAMP_MCP_RAMP_GET_POLICY_DETAILS`

Accepts either the policy UUID or the backing product workflow UUID returned by list-policies.

### Ramp get policy workflow body

**Slug:** `RAMP_MCP_RAMP_GET_POLICY_WORKFLOW_BODY`

Accepts the policy UUID or the backing product workflow UUID from list-policies. Use this for workflow routing and thresholds, not for written policy document guidance.

### Ramp get procurement draft

**Slug:** `RAMP_MCP_RAMP_GET_PROCUREMENT_DRAFT`

Refresh and canonically revalidate a procurement draft's visible form state

### Ramp get purchase order details

**Slug:** `RAMP_MCP_RAMP_GET_PURCHASE_ORDER_DETAILS`

Use this with the exact purchase order UUID returned by the purchase-order
search tool available to the caller or supplied by page context. Never pass a
purchase order number, another entity's UUID, a placeholder, or a guessed value.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `purchase_order_id` | string | Yes | Exact purchase_order_id returned by the purchase-order search tool available to the caller or supplied by page context. Do not pass a PO number, another entity's UUID, the all-zero UUID, a placeholder, or a guessed value. |

### Ramp get ramp business account balance

**Slug:** `RAMP_MCP_RAMP_GET_RAMP_BUSINESS_ACCOUNT_BALANCE`

Returns the available balance, statement balance, and other details for all
Ramp Checking Accounts associated with the user's business. This includes
yield/earnings information and account status.

This tool is intentionally limited to the stable user-facing fields for
Ramp Checking Accounts. Do not infer deprecated pending balances or current
month accrued yield values from other treasury payloads when responding to
the user.

### Ramp get recurring bill

**Slug:** `RAMP_MCP_RAMP_GET_RECURRING_BILL`

Bills in Ramp have two stages: draft bills (created/uploaded but not yet
submitted; use the draft-bill tools) and bills (submitted; they move through
approval, then scheduling, then payment). A draft keeps the same ID after
submission, but draft-only tools stop working on it once submitted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `recurring_bill_id` | string | Yes | The UUID of the recurring bill template to retrieve |

### Ramp get reimbursement receipts

**Slug:** `RAMP_MCP_RAMP_GET_REIMBURSEMENT_RECEIPTS`

Retrieve receipts attached to a reimbursement

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `reimbursement_uuid` | string | Yes | UUID of the reimbursement. Call GetReimbursements to determine the UUID if it cannot be obtained from context. |

### Ramp get reimbursements

**Slug:** `RAMP_MCP_RAMP_GET_REIMBURSEMENTS`

amount ranges, tags, date ranges, approval status, and policy assessments.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `tags` | array | No | 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. |
| `to_date` | string | No | End date for filtering by when the reimbursement draft was created (YYYY-MM-DD format), not the expense/receipt transaction date. Do not set this when trying to match a newly uploaded receipt to an existing draft reimbursement; compare returned candidates' transaction_date instead. |
| `from_date` | string | No | Start date for filtering by when the reimbursement draft was created (YYYY-MM-DD format), not the expense/receipt transaction date. Do not set this when trying to match a newly uploaded receipt to an existing draft reimbursement; compare returned candidates' transaction_date instead. |
| `page_size` | integer | No | Maximum number of reimbursements to return in one request. Use smaller numbers (10-25) for quick overviews, larger numbers (50-200) for comprehensive analysis |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `search_string` | string | No | Search for reimbursements with matching merchant name, memo, or cardholder name. Do not set this when trying to match a newly uploaded receipt to a draft reimbursement; draft merchant names may be normalized differently from the receipt merchant. |
| `next_page_cursor` | string | No | Use this to get additional results after the first page. Copy the next_page_cursor value from a previous response to continue pagination |
| `include_suggestions` | boolean | No | 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. |
| `reimbursement_uuids` | array | No | Filter by reimbursement UUIDs |
| `include_policy_assessment` | boolean | No | 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. |
| `reimbursements_to_retrieve` | string | No | Which set of reimbursements to search: your own reimbursements, reimbursements awaiting your approval, or all reimbursements across the business |

### Ramp get reimbursements for approval

**Slug:** `RAMP_MCP_RAMP_GET_REIMBURSEMENTS_FOR_APPROVAL`

Includes policy assessment data and recommended actions.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No |  |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get requests to review

**Slug:** `RAMP_MCP_RAMP_GET_REQUESTS_TO_REVIEW`

This is the approval-queue wrapper over SearchUnifiedRequests. Use it when
the user is specifically asking what they need to review or approve right
now. For broader lookup by vendor, owner, status, or request name, prefer
SearchUnifiedRequests instead. Only handles lookups, does not take any action.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `start` | string | No | Pagination cursor for next page |
| `thoughts` | string | Yes | 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)? |
| `page_size` | integer | No | Number of requests to return per page (1-100) |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `request_types` | array | No | Types of spend requests to include (defaults to all types: PURCHASE_ORDER, SPEND_ALLOCATION, APPROVAL_ONLY, PROCUREMENT_SPEND_ALLOCATION) |

### Ramp get rfx detail

**Slug:** `RAMP_MCP_RAMP_GET_RFX_DETAIL`

cover sheet, pricing sheet, dates, vendor invitations with contacts, and the
actions the acting user can currently perform.

Use this to inspect or review a specific RFX before editing, inviting
vendors, or publishing. The ``available_actions`` block is the publish
preflight: it reports whether publish (and every other lifecycle action) is
currently allowed and why not, and the ``vendors`` block lists the exact
contacts who would be notified on publish. For response contents or grading
state, use GetRFXVendorResponses, GetRFXResponseSummary, or
GetRFXGradingOverview instead.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the RFX to inspect |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get rfx grading overview

**Slug:** `RAMP_MCP_RAMP_GET_RFX_GRADING_OVERVIEW`

recommendations, per-vendor per-section grading status and aggregate
scores, and any recorded field grades.

Use this after grading wraps up to compare how vendors scored. The overview
is only viewable once the RFX is GRADED or CLOSED; before that this tool
reports it as unavailable. For the raw submitted answers, use
GetRFXVendorResponses; for response and invitation progress counts, use
GetRFXResponseSummary.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the RFX to inspect |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get rfx response summary

**Slug:** `RAMP_MCP_RAMP_GET_RFX_RESPONSE_SUMMARY`

Summarize vendor response and grading progress for a specific RFX

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the RFX to inspect |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get rfx vendor responses

**Slug:** `RAMP_MCP_RAMP_GET_RFX_VENDOR_RESPONSES`

Return all submitted vendor responses for an RFX

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the RFX to inspect |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get simplified user detail

**Slug:** `RAMP_MCP_RAMP_GET_SIMPLIFIED_USER_DETAIL`

Returns multiple results for users that are part of multiple businesses.
When authenticated via an agent key, also returns the active agent key identity.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get sourcing event context

**Slug:** `RAMP_MCP_RAMP_GET_SOURCING_EVENT_CONTEXT`

Get a compact summary of a sourcing event, its RFXs, and invited vendors

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `sourcing_event_id` | string | Yes | UUID of the sourcing event to inspect |

### Ramp get sync commit failure details

**Slug:** `RAMP_MCP_RAMP_GET_SYNC_COMMIT_FAILURE_DETAILS`

Use this when a customer asks about failed accounting sync rows, including rows from the accounting transactions table, reimbursements table, or bills tab.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `sync_commit_uuid` | string | Yes | UUID of the sync commit whose failure details should be fetched. |

### Ramp get tracking categories

**Slug:** `RAMP_MCP_RAMP_GET_TRACKING_CATEGORIES`

as departments, classes or business units, locations, projects, customers, and cost
centers. Use GetTrackingCategoryOptions for a category's options. If passing
transaction_uuid, use an actual TransactionCanonical UUID from context or a prior
lookup; omit it rather than passing a placeholder or natural-language reference.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `include_hidden` | boolean | No | Set to True to include hidden categories. By default, only visible categories are returned. |
| `transaction_uuid` | string | No | Actual TransactionCanonical UUID of the transaction being coded, sourced from transaction context or a prior transaction lookup result. Must be a UUID string; omit this field if no transaction UUID is available. Never invent a placeholder or natural-language reference. |

### Ramp get tracking category options

**Slug:** `RAMP_MCP_RAMP_GET_TRACKING_CATEGORY_OPTIONS`

Pass `query_string` to narrow by name, synonym, or provider code. Do not call
this tool when you already have the exact tracking_category_option_uuid from
user-provided context, suggested codings, or another tool result; pass that
UUID directly to the coding tool as the option_selection. If the user message
includes `tracking_category_option_uuid=...`, do not call this tool just to
confirm the option. If you're coding a specific transaction or reimbursement,
pass its UUID so results respect conditional filtering (subsidiary,
department, location, etc.); skip it for generic lookups, including
bill/invoice contexts. Setting `include_hidden=true` disables semantic search,
so `query_string` then matches literal option names or codes only. Categories
can have millions of options — paginate via
`next_page_cursor` when needed, keeping all other inputs unchanged between pages.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `page_size` | integer | No | Max options per page (1-100). |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `query_string` | string | No | Filter options by name, natural-language synonym, or provider code (for example a custom GL code). |
| `include_hidden` | boolean | No | Include options unavailable in the UI and return each option's hidden_reason when known. This disables semantic search because semantic search cannot retain excluded options; query_string uses literal name or code matching instead. |
| `next_page_cursor` | integer | No | Pass the previous response's `next_page_cursor` only when every other input is unchanged. Omit it when changing the query or filters. |
| `transaction_uuid` | string | No | Optional. UUID of the transaction being coded; applies conditional filtering by the transaction's user/department/etc. |
| `reimbursement_uuid` | string | No | Optional. UUID of the reimbursement being coded; applies conditional filtering by the reimbursement's user/department/etc. |
| `tracking_category_uuid` | string | Yes | UUID of the tracking category to get options for. Obtain this from the session's tracking-category context or a registered category-listing tool. Do not call this tool if the exact tracking_category_option_uuid is already available; pass that UUID directly as option_selection. |

### Ramp get transaction missing items

**Slug:** `RAMP_MCP_RAMP_GET_TRANSACTION_MISSING_ITEMS`

Check what receipts, memos, or accounting items are missing from a specific transaction

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `id` | string | Yes | Transaction id (based on metadata or tool calls). |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get transactions

**Slug:** `RAMP_MCP_RAMP_GET_TRANSACTIONS`

Use analyst tools instead for aggregate spend analysis, totals, trends, or group-bys when analyst tools are available. Declined transactions are excluded by default; pass state='declined' to include them.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `sort` | string | No | Sort order. Defaults to transaction_date desc. |
| `state` | string | No | Filter by state. Defaults to non-declined; set 'declined' for declined/failed, or 'all' for everything. |
| `filters` | string | No | Structured filters by merchant, category, spend allocation, trip, or tracking category. |
| `to_date` | string | No | Inclusive end date, YYYY-MM-DD. |
| `from_date` | string | No | Inclusive start date, YYYY-MM-DD. |
| `page_size` | integer | No | Max transactions per page (1-200). |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `include_count` | boolean | No | Include total_count in the response. |
| `next_page_cursor` | string | No | Pass next_page_cursor from a prior response to fetch the next page. |
| `only_missing_items` | boolean | No | Set true to return only transactions with missing items, also called incomplete transactions or transactions with outstanding requirements, that require cardholder action. Leave false to apply no missing-items filter. |
| `transactions_to_retrieve` | string | Yes | Which set of transactions to search. |
| `details_to_include_in_response` | array | No | Optional extra fields to populate per transaction. 'submitted_items' returns receipts, attendees, trip, and the selected accounting categories (tracking category selections such as GL category or department) — use it when verifying accounting coding or reconciling against the general ledger. Model-ranked coding and fund suggestions are generated only when page_size=1; page through transactions one at a time when those suggestions are needed. |
| `reason_memo_merchant_or_user_name_text_search` | string | No | Text search (>=3 chars) across merchant names, memos, and employee names. Does not match trips, attendees, or fund names. |

### Ramp get transaction suggested memos

**Slug:** `RAMP_MCP_RAMP_GET_TRANSACTION_SUGGESTED_MEMOS`

Get AI-suggested memo/note options for a specific transaction

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `id` | string | Yes | The ID of the transaction to retrieve suggested memos for. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get traveler profile

**Slug:** `RAMP_MCP_RAMP_GET_TRAVELER_PROFILE`

For delegated bookings, first resolve the traveler with GetAllReducedUsers/list-users,
then pass that UUID as traveler_user_id. Omit traveler_user_id for self-booking.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `traveler_user_id` | string | No | Traveler UUID when reading another person's profile for delegated booking. Resolve names with list-users/GetAllReducedUsers first. Requires delegate or travel-manager permission. Omit for self-booking. |

### Ramp get treasury balance history

**Slug:** `RAMP_MCP_RAMP_GET_TREASURY_BALANCE_HISTORY`

Get daily balance history across all Treasury accounts for a date range

### Ramp get unified request details

**Slug:** `RAMP_MCP_RAMP_GET_UNIFIED_REQUEST_DETAILS`

Returns its status, approval chain, comments, activity timeline, custom
fields, and agent-generated reports. Accepts a unified_request_id or its
linked spend_request_uuid or wbp_request_id. Purchase-order IDs and PO
numbers are not accepted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `unified_request_id` | string | Yes | The exact unified_request_id, linked spend_request_uuid, or linked wbp_request_id from a tool result, tagged object, page context, or user-provided request. Do not pass a purchase_order_id or PO number. |

### Ramp get user recent reimbursements

**Slug:** `RAMP_MCP_RAMP_GET_USER_RECENT_REIMBURSEMENTS`

`limit` takes precedence over `up_to_days` so if you want to get all reimbursements in a given time frame, do not specify `limit`.
`include_rejected` controls whether to include rejected reimbursements in the results. By default, rejected reimbursements are excluded.
`include_drafts` controls whether to include draft reimbursements in the results. By default, drafts are excluded.
`use_submitted_date_ordering` controls the ordering of results. By default (False), results are ordered by transaction_date. Set to True to order by submitted_date instead.

If the user did not ask for a specific number of reimbursements or a time frame, assume they want to see the latest 10 reimbursements.

Read each amount from `amount_decimal`, which is already in `currency`'s major unit
and needs no arithmetic. Ignore `amount_cents`; it is the same amount in minor units,
kept only for backwards compatibility.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No |  |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `up_to_days` | integer | No |  |
| `include_drafts` | boolean | No |  |
| `include_rejected` | boolean | No |  |
| `use_submitted_date_ordering` | boolean | No |  |

### Ramp get user trips

**Slug:** `RAMP_MCP_RAMP_GET_USER_TRIPS`

Fetch trips for the acting user with optional filters

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `cursor` | string | No | Opaque bookmark returned by the API for pagination. |
| `status` | string ("completed" | "ongoing" | "upcoming") | No | Optional trip status filter. |
| `page_size` | integer | No | Optional number of trips to return per page. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp get vendor agreement

**Slug:** `RAMP_MCP_RAMP_GET_VENDOR_AGREEMENT`

Returns contract metadata, terms, line items, contract owners, documents, linked spend requests, and renewal history.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `payee_agreement_uuid` | string | Yes | UUID of the agreement/contract to retrieve |

### Ramp get vendor document bulk status

**Slug:** `RAMP_MCP_RAMP_GET_VENDOR_DOCUMENT_BULK_STATUS`

Use this after `BulkUploadVendorDocuments` to inspect the batch job status,
understand whether any documents still need manual review, and inspect the
current document/vendor matching and extracted tax details.

### Ramp hold

**Slug:** `RAMP_MCP_RAMP_HOLD`

Blocks payments to this vendor by placing a vendor-scoped hold. Open,
unpaid bills for the vendor that can still be modified are removed from
scheduled payment flows. An optional `reason` can be supplied to record
why the hold was placed.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `reason` | string | No | Optional reason for placing the vendor on hold. |

### Ramp invite vendors to rfx

**Slug:** `RAMP_MCP_RAMP_INVITE_VENDORS_TO_RFX`

Each vendor must be an existing payee in Ramp. To prepare vendors for invitation:
- Use `VendorSearch` to find existing payees by name
- Use `CreateDraftPayee` to add new vendors

The default contact for each payee is used automatically. When a payee has
no contacts and the RFX is still pre-publish (DRAFT or IN_REVIEW), the
vendor is added as a DRAFT invitation — the RFX cannot be submitted for
review or published until the user resolves the draft by providing a
contact on the RFX detail page. Each per-vendor result includes a
`status` of "active" or "draft" so the agent can tell the user which
vendors still need contacts.

External agent callers may only add vendors before the RFX is published.
Adding a vendor after publish sends an invitation immediately and must be
completed in Ramp.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the RFX to invite vendors to |
| `vendors` | array | Yes | List of vendors to invite, each identified by payee_uuid |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp issue from spend program

**Slug:** `RAMP_MCP_RAMP_ISSUE_FROM_SPEND_PROGRAM`

Use this tool when an admin wants to issue allocations from a spend program to
directly named users, or to users matched by location, department, user custom
field, and dynamic user group targeting.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `user_ids` | array | No | UUIDs of users to issue to directly. Segment filters intersect with each other. user_ids are unioned with the segment match. If issue_to_all_users is True, leave all targeting arrays empty or omit them. If issue_to_all_users is False, provide at least one non-empty targeting field. |
| `lock_date` | string | No | Optional ISO 8601 date or datetime when each issued fund should lock. Pass this when the admin asks for an expiration, end, or lock date. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `display_name` | string | No | Optional display name for each issued fund. If the admin provides a fund name, purpose, or a line like 'Name: ...', pass that value exactly. Omit only when the admin did not name the issued funds and wants them to inherit the spend program name. |
| `location_ids` | array | No | Location UUIDs for the segment match. Segment filters intersect with each other. user_ids are unioned with the segment match. If issue_to_all_users is True, leave all targeting arrays empty or omit them. If issue_to_all_users is False, provide at least one non-empty targeting field. |
| `spend_amount` | string | No | Custom spend amount as a decimal string (for example, "100.00"). Only required for custom spend intents; omit for fixed spend intents. |
| `department_ids` | array | No | Department UUIDs for the segment match. Segment filters intersect with each other. user_ids are unioned with the segment match. If issue_to_all_users is True, leave all targeting arrays empty or omit them. If issue_to_all_users is False, provide at least one non-empty targeting field. |
| `spend_currency` | string | No | Currency code to use when issuing from a custom spend intent. Only required for custom spend intents; omit for fixed spend intents. |
| `spend_interval` | string | No | Custom spend interval to use when issuing from a custom spend intent. Only required for custom spend intents; omit for fixed spend intents. |
| `spend_intent_uuid` | string | Yes | UUID of the spend program to issue from. |
| `issue_to_all_users` | boolean | No | Issue to every eligible user for the spend program. When True, all targeting arrays must be empty or omitted. When False, at least one targeting array must be non-empty. |
| `user_custom_field_ids` | array | No | User custom field UUIDs for the segment match. Segment filters intersect with each other. user_ids are unioned with the segment match. If issue_to_all_users is True, leave all targeting arrays empty or omit them. If issue_to_all_users is False, provide at least one non-empty targeting field. |
| `dynamic_user_group_ids` | array | No | Dynamic user group UUIDs for the segment match. Segment filters intersect with each other. user_ids are unioned with the segment match. If issue_to_all_users is True, leave all targeting arrays empty or omit them. If issue_to_all_users is False, provide at least one non-empty targeting field. |

### Ramp issue one off funds

**Slug:** `RAMP_MCP_RAMP_ISSUE_ONE_OFF_FUNDS`

Use this tool when an admin wants to create new funds for one or more users
with a specific amount, interval, and optional restrictions. This creates
virtual-card-only spend allocations outside of spend programs.

The acting user must have the SPEND_ISSUE_SPEND_BYPASS_APPROVAL permission.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `amount` | string | Yes | Spend limit amount (e.g. "5000.00"). |
| `interval` | string | No | Spending interval: DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY, or TOTAL. |
| `user_ids` | array | Yes | UUIDs of user(s) receiving funds. |
| `lock_date` | string | No | ISO 8601 datetime for fund expiry. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `member_ids` | array | No | UUIDs of additional members to share with. |
| `display_name` | string | Yes | Purpose/Name of the fund. |
| `is_shareable` | boolean | No | Whether allocation can be shared. Must be True if adding members/departments. |
| `location_ids` | array | No | Location UUIDs to share with. |
| `department_ids` | array | No | Department UUIDs to share with. |
| `vendor_blacklist` | array | No | Merchant UUIDs to block. Cannot be combined with vendor_whitelist. |
| `vendor_whitelist` | array | No | Merchant UUIDs to allow. Cannot be combined with vendor_blacklist. |
| `categories_blacklist` | array | No | MCC category IDs to block. |
| `categories_whitelist` | array | No | MCC category IDs to allow. |
| `user_custom_field_ids` | array | No | Custom field UUIDs for targeting. |
| `dynamic_user_group_ids` | array | No | Dynamic user group UUIDs. |
| `default_member_limit_amount` | string | No | Per-member spend limit. |

### Ramp limit increase

**Slug:** `RAMP_MCP_RAMP_LIMIT_INCREASE`

Supports temporary (resets at the next interval) and permanent increases.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `action` | string ("add" | "set") | No | Whether to set the limit to the specified amount, or add the amount to the current limit. |
| `amount` | string | Yes | The spending limit amount, in the major unit of the fund's own currency — pass a decimal string like "5000.00", never minor units, a currency symbol, or thousands separators. If action is 'set', this will be the new limit. If action is 'add', this amount will be added to the current limit. Must be greater than zero. |
| `reason` | string | No | The user's business purpose or justification for the limit increase. Preserve the reason supplied by the user; do not replace it with a description of the amount or increase type. |
| `card_id` | string | No | The card ID whose limit should be increased. Must provide either this or spend_allocation_id, not both. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `increase_type` | string ("permanent" | "temporary" | "unspecified") | No | The type of limit increase. 'temporary' resets at the next interval boundary, 'permanent' does not reset. 'unspecified' if the user has not indicated a preference. |
| `spend_allocation_id` | string | No | The spend allocation (fund) ID whose limit should be increased. Must provide either this or card_id, not both. |
| `user_confirmed_increase_type` | boolean | No | Whether the user has explicitly confirmed the increase type. Must be True before proceeding. |
| `user_confirmed_limit_increase` | boolean | No | Whether the user explicitly asked for or confirmed a fund limit increase. Do not infer confirmation from a currency correction, an over-limit reimbursement, a declined transaction, or a statement about the available budget. |

### Ramp list bills

**Slug:** `RAMP_MCP_RAMP_LIST_BILLS`

Returns bills for the current user's business. When called with no parameters,
returns the most recent bills. Supports optional text search across vendor name,
invoice number, and payment ID.

Bills in Ramp have two stages: draft bills (created/uploaded but not yet
submitted; use the draft-bill tools) and bills (submitted; they move through
approval, then scheduling, then payment). A draft keeps the same ID after
submission, but draft-only tools stop working on it once submitted.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum number of bills to return per page (1-50) |
| `query` | string | No | Optional text search filter (minimum 3 characters). Searches across vendor name, invoice number, and payment ID. Examples: 'UPS', 'INV-1722'. Will find partial matches. When omitted, returns all bills. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `page_cursor` | string | No | 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'). |
| `include_paid` | boolean | No | Whether to include paid bills in results. Set to false to see only unpaid bills. |

### Ramp list business accounts

**Slug:** `RAMP_MCP_RAMP_LIST_BUSINESS_ACCOUNTS`

Returns account details including balances, currency, yield rate, and status.
Use this tool when the user asks about their checking accounts, wallet accounts,
or wants to see an overview of their Ramp Checking Accounts.

### Ramp list cards

**Slug:** `RAMP_MCP_RAMP_LIST_CARDS`

IMPORTANT: For the current user's unlock request, call this tool first to check
spendability and locks. If cardholder_user_uuid targets another user, never open
the acting user's feed. For locks, follow remediation_action. Use
LockOrUnlockCard only when can_lock_or_unlock=true.
GET_ATTENTION_FEED means resolve the task there, not through LockOrUnlockCard;
re-list until blocking_task_count=0 and is_spendable=true. Do not use
GetUserFunds for card unlock requests; funds and cards are different.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `cardholder_user_uuid` | string | No | Optional user UUID for the cardholder whose cards should be listed. Provide this when an admin or manager asks about another employee's cards. Omit it to list the acting user's own cards. |

### Ramp list policies

**Slug:** `RAMP_MCP_RAMP_LIST_POLICIES`

Returns policy metadata only, not written policy document text. Call first when the target policy UUID isn't known, then use get-policy-details or get-policy-workflow-body.

### Ramp list sourcing events

**Slug:** `RAMP_MCP_RAMP_LIST_SOURCING_EVENTS`

Use this first when the user refers to an existing sourcing event but you do not
yet know which one they mean. The output is intentionally compact so the model
can match event names, owners, and current RFX details itself. Events in every
lifecycle status are available across pages, including CLOSED events, so the
agent can still find an event the user already finished running.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `page_size` | integer | No | Maximum number of sourcing events to return per page (1-100) |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `page_cursor` | string | No | Pagination cursor from a previous response's next_page_cursor. Pass None for the first page or when there are no more results. |

### Ramp list traveler loyalty programs

**Slug:** `RAMP_MCP_RAMP_LIST_TRAVELER_LOYALTY_PROGRAMS`

Use this directly for loyalty-only list/show/check requests; do not call GetTravelerProfile first.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp list treasury accounts

**Slug:** `RAMP_MCP_RAMP_LIST_TREASURY_ACCOUNTS`

List all Treasury accounts (Ramp Checking Accounts, Investment Accounts, Managed Portfolios)

### Ramp list users

**Slug:** `RAMP_MCP_RAMP_LIST_USERS`

Returns all users in the organization matching the given filters. Supports searching by
name (partial match, case-insensitive), filtering by department or location, and pagination.
Results include active and inactive users — check the is_inactive field to distinguish.
Use department_ids or location_ids (lists of UUIDs from the departments or locations tools) to narrow results.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `page_size` | integer | No | Number of users to return per page. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `name_search` | string | No | Search by user name (partial match, case-insensitive). |
| `page_cursor` | string | No | Pagination cursor for fetching additional pages. |
| `location_ids` | array | No | Filter users by location UUIDs (from ListLocations). |
| `department_ids` | array | No | Filter users by department UUIDs (from ListDepartments). |
| `include_agents` | boolean | No | Include standalone agents in addition to human users. |

### Ramp list vendor agreements

**Slug:** `RAMP_MCP_RAMP_LIST_VENDOR_AGREEMENTS`

Returns agreement details including dates, values, renewal status, line items, and days remaining. All filters are optional — omit all to list all agreements, or combine filters to narrow results.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum number of results to return (max 100) |
| `sort_by` | string | No | Sort results by: TOTAL_AMOUNT, NUM_DAYS_REMAINING, or END_DATE. Default: NUM_DAYS_REMAINING ascending. |
| `is_active` | boolean | No | If true, only show contracts that haven't expired |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `payee_uuid` | string | No | Filter by vendor UUID |
| `auto_renews` | boolean | No | Filter by auto-renewal flag |
| `vendor_name` | string | No | Filter by vendor name (case-insensitive partial match) |
| `has_end_date` | boolean | No | If true, only agreements with an end_date; if false, only those without |
| `max_end_date` | string | No | Filter: end_date <= this date |
| `min_end_date` | string | No | Filter: end_date >= this date |
| `department_ids` | array | No | Filter by department UUIDs |
| `max_start_date` | string | No | Filter: start_date <= this date |
| `min_start_date` | string | No | Filter: start_date >= this date |
| `renewal_status` | array | No | Filter by renewal status. Values: NOT_STARTED (active), PLANNING (draft), EVALUATING, TERMINATED, RENEWED, CANCELLED, INITIATED (requested), REJECTED, EXPIRED (ended) |
| `sort_ascending` | boolean | No | Sort direction. Default: true (ascending). |
| `max_total_value` | string | No | Filter: total_value <= this amount (in dollars) |
| `min_total_value` | string | No | Filter: total_value >= this amount (in dollars) |
| `payee_owner_ids` | array | No | Filter by vendor owner user UUIDs (distinct from contract owners) |
| `include_archived` | boolean | No | Include archived agreements in the results |
| `is_up_for_renewal` | boolean | No | If true, only show contracts within the 90-day renewal window |
| `contract_owner_ids` | array | No | Filter by contract owner user UUIDs |
| `max_days_remaining` | integer | No | Filter: days_remaining <= this value |
| `min_days_remaining` | integer | No | Filter: days_remaining >= this value (useful for 'expiring in next N days') |
| `payee_agreement_ids` | array | No | Filter to specific agreements by UUID |
| `max_last_date_to_terminate` | string | No | Filter: last_date_to_terminate <= this date |
| `min_last_date_to_terminate` | string | No | Filter: last_date_to_terminate >= this date |

### Ramp list wallet transfers

**Slug:** `RAMP_MCP_RAMP_LIST_WALLET_TRANSFERS`

Returns a list of transfers including deposits, withdrawals, and other
transactions with details like amount, status, and dates.

### Ramp lock or unlock card

**Slug:** `RAMP_MCP_RAMP_LOCK_OR_UNLOCK_CARD`

Locking prevents all transactions on it until unlocked.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `id` | string | Yes | The UUID of a card returned by ListCards with can_lock_or_unlock=true. |
| `action` | string ("lock" | "unlock") | Yes |  |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp lock or unlock spend allocation

**Slug:** `RAMP_MCP_RAMP_LOCK_OR_UNLOCK_SPEND_ALLOCATION`

Lock or unlock a fund (spend allocation) at the fund level, affecting all members

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `id` | string | Yes | The UUID of the fund to lock or unlock. |
| `action` | string ("lock" | "unlock") | Yes |  |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp lock or unlock spend allocation member

**Slug:** `RAMP_MCP_RAMP_LOCK_OR_UNLOCK_SPEND_ALLOCATION_MEMBER`

Lock or unlock a specific member's access to a fund (spend allocation)

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `id` | string | Yes | The UUID of the fund to lock or unlock the member from. |
| `action` | string ("lock" | "unlock") | Yes |  |
| `member_id` | string | Yes | The UUID of the member whose access to lock or unlock. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp manage rfx collaborators

**Slug:** `RAMP_MCP_RAMP_MANAGE_RFX_COLLABORATORS`

Collaborators can edit the RFX form and vendor list while it is in DRAFT and
grade vendor responses once it is PUBLISHED. Identify each collaborator by
their user UUID — use `LookupUser` or `GetOrgChart` to resolve a person's
name to their UUID first.

Both `add_user_uuids` and `remove_user_uuids` are optional; supply either or
both. Adding a user who is already a collaborator is a no-op. To apply the
same collaborators across several RFXs (for example multiple RFIs in one
sourcing event), call this tool once per RFX with the same user UUIDs.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the RFX to modify collaborators on |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `add_user_uuids` | array | No | UUIDs of users to add as collaborators |
| `remove_user_uuids` | array | No | UUIDs of users to remove as collaborators |

### Ramp mark rfx graded

**Slug:** `RAMP_MCP_RAMP_MARK_RFX_GRADED`

Requires at least one submitted vendor response. Moves the RFX from
PUBLISHED to GRADED so the sourcing event can be awarded.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the PUBLISHED RFX to mark as graded |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp mark transaction missing receipt

**Slug:** `RAMP_MCP_RAMP_MARK_TRANSACTION_MISSING_RECEIPT`

Should 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.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `transaction_uuid` | string | Yes | What transaction are they talking about? If they said OOPS, they are referring to the latest transaction. |

### Ramp merchant categories

**Slug:** `RAMP_MCP_RAMP_MERCHANT_CATEGORIES`

Each category expands to its configured MCC allowlist.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp merchants

**Slug:** `RAMP_MCP_RAMP_MERCHANTS`

List merchants

### Ramp payment credentials

**Slug:** `RAMP_MCP_RAMP_PAYMENT_CREDENTIALS`

Issue or recover a Stripe MPP credential using an existing fund

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `fund_id` | string | Yes | UUID of the existing fund to pay from |
| `body_digest` | string | No | Optional RFC 9530 body digest. Must match the challenge digest when both are present. The caller remains responsible for sending the matching body. |
| `www_authenticate` | array | Yes | WWW-Authenticate headers from the merchant payment challenge |
| `selected_challenge_id` | string | No | Challenge to select when multiple Stripe challenges are offered |

### Ramp pay with x402

**Slug:** `RAMP_MCP_RAMP_PAY_WITH_X402`

Fill the inputs from the merchant's 402 payment challenge. Returns a ready-to-send
payment header to attach when retrying the original request.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `accepted` | string | Yes | Exact chosen entry from the challenge's accepts array |
| `resource` | string | Yes | Resource object from the merchant's 402 challenge |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `extensions` | object | No | Extensions object from the merchant's 402 challenge |
| `idempotency_key` | string | Yes | Caller-generated UUID identifying this payment attempt |

### Ramp post bank accounts

**Slug:** `RAMP_MCP_RAMP_POST_BANK_ACCOUNTS`

Create a manually connected bank account

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `account_name` | string | No | Optional display name for the bank account. |
| `wire_details` | string | No | Optional wire-transfer details for the account. |
| `account_number` | string | Yes | Bank account number. |
| `routing_number` | string | Yes | ABA routing number used for ACH transfers. |
| `account_subtype` | string ("checking" | "savings") | Yes | Bank account subtype. |

### Ramp post comment

**Slug:** `RAMP_MCP_RAMP_POST_COMMENT`

If there is any ambiguity as to whether the user's message is meant to be
posted to the thread, ask them for confirmation first: 'Do you want me to post that
as a comment reply on your [XYZ] transaction/reimbursement/bill/etc?'.

How can you determine if the user's message is meant to be a reply to a comment?
  - 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.
  - 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.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `message` | string | Yes | 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. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `ramp_object_type` | string | Yes | 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'. |
| `ramp_object_uuid` | string | Yes | UUID of the Ramp object to post a comment on. This can be extracted from notification messages. |
| `mention_user_uuids` | array | No | 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 |

### Ramp post policies

**Slug:** `RAMP_MCP_RAMP_POST_POLICIES`

Publish the active policy for a standalone Agent Wallet

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `constraints` | object | Yes |  |
| `approval_mode` | string | No |  |
| `configurations` | array | Yes |  |
| `policy_version` | string | Yes |  |
| `schema_version` | integer | Yes |  |
| `approval_validity_seconds` | integer | No |  |

### Ramp post procurement draft

**Slug:** `RAMP_MCP_RAMP_POST_PROCUREMENT_DRAFT`

Create or update a procurement draft and return the current visible form state

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `answers` | array | No | Flat typed custom-form answers. Use only field IDs in the current draft_state.fields visibility-based write allowlist. draft_state.fields_to_answer is the prioritized subset of missing required fields and fields with errors; visible optional or already-answered fields may also be updated. Copy the field's answer_template and fill the placeholder values. |
| `currency` | string | No | ISO 4217 currency code, e.g. USD. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `line_items` | array | No | Complete desired line item list. When provided, it replaces the draft's current lines; omit it to leave the lines unchanged. For an existing line, include its UUID and edit only the values that should change. Use string money values such as amount='90000.00'. On a change-request draft (existing_spend_request_uuid), the original purchase order's line-item UUIDs are not accepted: the draft carries re-keyed copies of those lines, so read the draft's line_items first and reference those UUIDs. |
| `request_name` | string | No | Common shortcut for the procurement request name. |
| `internal_memo` | string | No | Common shortcut for the internal memo. |
| `clear_field_ids` | array | No | Visible custom-form field IDs to clear. Do not also provide an answer for the same field. |
| `spend_intent_uuid` | string | No | Spend intent UUID returned by spend-intents. Provide this when starting a new procurement request. Mutually exclusive with existing_spend_request_uuid. |
| `spend_request_uuid` | string | No | Draft spend request UUID returned by this tool. Provide this to continue editing a draft. |
| `request_virtual_card` | boolean | No | Whether to explicitly request a virtual card on approval. False removes that request but does not disable program-level automatic card creation when the payee accepts cards. Omit when draft.virtual_card_question is absent or to preserve the current value. |
| `change_request_answers` | array | No | Typed answers for the independent change-request form. Use only field IDs in change_request_state.fields; do not put these answers in answers. |
| `existing_spend_request_uuid` | string | No | The original approved purchase-order request's spend_request_uuid from unified request details; not the unified_request_id or purchase_order_id. Provide this when requesting a change to that purchase order. Mutually exclusive with spend_intent_uuid. |
| `clear_change_request_field_ids` | array | No | Visible change-request form field IDs to clear. Do not also provide a change_request_answers entry for the same field. |

### Ramp procurement spend intents

**Slug:** `RAMP_MCP_RAMP_PROCUREMENT_SPEND_INTENTS`

List published procurement spend programs the agent can draft against

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `query` | string | No | Optional text filter for spend program name or description. |
| `page_size` | integer | No | Maximum spend programs to return. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp procurement submit

**Slug:** `RAMP_MCP_RAMP_PROCUREMENT_SUBMIT`

Submit a procurement draft after explicit user confirmation

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `confirmed` | boolean | Yes | Must be true only after explicit user confirmation. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `spend_request_uuid` | string | Yes | Draft spend request UUID returned by draft. |

### Ramp provide no receipt reason

**Slug:** `RAMP_MCP_RAMP_PROVIDE_NO_RECEIPT_REASON`

Submit a reason explaining why a transaction has no receipt

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `reason` | string | Yes | The reason the user is providing for not having a receipt. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `transaction_uuid` | string | Yes | What transaction are they talking about? If they said OOPS, they are referring to the latest transaction. |

### Ramp provision x402 wallet

**Slug:** `RAMP_MCP_RAMP_PROVISION_X402_WALLET`

Returns the same sign-ready Solana wallet on repeated calls. Do not call this
tool until an owner or admin confirms that the wallet should be provisioned.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `confirmed` | boolean | Yes | Must be true to confirm that the user approved provisioning the business's x402 wallet. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp publish rfx

**Slug:** `RAMP_MCP_RAMP_PUBLISH_RFX`

Publishing notifies vendors outside Ramp, so check GetRFXDetail first: its
``available_actions`` publish entry reports whether publish is currently
allowed (and why not), and its ``vendors`` block lists the exact contacts
who will be notified. When a publish approval policy is configured, the RFX
moves to IN_REVIEW instead and nothing is sent to vendors yet — the
approval then proceeds with the designated approvers in the Ramp app, and
the RFX publishes automatically once approved. Calling publish again while
pending approval or already published fails cleanly.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the RFX to publish |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp ramp bulk close purchase orders

**Slug:** `RAMP_MCP_RAMP_RAMP_BULK_CLOSE_PURCHASE_ORDERS`

Use after confirming the user wants the listed POs closed. Purchase orders
must not already be closed or archived. The user must have permission to
close every purchase order in the request.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `close_reason` | string | Yes | Reason for closing these POs. This rationale is recorded on the closed purchase orders. |
| `purchase_order_uuids` | array | Yes | UUIDs of the purchase orders to close |

### Ramp ramp bulk reopen purchase orders

**Slug:** `RAMP_MCP_RAMP_RAMP_BULK_REOPEN_PURCHASE_ORDERS`

Use only after confirming the user wants the listed POs reopened. This does
not archive or delete POs; reopening restores each PO to its computed active
lifecycle status when allowed. The user must have permission to reopen every
purchase order in the request.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `purchase_order_uuids` | array | Yes | UUIDs of the purchase orders to reopen |

### Ramp ready to sync

**Slug:** `RAMP_MCP_RAMP_READY_TO_SYNC`

Marking an object (for example a transaction) as ready to sync flags it
as reviewed and complete, so it will be included in the next accounting
sync that exports data from Ramp to your connected accounting provider
(ERP), such as NetSuite, QuickBooks, Xero, or Sage Intacct.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `object_ids` | array | Yes | IDs of the objects to mark as ready to sync. All IDs must belong to the authenticated business; the request fails if any ID is not found. |
| `object_type` | string ("REIMBURSEMENT" | "TRANSACTION") | Yes | The type of object to mark ready to sync. Supported values are TRANSACTION and REIMBURSEMENT. |

### Ramp release

**Slug:** `RAMP_MCP_RAMP_RELEASE`

Releases the active vendor-scoped hold and allows new payments to be
scheduled for the vendor. Payments that were removed from scheduled
payment flows while the hold was active must be scheduled again after
the hold is released.

### Ramp remind bill approvers

**Slug:** `RAMP_MCP_RAMP_REMIND_BILL_APPROVERS`

Use this tool when the user wants to nudge approvers for specific bill UUIDs.
The bills should be awaiting approval; use get-bills-for-approval first if the
user has not identified the bill UUIDs.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `bill_uuids` | array | Yes | Bill UUIDs whose next approvers should be reminded. |

### Ramp remove traveler loyalty program

**Slug:** `RAMP_MCP_RAMP_REMOVE_TRAVELER_LOYALTY_PROGRAM`

Remove a saved loyalty program from the user's traveler profile

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `traveler_loyalty_program_id` | string | Yes | Saved loyalty program ID from list of loyalty programs returned by ListTravelerLoyaltyPrograms |

### Ramp remove user from shared fund

**Slug:** `RAMP_MCP_RAMP_REMOVE_USER_FROM_SHARED_FUND`

Remove a user from a shared fund using user_email

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `user_email` | string | Yes | Email of the user to remove |
| `spend_allocation_uuid` | string | Yes | UUID of the shared fund |

### Ramp rename department

**Slug:** `RAMP_MCP_RAMP_RENAME_DEPARTMENT`

Department names must be unique within the business (case-insensitive).

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `department_id` | string | Yes | UUID of the department to rename. |
| `department_name` | string | Yes | New name for the department. |

### Ramp reporting describe dataset

**Slug:** `RAMP_MCP_RAMP_REPORTING_DESCRIBE_DATASET`

Use this after selecting a dataset name to inspect its dimensions, measures,
default time dimensions, sample questions, and join-reachable fields before
constructing a ReportQuery.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `name` | string | Yes | Semantic dataset name to describe, for example `spend`. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp reporting get skill

**Slug:** `RAMP_MCP_RAMP_REPORTING_GET_SKILL`

Call once before your first reporting query and follow it exactly.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp reporting list datasets

**Slug:** `RAMP_MCP_RAMP_REPORTING_LIST_DATASETS`

Call `ramp_reporting_get_skill` before your first reporting query and follow the returned skill. Use this before building a semantic reporting query when you need to know which datasets exist and how each dataset is described at a high level.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp reporting lookup search tags

**Slug:** `RAMP_MCP_RAMP_REPORTING_LOOKUP_SEARCH_TAGS`

Search tags are used to filter report data by various criteria such as:
- Users (employees)
- Vendors/Merchants
- Departments
- Locations
- Tracking category options (custom accounting dimensions)

Use this tool when you need to find specific entities to use as filters
in a report. This is typically used before creating or modifying a report
to find the correct search tag IDs.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `context` | string | No | Context about what the search tags will be used for |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `data_source` | string | No | The report data source (e.g., SPEND_OLAP, CROSS_BUSINESS_OLAP). Required for cross-business search tag lookups. When a lookup request omits `categories`, the default category set is resolved from this data source (SPEND_OLAP when omitted). Pass the data source of the report you are building. |
| `lookup_requests` | array | Yes | Bounded list of search tag lookup requests. |

### Ramp reporting query

**Slug:** `RAMP_MCP_RAMP_REPORTING_QUERY`

Data is eventually consistent (may lag a few minutes).

Execute a semantic reporting query and return typed rows.

Requires a dataset and fields from the semantic catalog.
The `report_query` input is a ReportQuery: dataset, dimensions, measures,
filters, post-aggregation having or aggregate-filter clauses, optional time
range, per-dimension ranking, ordering, and limit. A `filters` clause whose
`field` is a catalog field is a row predicate; one whose `field` is a
selected measure output name (its `name` alias when present) is the
preferred aggregate predicate and applies after grouping (HAVING), e.g.
`{"field": "txn_count", "op": "gt", "value": 3}`. `having` and
`aggregate_filters` remain supported equivalents, but are deprecated and
migrated into `filters`; `result_metadata.predicate_migration` records the
migration.
Order by any selected orderable dimension or measure output.

A measure ref may carry its own `filters` plus a unique `name` to emit a
conditional aggregate column ("sumIf"). Select the same measure several
times with different filters for side-by-side cohort columns, e.g. one
spend total per category grouped by user, including an "other" column via
a NOT_IN filter. Measure filters use the same field/op/value shape as
query filters but only base-dataset fields.
Use `post_aggregation` to count the first-stage groups that survive the
aggregate predicates (a measure-output `filters` clause or the deprecated
forms, which migrate like any other query). For example, select attendee plus
`{"field": "spend_date", "time_grain": "day"}`, filter daily_spend over
$100, then use `{"dimension": "attendee", "name": "days_over_limit"}`.
Use attendee rather than user so group meals stay allocated correctly, and
keep the daily grain so the count is by UTC calendar day.

Use `max_groups` for K named values plus Other independently on every
selected non-time dimension, retaining all time buckets. Set
`ranking_order_by` to selected first-stage measure scores. When the time
range is omitted, ranking covers all authorized data. Display `order_by`
is separate. Omit `limit`; ranked results have a 1,000-row cap disclosed
through result_metadata.is_truncated. Ranking cannot combine with aggregate
predicates or post_aggregation.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `query_scope` | string | No | Result-set scope. Use complete for all, each, every, or otherwise unrestricted results. Omit report_query.limit; complete always uses the maximum of 1000, overriding any supplied flat limit. Use complete with max_groups; it preserves per-dimension ranking. Use top_n only when the user explicitly requested exactly N rows, and set report_query.limit to that N. Omit only for backward compatibility; omission preserves the query limit. |
| `report_query` | string | Yes | Semantic ReportQuery to execute. Select at least one dimension or measure, and use field names from DescribeReportingDataset. |

### Ramp reporting search catalog

**Slug:** `RAMP_MCP_RAMP_REPORTING_SEARCH_CATALOG`

Use this when a user describes a reporting question in plain English and
you need to choose the best semantic dataset and relevant fields.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum number of catalog matches to return. |
| `nl_query` | string | Yes | Natural-language reporting question or catalog search text. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp request transaction repayment

**Slug:** `RAMP_MCP_RAMP_REQUEST_TRANSACTION_REPAYMENT`

This is the REVIEWER / APPROVER action: the acting user must be an
approver or manager for the transaction, not the cardholder themselves.
The tool marks the transaction as repayment-required and notifies the
cardholder, who can then accept, reject, or complete repayment through
their own flow.

This tool does NOT execute payment (ACH, payroll, debit-card, etc.).
It only creates the repayment request so the cardholder sees an
actionable task.

Use when a reviewer or manager says things like:
- "Request repayment on this transaction"
- "Mark this as needing repayment"
- "Require the employee to pay back this charge"
- "Flag this transaction for repayment"

If the user is the cardholder wanting to repay their OWN transaction,
use RepayTransaction instead — that tool provides the self-service
repayment URL.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `reason` | string | Yes | The reason for requesting repayment, written by the user. Pass the user's own words verbatim; do not invent a rationale. |
| `thoughts` | string | Yes | Your internal reasoning summarizing what the user asked for and why this tool should be invoked. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `transaction_id` | string | Yes | The UUID of the transaction to request repayment for. |

### Ramp resubmit reimbursement

**Slug:** `RAMP_MCP_RAMP_RESUBMIT_REIMBURSEMENT`

This does NOT submit the reimbursement — it only moves it from REJECTED to DRAFT.
After resubmitting, use EditReimbursement to make changes and SubmitReimbursement to submit again.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `reimbursement_uuid` | string | Yes | UUID of the rejected reimbursement to revert to draft. Call GetReimbursements to determine the UUID if it cannot be obtained from context. |

### Ramp return rfx to draft

**Slug:** `RAMP_MCP_RAMP_RETURN_RFX_TO_DRAFT`

Only valid after a publish approval was rejected. The rejected approval
workflow is terminated and the RFX becomes editable again.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the REJECTED RFX to return to draft |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp revoke rfx vendor invitation

**Slug:** `RAMP_MCP_RAMP_REVOKE_RFX_VENDOR_INVITATION`

This is irreversible — on a published RFX
the vendor immediately loses access to the questionnaire and any e-sign
envelope in flight is voided.

DRAFT invitations are deleted outright; ACTIVE invitations are revoked
(keeping their contact on record). Already-revoked invitations fail
cleanly. Use GetRFXDetail to review invitations before revoking.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `rfx_vendor_invitation_id` | string | Yes | UUID of the RFX vendor invitation to revoke |

### Ramp roles

**Slug:** `RAMP_MCP_RAMP_ROLES`

List custom roles

### Ramp search bills

**Slug:** `RAMP_MCP_RAMP_SEARCH_BILLS`

Accepts a UUID in query even when the bill's draft/submitted stage is
unknown. Each result includes lifecycle information: is_draft=true means
an unsubmitted draft; is_draft=false means a submitted bill.

Also supports text search by payee name, invoice number, or payment ID.
Submitted and active draft bills may both be returned unless filters
exclude them; include_drafts=False restricts results to submitted bills.
An unpaid bill or one awaiting approval is not necessarily a draft.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum number of bills to return (max 50) |
| `query` | string | No | Optional search string. Pass a bill UUID for an exact lookup across submitted and draft bills, or pass at least 3 characters to search by payee name, invoice number, or payment ID. Text examples: 'UPS', 'Corodata', or 'INV-1722'. Text searches find partial matches (e.g. 'UPS' finds 'UPS Store' and '1722' finds 'INV-1722'). Do not use this for due-date concepts like 'past due' or 'due next week'; use from_due_date/to_due_date instead. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `page_cursor` | string | No | 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'). |
| `to_due_date` | string | No | Inclusive upper bound for bill due dates. For past-due bills, set this to the day before today's date and include_paid=false. |
| `include_paid` | boolean | No | Optional payment-status filter. Leave unset for UUID lookups when the bill's lifecycle is unknown. False restricts results to open submitted bills and excludes drafts. If include_drafts=true, this filter is skipped, so paid submitted bills remain eligible. When unset, no payment-status filter is applied. |
| `from_due_date` | string | No | Inclusive lower bound for bill due dates. Use with to_due_date for due-date range requests. |
| `include_drafts` | boolean | No | Optional lifecycle filter. Leave unset or true to retain active draft matches, including when a bill UUID comes from a report without lifecycle information. False excludes all drafts; use it only when submitted-only results are intended. When unset, no draft filter is applied. |
| `to_payment_date` | string | No | Inclusive upper bound on the date a bill was paid (payment sent date). Use with from_payment_date to find bills paid within a date range. |
| `status_summaries` | array | No | Filter bills by one or more detailed status summaries. Returns bills whose status matches ANY of the listed values (logical OR). Draft statuses (DRAFT_*) can match unless include_drafts=False. Allowed values: - `DRAFT_PARSING`: The draft bill is being parsed (e.g., via OCR). - `DRAFT_MISSING_INFO`: The draft bill is missing required information. - `DRAFT_READY`: The draft bill is ready to be submitted as a bill. - `DRAFT_QUEUED`: The draft bill is queued for automatic conversion to a bill upon vendor approval. - `APPROVAL_PENDING`: The bill is waiting for one or more approvals. - `AWAITING_RELEASE`: The bill is waiting for payment release. - `PAYMENT_READY`: The bill is ready for payment. - `PAYMENT_ERROR`: The bill payment failed. - `ON_HOLD`: The bill has been placed on hold. - `BLOCKED`: The bill is blocked from payment initiation or approval. - `HELD_BY_PROVIDER`: The bill payment is held by the payment provider. - `PENDING_VENDOR_APPROVAL`: The bill is waiting for a vendor edit to be approved. - `PAYMENT_DETAILS_MISSING`: The bill is missing required payment details. - `PAYMENT_NOT_INSTRUCTED`: The bill uses Ramp payments but has not been scheduled yet. - `WAITING_FOR_TRANSACTION_MATCH`: The bill is paid by card and is waiting for a matching card transaction. - `WAITING_FOR_TRANSFER_MATCH`: The bill is paid by direct debit and is waiting for a matching wallet transfer. - `WAITING_FOR_VENDOR`: The bill is waiting on required vendor information. - `AWAITING_PAYMENT`: The bill is waiting for the business to send push-payment funding. - `PAYMENT_PROCESSING`: The bill payment has been initiated and is processing. - `PAYMENT_SCHEDULED`: The bill payment is scheduled. - `PAYMENT_COMPLETED`: The bill has been paid. - `ARCHIVED`: The bill has been archived. - `APPROVAL_REJECTED`: The bill was rejected in the approval flow. |
| `from_payment_date` | string | No | Inclusive lower bound on the date a bill was paid (payment sent date). Use with to_payment_date to find bills paid within a date range. |
| `accrual_year_month` | string | No | Year-month in YYYY-MM format for accrual filtering. When provided, only bills eligible for accrual in that month are returned. Accruals must be available for bill pay first; check availability using the accrual status tool before filtering. |

### Ramp search flight modifications

**Slug:** `RAMP_MCP_RAMP_SEARCH_FLIGHT_MODIFICATIONS`

First inspect the booking itinerary and ask which leg, date, or route the
traveler wants to change. Pass one entry per changed leg, identified by its
0-based ``leg_index``. Unspecified date and airport fields retain the
original leg values.

When changing both legs of a single-ticket round trip, first search with both
leg modifications, present the outbound offers, then call again with the
chosen ``selected_outbound_offer_id`` and the same modifications to retrieve
matching returns. Split-ticket bookings must instead be changed one leg at a
time; never combine their legs or use ``selected_outbound_offer_id``.

Some bookings support the first search but not this second step, and return an
unsupported-provider result with support details; route the traveler to that
support rather than retrying. Search prices are estimates; call
SubmitFlightModification to re-quote the selected offer with the airline before
asking the traveler to confirm.

``recommended_offers`` is always present, ranked from this page of ``offers``;
each surface presents those entries in the format it supports, and
``assistant_note`` states which presentation applies.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No |  |
| `cursor` | string | No |  |
| `max_stops` | integer | No |  |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `booking_id` | string | Yes | Parent or flight booking UUID returned by GetBookings |
| `cabin_class` | string | No | Cabin to search replacement flights in; set it to request an upgrade or downgrade. Applies to every leg being changed, not per leg. Omit to search without a cabin filter. |
| `slice_modifications` | array | Yes | Requested changes, one entry for each booked leg to replace |
| `selected_outbound_offer_id` | string | No | Chosen outbound modification offer when retrieving the return options for a two-leg change |

### Ramp search flights

**Slug:** `RAMP_MCP_RAMP_SEARCH_FLIGHTS`

Before first use in a conversation, load and follow the ramp-book-flight skill when available.

Tell the tool what to search (route + dates), or give it a job_id - never both. Start a NEW interactive search with wait_for_results=false: it returns a job_id immediately, so ask the traveler's unresolved preferences while the search runs and resume with the same job_id on a later call. Blocking (wait_for_results=true, the default when omitted) is the exception for flows that need a complete result immediately and cannot resume later.

A call with job_id reads cached results and never starts another provider search. Use job_id alone with wait_for_results=true to read the completed first page, add cursor to read the next page, add preferences to change the filtered or ranked view, or add sort_key to change its order; omit cursor when making either change so the new view starts at its first page.

For a round trip, start the search with return_date. The first response contains OUTBOUND offers with is_round_trip=true and round-trip totals. Choose an outbound offer, then call with its job_id and outbound_offer_id to get matching RETURN offers. The chosen return offer's id identifies the complete outbound-and-return itinerary for booking. To filter return offers (e.g. by airline), pass the same job_id and outbound_offer_id with the new preference - do not start a new search, which discards the selected outbound flight and reruns the entire provider query.

A completed outbound response includes web_search_url for the cached search in Ramp Travel. Fare options are nested under their flight, and a nested fare option id can be selected for return offers. Search preferences are cabin_class, required_upgrade_cabin_class, airlines, max_stops, only_split_tickets, preferred_departure_time_window, preferred_arrival_time_window, and avoid_red_eye_flights; omitted preferences retain their prior values, and applied_preferences reports what each response used.

Do NOT use this tool to change, modify, cancel, or rebook an existing booking.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum offers to return (1-100). Defaults to 20. Output is token-capped, so large limits may return fewer offers; paginate with next_cursor for more. |
| `cursor` | string | No | Opaque page bookmark copied from a prior response's current_page_cursor to replay a card-hidden page, or next_cursor to fetch the following page. Only valid with job_id. Never compose one, and never pass one after search_complete=false (no cursor is issued until the search completes). To page a filtered or re-sorted view, re-send the same filters/sort_key with the cursor. When the prior response has outbound_offer_id, re-send it with every cursor. |
| `job_id` | string | No | UUID of an existing search job from a previous response. Pass it alone to poll/refresh the search, with cursor to page, with preference fields or sort_key to re-rank/re-sort the cached results, or with outbound_offer_id to fetch return offers. Omit it (and pass the route fields) to start a new search. |
| `arrival` | string | No | Arrival airport IATA code or Ramp city search_code from GetFlightBookingLocations. The value is validated before search. Never pass a place name or a value inferred from profile data. |
| `trip_id` | string | No | Optional Ramp trip UUID to associate with this search. |
| `airlines` | array | No | Airline IATA codes to restrict results to (e.g. ['AA', 'DL']). |
| `sort_key` | string | No | Result ordering, same keys as the flight search UI/REST API (e.g. LOWEST_TOTAL_AMOUNT, SHORTEST_DURATION). Defaults to WEIGHTED_SCORE. On a job_id read, re-sorts the cached results; to page the re-sorted view, re-send the same sort_key with the returned next_cursor. |
| `departure` | string | No | Departure airport IATA code or Ramp city search_code from GetFlightBookingLocations. The value is validated before search. Never pass a place name or a value inferred from profile data. When the user gave no origin, omit this field: a new search then defaults the origin to the traveler's saved preferred airport, then their saved home address city, then the most frequent departure city across past and upcoming flight bookings. |
| `max_stops` | integer | No | 0 for nonstop, 1 for one stop, etc. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `cabin_class` | string | No | One cabin or a list of cabins: ECONOMY, PREMIUM_ECONOMY, BUSINESS, or FIRST. Multiple cabins are searched together in one call. On a return-offer read, each itinerary is projected to its cheapest exact match among the requested cabins. |
| `return_date` | string | No | Return date for round-trip; omit for one-way. |
| `resume_job_id` | string | No | Legacy alias for job_id when resuming or paging a search. Use job_id for new calls. |
| `search_job_id` | string | No | Legacy alias for job_id with outbound_offer_id. Use job_id for new calls. |
| `departure_date` | string | No | Outbound date (YYYY-MM-DD). Required for a new search. |
| `traveler_user_id` | string | No | Traveler UUID when searching flights for someone else. Resolve names with list-users, set this only when the user explicitly asks to book for another person, and pass the same value to GetTravelerProfile, UpdateTravelerProfile, and submit-flight-booking. Omit for self-booking. |
| `wait_for_results` | boolean | No | Start every NEW interactive search with false: the call returns quickly with job_id, search_complete=false, and no offers. Continue the conversation naturally without mentioning search status or timing, ask unresolved preference questions, then re-call with job_id, true, and any changed preference fields. Every job_id read should use true (the default when omitted) so the call blocks and returns the completed, ranked results. False makes only one immediate status check and can return no offers while the search is still running. Return-offer reads require true. |
| `clear_preferences` | array | No | Preference field names to remove from this job's cumulative state. Use a non-empty list only with job_id and only when the traveler explicitly removes a preference. Timing clears apply only to the current outbound or return leg. Do not also pass a replacement value for the same field. |
| `outbound_offer_id` | string | No | For a round trip, with job_id, pass the chosen outbound's id as outbound_offer_id to fetch its matching return offers. If a specific nested fare option was selected, pass the fare option's id instead of the parent offer's id; this preserves its cabin and fare on the return options. Book by passing the chosen return offer's id. Set include_fare_options=true when a fare option was selected; page with cursor; airlines/max_stops filter. |
| `requested_weekday` | string | No | The weekday the traveler asked to depart, when they gave a relative day like 'Sunday' or 'next Friday'. Pass it whenever known; the search is rejected if departure_date does not fall on this weekday, catching date-resolution mistakes before results are shown. When the traveler gave only a relative day, ALWAYS confirm the resolved date with them using a server-formatted date string from the results (e.g. an offer's departure_date, 'Sun, Apr 5, 2026') exactly as returned; never pair a weekday with a date yourself. |
| `only_split_tickets` | boolean | No | Filter results to split-ticket (multi-ticket) fares only. True returns only fares where ticket_type is multi_ticket; False returns only single_ticket fares. Null (default) returns both. |
| `include_fare_options` | boolean | No | Also return each flight's alternative fare classes in fare_options (e.g. Economy Plus, Business). Set this when the user asks about upgrades or comparing cabins; leave off for a lean cheapest-fare list. |
| `avoid_red_eye_flights` | boolean | No | Current-search preference to avoid red-eye flights. This ranks and explains recommendations only; it does not save a traveler preference. |
| `required_upgrade_cabin_class` | string | No | Only return itineraries whose cached fare inventory reports at least one seat in this cabin on every segment. Use BUSINESS when a traveler wants an Economy recommendation with currently available Business upgrade inventory. This filters observed fare-class inventory; it does not guarantee a future upgrade or personal-card eligibility. A count of 0 or a missing count does not qualify. |
| `preferred_arrival_time_window` | string | No | Current-leg arrival time preference. Use only when the user asks for a broad window like morning, afternoon, or evening. On a round-trip outbound_offer_id read, this is cached and applied only to return offers. |
| `preferred_departure_time_window` | string | No | Current-leg departure time preference. Use only when the user asks for a broad window like morning, afternoon, or evening. On a round-trip outbound_offer_id read, this is cached and applied only to return offers. |

### Ramp search help center snippets

**Slug:** `RAMP_MCP_RAMP_SEARCH_HELP_CENTER_SNIPPETS`

This tool performs semantic search across help center articles using embeddings.
Trusted business-scoped calls receive the complete matched articles; unscoped
and external Developer API calls receive focused snippets.

The tool:
1. Fetches relevant articles from the help center
2. Chunks articles into smaller semantic units
3. Uses embedding similarity to find the most relevant sections
4. Returns top K results with their source articles

Some internal articles have no public URL (an empty ``url``). Never construct or
guess a URL for those articles.

IMPORTANT: If you have other tools that can actually perform the action a user is asking about,
you should use those tools instead of or in addition to providing help center information.
For example, if a user says "how can I upload a receipt", you should tell them they can
upload a receipt in the chat directly, even if you also find a help center article that
explains how to upload receipts in the web app.

Use this tool when you need to:
- Find specific information within help articles
- Get concise, focused answers from documentation
- Minimize token usage while maintaining relevance
- Answer questions about Ramp products and features

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `query` | string | Yes | The primary search query to find relevant help center content |
| `top_k` | integer | No | Number of top relevant results to return (default: 5) |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `query_variants` | string | No | One alternate phrasing, or up to four alternate phrasings, for the same information need. For a single topic, usually provide meaningful variants to broaden retrieval rather than relying on one phrasing or parallel single-query calls. Variants are searched together and fused into one top-K result set. For separate topics that each need their own results, make separate calls in parallel. |

### Ramp search hotel

**Slug:** `RAMP_MCP_RAMP_SEARCH_HOTEL`

Before first use in a conversation, load and follow the ramp-book-hotel skill when available.

Provide location_query (city, neighborhood, address, landmark, or office) plus check_in_date and check_out_date. API calls run synchronously by default and return ranked hotels - each with at most one summary rate - plus policy_summary, total_count, and web_search_url. Results are paginated from a cached result set: pass the returned next_cursor as cursor to fetch more hotels without triggering a new provider search; never construct or edit a cursor. Put chain requests in filters.chain_names and reserve hotel_name for one exact property; a specific hotel_name uses the targeted direct-hotel path. Passing wait_for_results=false explicitly opts into an asynchronous kickoff that returns status='searching' with a search_id to resume by passing that search_id on a later call.

To book from these results, pass the selected hotel id to GetHotelRates, then the selected rate id to SubmitHotelBooking with the same traveler and stay dates.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `sort` | string | No | Optional sort configuration that mirrors web static hotel search. |
| `limit` | integer | No |  |
| `cursor` | string | No | Opaque next_cursor from a previous SearchHotels response. |
| `filters` | string | No | Optional filters applied to fresh or cached results. Put chain requests in filters.chain_names; do not pass a chain name as hotel_name. |
| `latitude` | string | No | Exact latitude from GetOfficeLocations for an office destination. Must be supplied together with longitude; otherwise omit both. |
| `longitude` | string | No | Exact longitude from GetOfficeLocations for an office destination. Must be supplied together with latitude; otherwise omit both. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `search_id` | string | No | search_id from a previous SearchHotels response with status='searching'. Pass it to retrieve results of an in-flight search instead of the fresh-search fields. If that search fails with same_search_id_retryable=false, never pass the ID again; start a fresh search with search_id=null and the original destination and dates. |
| `hotel_name` | string | No | Specific hotel name the user asked for (for example 'citizenM New York'). When provided, SearchHotels resolves and prioritizes that hotel in results. |
| `num_adults` | integer | No |  |
| `preferences` | string | No | Free-text stay preferences the traveler stated in this conversation, e.g. 'under $300/night, needs a gym, near Miami Beach, refundable'. Include any place they want to stay close to. Saved profile travel preferences are applied automatically; only pass what the traveler said here. |
| `check_in_date` | string | No |  |
| `check_out_date` | string | No |  |
| `location_query` | string | No | Destination, neighborhood, address, landmark, or office location. |
| `traveler_user_id` | string | No | Traveler UUID when searching on behalf of another user. |
| `wait_for_results` | boolean | No | Whether a fresh search waits for completed results. When omitted, the default depends on the caller: API (CLI/MCP/third-party) calls wait and return completed results in one call, while assistant conversations return quickly with status='searching', search_id, and next_action when asynchronous hotel search is enabled for the business. Set true to explicitly wait for synchronous results. Resume calls with false perform one immediate completion check and never wait or poll internally. Hotel results are final-only; incomplete resumes return status='searching' for the next user turn. |

### Ramp search merchants

**Slug:** `RAMP_MCP_RAMP_SEARCH_MERCHANTS`

Returns matching merchant IDs, UUIDs, names, categories, and domains.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum number of results to return |
| `query` | string | Yes | Merchant name to search for (partial match, case-insensitive) |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |

### Ramp search purchase orders

**Slug:** `RAMP_MCP_RAMP_SEARCH_PURCHASE_ORDERS`

Search for purchase orders using structured purchase order filters

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum number of purchase orders to return (max 50) |
| `filters` | string | No | Compact purchase order filters. Use search for PO numbers, request names, or owner names; for vendor/payee queries, resolve the vendor first and pass payee_uuids. Then narrow by PO status, spend request status, owner, or approval queue when needed. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `page_cursor` | string | No | 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'). |

### Ramp search reimbursements

**Slug:** `RAMP_MCP_RAMP_SEARCH_REIMBURSEMENTS`

Search reimbursements across a business, optionally filtering to a specific user's reimbursements

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `filters` | string | No | Text-based filters to search by. Provide human-readable names for tracking categories, merchants, or spend allocations and they will be resolved to the correct IDs automatically. |
| `to_date` | string | No | Inclusive record creation date upper bound (YYYY-MM-DD), not the expense transaction date or submission date. Example: '2024-12-31' |
| `user_id` | integer | No | Optional user ID to filter results to a specific user's reimbursements. When omitted, searches across all reimbursements in the business. |
| `from_date` | string | No | Inclusive record creation date lower bound (YYYY-MM-DD), not the expense transaction date or submission date. Historical expenses created later are filtered by their creation date. Example: '2024-01-01' |
| `page_size` | integer | No | Maximum number of reimbursements to return in one request. For the initial search, use 10-25 results. Increase the page size only when the user explicitly needs exhaustive results, and prefer pagination with next_page_cursor. Never request 200 results initially. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `search_string` | string | No | Search for reimbursements with matching merchant name, memo, or cardholder name |
| `next_page_cursor` | string | No | Use this to get additional results after the first page. Copy the next_page_cursor value from a previous response to continue pagination |
| `reimbursement_status` | string | No | Filter by reimbursement status. |

### Ramp search unified requests

**Slug:** `RAMP_MCP_RAMP_SEARCH_UNIFIED_REQUESTS`

Use this to find existing purchase orders, fund requests, procurement requests,
policy-backed requests, or approval-only requests by vendor, request name,
spend program, owner UUID, requester UUID, status, type, exact request number,
approval date, department, workflow-backed policy, or whether they require
action. Only requests the acting user owns, requested, can approve, or is
otherwise permitted to view are searchable. Use
GetRequestsToReview when the user is specifically asking what they need to
approve right now. Use GetUnifiedRequestDetails once one request has been
identified. For a draft policy-backed request, pass the result's exact
wbp_request_id to ResumeWbxRequest, not its unified_request_id.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum number of unified requests to return (max 100) |
| `filters` | string | No | Compact filters for unified request search. Use filters.search for free text, request_numbers for exact REQ-* identifiers, payee_ids for an exact vendor match, and the other fields to narrow by category, status, type, approval date, department, owner, requester, or approval queue. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `page_cursor` | string | No | 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'). |

### Ramp search user

**Slug:** `RAMP_MCP_RAMP_SEARCH_USER`

Returns users from the business ranked by relevance to the given transaction (recent attendees and teammates appear first). If no transaction ID is provided, the user's most recent transaction is used as context. The search is case-insensitive and matches partial names.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `search` | string | Yes | Name, partial name, or full name to search for (e.g., 'john', 'smith', 'john smith') |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `transaction_id` | string | No | UUID of the transaction to use as context for the search. If not provided, uses the user's most recent transaction. |

### Ramp search user reimbursements

**Slug:** `RAMP_MCP_RAMP_SEARCH_USER_REIMBURSEMENTS`

Supports filtering by:
- User name (e.g., 'John Smith') — resolved automatically, defaults to current user if not specified
- Accounting coding selections (tracking categories) like Department, Cost Center, Class, GL Account
- Merchant name, spend allocation name (resolved from text automatically)
- Reimbursement status (DRAFT, PENDING, APPROVED, etc.)
- Record creation date range and text search

The tool resolves text queries to internal IDs automatically via the search tag service.
Results are scoped to the current user's business.
Date bounds filter when the reimbursement record was created, not when the
expense occurred or was submitted. This tool does not support filtering by
transaction date or submission date, or ranking employees by period totals.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `filters` | string | No | Text-based filters to search by. Provide human-readable names for tracking categories, merchants, or spend allocations and they will be resolved to the correct IDs automatically. |
| `to_date` | string | No | Inclusive record creation date upper bound (YYYY-MM-DD), not the expense transaction date or submission date. Example: '2024-12-31' |
| `from_date` | string | No | Inclusive record creation date lower bound (YYYY-MM-DD), not the expense transaction date or submission date. Historical expenses created later are filtered by their creation date. Example: '2024-01-01' |
| `page_size` | integer | No | Maximum number of reimbursements to return in one request. For the initial search, use 10-25 results. Increase the page size only when the user explicitly needs exhaustive results, and prefer pagination with next_page_cursor. Never request 200 results initially. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `search_string` | string | No | Search for reimbursements with matching merchant name, memo, or cardholder name |
| `next_page_cursor` | string | No | Use this to get additional results after the first page. Copy the next_page_cursor value from a previous response to continue pagination |
| `reimbursement_status` | string | No | Filter by reimbursement status. |

### Ramp search vendors

**Slug:** `RAMP_MCP_RAMP_SEARCH_VENDORS`

With a search_term, this tool finds vendor records using both fuzzy SQL
matching (trigram similarity + substring) and semantic (vector) search.
Without a search_term, it lists the business's vendors alphabetically.
Use this to find vendor IDs when you need to:
- Look up a vendor by partial name
- Find the correct vendor UUID for further analysis
- Discover vendors similar to a given name
- List vendors, optionally filtered by 1099 tracking status

The search is scoped to the current business context.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum number of vendors to return (default: 10) |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `search_term` | string | No | Optional vendor name or partial name to search for. Can be partial matches. When omitted, vendors are listed alphabetically. |
| `include_draft` | boolean | No | Whether to include draft vendors in the search results. |
| `tax_1099_year` | integer | No | Tax year used to populate is_1099_tracking_enabled and apply the 1099 tracking filter. |
| `is_1099_tracking_enabled` | boolean | No | Filter vendors by whether 1099 tax tracking is enabled for tax_1099_year. Requires tax_1099_year. When combined with a search term, only the top 50 name matches are considered, so matching vendors beyond those name matches are not returned. |

### Ramp send rfx response reminder

**Slug:** `RAMP_MCP_RAMP_SEND_RFX_RESPONSE_REMINDER`

submitted their RFX response.

Only ACTIVE invitations on a published RFX whose vendor has not rejected
the invitation and has not submitted are eligible. A per-vendor cooldown
prevents spamming — recently reminded vendors are skipped and reported in
``skipped_due_to_cooldown_invitation_ids``. Omit
``rfx_vendor_invitation_ids`` to remind every eligible vendor.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the published RFX |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `rfx_vendor_invitation_ids` | array | No | Specific vendor invitation UUIDs to remind. Omit to send to all eligible vendors. |

### Ramp set decline buffer

**Slug:** `RAMP_MCP_RAMP_SET_DECLINE_BUFFER`

Decline buffers are stored as allowed overage percent. Use this purpose-built
tool for decline/spend/overage buffer changes instead of generic endpoint
tools. Always confirm the exact target and value with the user before
calling this tool.

Clear is distinct from 0%. Passing allowed_overage_percent=null removes the
explicit value at the target level so it can inherit from the next level.
Passing allowed_overage_percent=0 sets an explicit zero-percent buffer.

Spend-program changes always propagate to existing linked allocations.
For business-wide settings, buffer_application_mode is required when
setting a non-null percent.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `target_id` | string | No | UUID of the spend program or fund. Leave empty only for target_type=business. |
| `target_type` | string | Yes | Where to apply the decline buffer: business for the business-wide default, spend_program for a spend program override, or fund for an individual fund override. |
| `allowed_overage_percent` | string | Yes | Percent buffer to set. Business and fund targets accept 0 to 100 inclusive; spend_program targets accept values greater than or equal to 0 and less than 100. Pass null to clear this target's explicit buffer so it inherits from the next level. Passing 0 explicitly sets no allowed overage. |
| `buffer_application_mode` | string | No | For business target only when setting a non-null percent: all_funds to apply to all existing and future funds, or from_enabled_date to apply only to newly-created funds going forward. |

### Ramp set rfx cover sheet

**Slug:** `RAMP_MCP_RAMP_SET_RFX_COVER_SHEET`

Pass body_markdown and/or attachment_ramp_document_ids, and get explicit user confirmation for the body and every attachment before calling.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the DRAFT RFX to update. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `body_markdown` | string | No | Markdown content for the cover sheet body. Pass to replace the current body; omit to leave the body unchanged. |
| `attachment_ramp_document_ids` | array | No | Ordered list of ramp_document_ids to attach (e.g. returned by the sourcing document upload API — `ramp sourcing upload`, a multipart file upload). Pass [] to clear attachments, [id1, id2, ...] to replace the attachment set in display order (max 20, no duplicates), or omit to leave attachments unchanged. Ids must belong to the user's business. |

### Ramp set rfx pricing sheet

**Slug:** `RAMP_MCP_RAMP_SET_RFX_PRICING_SHEET`

The pricing sheet configures how vendors submit pricing in response to the
RFX: the currency they must quote in, a rich-text guidance memo explaining
pricing expectations (e.g. unit basis, term length, must include
implementation), and optional background attachments (rate cards, SOW
templates) for vendors to reference.

The guidance memo and attachments are vendor-facing (sent on publish). The
agent MUST get explicit user confirmation on the guidance wording and on
every attachment before calling this tool. Never auto-attach files the user
uploaded earlier in the thread — those may be internal/confidential and
attaching them to a vendor-facing surface is a data-leak risk.

Creating a pricing sheet implicitly enables vendor pricing on the RFX —
once this tool succeeds, vendors will see a pricing step in their response
flow. The very first call (when no pricing sheet exists yet) must include
both `currency` and `guidance_markdown`. After that, partial updates are
allowed.

Patch semantics:
- Pass `currency` to replace the currency. Omit (None) to leave unchanged.
- Pass `guidance_markdown` to replace the guidance memo. Omit to leave
  unchanged.
- Pass `attachment_ramp_document_ids=[id1, id2]` to replace the attachment
  set. Pass `[]` to clear all attachments. Omit (None) to leave unchanged.

Requires the RFX to be in DRAFT state. The acting user must be an owner or
collaborator on the RFX.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rfx_id` | string | Yes | UUID of the DRAFT RFX to update. |
| `currency` | string | No | ISO-4217 currency code (e.g. 'USD', 'EUR', 'GBP'). Required on first creation; optional on subsequent updates. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `guidance_markdown` | string | No | Markdown describing how vendors should quote pricing — unit basis, what's included, term length, payment terms. Required on first creation; optional on subsequent updates. |
| `attachment_ramp_document_ids` | array | No | Ordered list of ramp_document_ids to attach (rate cards, SOWs). Pass [] to clear attachments, or omit to leave unchanged. Ids must belong to the user's business; agents should prefer ramp_document_ids the user has uploaded in this chat thread. |

### Ramp set rfx vendor invitation contact

**Slug:** `RAMP_MCP_RAMP_SET_RFX_VENDOR_INVITATION_CONTACT`

Resolving a DRAFT invitation's contact activates it (DRAFT → ACTIVE) so
the RFX can publish; DRAFT invitations without a contact block publishing.
On an ACTIVE invitation this swaps the contact who receives vendor-facing
communication. Use GetRFXDetail to find invitation ids and current
contacts, and the vendor contacts surface to find payee_contact_id values
for the invited vendor.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `payee_contact_id` | string | Yes | UUID of the PayeeContact to set as the invitation contact. Must belong to the invited vendor (payee). |
| `rfx_vendor_invitation_id` | string | Yes | UUID of the RFX vendor invitation to update |

### Ramp set traveler loyalty program

**Slug:** `RAMP_MCP_RAMP_SET_TRAVELER_LOYALTY_PROGRAM`

If it already exists, update its loyalty number. After success, continue the
active workflow when it requires refreshed data; otherwise tell the user it is saved.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `program_name` | string | Yes | Loyalty program name, such as Delta SkyMiles, Hilton Honors, or Hertz Gold Plus Rewards. |
| `loyalty_number` | string | Yes | Loyalty number for the loyalty program. |

### Ramp simulate policy workflow for expense

**Slug:** `RAMP_MCP_RAMP_SIMULATE_POLICY_WORKFLOW_FOR_EXPENSE`

Approval policies return the simulated approval steps; submission policies return the required and visible expense fields. Provide exactly one expense UUID.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `kind` | string | Yes | Policy family to simulate. Use approval_policy for post-spend approval routing, or submission_policy for required expense fields. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `policy_uuid` | string | Yes | UUID of the policy to simulate. This may be the policy UUID or the backing ProductWorkflow UUID from page context. |
| `workflow_uuid` | string | No | Optional historical Workflow UUID to simulate instead of the latest published workflow or saved draft. |
| `transaction_uuid` | string | No | Transaction UUID to simulate. Provide exactly one expense UUID. |
| `reimbursement_uuid` | string | No | Reimbursement UUID to simulate. Provide exactly one expense UUID. |

### Ramp statement

**Slug:** `RAMP_MCP_RAMP_STATEMENT_ID`

Fetch a statement

### Ramp statements

**Slug:** `RAMP_MCP_RAMP_STATEMENTS`

List statements

### Ramp submit agent nps

**Slug:** `RAMP_MCP_RAMP_SUBMIT_AGENT_NPS`

Submit an optional Agent NPS response using a one-time survey token

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `score` | integer | Yes |  |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `explanation` | string | No |  |
| `survey_token` | string | Yes |  |

### Ramp submit draft bill

**Slug:** `RAMP_MCP_RAMP_SUBMIT_DRAFT_BILL`

Readiness requires at least one bill date, an active existing vendor with required bill-pay details, invoice currency, a positive amount, complete line items, required accounting fields, no duplicate vendor invoice number, and no submission-policy violation. Submission is accepted asynchronously and the bill keeps the same ID as the draft. Some submissions require identity verification that agents cannot complete; in that case the error includes a redirect_url that the human user must open in a browser to finish submitting in the Ramp web app. This action does not schedule, release, or pay the bill.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `draft_bill_id` | string | Yes | UUID of the active DRAFT_READY bill draft to submit. |

### Ramp submit flight booking

**Slug:** `RAMP_MCP_RAMP_SUBMIT_FLIGHT_BOOKING`

Three explicit actions: use action=preview for an authoritative preview, action=save_seats to update a persisted quote's seats and return a refreshed preview, and action=confirm only after a new, explicit user-authored approval of that latest preview. The legacy confirm input remains supported for existing clients but new callers must use action. The preview (itinerary, price, in-policy status, and required approvals) without booking. When no fund is supplied, the preview uses the recommended eligible fund, if one exists, to determine required approvals. action=confirm requires the previewed expected_total_amount (copied verbatim, digits and decimal point only, no currency symbol) only after a new, explicit user-authored response approves that latest preview. If the fare changes, preview the new total and obtain fresh approval before confirming.

flight_offer_uuid is the literal id from search: the outbound flight for one-way, the return flight for round trips (it carries both legs), or a fare option's id to book that fare. Alternatively pass a previous preview's flight_quote_uuid (never both) to preview or confirm that exact persisted quote. On confirmation, pass exactly one funding choice: spend_allocation_id with an eligible fund UUID from the preview, or request_new_fund=true with reason set to the trip purpose. If the chosen flight is out of policy, you MUST collect an oop_reason from the traveler and pass it here.

Before previewing or confirming, call GetTravelerProfile (passing the same traveler_user_id from search for delegated booking); if has_profile is false, collect the traveler's identity details and call UpdateTravelerProfile first. For changes or cancellations, use the Ramp web app.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `action` | string ("confirm" | "preview" | "save_seats") | No | Operation to perform: preview returns the current booking review without booking; save_seats saves seat_selections to a persisted quote and returns a refreshed preview; confirm submits a traveler-approved preview. New callers must set this explicitly. |
| `reason` | string | No | Trip purpose shown to approvers. REQUIRED when request_new_fund=true: ask the traveler what the purpose of the trip is and pass their answer here. |
| `confirm` | boolean | No | Deprecated compatibility input. Use action=confirm only after a new, explicit user-authored response approves the latest preview. |
| `trip_id` | string | No | Trip to attach the booking to. Omit to auto-select or create one. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `oop_reason` | string | No | Justification for why this booking is out of policy; approvers see this reason. REQUIRED when the selected flight is out of policy: if the user chooses an out-of-policy flight you MUST collect a reason from them and pass it here. |
| `seat_selections` | array | No | Seat choices to save to the persisted quote before this preview is built: one entry per changed segment, using segment_id and service_id values from seat_options. Set service_id to null to clear that segment's saved seat. Requires flight_quote_uuid and is rejected unless action=save_seats; a seat change always needs a fresh preview and a fresh explicit confirmation of the refreshed total. Never supply a price. |
| `request_new_fund` | boolean | No | Set true to explicitly request a new allocation instead of using an eligible fund. |
| `traveler_user_id` | string | No | Traveler UUID when booking for someone else; use the value from search. Requires delegate or travel-manager permission. Omit for self-booking. |
| `flight_offer_uuid` | string | No | Literal 'id' of the chosen flight offer from search (the return flight id for round trips; a fare option's id to book that fare). Pass exactly one of flight_offer_uuid or flight_quote_uuid. |
| `flight_quote_uuid` | string | No | flight_quote_uuid from an earlier preview result. Previews or confirms that exact persisted quote instead of creating a fresh quote from the offer, preserving quote-specific state. Pass exactly one of flight_offer_uuid or flight_quote_uuid. |
| `spend_allocation_id` | string | No | Eligible fund UUID to pay with. A preview without one uses the recommended eligible fund when available. On confirmation, provide this or set request_new_fund=true. |
| `include_seat_options` | boolean | No | On previews, defaults to true and returns a compact, price-ranked set of selectable seats from the persisted quote. Set false to skip them. Ignored on action=confirm. |
| `expected_total_amount` | string | No | Prefer a JSON string copied verbatim from the preview's expected_total_amount, for example "248.40". JSON numbers are accepted for compatibility. Never include a currency symbol. Required with action=confirm; the booking is rejected if the fare was repriced since. |
| `selection_surface_call_id` | string | No | When the booked option was chosen on a rendered card, pass that card's UI-surface call_id here on the confirm=true call. The booking then re-validates the persisted card selection at execution time and refuses to book if the traveler's selection changed after the preview. Omit for options chosen in conversation rather than on a card. |
| `seat_selection_surface_call_id` | string | No | When the booking review card offered seat selection, pass that card's UI-surface call_id on action=confirm. Booking re-validates the traveler's current seat selection and books at the total shown on that card, which outranks a stale expected_total_amount; no extra preview call is needed before confirming. Still pass the latest previewed expected_total_amount as a fallback. |

### Ramp submit flight cancellation

**Slug:** `RAMP_MCP_RAMP_SUBMIT_FLIGHT_CANCELLATION`

Always call with ``confirm=false`` first. That call is read-only and returns
the complete itinerary, fresh authoritative terms, and a ``preview_id``. Only
after a new, explicit user-authored approval of that latest preview may you
call again with ``confirm=true`` and the exact ``preview_id``. Earlier
cancellation intent, standing approval, or instructions not to ask questions
are not confirmation.

Atlas- and Duffel-booked flights are supported. Confirmation refetches the
canonical details used by the Ramp web flow and refuses to cancel if any term
changed. The action always cancels the entire booking; partial passenger or
leg cancellation is not supported.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `confirm` | boolean | No | Set true only after a new, explicit user-authored response approves the latest preview |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `booking_id` | string | Yes | Parent booking, flight booking, or booking request UUID returned by GetBookings |
| `preview_id` | string | No | Exact server-issued preview_id from the latest preview. Required with confirm=true and rejected if cancellation terms changed. |

### Ramp submit flight modification

**Slug:** `RAMP_MCP_RAMP_SUBMIT_FLIGHT_MODIFICATION`

Always call with ``confirm=false`` first. The returned preview contains the
authoritative itinerary, policy results, and exchange economics; search prices
are only estimates. Present the complete preview and request explicit user
confirmation before submitting. When ``economics.pricing_is_final`` is false,
the airline still reports these amounts as estimates that can change when the
ticket is reissued; say so before asking for confirmation.

After explicit confirmation, call again with ``confirm=true`` and the exact,
unchanged ``preview_id`` from that preview. Confirmation re-quotes the offer
and submits only when the terms still match. If the tool returns changed terms,
do not auto-confirm: present the new preview and wait for a new explicit
confirmation. If the user changes any requested terms, search and preview again.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `confirm` | boolean | No | False to preview authoritative terms; true only after explicit confirmation |
| `offer_id` | string | Yes | Exact ID of the replacement to exchange into, from SearchFlightModifications: an offer's own `id`, or a `fare_options[].id` to select that specific fare |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `booking_id` | string | Yes | Parent or flight booking UUID returned by GetBookings |
| `oop_reason` | string | No | Justification for why this modification is out of policy; approvers see this reason. REQUIRED when the replacement flight is out of policy: collect the reason from the traveler and pass it here |
| `preview_id` | string | No | Exact unchanged preview ID from the terms explicitly confirmed by the user. Required when confirm=true |

### Ramp submit hotel booking

**Slug:** `RAMP_MCP_RAMP_SUBMIT_HOTEL_BOOKING`

Two-step flow: call without confirm for the authoritative preview (price, policy, and required approvals) without creating a booking. When no fund is supplied, the preview uses the recommended eligible fund, if one exists, to determine required approvals. Then call with confirm=true and the previewed expected_total_amount (copied verbatim, digits and decimal point only, no currency symbol) only after a new, explicit user-authored response approves that latest preview. If the rate changes, preview the new total and obtain fresh approval before confirming.

Use the exact hotel_id from SearchHotels and rate_id from GetHotelRates. On confirmation, pass exactly one funding choice: spend_allocation_id with an eligible fund UUID from the preview, or request_new_fund=true with reason set to the trip purpose. If the chosen hotel rate is out of policy, you MUST collect an oop_reason from the traveler and pass it here.

Before previewing or confirming, call GetTravelerProfile (passing the same traveler_user_id for delegated booking); if has_profile is false, collect the traveler's identity details and call UpdateTravelerProfile first. If the user wants to change or cancel an existing reservation, direct them to the Ramp web app.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `reason` | string | No | Trip purpose shown to approvers. REQUIRED when request_new_fund=true: ask the traveler what the purpose of the trip is and pass their answer here. |
| `confirm` | boolean | No | Set true only after a new, explicit user-authored response approves the latest preview. Earlier intent, rate selection, standing approval, a reason, a fund choice, or an instruction not to ask questions is not confirmation. Otherwise omit or set false to return a preview without booking. |
| `rate_id` | string | Yes | Rate UUID from GetHotelRates for the selected hotel. |
| `trip_id` | string | No | Trip UUID to attach this booking to. Omit to auto-select or create. |
| `hotel_id` | string | Yes | Hotel UUID from SearchHotels results. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `oop_reason` | string | No | Justification for why this booking is out of policy; approvers see this reason. REQUIRED when the selected hotel rate is out of policy: if the user chooses an out-of-policy rate you MUST collect a reason from them and pass it here. |
| `check_in_date` | string | Yes | Hotel check-in date in YYYY-MM-DD format |
| `check_out_date` | string | Yes | Hotel check-out date in YYYY-MM-DD format |
| `request_new_fund` | boolean | No | Set true to explicitly request a new allocation instead of using an eligible fund. |
| `traveler_user_id` | string | No | Traveler UUID when booking for someone else. |
| `spend_allocation_id` | string | No | Eligible fund UUID to pay with. A preview without one uses the recommended eligible fund when available. On confirmation, provide this or set request_new_fund=true. |
| `expected_total_amount` | string | No | Prefer a JSON string copied verbatim from the preview's expected_total_amount, for example "248.40". JSON numbers are accepted for compatibility. Never include a currency symbol. Required with confirm; the booking is rejected if the rate was repriced since. |
| `selection_surface_call_id` | string | No | When the booked option was chosen on a rendered card, pass that card's UI-surface call_id here on the confirm=true call. The booking then re-validates the persisted card selection at execution time and refuses to book if the traveler's selection changed after the preview. Omit for options chosen in conversation rather than on a card. |

### Ramp submit hotel cancellation

**Slug:** `RAMP_MCP_RAMP_SUBMIT_HOTEL_CANCELLATION`

Always call with ``confirm=false`` first. That call is read-only and returns
fresh authoritative terms plus a ``preview_id``. Only after a new, explicit
user-authored approval of that latest preview may you call again with
``confirm=true`` and the exact ``preview_id``. Earlier cancellation intent,
standing approval, or instructions not to ask questions are not confirmation.
Confirmation refetches the canonical details and refuses to cancel if any
material hotel cancellation term changed. This tool always cancels the entire
hotel booking; use the flight cancellation tool for flights.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `confirm` | boolean | No | Set true only after a new, explicit user-authored response approves the latest preview. Otherwise omit or set false for a non-mutating preview. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `booking_id` | string | Yes | Public parent booking or booking request UUID from GetBookings |
| `preview_id` | string | No | Exact server-issued preview_id from the latest preview. Required with confirm=true and rejected if cancellation terms changed. |

### Ramp submit reimbursement

**Slug:** `RAMP_MCP_RAMP_SUBMIT_REIMBURSEMENT`

If the submission fails, the agent should follow up with the user based on the error returned from the endpoint.
If it is due to outstanding missing items, the agent should recheck missing_items via the GetReimbursements tool and provide suggestions for the user.
If 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.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `reimbursement_uuid` | string | Yes | UUID of the reimbursement to submit for approval. Call GetReimbursements to determine the UUID if it cannot be obtained from context. |

### Ramp team

**Slug:** `RAMP_MCP_RAMP_TEAM`

User profile fields reflect current Ramp user metadata, independent of the
requested dates. Only users with positive estimated spend are returned.

### Ramp transaction

**Slug:** `RAMP_MCP_RAMP_TRANSACTION_ID`

Send line_items with amounts (in minor units) to create or replace the
transaction's split; the line item amounts must sum to the transaction
amount. Each line item can carry its own memo and accounting field
selections. Send an empty line_items array to unsplit (remove all line
items). Returns the updated transaction.

### Ramp transfer spend allocation ownership

**Slug:** `RAMP_MCP_RAMP_TRANSFER_SPEND_ALLOCATION_OWNERSHIP`

Transfer ownership of a spend allocation using the current and new owners' emails

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `new_user_email` | string | Yes | Email of the new owner |
| `current_user_email` | string | Yes | Email of the current owner |
| `spend_allocation_uuid` | string | Yes | UUID of the spend allocation to transfer |

### Ramp travel request action

**Slug:** `RAMP_MCP_RAMP_TRAVEL_REQUEST_ACTION`

Only act when the user's current instruction explicitly identifies this request or
unambiguously refers to this exact request from the immediately preceding assistant
preview. Never infer another pending or remaining request after completing an action.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `action` | string ("approve" | "reject") | Yes | The action to take on the booking request: 'approve' or 'reject'. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `rejection_reason` | string | No | The reason for rejecting the booking request. Only used when action is 'reject'. |
| `booking_request_id` | string | Yes | The UUID of the booking request to take action on. |

### Ramp unarchive spend allocation

**Slug:** `RAMP_MCP_RAMP_UNARCHIVE_SPEND_ALLOCATION`

Unarchive a fund so it becomes visible and spendable again

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `spend_allocation_uuid` | string | Yes | The UUID of the spend allocation to unarchive |

### Ramp unlock fraud locked card

**Slug:** `RAMP_MCP_RAMP_UNLOCK_FRAUD_LOCKED_CARD`

Requires the user to confirm they recognize the flagged transaction.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `id` | string | Yes | The UUID of the fraud-locked card to unlock. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `user_confirmed_fraud_whitelist` | boolean | No |  |

### Ramp update category restrictions

**Slug:** `RAMP_MCP_RAMP_UPDATE_CATEGORY_RESTRICTIONS`

Manages spend types (e.g., Restaurants, Travel), not individual merchants.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `action` | string | Yes | The action to perform: 'add_to_whitelist' (restrict to only these categories), 'remove_from_whitelist', 'add_to_blacklist' (block these categories), or 'remove_from_blacklist'. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `category_ids` | array | Yes | The category IDs to add or remove. Must be non-empty. Operation is atomic: if any ID is invalid, the entire request fails. Valid IDs (id=name): 1=Pet, 2=Other, 3=Office, 4=Airlines, 5=Car Rental, 6=Lodging, 7=Travel, 8=Taxi & Rideshare, 9=Freight/Moving/Delivery, 10=Shipping, 11=Utilities, 12=Office Supplies & Cleaning, 13=General Merchandise, 14=Electronics, 15=Clothing, 16=Books & Newspapers, 17=Supermarkets & Grocery, 18=Fuel & Gas, 19=Restaurants, 20=Alcohol & Bars, 21=Medical, 23=Fees & Financial Institutions, 24=Entertainment, 25=Professional Services, 26=Taxes & Tax Prep, 27=Advertising, 28=Parking, 29=Car Services, 30=Gambling, 31=Clubs & Memberships, 32=Legal, 33=Education, 34=Charitable Donations, 35=Political Organizations, 36=Religious Organizations, 37=Fines, 38=Government Services, 39=Intra-Company Purchases, 40=SaaS/Software, 41=Cloud Computing, 42=Streaming Services, 43=Internet & Phone, 44=Insurance; there is no ID 22. |
| `spend_allocation_id` | string | Yes | The fund UUID whose category restrictions should be updated. Single-fund only. Get this from GetUserFunds tool (the 'id' field). For bulk operations, use GetSpendAllocationsByFiltersTool via bulk_funds_actions. |

### Ramp update draft bill

**Slug:** `RAMP_MCP_RAMP_UPDATE_DRAFT_BILL`

Requires the current draft version and returns the new version; stale updates are rejected with the current version. Omitted fields remain unchanged, while null intentionally clears a nullable field. Tracking-category and option identifiers accept integer DB ids or resolvable UUID strings. Submitted drafts and drafts with retainage (withholding) are not supported.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `version` | string | Yes | Expected current draft version. A stale value is rejected and the error returns the latest version. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `vendor_payments` | array | No | Optional draft payment details for the draft bill. Leave unset unless you are intentionally updating payment draft details. Explicit null is rejected: removing draft payments is not supported by this tool — omit the field instead. |
| `provisional_bill` | string | Yes | The draft bill fields to change, in the draft's `editable_payload` shape. Omitted fields remain unchanged; set a nullable field to null only when you intentionally want to clear it. Tracking-category and option ids may be passed as resolvable UUIDs. |
| `provisional_bill_id` | string | Yes | UUID of the draft bill to update |

### Ramp update merchant restrictions

**Slug:** `RAMP_MCP_RAMP_UPDATE_MERCHANT_RESTRICTIONS`

- Add or remove merchants from the allowed merchants list (whitelist)
- Add or remove merchants from the blocked merchants list (blacklist)

Use this when a user wants to:
- Allow specific merchants on a fund (add to whitelist)
- Block specific merchants on a fund (add to blacklist)
- Remove merchants from the allowed or blocked lists

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `action` | string | Yes | Whether to add or remove merchants from the list. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `merchant_uuids` | array | Yes | List of merchant UUIDs to add or remove. |
| `restriction_type` | string | Yes | Whether to modify the allowed merchants (whitelist) or blocked merchants (blacklist). |
| `spend_allocation_id` | string | Yes | The fund UUID to modify merchant restrictions on. |

### Ramp update rfx

**Slug:** `RAMP_MCP_RAMP_UPDATE_RFX`

``sections`` is a complete replacement of the questionnaire — resubmit the
full section list on every update. Use GetRFXDetail first to see the
current structure. Optional scalar fields left unset are unchanged.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `name` | string | No | New name for the RFX. Omit to leave unchanged. |
| `rfx_id` | string | Yes | UUID of the RFX to update |
| `sections` | array | Yes | Complete replacement of the questionnaire — resubmit the full section list, including unchanged sections. GetRFXDetail shows the current structure. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `close_date` | string | No | New RSVP deadline (YYYY-MM-DD). Must be in the future. Omit to leave unchanged. |
| `description` | string | No | New description for the RFX. Omit to leave unchanged. |
| `response_submission_deadline` | string | No | New response submission deadline (YYYY-MM-DD). Must be in the future and on or after close_date. Omit to leave unchanged. |

### Ramp update spend allocation interval

**Slug:** `RAMP_MCP_RAMP_UPDATE_SPEND_ALLOCATION_INTERVAL`

Update only the spend interval for a spend allocation

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `interval` | string | Yes | New spend interval (for example: DAILY, WEEKLY, MONTHLY, TOTAL) |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `spend_allocation_uuid` | string | Yes | The UUID of the spend allocation to update |

### Ramp update transaction amount limit

**Slug:** `RAMP_MCP_RAMP_UPDATE_TRANSACTION_AMOUNT_LIMIT`

Use this for decline action
INCREASE_TRANSACTION_AMOUNT_LIMIT or requests about a per-transaction,
single-transaction, or max-expense limit. Use LimitIncrease for the period total.

Set any positive value to raise or lower the cap. AP-card and bill-pay funds are
unsupported. Provide exactly one of spend_allocation_id or card_id.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `card_id` | string | No | The card UUID whose fund's per-transaction limit should be updated. Provide either this or spend_allocation_id, not both. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `spend_allocation_id` | string | No | The fund (spend allocation) UUID whose per-transaction limit should be updated. Provide either this or card_id, not both. |
| `new_transaction_amount_limit` | string | Yes | The new per-transaction limit, in the fund's currency. Must be greater than zero. This sets the cap directly — to raise it by a delta, compute the new total before calling. |

### Ramp update traveler loyalty program

**Slug:** `RAMP_MCP_RAMP_UPDATE_TRAVELER_LOYALTY_PROGRAM`

Compatibility route for callers that still update a saved loyalty program by ID

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `loyalty_number` | string | Yes | New loyalty number for the saved loyalty program |
| `traveler_loyalty_program_id` | string | Yes | Saved loyalty program ID from list of loyalty programs returned by ListTravelerLoyaltyPrograms |

### Ramp update traveler profile

**Slug:** `RAMP_MCP_RAMP_UPDATE_TRAVELER_PROFILE`

Never use for loyalty-only requests; use dedicated traveler loyalty program tools instead.

For delegated bookings, first resolve the traveler with GetAllReducedUsers/list-users,
then pass that UUID as traveler_user_id. Omit traveler_user_id for self-booking.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `email` | string | No | Email address for travel communications |
| `id_gender` | string | No | Gender as shown on government-issued ID. Must be MALE, FEMALE, or UNSPECIFIED for an X marker. |
| `last_name` | string | No | Last name (as it appears on government-issued ID) |
| `max_stops` | integer | No | Durable maximum number of stops the user generally accepts. Do not use for one search only. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `first_name` | string | No | First name (as it appears on government-issued ID) |
| `middle_name` | string | No | Middle name (as it appears on government-issued ID) |
| `name_prefix` | string | No | Name prefix (e.g., Mr., Ms., Dr.) |
| `name_suffix` | string | No | Name suffix (e.g., Jr., Sr., III) |
| `phone_number` | string | No | Phone number for travel communications (always use E.164 formatting) |
| `date_of_birth` | string | No | Date of birth in YYYY-MM-DD format |
| `redress_number` | string | No | Redress number from the DHS Traveler Redress Inquiry Program (DHS TRIP). Must be a 7-digit number. |
| `seat_preference` | string | No | Durable seat preference, only when the user states it as a future default. |
| `loyalty_programs` | array | No | Internal loyalty program ID updates only. Never use for natural-language loyalty program names or loyalty-only requests; use SetTravelerLoyaltyProgram or RemoveTravelerLoyaltyProgram instead. |
| `traveler_user_id` | string | No | Traveler UUID when updating another person's profile for delegated booking. Resolve names with list-users/GetAllReducedUsers first. Requires delegate or travel-manager permission. Omit for self-booking. |
| `home_airport_code` | string | No | Durable default home or usual departure airport IATA code. Do not use for a one-off trip origin. |
| `phone_country_code` | string | No | ISO 3166-1 alpha-2 country code for phone number (e.g., US, GB) |
| `preferred_airlines` | array | No | Durable preferred airlines by airline name or IATA code, e.g. ['Air Canada'] or ['AC']. Use [] to clear. Do not infer from one booking. |
| `avoid_red_eye_flights` | boolean | No | Durable preference to avoid red-eye flights. Set true for 'never book red-eyes' and false to clear. |
| `known_traveler_number` | string | No | Known Traveler Number (KTN) for TSA PreCheck. Must be 8-10 alphanumeric characters. |
| `preferred_cabin_class` | string | No | Durable preferred flight cabin class. Do not use for policy- or trip-specific cabin limits. |
| `preferred_arrival_time_window` | string | No | Durable preferred arrival time window. Do not use for a one-off requested arrival deadline. |
| `preferred_departure_time_window` | string | No | Durable preferred departure time window. Do not use for a one-off requested departure time. |

### Ramp update travel preferences

**Slug:** `RAMP_MCP_RAMP_UPDATE_TRAVEL_PREFERENCES`

Purpose: Capture HIGH-SIGNAL, reusable preferences that improve future
flight and hotel recommendations.

Call this tool proactively ONLY when the user states a lasting,
general preference — signaled by words like "always", "never",
"I prefer", "from now on", "in general", or "usually".

ALL THREE conditions must be met before calling:
1. Durable — likely true across trips, not just this one
2. Actionable — directly improves hotel or flight recommendations
3. Explicit — clearly stated by the user, not inferred

Good examples (call the tool):
- "I always stay at Marriott" → hotel chain preference
- "I need a gym when I travel" → amenity requirement
- "I prefer downtown hotels" → location style
- "Nothing below 4 stars" → quality floor
- "I prefer morning flights" → flight time preference
- "I always fly out of SFO" → preferred airport
- "Never book red-eyes" → avoid_red_eye_flights=True

Do NOT call for (vast majority of travel messages):
- Trip-specific requests ("this time find something cheap")
- Trip-specific timing constraints ("arrive before 3pm this trip")
- Search parameters ("find me a hotel near Times Square for March 20")
- Policy or fund choices ("use the offsite fund", "make it in policy")
- Questions ("what hotels are available?")
- Booking actions ("book option 2")
- Speculation or inferences not stated by the user
- Sensitive PII (passport numbers, payment details, full DOB)

For explicit durable flight preferences, pass the typed fields below.
Leave fields omitted to preserve existing saved values. Use null only to
clear nullable durable defaults. Use [] to clear list-valued preferences.

When in doubt, do NOT call. Most messages should NOT trigger this tool.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `request` | string | Yes | The lasting travel preference to save, in the user's own words. Include the category if obvious (e.g., hotel chain, amenity, star rating, flight time, airport, TSA PreCheck). |
| `max_stops` | integer | No | Durable maximum number of stops the user generally accepts. Do not use for one search only. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `seat_preference` | string | No | Durable seat preference, only when the user states it as a future default. |
| `home_airport_code` | string | No | Durable default home or usual departure airport IATA code. Do not use for a one-off trip origin. |
| `preferred_airlines` | array | No | Durable preferred airlines by airline name or IATA code, e.g. ['Air Canada'] or ['AC']. Use [] to clear. Do not infer from one booking. |
| `avoid_red_eye_flights` | boolean | No | Durable preference to avoid red-eye flights. Set true for 'never book red-eyes' and false to clear. |
| `preferred_cabin_class` | string | No | Durable preferred flight cabin class. Do not use for policy- or trip-specific cabin limits. |
| `preferred_arrival_time_window` | string | No | Durable preferred arrival time window. Do not use for a one-off requested arrival deadline. |
| `preferred_departure_time_window` | string | No | Durable preferred departure time window. Do not use for a one-off requested departure time. |

### Ramp usage

**Slug:** `RAMP_MCP_RAMP_USAGE`

List daily AI usage and spend grouped by provider, model, and product

### Ramp withdraw x402 wallet

**Slug:** `RAMP_MCP_RAMP_WITHDRAW_X402_WALLET`

Before calling, use ListBusinessAccounts to obtain the destination account UUID;
never guess it. Confirm the exact destination account and USDC amount with the
user before creating this irreversible transfer. MCP and CLI callers must provide
an idempotency key. Only active Increase USD accounts are supported.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `amount` | string | Yes | Exact USDC amount the user confirmed for withdrawal. |
| `rationale` | string | Yes | Briefly explain why you are calling this tool: what goal or workflow it serves and what you intend to do with the result. |
| `idempotency_key` | string | No | Caller-generated UUID used to prevent duplicate withdrawals. Reuse it only when retrying the same request. |
| `destination_wallet_account_uuid` | string | Yes | UUID of the destination Ramp Checking Account returned by ListBusinessAccounts. Never guess an account UUID. |
