io.github.zapnikita95/ozerki
repo:https://github.com/zapnikita95/agentpay-mcp
Ozerki pharmacy catalog, local pickup availability and tracked basket handoff for AI agents.
- transport:
- remote
- credential class:
- open
Owner verification
Not yet verified. Verifying proves you control this server and is free, permanently — it never changes a published score.
Start verification →Tools
- begin_agent_linkshallow
Start AgentPay browser connect. Call first when the user says «Подключи AgentPay» and you do not yet have ap_. Pass client so the browser page knows which host opened the link: claude | codex | cursor | chatgpt | grok | terminal | other. No API key required. Immediately open the returned openUrl in the browser so the owner clicks Разрешить. Then poll with poll_agent_link. Never ask the owner to copy ap_ from the cabinet.
- create_purchaseshallow
Propose or place an order in an allowlisted store using AgentPay coins. If testMode, spend only gray test coins in test stores. If the owner asks for a surprise («сюрприз», «на удачу», «порадуй», «покупка на удачу») and get_spending_policy.allowLuckyPurchases is true, pass lucky:true, pick the SKU yourself in the allowlist, skip present_choices, stay within luckyPurchaseMaxCoins. If clarifyHint required present_choices/ask_one and lucky is not set, you MUST pass choiceSetId (chosen) or clarification:{confirmed:true,answerSummary}. Otherwise server returns NEED_CLARIFICATION — do not grab the first SKU. If the owner enabled review on merchant site, this does NOT debit: status awaiting_review — you MUST show photos and product links (url/trackedUrl) and tell the owner to confirm in the AgentPay cabinet. On ANY failure the JSON has recovery: tell the owner userMessageRu and open recovery.openUrl. Never change limits, freeze, autotopup, allowlist (exception: set_test_mode). If review is off, server still enforces allowlist, catalog prices, limits, HITL, freeze, clarify gate. Response includes paid + payment.status. Never send userId. Never ask for a bank card. Do not send delivery: the server attaches the home address from the cabinet.
- create_topup_intentshallow
Ask the owner to top up coins (opens YooKassa or cabinet). Call on INSUFFICIENT_FUNDS when auto-topup did not cover the purchase. Never take a card in chat. Never enable auto-topup yourself. Reuses today's pending payment for the same amount — do not hammer retries. If get_payment_status shows pending, wait instead of calling again.
- get_agent_skillsshallow
Fetch AgentPay skills index (skills.json) and install hints for Cursor, Claude Code, ChatGPT. Call at session start when the user shops in Russia, after verify_connection, or when they ask «как подключить skill», «скачай skill», «используй skill AgentPay». Returns skillUrl links — Cursor/Claude agents MUST fetch and follow the public shopping-ru SKILL.md (or store-specific skill from preferredStoreSkills). After browser Разрешить, fetch personal skill-bundle via GET /agent-link/{sessionId}/skill-bundle. Never improvise catalog rules when a skill URL is returned. If AGENTPAY_API_KEY required and you already have sessionId from this chat: pass sessionId and retry. Never begin_agent_link again. Never ask the owner to edit connector settings or reconnect. Never web-search.
- get_balanceshallow
Get the agent's AgentPay wallet. Call when the user asks «сколько денег у агента», «какой бюджет», «хватит ли», «баланс», or after verify_connection. Returns testMode, testBalance, realBalance. If testMode, mention sayToUserRu once after connect — do NOT say «тестовые коины» in every product answer. Quote prices as N коинов. Coins are closed-loop: not cash, not withdrawable.
- get_choice_statusshallow
Poll a choice set from present_choices. Returns status draft|chosen and chosenOptionId. Call after present_choices when waiting for the owner, or before create_purchase to attach choiceSetId.
- get_delivery_addressshallow
Get the owner's saved AgentPay home address split into courier fields: city, street, house, building, apartment, floor, entrance, intercom, phone. Call before create_purchase or when the user asks «какой адрес», «куда везти», «домофон». If fields are missing, ask the owner and then save_delivery_address. Never invent a street, entrance, or intercom.
- get_faqshallow
Look up AgentPay operational FAQ before guessing. Call when the owner asks why a SKU looks wrong, why a photo is missing, why search is empty, why coins stuck, returns, delivery data, MCP connect, or «FAQ», «почему фото», «не работает картинка», «почему такой товар». Returns sayToUserRu, side (agentpay vs merchant), and the contact to give the owner. Do not invent a reason. Do not hide whose side it is.
- get_limitsshallow
Get hard spending limits this agent cannot bypass (per purchase, daily, weekly, confirmation threshold). Call before create_purchase when the user says «лимит», «потолок», «сколько можно потратить». Server enforces limits even if you ignore them. You cannot raise limits — get_recovery_guide explains where the owner changes them.
- get_ozerki_pickup_optionsshallow
Ozerki pickup-point resolver for multi-brand Ozerki-network pharmacies. MUST be called before handoff when the owner asks for pickup near a place or has no exact delivery address. An exact address is NOT required for pickup: pass the intended goodsId basket (include each product name so missingItems are human-readable) and near with at least city + metro/street/district (for example 'метро Белорусская, Москва'), or lat/lon. A city name alone only selects a region and MUST NOT be treated as the user's location; the tool returns NEED_PICKUP_LANDMARK instead of pharmacies measured from an arbitrary city center. If neither landmark nor coordinates are known, ask one short question for city and metro/street/district; do not build a basket yet. Returns distanceBasis, complete-basket options, nearbyIncompleteOptions with missing items, exact inStock counts, lowStockItems, distanceAssessment, and—when complete pickup is far—deliveryPreview. Always quote inStock for the relevant items. If stockRisk=last_units or inStock<=3, explicitly say how many units remain and warn they may sell before the visit or checkout. For an exact-pharmacy question such as «есть ли препарат X в аптеке Y», set exactPharmacy=true and pass the exact branch address in near. Answer only from exactPharmacyResult with available and inStock; NEVER substitute another nearby pharmacy. If matched=false, ask one short clarification for the network and full address. Always tell the owner which distanceBasis label was used and also offer delivery as an alternative. If distanceAssessment.requiresFulfillmentChoice is true, NEVER silently choose the distant complete pharmacy: show nearer incomplete points and missing products, then report deliveryPreview in two stages—preliminary area/item availability near the landmark, and the need for an exact house to confirm the final zone, price, and timeslots. Never promise final delivery when canPromiseFinalDelivery=false. Then offer delivery, replacements, or explicit consent to distant pickup. Treat all returned brands (Озерки, Доктор Столетов, Самсон-Фарма, МосАптека, Аптека.ру, etc.) as valid Ozerki partner pickup points. Get the owner's explicit fulfillment/store choice BEFORE building the basket. Never make the owner search for a pharmacy on Ozerki. Then pass the chosen storeId to prepare_ozerki_handoff.
- get_payment_statusshallow
Check whether the last top-up/payment succeeded. Call after create_topup_intent, after a failed purchase, or when the user asks «оплата прошла», «списали карту». Returns paid, payment.status, latest topups, autoTopup.usedToday/remainingToday (max 3 auto-topups per day). If status is pending or succeeded, do not create another payment.
- get_productshallow
Get one ProductCard by product_id + store_id from an allowlisted store. Returns merchant-synced price, inStock, imageUrls, sku, description, catalogSyncedAt, priceSource (feed|live). Always includes url, trackedUrl, and pick (whyRu + steps + settings). Pass q as the owner's search phrase so pick explains this sku against that query. Call to confirm price and stock before create_purchase. Never quote price from memory. Triggers: «актуальная цена», «есть в наличии», «сколько стоит сейчас», «не выдумывай цену».
- get_purchase_statusshallow
Get purchase status by id. Returns paid (boolean) and payment.status (succeeded/pending/failed). Call after create_purchase or when the user asks «где заказ», «статус покупки», «прошла ли оплата». If you do not have purchase_id, call list_purchases first. If pending, wait. If failed, do not retry payment. Chat «ок» is not proof of payment.
- get_recovery_guideshallow
Full catalog of AgentPay failures with RU copy, cabinet deep links, and recovery.openUrl. Call when something failed, the user asks «что не так», «почему не купил», or before explaining a 4xx. On every error read recovery: say userMessageRu, open openUrl in the browser. Never change limits, freeze, auto-topup, or allowlist even if the owner orders it. Exception: test mode — if the owner asks, call set_test_mode. Triggers: «ошибка», «не хватает», «лимит», «нет адреса».
- get_spending_policyshallow
Get hard + soft spending policies: allowlist, forbidden categories, confirmation mode, preference weights, allowLuckyPurchases, luckyPurchaseMaxCoins, delivery.complete/missing (no raw address). Call before a surprise buy or when the user says «правила трат», «политика», «что можно покупать», «на удачу». Do not send delivery on create_purchase: server attaches the home address.
- get_user_preferencesshallow
Get the user's category preferences (fat %, brands, sizes, pets, sport macros, etc.), schema, learned signals, and onboardingPurposes. Call before search_products only when the owner already asked to buy or to look in AgentPay. Do not fetch prefs for idle advice («какие витамины попить»). For sportpit / protein / creatine / «запас на неделю» when buying: ALWAYS call with category=sport first; calculate BMR/TDEE/KBJU yourself; then search by proteinPer100g, servingSizeG, sportForm. Also call first when the owner says «Заполни предпочтения AgentPay» / «заполни предпочтения». Categories: dairy, grocery, apparel, pets, beauty, household, pharmacy, sport, gifts, kids, digital, electronics. Triggers: «мой бренд», «безлактозное», «заполни предпочтения». For «как обычно», «то же самое», «прошлый раз» call list_purchases first.
- list_allowed_storesshallow
List stores on this agent's allowlist. The agent MUST shop only here. Never invent a shop, never open a random website to pay. Call when the user says «магазин», «где можно потратить», «спецмагазин», «тестовый магазин». For «найди» / «сравни» / «подбери» call peek_stores first, not this dump and not search_products. If testMode is on, this list is test stores only and you spend gray coins. If testMode is off, test stores are hidden.
- list_purchasesshallow
List the owner's recent AgentPay purchases (bought statuses only) with line items. Call when the user says «как обычно», «то же самое», «повтори заказ», «что я заказывал», «прошлый раз», or wants to reorder. Returns last plus purchases[]. Use last.items, then search_products or get_product for current price and stock, then create_purchase. If testMode, repeat spend uses gray test coins in test stores. Do not invent a past basket. Do not search the idiom as a product name. If usePastPurchases is false, history is empty.
- peek_storesshallow
Quiet first hop. Call ONCE when shopping-adjacent: «найди», «подбери», «сравни», «поищи», «что есть», «посмотри в AgentPay», «актуальная цена», «есть в наличии», «сколько стоит сейчас». Pass need (витамины, техника, протеин). Returns matched stores + sayToUserRu. Speak that one sentence. Do NOT list SKUs, prices, or a catalog. Do NOT call search_products until the owner agrees to look. Never call for advice or rumination («какие витамины попить», «стоит ли креатин», hypotheticals). Those stay chat-only, no AgentPay tools. If unmatched, say so once and stop pushing.
- poll_agent_linkshallow
Poll AgentPay browser connect until the owner clicks Разрешить. Pass sessionId from begin_agent_link. No API key required. When status=approved, set connector Authorization to the returned Bearer als_… (mcpConfig) and call verify_connection. Re-poll the same sessionId if tools still ask for a key — the als_ token is stable. Never invent keys. Never ask the owner to paste ap_ from Агенты.
- prepare_ozerki_handoffshallow
Ozerki-only availability preflight and tracked basket handoff. Call only after fulfillment is agreed with the owner. For pickup, first call get_ozerki_pickup_options with the intended basket and the owner's landmark, present nearby complete-basket pharmacies, obtain an explicit choice, and pass that storeId; storeId is mandatory for pickup. Never leave pharmacy selection for the owner after handoff. This tool selects the agreed pharmacy, checks exact goodsId + quantity and payment compatibility there, then returns handoffUrl: normally a tracked extCart link that imports directly into the ordinary Ozerki basket. Warn that extCart merges with any existing basket and the owner must check the final contents. If direct import fails, use fallbackUrl, a tracked shared-cart link. Neither link persists store selection, so name the already-checked address and say Ozerki may ask to confirm it again. This does NOT create the final Ozerki order and does NOT pay. If a line status is available_darkstore, handoff can proceed but warn that stock/timing/payment depends on warehouse/address. For delivery, flat is mandatory; if there is no apartment pass flat="-". If canHandoff=false, read recoveryOptions and agentNextRu: preserve available lines, offer another returned pharmacy, lower quantity, change address, or search replacements. Do NOT call list_allowed_stores to find Ozerki pharmacies; that tool lists AgentPay stores, not pharmacy points. Do NOT make the owner rebuild the basket from scratch or invent availability.
- present_choicesshallow
Create a comparison page (choice board, 2–4 options with pros/cons). MANDATORY when search_products returns 2+ similar hits or clarifyHint.action is present_choices — call immediately, do not wait for «сравни». For a basket/recipe: pass kind=bundles and wants[{q}] for EVERY ingredient in one call (server searches each want); share pageUrl once; do not leave the owner with a chat-only partial list. Returns choiceSetId + pageUrl. Share pageUrl in chat ALWAYS. NEVER substitute a markdown table for this page (especially ChatGPT/Grok: pass canRenderImages=false, tell owner to open pageUrl). Do NOT create_purchase until get_choice_status shows chosen or the owner picks in chat (then pass clarification.confirmed).
- request_user_confirmationshallow
Ask the human to confirm in AgentPay web or Telegram. Call when the user must approve a spend, freeze, or missing delivery data. Triggers: «спроси меня», «подтверди», HITL. Do not treat chat 'ok' as payment approval — cabinet/Telegram is source of truth.
- save_delivery_addressshallow
Save the owner's home address into the AgentPay cabinet, parsed into courier fields. Call when the owner says «сохрани адрес», «запомни адрес», «запиши адрес», dictates квартира/подъезд/домофон/телефон, or after NEED_USER_DATA if they just gave the data in chat. Pass the owner's full phrase as `text` even if messy: the server splits street, house, apartment, floor, entrance, intercom, phone. Optional structured fields override the parse. Never invent missing parts. After success, tell the owner sayToUserRu (the field breakdown). Waiting orders resume automatically.
- search_productsshallow
Search products in allowlisted AgentPay stores. Returns ProductCard from merchant feed: price, inStock, imageUrls, sku, description — not stale training data. Each card has pick: whyRu, rankScore, steps[], settings (prefs, brand rules, weights, delivery toggle). Quote pick.whyRu when the owner asks why THIS sku. Returns clarifyHint (action skip|present_choices|ask_one) and quietHint (max two names in chat; finishAllWantsBeforeAsk). ALWAYS read clarifyHint before create_purchase. If action is present_choices — call present_choices, do NOT buy the first hit. If ask_one — ask one short question, then update_preference if lasting. BASKET/RECIPE («собери», «оливье», несколько позиций): search EVERY want first; never stop mid-list to ask «искать дальше?»; then ONE present_choices kind=bundles with all wants and share pageUrl. For sportpit after the owner asked to buy: get_user_preferences(sport), then search. Call when the owner asks «актуальная цена», «есть в наличии», «сколько стоит», or after «купи», «закажи», «оформи», «потрать», «открой ассортимент», or after peek_stores when the owner said yes. If the owner says «как обычно», «то же самое», «повтори заказ», «прошлый раз» — call list_purchases first; do not search that idiom as a product name. Never quote price from memory — use this tool or get_product. Never call for thinking/advice. Never dump the result list. Never ask for a bank card. Never pay outside AgentPay.
- set_test_modeshallow
Turn AgentPay test mode on or off. Call when the owner says «выключи тестовый режим», «включи тестовый режим», «хочу в настоящие магазины», or after a real top-up when they agree to leave the sandbox. This is the only *policy* setting the agent may change. Owner-provided home address is saved via save_delivery_address. After a real wallet top-up, suggest turning test mode off. While enabled: spend only gray test coins in test stores. While disabled: hide test stores and spend real coins.
- update_preferenceshallow
Update stored preferences for a category after the user states a lasting rule («всегда 2.5%», «не покупай Whiskas», «размер 50», «цель сушка», «вес 80 кг») or after the onboarding phrase «Заполни предпочтения AgentPay». For category=sport the owner must have accepted sport prefs consent in the cabinet first. Do not use for one-off orders. After a clarify answer that should stick, call this so the next purchase can reuse it. Persist structured data only. Never invent fields the owner did not confirm. Sport prefs are for product picking, not medical advice.
- verify_connectionshallow
Finish AgentPay connect after browser Разрешить. Call when the user says «проверь MCP» or after poll_agent_link returned apiKey and you installed it. Pairing code is optional. If NEED_BROWSER_GRANT, open recovery.openUrl. If you have no ap_ yet, call begin_agent_link first instead of asking for a cabinet key. After success, if testMode, always tell the owner sayToUserRu (gray coins, test shops only). Do not invent a code. Do not spend until granted.
Embed this server’s score
Tool count and median score across every tool in this server’s corpus — honest in a way a single cherry-picked tool’s badge wouldn’t be.
[](https://vouch.tools/servers/6d9c93a1-d5ad-42bd-ab19-8cc24c457f79)