Skip to main content
Glama
Paxaver MCP Server

Paxaver MCP Server

Official

Paxaver MCP Server

AI-facing adapter over the Paxaver school community platform. Implements the Model Context Protocol (MCP) on Cloudflare Workers with RS256 JWT validation, capability-first authorization, and Streamable HTTP transport.

npm version License: Apache-2.0 MCP Badge Paxaver MCP Server MCP server – quality and maintenance score on Glama Listed on mcpservers.org Wellknown mcptry


What this is

The Paxaver MCP server lets AI assistants (ChatGPT, Claude, Perplexity, and any MCP-compatible client) act on behalf of a Paxaver user: check a lunch menu, order lunch, review wallet balance and transaction history, register for fundraising events, enroll students in school programs, volunteer, and — for school administrators — manage restaurants, menu items, events, attendee check-in, volunteer shifts, program waitlists, and daily orders.

It is a thin adapter. It contains no business logic and holds no database, payment, or email credentials. Every action runs against the Paxaver backend API as the authenticated user, and errors are sanitized before they reach the client.


Related MCP server: IIITH Mess MCP

Connect

Point an MCP-compatible client at the hosted endpoint and sign in with a Paxaver account when prompted (OAuth 2.1 Authorization Code + PKCE):

https://mcp.paxaver.com/mcp

The server speaks MCP protocol 2025-06-18 over Streamable HTTP (POST /mcp). One endpoint serves all regions; the user's region is resolved from their account at sign-in.


Install

npm install @paxaver/mcp

The package ships the Worker source for self-hosting and development. Most users only need the hosted endpoint above.

Run locally

pnpm install        # Node >= 26.8.2, pnpm >= 10
pnpm dev            # Miniflare on http://localhost:8787 — MCP endpoint: POST /mcp

Docker

docker build -t paxaver-mcp .
docker run -p 8787:8787 paxaver-mcp
# MCP endpoint: http://localhost:8787/mcp

Self-hosted and local instances perform no token-revocation check: a revoked token stays valid until it expires. Tokens are still verified by signature, expiry, and a live user-context load.

See CONTRIBUTING.md for the full development setup.


Tools

The server exposes 37 tools grouped into six categories. Visibility in tools/list is filtered by the caller's roles; every call is re-authorized before dispatch, and the backend re-checks data-level access (defense-in-depth).

Category

Tools

User / wallet

get_my_context, sign_out, get_my_wallet_balance, list_my_wallet_transactions

Lunch ordering

get_lunch_menu, list_my_lunch_orders, create_lunch_order_draft, update_lunch_order_draft, discard_lunch_order_draft, pay_lunch_order_draft, cancel_my_lunch_order

Events & volunteering

list_school_events, get_school_event, register_for_event, list_my_event_registrations, cancel_my_event_registration, list_my_volunteer_signups, sign_up_for_volunteer_shift, cancel_my_volunteer_signup

Event administration

create_school_event, update_school_event, cancel_school_event, list_event_attendees, check_in_event_ticket, create_volunteer_shift

Programs

list_school_programs, register_for_program, cancel_program_registration, list_program_registrations, admit_program_registration

Restaurant / menu admin

list_school_restaurants, create_school_restaurant, list_restaurant_menu_items, create_restaurant_menu_item, update_restaurant_menu_item, archive_restaurant_menu_item, schedule_lunch_menu_item

Prompts

The server registers four prompts: daily_lunch_menu, wallet_balance, upcoming_events, and lunch_order_helper (optional student_name argument). Availability and content are returned by prompts/list and prompts/get.

Ordering is draft → review → payment: create_lunch_order_draft, adjust with update_lunch_order_draft, then pay_lunch_order_draft.

sign_out ends the caller's sign-in for this MCP connection: the next request gets the usual sign-in challenge. An app that holds its own Paxaver credentials cannot be signed out this way — the result directs the user to disconnect Paxaver in that app or in their Paxaver account settings instead.

Pre-2.5 tool names still resolve to the canonical tools but are no longer advertised; the retired order_lunch tool is removed. Financial and destructive tools are labeled and require user confirmation.

Privacy

The only contact information returned through MCP tools is the caller's own sign-in email — get_my_context includes it so a client can answer "which login am I on?", and sign_out names the account it signs out. Phone, address, and other contact fields are never returned. Student data is limited to IDs, names, and school slugs; allergies, notes, birthday, and other PII are not exposed in read responses. The MCP server does not log user data.


Documentation

Document

Topic

CHANGELOG.md

Release history

SECURITY.md

Vulnerability reporting policy

CONTRIBUTING.md

Development setup and contribution process

Internal documentation (architecture, authentication, authorization, full tool reference, deployment, security model, test scenarios) lives in the private Paxaver monorepo under docs/paxaver-mcp/ and is intentionally not published.


Tech stack

  • Runtime: Cloudflare Workers

  • Framework: Hono v4

  • JWT: jose v6 (RS256 via JWKS)

  • Protocol: MCP 2025-06-18, Streamable HTTP

  • Build/deploy: Wrangler v4

  • Test: Vitest v5 (Workers pool + Node pool)


Support

License

Apache-2.0. Copyright (c) 2026 Smartoire. See LICENSE.

Available Tools

26 tools
archive_restaurant_menu_itemArchive Restaurant Menu Item (Admin)A
DestructiveIdempotent
Inspect

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.

Inputs: menu_item_id (required), restaurant_id (required). Returns: id, deleted

cancel_my_event_registrationCancel My Event RegistrationA
DestructiveIdempotent
Inspect

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.

Inputs: ticket_id (required). Returns: id, status

cancel_my_lunch_orderCancel My Lunch OrderA
DestructiveIdempotent
Inspect

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.

Inputs: order_id (required). Returns: id, status, refundCents, balanceCents

cancel_my_volunteer_signupCancel My Volunteer SignupA
DestructiveIdempotent
Inspect

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.

Inputs: signup_id (required). Returns: id, status

cancel_school_eventCancel School Event (Admin)A
DestructiveIdempotent
Inspect

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.

Inputs: event_id (required). Returns: id, status

create_lunch_order_draftCreate Lunch Order DraftA
Idempotent
Inspect

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.

Inputs: items (required), menu_date (required), student_id, school_slug. Returns: id, items, status, menuDate, +3 more

create_restaurant_menu_itemCreate Restaurant Menu Item (Admin)A
Idempotent
Inspect

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.

Inputs: name (required), restaurant_id (required), calories, cost_cents, +3 more. Returns: id, name, isActive, priceCents

create_school_eventCreate School Event (Admin)A
Idempotent
Inspect

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.

Inputs: name (required), event_date (required), ends_at, location, +5 more. Returns: id, name, status, eventDate

create_school_restaurantCreate School Restaurant (Admin)A
Idempotent
Inspect

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.

Inputs: name (required), description, school_slug, tax_percent. Returns: id, name, isActive

discard_lunch_order_draftDiscard Lunch Order DraftA
DestructiveIdempotent
Inspect

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.

Inputs: order_id (required). Returns: status, orderId

get_lunch_menuGet Lunch MenuA
Read-only
Inspect

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.

Inputs: date, month. Returns: date, menuItems

get_my_contextGet My ContextA
Read-only
Inspect

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.

Inputs: no named parameters. Returns: roles, students, firstName, schoolName, +1 more

get_my_wallet_balanceGet My Wallet BalanceA
Read-only
Inspect

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.

Inputs: no named parameters. Returns: currency, balanceCents, balanceFormatted

list_my_event_registrationsList My Event RegistrationsA
Read-onlyIdempotent
Inspect

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.

Inputs: no named parameters. Returns: tickets

list_my_lunch_ordersList My Lunch OrdersA
Read-only
Inspect

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.

Inputs: month, menu_date, student_id. Returns: orders

list_my_volunteer_signupsList My Volunteer SignupsA
Read-onlyIdempotent
Inspect

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.

Inputs: no named parameters. Returns: signups

list_restaurant_menu_itemsList Restaurant Menu Items (Admin)A
Read-only
Inspect

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.

Inputs: restaurant_id (required). Returns: items

list_school_eventsList School EventsA
Read-only
Inspect

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.

Inputs: end_date, start_date. Returns: events

list_school_restaurantsList School Restaurants (Admin)A
Read-only
Inspect

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.

Inputs: school_slug. Returns: restaurants

pay_lunch_order_draftPay Lunch Order DraftA
Idempotent
Inspect

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.

Inputs: order_id (required), tip_cents. Returns: status, orderId, tipCents, itemTotalCents

register_for_eventRegister for EventA
Idempotent
Inspect

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.

Inputs: event_id (required), quantity. Returns: id, status, eventId, quantity

schedule_lunch_menu_itemSchedule Lunch Menu Item (Admin)A
Idempotent
Inspect

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.

Inputs: menu_date (required), menu_item_id (required), restaurant_id (required), available_qty. Returns: id, menuDate, menuItemId, availableQty

sign_up_for_volunteer_shiftSign Up for Volunteer ShiftA
Idempotent
Inspect

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.

Inputs: shift_id (required). Returns: id, status, shiftId

update_lunch_order_draftUpdate Lunch Order DraftA
Idempotent
Inspect

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.

Inputs: order_id (required), items, menu_date. Returns: status, orderId

update_restaurant_menu_itemUpdate Restaurant Menu Item (Admin)A
Idempotent
Inspect

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.

Inputs: menu_item_id (required), restaurant_id (required), name, calories, +5 more. Returns: id, name, isActive, priceCents, +1 more

update_school_eventUpdate School Event (Admin)A
Idempotent
Inspect

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.

Inputs: event_id (required), name, status, ends_at, +6 more. Returns: id, name, status, eventDate

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.4/5.0

    Scored across 26 tools

    Disambiguation5/5

    Each tool targets a distinct resource and action: context, wallet, lunch orders (draft/finalized), events, registrations, volunteer signups, restaurants, and menu items. No two tools overlap in purpose; even similar cancellation tools are clearly differentiated by entity type.

    Naming Consistency5/5

    Tool names consistently follow a verb_noun pattern (get_my_context, list_school_events, cancel_my_lunch_order, create_restaurant_menu_item). The 'my' prefix for user-scoped operations and 'school'/'restaurant' prefixes for admin operations are applied uniformly.

    Tool Count3/5

    At 26 tools, the surface is heavy and exceeds the typical 15-tool sweet spot. The count is justified by the broad domain (lunch, events, volunteering, restaurants, wallet), but it borders on overwhelming and would benefit from consolidation or sub-grouping.

    Completeness3/5

    The lifecycle coverage is strong for lunch orders, events, and volunteer signups (create/read/update/cancel). However, restaurants lack update and delete/archive tools (only create and list exist), and there is no tool to manage wallet top-ups or transaction history, leaving minor gaps agents must work around.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Enables AI assistants to interact with the IIIT Hyderabad Mess Management System through natural language, allowing students to view menus, manage meal registrations, check bills, submit feedback, and configure preferences.
      29
      11
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Enables LLMs to interact with the IIIT Hyderabad Mess System to manage meal registrations, view menus, and track billing. It supports conversational commands for tasks like cancelling meals, estimating nutrition, and checking account balances.
      45
      5
      AGPL 3.0
    • A
      license
      A
      quality
      D
      maintenance
      Enables AI assistants to interact with the IIIT-H mess dining and marketplace systems through resources, tools, and prompts for meal planning, billing analysis, and registration modifications.
      27
      GPL 3.0
    • A
      license
      A
      quality
      C
      maintenance
      MCP server for the Löwen Menü IBS5 school-lunch ordering system, enabling an LLM to browse weekly menus, manage a shopping cart, and place meal orders.
      7
      MIT