Skip to main content
Glama
Tlkh201313
by Tlkh201313

Basketed

一つのバスケット。多くのショップ。あなたなしでは何も買えません。

ユニバーサルショッピングMCPサーバーと、セルフホスト型コントロールパネル。あらゆるMCPエージェントが、多数の小売店にわたる実際の商品検索、トークン効率の良い比較、そして人間だけが承認できる購入ステップを利用できます。

分析 → 抽出 → 応答 → 購入 → 受領

pnpm i && pnpm build
node packages/cli/bin.js install --client claude-code   # or --all

これが全体のセットアップです。クライアントはBasketed自体をstdio経由で起動し、コントロールパネルは同じプロセス内で起動します。そのリンクと、あなたを待っているカートへのリンクは、サーバーのコンソールに表示されます。serve --http --open はもう一つの入り口です。同じパネルに加えて、/mcp にStreamable HTTPエンドポイントがあります。


実際にここにあるもの

必須の人間による承認ゲートを備えたクロスリテイラーバスケット

これを出荷した人はいません。公式マーチャントサーバーは単一リテイラーで、チェックアウトURLで止まります。コミュニティショッピングサーバーは承認なしで購入を自動化します。中間は空でした。

すべてがあなたのマシン上で動作します

侵害されるBasketedサーバーは存在しません。2026年5月のComposio侵害(約170万件の生の認証情報を保持するストアから約5,241件のAPIキーと約5,001件のOAuthトークンが盗まれた)以降、ホスト型ショッピングエージェントは構造上標的になります。認証情報ボールトは、このマシンから決して離れないキーでAES-256-GCMにより封印されており、モデルはそれを読むことができません。秘密を返すツールもルートも存在しません。出荷されたアダプターはどれもまだ誰として認証しないため、今日のボールトは、Connectストアページから何かを入れない限り空です。

eコマースMCP向けの公開トークンベンチマーク

実際のショッピングタスク1件で、素朴なMCPサーバーより**91.9%少ないトークン、ストアフロントを閲覧するより99.3%**少ないトークン。この数字には、当社自身の3,144トークンのツール定義オーバーヘッドも含まれています。方法はdocs/BENCHMARK.mdにあります。


Related MCP server: agent-commerce-mcp-server

購入ゲート

エージェントは購入を提案できます。承認できるのは人間だけであり、承認は常にモデルが作成できない面から届きます。

cart_prepare ──► PENDING ──(human)──► APPROVED ──(purchase_confirm)──► order
                    │                                                    │
                    └──► EXPIRED (5 min) / REJECTED                       └─► HANDED_OFF
                                                                              outcome: unknown

2つの承認チャネル。どちらも1つの関数に収束します。 そのため、人間がどこでクリックしてもセキュリティ特性は同じです。

方法

動作環境

A — パネル

/approvals。サーバーのコンソールのトークンリンクから開きます。明細付きで、正確な合計を入力します

常に動作 — パネルはstdioでも動作します

C — コンソールコード

サーバー自身のstderrに印刷された6桁のコード

100%のクライアント

チャネルB — 引き出し(クライアントがダイアログ自体をレンダリングする)は設計済みで未構築です。ApprovalChannel は "console" | "panel" であり、それがリストのすべてです。文字は、計画とコードが同じものに同じ名前を使用するように保持されています。

チャネルCは、モデルがその面への読み取りアクセスを持たないため安全です。エージェントがコードを取得する唯一の方法は、人間がそれを読み上げることです。これはまさに私たちが要求したい人間の行為です。

チャネルAは、ルート分割ではなく、同じ事実に基づいています。Basketedがインストールされるすべてのクライアントにはシェルがあるため、「エージェントはMCPを話し、/api に到達できない」というのはそれだけでは決して真実ではありませんでした。ローカルプロセスは127.0.0.1の任意のポートを呼び出し、任意のヘッダーを偽造できます。したがって、パネルはプロセスごとに発行され、同じコンソールに印刷されるトークンの背後にあります。両方のトランスポートで、stdio経由でBasketedを起動したクライアントでもチャネルAを利用できます。

stdioでは、パネルはサーバー起動時にブラウザでも開きます。これは利便性ではありません。クライアントはMCPサーバーのstderrをキャプチャするため、リンクは人間が決して読まない場所に書き込まれ、誰も到達できないパネルはチャネルではありません。そこではタブがチャネルです。プロセスごとに1つのタブ。--no-open(またはBASKETED_NO_OPEN=1)でオフにでき、タブはポーリングするため、後で必要なカートはすでに開いているタブに表示されます。/api はまた、Origin がパネルのものと正確に一致しないリクエストを拒否し、変更を伴うリクエストでOriginを送信しないものも拒否します。これにより、Webページがブラウザを介してパネルを操作できなくなります。

意図的に存在しないもの: approve() ツール、approved: true パラメータ、オーバーライドフラグ、set_delivery_address ツール。tools/list を実行して確認してください。存在しないことが機能です。

敵対的パス

pnpm smoke        # five smoke suites, all offline
pnpm test         # 160 unit tests
pnpm drill        # the whole demo path with the network genuinely severed
pnpm smoke:live   # ...and against live merchants, spending real requests
  1. 承認前に purchase_confirm → 拒否

  2. 承認、確認、その後同じ approval_id を再生 → 拒否、消費済み

  3. 承認後にDBの価格を変更 → 拒否、ハッシュのずれ

  4. --fast-mode で再起動し、1〜3を繰り返す → すべてまだ拒否

  5. エージェントに自分の購入を承認させる → それができるツールは存在しない

--fast-mode は購入に触れることができず、それは2回証明されています

行動的には、そして実際のインポートグラフを辿ることで: commerce/purchase.ts から到達可能なものは、フラグが存在する mcp/policy.ts をインポートしません。フラグは購入パスで無視されているのではなく、そこから到達可能ではありません。そして、それらを配線するリファクタリングはCIで失敗します。

オフラインドリルは実際にネットワークを遮断します

pnpm drill は、サーバープロセス内のすべての非ループバック接続を拒否するガードをプリロードし、デモパス全体を実行します。Wi-Fiがまだあるマシンでスナップショットフラグを設定することは、フラグが解析されることだけを証明します。実際の切断では、固定された10のShopifyストアのうち7つがダークになります。そして、stores_failed に名前付きで戻ってきます。なぜなら、静かに返すストアが少ない検索は、成功とまったく同じように見えるからです。


データの出所

各アダプターは2つの独立したものを宣言し、どちらも過大評価してはなりません。すべての応答はそのモードを運び、パネルはそれをバッジとして表示します。

モード

意味

native

小売業者自身の公式エンドポイント — Shopify UCP、および(S16)実際のTesco: search.api.tesco.com / xapi.tesco.com。tesco.com自身のフロントエンドが行うのと同じリクエストを移植し、ライブで検証したもので、スクレイピングではありません

provider

ライセンスされた商用プロバイダーを介した実際の小売業者データ (設計済み、未構築)

connected

実際の小売業者のOAuthを介したユーザー自身のアカウント (設計済み、未構築)

simulated

フィクスチャベースで、SIMULATED とスタンプされています

ティア

誰が持っているか

discovery detail

すべてのアダプター、および実際のTesco

cart

Shopify UCP、シミュレーション、および実際のTesco(買い物客自身のtesco.comセッションから貼り付けられたベアラートークン経由 — Connect stores を参照)

handoff

Shopify UCP、実際のTesco(tesco.com/groceries/.../trolley、実際のバスケット)

checkout

誰も持っていません。 Shopifyは、公開アプリケーションのない手渡しのマーチャントトークンの背後で支払い完了をゲートします。TescoのバスケットAPIは非公式であり、このプロジェクトはカードデータに触れません。インターフェースは定義されていますが、実装されていません。

実際のTescoはライセンスされた統合ではありません。 search.api.tesco.com と xapi.tesco.com は、Tesco自身のウェブサイトが呼び出す公開エンドポイントであり、APIキーは公開され、フロントエンドJSに埋め込まれています。しかし、Tescoはどちらの第三者使用も文書化またはサポートしておらず、この方法での使用は、非公式のAPIクライアントと同様に、Tescoの利用規約の外にあります。sim:tesco はこれの影響を受けず、常にそうであったもののままです。フィクスチャデータであり、オフラインドリルが実行される対象であり、実際のネットワークフリーのままです。

スクレイパーなし、アンチボット回避なし。 Cloudflareチャレンジ、WAFフィンガープリンティング、CAPTCHAは、オペレーターが意図的に有効にしたアクセス制御です。それらを打ち破ることは、「ユーザーが行為者である」という防御を破壊し、エージェント型ショッピングを擁護可能にするものを失わせ、絶えず壊れます。それらの背後にある小売業者は provider または simulated です。これは無効にして出荷する機能ではなく、構築しない機能です。

HANDED_OFF は成功を主張しません。 ルートが人間が自分で完了するURLで終わる場合、私たちは結果を本当に知りません。そして、人がパネルでマークするまで、注文はそのことを正確に示します。誰も支払っていない注文に静かに緑のチェックマークを表示することは、これが出荷できる最も有害なバグになるでしょう。


ツール

読み取り専用:

basket_list_stores

各行は mode と status を保持します

basket_search_products

response_format · fields · budget_tokens · max_results

basket_get_product_detail

重いフィールドは include 経由のみ

basket_get_token_report

提供されたトークンとベースラインの比較、累積

マネー関連 — destructiveHint: true、ALLOW に昇格不可:

basket_cart_prepare

実際のカートを構築し、Cart Mandate を発行し、approval_id を返します。charged: false。

basket_purchase_confirm

人間が承認し、期限切れでなく、未使用で、ハッシュが一致するマンデートに対してのみ成功します

basket_list_orders · basket_get_order_status

読み取り専用。cart_json と approval_id は削除されます

トークンレバー

response_format: concise(デフォルト)・detailed・compact(短いキーと1行の凡例)。fields は明示的な許可リスト用。budget_tokens はハードな上限用 — url → image → attrs → 名前の切り詰め → 行の削除の順にトリミングされ、_meta.truncated が何が削られたかを示します。id、price、mode は決して削除されません: 結果はトークンを節約するためにその出所を失ってはなりません。


インストール

basketed install は、パネルがレンダリングするのと同じ1つのバリアンステーブルによって駆動されます。そのため、インストーラー、コピーブロック、バッジは、設定ファイルがどこにあるかについて矛盾することができません。これは、以下のほぼすべての例外が静かに失敗するため重要です: 間違ったキー名はエラーにならず、サーバーが単に表示されないだけです。

basketed clients                       # every client, its file, its key
basketed install --client claude-code
basketed install --all --dry-run       # show the diff, write nothing
basketed doctor                        # check the install end to end

クライアント

キー

静かに壊れるもの

Claude Code

mcpServers

type のない url はハードエラーです

Cursor

mcpServers

elicitation をサポートしています。チャネルBが存在するはずの場所ですが、構築されていません

Codex CLI

[mcp_servers.x]

唯一のTOMLターゲットで、アンダースコア付き

Claude Desktop

mcpServers

リモートは Settings → Connectors 経由のみ

VS Code

servers

mcpServers ではありません

opencode

mcp

command は配列です。envキーは environment

Kiro

mcpServers

autoApprove があります — そこには読み取り専用ツールのみをリストします

Zed

context_servers

—

Windsurf

mcpServers

serverUrl。全サーバーで100ツールのハードキャップ

Gemini CLI

mcpServers

Streamable HTTP には httpUrl、url は SSE を意味します

Goose

extensions

url ではなく uri。アンダースコア付きの streamable_http

Warp

mcpServers

~/.claude.json と ~/.codex/config.toml も読み取ります — 無料

書き込みはマージしてから置き換え、上書きはしません。 既存のファイルは <file>.basketed-backup-<timestamp> にバックアップされ、無関係なキーや他のサーバーは保持され、書き込みはアトミックで、差分が出力されます。解析できない設定は拒否され、置き換えられることなくバイト単位で同一のまま残されます。

Kiro の autoApprove は罠です。 生成された設定には、そこに4つの読み取り専用ツールのみがリストされ、basketed doctor は、マネー関連ツールが手動で追加された場合に警告します。


プロトコル

デュアル時代、両方のトランスポート。MCP 2026-07-28 は initialize、セッション、サーバー開始リクエストを削除しました。最新のクライアントはレガシーサーバーと通信できず、その逆も同様です。「任意のエージェントにインストール」は、1つのバイナリから両方を提供することに完全に依存しているため、scripts/smoke-mcp.mjs は同じバイナリを2回開きます — 1回は initialize 付き、もう1回はステートレス — どちらの失敗もサーバー自身のログからは見えないからです。

また: server/discover、すべてのツールの outputSchema、古いクライアント向けにテキストとしてミラーリングされた構造化出力、決定論的なツール順序、4つのアノテーションすべて、名前空間付きの名前。


セキュリティ

  • 資格情報ボールトは構築されています。 packages/vault は、保存された各シークレットを ~/.basketed/master.key(モード0600)の32バイトキーで AES-256-GCM を使用して封印します。平文を返す関数は正確に1つだけ — reveal() — であり、それは送信フェッチにヘッダーを添付するリクエストインターセプター以外からは呼び出されません。テストはワークスペース内の他の呼び出しサイトを調べ、1つでも現れたら失敗します。パネル — このリストの他のすべてと同じプロセスごとのトークンの背後 — はそれに書き込み、メタデータのみを読み戻します。MCPツールが資格情報を受け取ることは決してありません: AdapterCtx には資格情報が移動できるフィールドがありません。不正または欠落したキーファイルは Connect-stores ページを劣化させます。MCPサーバーをダウンさせることはないため、クライアントはこのファイルが原因で起動に失敗することはありません。出荷されたアダプターはどちらも保存されたもので認証しません — Shopify UCP は匿名であり、シミュレートされたストアにはそれをチェックするものがないため — Tesco、Costco、Walmart、Amazon を接続すると、まだ存在しないアダプターの資格情報が保持され、今日表示される結果は変わりません。

  • 「Chromeでログイン」(S15)は、Tesco、Costco、Walmart、Amazon の正確に4つに限定。 これらのいずれもコンシューマー向け OAuth フローを公開していないため、パスワード貼り付けボックスの正直な代替案は、実際のブラウザで小売業者自身のログインページを開き、人間が自分でログインできるようにすることです。これはマシンにすでにインストールされている Chrome を起動し、ダウンロードした Chromium は決して使用しません — これを使用する誰も何もインストールする必要はありません。人間が「キャプチャ」をクリックするまで何も読み取られません: セッションクッキーが現れるのをポーリングしたり、現れた瞬間に取得したりすることはありません。上記の「アンチボット回避なし」と一致して、小売業者から自動化を隠すことはありません — navigator.webdriver のスプーフィングも、自動化フラグの除去もありません — 駆動されたブラウザと人間を区別できない不正システムは、このプロジェクトが Connect-stores ページと交換する線ではないからです。これら4つの小売業者の利用規約はすべて、アカウント所有者による自動ログインを禁止しています。そのリスクは、ここだけでなくボタン自体にも開示されています。キャプチャされたセッションは、貼り付けられた資格情報とまったく同じように封印されます — 同じボールト、同じ reveal() 監査 — そして、まだどのアダプターもそれを使用していません。

  • エージェントは不透明なアカウントハンドルのみを表示し、それになる可能性のあるものは決して表示しません。

  • 承認面はプロセスごとのトークンの背後にあります。サーバー自身のコンソールに6桁のコードの横に印刷されます。ルート分離はゲートではありません: Basketed がインストールするすべてのクライアントにはシェルがあるため、エージェントは常に 127.0.0.1 に到達して任意のヘッダーを偽造できます。/api はまた、パネルのものと正確に等しい Origin を要求し、送信しない変更リクエストを拒否します。

  • ベンダーテキストは信頼できないデータです。 NFKC正規化され、制御文字、ゼロ幅、双方向オーバーライドが除去され、HTMLが除去され、長さが制限され、インジェクションパターンがフラグ付けされます。実際の防御はより強力です: 承認画面とカートハッシュは、数値および列挙フィールドと正規化された製品名のみから構築されます。 マーチャントが作成した文字列はどちらにも到達しません。

  • approval_id は CSPRNG であり、サーバー側でローカルセッションから派生したプリンシパルにバインドされます — エージェントが提供したものからは決して — そしてアトミックコンシューム内で再チェックされます。所有は決して認証ではありません(2026-07-28 ステートハンドルハイジャック)。

  • すべての応答に対するリダクションレイヤー。防御ではなくネットとして。ヒットはバグです。パネルはその数を表示します。

  • カードデータには触れず(PCIスコープ外)、小売業者のパスワードを保存せず、スクレイパーを出荷しません。


未構築、誰も主張しないように明記

Costco/Walmart/Amazon 向けの実際の小売業者アダプター(いずれもコンシューマーAPIを公開していません。ボールトは資格情報を保持しています — 貼り付けまたは Chrome キャプチャ — まだそれで認証するものはありません)、実際の小売業者 OAuth(4つのいずれも公開していません — Connect stores を参照)、そのプロトタイプ4つ以外のストア向けの Chrome ログインキャプチャ、モック IdP、承認チャネルB(elicitation)、compare_products、Orders ページ、MCPB、レジストリ公開、ChatGPT プラグイン提出。すべて計画に設計されていますが、どれも構築されていません。

Tesco はこのリストから外れた唯一の小売業者アダプターです(S16)— 上記の「データの出所」を参照: 実際の検索、実際の詳細、そして買い物客自身の貼り付けられたセッショントークンの背後にある実際のバスケット。Costco、Walmart、Amazon は、3つのいずれも Tesco のフロントエンドがたまたま公開している同等の非公式だが実際のエンドポイントを持っていないため、ここに留まります — それらの3つでの Chrome ログインセッションが代わりに何ができて何ができないかについては Connect stores を参照してください。

資格情報ボールトは、このリストから外れたもう1つの項目です(S14)— 上記のセキュリティを参照 — そして、以前ここでそれをチェックしていたドリフトガードは、現在は逆をチェックします: このファイルがそれが真実でなくなったときに正確にそれを否認しなくなること。

docs/ — BENCHMARK

Node ≥ 22 が必要です(node:sqlite のため、ネイティブビルドステップはありません — これは、開発および検証が行われた Windows で重要です)。

Related MCP Connectors

Related MCP Servers