Okala
PYPI · OKALA-MCP
Unofficial read-only Okala: grocery stores that deliver to you, compare prices across stores.
Available components
Last scanned (12 hours ago)
Scores higher than 63% of PyPI servers
Category E-commerce
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
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.
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 →
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 →
ok_account Okala login status ~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 Find 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).
| Name | Type | Req | Description |
|---|---|---|---|
| name | – | – | Brand name in Persian or Latin, or its slug, e.g. 'کاله', 'kalleh', 'mihan'. |
No output schema declared.
No examples provided.
ok_categories Category tree ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| depth | integer | – | 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 Compare prices across stores ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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_only | boolean | – | Only products that can be ordered now. |
| lat | number | yes | Latitude from ok_locate, e.g. 35.7372. |
| limit | integer | – | Max products to return. |
| lon | number | yes | Longitude from ok_locate, e.g. 51.4154. |
No output schema declared.
No examples provided.
ok_deals Current 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).
| Name | Type | Req | Description |
|---|---|---|---|
| lat | number | yes | Latitude from ok_locate, e.g. 35.7372. |
| lon | number | yes | Longitude from ok_locate, e.g. 51.4154. |
| per_row | integer | – | 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 Find a delivery address ~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`.
| Name | Type | Req | Description |
|---|---|---|---|
| address | string | yes | Address or place in Persian, e.g. 'میدان ونک' or 'یوسف آباد'. |
| city | string | – | City name in Persian, e.g. 'تهران', 'مشهد'. |
No output schema declared.
No examples provided.
ok_login Log in to Okala (sends an SMS code) ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| phone | string | yes | The user's Iranian mobile number, e.g. '09121234567'. |
No output schema declared.
No examples provided.
ok_login_verify Finish the Okala login ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | The SMS code, e.g. '12345'. |
| phone | string | yes | The user's Iranian mobile number, e.g. '09121234567'. |
No output schema declared.
No examples provided.
ok_logout Log out of Okala ~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 One deal row in full ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| carousel_id | integer | yes | Deal row id (carousel_id) from ok_deals. |
| lat | number | yes | Latitude from ok_locate, e.g. 35.7372. |
| lon | number | yes | Longitude from ok_locate, e.g. 51.4154. |
| page | integer | – | Page number, from 1 (20 products per page). |
| sort | string | – | 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 Product details in a store ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| full_text | boolean | – | Return the whole description (default: cut at 600 characters). |
| product_id | integer | yes | Product id from any list, e.g. 269658. |
| store_id | integer | yes | Store id from ok_stores, e.g. 11009. |
No output schema declared.
No examples provided.
ok_search Search products near a point ~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).
| Name | Type | Req | Description |
|---|---|---|---|
| lat | – | – | Latitude from ok_locate, e.g. 35.7372. |
| limit | integer | – | Max products to return. |
| lon | – | – | Longitude from ok_locate, e.g. 51.4154. |
| query | string | yes | What 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 Store details and delivery slots ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| all_slots | boolean | – | Also list full slots with an available flag. |
| lat | number | yes | Latitude from ok_locate, e.g. 35.7372. |
| lon | number | yes | Longitude from ok_locate, e.g. 51.4154. |
| store_id | integer | yes | Store id from ok_stores, e.g. 11009. |
No output schema declared.
No examples provided.
ok_store_products Products of one store ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| category_slug | string | yes | Category slug (latinName) from ok_categories / ok_search, e.g. 'milk', 'dairy-products'. |
| in_stock_only | boolean | – | Only products that can be ordered now. |
| limit | integer | – | Max products to return. |
| name_contains | – | – | Keep only products whose name contains every word, e.g. 'کم چرب'. |
| offset | integer | – | Skip this many matches (paging). |
| sort | string | – | cheapest / most_expensive (price to pay), discount (biggest % off), default (site ranking). |
| store_id | integer | yes | Store id from ok_stores, e.g. 11009. |
No output schema declared.
No examples provided.
ok_store_reviews 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.
| Name | Type | Req | Description |
|---|---|---|---|
| full_text | boolean | – | Return whole comments (default: cut at 400 characters). |
| page | integer | – | Page number, from 1. |
| page_size | integer | – | Reviews per page. |
| sort | string | – | Newest first, or by star rating. |
| store_id | integer | yes | Store id from ok_stores, e.g. 11009. |
No output schema declared.
No examples provided.
ok_stores Stores that deliver to a point ~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`.
| Name | Type | Req | Description |
|---|---|---|---|
| lat | number | yes | Latitude from ok_locate, e.g. 35.7372. |
| limit | integer | – | Max stores to return, in the site's order. |
| lon | number | yes | Longitude from ok_locate, e.g. 51.4154. |
| open_only | boolean | – | 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.
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
claude mcp add sepehr071-okala-mcp -- uvx okala-mcp
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.