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.
- technolife_mcp-0.1.0/.github/ISSUE_TEMPLATE/bug_report.yml +42 -0
- technolife_mcp-0.1.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- technolife_mcp-0.1.0/.github/dependabot.yml +10 -0
- technolife_mcp-0.1.0/.github/workflows/ci.yml +21 -0
- technolife_mcp-0.1.0/.github/workflows/publish.yml +51 -0
- technolife_mcp-0.1.0/.gitignore +6 -0
- technolife_mcp-0.1.0/LICENSE +21 -0
- technolife_mcp-0.1.0/PKG-INFO +320 -0
- technolife_mcp-0.1.0/README.md +296 -0
- technolife_mcp-0.1.0/pyproject.toml +52 -0
- technolife_mcp-0.1.0/server.json +32 -0
- technolife_mcp-0.1.0/src/technolife_mcp/__init__.py +5 -0
- technolife_mcp-0.1.0/src/technolife_mcp/catalog.py +219 -0
- technolife_mcp-0.1.0/src/technolife_mcp/http.py +132 -0
- technolife_mcp-0.1.0/src/technolife_mcp/info.py +194 -0
- technolife_mcp-0.1.0/src/technolife_mcp/offers.py +214 -0
- technolife_mcp-0.1.0/src/technolife_mcp/product.py +351 -0
- technolife_mcp-0.1.0/src/technolife_mcp/registry.py +16 -0
- technolife_mcp-0.1.0/src/technolife_mcp/search.py +282 -0
- technolife_mcp-0.1.0/src/technolife_mcp/server.py +55 -0
- technolife_mcp-0.1.0/tests/conftest.py +89 -0
- technolife_mcp-0.1.0/tests/fixtures/basket.json +33 -0
- technolife_mcp-0.1.0/tests/fixtures/comments.json +65 -0
- technolife_mcp-0.1.0/tests/fixtures/compare.json +72 -0
- technolife_mcp-0.1.0/tests/fixtures/faq_search.json +10 -0
- technolife_mcp-0.1.0/tests/fixtures/home.json +206 -0
- technolife_mcp-0.1.0/tests/fixtures/landing.json +132 -0
- technolife_mcp-0.1.0/tests/fixtures/map_forward.json +109 -0
- technolife_mcp-0.1.0/tests/fixtures/map_reverse.json +48 -0
- technolife_mcp-0.1.0/tests/fixtures/menu_filters.json +79 -0
- technolife_mcp-0.1.0/tests/fixtures/menu_products.json +69 -0
- technolife_mcp-0.1.0/tests/fixtures/navbar.json +102 -0
- technolife_mcp-0.1.0/tests/fixtures/product_page.json +186 -0
- technolife_mcp-0.1.0/tests/fixtures/review_summary.json +17 -0
- technolife_mcp-0.1.0/tests/fixtures/search_cheapest_p0.json +105 -0
- technolife_mcp-0.1.0/tests/fixtures/search_cheapest_p1.json +117 -0
- technolife_mcp-0.1.0/tests/fixtures/search_results.json +129 -0
- technolife_mcp-0.1.0/tests/fixtures/search_suggest.json +21 -0
- technolife_mcp-0.1.0/tests/fixtures/seller.json +59 -0
- technolife_mcp-0.1.0/tests/fixtures/shop_reviews.json +36 -0
- technolife_mcp-0.1.0/tests/fixtures/similar_brands.json +12 -0
- technolife_mcp-0.1.0/tests/fixtures/special_products.json +81 -0
- technolife_mcp-0.1.0/tests/fixtures/static_page.json +13 -0
- technolife_mcp-0.1.0/tests/fixtures/sub_categories.json +22 -0
- technolife_mcp-0.1.0/tests/test_catalog.py +146 -0
- technolife_mcp-0.1.0/tests/test_info.py +158 -0
- technolife_mcp-0.1.0/tests/test_live_catalog.py +37 -0
- technolife_mcp-0.1.0/tests/test_live_info.py +29 -0
- technolife_mcp-0.1.0/tests/test_live_offers.py +25 -0
- technolife_mcp-0.1.0/tests/test_live_product.py +38 -0
- technolife_mcp-0.1.0/tests/test_live_search.py +30 -0
- technolife_mcp-0.1.0/tests/test_offers.py +114 -0
- technolife_mcp-0.1.0/tests/test_product.py +190 -0
- technolife_mcp-0.1.0/tests/test_search.py +116 -0
- 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,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,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
|
+
[](https://pypi.org/project/technolife-mcp/)
|
|
36
|
+
[](https://pypi.org/project/technolife-mcp/)
|
|
37
|
+
[](https://github.com/sepehr071/technolife-mcp/actions/workflows/ci.yml)
|
|
38
|
+
[](https://registry.modelcontextprotocol.io/v0/servers?search=technolife-mcp)
|
|
39
|
+
[](https://github.com/sepehr071/technolife-mcp/blob/main/LICENSE)
|
|
40
|
+
|
|
41
|
+
[](https://cursor.com/en/install-mcp?name=technolife&config=eyJjb21tYW5kIjoidXZ4IiwiYXJncyI6WyJ0ZWNobm9saWZlLW1jcCJdfQ==)
|
|
42
|
+
[](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">ارزان‌ترین گوشی سامسونگ با قیمت اقساطی در تکنولایف؟</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 و ...) اجازه می‌دهد در تکنولایف جستجو کند،
|
|
275
|
+
قیمت نقدی و اقساطی همه فروشندگان یک کالا را مقایسه کند، مشخصات فنی و نظرات را بخواند و تخفیف‌های فعال را پیدا کند.
|
|
276
|
+
|
|
277
|
+
- فقط خواندنی است: وارد حساب نمی‌شود، سبد خرید ذخیره نمی‌کند و سفارش ثبت نمی‌کند.
|
|
278
|
+
- قیمت هر رنگ، فروشنده و گارانتی را همراه با قیمت اقساطی و هزینه بیمه نشان می‌دهد.
|
|
279
|
+
- همه قیمت‌ها به تومان است.
|
|
280
|
+
- روی سیستم خود شما اجرا می‌شود و به هیچ سرور واسطی داده نمی‌فرستد.
|
|
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
|
+
بعد بپرسید: «ارزان‌ترین لپ تاپ لنوو با ۱۶ گیگ رم در تکنولایف و قیمت اقساطی آن چقدر است؟»
|
|
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)
|