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: ingrammicro-mcp

キー

機密情報はバージョン管理されたファイルから読み込まれません。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_query と guarded_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を参照。

Available Tools

3 tools
best_priceC

Meilleur prix livré pour un seul article, neuf et occasion séparés.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNofull
articleYes
zipcodeNo
used_thresholdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description must carry behavioral disclosure on its own. It does reveal useful behavior: prices include delivery and new/used results are separated. It does not mention side effects, data sources, or how thresholds affect results, but the core behavior is stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler or repetition. The main outcome is front-loaded, though the phrasing is telegraphic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. However, with four parameters and zero parameter documentation, the description is not complete enough for an agent to confidently set 'detail' and 'used_threshold' correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain any of the four parameters. While 'article' and 'zipcode' are somewhat self-evident, 'detail' and 'used_threshold' have no meaning clarified anywhere, making correct invocation unreliable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's result: the best delivered price for a single article, with new and used items separated. It is understandable on its own, but it lacks an explicit verb and does not differentiate from the sibling tools price_project and list_sources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'pour un seul article' implies this tool is for single-item price lookups, which contrasts with the project-oriented price_project and list-oriented list_sources siblings. However, there is no explicit instruction about when to use this tool versus those alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sourcesB

État de chaque source : activée, quota horaire restant, coupure en cours.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does state what the tool reports (enabled state, remaining quota, outage status), which conveys a read-only intent, but it never explicitly says the operation is non-mutating or describes side-effect implications. An output schema exists to cover the return shape, but the description adds only the status facets.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded French sentence conveys the core purpose efficiently with no filler. It could feasibly add usage nuance, but for a parameterless status tool the brevity is reasonable and not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema is present, so return-value structure is covered by structured data, and there are no parameters to document. The main gap is the absence of guidance on when to invoke it relative to the pricing siblings; for an agent to use it correctly, that routing context would make it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to explain; schema coverage is vacuously 100%. Per the baseline for a zero-parameter tool, a 4 is appropriate since the description need not compensate for any undocumented inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb-plus-resource purpose: report the status of each source, listing the exact status facets it exposes (enabled, remaining hourly quota, active outage). This is specific enough to be useful. It distinguishes from the pricing siblings implicitly, though it never names them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to call this tool versus price_project or best_price. An agent must infer from the sibling names (which relate to pricing) that this status tool serves a different purpose. There is no mention of prerequisites, ordering, or situations where this tool should not be used.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

price_projectA

Chiffre une liste d'articles au meilleur prix livré et rend le plan de commande groupé.

C'est le point d'entrée principal : un seul appel pour tout le projet. Chaque article peut porter une quantité (« LD2410C x3 ») ou un plafond (« ESP32 <=12€ »). Rend le meilleur neuf et le meilleur occasion par article, le plan de commande qui minimise le total port compris, et l'écart avec le total naïf.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNocompact
zipcodeNo
articlesYes
radius_kmNo
used_thresholdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It explicitly reveals what the tool returns (best new/used per article, order plan minimizing shipping, and difference from naive total) and that it only produces a plan, not an actual purchase. This gives a good sense of its side-effect-free nature, though it does not mention potential errors, rate limits, or dependency on external sources.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured paragraph that leads with the main purpose and then gives behavior and examples. It is not overly long and efficiently communicates the core function. Minor redundancy in repeating the return list twice, but overall it is concise and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, return value format is not required, but the description is incomplete for a 5-argument tool with zero schema descriptions. The lack of parameter explanations (especially 'detail' and 'used_threshold') means an agent cannot confidently set non-default values. While the main scope is clear, the missing parameter semantics make it incomplete for full usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must clarify all parameters. It does explain the format for the 'articles' parameter (quantity or cap), which is the only required field. However, it leaves 'detail', 'zipcode', 'radius_km', and 'used_threshold' undefined. The defaults exist in the schema, but their meaning is not explained, leaving the agent without guidance for non-default values. The description compensates only for one of five parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: pricing a list of articles at best delivered price and returning a grouped order plan, explicitly calling itself the main entry point. This differentiates it from sibling tools (best_price, list_sources) that are presumably lower-level operations. It also explains the accepted article syntax (quantity or cap), giving concrete examples.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states that this is the primary entry point and that a single call handles the entire project, implying it should be used instead of composing multiple calls. However, it does not explicitly say when to prefer best_price or list_sources, nor does it mention exclusions (e.g., for single-item queries). It provides clear context but no explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.1.0
    • First observedbest_price
    • First observedlist_sources
    • First observedprice_project

TDQS

A3.6/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: price_project handles multi-article project planning, best_price handles a single article, and list_sources provides source status. No overlap or ambiguity between them.

Naming Consistency4/5

All names use lowercase snake_case, which is consistent. However, the structure varies slightly: price_project and list_sources follow verb_noun, while best_price is adjective_noun. This minor deviation is not confusing but prevents a perfect score.

Tool Count5/5

With only 3 tools, the server is tightly scoped. The main tool price_project serves as the primary entry point, while the others handle single-item lookups and system status. This is an appropriate size for the purpose and each tool earns its place.

Completeness5/5

The tool surface covers the core workflow: comprehensive project pricing (price_project), single-article queries (best_price), and source health monitoring (list_sources). No obvious gaps exist, as the domain is price comparison and order planning, which these tools fully address.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    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
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables the full Ingram Micro Reseller purchasing lifecycle through a single stateless HTTP MCP service, covering catalog and pricing, quotes, quote-to-order, order placement/modification/cancellation/lookup, invoices, renewals, special deals, returns, and freight estimates with one set of credentials.
    24
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Enables eBay-backed product search, authenticated shopping carts, checkout quotes, and order management through MCP tools and resources.
    11
    7 npm
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables product discovery, seller-offer comparison, and bounded, approval-gated cart operations with account-scoped planning and read-back reconciliation.
    40
    MIT