technolife-mcp 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. technolife_mcp-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +42 -0
  2. technolife_mcp-0.1.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. technolife_mcp-0.1.0/.github/dependabot.yml +10 -0
  4. technolife_mcp-0.1.0/.github/workflows/ci.yml +21 -0
  5. technolife_mcp-0.1.0/.github/workflows/publish.yml +51 -0
  6. technolife_mcp-0.1.0/.gitignore +6 -0
  7. technolife_mcp-0.1.0/LICENSE +21 -0
  8. technolife_mcp-0.1.0/PKG-INFO +320 -0
  9. technolife_mcp-0.1.0/README.md +296 -0
  10. technolife_mcp-0.1.0/pyproject.toml +52 -0
  11. technolife_mcp-0.1.0/server.json +32 -0
  12. technolife_mcp-0.1.0/src/technolife_mcp/__init__.py +5 -0
  13. technolife_mcp-0.1.0/src/technolife_mcp/catalog.py +219 -0
  14. technolife_mcp-0.1.0/src/technolife_mcp/http.py +132 -0
  15. technolife_mcp-0.1.0/src/technolife_mcp/info.py +194 -0
  16. technolife_mcp-0.1.0/src/technolife_mcp/offers.py +214 -0
  17. technolife_mcp-0.1.0/src/technolife_mcp/product.py +351 -0
  18. technolife_mcp-0.1.0/src/technolife_mcp/registry.py +16 -0
  19. technolife_mcp-0.1.0/src/technolife_mcp/search.py +282 -0
  20. technolife_mcp-0.1.0/src/technolife_mcp/server.py +55 -0
  21. technolife_mcp-0.1.0/tests/conftest.py +89 -0
  22. technolife_mcp-0.1.0/tests/fixtures/basket.json +33 -0
  23. technolife_mcp-0.1.0/tests/fixtures/comments.json +65 -0
  24. technolife_mcp-0.1.0/tests/fixtures/compare.json +72 -0
  25. technolife_mcp-0.1.0/tests/fixtures/faq_search.json +10 -0
  26. technolife_mcp-0.1.0/tests/fixtures/home.json +206 -0
  27. technolife_mcp-0.1.0/tests/fixtures/landing.json +132 -0
  28. technolife_mcp-0.1.0/tests/fixtures/map_forward.json +109 -0
  29. technolife_mcp-0.1.0/tests/fixtures/map_reverse.json +48 -0
  30. technolife_mcp-0.1.0/tests/fixtures/menu_filters.json +79 -0
  31. technolife_mcp-0.1.0/tests/fixtures/menu_products.json +69 -0
  32. technolife_mcp-0.1.0/tests/fixtures/navbar.json +102 -0
  33. technolife_mcp-0.1.0/tests/fixtures/product_page.json +186 -0
  34. technolife_mcp-0.1.0/tests/fixtures/review_summary.json +17 -0
  35. technolife_mcp-0.1.0/tests/fixtures/search_cheapest_p0.json +105 -0
  36. technolife_mcp-0.1.0/tests/fixtures/search_cheapest_p1.json +117 -0
  37. technolife_mcp-0.1.0/tests/fixtures/search_results.json +129 -0
  38. technolife_mcp-0.1.0/tests/fixtures/search_suggest.json +21 -0
  39. technolife_mcp-0.1.0/tests/fixtures/seller.json +59 -0
  40. technolife_mcp-0.1.0/tests/fixtures/shop_reviews.json +36 -0
  41. technolife_mcp-0.1.0/tests/fixtures/similar_brands.json +12 -0
  42. technolife_mcp-0.1.0/tests/fixtures/special_products.json +81 -0
  43. technolife_mcp-0.1.0/tests/fixtures/static_page.json +13 -0
  44. technolife_mcp-0.1.0/tests/fixtures/sub_categories.json +22 -0
  45. technolife_mcp-0.1.0/tests/test_catalog.py +146 -0
  46. technolife_mcp-0.1.0/tests/test_info.py +158 -0
  47. technolife_mcp-0.1.0/tests/test_live_catalog.py +37 -0
  48. technolife_mcp-0.1.0/tests/test_live_info.py +29 -0
  49. technolife_mcp-0.1.0/tests/test_live_offers.py +25 -0
  50. technolife_mcp-0.1.0/tests/test_live_product.py +38 -0
  51. technolife_mcp-0.1.0/tests/test_live_search.py +30 -0
  52. technolife_mcp-0.1.0/tests/test_offers.py +114 -0
  53. technolife_mcp-0.1.0/tests/test_product.py +190 -0
  54. technolife_mcp-0.1.0/tests/test_search.py +116 -0
  55. technolife_mcp-0.1.0/uv.lock +1112 -0
@@ -0,0 +1,42 @@
1
+ name: Bug report
2
+ description: A tool failed or returned wrong data
3
+ labels: [bug]
4
+ body:
5
+ - type: input
6
+ id: tool
7
+ attributes:
8
+ label: Tool
9
+ description: Which tool, e.g. tl_find_cheapest
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: input
14
+ attributes:
15
+ label: Arguments and result
16
+ description: The arguments the agent sent and the error or wrong output. Remove anything personal.
17
+ render: json
18
+ validations:
19
+ required: true
20
+ - type: textarea
21
+ id: expected
22
+ attributes:
23
+ label: What you expected
24
+ description: e.g. the price shown on technolife.com for the same product
25
+ - type: input
26
+ id: client
27
+ attributes:
28
+ label: MCP client and OS
29
+ placeholder: Claude Desktop 1.x on Windows 11
30
+ - type: dropdown
31
+ id: network
32
+ attributes:
33
+ label: Network
34
+ options:
35
+ - Iranian IP, no VPN
36
+ - VPN or proxy
37
+ - TECHNOLIFE_MCP_PROXY set
38
+ - type: input
39
+ id: version
40
+ attributes:
41
+ label: technolife-mcp version
42
+ placeholder: "0.1.0"
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Question or idea
4
+ url: https://github.com/sepehr071/technolife-mcp/discussions
5
+ about: Ask how to use it or suggest a new tool
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: monthly
7
+ - package-ecosystem: uv
8
+ directory: /
9
+ schedule:
10
+ interval: monthly
@@ -0,0 +1,21 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ strategy:
12
+ matrix:
13
+ python: ["3.10", "3.11", "3.12", "3.13"]
14
+ steps:
15
+ - uses: actions/checkout@v7
16
+ - uses: astral-sh/setup-uv@v10.2.0
17
+ with:
18
+ python-version: ${{ matrix.python }}
19
+ - run: uv sync --locked
20
+ - run: uv run ruff check .
21
+ - run: uv run pytest -q
@@ -0,0 +1,51 @@
1
+ name: Publish
2
+
3
+ # Tag a release (git tag v0.1.0 && git push --tags) after bumping the version in
4
+ # pyproject.toml and server.json.
5
+ on:
6
+ push:
7
+ tags: ["v*"]
8
+
9
+ jobs:
10
+ pypi:
11
+ runs-on: ubuntu-latest
12
+ environment: pypi
13
+ permissions:
14
+ id-token: write # PyPI trusted publishing
15
+ contents: write # GitHub Release
16
+ steps:
17
+ - uses: actions/checkout@v7
18
+ - uses: astral-sh/setup-uv@v10.2.0
19
+ - name: Check versions match the tag
20
+ run: |
21
+ TAG=${GITHUB_REF_NAME#v}
22
+ grep -q "^version = \"$TAG\"" pyproject.toml
23
+ test "$(jq -r .version server.json)" = "$TAG"
24
+ test "$(jq -r '.packages[0].version' server.json)" = "$TAG"
25
+ - run: uv sync --locked && uv run pytest -q
26
+ - run: uv build
27
+ - uses: pypa/gh-action-pypi-publish@release/v1
28
+ - run: gh release create "$GITHUB_REF_NAME" dist/* --generate-notes --title "$GITHUB_REF_NAME"
29
+ env:
30
+ GH_TOKEN: ${{ github.token }}
31
+
32
+ mcp-registry:
33
+ needs: pypi
34
+ runs-on: ubuntu-latest
35
+ permissions:
36
+ id-token: write # MCP Registry login via GitHub OIDC
37
+ contents: read
38
+ steps:
39
+ - uses: actions/checkout@v7
40
+ - name: Wait for PyPI to serve the new version
41
+ run: |
42
+ for i in $(seq 1 30); do
43
+ curl -sf "https://pypi.org/pypi/technolife-mcp/${GITHUB_REF_NAME#v}/json" >/dev/null && exit 0
44
+ sleep 10
45
+ done
46
+ exit 1
47
+ - name: Install mcp-publisher
48
+ run: |
49
+ curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
50
+ - run: ./mcp-publisher login github-oidc
51
+ - run: ./mcp-publisher publish
@@ -0,0 +1,6 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ dist/
5
+ .pytest_cache/
6
+ .ruff_cache/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sepehr
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,320 @@
1
+ Metadata-Version: 2.5
2
+ Name: technolife-mcp
3
+ Version: 0.1.0
4
+ Summary: Unofficial read-only MCP server for Technolife: search electronics, compare sellers and installment prices, find deals.
5
+ Project-URL: Homepage, https://github.com/sepehr071/technolife-mcp
6
+ Project-URL: Issues, https://github.com/sepehr071/technolife-mcp/issues
7
+ Author-email: Sepehr <sepehr@nextofx.com>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: electronics,iran,mcp,model-context-protocol,price-comparison,shopping,technolife
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
+ Requires-Python: >=3.10
21
+ Requires-Dist: httpx>=0.27
22
+ Requires-Dist: mcp<3,>=2.2
23
+ Description-Content-Type: text/markdown
24
+
25
+ <!-- mcp-name: io.github.sepehr071/technolife-mcp -->
26
+
27
+ <div align="center">
28
+
29
+ # 📱 technolife-mcp
30
+
31
+ **Let your AI agent shop around on Technolife.**<br>
32
+ Search phones, laptops and appliances, compare every seller's cash and installment price,<br>
33
+ read specs and reviews, and catch today's deals, all from Claude, Cursor or Copilot.
34
+
35
+ [![PyPI](https://img.shields.io/pypi/v/technolife-mcp?color=2563eb)](https://pypi.org/project/technolife-mcp/)
36
+ [![Python](https://img.shields.io/pypi/pyversions/technolife-mcp)](https://pypi.org/project/technolife-mcp/)
37
+ [![CI](https://github.com/sepehr071/technolife-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/sepehr071/technolife-mcp/actions/workflows/ci.yml)
38
+ [![MCP Registry](https://img.shields.io/badge/MCP_Registry-io.github.sepehr071%2Ftechnolife--mcp-7c3aed)](https://registry.modelcontextprotocol.io/v0/servers?search=technolife-mcp)
39
+ [![License: MIT](https://img.shields.io/badge/license-MIT-16a34a)](https://github.com/sepehr071/technolife-mcp/blob/main/LICENSE)
40
+
41
+ [![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=technolife&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyJ0ZWNobm9saWZlLW1jcCJdfQ==)
42
+ [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_technolife--mcp-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect/mcp/install?name=technolife&config=%7B%22command%22%3A%22uvx%22%2C%22args%22%3A%5B%22technolife-mcp%22%5D%7D)
43
+
44
+ [Quick start](#quick-start) · [What it can do](#what-it-can-do) · [Tools](#tools) · [FAQ](#faq) · [فارسی](#فارسی)
45
+
46
+ </div>
47
+
48
+ ---
49
+
50
+ ## Why
51
+
52
+ On Technolife one product page hides several sellers, colors, warranties and three price lists
53
+ (cash, installment, buy now pay later). Finding *the best offer* means clicking through each of them.
54
+ An agent with `technolife-mcp` reads them all at once:
55
+
56
+ > **You:** Where is the Lenovo IdeaPad Slim 3 i3 1315U cheapest on Technolife, and what does it cost in installments?
57
+ >
58
+ > **Agent:** *calls* `tl_suggest(query="IdeaPad Slim 3 i3 1315U")` → `tl_product(product_code="TLP-60492")`
59
+ >
60
+ > | Seller | Cash | Installment | Buy now pay later | Warranty |
61
+ > |---|---:|---:|---:|---|
62
+ > | ایران پشتیبان | **125,000,000** | 128,750,000 | 135,000,000 | 18 months |
63
+ > | چیتک شاپ | 129,500,000 | 133,385,000 | 139,860,000 | 18 months |
64
+ > | دیباکام | 130,000,000 | 133,900,000 | 140,400,000 | 18 months (Dibacom) |
65
+ >
66
+ > ایران پشتیبان is cheapest in every price list and ships the next working day; device insurance adds 2,375,000.
67
+ > Want me to check the exact total with insurance using `tl_price_basket`?
68
+
69
+ <sub>Real tool output from 2026-10-03; prices change all the time. Prices are in Toman.</sub>
70
+
71
+ ## What it can do
72
+
73
+ - 🔎 **Search** the whole catalog with prices, stock, rating, price range and brand/category filters
74
+ - 💸 **Find the cheapest** in-stock offers, re-sorted on the real price after discount
75
+ - 🏷️ **Compare sellers** of one product: price per color, warranty, stock, delivery time, seller reputation
76
+ - 💳 **See installment prices** (installment and buy now pay later) next to cash, and price a basket with insurance
77
+ - 📋 **Read specs** and compare up to 5 products side by side
78
+ - ⭐ **Check quality** with customer reviews, star distribution and the site's AI review summary
79
+ - ⚡ **Catch deals**: the main discount list, timed deals (تکنو تایم) and current campaigns
80
+ - 🔒 **Read-only by design**: no login, no basket, no orders, no payment
81
+
82
+ ## Quick start
83
+
84
+ You need [uv](https://docs.astral.sh/uv/getting-started/installation/).
85
+
86
+ <details open>
87
+ <summary><b>Claude Code</b></summary>
88
+
89
+ ```bash
90
+ claude mcp add technolife -- uvx technolife-mcp
91
+ ```
92
+ </details>
93
+
94
+ <details>
95
+ <summary><b>Claude Desktop</b></summary>
96
+
97
+ Settings → Developer → Edit Config, then add:
98
+
99
+ ```json
100
+ {
101
+ "mcpServers": {
102
+ "technolife": { "command": "uvx", "args": ["technolife-mcp"] }
103
+ }
104
+ }
105
+ ```
106
+ </details>
107
+
108
+ <details>
109
+ <summary><b>Cursor</b></summary>
110
+
111
+ Click **Install in Cursor** above, or add the Claude Desktop block to `~/.cursor/mcp.json`.
112
+ </details>
113
+
114
+ <details>
115
+ <summary><b>VS Code (Copilot agent mode)</b></summary>
116
+
117
+ Click **Install in VS Code** above, or add to `.vscode/mcp.json`:
118
+
119
+ ```json
120
+ {
121
+ "servers": {
122
+ "technolife": { "type": "stdio", "command": "uvx", "args": ["technolife-mcp"] }
123
+ }
124
+ }
125
+ ```
126
+ </details>
127
+
128
+ <details>
129
+ <summary><b>Anything else</b></summary>
130
+
131
+ It's a standard stdio MCP server: run `uvx technolife-mcp`, or `pip install technolife-mcp` and run `technolife-mcp`.
132
+ </details>
133
+
134
+ Then just ask:
135
+
136
+ - "Cheapest in-stock Lenovo laptop with 16 GB RAM on Technolife?"
137
+ - "Compare the iPhone 16 and iPhone 17: price, camera, battery."
138
+ - "Which deals on Technolife have more than 50% off right now?"
139
+ - <span dir="rtl">ارزان&zwnj;ترین گوشی سامسونگ با قیمت اقساطی در تکنولایف؟</span>
140
+
141
+ ## How it works
142
+
143
+ ```text
144
+ AI agent (Claude, Cursor, Copilot, ...)
145
+ │
146
+ │ MCP over stdio
147
+ ▼
148
+ technolife-mcp (runs on your machine)
149
+ │
150
+ │ HTTPS (GraphQL)
151
+ └──────▶ www.technolife.com
152
+ ```
153
+
154
+ `technolife-mcp` runs locally and calls the same public endpoints the technolife.com website uses.
155
+ There's no hosted server in between, no API key, and nothing about you is sent anywhere else.
156
+
157
+ ## Tools
158
+
159
+ Products are identified by codes like `TLP-60492` and sellers by `TLS-15172`. List tools return the
160
+ best offer per product; `tl_product` returns every seller, color and price list.
161
+
162
+ <details open>
163
+ <summary><b>🔎 Search</b> (4)</summary>
164
+
165
+ | Tool | What it does |
166
+ |---|---|
167
+ | `tl_search` | Search with prices, stock, rating; filters for price, brand, category; category/brand facets with their codes |
168
+ | `tl_find_cheapest` | Cheapest in-stock products for a search, one flat list sorted by the real price |
169
+ | `tl_suggest` | Product name → product codes (typeahead) |
170
+ | `tl_find_brand` | Brand name → brand filter code and brand page |
171
+ </details>
172
+
173
+ <details open>
174
+ <summary><b>🗂️ Catalog</b> (3)</summary>
175
+
176
+ | Tool | What it does |
177
+ |---|---|
178
+ | `tl_categories` | Find category pages by name, list the top level, or a category's sub-pages |
179
+ | `tl_category_products` | Products of a category, brand or promotion page, sorted and filtered |
180
+ | `tl_category_filters` | A page's brands, categories, price range and attribute filters (RAM, screen, CPU, ...) with codes |
181
+ </details>
182
+
183
+ <details open>
184
+ <summary><b>📦 Product</b> (4)</summary>
185
+
186
+ | Tool | What it does |
187
+ |---|---|
188
+ | `tl_product` | Every offer: seller, color, warranty, stock, delivery, insurance, installment prices, specs |
189
+ | `tl_compare` | 2-5 products side by side: price, stock, rating, every spec |
190
+ | `tl_reviews` | Customer reviews, star distribution and the AI summary with pros and cons |
191
+ | `tl_price_basket` | Exact total for seller items: discounts, insurance, quantity limits, cash vs installment |
192
+ </details>
193
+
194
+ <details open>
195
+ <summary><b>⚡ Deals and sellers</b> (3)</summary>
196
+
197
+ | Tool | What it does |
198
+ |---|---|
199
+ | `tl_deals` | Current discounts (biggest percent first) and timed home-page deals |
200
+ | `tl_campaigns` | Current campaigns, or one campaign's sections and products |
201
+ | `tl_seller` | A seller's rating, on-time and fault-free percentages, and its products |
202
+ </details>
203
+
204
+ <details open>
205
+ <summary><b>ℹ️ Shop info</b> (5)</summary>
206
+
207
+ | Tool | What it does |
208
+ |---|---|
209
+ | `tl_store_info` | Physical stores, shipping methods and costs, 7-day returns, payment methods |
210
+ | `tl_faq` | Search the help-center FAQ |
211
+ | `tl_shop_reviews` | Customer reviews of the shop itself |
212
+ | `tl_find_location` | Address or landmark → coordinates, province and city |
213
+ | `tl_reverse_geocode` | Coordinates → address, province, city and neighbourhood |
214
+ </details>
215
+
216
+ All 19 tools are annotated `readOnlyHint: true` and return compact structured JSON, so they don't flood the agent's context.
217
+
218
+ ## Good to know
219
+
220
+ - **Prices are in Toman**, as on the site (1 Toman = 10 Rial). `final_price` is after discount; `discount_pct` is computed from the two prices, because the site's own percent label is sometimes missing.
221
+ - **Ratings are 0–5**; `null` means not rated yet. Review and shop-review dates are Jalali, as the site shows them.
222
+ - **Installments:** the same seller item costs a few percent more in the installment and buy-now-pay-later price lists; `tl_product` shows all three and `tl_price_basket` totals any of them.
223
+ - **Shipping cost is not included** anywhere: Technolife only prices shipping for a logged-in address. `tl_store_info(topic="shipping")` has the rules.
224
+ - **Price sorting:** the site's price order is approximate (timed deals lag), so price sorts are re-sorted on the real price.
225
+ - **Persian queries match best** (`آیفون 16`, `لپ تاپ لنوو`). Category search treats Arabic ي/ك and half-space vs space as equal.
226
+
227
+ ## FAQ
228
+
229
+ <details>
230
+ <summary><b>A phone search returns phone cases first</b></summary>
231
+
232
+ Sort by price and accessories win. `tl_search` and `tl_find_cheapest` return the matching `categories` with their codes;
233
+ the agent passes the phone one back as `category_code` (e.g. `1` for mobile phones).
234
+ </details>
235
+
236
+ <details>
237
+ <summary><b>Can it place an order for me?</b></summary>
238
+
239
+ No, and that's deliberate. It has no login and never saves a basket or touches order or payment endpoints.
240
+ `tl_price_basket` only asks the server for prices. The agent finds the best offer; you buy on the site.
241
+ </details>
242
+
243
+ <details>
244
+ <summary><b>I get "did not answer in time" or "Could not reach"</b></summary>
245
+
246
+ Technolife sometimes resets connections; the server retries a failed connection once (timeouts are not retried). If it keeps failing, check your connection or set
247
+ `TECHNOLIFE_MCP_PROXY`. Normal system proxy variables are ignored on purpose, because direct calls are the fastest.
248
+ </details>
249
+
250
+ <details>
251
+ <summary><b>Claude Desktop says <code>uvx</code> is not found</b></summary>
252
+
253
+ Use the full path to `uvx` (`where uvx` on Windows, `which uvx` on macOS/Linux) as `command`.
254
+ </details>
255
+
256
+ <details>
257
+ <summary><b>How do I debug what the agent sees?</b></summary>
258
+
259
+ ```bash
260
+ npx @modelcontextprotocol/inspector uvx technolife-mcp
261
+ ```
262
+ </details>
263
+
264
+ ## Configuration
265
+
266
+ | Variable | Default | Meaning |
267
+ |---|---|---|
268
+ | `TECHNOLIFE_MCP_PROXY` | unset | HTTP proxy for every request, e.g. `http://user:pass@host:port` |
269
+
270
+ ## فارسی
271
+
272
+ <div dir="rtl">
273
+
274
+ **technolife-mcp** به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می&zwnj;دهد در تکنولایف جستجو کند،
275
+ قیمت نقدی و اقساطی همه فروشندگان یک کالا را مقایسه کند، مشخصات فنی و نظرات را بخواند و تخفیف&zwnj;های فعال را پیدا کند.
276
+
277
+ - فقط خواندنی است: وارد حساب نمی&zwnj;شود، سبد خرید ذخیره نمی&zwnj;کند و سفارش ثبت نمی&zwnj;کند.
278
+ - قیمت هر رنگ، فروشنده و گارانتی را همراه با قیمت اقساطی و هزینه بیمه نشان می&zwnj;دهد.
279
+ - همه قیمت&zwnj;ها به تومان است.
280
+ - روی سیستم خود شما اجرا می&zwnj;شود و به هیچ سرور واسطی داده نمی&zwnj;فرستد.
281
+
282
+ **نصب در Claude Code:**
283
+
284
+ </div>
285
+
286
+ ```bash
287
+ claude mcp add technolife -- uvx technolife-mcp
288
+ ```
289
+
290
+ <div dir="rtl">
291
+
292
+ بعد بپرسید: «ارزان&zwnj;ترین لپ تاپ لنوو با ۱۶ گیگ رم در تکنولایف و قیمت اقساطی آن چقدر است؟»
293
+
294
+ </div>
295
+
296
+ ## Development
297
+
298
+ ```bash
299
+ git clone https://github.com/sepehr071/technolife-mcp && cd technolife-mcp
300
+ uv sync
301
+ uv run pytest # offline, against recorded responses
302
+ uv run pytest -m live # real API
303
+ uv run ruff check .
304
+ ```
305
+
306
+ Tools live in `src/technolife_mcp/search.py`, `catalog.py`, `product.py`, `offers.py` and `info.py`; each is a typed
307
+ async function with a docstring that tells the agent when to use it. Issues and PRs are welcome, especially new tools
308
+ and fixes for API changes.
309
+
310
+ Releases: bump the version in `pyproject.toml` and `server.json`, then push a `v*` tag. GitHub Actions tests,
311
+ publishes to PyPI and the [MCP Registry](https://registry.modelcontextprotocol.io), and creates the GitHub Release.
312
+
313
+ ## Disclaimer
314
+
315
+ Unofficial and not affiliated with or endorsed by Technolife. It uses the public endpoints of the technolife.com
316
+ website, which can change without notice. Please keep request rates reasonable.
317
+
318
+ ## License
319
+
320
+ [MIT](https://github.com/sepehr071/technolife-mcp/blob/main/LICENSE)