Skip to main content
Glama

chineur

プロジェクト全体の見積りを、送料込みの最安値で、新品と中古を分けて算出します。実際に支払う合計を最小化する一括注文プラン付きです。

1品ずつの最安値比較では不十分です。10品を10店から買うと送料が10回かかります。このカートエンジンは、送料無料になる購入金額の閾値も考慮しながら、2〜3店に買い物をまとめ、その「素朴な合計」との差を表示します。

インストール

python -m venv .venv && ./.venv/bin/pip install -e .
./.venv/bin/pytest          # 74 tests hors ligne, aucun réseau

Python 3.11以上が必要です。このプロジェクトはキーなしで動作します。LeDénicheur、AliExpress、Leboncoinは何も要求しません。キーが必要なソース(eBay、Mouser)は単に無効のままで、list_sources() でその旨を確認できます。

Related MCP server: aws-calculator-assistant

キー

機密情報はバージョン管理されたファイルから読み込まれません。bin/chineur-mcp.sh は、ローカルに .env があればそれを読み込みます(gitには無視されます)。存在しなければ環境をそのまま使うため、シークレットマネージャーからの単純な置き換え注入が可能です。値はプロセスの環境変数のみを経由します:

export EBAY_CERT_ID=$(votre-cli-de-coffre get password 'eBay - API Browse')

変数

役割

未設定時

EBAY_APP_ID / EBAY_CERT_ID

eBay Browse のキーセット

eBay ソースは無効

MOUSER_API_KEY

Mouser Search API のキー

Mouser ソースは無効

FLARESOLVERR_URL

アンチボットウォール対策のブラウザ代替手段

代替手段は無効。他は同時に動作

`CHIR }

状態ディレクトリ(キャッシュ、割当、クッキー、ログ)

デフォルト <dépôt>/var

Wait, I made table header "設定時" all cells? Let's correct later.

Need no mistranscription.

Let's rewrite final table cleanly:

| 変数 | 役割 | ない場合 | (Actually "sans lui" includes "when nothing is set"). Header "未設定時" etc.

All tables should have row.

Let's redo final in next message.

Need to ensure "par défaut" benefit for row. Good.

Let me output full, with corrections.# chineur

プロジェクト全体の見積力を、送料込みの最安値で、新品と中古を分けて算出します。実際に支払う合計額を最小化する組み合わせ注文プランです。

個々の商品を単体で最安にするのは正解ではありません。10点の商品を10人の業者から買うと送料が10回かかります。このカートエンジンは、無料送料の閾値を含めて2件先か3件先に購入をまとめ、その「単純合計」との差を表示します。

インストール

python -m venv .venv && ./.venv/bin/pip install -e .
./.venv/bin/pytest          # 74 tests hors ligne, aucun réseau

Python 3.11以上が必要です。このプロジェクトはキーなしで動作します。LeDénicheur、AliExpress、Leboncoinは何も要求しません。キーを必要とするソース(eBay、Mouser)は単に無効なままで、list_sources() がその旨を伝えます。

キー

シークレットはバージョン管理されたファイルから読み込まれません。bin/chineur-mcp.sh は、ローカルに .env がある場合(gitで無視済み)にはそれを読み込み、なければ現在の環境をそのまま使います。これにより、シークレットマネージャーから値を直接差し込むことができ、値はプロセスの環境変数のみを通過します。

export EBAY_CERT_ID=$(votre-cli-de-coffre get password 'eBay - API Browse')

変数

役割

未設定時

EBAY_APP_ID / EBAY_CERT_ID

eBay Browse のキーセット

eBay ソースは無効

MOUSER_API_KEY

Mouser Search API のキー

Mouser ソースは無効

FLARESOLVERR_URL

アンチボットウォールに対するブラウザ代替手段

代替手段は無効。他はそのまま動作

CHINEUR_VAR

状態ディレクトリ(キャッシュ、割当、クッキー、ログ)

既定値:<dépôt>/var

使い方

MCP stdio で公開されています(bin/chineur-mcp.sh)。ツールは次の3つです:

ツール

役割

price_project(articles, zipcode?, used_threshold?, detail?)

1回の呼び出しでリスト全体を算出

best_price(article, …)

1商品だけのケース。detail="full"

list_sources()

各ソースの状態、残り時間分の割当、現在の遮断状況

各商品は数量または上限を指定できます:"LD2410C x3""ESP32-S3 <=12€"

コマンドラインの場合:

python -c "
import asyncio; from chineur.models import Project
from chineur.search import Orchestrator; from chineur.report import render
async def m():
    o = Orchestrator(); print(render(await o.run(Project.build(['LD2410C x2','BME280'])), failures=o.failures))
asyncio.run(m())"

ソースとその価値

ソース

新品 / 中古

送料

備考

LeDénicheur

新品 + 中古

正確

アグリゲーター:1回のリクエストでAmazon、Cdiscount、Fnac、Rn Commerce、Back Market9、RiuCommerce、Rarbelle、Rakuten出演い

AliExpress

新品

推定

ニッチな中国製モジュールに現実的な唯一のソース

Leboncoin

中古

推定

時間あたり最大10回の検索、変更不可

eBay

新品 + 中古

正確

公式 Browse API。2026年8月6日から有効

Mouser

新品

推定

プロ向けディストリビュー、公式 API。AliExpress で抜けがちな部品(はんだ、はんだ革、抵抗、トランジスタ、コネクタ類)をカバー。中国製モジュールには役に立たない:在庫がないか、価格が3〜5倍離れている

既知の解決、2026年08-05に測定、Playwright(V2)を使わない限り回避不能な制約:

  • AliExpress は検索ページに出品者も直接売価も表示せず、HTTP plain の商品ページは空です。したがって、グループ化は無料送料の閾値がある、プラットフォーム全体に適用されます。短時間に複数回のリクエストを送ると、AliExpress は 2KB のページを HTTP 200 で返します。これは「オファーがない」ではなく、ブロックとして検出され扱われ久。

  • AliExpress の予算は、新しい IP につきおおよそ6回のリクエストです。2026年8月10に、46時間の無通線の後にて測定しました。結果:6点が取得できた(133オファー)、7個目でブロックされ、FlareSolverr も同様にブロックされました。17点のリストはスクレイピングで一度には見積れません。待つ時間をどれだけマイナルからです。これは待機時間の設定を調整して解決るようなものではなく、公式アフィリエイト API(portals.aliexpress.com)を正当化する構造的局限です。

  • 中古場合、価格は参考値です。 Leboncoin の広告は自由テキストです。結果は台物であることも、壊れた部品であること、はたまたアクセサリーであることもあります。新品と中古を1つの価格に統合することはありません。

  • 送料は、推定のときは ~shipping.py のテーブル)、不明な場合は ? が付けられます。推定の合計は、その旨が明示されます。

関連性:真の制限要因

2026年8月8日、実際の型リスト(17商品、部品)で測定しました。見つからないものは、ソースの不足ではなく、表示名に原因がありました。原因は2つあり、検索の前に eBay が返した生タイトルを見ることによって分けられました。

too long query クエリが長すぎます。 「etain sarete 60/40 flux 0.8mm」は eBay を0件します。「etain sare」は11件します。説明語を追加すると、結果は空になるまで。そこで reduced_queryguarded_searchセカーンド・チャンスとがあります。ソースが0件を返した場合、高回だけ、参照と最初の2つの重要語だけに短縮したし以降で再試行し、修飾語ば捨てます。追加クエリは失敗した場合のみ、かつ永続的なルーポットの最後のクレジットには使いません。

フィルタは良いものを捨てていました。 「câbles dupont assortiment」と「Câble Nans… Assortiment 5 から100pcs」の比較は、しきい値を0.70さいしてスコアが0.67でした。スコアは完全文字列一致で較しかてられなかったため、フラグの僅sult riff がすべてを壊していました。_apparie は現在、共通する部分(その単語の60%)で照合します。この対象務4字母以上の単語だけ。数字や短い参照は対象外です。それにより「0410」と「2420」が別々のセンサのままです。

同じリストの結果:eBay は17品中、対象10項目かから14項目に増えました。どのオファーもなかった商品は5個から3個になりました。それでも全ソースを探しても見つからない真の品目は3つあります。 5枚iPad、此明2201M、Sugon 1。0DX。

It pays a price, and it is. 。検索を広げると、より広い質問に答えすこしになってしまいます。「ESP32-WROOM-32 DevKit 38ピン」を「esp32 wroom 32」にすると、30ピン版のモデルがヒットします。そのため、広げた結果のどのオファーも、**「ここ…」に検索を作成した※ という警告を表示必ず必要があります。表示まで。

ブラウザ・フォールバック (FlareSolverr)

the pointtnémentable: 中国系モジュールで本当に使えるソースは AliExpress だけ。 5〜9回の検索でブロックされてしまいます。 README では、この穴は「Playwright(標2)」ないまのは埋められない」と記載されていました。事実は、プロジェクト追加の依存関係なしで埋めることtorができました。FlareSolverr のインスタンスは、実際に Chrome を運転し、JavaScript を実行し、完全なブラウザ版の指を保持します。FLARESOLVERR_URL で宣言し、設定しないとフォールバックは単に無効です。

2026年8月8日に計測しました。ダイレクト接続がブロックされ、オープンのブレーカもオンになっている状況で、fr.aliexpress.com/w/wholesale-LD2410C.html は HTTP 200、832KB のページを返し、アンチボットマーカー、既存のHTML パーサーが60件の価格付き商品をユーロで直接デコードしました。パーサーの変更の必要はありませんでした。

AliExpress._items への組み込み:アンチボットウォールまたはトリミングされたページの場合、Blocked を発生させる前にフォールバックを実行します。設計上の要点は次のとおりです。

  • フォールバックであって例外ではありません。 呼び出すたびに Chrome を起動し、動作が遅く負荷が高いです。実際 at ブロックが確認したときだけ通り道です。

  • None であって [] ではありません。 フォールバックが何も返さないときは None を使います。空リストは「結果がない」とみなされ、循環器が導かれず、次からの商品がまたブロック中のソースを再リクエストれ、さらに停止が悪化させます。

  • 呼び出しを止めることはありません。 flaresolverr.fetch は例外を投げません。ソルバの故障がインフラ事件の後ろに隠れてしまい、本当の原因がわからなくならないように、フォールバックを無効にするときは FLARESOLVERR_URL= で消します。

  • 2回連続で失敗したら休止します。 後の制限をご覧ください。それがないと、続く商品だけが数十秒の無駄な待ちを受けることになります。

その限界、2026年8月8日計測。 フォールバックは回避策ではなく、2番目のリソースです。AliExpress connected の8回の検索について:6回は4〜6秒で60点ずつがまと分類され、7回目はエラー500(待ち時間101秒)、8回目はアンチボット落下の壁(208KB,RGV587)を返しました。出口IPは変わらないため、結局にいるのは同じ壁です。コードには2つ影響します。maxTimeout は 90 秒から 45 秒に減り、また HTTP 200 で壁が返るきた場合も失敗に数えます。そうでなければ、休止カウンタが作動されるでしょう。

実用上、AliExpress の予算は約9件から約15件、ページごとに20本が60本の並びます。純格子の増しではあるが、無上限ではありません。

アンチバレッドのガードレール

出口IPは単一で、住宅用です。1回の ban で完全に切断さされます。モジュール全体は、絶対にその状態にしないように作られています。

  • 時間あたりのクォータはSQLite(var/chineur.db)に永続化される:Leboncoin 10/h、LeDénicheur 30/h、 AliExpress 20/h、eBay 200/h、Mouser 60/h(APIクォータであり、IPリスクは一切ない)。

  • ソースごとに直列化された間隔であり、単純なsleepではない。オーケストレーターが全商品を並列で起動するため、並行した遅延は同時に経過し、それでもリクエストはバーストして送られてしまう。各開始は前の開始を待つ。

  • 403 / captcha / 切り詰められたページに対するサーキットブレーカー:1時間、AliExpressは2時間。そのペナルティは、きっかけになったバーストの後も持続する。

  • AliExpressのブロックはクォータでも間隔の問題でもない。 2026-08-06の3つのレシピ(キャッシュに入れたことのないラベル):

    間隔

    転送

    ブロック前に処理された件数

    6-12 s

    素のリクエスト

    5(46 sでブロック)

    6-12 s

    クッキーセッション

    6(56 sでブロック)

    45-60 s

    クッキーセッション

    2(108 sでブロック)

    2,5 s

    クッキーセッション、JSONエンドポイント

    9(30 sでブロック)

    遅くすると効率が悪化する。つまり間隔は制御手段ではない。最良の効率は速く取得することで得られる。ブロックは約40分続き、2回計測済みで、FAIL_SYS_USER_VALIDATE / RGV587_ERROR::SM――検証を要求するAlibabaのアンチボット――によって通知される。

  • 商品は内部エンドポイント POST www.aliexpress.com/fr/search-pc/index(検索ページ自身が呼び出すもの)から読み取る。ペイロードはmods形式で、ホームページで一度開いたセッションを利用する。HTMLページとまったく同じ商品オブジェクトを、.data.result.mods.itemList.contentに返す。サイズは600 KBに対して390 KBになる。落とし穴:レスポンスの複数ブロックにはcontentキーが含まれており、検索フィルタのブロックはitemListよりも前に現れる。HTMLページ は自動フォールバックとして残るが、ただしレスポンスが期待した形でなくなった場合のみ。アンチボットの壁に対しては、同じIPからHTMLで再試行するのはレクエストの無駄でしかならない。

  • 永続セッションtransport.Session)をAliExpressのために保持する:ホーむページ var/cookies/ のクッキー・ジャーは、再起動後も生き残るか、ペーじが再び短く戻った時点で捨てる。ブロックに対する効果は協測されなかったが、ベージのトラフィックの近くに現れてくるため維持している。

  • 未決の道:内部エンドポイントがいつか閉じられた場合、ソースをホスト型サービス(omkar .cloud、無料5,000リクエスト/月)に委託する。その代価として、私たちの検索を第三者が見ることができる。

  • キャッシュはレートリミッターの前に参照される:再計算するプロジェクトが、ソースに再びアクセスすることはない。TTLはデフォルと1時間だが、サーキットブレーカーの停止時間より短くはないConnector.effective_ttl、AliExpressは6時間)。この下限がないと、ソースの予算より大きいプロジェクトは完了できなくなる。停止解除後の再実行は空キャッシュを発見し、同じ最初の検索を再び行い、予算を再燃費し、またブロックされるギを無限回出す。 eBayを除く。eBayは免除に準拠するため、キャッシュから除外している(下記参照)。

トークンの節約

計算は引き続きPythonで処理され、戻る結果は最終判定のみ。出力は密な表形式テキスト、各商品に新品の最良オファー1つと中古1つ、タイトルは切り詰め、URLはクリーン化、備考はグループ化ーされ、診断はvar/chineur.logに。、実測:商品10件で約650トークン

テスト

pytest              # 74 tests hors ligne, aucun réseau
pytest -m network   # 5 tests d'intégration réels (consomment du quota)

カートエンジンはオフラインで完全にテスト可能で、困ったケース(グループ化による送料無料基準の発生、単一の販売者、送料オファーのない商品、同数点)も対象としている。「最適化された合計 ≤ 単純な合計」という性質は、ランダムなオファー50組で検証されている。

Mouser

変数は1つのみ:MOUSER_API_KEY。無料キーはmouser.com/api-hub(Search APIタブ)で自己登録できる。

キーは mouser.fr から作成する必要がある。 キーワード検索は通貨パラメータを受け付けません(swagger api.mouser.com/api/docs/echo/V1 で確認済み)。通貨はアカウント登録したサイトの通貨です。mouser.com で作成したキーはドルを返す。コネクタはそれを適当な為替レートで換算する代わりに捨てるようにします。その場合ソース単に空に見える。

Mouserが公表するクォータ:1呼び出あたり50個、1分あたり30呼び出し、1日あたり1,000呼び出し。つまり limit_per_hour = 60 と2秒間隔になります:これはアンチ・バンではなく、クォータとします。

3つの基本的な選択:

  • mouserPaysCustomsAndDuties: true — Mouserはテキサスから出荷する。このフラグがないと関税が後でやってきて、「書面上では安い」価格が配達済みで高くなります。

  • searchOptions: InStock — 12週間の納期のある部品は、進行中プロジェクトの価格比較に入れる意味がない。

  • プライスの段階は要求数量で追跡する。段階1を選ぶと、パッシブ部品のまとめ買いを過大表示してしま。

比較が誤る2つの罠は、両方ともオファーに注意書きされる:最小発注数量(1袋100個で1個0.10€、実際の計算法力は10€)と、価格形式(0.096€は小数3桁の価格、1,250$は1250ユーロを意味する——素朴なパーサーは両方向に千倍間違う)。

送料は未確認。 無料送料の50€(税抜)と、そこを下回る場合の約20€は、2026-08-07のWeb推測であり、實際の請求書ではありません。つまり shipping.py では ESTIMATED として現れ、確定値としては扱わない。最初の実際の注文の際に修正するはぎない:無料送料のしきい値を下回ると送料が利益を上回り、このしきい値がこのソースの有用性を決める。

eBay

EBAY_APP_ID(App ID)と EBAY_CERT_ID(Cert ID)は、本番キーセットに利用できる唯一のもの。サンドボックス・キーセットは EBAY_ENV=sandbox で有効になり、api.sandbox.ebay.com を指す。サンドボックスでは、インベントリが架空のため、価格がカートに入っても誰も気づかない環境なので、コネクタは無効のままEBAY_SANDBOX_OK=1 で配管のテストのみなら再接続できる。

2026-08-06 に Productionキーセットで確認: client_credentials トークの取得、実際の検索(「cable hdmi 2.1 2m」で29件、shippingOptions の送料も正確に読み取り)。

商品の状態は conditionId で読み取る。condition使ってはならないcondition はeBayによってローカライズされており、EBAY_FRでは「新」「中古」「開封済み(未使用)」などとなり、元の英語キーのテーブルは何も一致せず、すべて中古として出力されてしまう7000(「ジャンク用」)は除外する:3€0の壊れた商品が、何の警告もなく比較に勝ってしまう。

法令遵守(「Your Keyset is currently disabled」)。 eBayは、アカウント削除通知への購読または免除がない限り、Productionキーセットを有効にしない。この生産性は疑似への出品者IDを含むため、EBay.cacheable = False とすることで、実際のeBayのレスポンスを var に書き込まない。これを行わないと、この例外は課せされない。もし将来にキーセットをキャッシュするなら、その時点でこの免責は無効になり、通知エンドポイントをホストする必要があった。

ライセンス

MIT、LICENSEを参照。

Install Server
A
license - permissive license
A
quality
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    MCP server for finding, comparing, and ranking the cheapest real offers across eBay, Amazon, Craigslist, OfferUp, and Google Shopping, with tax estimation and exact-model filtering.
    6
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Build shareable AWS Pricing Calculator estimates programmatically via MCP tools, designed for creating MAP funding estimates from customer infrastructure descriptions.
    8
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A hosted MCP server that routes natural-language shopping queries to independent merchant storefronts, returning normalized product and merchant results for AI agents and shopping assistants.
    MIT

View all related MCP servers

Related MCP Connectors

  • Hosted no-auth MCP for exact-spec packaging search, live price, stock, cart handoff, and no-match.

  • Real, buyable product and service offers — live pricing and trackable links for any MCP agent.

  • Routes natural-language shopping queries to merchant storefronts, returns normalized results.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/GRSMael/chineur'

If you have feedback or need assistance with the MCP directory API, please join our Discord server