Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
ALZA_DEBUGNoVerbose stderr loggingfalse
ALZA_CDP_URLNoConnect to your already-running Chrome via CDP instead of launching a managed Chromium. Skips the browser download, inherits your session. E.g. http://localhost:9222
ALZA_BASE_URLNoSwitch locale: https://www.alza.cz, .sk, .hu, .at, .de, .co.ukhttps://www.alza.cz
ALZA_HEADLESSNoSet false for user-controlled login, AlzaBox selection, and payment/MFA promptstrue
ALZA_TOKEN_FILENoJSON token store written by scripts (default ~/.alza-mcp/tokens.json; set none to disable auto-load)~/.alza-mcp/tokens.json
ALZA_VISITOR_IDNoOptional anonymous visitor UUID; otherwise generated per process
ALZA_IDLE_TTL_MSNoClose the headless Chromium after this many ms with no tool calls. Lower it on memory-constrained machines; raise it (or disable by setting absurdly high) if you make many calls in quick succession and don't want the relaunch latency.180000
ALZA_API_BASE_URLNoMobile API base URL, default https://www.alza.czhttps://www.alza.cz
ALZA_CLIENT_SECRETNoSame secret for the PKCE exchange scripts
ALZA_OAUTH_AUTHORITYNoOAuth authority, default https://identity.alza.czhttps://identity.alza.cz
ALZA_OAUTH_CLIENT_SECRETNoThe alza_Android OAuth client is confidential — token requests need its APK-embedded secret (default: the source-verified value; set "" to omit it for public clients). Used by auth_exchange and token refresh

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": true
}
resources
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
search_productsA

Search the Alza.cz catalog by keyword. Use this for product discovery — finding what's available, comparing options, or starting research. Returns a list with product code, name, price, stock (from the card's purchase CTA), and rating. To get full details for one product, follow up with get_product. Sorting: Alza's search page ignores server-side sort, so price-asc / price-desc / rating scan up to ~72 top-ranked candidates (3 pages) and sort them client-side — candidatesScanned reports how many were scanned; for an absolute price floor also pass max_price. in_stock: true keeps only products with a live purchase CTA. Read-only.

get_productA

Fetch details for a single product by its Alza code (the code from search_products, e.g. 'WEXOA002B0' — not the numeric id): name, price (with the original price when discounted), availability, rating, brand, category, primary image, URL, and the scraped spec table when the product page carries one (up to 30 spec rows). Use after search_products to compare shortlisted candidates in depth, and to get the canonical URL to show the user. For reviews use get_product_reviews; for the complete spec sheet (parameterGroups) use mobile_read with operation=router_product and product_id = the numeric d######## id from the product URL. Sourced from the product page's JSON-LD schema, so values are accurate and stable. Read-only.

get_product_reviewsA

Fetch reviews for a single product by its Alza code: the aggregate rating and review count plus up to limit individual reviews (author, date, rating, body) scraped from the product's reviews section. Use after get_product when the user wants real-world feedback before deciding. If the reviews section is not rendered on the page you receive the aggregate only (empty reviews array) — in that case rely on the rating/count. Do not use for the aggregate rating alone when you already have it from search_products/get_product. Read-only.

find_pickup_pointsA

Find Alza brick-and-mortar showrooms (AlzaShop) near a Czech/Slovak postal code: name, address, distance, and opening hours. Use when the user wants to browse in person, get on-site advice, or find where an AlzaShop branch is. Note: types accepts alzabox, but AlzaBox locker discovery is not yet implemented — only branch results are returned. For AlzaBox parcel shops in a checkout flow use web_pickup_places instead. Read-only. Example: find_pickup_points({postal_code: '110 00', radius_km: 10})

list_categoriesA

Browse the Alza category tree one level at a time. Useful for narrowing a product search — find the right category id, then pass it to search_products as category_id. Without arguments, returns top-level categories.

auth_discoveryA

Read the live OpenID Connect discovery document that the Alza mobile app uses (issuer, authorization endpoint, token endpoint). Use only when debugging the OAuth flow or verifying which identity endpoints Alza exposes before calling auth_start. Do not use for everyday shopping — it returns a configuration document, not account data, and changes nothing. Read-only; no credentials are ever sent.

auth_startA

Start an OAuth 2.0 PKCE sign-in for the Alza mobile API: returns an authorization URL plus a state value. Use when account_status reports no loaded token, or when account tools start failing with authentication errors. Flow: open the returned authorization URL in a browser, sign in to Alza, the app redirects to alza://identity?code=...&state=... — then call auth_exchange with that code and this state. This call only creates a local PKCE session: the user's credentials never enter the MCP and nothing changes on Alza's side. Do not call it repeatedly for one sign-in — each call supersedes the previous state.

auth_exchangeA

Complete the OAuth 2.0 PKCE sign-in: exchange the authorization code for mobile API tokens and load them into this server. Use immediately after the user finishes the auth_start flow in the browser. Pass exactly the code and state from the alza://identity redirect — never a password and never a refresh token here. Fails if the state does not match a pending auth_start session (start over from auth_start in that case). Side effect: replaces the token set currently loaded in this process; afterwards account tools such as cart, profile, and order are authenticated.

mobile_readA

Read-only escape hatch for Alza mobile API operations that have no dedicated tool. Prefer the typed tool when one exists — cart (operation basket_info), profile (user_data), contacts (contacts), search_products (search), list_categories (category), order (user_order) — and use mobile_read for the rest. High-value operations: router_product {product_id} returns the full product envelope including the parameterGroups spec sheet (product_id is the numeric d######## id from the product URL, e.g. 13078770 from https://www.alza.cz/...-d13078770.htm); legacy_product {product_id, ucik, pgrik, country} is the same with the server-required UCÍK/PGŘÍK values (copy them from a router_product response); also alternatives {product_id}, ean_lookup, facets, hierarchical_filter, commodity_list(s), cost_estimate, delivery_countries, web_after_payment_dialog {order_id}, order_part/order2_info {order_id, ...}, order_helpdesk_questions, user_review, discussion_posts, premium_trial, validate_login_name, validate_isic, o3_info, quick_order_summary, home_categories (requires the server-side pgri/ui query values — copy them from an upstream self href in a navigation response, e.g. ?pgri=p__…&ui=u__…), zip_codes/web_zip_codes, branches, visitor_navigation/user_navigation/catalog_user_navigation, anonymous_orders/anonymous_order, url_info. This tool never accepts arbitrary URLs or credentials, and never mutates state. Account-scoped operations Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state. Returns the raw upstream envelope (err/msg/data); err:1 with a msg is an Alza-side validation (e.g. unknown product id).

prepare_mutationA

Start a two-step mutation by returning a one-time confirmation token bound to exactly one action. This call itself sends nothing to Alza. Use it before the high-impact typed mutations — register (action register), address_upsert (address_create or address_edit), address_delete (address_delete), pay_after_order (after_order_payment), web_place_order (web_place_order), web_pay_after_order (web_after_order_payment), review_submit (review_submit), subscription_activate (subscription_activate), subscription_update_installment (subscription_update_installment), upload_attachment (attachment_upload) — and before any low-risk mutate_list action (create, rename, delete, add, remove, move, set_country, set_isic, add_gift, add_order_service, set_watchdog, send_feedback, submit_discussion, rate_discussion, coupon_add, coupon_remove, basket_update, basket_unlock). Pass the returned token as confirmation_token on the matching call; the token is single-use and only valid for the exact action you prepared. Do not use for read-only tools, and not for add_to_cart (which is a low-risk cart write that needs no token).

mutate_listA

Execute one low-risk, APK-confirmed mutation using a one-time token from prepare_mutation. Use for shopping-list operations (create/rename/delete/add/remove/move), account settings (set_country, set_isic), add_gift, add_order_service, set_watchdog, send_feedback, submit_discussion, rate_discussion, coupons (coupon_add takes {coupon: "CODE"}; coupon_remove takes {couponId: <int>} — the id from a prior cart read), and basket flags (basket_update takes {basket_id, flag?, is_delayed_payment?}; basket_unlock). Do not use for high-impact mutations (order, payment, registration, address, review, subscription, attachment) — each has its own typed tool with its own token. The payload fields must match the mobile DTO for the chosen action exactly. Side effect: persists the change on the user's Alza account. Example: mutate_list({action: "coupon_add", confirmation_token: "...", payload: {coupon: "WELCOME10"}}).

account_statusA

Report whether a mobile API access token is loaded in this server process. Use as a first check before account-scoped tools (cart, profile, order, add_to_cart), or to diagnose "not authenticated" failures. If no token is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange. Read-only; no network call.

cartA

Read the authenticated user's Alza shopping cart: item lines with quantities and prices, applied discounts, vouchers, and the basket/order identifiers later checkout steps need. Use to verify an add_to_cart worked, to inspect coupon/voucher state, or to collect ids for mutate_list (e.g. coupon_remove.couponId) and basket_update. Do not use for the anonymous web/visitor cart — that is web_cart. Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state. Read-only. The response envelope is large (item lines + order summary); the basket_cnt, pricePay, and items fields are the signal.

add_to_cartA

Add one product to the authenticated user's Alza account cart by its Alza product code (the code from search_products/get_product, e.g. RI054b1 — not the numeric id). Use when the user wants a product put into their Alza account; pass quantity (default 1, max 99). Side effect: mutates the user's cart — the item stays there until removed or ordered (there is no basket-remove tool). Do not use for the anonymous web checkout cart — that is web_add_to_cart. Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state. The response echoes the added line and the new basket count; verify with cart if in doubt. Example: add_to_cart({code: "RI054b1", quantity: 1}).

delivery_optionsA

List the delivery and payment option groups for the current Alza account cart (AlzaShop pickup, AlzaBox lockers, courier, payment methods) from the mobile API. Use after items are in the cart and before checkout_preview, to show the user delivery/payment choices and to obtain the selected_delivery_option_id that later steps may require. Do not use on an empty cart — Alza answers with validation errors. Pass selected_delivery_option_id to re-fetch the groups anchored on a specific delivery choice. Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state. Read-only.

select_pickup_pointA

Associate a chosen pickup point (AlzaBox parcel shop or AlzaShop) with the current checkout by submitting the mobile API's DeliveryPaymentAssociation payload. Use after delivery_options has returned the association object and the user has picked a concrete pickup point. The association object must be copied verbatim from the current delivery_options response — never hand-craft it. Side effect: updates the delivery selection for the current checkout session (does not submit the order — that is place_order or web_place_order). Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state.

checkout_previewA

Run the read-side of the mobile checkout (sendOrder1 + delivery/payment-group reads) and return a one-time checkout token plus totals. Use after delivery_options/select_pickup_point to preview fees and the final order shape before committing, and to obtain the token that place_order requires. This never submits the order. Requires a non-empty cart. Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state. Note: the mobile submission step (sendOrder3) currently returns HTTP 500 (docs/gap-analysis.md G1/G5) — the known-working submission path is web_place_order.

place_orderA

Submit an order through the mobile API's multi-step sequence using a checkout token from checkout_preview plus the three explicit payloads (delivery_payment, user_info, complete_order) copied from the preview/delivery responses. Use only when the user has explicitly confirmed the purchase. High-impact, money-relevant side effect: creates a real Alza order. Known issue: the mobile sendOrder3 step currently returns HTTP 500 (docs/gap-analysis.md G1/G5) — for a known-working submission path prefer web_place_order (legacy web WCF). Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state.

web_pickup_placesA

List Alza pickup places from the live m.alza.cz personalPickup/v1 API: the type-availability form (AlzaBox/branches/24-7/showroom counts), a paginated place list, and — with place_id — a single place's detail (deliveryId, parcelShopId, isFree, typeText, opening hours). Use to find where the user can collect or pick up, or to obtain the deliveryId/parcelShopId that web_place_order needs. Unlike delivery_options, this is visitor-readable — no account token required. Pass order_id/group_id from the current basket checkout context when available. Read-only. Example: web_pickup_places({latitude: 50.08, longitude: 14.42, types: [1], limit: 10}).

web_add_to_cartA

Add a product to the anonymous (visitor-keyed) Alza web cart via the live m.alza.cz basket/v1 API, using the numeric commodity_id (e.g. 7229946) from search_products/get_product. Use for the web checkout flow (row W5) instead of the account cart — this basket is keyed to the visitor (Balancer-Guid), not to an Alza login. The response carries the basket id; pass it to web_cart to read the cart, and the place/payment ids flow into web_place_order. Side effect: creates or extends the visitor basket. No account token required. Example: web_add_to_cart({commodity_id: 7229946, count: 1}).

web_cartA

Read the anonymous (visitor) Alza web checkout cart by basket_id (obtained from web_add_to_cart): the HATEOAS cart state (maxStep, itemsAction, emptyCartAction) plus item lines (productId, count, basketItemId, updateQuantityAction). Use to verify a web_add_to_cart worked or to inspect the web cart before web_place_order. Do not use for the authenticated account cart — that is cart. Read-only; no token required.

chat_navigationA

Read the live chatbotapi.alza.cz navigation for the current visitor (row W18): chatbotInitializeChatAction / chatbotReinitializeChatAction / metadata / rating actions with their server-provided hrefs and parameters. Use when inspecting what Alza's live chatbot offers for a page, or before chat_send to discover the current actions. The country query field is required by the server (defaults to CZ). Read-only; no token required.

chat_sendA

Open or continue an Alza chatbot session via chatbotapi.alza.cz /v1/chat (row W18): returns the chat configuration (configId, teamName, welcomeText, messages, allowTextInput) and showChat. Use to start a support-style conversation with page context (product detail, checkout steps). Pass page_type per the 2026-09-09 capture: 1=product detail, 5=Order1, 6=Order2, 24=Order4; initial_input carries the user's first message. Session-scoped, visitor-keyed write — no account state and no token required (like web_add_to_cart). Example: chat_send({page_type: 1, initial_input: 'Is this in stock?'}).

profileA

Read the authenticated user's Alza profile: personal data, the delivery-address book with per-address HATEOAS actions (create/edit/delete/search), and account sections. Use to inspect the account, to confirm the account binding (user_id, email), and to obtain the action objects required by address_upsert, address_delete, address_search, complaint_claims, and the subscription tools. Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state. Read-only. Honest caveat: with a stale or missing token the API may still answer HTTP 200 with an anonymous shape (user_id: -1, null email) — treat user_id as the binding signal, and refresh the token via auth_start/auth_exchange if it is -1.

contactsA

Read the authenticated user's Alza contact list (mobile API v4/contacts endpoint). Use to list or search the account's saved contacts, e.g. for complaint/claim context. Do not use for the catalog category tree — that is list_categories. Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state. Read-only.

registerA

Register a new Alza account (mobile API CreateUser): submit email, phone, and password plus an optional verification code. High-impact, credential-bearing side effect: creates a real Alza account the user will have to manage. Use only with explicit user confirmation; requires a one-time token from prepare_mutation (action=register) passed as confirmation_token. Do not use to sign in an existing account — that is the auth_start/auth_exchange flow.

address_upsertA

Create or edit a delivery address on the Alza account by executing the server-provided address form action from profile (createAddressAction for create, the address's editAction for edit) with typed fields. Use when the user wants to add a new shipping address or fix an existing one. Mutating: requires a one-time token from prepare_mutation (action=address_create or address_edit); kind=edit additionally requires address_id. Side effect: persists the address to the account's address book.

address_deleteA

Delete a delivery address from the Alza account by executing the per-address delete action from the profile response. Destructive: removes the address (id=address_id) from the account's address book. Use only with explicit user confirmation, after showing which address will be deleted. Requires a one-time token from prepare_mutation (action=address_delete).

address_searchA

Search the address database (zip/city) by following the server-provided addressSearchAction from the profile response. Use to suggest a valid address before address_upsert, or to verify a zip/city combination. Pass the action object verbatim from profile — never hand-craft it. Read-only; no confirmation token required (but the profile action needs a loaded access token).

payment_methodsA

List the payment-method groups available for the current Alza account cart (mobile API getDeliveryPaymentGroups payment projection). Use after delivery_options and before order submission, to show the user payment choices and to obtain the payment_id needed by web_place_order (e.g. 103 proforma) or the mobile checkout. Requires a non-empty cart. Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state. Read-only.

after_order_paymentsA

List the after-order payment options for an unpaid order part (mobile API getafterorderpayments). Use when the user has an unpaid order (see order) and wants to pay it through the mobile API; pass the returned payment id to pay_after_order. Do not use for legacy web WCF orders — that path is web_pay_after_order (list ids via mobile_read operation=web_after_payment_dialog). Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state. Read-only.

pay_after_orderA

Execute an after-order payment on an unpaid mobile-API order (AfterOrderRequestBody: order id, invoice number, payment id from after_order_payments, optional stored-card id and device fingerprint). High-impact, money movement: requires a one-time token from prepare_mutation (action=after_order_payment) and explicit user confirmation. Do not use for legacy web WCF orders — that is web_pay_after_order. Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state.

web_pay_after_orderA

Execute the after-order payment for an unpaid legacy-web order through the live-verified EShopService.svc CreateAfterPayment chain (the recorded real-payment path: e.g. MojePlatba 144 → KB SSO gateway). Use when the user needs to pay a web-placed order that is still unpaid. First list the available payment ids via mobile_read with operation=web_after_payment_dialog (GetAfterPaymentDialog). High-impact, money movement: requires a one-time token from prepare_mutation (action=web_after_order_payment) and explicit user confirmation.

orderA

Read an authenticated user's Alza order: lines, parts, milestones/tracking, and invoice document references; with part_id, the part detail as well. Use to check order status, delivery tracking, or to collect the order/part ids needed by after_order_payments/pay_after_order. user_flag 0/1 selects the order scope exactly as the mobile app does. Requires a loaded mobile API access token — check account_status first; if none is loaded, run auth_start, have the user complete the browser sign-in, then auth_exchange with the returned code and state. Read-only.

review_submitA

Submit a product review (1–5 rating plus optional text) by executing the server-provided review form action from the product detail (writeReviewAction/onSubmitReview or the rating form). Use when the user wants to publish a review for a product they bought. Mutating: the review becomes public on the product page — requires a one-time token from prepare_mutation (action=review_submit) and explicit user confirmation. Optional values carries extra typed form fields verbatim from the form response.

complaint_claimsA

List the account's active warranty claims by following the server-provided warranty-claims action (activeWarrantyClaimsAction / showActiveWarrantyClaimsAction) from authenticated navigation or order detail. Use to show the user their open claims before filing or attaching evidence (see upload_attachment). Pass the action object verbatim — never hand-craft it. Read-only.

subscription_overviewA

Read the AlzaSubscription overview (phases, savings, trial settings) by following the server-provided subscriptionAction from the account menu or authenticated navigation. Use to show the user their subscription state before subscription_activate or subscription_update_installment. Pass the action object verbatim — never hand-craft it. Read-only.

subscription_activateA

Activate AlzaSubscription by executing the server-provided activateAction form. High-impact: starts a paid, recurring subscription — use only with explicit user confirmation after showing the terms from subscription_overview. Requires a one-time token from prepare_mutation (action=subscription_activate). Optional values carries the payment/installment fields verbatim from the form response.

subscription_update_installmentA

Change the AlzaSubscription installment plan by executing the server-provided updateInstallmentAction form. High-impact: changes the payment schedule of a paid subscription — use only with explicit user confirmation. Requires a one-time token from prepare_mutation (action=subscription_update_installment). Optional values carries the installment fields verbatim from the form response.

upload_attachmentA

Upload 1–5 image attachments (base64 data URLs, whitelisted image MIME types, max 10 MiB each) by executing the server-provided multipart action (uploadImageAction / complaint attachment actions) — typically for a warranty claim from complaint_claims. Use when the user needs to attach photos (damage, label, invoice) to a claim or complaint. Mutating: requires a one-time token from prepare_mutation (action=attachment_upload) and user confirmation. Optional values carries extra typed form fields verbatim from the form response.

web_place_orderA

Place an order through the live-verified legacy web WCF checkout pipeline (EShopService.svc: SaveOrder2 → SaveOrder3 → SaveAndConfirmOrder2 with the documented AlzaPlus 113-gate retry → CheckOrder4 → SendOrder4). This is the currently-working order-submission path — the mobile place_order (sendOrder3) returns HTTP 500 (docs/gap-analysis.md G1/G5). Typed inputs only: delivery_id/delivery_group_id from delivery_options, parcel_shop_id from web_pickup_places, payment_id from payment_methods, plus the contact/address block. High-impact, money-relevant: creates a real Alza order — use only with explicit user confirmation, with a one-time token from prepare_mutation (action=web_place_order). Example: web_place_order({delivery_id: 2680, parcel_shop_id: "1128203", payment_id: 103, name: "Jan Novák", street: "Praha 110 00", city: "Praha", zip_code: "110 00", phone: "+420 777 123 456", email: "jan@example.cz", confirmation_token: "..."}).

Prompts

Interactive templates invoked by user choice

NameDescription
find-productGuided shopping helper — describe what you're looking for and the agent will search, compare, and recommend.

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4/5.0

Scored across 41 tools

Disambiguation3/5

Many tools come in close pairs (cart/web_cart, add_to_cart/web_add_to_cart, place_order/web_place_order, pay_after_order/web_pay_after_order) and the descriptions work hard to disambiguate them, but an agent can still easily pick the wrong one — especially since the mobile checkout path is documented as broken while the web one works. The generic mobile_read escape hatch also overlaps with several typed tools. On the other hand, the intent of most tools is clear from the descriptions.

Naming Consistency3/5

There is a loose verb_noun pattern (search_products, get_product, list_categories) but many read tools are bare nouns (cart, profile, order, contacts) and the web_ prefix is applied inconsistently (web_cart noun vs web_place_order verb). The pair after_order_payments vs pay_after_order and web_pay_after_order breaks the expected verb-first ordering. Mixed but still readable.

Tool Count2/5

41 tools is a heavy surface for an e-commerce server, even a broad one. Several tools exist as workarounds or generic escape hatches (mobile_read, prepare_mutation, mutate_list) and there are duplicated mobile/web checkout paths that could have been consolidated. This exceeds the comfortable range and will burden an agent with selection overhead.

Completeness4/5

The domain is covered extensively: discovery, product details, reviews, categories, pickup points, auth, cart, checkout, payments, orders, profile, addresses, registration, subscriptions, complaints, and chat. Notable gaps remain — notably no cart-removal tool (explicitly acknowledged) and no order cancellation or return flow — but agents can accomplish the main shopping journey.

Maintenance

ActivityMaintained
ResponsivenessNo issues