paxaver-mcp
MCP adapter for the Paxaver school community platform. Streamable HTTP, OAuth 2.1, capability auth.
사용해야 할까요
품질 및 안전성
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"paxaver-mcp": {
"url": "https://mcp.paxaver.com/mcp"
}
}
}원격 엔드포인트
https://mcp.paxaver.com/mcpstreamable-http할 수 있는 일
도구 목록
도구 (26)
🟢get_my_context
Read-only lookup with no side effects - safe to call repeatedly. Requires authentication: returns only the caller's own context (never another user's data): first name, active school, the students they are a guardian for, and their role codes at that school. This is the context-discovery call - most other tools need a student_id or school_slug from here, and admin-role checks come from roles. Returns live account state, so call again if the user may have switched schools or had roles changed.
입력 스키마
{
"type": "object",
"properties": {},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"firstName": {
"type": [
"string",
"null"
],
"description": "User first name"
},
"schoolSlug": {
"type": [
"string",
"null"
],
"description": "Active school slug"
},
"schoolName": {
"type": [
"string",
"null"
],
"description": "Active school display name"
},
"students": {
"type": "array",
"items": {
"type": "object"
},
"description": "Students the user is guardian for (id, firstName, schoolSlug)"
},
"roles": {
"type": "array",
"items": {
"type": "string"
},
"description": "Role codes the user holds at the active school"
}
}
}🟢get_my_wallet_balance
Read-only lookup - never moves funds or has side effects. Requires authentication: returns only the caller's spendable wallet balance at their active school (wallets are scoped per school, so a balance at one school does not apply elsewhere), in cents and formatted. Live value reflecting orders and refunds up to the current moment - recheck before assuming funds are still available. Call before pay_lunch_order_draft or register_for_event to confirm the user can cover the charge; not needed for read-only lookups.
입력 스키마
{
"type": "object",
"properties": {},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"balanceCents": {
"type": [
"number",
"null"
],
"description": "Spendable balance in cents"
},
"balanceFormatted": {
"type": [
"string",
"null"
],
"description": "Balance formatted with the currency symbol"
},
"currency": {
"type": [
"string",
"null"
],
"description": "ISO currency code (CAD, USD, or MXN)"
}
}
}🟢list_my_lunch_orders(student_id, menu_date, month)
Returns lunch orders already placed - items, menu date, status, and total - for the authenticated user's students, newest first (up to ~100 most recent). Filters combine with AND: student_id narrows to one student; menu_date and month narrow the date range, and if both are given menu_date wins. With no filters returns recent orders across all of the user's students. Admins (pac_cordinator, lunch_cordinator) see school-wide orders; parents only their own students. For what can be ordered (menu and prices), use get_lunch_menu.
입력 스키마
{
"type": "object",
"properties": {
"student_id": {
"type": "string",
"description": "Filter to a specific student (must be your own student, from get_my_context; admins may filter any student in the school)"
},
"menu_date": {
"type": "string",
"description": "Single day to query, YYYY-MM-DD; omit when using month"
},
"month": {
"type": "string",
"description": "Calendar month to query, YYYY-MM; omit when using menu_date"
}
},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"orders": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Order ID"
},
"studentId": {
"type": "string",
"description": "Student the order is for"
},
"menuDate": {
"type": "string",
"description": "Date the lunch is served, YYYY-MM-DD"
},
"status": {
"type": "string",
"description": "Order status"
},
"itemTotalCents": {
"type": "integer",
"description": "Item total in cents"
},
"items": {
"type": "array",
"items": {
"type": "object"
},
"description": "Ordered line items"
},
"createdAt": {
"type": "string",
"description": "ISO timestamp the order was placed"
}
}
},
"description": "Orders matching the filters"
}
}
}🟢get_lunch_menu(date, month)
Returns the orderable lunch menu for the user's active school - item names, prices, dietary tags, and remaining quantity. Pass date for a single day or month for a per-day listing across the whole month (today if neither is given); if both are passed, date wins. The menu_item_id values returned are required by create_lunch_order_draft. For orders already placed, use list_my_lunch_orders.
입력 스키마
{
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "Single day to show, YYYY-MM-DD; omit when using month"
},
"month": {
"type": "string",
"description": "Calendar month to show, YYYY-MM; omit when using date. Today is used when neither is given"
}
},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"date": {
"type": "string",
"description": "Date this menu applies to, YYYY-MM-DD"
},
"menuItems": {
"type": "array",
"items": {
"type": "object",
"properties": {
"dailyMenuId": {
"type": "string",
"description": "Daily-menu entry ID"
},
"menuItemId": {
"type": "string",
"description": "Menu item ID for ordering tools"
},
"menuItemName": {
"type": "string",
"description": "Item display name"
},
"restaurantName": {
"type": [
"string",
"null"
],
"description": "Restaurant offering the item"
},
"priceCents": {
"type": "integer",
"description": "Sale price in cents"
},
"availableQty": {
"type": [
"integer",
"null"
],
"description": "Remaining portions; null means unlimited"
},
"dietaryTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Dietary labels (e.g. vegetarian, halal)"
}
}
},
"description": "Items orderable on that date"
}
}
}🟡create_lunch_order_draft(student_id, school_slug, menu_date, items)
Creates an unpaid draft lunch order with one or more items - nothing is charged until pay_lunch_order_draft commits it. Use for multi-item orders or when the user should review the total first; each items entry pairs a menu_item_id with a quantity. The draft total is the sum of item prices times quantities plus nothing else until pay_lunch_order_draft. To change or abandon the draft, use update_lunch_order_draft or discard_lunch_order_draft. FINANCIAL - confirm student, items, and date before calling.
입력 스키마
{
"type": "object",
"properties": {
"student_id": {
"type": "string",
"description": "Student ID (must be your own student; from get_my_context); required when the user has more than one student, defaults to their only student"
},
"school_slug": {
"type": "string",
"description": "School slug (from get_my_context); defaults to the active school"
},
"menu_date": {
"type": "string",
"description": "Date the lunch is served, YYYY-MM-DD"
},
"items": {
"type": "array",
"description": "Line items to order; get IDs and prices from get_lunch_menu",
"items": {
"type": "object",
"properties": {
"menu_item_id": {
"type": "string",
"description": "Menu item ID from get_lunch_menu"
},
"menu_item_name": {
"type": "string",
"description": "Item display name from get_lunch_menu"
},
"price_cents": {
"type": "integer",
"description": "Unit price in cents from get_lunch_menu"
},
"quantity": {
"type": "integer",
"description": "Number of servings",
"minimum": 1
}
},
"required": [
"menu_item_id",
"menu_item_name",
"price_cents",
"quantity"
]
}
}
},
"required": [
"menu_date",
"items"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Draft order ID - pass to pay_lunch_order_draft"
},
"studentId": {
"type": "string",
"description": "Student the order is for"
},
"schoolSlug": {
"type": "string",
"description": "School the order was placed at"
},
"menuDate": {
"type": "string",
"description": "Date the lunch is served, YYYY-MM-DD"
},
"status": {
"type": "string",
"description": "Order status (draft)"
},
"itemTotalCents": {
"type": "integer",
"description": "Item total in cents - charged on finalize"
},
"items": {
"type": "array",
"items": {
"type": "object"
},
"description": "Draft line items"
}
}
}🟡pay_lunch_order_draft(order_id, tip_cents)
Commits a draft order from create_lunch_order_draft and charges the wallet for the item total plus optional tip_cents (donated to the school's PAC). Wallet-only: if the balance cannot cover the full total, the call fails with an error directing the user to open the Paxaver panel and top up the wallet balance, then retry - no card payment is offered through this tool. Not for new orders - use create_lunch_order_draft first. FINANCIAL - confirm the total before calling.
입력 스키마
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "Draft order ID from create_lunch_order_draft - must still be in draft status; already-finalized orders are rejected"
},
"tip_cents": {
"type": "integer",
"description": "Tip in cents (donated to school PAC)",
"default": 0
}
},
"required": [
"order_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"orderId": {
"type": "string",
"description": "Order ID"
},
"status": {
"type": "string",
"description": "'finalized' when the wallet covered the full total"
},
"itemTotalCents": {
"type": "integer",
"description": "Item total in cents"
},
"tipCents": {
"type": "integer",
"description": "PAC donation added, in cents"
}
}
}🔴update_lunch_order_draft(order_id, items, menu_date)
Replaces the items and/or menu_date of an unpaid draft order before it is finalized - the caller must own the draft and it must still be in draft status (order_id from create_lunch_order_draft). Pass the complete items list: it replaces the draft's items wholesale and the total is recomputed from price times quantity. Only draft orders can be updated; once finalized, use cancel_my_lunch_order. WRITE - confirm the new contents with the user.
입력 스키마
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "Draft order ID from create_lunch_order_draft - must still be in draft status"
},
"items": {
"type": "array",
"description": "Replacement line items (menu_item_id from get_lunch_menu + quantity); replaces all existing items when provided"
},
"menu_date": {
"type": "string",
"description": "New date the lunch is served, YYYY-MM-DD"
}
},
"required": [
"order_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"orderId": {
"type": "string",
"description": "Updated draft order ID"
},
"status": {
"type": "string",
"description": "Order status (draft)"
}
}
}🔴discard_lunch_order_draft(order_id)
Permanently discards an unpaid draft order - the caller must own it and it must still be in draft status (order_id from create_lunch_order_draft). Nothing was ever charged, so there is no refund; the draft is simply deleted. For a finalized order use cancel_my_lunch_order instead. DESTRUCTIVE - confirm with the user before discarding.
입력 스키마
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "Draft order ID from create_lunch_order_draft - must still be in draft status"
}
},
"required": [
"order_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"orderId": {
"type": "string",
"description": "Discarded draft order ID"
},
"status": {
"type": "string",
"description": "Order status (discarded)"
}
}
}🔴cancel_my_lunch_order(order_id)
Cancels a finalized order and refunds the charge to the wallet. Only works before order labels have been sent; after that the request is rejected and the order stands. DESTRUCTIVE - confirm with the user before cancelling.
입력 스키마
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "ID of a finalized order - from list_my_lunch_orders; the order must still be finalized and not yet have labels sent"
}
},
"required": [
"order_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Order ID"
},
"status": {
"type": "string",
"description": "Order status (cancelled)"
},
"refundCents": {
"type": "integer",
"description": "Amount refunded to the wallet, in cents"
},
"balanceCents": {
"type": [
"number",
"null"
],
"description": "Wallet balance after the refund, in cents"
}
}
}🟢list_school_events(start_date, end_date)
Returns upcoming events for the user's active school: date, times, location, volunteer shifts, and whether registration is closed. The event IDs returned feed register_for_event; shift IDs feed sign_up_for_volunteer_shift. To review or undo your own registrations and signups, use list_my_event_registrations / cancel_my_event_registration and list_my_volunteer_signups / cancel_my_volunteer_signup. Optionally filter by date range.
입력 스키마
{
"type": "object",
"properties": {
"start_date": {
"type": "string",
"description": "First day of the range, YYYY-MM-DD (inclusive); omit for all upcoming events"
},
"end_date": {
"type": "string",
"description": "Last day of the range, YYYY-MM-DD (inclusive); omit for all upcoming events"
}
},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"events": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Event ID - input to register_for_event, update_school_event, cancel_school_event"
},
"name": {
"type": "string",
"description": "Event name"
},
"eventDate": {
"type": "string",
"description": "Event date, YYYY-MM-DD"
},
"startsAt": {
"type": [
"string",
"null"
],
"description": "Start time"
},
"endsAt": {
"type": [
"string",
"null"
],
"description": "End time"
},
"location": {
"type": [
"string",
"null"
],
"description": "Event location"
},
"isClosed": {
"type": "boolean",
"description": "Whether registration is closed"
}
}
},
"description": "Upcoming events matching the date range"
}
}
}🟡create_school_event(school_slug, name, description, event_date, starts_at, ...)
ADMIN: Creates a school event, optionally ticketed, at the active school. To change an existing event use update_school_event; to register a parent for an event use register_for_event. Requires pac_cordinator or event_cordinator role. WRITE - only create on explicit user request.
입력 스키마
{
"type": "object",
"properties": {
"school_slug": {
"type": "string",
"description": "School slug (defaults to active school)"
},
"name": {
"type": "string",
"description": "Event name shown to parents"
},
"description": {
"type": "string",
"description": "Optional event description"
},
"event_date": {
"type": "string",
"description": "Event date, YYYY-MM-DD"
},
"starts_at": {
"type": "string",
"description": "Start time (e.g. 18:30)"
},
"ends_at": {
"type": "string",
"description": "End time (e.g. 20:00)"
},
"location": {
"type": "string",
"description": "Event location (e.g. Gymnasium)"
},
"max_capacity": {
"type": "integer",
"description": "Maximum attendees/tickets; omit for unlimited"
},
"ticket_price_cents": {
"type": "integer",
"description": "Ticket price in cents (0 = free)"
}
},
"required": [
"name",
"event_date"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Event ID"
},
"name": {
"type": "string",
"description": "Event name"
},
"eventDate": {
"type": "string",
"description": "Event date, YYYY-MM-DD"
},
"status": {
"type": "string",
"description": "Event status (e.g. active)"
}
}
}🔴update_school_event(event_id, name, description, event_date, starts_at, ...)
ADMIN: Partially updates an existing school event - only the provided fields change; omitted fields keep their current values. Use for reschedules, capacity or price changes, and status transitions (cancelled/completed). Prefer cancel_school_event to cancel outright. Requires pac_cordinator or event_cordinator role. WRITE operation - confirm changes with the user. Get event_id from list_school_events.
입력 스키마
{
"type": "object",
"properties": {
"event_id": {
"type": "string",
"description": "Event ID - from list_school_events"
},
"name": {
"type": "string",
"description": "New event name"
},
"description": {
"type": "string",
"description": "New event description shown to parents"
},
"event_date": {
"type": "string",
"description": "Event date, YYYY-MM-DD"
},
"starts_at": {
"type": "string",
"description": "Start time (e.g. 18:30)"
},
"ends_at": {
"type": "string",
"description": "End time (e.g. 20:00)"
},
"location": {
"type": "string",
"description": "Event location (e.g. Gymnasium)"
},
"max_capacity": {
"type": "integer",
"description": "Maximum number of attendees/tickets"
},
"ticket_price_cents": {
"type": "integer",
"description": "Ticket price in cents; 0 for free events"
},
"status": {
"type": "string",
"enum": [
"active",
"cancelled",
"completed"
],
"description": "Event status - cancelled stops sales, completed closes the event"
}
},
"required": [
"event_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Event ID"
},
"name": {
"type": "string",
"description": "Event name"
},
"eventDate": {
"type": "string",
"description": "Event date, YYYY-MM-DD"
},
"status": {
"type": "string",
"description": "Event status after the update"
}
}
}🔴cancel_school_event(event_id)
ADMIN: Cancels a school event outright; cancelled events cannot be reactivated. For schedule, capacity, or price changes use update_school_event instead. Requires pac_cordinator or event_cordinator role. DESTRUCTIVE - confirm with the user. Get event_id from list_school_events.
입력 스키마
{
"type": "object",
"properties": {
"event_id": {
"type": "string",
"description": "Event ID - from list_school_events; cancelling is permanent and cannot be undone"
}
},
"required": [
"event_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Event ID"
},
"status": {
"type": "string",
"description": "Event status (cancelled)"
}
}
}⚪register_for_event(event_id, quantity)
Registers the authenticated user for a school event and issues tickets to the caller (quantity is the number of tickets bought for the caller, minimum 1 - there is no per-student split). For paid events quantity times the ticket price is charged to the user's wallet - the call fails on insufficient balance or when the event is sold out or registration is closed. To volunteer at an event rather than attend, use sign_up_for_volunteer_shift. FINANCIAL for paid events - confirm before registering.
입력 스키마
{
"type": "object",
"properties": {
"event_id": {
"type": "string",
"description": "Event ID from list_school_events - registration must still be open (check the closed flag)"
},
"quantity": {
"type": "integer",
"description": "Number of tickets",
"minimum": 1,
"default": 1
}
},
"required": [
"event_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Registration ID"
},
"eventId": {
"type": "string",
"description": "Event the user registered for"
},
"quantity": {
"type": "integer",
"description": "Tickets issued"
},
"status": {
"type": "string",
"description": "Registration status"
}
}
}🟢list_my_event_registrations
Read-only, no side effects. Returns the authenticated user's own event tickets at their active school - ticket id, event name/date/location, quantity, total paid, and status (paid or checked_in). Cancelled tickets are excluded. The id values returned are required by cancel_my_event_registration. Pair with list_school_events for events the user has not registered for.
입력 스키마
{
"type": "object",
"properties": {},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"tickets": {
"type": "array",
"description": "Caller's event tickets at the active school"
}
}
}🔴cancel_my_event_registration(ticket_id)
Cancels one of the authenticated user's own event tickets (ticket_id from list_my_event_registrations). Releases the reserved seats; for paid tickets the full amount is refunded to the user's wallet at that school. Only the ticket owner or a coordinator can cancel. DESTRUCTIVE - confirm with the user before cancelling.
입력 스키마
{
"type": "object",
"properties": {
"ticket_id": {
"type": "string",
"description": "Ticket ID from list_my_event_registrations - must belong to the caller and still be cancellable"
}
},
"required": [
"ticket_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Cancelled ticket ID"
},
"status": {
"type": "string",
"description": "Ticket status (cancelled)"
}
}
}🟢list_my_volunteer_signups
Read-only, no side effects. Returns the authenticated user's active volunteer signups at their school - signup id, shift title/date/times, and the parent event. Cancelled signups are excluded. The id values returned are required by cancel_my_volunteer_signup.
입력 스키마
{
"type": "object",
"properties": {},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"signups": {
"type": "array",
"description": "Caller's active volunteer signups"
}
}
}🔴cancel_my_volunteer_signup(signup_id)
Cancels one of the authenticated user's own volunteer signups (signup_id from list_my_volunteer_signups) and frees the shift slot for others. No payment is involved. Only the volunteer themselves or an admin can cancel. DESTRUCTIVE - confirm with the user before cancelling.
입력 스키마
{
"type": "object",
"properties": {
"signup_id": {
"type": "string",
"description": "Signup ID from list_my_volunteer_signups - must belong to the caller and still be active"
}
},
"required": [
"signup_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Cancelled signup ID"
},
"status": {
"type": "string",
"description": "Signup status (cancelled)"
}
}
}🟡sign_up_for_volunteer_shift(shift_id)
Signs the authenticated user up for a specific volunteer shift - no payment involved. shift_id identifies one shift within an event, not the event itself: get it from the event's volunteer shifts in list_school_events. The call fails when the shift is full or cancelled. To attend an event as a guest instead, use register_for_event. WRITE - confirm with the user before signing up.
입력 스키마
{
"type": "object",
"properties": {
"shift_id": {
"type": "string",
"description": "Volunteer shift ID - from the event's volunteer shifts (list_school_events)"
}
},
"required": [
"shift_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Signup ID"
},
"shiftId": {
"type": "string",
"description": "Volunteer shift signed up for"
},
"status": {
"type": "string",
"description": "Signup status"
}
}
}🟢list_school_restaurants(school_slug)
ADMIN: Lists the active restaurants attached to a school (defaults to the active school). Inactive restaurants are not returned. The restaurant_id values returned are required by list_restaurant_menu_items, create_restaurant_menu_item, update_restaurant_menu_item, archive_restaurant_menu_item, and schedule_lunch_menu_item. Requires pac_cordinator, pac_member, or lunch_cordinator role.
입력 스키마
{
"type": "object",
"properties": {
"school_slug": {
"type": "string",
"description": "School slug (defaults to active school)"
}
},
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"restaurants": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Restaurant ID - input to menu-item and daily-menu tools"
},
"name": {
"type": "string",
"description": "Restaurant name"
},
"description": {
"type": [
"string",
"null"
],
"description": "Restaurant description"
},
"isActive": {
"type": "boolean",
"description": "Whether the restaurant is active"
},
"logoUrl": {
"type": [
"string",
"null"
],
"description": "Restaurant logo URL"
}
}
},
"description": "Active restaurants attached to the school (inactive ones are excluded)"
}
}
}🟡create_school_restaurant(school_slug, name, description, tax_percent)
ADMIN: Adds a restaurant to the active school so it can offer menu items via create_restaurant_menu_item. To change an existing restaurant there is no update tool - recreate or manage it in the Paxaver admin. Requires pac_cordinator role. WRITE - confirm with the user.
입력 스키마
{
"type": "object",
"properties": {
"school_slug": {
"type": "string",
"description": "School slug - defaults to the active school"
},
"name": {
"type": "string",
"description": "Restaurant display name"
},
"description": {
"type": "string",
"description": "Optional restaurant description"
},
"tax_percent": {
"type": "number",
"description": "Sales tax percentage applied to orders (e.g. 5 for 5%)"
}
},
"required": [
"name"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Restaurant ID"
},
"name": {
"type": "string",
"description": "Restaurant name"
},
"isActive": {
"type": "boolean",
"description": "Whether the restaurant is active"
}
}
}🟢list_restaurant_menu_items(restaurant_id)
ADMIN: Lists the full menu-item catalog for a restaurant, including inactive and unavailable items - this is the catalog, not what parents can order on a date (use get_lunch_menu for that). Provides menu_item_id values for update_restaurant_menu_item, archive_restaurant_menu_item, and schedule_lunch_menu_item. Requires pac_cordinator or lunch_cordinator role. Get restaurant_id from list_school_restaurants.
입력 스키마
{
"type": "object",
"properties": {
"restaurant_id": {
"type": "string",
"description": "Restaurant ID - from list_school_restaurants"
}
},
"required": [
"restaurant_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Menu item ID"
},
"name": {
"type": "string",
"description": "Item name"
},
"description": {
"type": [
"string",
"null"
],
"description": "Item description"
},
"priceCents": {
"type": "integer",
"description": "Sale price in cents"
},
"costCents": {
"type": [
"integer",
"null"
],
"description": "Kitchen cost in cents"
},
"isActive": {
"type": "boolean",
"description": "Whether the item is on the restaurant menu"
},
"isAvailable": {
"type": "boolean",
"description": "Whether the item can currently be ordered"
},
"calories": {
"type": [
"integer",
"null"
],
"description": "Calorie count"
},
"ingredients": {
"type": [
"string",
"null"
],
"description": "Ingredient list text"
}
}
},
"description": "Full catalog items, including inactive and unavailable"
}
}
}🟡create_restaurant_menu_item(restaurant_id, name, description, cost_cents, price_cents, ...)
ADMIN: Creates a new menu item on a restaurant. Only restaurant_id and name are required - set price_cents before the item can be meaningfully ordered. New items start active and available; use update_restaurant_menu_item to change them later. Requires pac_cordinator or lunch_cordinator role. WRITE operation - confirm with the user. Get restaurant_id from list_school_restaurants.
입력 스키마
{
"type": "object",
"properties": {
"restaurant_id": {
"type": "string",
"description": "Restaurant ID - from list_school_restaurants"
},
"name": {
"type": "string",
"description": "Item display name shown to parents"
},
"description": {
"type": "string",
"description": "Optional item description"
},
"cost_cents": {
"type": "integer",
"description": "Kitchen cost in cents (internal margin tracking)"
},
"price_cents": {
"type": "integer",
"description": "Sale price in cents (e.g. 550 = $5.50)"
},
"ingredients": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ingredient list"
},
"calories": {
"type": "integer",
"description": "Calorie count"
}
},
"required": [
"restaurant_id",
"name"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Menu item ID"
},
"name": {
"type": "string",
"description": "Item name"
},
"priceCents": {
"type": "integer",
"description": "Sale price in cents"
},
"isActive": {
"type": "boolean",
"description": "Whether the item is on the restaurant menu"
}
}
}🔴update_restaurant_menu_item(restaurant_id, menu_item_id, name, description, cost_cents, ...)
ADMIN: Partially updates an existing menu item - only the provided fields change; omitted fields keep their current values. Use for renames, description edits, price changes (price_cents - FINANCIAL, confirm the new price), nutrition updates, or retiring an item (is_active=false). Day-level orderability is controlled by schedule_lunch_menu_item, not this tool. Use archive_restaurant_menu_item to remove the item permanently. Requires pac_cordinator or lunch_cordinator role. WRITE operation - confirm changes with the user. Get restaurant_id from list_school_restaurants and menu_item_id from list_restaurant_menu_items.
입력 스키마
{
"type": "object",
"properties": {
"restaurant_id": {
"type": "string",
"description": "Restaurant ID - from list_school_restaurants"
},
"menu_item_id": {
"type": "string",
"description": "Menu item ID - from list_restaurant_menu_items"
},
"name": {
"type": "string",
"description": "New display name for the item"
},
"description": {
"type": "string",
"description": "New item description shown to parents"
},
"cost_cents": {
"type": "integer",
"description": "Kitchen cost in cents (internal margin tracking)"
},
"ingredients": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ingredient list"
},
"calories": {
"type": "integer",
"description": "Calorie count"
},
"is_active": {
"type": "boolean",
"description": "Whether the item stays on the restaurant menu - set false to retire it"
},
"price_cents": {
"type": "integer",
"description": "Sale price in cents (e.g. 550 = $5.50)"
}
},
"required": [
"restaurant_id",
"menu_item_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Menu item ID"
},
"name": {
"type": "string",
"description": "Item name"
},
"priceCents": {
"type": "integer",
"description": "Sale price in cents"
},
"isActive": {
"type": "boolean",
"description": "Whether the item is on the restaurant menu"
},
"isAvailable": {
"type": "boolean",
"description": "Whether the item can currently be ordered"
}
}
}🔴archive_restaurant_menu_item(restaurant_id, menu_item_id)
ADMIN: Archives (soft-deletes) a menu item so it can no longer be ordered - the item is removed from ordering but stays on historical orders. To retire it from the restaurant menu without archiving, use update_restaurant_menu_item with is_active=false. Requires pac_cordinator or lunch_cordinator role. DESTRUCTIVE operation - confirm with the user. Get restaurant_id from list_school_restaurants and menu_item_id from list_restaurant_menu_items.
입력 스키마
{
"type": "object",
"properties": {
"restaurant_id": {
"type": "string",
"description": "Restaurant ID - from list_school_restaurants"
},
"menu_item_id": {
"type": "string",
"description": "Menu item ID - from list_restaurant_menu_items"
}
},
"required": [
"restaurant_id",
"menu_item_id"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Menu item ID"
},
"deleted": {
"type": "boolean",
"description": "Whether the item was soft-deleted"
}
}
}🟡schedule_lunch_menu_item(restaurant_id, menu_item_id, menu_date, available_qty)
ADMIN: Puts a restaurant menu item on the orderable menu for a given date, optionally capping portions. This only schedules the item - to retire it entirely use update_restaurant_menu_item (is_active) or archive_restaurant_menu_item. Requires pac_cordinator or lunch_cordinator role. WRITE - confirm with the user. Get IDs from list_school_restaurants and list_restaurant_menu_items.
입력 스키마
{
"type": "object",
"properties": {
"restaurant_id": {
"type": "string",
"description": "Restaurant ID - from list_school_restaurants"
},
"menu_item_id": {
"type": "string",
"description": "Menu item ID - from list_restaurant_menu_items"
},
"menu_date": {
"type": "string",
"description": "Date the item is orderable, YYYY-MM-DD"
},
"available_qty": {
"type": "integer",
"description": "Maximum portions for the day; omit for unlimited"
}
},
"required": [
"restaurant_id",
"menu_item_id",
"menu_date"
],
"additionalProperties": false
}출력 스키마
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Daily-menu entry ID"
},
"menuItemId": {
"type": "string",
"description": "Menu item scheduled"
},
"menuDate": {
"type": "string",
"description": "Date the item is orderable, YYYY-MM-DD"
},
"availableQty": {
"type": [
"integer",
"null"
],
"description": "Portion cap for the day; null means unlimited"
}
}
}커뮤니티
증거