Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Okala

PYPI · OKALA-MCP

Unofficial read-only Okala: grocery stores that deliver to you, compare prices across stores.

Available components

−15 this week 64 Trust /100

Last scanned (12 hours ago)

Scores higher than 63% of PyPI servers

Category E-commerce

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security50
  • Malware scan not yet available for this package.Unverified
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • 1 of 35 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to sepehr071/okala-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 0 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability64
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 3083 tokens (~192/item across 16 items; 16 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability check failed: the tool surface changed between 0.1.2 and 0.3.1: 0 tool removals, 16 breaking changes, 0 additions. See how to fix → Fail
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 22 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
    • Package version: 0.3.0 → 0.3.1 functional
  • 19 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
    • Package version: 0.1.2 → 0.3.0 functional
  • 18 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
    • Package version: 0.2.0 → 0.3.0 functional
  • 16 Oct 26 0
    • Stability: unverified → fail ▼ security
    • Tool safety: pass → unverified ▼ security
    • Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. security
    • Capabilities: pass → unverified ▼ functional
    • Tool coverage: 100 → unverified ▼ functional
    • Schema quality: excellent → good functional
    • Package version: 0.1.2 → 0.2.0 functional
  • 14 Oct 26 +30
    • Injection markers: unverified → pass ▲ security
    • First check of Judged manipulation: pass security
    • Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
    • Tool coverage: unverified → 100 ▲ functional
    • MCP protocol: unverified → pass ▲ functional
    • First check of Schema quality: fail functional
    • First check of Schema quality: excellent functional
    • First check of Schema quality: fail functional
    • First check of Destructive annotations: 100 functional
    • First check of Tool coverage: 100 functional
    • First check of Tool coverage: 100 functional
  • 13 Oct 26 0
    • Malware scan: pass → unverified ▼ security
    • Package version: 0.1.1 → 0.1.2 functional
  • 12 Oct 26 49

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 22 Oct 2026 · Analysed pypi/okala-mcp@0.3.1

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo sepehr071/okala-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/sepehr071/okala-mcp/.github/workflows/publish.yml@refs/tags/v0.3.1
Rekor log index 3390409690
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:4a6aa69a4e417049590fa9ea8e8a3a64199130b7d1802ec0ffc8cb4eef11f564

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted hatchling.build

Background: Why install scripts are a supply-chain risk →

Dependencies 35 packages
Packages resolved 35
No linked repository 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 16 exposed · ~2,412 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
ok_account ~50

Whether the server is logged in to Okala (and as which phone, masked). Logged in = ok_search uses Okala's text search; guest = category matching. To log in: ok_login.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

ok_brands ~103

Brand ids for ok_compare (`brand_id`) and slugs. Okala publishes only a short list of featured brands; any other brand is looked up by its Latin slug (as in okala.com/brands/<slug>; ok_product returns brand_slug, ok_search returns the brands of its results with ids).

NameTypeReqDescription
name––Brand name in Persian or Latin, or its slug, e.g. 'کاله', 'kalleh', 'mihan'.

No output schema declared.

No examples provided.

ok_categories ~162

Category tree (id, slug, Persian name, children) of everything sold near a point, or in one store. Use to find the slug for ok_compare / ok_store_products when ok_search's guess is off, or to show what a store sells. Level-1 slugs (departments, e.g. 'dairy-products') work in ok_store_products.

NameTypeReqDescription
depthinteger–Levels to return: 1 departments, 2 + sub-categories, 3 all.
lat––Latitude from ok_locate, e.g. 35.7372.
lon––Longitude from ok_locate, e.g. 51.4154.
store_id––Instead of a point: one store's categories.

No output schema declared.

No examples provided.

ok_compare ~220

Which open nearby store sells the same product cheapest: a category and/or brand from every store, grouped by product id, each store's price cheapest first; products sold by most stores come first. `stores` has each store's distance, earliest slot and fees (true cost = items + fees; the minimum order applies, see ok_store). At most 12 products per store: narrow with a deeper slug or brand_id.

NameTypeReqDescription
brand_id––Brand id from ok_brands / ok_search (e.g. 1 = Kalleh); with a slug = that brand in the category.
category_slug––Category slug from ok_search / ok_categories, e.g. 'milk'.
in_stock_onlyboolean–Only products that can be ordered now.
latnumberyesLatitude from ok_locate, e.g. 35.7372.
limitinteger–Max products to return.
lonnumberyesLongitude from ok_locate, e.g. 51.4154.

No output schema declared.

No examples provided.

ok_deals ~150

Deal rows running now, with their end time (UTC) and top products (Toman, discount, store). Without store_id: the home-page rows across every open store that delivers to the point. With store_id: that store's rows plus its biggest discounts. Open a whole row with ok_offer(carousel_id).

NameTypeReqDescription
latnumberyesLatitude from ok_locate, e.g. 35.7372.
lonnumberyesLongitude from ok_locate, e.g. 51.4154.
per_rowinteger–Products to show per deal row.
store_id––Store id from ok_stores, e.g. 11009.

No output schema declared.

No examples provided.

ok_locate ~130

Turn an address into coordinates (lat, lon) for every other tool, plus the street address of the best hit. Use first when the user gives an address or place name; then pass the chosen candidate's lat / lon to ok_stores, ok_search, ok_compare or ok_deals. Candidates can mix similar names: check `description`.

NameTypeReqDescription
addressstringyesAddress or place in Persian, e.g. 'میدان ونک' or 'یوسف آباد'.
citystring–City name in Persian, e.g. 'تهران', 'مشهد'.

No output schema declared.

No examples provided.

ok_login ~160

Log in to the user's Okala account, which unlocks Okala's real text search in ok_search (brands and product names, inside one store too). Optional: every other tool works as a guest. Only call this when the user asked to log in and gave THEIR OWN phone number. It sends an SMS code to that number (at most one every 2 minutes). If the client can show a form, the user types the code there and the login finishes in this call. Otherwise the reply says `code_sent`: ask the user for the code and call ok_login_verify. Nothing is ordered or changed in the account.

NameTypeReqDescription
phonestringyesThe user's Iranian mobile number, e.g. '09121234567'.

No output schema declared.

No examples provided.

ok_login_verify ~86

Finish a login started with ok_login: the code the user received by SMS. Saves the login on this machine (it refreshes itself); afterwards ok_search uses Okala's text search.

NameTypeReqDescription
codestringyesThe SMS code, e.g. '12345'.
phonestringyesThe user's Iranian mobile number, e.g. '09121234567'.

No output schema declared.

No examples provided.

ok_logout ~25

Delete the saved Okala login on this machine; the server continues as a guest.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

ok_offer ~182

Every product of one deal row (from ok_deals), Toman. Without store_id: across all open stores that deliver to the point, with each store's product count and price range; with store_id: that store only.

NameTypeReqDescription
carousel_idintegeryesDeal row id (carousel_id) from ok_deals.
latnumberyesLatitude from ok_locate, e.g. 35.7372.
lonnumberyesLongitude from ok_locate, e.g. 51.4154.
pageinteger–Page number, from 1 (20 products per page).
sortstring–default (row order), cheapest / most_expensive (price to pay), discount (biggest % off).
store_id––Store id from ok_stores, e.g. 11009.

No output schema declared.

No examples provided.

ok_product ~132

One product in one store: price and discount (Toman), stock, max per order, brand, category, images and description. `sold_here: false` = this store does not sell it (try ok_compare). The product id is the same in every store; the price and stock are per store.

NameTypeReqDescription
full_textboolean–Return the whole description (default: cut at 600 characters).
product_idintegeryesProduct id from any list, e.g. 269658.
store_idintegeryesStore id from ok_stores, e.g. 11009.

No output schema declared.

No examples provided.

ok_search ~244

Find products by text near a point (or in one store with store_id), best matches first, then cheapest (Toman). `mode`: "text" = Okala's own search (logged in; brands and product names too, up to 12 per store); "category" = guest fallback matching the query to nearby category names (a pure brand name may find nothing: pick a slug from ok_categories; store_id needs login, else use ok_store_products with name_contains). Use for "how much is X near me". Then: ok_compare (several stores, with fees), ok_product (one store).

NameTypeReqDescription
lat––Latitude from ok_locate, e.g. 35.7372.
limitinteger–Max products to return.
lon––Longitude from ok_locate, e.g. 51.4154.
querystringyesWhat to buy, in Persian, e.g. 'شیر کم چرب', 'پنیر لیقوان', 'تن ماهی'.
store_id––Search inside this store only (needs login), e.g. 11009.

No output schema declared.

No examples provided.

ok_store ~166

One store as seen from the delivery point: whether it delivers there now, minimum order (Toman), rating, distance and location, the earliest slot, and every still-open delivery slot of the next days (Tehran local time). Use before recommending a store: the basket must reach `minimum_order`. Fees per order are in ok_stores; written reviews in ok_store_reviews.

NameTypeReqDescription
all_slotsboolean–Also list full slots with an available flag.
latnumberyesLatitude from ok_locate, e.g. 35.7372.
lonnumberyesLongitude from ok_locate, e.g. 51.4154.
store_idintegeryesStore id from ok_stores, e.g. 11009.

No output schema declared.

No examples provided.

ok_store_products ~236

A whole category of one store (the API returns all of it at once), sorted and optionally filtered by name, prices in Toman. `total` counts the matches before limit / offset. This is the way to search inside one store: pass a level-1 department slug (ok_categories with store_id, e.g. 'dairy-products') plus name_contains. Details of one product: ok_product.

NameTypeReqDescription
category_slugstringyesCategory slug (latinName) from ok_categories / ok_search, e.g. 'milk', 'dairy-products'.
in_stock_onlyboolean–Only products that can be ordered now.
limitinteger–Max products to return.
name_contains––Keep only products whose name contains every word, e.g. 'کم چرب'.
offsetinteger–Skip this many matches (paging).
sortstring–cheapest / most_expensive (price to pay), discount (biggest % off), default (site ranking).
store_idintegeryesStore id from ok_stores, e.g. 11009.

No output schema declared.

No examples provided.

ok_store_reviews ~160

Read customers' reviews of a store: 1-5 stars, comment, date and the reasons they ticked (liked: product variety, ...; disliked: expiry date problems, ...). Use as a quality check before recommending a store; LowestRate shows the complaints first. The average rating and rating count are in ok_stores / ok_store.

NameTypeReqDescription
full_textboolean–Return whole comments (default: cut at 400 characters).
pageinteger–Page number, from 1.
page_sizeinteger–Reviews per page.
sortstring–Newest first, or by star rating.
store_idintegeryesStore id from ok_stores, e.g. 11009.

No output schema declared.

No examples provided.

ok_stores ~206

Okala stores that deliver to a point, in the site's order: id, type, rating, distance, earliest slot and the fees added to every order (service, packaging, delivery; Toman). Use after ok_locate. Pass store ids to ok_store (minimum order, slots), ok_store_products, ok_product and ok_deals; to compare one product across stores use ok_compare. `count` = matches before `limit`.

NameTypeReqDescription
latnumberyesLatitude from ok_locate, e.g. 35.7372.
limitinteger–Max stores to return, in the site's order.
lonnumberyesLongitude from ok_locate, e.g. 51.4154.
open_onlyboolean–Leave out stores that are closed / cannot deliver now.
store_type––Only one kind: SuperMarket, Bakery, FruitMarket, ChainStore (Ofogh, HyperFamily) or Opack.

No output schema declared.

No examples provided.

Install

How do I install the Okala MCP server?

Okala runs locally as a PyPI package, launched with uvx okala-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · okala-mcp

# add to Claude Code
claude mcp add sepehr071-okala-mcp -- uvx okala-mcp
Common questions

What is the Okala MCP server?

Okala is an MCP server listed in the public MCP registry as io.github.sepehr071/okala-mcp. Unofficial read-only Okala: grocery stores that deliver to you, compare prices across stores. This page covers its PyPI package (okala-mcp).

Is the Okala MCP server safe to use?

Okala scores 64 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 22 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Okala MCP server expose?

Okala exposes 16 tools: ok_login, ok_login_verify, ok_account, ok_logout, ok_locate, and 11 more. Their descriptions and schemas cost roughly 2,412 tokens of context every time the server is loaded.

Is the Okala MCP server still maintained?

Okala is still listed as active in the MCP registry. We last reached this channel on 22 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Okala MCP server under?

Okala declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.