Tool tree
gradeNot graded
page: Every page
search_gearAnswer
Search the Fieldward gear library by free-text query. Matches gear name, description, and tags (e.g. 'waterproof boots', 'ultralight tent'). Returns gear with id, name, price, category, tags, and availability. Ground the query in the trip brief (get_trip_brief): a winter-backpacking trip means terms like 'winter-rated' and 'waterproof' belong in the query, and prefer picks under the stated budget.
View tool JSON
{
"name": "search_gear",
"kind": "answer",
"impl": "imperative",
"description": "Search the Fieldward gear library by free-text query. Matches gear name, description, and tags (e.g. 'waterproof boots', 'ultralight tent'). Returns gear with id, name, price, category, tags, and availability. Ground the query in the trip brief (get_trip_brief): a winter-backpacking trip means terms like 'winter-rated' and 'waterproof' belong in the query, and prefer picks under the stated budget.",
"inputSchema": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search text, e.g. 'waterproof hiking boots'"
},
"limit": {
"type": "number",
"description": "Max results to return (default 10, max 50)"
}
},
"required": [
"query"
]
},
"page": "/"
}filter_gearAction
Filter the Fieldward gear library by category, price range, and/or tags. Categories: 'Backpacks', 'Footwear', 'Shelter', 'Cook Gear'. Prices are in DOLLARS (e.g. minPrice 100, maxPrice 250). A gear item matches when it has ANY of the given tags. When the trip brief (get_trip_brief) has a budget, use it as maxPrice. Combine with search_gear when free text works better.
View tool JSON
{
"name": "filter_gear",
"kind": "act",
"impl": "imperative",
"description": "Filter the Fieldward gear library by category, price range, and/or tags. Categories: 'Backpacks', 'Footwear', 'Shelter', 'Cook Gear'. Prices are in DOLLARS (e.g. minPrice 100, maxPrice 250). A gear item matches when it has ANY of the given tags. When the trip brief (get_trip_brief) has a budget, use it as maxPrice. Combine with search_gear when free text works better.",
"inputSchema": {
"type": "object",
"properties": {
"category": {
"type": "string",
"enum": [
"Backpacks",
"Footwear",
"Shelter",
"Cook Gear"
],
"description": "Restrict results to one category"
},
"minPrice": {
"type": "number",
"description": "Minimum price in dollars (inclusive)"
},
"maxPrice": {
"type": "number",
"description": "Maximum price in dollars (inclusive)"
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags to match, e.g. ['waterproof', 'winter-rated']. Any match qualifies."
}
}
},
"page": "/"
}get_gear_detailsAnswer
Get full details for a single gear item by id: name, description, price, category, tags, image URL, and availability. Use ids returned by search_gear or filter_gear.
View tool JSON
{
"name": "get_gear_details",
"kind": "answer",
"impl": "imperative",
"description": "Get full details for a single gear item by id: name, description, price, category, tags, image URL, and availability. Use ids returned by search_gear or filter_gear.",
"inputSchema": {
"type": "object",
"properties": {
"gearItemId": {
"type": "string",
"description": "The gear item id, e.g. the id from search results"
}
},
"required": [
"gearItemId"
]
},
"page": "/"
}compare_gearAction
Compare 2 to 4 Fieldward gear items side by side. Pass gear item ids in the order you want them compared; every field (price, tags, availability, description) comes back for each item.
View tool JSON
{
"name": "compare_gear",
"kind": "act",
"impl": "imperative",
"description": "Compare 2 to 4 Fieldward gear items side by side. Pass gear item ids in the order you want them compared; every field (price, tags, availability, description) comes back for each item.",
"inputSchema": {
"type": "object",
"properties": {
"gearItemIds": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 2,
"maxItems": 4,
"description": "Two to four gear item ids to compare"
}
},
"required": [
"gearItemIds"
]
},
"page": "/"
}place_on_boardAction
Place a gear item from the library onto the shared trip-planning board — the same board the human is looking at. Your placement appears there live, attributed to you. Coordinates are optional board pixels (x: 0–2400, y: 0–1600, origin top-left); omit them and the server picks the next open slot, so you never need layout math. Pass a short first-person `note` so the human sees your reasoning beside the card. Group related gear near the human's day blocks with move_board_item after placing. Note: locking the plan is deliberately not available to agents; only the human can do that.
View tool JSON
{
"name": "place_on_board",
"kind": "act",
"impl": "imperative",
"description": "Place a gear item from the library onto the shared trip-planning board — the same board the human is looking at. Your placement appears there live, attributed to you. Coordinates are optional board pixels (x: 0–2400, y: 0–1600, origin top-left); omit them and the server picks the next open slot, so you never need layout math. Pass a short first-person `note` so the human sees your reasoning beside the card. Group related gear near the human's day blocks with move_board_item after placing. Note: locking the plan is deliberately not available to agents; only the human can do that.",
"inputSchema": {
"type": "object",
"properties": {
"gearItemId": {
"type": "string",
"description": "The gear item id to place (from search_gear / filter_gear)"
},
"x": {
"type": "number",
"description": "Optional board x position in pixels (0–2400); omit for the next open slot"
},
"y": {
"type": "number",
"description": "Optional board y position in pixels (0–1600); omit for the next open slot"
},
"note": {
"type": "string",
"description": "A short first-person reason for this pick, shown to the user beside the card, e.g. 'I picked this over the cheaper option — better rain rating for your trip.'"
}
},
"required": [
"gearItemId"
]
},
"page": "/"
}mark_item_ownedAction
Mark a piece of gear that the user already owns (e.g. from a photo of their gear closet or mentioned in chat). Fuzzy-matches against existing catalog gear or registers personal gear. Places it into the 'Already have' lane on the board. Fully satisfies readiness check requirements without consuming the trip's gear acquisition budget.
View tool JSON
{
"name": "mark_item_owned",
"kind": "act",
"impl": "imperative",
"description": "Mark a piece of gear that the user already owns (e.g. from a photo of their gear closet or mentioned in chat). Fuzzy-matches against existing catalog gear or registers personal gear. Places it into the 'Already have' lane on the board. Fully satisfies readiness check requirements without consuming the trip's gear acquisition budget.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name of the owned gear item, e.g. 'Hollowpine 2P Tent' or 'Grandpa's Wool Blanket'"
},
"category": {
"type": "string",
"description": "Optional category, e.g. 'Shelter', 'Backpacks', 'Footwear', 'Cook Gear', or 'Other'"
},
"note": {
"type": "string",
"description": "Optional note or reasoning for this owned item"
}
},
"required": [
"name"
]
},
"page": "/"
}move_board_itemAction
Move a card that's already on the board — yours or the human's — to a new position. Coordinates are board pixels (x: 0–2400, y: 0–1600, origin top-left, clamped to the board). Use it to arrange the plan: group cook gear under the Day 2 block, line up shelter options together, tidy after the human drags things around. The card animates to its new spot on the human's screen, exactly like their own drags.
View tool JSON
{
"name": "move_board_item",
"kind": "act",
"impl": "imperative",
"description": "Move a card that's already on the board — yours or the human's — to a new position. Coordinates are board pixels (x: 0–2400, y: 0–1600, origin top-left, clamped to the board). Use it to arrange the plan: group cook gear under the Day 2 block, line up shelter options together, tidy after the human drags things around. The card animates to its new spot on the human's screen, exactly like their own drags.",
"inputSchema": {
"type": "object",
"properties": {
"boardItemId": {
"type": "string",
"description": "The board item id to move (from get_board_state)"
},
"x": {
"type": "number",
"description": "New board x position in pixels (0–2400)"
},
"y": {
"type": "number",
"description": "New board y position in pixels (0–1600)"
}
},
"required": [
"boardItemId",
"x",
"y"
]
},
"page": "/"
}remove_from_boardAction
Remove one card from the board by board item id — the `id` field from get_board_state (not the gear item id). Works on your cards and the human's. The activity log records the removal either way, so the human always sees what changed.
View tool JSON
{
"name": "remove_from_board",
"kind": "act",
"impl": "imperative",
"description": "Remove one card from the board by board item id — the `id` field from get_board_state (not the gear item id). Works on your cards and the human's. The activity log records the removal either way, so the human always sees what changed.",
"inputSchema": {
"type": "object",
"properties": {
"boardItemId": {
"type": "string",
"description": "The board item id to remove (from get_board_state)"
}
},
"required": [
"boardItemId"
]
},
"page": "/"
}get_board_stateAnswer
Read the current board: every card with its position, type (gear or day block), name, quantity, who placed it, and any agent note — plus the gear total, whether the plan is locked, any pending day-order suggestion, and any pending day-block proposals awaiting human review (in FIFO order, up to 5 max). Call this before placing or moving cards so you don't duplicate items, to see where day blocks sit, and to check pendingDayBlocks before proposing more day blocks.
View tool JSON
{
"name": "get_board_state",
"kind": "answer",
"impl": "imperative",
"description": "Read the current board: every card with its position, type (gear or day block), name, quantity, who placed it, and any agent note — plus the gear total, whether the plan is locked, any pending day-order suggestion, and any pending day-block proposals awaiting human review (in FIFO order, up to 5 max). Call this before placing or moving cards so you don't duplicate items, to see where day blocks sit, and to check pendingDayBlocks before proposing more day blocks.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/"
}get_trip_briefAnswer
Read the trip brief — what kind of trip the human is planning, their budget (or null when nothing is set), and the trip's place and dates when the human has filled them in. CALL THIS FIRST, before searching or recommending: the trip description suggests which categories and tags matter, the budget should cap maxPrice in filter_gear, the place and dates ground get_weather_outlook, and check_trip_readiness compares the board against all of it. Also returns any pending proposal you've made that the human hasn't resolved yet.
View tool JSON
{
"name": "get_trip_brief",
"kind": "answer",
"impl": "imperative",
"description": "Read the trip brief — what kind of trip the human is planning, their budget (or null when nothing is set), and the trip's place and dates when the human has filled them in. CALL THIS FIRST, before searching or recommending: the trip description suggests which categories and tags matter, the budget should cap maxPrice in filter_gear, the place and dates ground get_weather_outlook, and check_trip_readiness compares the board against all of it. Also returns any pending proposal you've made that the human hasn't resolved yet.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/"
}get_weather_outlookAnswer
Get the weather outlook for this trip, grounded in real data — not a guess from the trip description. Reads the trip's place and dates straight off the trip brief (the human sets them; get_trip_brief shows what's set) and returns exactly one of three clearly-labeled states: dataSource 'forecast' (a real Open-Meteo daily forecast — only reliable when the trip is within about 16 days), 'historical-average' (the same calendar window averaged over the last few years — the honest answer for trips further out), or 'unavailable' with a reason (place or dates not set yet, place not found, service unreachable). CALL THIS EARLY in a planning session, before searching gear: rain or freezing nights change what belongs on the board, and check_trip_readiness folds this outlook into its gear gaps.
View tool JSON
{
"name": "get_weather_outlook",
"kind": "answer",
"impl": "imperative",
"description": "Get the weather outlook for this trip, grounded in real data — not a guess from the trip description. Reads the trip's place and dates straight off the trip brief (the human sets them; get_trip_brief shows what's set) and returns exactly one of three clearly-labeled states: dataSource 'forecast' (a real Open-Meteo daily forecast — only reliable when the trip is within about 16 days), 'historical-average' (the same calendar window averaged over the last few years — the honest answer for trips further out), or 'unavailable' with a reason (place or dates not set yet, place not found, service unreachable). CALL THIS EARLY in a planning session, before searching gear: rain or freezing nights change what belongs on the board, and check_trip_readiness folds this outlook into its gear gaps.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/"
}compare_trip_datesAction
Compare 2–3 candidate date ranges for the trip side-by-side without modifying the stored trip brief. Concurrently evaluates live Open-Meteo forecasts (near-term) or historical averages (future) along with readiness gaps for each window independently. Returns a side-by-side preview with honest dataSource labels per range.
View tool JSON
{
"name": "compare_trip_dates",
"kind": "act",
"impl": "imperative",
"description": "Compare 2–3 candidate date ranges for the trip side-by-side without modifying the stored trip brief. Concurrently evaluates live Open-Meteo forecasts (near-term) or historical averages (future) along with readiness gaps for each window independently. Returns a side-by-side preview with honest dataSource labels per range.",
"inputSchema": {
"type": "object",
"properties": {
"dateRanges": {
"type": "array",
"description": "2 or 3 candidate date ranges to compare",
"items": {
"type": "object",
"properties": {
"startDate": {
"type": "string",
"description": "First trip day in YYYY-MM-DD format"
},
"endDate": {
"type": "string",
"description": "Last trip day in YYYY-MM-DD format"
},
"label": {
"type": "string",
"description": "Optional friendly label, e.g. 'Option A: Early September'"
}
},
"required": [
"startDate",
"endDate"
]
}
}
},
"required": [
"dateRanges"
]
},
"page": "/"
}propose_trip_brief_updateAction
Suggest an update to the trip brief — e.g. you learned the trip is three days instead of one, winter gear matters, or the budget changed. This lands as a PENDING suggestion the human must accept or dismiss; it never overwrites what they wrote. Send only the fields that changed. budget is in DOLLARS (pass 0 to propose clearing it); tripDescription is a short phrase (pass an empty string to propose clearing it).
View tool JSON
{
"name": "propose_trip_brief_update",
"kind": "act",
"impl": "imperative",
"description": "Suggest an update to the trip brief — e.g. you learned the trip is three days instead of one, winter gear matters, or the budget changed. This lands as a PENDING suggestion the human must accept or dismiss; it never overwrites what they wrote. Send only the fields that changed. budget is in DOLLARS (pass 0 to propose clearing it); tripDescription is a short phrase (pass an empty string to propose clearing it).",
"inputSchema": {
"type": "object",
"properties": {
"tripDescription": {
"type": "string",
"description": "Proposed trip description, e.g. '3-day winter backpacking trip in the Cascades'"
},
"budget": {
"type": "number",
"description": "Proposed budget in dollars, e.g. 400 (0 proposes clearing it)"
}
}
},
"page": "/"
}propose_day_blockAction
Propose adding a new day block to the itinerary with a trail title and optional distance/elevation details and reasoning (e.g. 'Day 1 — Trailhead to Cairn Lake', '6.2 mi · 1,900 ft gain · Alpine meadow camp'). Multiple day-block proposals queue up in FIFO order (up to 5 max) awaiting human review one by one in the board UI (Accept with details, Add as blank day, or Dismiss); it never places cards directly.
View tool JSON
{
"name": "propose_day_block",
"kind": "act",
"impl": "imperative",
"description": "Propose adding a new day block to the itinerary with a trail title and optional distance/elevation details and reasoning (e.g. 'Day 1 — Trailhead to Cairn Lake', '6.2 mi · 1,900 ft gain · Alpine meadow camp'). Multiple day-block proposals queue up in FIFO order (up to 5 max) awaiting human review one by one in the board UI (Accept with details, Add as blank day, or Dismiss); it never places cards directly.",
"inputSchema": {
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "Title of the day block, e.g. 'Day 1 — Trailhead to Cairn Lake'"
},
"text": {
"type": "string",
"description": "Optional trail segment summary, distance, or elevation notes, e.g. '6.2 mi · 1,900 ft gain · Alpine meadow camp'"
},
"note": {
"type": "string",
"description": "Optional reasoning for this itinerary day, e.g. 'Breaks up the pass ascent before tomorrow morning.'"
}
},
"required": [
"label"
]
},
"page": "/"
}suggest_day_orderSensitive Action
Suggest a new order for the human's day blocks — e.g. you realize a pass is safer before the storm window, or the lake camp makes a better first night. Pass the FULL ordered list of day-block board item ids (get_board_state lists them; their current order reads top-to-bottom, then left-to-right — that's the itinerary the export uses). This lands as a PENDING suggestion the human accepts or dismisses in the board UI; it never reorders anything itself. It works only on day blocks the human already created — you still cannot create, delete, or edit day blocks.
View tool JSON
{
"name": "suggest_day_order",
"kind": "transact",
"impl": "imperative",
"description": "Suggest a new order for the human's day blocks — e.g. you realize a pass is safer before the storm window, or the lake camp makes a better first night. Pass the FULL ordered list of day-block board item ids (get_board_state lists them; their current order reads top-to-bottom, then left-to-right — that's the itinerary the export uses). This lands as a PENDING suggestion the human accepts or dismisses in the board UI; it never reorders anything itself. It works only on day blocks the human already created — you still cannot create, delete, or edit day blocks.",
"inputSchema": {
"type": "object",
"properties": {
"orderedBoardItemIds": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 2,
"maxItems": 20,
"description": "Every day-block board item id, in the order you propose the days should run"
},
"note": {
"type": "string",
"description": "Optional first-person reasoning shown with the suggestion, e.g. 'The pass is calmer before noon — I'd put Day 2 first.'"
}
},
"required": [
"orderedBoardItemIds"
]
},
"page": "/"
}check_trip_readinessAnswer
Check the current board against the trip in the brief — trip type AND real weather — and report what's missing, all in one result: e.g. 'no winter-rated sleep system on the board', 'rain likely on day 2 — no board item tagged waterproof yet'. Folds in the get_weather_outlook state (real forecast or seasonal average, when the trip's place and dates are set) so weather-driven gaps sit next to the trip-type gaps instead of in a second system you have to reconcile. Read-only analysis: it never adds anything; use the gaps to frame suggestions, then let the human decide. Great before summarizing the plan or when the human asks 'what else do we need?'.
View tool JSON
{
"name": "check_trip_readiness",
"kind": "answer",
"impl": "imperative",
"description": "Check the current board against the trip in the brief — trip type AND real weather — and report what's missing, all in one result: e.g. 'no winter-rated sleep system on the board', 'rain likely on day 2 — no board item tagged waterproof yet'. Folds in the get_weather_outlook state (real forecast or seasonal average, when the trip's place and dates are set) so weather-driven gaps sit next to the trip-type gaps instead of in a second system you have to reconcile. Read-only analysis: it never adds anything; use the gaps to frame suggestions, then let the human decide. Great before summarizing the plan or when the human asks 'what else do we need?'.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/"
}get_activity_logAnswer
Read the board's recent activity log — newest first, both sides of the collaboration: gear the human viewed or placed, cards they moved or removed, day blocks they added, brief edits and proposal verdicts, plus every tool call you (the agent) have made. Catch up BEFORE acting: don't re-suggest gear the human just removed, build on the gear they've been eyeing, group around day blocks they just added, and respect it if they've locked the plan.
View tool JSON
{
"name": "get_activity_log",
"kind": "answer",
"impl": "imperative",
"description": "Read the board's recent activity log — newest first, both sides of the collaboration: gear the human viewed or placed, cards they moved or removed, day blocks they added, brief edits and proposal verdicts, plus every tool call you (the agent) have made. Catch up BEFORE acting: don't re-suggest gear the human just removed, build on the gear they've been eyeing, group around day blocks they just added, and respect it if they've locked the plan.",
"inputSchema": {
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max events to return (default 20, max 100)"
},
"sinceMinutes": {
"type": "number",
"description": "Only events from the last N minutes (default: no time filter)"
}
}
},
"page": "/"
}