In this section: All MCP tools

All MCP tools

Every MCP tool Miles exposes, grouped by domain, on one page: the fetch an agent makes instead of nine.

Cards

get_best_card

Best card in the user's wallet for a spending category (dining, groceries, gas, travel, rent, ...) or a specific merchant -- pass at least one of category or merchant; amount (dollars) is optional.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
categorystringThe one key that names what is being bought. other when no key fits and the base rate applies. The brand goes in merchant.
merchantstringA specific merchant (e.g. "Costco").
amountnumberPurchase amount in dollars, for the receipt's dollar line; a non-positive value is treated as absent.
internationalbooleanSet to true when the purchase happens OUTSIDE the United States: the user names a foreign city or country ('in Tokyo', 'in Europe'), says abroad/overseas, or is on an international trip. Ranks by net return after foreign transaction fees and drops U.S.-only earning categories (Business Gold's 4X is 'U.S. purchases at restaurants' and earns nothing extra in Tokyo). Default false. Leave it off for domestic spending.
cardsstring[]Cards the user says they hold; ones the saved wallet lacks are ranked as held (stated_cards).
channelstringHow the purchase is made, when the person says so: online for a website or online order, in_app for a merchant's own app, mobile_wallet for Apple Pay or Google Pay, physical_card for the physical card, direct for booked directly with the airline or hotel. Omit otherwise.
portalstringThe booking portal the purchase goes through, when the person names one. Omit otherwise.
housingstringWith category rent: mortgage for a mortgage payment, rent for rent. Omit otherwise.
merchant_rolestringprovider sells the category itself (restaurant, airline, hotel); reseller resells travel or experiences (day passes, tours); payment_platform is a payment app. Omit if unsure.
paid_throughstringThird-party payment platform named by the person. Keep the seller in merchant and name the payment platform here. Omit otherwise.
redemption_basisstringThe member's own stated way of redeeming, for this conversation. Omit unless the member said how they redeem.

get_card_info

Full details for a credit card PRODUCT: fees, earning rates, credits, benefits, transfer partners, sign-up bonus.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
card_namestringCatalog product name, fuzzy-matched ("Amex Plat" resolves). Send this or wallet_id, not both; wallet_id wins when both arrive.
wallet_idstringA cc_N wallet entry id from get_wallet_cards; resolves to the product that entry holds. Takes only the cc_N shape: a product name here is refused, and an id with no entry is refused rather than fuzzy-matched.

get_product_changes

Upgrade and downgrade paths for a wallet card -- the natural next question after analyze_keep_cancel. Wallet-aware: results reflect which products you already hold.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
card_namestringrequiredName of a card in the user's wallet to list upgrade and downgrade paths for.

get_top_offers

Current top sign-up bonuses, optionally filtered by card type (personal/business), ranked by Miles's first-year value.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
card_typestringFilter to "personal" or "business" cards; omit for both.
memberstringOn a Household Profiles account, the household member to rank offers for; omit to keep any offer some member can apply for. A household member's name; a name matching no member is refused, not guessed.
annual_fee_maxnumberMaximum recorded annual fee in dollars; 0 means no-fee offers only. Offers with unknown fees are excluded.
recent_denial_reasonstringA recent card denial the person states, by reason; every issuer then reads may_be_restricted, never open.
hard_inquiries_6mintegerHard inquiries in the last 6 months, when stated; read by issuer inquiry limits.

get_wallet_complement

Recommends NEW cards to get -- fills gaps in the wallet, not a keep/cancel review of cards already held. Finds orphaned points needing a companion card, weak spending categories, missing transfer ecosystems, and network gaps, then ranks up to 5 candidate cards with gap-fill reasons, ongoing value, and sign-up bonus. Each recommendation carries inline eligibility annotations (5/24, 6/24, Amex velocity limits) and portfolio rules (e.g. one Sapphire product at a time); results are filtered to the wallet's card type (personal/business) automatically.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
focusstring"earning" narrows to category-multiplier gaps, "ecosystem" to new transfer-partner access; omit for a comprehensive analysis.
card_namestringFind complements for one specific wallet card instead of the whole wallet.
check_eligibilitybooleanWhen true, drop cards the user cannot currently apply for instead of just annotating them. Already on by default whenever the wallet is non-empty.
memberstringOn a Household Profiles account, the household member whose eligibility judges each candidate; omit to keep any candidate some member can apply for. A household member's name; a name matching no member is refused, not guessed.
preferred_programsstring[]Loyalty programs the user has explicitly named as preferences, any spelling. A card that earns one, or transfers to one, is nudged up the ranking and says so in its gap-fill reasons: a tie-breaker, not a filter. Never infer these from the wallet; unrecognized names come back in preferred_programs_unmatched.
recent_denial_reasonstringA recent card denial the person states, by reason; every issuer then reads may_be_restricted, never open.
hard_inquiries_6mintegerHard inquiries in the last 6 months, when stated; read by issuer inquiry limits.

search_cards

Search the 180+ card dataset by issuer, fees, rewards program, airline/hotel affiliation, or bonus spending categories.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
spending_categoriesstring[]Bonus spending categories the card should earn well in, as a list of category names (e.g. ["dining", "groceries"]), not one comma-joined string.
issuerstringLimit results to one issuer (e.g. "Chase", "Amex").
card_typestringLimit results to "Personal" or "Business" cards.
max_annual_feeintegerHighest annual fee to include, in whole dollars; 0 means no-annual-fee cards only.
rewards_programstringLimit results to cards earning one rewards program or currency (e.g. "Chase Ultimate Rewards"). Applied after the search, so the response notes when fewer than limit cards matched.
airlinestringLimit results to cards affiliated with one airline (e.g. "United").
hotelstringLimit results to cards affiliated with one hotel program (e.g. "Hyatt").
has_signup_bonusbooleanWhen true, keep only cards currently offering a sign-up bonus.
limitintegerMaximum number of cards to return. Default 10.
memberstringOn a Household Profiles account, the household member whose application eligibility filters the result; omit to keep any card some member can apply for. A household member's name; a name matching no member is refused, not guessed.
is_studentbooleanTrue only when the user said they are a student. Student cards are hidden otherwise.

Transfer partners

compare_transfer_options

What a balance of points is worth across transfer paths, with the arithmetic shown -- the points-quantity question, distinct from get_transfer_partners (which lists WHICH paths exist, not what YOUR points are worth). Call program only (from), target only (to), or both (one specific path, e.g. 60k UR → Hyatt).

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
pointsintegerrequiredThe points balance to value, as a whole number of points.
programstringSource currency the points are in (e.g. "Chase Ultimate Rewards"). Pass alone to see every path from it, or with target for one path.
targetstringDestination program (e.g. "World of Hyatt"). Pass alone to see every path into it, or with program for one path.
cardholderstringWhose points these are: a household member's name or id, or "me". Omit for the account holder's own. An unknown name is refused.

get_transfer_partners

Transfer partner lookup. mode='from_program' lists where a currency (e.g. 'Chase Ultimate Rewards') transfers; 'to_program' lists which currencies reach a destination (e.g. 'World of Hyatt'); 'auto' infers.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
querystringrequiredA currency or loyalty program name (e.g. "Chase Ultimate Rewards" or "World of Hyatt").
modestring"from_program" lists where the named currency transfers; "to_program" lists which currencies reach the named destination; "auto" (default) infers which from the query.

get_valuations

Point valuations (cents per point), using your custom values when set and defaults otherwise. Includes issuer rules for direct bank deposits.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
programsstring[]Loyalty program names to limit the result to (e.g. ["Chase Ultimate Rewards", "World of Hyatt"]); omit for every program on file.

plan_transfer

"I need N points at program X -- which of my HELD currencies gets me there cheapest?" The advisor flagship: ranks the loyalty currencies you've told Miles you hold (get_balances) by cheapest path to target_program -- transfer graph x ratios x active bonuses x transfer minimums/increments x your own valuations -- including two-currency split suggestions and "you hold it but not enough" rows. Deterministic, receipt-style, built on the same functions compare_transfer_options uses, so the two tools cannot disagree about a shared leg.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
target_programstringrequiredThe destination loyalty program (e.g. "World of Hyatt"). An unrecognized name returns an unknown_program error rather than a guess.
points_neededintegerrequiredHow many of the target program's points are needed, as a whole number; never dollars and never your own balance.
cardholderstringRank one household member's balances: their name or id, or "me". Omit for every cardholder. An unknown name is refused.

portfolio_review

"Here are my balances -- where should I focus?" Ranks every loyalty currency the member has told Miles they hold against a redemption goal, and says which one to focus on, which to stop growing, and why.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
goalstringRedemption goal: flights_premium, flights_economy, hotels or cash_like. Omit for a rankings block across all four plus a suggested_goal; any other value, flexible included, returns a validation_error naming the four.
cardholderstringA household member's name or id. Omit for every cardholder, reported separately. A name nobody in the household has returns an unknown_cardholder error listing the names that exist; one with no balances on file returns rows: [], NOT empty_ledger.

reset_valuation

Reset a custom valuation back to the reasonable redemption value. Requires wallet-change access.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
point_typestringrequiredThe program or currency whose custom valuation to reset to the reasonable redemption value.

set_valuation

Set the user's custom point/mile valuations (cents per point). Pass valuations to set several at once. Requires wallet-change access.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
point_typestringThe program or currency to set one valuation for (e.g. "Chase Ultimate Rewards"); pair with valuation.
valuationnumberThe value in cents per point (1.8 means 1.8 cents), not dollars and not a percentage; pair with point_type.
valuationsobjectSeveral valuations at once, program name to cents per point (e.g. {"Chase Ultimate Rewards": 1.8, "World of Hyatt": 2.1}).

where_to_credit

Answers "which frequent flyer program should I credit this flight to?". Ranks every program that can take the flight by what the miles are worth TO THIS USER -- their own valuations, balances, and elite tier -- not by the raw mileage count. That distinction matters: on most economy fares nearly every program pays the SAME percentage, so the mileage number does not decide the answer and the value does.

ScopeQuota
miles:readexpensive
NameTypeRequiredDescription
segmentsobject[]requiredOne entry per flown leg (a return trip is two), each {operating_airline, origin, destination, fare_class}. operating_airline is the two-letter IATA code of the airline that OPERATES the flight, not the one on the ticket; fare_class is the single booking-class letter from the ticket, and it decides the answer -- ask for it rather than guessing one from the cabin.
programsstring[]Limit the ranking to these programs. Omit to rank every program the source lists.
memberstringHousehold member who is flying, so their balances and elite tier are used instead of the account holder's.

Wallet

add_card

Add one credit card, or a BATCH of them, to the member's wallet. Requires wallet-change access. Every argument's own description carries that argument's rules; this is what no single argument can say.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
card_namestringThe card to add, as the member names it; matched against the Miles catalog, and an ambiguous name is refused with close matches rather than guessed. Ignored when cards is present.
nicknamestringA short label of the member's own for this holding, for telling copies of the same product apart.
date_openedstringThe date the account was opened, YYYY-MM-DD.
anniversary_datestringThe date the annual fee posts, YYYY-MM-DD. Do not derive it from date_opened: for many issuers they differ, and every free-night and credit-cycle figure Miles computes reads this field.
sign_up_bonusstringThe member's own record of the sign-up bonus they were offered. Reads back as user_sign_up_bonus; a key spelled sign_up_bonus on a card you read is the catalog's current offer and must never be written back.
signup_bonus_statusstringWhere the sign-up bonus stands: pending / in_progress / received / expired. Once it is received or expired, sub_deadline stops raising alerts.
signup_bonus_received_onstringThe date the sign-up bonus posted, YYYY-MM-DD. Several welcome-offer rules run a 15- to 48-month clock from this day.
bonus_accepted_onstringThe date the member accepted this bonus offer, YYYY-MM-DD. This, not the account-open, product-change, or bonus-posted date, anchors a retention/clawback window.
sub_deadlinestringThe date the sign-up bonus spend window closes, YYYY-MM-DD. Set it only from what the member told you, never from the card's marketing terms.
sub_targetnumberThe spend the sign-up bonus requires, in dollars. Never the amount the member has spent so far: Miles holds no transactions and has no field for progress.
notesstringThe member's own free-text note on this holding. Reads back as user_notes; a key spelled notes on a card you read is the catalog's note about the product and must never be written back.
statusstringThe holding's status: active (the default), closed or pending. A retired product is accepted only with closed.
closed_onstringThe date the card closed, YYYY-MM-DD; pass it with status="closed". Left out, a closed card is stored as closed on an unknown date, never as closed today.
autopay_statusstringon or off, whether the member has the issuer's autopay set up. Omit it when the member has not said: absent means nobody has checked, which Miles reports differently from off.
retention_offersobject[]The history of what the issuer offered to keep the member, as a list of {date, offer, took_it}. REPLACES the stored list, so send the whole history every time; sending one entry deletes the rest.
card_settingsobjectThe member's per-card selections (a relationship tier, a chosen bonus category, an earning-modifier opt-in), keyed by the setting id from the card's card_settings_available. A key the card does not define is refused, and the refusal names the ids it does define.
benefit_selectionsobjectWhich vendor the member picked for a credit that locks to one, keyed by the credit's id from the card's benefits (airline_fees, splurge). Each value is a list of {choices, period, selected_on, source}, one per benefit window. choices is a list even for a credit that takes one pick; period is the window the pick governs -- 2026 on a calendar-year credit, 2026-05 on a cardmember-year one -- and is optional, derived from selected_on, needed explicitly only when it differs from the window selected_on falls in. Replaces the stored map: send the whole history.
original_card_namestringThe product the card was first opened as, for a card that was product-changed before it reached Miles.
product_historyobject[]Product changes that happened before this card reached Miles, oldest first, each {from_card, to_card, changed_date, direction, note} with every field optional; changed_date is YYYY-MM-DD and direction is upgrade or downgrade. REPLACES the stored list. For a change happening now, use update_card with product_change=true.
cardholderstringThe household member this card belongs to, by name as it appears in Household Profiles; a name matching no member is refused rather than guessed. With two or more members it is required: ask whose card it is, and pass skip to leave it Unassigned. A supporter feature: without Household Profiles the card is still added under the primary cardholder and the result carries a note saying so.
holder_typestringWhether the cardholder is the primary account holder (the default) or an authorized_user on the card.
card_number_last4stringThe last four digits of the account number, exactly four, for telling two copies of the same product apart. Anything longer is refused rather than stored.
intentional_duplicatebooleanPass true only when the member genuinely holds a second copy of a card the wallet already has; otherwise adding it again is reported as already present, not duplicated.
entry_keystringAn idempotency key of your own choosing, at most 64 characters. Repeating the same key makes the add an exact no-op, so a retry after a lost response cannot double-add. Ignored when cards is present.
cardsobject[]Batch form: a list of up to 100 entries using the same fields as a single add, each with its own card_name. When present, the top-level card_name and entry_key are ignored, and the result reports each entry in order as applied, already_present, ambiguous or rejected; a failed entry never blocks the rest.

analyze_keep_cancel

Keep/downgrade/cancel analysis for one card: marginal value vs annual fee, duplicate-benefit discounting, downgrade paths. Name it with wallet_id or card_name (wallet_id wins); a name matching two holdings the SAME person holds is refused ambiguous_holding: call again with one holdings[].wallet_id. Two household members each holding one copy is not refused -- you get the member's own, plus household_note. credit_value_basis is recorded (from the member's recorded use), typical, or mixed.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
card_namestringName of a card in the member's wallet, fuzzy-matched.
wallet_idstringA cc_N id from get_wallet_cards (other results call it wallet_entry_id). Takes only the cc_N shape.
cardholderstringA household member's name or id, for THAT person's copy of a card the household holds more than once. Omit it for the member's own, which is the default. A name matching no member is refused, not guessed.
basisstringauto (default) values each credit from the member's recorded use once enough is on record; typical ignores what the member recorded and answers for a typical cardholder. Membership only: without it every credit is typical and periods_needed is null, so recording more periods will not change the answer. typical results carry what_if.

analyze_spending

Earning-potential analysis for a spending profile: for each category, the wallet's best card and the annual rewards value it produces -- pre-computed dollar figures, not estimates to redo.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
spendingobjectrequiredMonthly spend in dollars keyed by category (dining, groceries, gas, travel, hotels, airlines, rent, entertainment, streaming, online_shopping, ...). Use only figures the user stated; never estimate one.
candidate_cardsstring[]Card names not in the wallet (e.g. from search_cards or get_wallet_complement) to evaluate on the same profile; omit for a wallet-only read.
internationalbooleanWhen true, factor foreign transaction fees into the return. Default false.
redemption_basisstringThe member's own stated way of redeeming, for this conversation. Omit unless the member said how they redeem.

clear_cap_status

Remove a cap mark an agent recorded -- the retraction half of set_cap_status. Requires reconciliation write access, like it.

ScopeQuota
miles:write:reconcilestandard
NameTypeRequiredDescription
card_namestringCard in the wallet, e.g. Blue Cash Preferred.
wallet_entry_idstringWallet entry id (cc_3), instead of card_name.
categorystringCapped category, e.g. groceries; omit if one cap.
cap_keystringCap key from a result's caps, instead of category.
cardholderstringHousehold member name or me, if several hold it.

get_dated_events

Everything with a real date across the wallet, inside the next N days -- transfer bonuses, SUB deadlines, annual fees, certificates, tracked credits ending (amount = value left), points expiring. One call for "what's ending this month" or "am I on track for any welcome bonus".

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
daysintegerDays out to look, inclusive (default 30).
kindsstring[]Optional: restrict to specific kinds. Omit for every kind.

get_eligibility

Application-rule status (Chase 5/24, issuer velocity limits) based on the user's wallet card-open dates.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
issuerstringNarrow to one issuer's application rules (e.g. "Chase", "Amex").
cardstringA specific card name; adds card-specific checks (lifetime language, family restrictions, One Sapphire).
memberstringOn a Household Profiles account, the household member whose status to report; omit for a per-member breakdown under members. A household member's name; a name matching no member is refused, not guessed.
recent_denial_reasonstringA recent card denial the person states, by reason; every issuer then reads may_be_restricted, never open.
hard_inquiries_6mintegerHard inquiries in the last 6 months, when stated; read by issuer inquiry limits.

get_needs_attention

Everything that needs eyes on it right now -- in the wallet, and on the cards the user is only considering.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
credit_window_daysintegerHow many days ahead to look for expiring tracked credits. Default 14.
fee_window_daysintegerHow many days ahead to look for an annual fee posting. Default 30.
sub_window_daysintegerHow many days ahead to look for a sign-up-bonus spend deadline. Default 30.

get_spending_strategy

Category-by-category map of which wallet card to use for every spending type.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
internationalbooleanSet to true when the spending happens OUTSIDE the United States: the user names a foreign city or country, says abroad/overseas, or is planning an international trip. Ranks every category by net return after foreign transaction fees and drops U.S.-only earning categories. Default false.
redemption_basisstringThe member's own stated way of redeeming, for this conversation. Omit unless the member said how they redeem.

get_travel_day_summary

Wallet-derived checklist for travel-day lounges and perks, filtered by airline and international context; prefer it over flat get_wallet_benefits for a travel day. Optionally provide both adjacent flight segments to assess a same-airport connection. Segment data is used for this answer only.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
airlinestringThe carrier for this trip, to keep only benefits that apply on that airline.
internationalbooleanWhether this is an international itinerary, to keep only benefits that apply to it.
arrival_segmentobjectFirst leg: arrival_airport and arrival_time. Local times need IANA arrival_timezone; optional arrival_terminal, carrier, cabin.
departure_segmentobjectNext leg: departure_airport and departure_time. Local times need IANA departure_timezone; optional departure_terminal, carrier, cabin.

get_wallet_benefits

filtered_by_cardholder echoes member. All credits: benefit_type='credits'; named: mode='index' then credit_ids; filter doesn't resolve names.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
card_namestringOne card; omitted_card_names re-scopes.
benefit_typestringOmit for all; categories: credits, lounge, status, hotel_status, airline_status, rental_car_status, other_status, protection, free_nights, certificates, other.
cardholderstringMember name; omit for all. Unknowns are refused.
modestringFull or compact index.
credit_idsstring[]Exact IDs; override benefit_type; []=none.

get_wallet_card

ONE card the member holds, with their own entered layer on it -- nickname, notes, date_opened, anniversary_date, card_settings, benefit_selections, retention_offers, product_history, the sign-up-bonus fields, and updated_at.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
wallet_idstringA cc_N wallet entry id from get_wallet_cards. Wins if both selectors arrive; takes only the cc_N shape, so a product name here is refused.
card_namestringThe member's own holding by name or nickname, not the catalog. Two household members each holding one copy answers about the member's own; ONE member holding two is refused ambiguous_holding: call again with one holdings[].wallet_id as wallet_id.
cardholderstringA household member's name or id, for THAT person's copy of a card the household holds more than once. Omit it for the member's own. A name matching no member is refused, not guessed.

get_wallet_cards

The wallet's cards, one per row -- the lean per-card reader. get_wallet_summary / get_wallet_benefits are whole-wallet; use this for "what X cards do I have" or a per-card field scan.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
issuerstringNarrow to one issuer (e.g. "Chase", "Amex"). A filter matching nothing in a non-empty wallet is dropped, and the payload names it.
rewards_categorystringNarrow to one rewards category: transferable, cashback, hotel, airline, store or other; any narrows nothing. A filter matching nothing in a non-empty wallet is dropped, and the payload names it.
formatstring"summary" (default, about 15 fields per card), "with_multipliers" (summary plus a reward_multipliers array), or "full" (every field, including benefits and protections text; large for a big wallet).
include_closedbooleanWhen true, append the member's closed holdings after the active ones, each with closed_on (YYYY-MM-DD, or null). Closed cards are hidden otherwise.
cardholderstringOn a Household Profiles account, one household member's name to return only their holdings; omit for the whole household. A name matching no member is refused, not answered household-wide.

get_wallet_summary

The user's wallet: cards with fees, credits, and key benefits.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
cardholderstringOn a Household Profiles account, narrow every total to one household member's holdings; omit for the whole household. A name matching no member is refused rather than answered household-wide.

get_weekly_update

What changed in points and miles recently -- the digest as pull: a scheduled agent can poll this instead of waiting on the email digest. Local reads only (indexed article dates, a changelog artifact, in-memory dataset) -- no paid vendor, no query embedding, no Miles token spend.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
daysintegerLook-back window in days, clamped to 1-90. Default 7.
categoriesstring[]Subset of "news", "card_changes", "transfer_bonuses" and "offers" as a list, not one comma-joined string; omit for all four.

remove_card

Remove a card from the user's wallet. Requires wallet-change access.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
lookup_card_namestringThe holding to remove, by card name or nickname, e.g. Amex Gold. A name matching more than one holding is refused; pass card_id instead.
card_idstringThe holding's cc_N id from get_wallet_cards; use it instead of lookup_card_name when the wallet holds two of the same card.
lookup_cardholderstringWhose copy lookup_card_name means (a household member's name, e.g. Andy) when the household holds the card more than once. Identifies only; never changes the holder.

set_cap_status

Record that a card's bonus spending cap is used up for the current period, so get_best_card ranks the card at its after-cap rate until the cap resets (returns_on). Requires reconciliation write access.

ScopeQuota
miles:write:reconcilestandard
NameTypeRequiredDescription
card_namestringCard in the wallet, e.g. Blue Cash Preferred.
wallet_entry_idstringWallet entry id (cc_3), instead of card_name.
categorystringCapped category, e.g. groceries; omit if one cap.
cap_keystringCap key from a result's caps, instead of category.
cardholderstringHousehold member name or me, if several hold it.
hit_onstringWhen it was hit: YYYY-MM-DD or YYYY-MM.
hit_before_closebooleanAnswer to a confirm_close, as its fix says.
statement_closes_onstringDay the statement ending the period closes (YYYY-MM-DD, or 20); the bonus is back the day after.
resets_onstringFirst day the bonus earns again (YYYY-MM-DD), if known.

update_card

Update a holding in the member's wallet -- nickname, status, notes, dates, the member's decision about it, or a product change. Requires wallet-change access. Every argument's own description carries that argument's rules; this is what no single argument can say.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
lookup_card_namestringThe holding to update, by card name or nickname, e.g. Amex Gold. A name matching more than one holding is refused; pass card_id instead.
card_idstringThe holding's id from get_wallet_cards; use it instead of lookup_card_name when the wallet holds two of the same card.
lookup_cardholderstringWhose copy lookup_card_name means (a household member's name, e.g. Andy) when the household holds the card more than once. Identifies only; never changes the holder.
nicknamestringA short label of the member's own for this holding, for telling copies of the same product apart.
date_openedstringThe date the account was opened, YYYY-MM-DD.
anniversary_datestringThe date the annual fee posts, YYYY-MM-DD. Do not derive it from date_opened: for many issuers they differ, and every free-night and credit-cycle figure Miles computes reads this field.
sign_up_bonusstringThe member's own record of the sign-up bonus they were offered. Reads back as user_sign_up_bonus; a key spelled sign_up_bonus on a card you read is the catalog's current offer and must never be written back. It can accompany a product change to record a new upgrade offer.
signup_bonus_statusstringWhere the sign-up bonus stands: pending / in_progress / received / expired. Set received when the bonus posts: that is what stops the sub_deadline alerts.
signup_bonus_received_onstringThe date the sign-up bonus posted, YYYY-MM-DD, sent with signup_bonus_status="received". Several welcome-offer rules run a 15- to 48-month clock from this day. On an ordinary update, a newly received status without this date stamps today; on a product change recording a new offer, omit it when unknown and Miles clears the old offer's date instead.
bonus_accepted_onstringThe date the member accepted this bonus offer, YYYY-MM-DD. Retention/clawback windows use this member-stated date, never an account-open, product-change, or bonus-posted date. When a product change keeps or newly records a bonus and it is not already stored, ask the member for this date before recording it. A newly supplied offer needs it in the same call; never reuse a stored prior-offer date.
sub_deadlinestringThe date the sign-up bonus spend window closes, YYYY-MM-DD. Set it only from what the member told you, never from the card's marketing terms.
sub_targetnumberThe spend the sign-up bonus requires, in dollars. Never the amount the member has spent so far: Miles holds no transactions and has no field for progress.
notesstringThe member's own free-text note on this holding. Reads back as user_notes; a key spelled notes on a card you read is the catalog's note about the product and must never be written back.
statusstringThe holding's status: active, closed or pending. closed alone stamps today as closed_on; add closed_on when the member says when it actually closed.
closed_onstringThe date the card closed, YYYY-MM-DD. Pass it with status="closed", or by itself to correct the date on a card already closed.
autopay_statusstringon or off, whether the member has the issuer's autopay set up. Omit it when the member has not said: absent means nobody has checked, which Miles reports differently from off.
dispositionstringWhat the MEMBER decided to do with this holding: keep / cancel / downgrade / upgrade / undecided. Set it only when the member states a decision in their own words, never by copying analyze_keep_cancel's recommendation. Omit it when nobody has decided; take it back to that state with clear_fields.
review_bystringA date, YYYY-MM-DD, when the member wants to be reminded to revisit this holding's disposition.
fee_posts_onstringThe exact day the annual fee posts, YYYY-MM-DD: a fee that already posted (a past date) or one expected. Beats anniversary_date for an observed posting.
retention_offersobject[]The history of what the issuer offered to keep the member, as a list of {date, offer, took_it}. REPLACES the stored list, so send the whole history every time; sending one entry deletes the rest.
card_settingsobjectThe member's per-card selections, keyed by the setting id from the card's card_settings_available. MERGES with what is stored, so send only what changed; null as a value clears one setting. A key the card does not define is refused.
benefit_selectionsobjectWhich vendor the member picked for a credit that locks to one, keyed by the credit's id from the card's benefits (airline_fees, splurge). Each value is a list of {choices, period, selected_on, source}, one per benefit window. choices is a list even for a credit that takes one pick; period is the window the pick governs -- 2026 on a calendar-year credit, 2026-05 on a cardmember-year one -- and is optional, derived from selected_on, needed explicitly only when it differs from the window selected_on falls in. Replaces the stored map: send the whole history.
original_card_namestringThe product the card was first opened as. Correctable here to fix history; a change happening now goes through product_change instead.
product_historyobject[]The full list of past product changes, oldest first, each {from_card, to_card, changed_date, direction, note}. REPLACES the stored list, which is how a wrong or missing changed_date on a recorded change is corrected. To record a new change, use product_change=true instead.
cardholderstringThe household member this card belongs to, by name as it appears in Household Profiles; "" unassigns. A supporter feature: an ungated member's update still applies, minus the attribution, and says so in a note.
holder_typestringWhether the cardholder is the primary account holder (the default) or an authorized_user on the card.
card_number_last4stringThe last four digits of the account number, exactly four; set, correct or clear it here. Anything longer is refused rather than stored.
product_changebooleantrue records a product change happening now: the holding is renamed to new_card_name and a row is appended to product_history. Cannot be combined with clear_fields; make that two calls.
new_card_namestringThe product the card was changed to. Required with product_change=true.
changed_datestringThe date the product change happened, YYYY-MM-DD, with product_change=true. Omit it when unknown; Miles records unknown rather than stamping today. This is not the bonus acceptance date.
directionstringupgrade or downgrade, with product_change=true. Inferred from the card family when omitted.
product_change_notestringWhy the product change was made, recorded with product_change=true.
new_anniversary_datestringThe new annual-fee date, YYYY-MM-DD, when the issuer reset it as part of a product change.
keep_bonusbooleanWhether a product_change=true keeps the recorded or newly supplied sign-up bonus. Defaults to true on an upgrade -- an upgrade offer's bonus belongs to the new product -- or when this call supplies a new bonus; it is false otherwise. A kept bonus needs member-stated bonus_accepted_on.
expected_updated_atstringThe card's stored updated_at as you last read it, copied back character for character, microseconds included. If the card has changed since, nothing is written and the result is stale_precondition: re-read and retry. Omit it and the last writer wins.
clear_fieldsstring[]Names of fields to reset to empty, e.g. ["nickname", "notes"], since a null argument is dropped and changes nothing. A field that cannot be cleared, or one named here while also given a value, is refused and nothing is written. Cannot ride along with product_change=true.

Balances

get_balances

The loyalty-point balances the user has told Miles about -- Ultimate Rewards, Membership Rewards, airline and hotel currencies. To RECORD one, see set_balances.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
programsstring[]Loyalty program names to limit the read to, e.g. ["Chase Ultimate Rewards", "Marriott Bonvoy"]. Omit for every balance on file.

get_reconciliation_needs

QUESTIONS, not assertions, about the wallet that transaction data could answer -- the division of labor with a transactions agent (Copilot Money's MCP or similar): Miles knows what a transaction would MEAN; the agent knows where transactions ARE. Miles never sees spending, so it cannot confirm anything here itself.

ScopeQuota
miles:readstandard

No parameters.

set_balances

Record loyalty-point balances you have READ or reconciled -- from a statement, an account page, or something the user told you. Requires reconciliation write access (the narrower of the two write grants). undo_balance_write reverses any call to this one.

ScopeQuota
miles:write:reconcilestandard
NameTypeRequiredDescription
entriesobject[]requiredA list of rows, one per loyalty program, even for a single row. Each row is {program, points, as_of?, expires_on?, cardholder?, confirm?}. program is the program's full name as Miles spells it; points a whole number; as_of an ISO date the reading was accurate, defaulting to now; expires_on an ISO date the points expire, only ever one you READ, never one you worked out; cardholder a household member's name or id, omitted for the account holder's own balance; confirm: true re-affirms a row a previous call flagged for review. Any source field is discarded; every row is stamped agent_reconciled. Replaying the same batch overwrites in place.

undo_balance_write

Put back what the balances looked like before one set_balances call. Requires reconciliation write access, the same grant set_balances needs.

ScopeQuota
miles:write:reconcilestandard
NameTypeRequiredDescription
history_idintegerThe history_id a set_balances call returned. Omit it to reverse the most recent balance write this app made that has not already been undone.

Credits and certificates

clear_credit_usage

Remove credit usage an agent recorded -- the retraction half of set_credit_usage. Requires reconciliation write access, like it.

ScopeQuota
miles:write:reconcilestandard
NameTypeRequiredDescription
entriesobject[]requiredA list of rows to remove, one per credit and period, even for a single row. Each row is {credit_id, period, card_id?, card_name?}; period is required, in the label the credit's own frequency produces (2026-08 monthly, 2026-Q3 quarterly).

get_certificates

Companion certificates and lounge-pass bundles across the wallet -- what's pending, available, used, or expired, plus an estimated total value. The quantity-aware sibling of get_free_nights (a lounge-pass bundle grants more than one use; a companion fare does not).

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
statusstringFilter to one status: pending, available, used, expired, may_have_expired, unconfirmed, or dismissed. Omit for every certificate on file; to answer whether one has been used, omit it and read each row's own status.
programstringFilter by loyalty program name, matched as a substring, e.g. Hilton. Omit for every program.

get_credit_usage

Which of the wallet's recurring card credits are still unused this period -- the read half of the reconciliation loop get_reconciliation_needs opens.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
card_namestringLimit the result to one wallet card, matched fuzzily by name. Omit for every card's credits.
only_unusedbooleanWhen true, drops rows whose status is used or unknown -- both already-resolved questions -- leaving only the credits still open this period.
include_recordbooleanWhen true, adds value_record: each card's last 12 months of recorded credit use, with every closed period's source and, for an agent's write, the client_id of the app that wrote it. Without Membership it is value_record_locked: true instead. Off, the payload is unchanged.
categorystringLimit to credits of this kind, e.g. 'dining'. 'travel' includes airline, hotel, car-rental and Global Entry/TSA credits. 'any' or omit for every credit.

get_free_nights

Free-night hotel certificates across the wallet (Marriott/Hilton/ Hyatt/IHG-style annual and spend-triggered certs): status (available/pending/used/expired/may_have_expired/unconfirmed/unknown), estimated expiry, and estimated value.

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
statusstringFilter to one status: available, pending, used, expired, may_have_expired, unconfirmed, or unknown. Omit for every certificate on file; to answer whether one has been used, omit it and read each row's own status.
programstringFilter by hotel loyalty program name, e.g. Marriott Bonvoy. Omit for every program.

set_certificate_status

Record a companion certificate or lounge-pass bundle's status. Requires reconciliation write access (the narrower of the two write grants -- see get_reconciliation_needs's own docstring).

ScopeQuota
miles:write:reconcilestandard
NameTypeRequiredDescription
card_idstringrequiredThe exact card_id from the certificate's get_certificates row, e.g. cc_4. There is no fuzzy card-name lookup here.
cert_idstringrequiredThe exact cert_id from the certificate's get_certificates row, e.g. companion-fare.
statusstringThe new status: pending, available, used, or dismissed. Required UNLESS you are sending note, earned_on or expires_on; omit it then and the saved status is left exactly as it was.
countintegerFor status=used only: how many units of a bundle to mark used on this call; omit for 1. Silently clamped to what is actually left, so read the returned used_count rather than assuming the value landed exactly.
expected_used_countintegerFor status=used only: the used_count you last read from get_certificates. If it no longer matches what is stored, the write is rejected, so a retried or double-sent call is a safe no-op. Pass it on every used call; omit only with no prior read.
used_onstringFor status=used only: the date of use, written YYYY-MM-DD, no later than today and no earlier than the certificate's own earned_on if one is on file.
notestringThe member's own note about this certificate -- what it is for, or where it is already booked ("Maui, March -- booked"). Their words, not a summary; 500 characters max; "" clears it; omit it to leave it alone. A note is never a status.
earned_onstringThe date (YYYY-MM-DD) or month (YYYY-MM) the certificate was earned. Makes the expiry exact. "" clears it.
expires_onstringThe date the certificate really expires, written YYYY-MM-DD, as the member read it off the issuer. May be in the past. "" clears the override and falls back to the estimate.
sourcestringWho is attesting the status: agent_reconciled (you found an actual transaction showing the certificate was earned or used) or user_reported (the member told you directly). Defaults to user_reported when omitted.

set_credit_usage

Record which recurring card credits were used, for a batch of periods -- the write half of the reconciliation loop get_reconciliation_needs opens. Requires reconciliation write access (the narrower of the two write grants -- see get_reconciliation_needs's own docstring).

ScopeQuota
miles:write:reconcilestandard
NameTypeRequiredDescription
entriesobject[]requiredA list of rows, one per credit and period, even for a single row. Each row is {credit_id, status, card_id?, card_name?, period?, amount_used?}; status is used, partial (needs amount_used, in dollars), unused, or unknown. period is the label the credit's own frequency produces: 2026-08 for a monthly or cardmember-year credit, 2026 for calendar-year, 2026-Q3 quarterly, 2026-H1 semi-annual. Any source field is discarded; every row is stamped agent_reconciled. Replaying the same batch overwrites in place.
only_if_absentbooleanWhen true, a period that already has an answer is left alone and comes back skipped with reason: "already_recorded" and the existing entry.
overwritebooleanWhen true, a row replaces an answer the member recorded themselves. Send it only when the member told you, in this conversation, to replace their answer; otherwise such a row comes back skipped with reason: "member_recorded".

set_free_night_status

Record a free-night certificate as used, or confirm a pending spend-threshold certificate was earned. Requires reconciliation write access (the narrower of the two write grants -- see get_reconciliation_needs's own docstring).

ScopeQuota
miles:write:reconcilestandard
NameTypeRequiredDescription
statusstringThe new status: pending, available (a pending spend-threshold certificate was confirmed earned), used, dismissed, or unknown (you searched for matching spend and could not determine whether it was earned). Required UNLESS you are sending note, earned_on or expires_on; omit it then and the saved status is left exactly as it was.
card_namestringIdentify the card by name, matched fuzzily -- the everyday form. Required unless card_id is given; cannot be combined with source.
cert_idstringThe certificate's id from its get_free_nights row, e.g. anniversary or spend_30k. Required when the card carries more than one free-night certificate, and always required alongside card_id; never guess between certificates.
used_onstringThe date the certificate was used, written YYYY-MM-DD, no later than today.
card_idstringIdentify the card exactly by the card_id a get_free_nights or get_reconciliation_needs row carries, e.g. cc_5. Requires cert_id; the only form that accepts source.
notestringThe member's own note about this certificate -- what it is for, or where it is already booked ("Maui, March -- booked"). Their words, not a summary; 500 characters max; "" clears it; omit it to leave it alone. A note is never a status.
earned_onstringThe date (YYYY-MM-DD) the certificate was earned. Makes the expiry exact. "" clears it.
expires_onstringThe date the certificate really expires, written YYYY-MM-DD, as the member read it off the issuer. May be in the past. "" clears the override and falls back to the estimate.
sourcestringWho is attesting the status: agent_reconciled (you found an actual transaction showing the certificate was earned or used) or user_reported (the member told you directly). Requires card_id, not card_name. Omit for a member's own plain statement.

set_status_entitlement

Record a status-earned certificate or award -- what a member's elite tier grants (milestone nights, upgrade certificates, suite night awards, choice benefits). Requires reconciliation write access.

ScopeQuota
miles:write:reconcilestandard
NameTypeRequiredDescription
program_idstringrequiredFrom a get_certificates offer or row.
item_idstringrequiredThe offer's item_id. For used, a confirmed row's cert_id also works with no option_id.
statusstringrequiredconfirmed or used. There is no decline.
option_idstringThe pick from a choice menu (the offer's option_id). Required for a choice, refused otherwise.
program_yearintegere.g. 2026. Only when the offer says program_year_required.
periodstringRequired for used: the row's period, e.g. 2026.
countintegerFor used: units used; omit for 1. Clamped.
expected_used_countintegerFor used: the used_count you last read; a mismatch rejects the write, so a retry is safe.
used_onstringFor used: YYYY-MM-DD; defaults to today.

undo_status_entitlement

Take back the last status-entitlement write -- the retraction half of set_status_entitlement. Requires reconciliation write access.

ScopeQuota
miles:write:reconcilestandard
NameTypeRequiredDescription
program_idstringrequiredAs on the write.
item_idstringrequiredThe row's cert_id, or the offer's item_id with option_id.
periodstringrequiredThe row's period, e.g. 2026.
option_idstringThe choice option, with an offer's item_id.

Gift cards

add_gift_card

Save a gift card to the member's wallet. Requires wallet-change access.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
merchantstringrequiredThe merchant the gift card is for, stored exactly as given -- there is no catalog to resolve it against, so spell it the way the member did.
amountnumberThe remaining balance in dollars, as a number (e.g. 73.40). 0 is a valid, meaningful balance for a drained card the member still holds; pass it rather than omitting the field.
expirationstringThe expiration date, written YYYY-MM-DD only. Any other spelling is refused rather than stored; leave it out if the member only knows an approximate date.
card_number_last4stringThe last four digits of the gift card number, exactly four digits. Write-only on this surface: never returned by this tool's echo or by get_gift_cards. Never a full card number or a PIN.
notesstringFree text about the card. Write-only on this surface: never returned by this tool's echo or by get_gift_cards, so do not store anything here you will need to read back. Never a full card number or a PIN.

get_gift_cards

The wallet's stored gift cards: merchant, balance, and expiration only.

ScopeQuota
miles:readstandard

No parameters.

remove_gift_card

Delete a gift card from the wallet -- a spent card, or one saved by mistake. Requires wallet-change access.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
lookup_merchantstringIdentify the card by its stored merchant name, e.g. REI, when that merchant appears exactly once. An ambiguous name is refused rather than guessed at; retry with card_id.
card_idstringIdentify the card exactly by the id get_gift_cards or an earlier add_gift_card echo returned, e.g. gc_1.

update_gift_card

Change a gift card already in the wallet -- most often its balance after the member spends some of it. Requires wallet-change access.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
lookup_merchantstringIdentify the card by its stored merchant name, e.g. REI. A name matching more than one stored card is refused with the candidates named; retry with card_id.
card_idstringIdentify the card exactly by the id get_gift_cards or an earlier add_gift_card echo returned, e.g. gc_1.
merchantstringNew merchant name; renames the card. Omit to leave unchanged.
amountnumberNew remaining balance in dollars, as a number. 0 records a fully drained card. Omit to leave unchanged.
expirationstringNew expiration date, written YYYY-MM-DD only; any other spelling is refused rather than stored. Omit to leave unchanged.
card_number_last4stringNew last four digits of the gift card number, exactly four digits. Write-only: never returned by this tool's echo or by get_gift_cards. Omit to leave unchanged; an empty string is also treated as no change.
notesstringNew free text about the card. Write-only: never returned by this tool's echo or by get_gift_cards. Omit to leave unchanged; an empty string is treated as no change, not as clearing the field.

Elite status

compare_atmos_earning

Compare Alaska Atmos Rewards distance, price and segment earning for one traveler's flights under the rules effective 2027-01-01 (2025/2026 input is a replay, not posted history).

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
travel_yearintegerrequired2025, 2026 or 2027: the departure year compared.
flightsobject[]requiredOne object per traveler per flight number. Fields (* required): id*; departure_date*; marketing_carrier; operating_carrier; ticket_stock; booking_channel (alaska_hawaiian
defaultsobject{elite_status, elite_status_held_all_year}: the tier for rows without one; held_all_year for a status match.
other_status_pointsnumberNon-flight status points.
other_redeemable_pointsnumberNon-flight redeemable points.
detail_offsetintegerPaging.
detail_limitintegerRows returned; default all (500).

get_elite_status

The user's elite status, self-reported and card-granted. elite_status is what the member TOLD Miles. card_granted is what their cards give: held (now) and available (gated behind enrollment/registration/spend -- never report as held).

ScopeQuota
miles:readstandard

No parameters.

get_status_benefits

What an airline/hotel elite TIER grants -- checked bags, lounge access, upgrades, breakfast, late checkout, points bonus, and an estimated annual value. Reference data about the program; it reads nothing about the member (get_elite_status is what they hold).

ScopeQuota
miles:readstandard
NameTypeRequiredDescription
programstringrequiredThe airline or hotel loyalty program to describe, e.g. Alaska Atmos Rewards or World of Hyatt. Reference data about the program, not the member's own status.
tierstringOne elite tier within the program, e.g. Atmos Gold. Omit for the program's full tier ladder.

remove_elite_status

Forget a stored elite status -- the member lost it, never had it, or it was recorded against the wrong program. Requires wallet-change access. Removes every stored spelling of the program.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
programstringrequiredThe loyalty program whose stored elite status to forget, e.g. World of Hyatt. Every stored spelling of the program is removed. To change a tier instead, call set_elite_status.
memberstringHousehold member whose status it is; omit for the member's own.

set_elite_status

Record elite status the member says they hold, and how far along they are toward the next hotel tier. Requires wallet-change access.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
programstringrequiredThe loyalty program the status is held in, e.g. World of Hyatt -- a program Miles knows; get_elite_status lists them as known_programs. One call per program; calling again for the same program replaces that program's stored tier.
tierstringThe tier exactly as the member stated it, e.g. Globalist. Omit only when updating a night count for a program that already has a stored tier, or when storing nights_per_year. Never inferred.
nights_ytdintegerQualifying hotel nights this year, a whole number exactly as the member states it. The program's own count already includes card-granted elite night credits, so pass it through unchanged. Hotels only.
nights_ytd_as_ofstringThe calendar date the nights_ytd count is current as of, written YYYY-MM-DD. Omit for today.
nights_bookedintegerNights booked but not yet stayed, a whole number kept as a separate forecast alongside nights_ytd.
memberstringHousehold member who holds it, by name; omit for the member's own. An unknown name is refused: ask who.
nights_per_yearintegerRoughly how many nights a year they stay with this program, NOT counting card elite night credits.

Watchlist

add_to_watchlist

Add a card to the member's watchlist -- considering it, not yet applied for, or holding it and still tracking it (its offer, a second copy, another household member's application). Requires wallet-change access.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
card_namestringrequiredThe card to watch. Must resolve to a real card in Miles' catalog; an unmatched name is refused rather than stored.
cardholderstringWhich household member is considering the card, by name (an id works too). Pass it whenever the member names a person: on an account with household members, an unassigned entry has no single eligibility answer. Editable later via update_watchlist_entry.
notesstringThe member's own free text on why the card is being watched, written as they said it. Not the place for the member's own decision deadline (use update_watchlist_entry's decide_by). Ignored when the card is already on the watchlist; change an existing note with update_watchlist_entry.

get_watchlist

Cards the member is considering -- not yet in their wallet.

ScopeQuota
miles:readstandard

No parameters.

remove_from_watchlist

Remove a card from the member's watchlist. Requires wallet-change access. Use lookup_card_name to identify the entry by name; if multiple entries match, use entry_id on retry.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
lookup_card_namestringIdentify the entry by card name, e.g. Venture X. If more than one entry matches, retry with entry_id.
entry_idstringIdentify the entry exactly by the w_N id get_watchlist keys its entries by, e.g. w_2. Use on retry when lookup_card_name is ambiguous.

update_watchlist_entry

Edit a watched card's cardholder, its notes, the date the member means to decide by, or any combination. Requires wallet-change access.

ScopeQuota
miles:writestandard
NameTypeRequiredDescription
cardholderstringNew household member for the entry, by name (an id works too); the empty string unassigns it. Omit to leave unchanged.
notesstringNew note text. Replaces the stored note rather than appending to it, so send the whole new text; the empty string clears it. Omit to leave unchanged.
decide_bystringThe member's own deadline for deciding whether to apply, written YYYY-MM-DD -- never the offer's expiry or an eligibility date. The empty string clears it; omitting it (or sending null) leaves it unchanged.
lookup_card_namestringIdentify the entry by card name, e.g. Venture X. If more than one entry matches, retry with entry_id.
entry_idstringIdentify the entry exactly by the w_N id get_watchlist keys its entries by, e.g. w_2. Use on retry when lookup_card_name is ambiguous.

Knowledge

Retrieval over indexed points-and-miles articles, guides and reviews -- reach for this when a question needs explanation or strategy that Miles' structured tools don't cover: how a transfer bonus mechanic actually works, what changed about a lounge network, how to think through a redemption trade-off. If the answer is a fact about the member's own wallet or the card dataset -- current benefits, transfer ratios, eligibility -- use the structured tool for it instead (get_card_info, get_transfer_partners, get_wallet_summary); those cost nothing beyond the shared per-day ceiling and are exact, and this tool is not a substitute for them.

ScopeQuota
miles:readexpensive
NameTypeRequiredDescription
querystringrequiredA short topical phrase naming the subject and any specific program, card, or place involved, e.g. Chase trifecta card combination or Hyatt points expiration policy. Not the member's question restated verbatim, and not a bare keyword list: search runs a semantic match and exact-term matching, so naming the specific entity matters most.