開発者向け情報
DTMFRAMEは、読み取り専用のRESTとMCPを提供します。公開originはhttps://dtmframe.comです。
現在提供しているツール
現在動作するのは次の5つだけです(読み取り3つ: list_deals・search_products・get_current_offers、計算2つ: resolve_purchase_request・compare_products)。実装していないツールを一覧や説明に載せることはしません。
list_deals:開催中・予定のセールとキャンペーンの一覧を返します。ブランド・分野・種別・出所・状態で絞り込めます。販売店へのリンクは含みません(読み取り)。search_products:製品とエディションを条件で検索します(読み取り)。get_current_offers:対象の現在の販売条件を返します。価格を取得できていない場合は未確認として返します(読み取り)。resolve_purchase_request:条件とお持ちの製品の入力から候補・費用・買い方(購入経路)を計算します(計算)。compare_products:指定したエディションの差を計算します(計算)。
tools/listは、この動作する5つだけを返します。未知のツール名は引数エラーとして拒否します。計算の2つはbounded_computeの別枠で制限します。
利用条件(API・MCP)
- 読み取り専用です。呼び出しによって公開・通知・購入・課金が始まることはありません。
- 入力の上限、チャネルごとの提供範囲、費用の制限を適用します。
- 取得元との契約により提供できない値は、提供範囲の表示とともに省略します。
- 禁止する行為と免責は/terms/に従います。
副作用
- ツールの意味上の副作用は情報取得と計算だけです。
- 呼び出しによって、公開、通知、購入、外部の高額な生成が始まることはありません。
- 購入の実行は提供していません。応答の
purchase_execution_availableは常にfalseです。 readOnlyHintは説明であり、認可ではありません。- 外部から取得した文章は資料として扱い、指示や命令としては扱いません。
利用上限の区分
RESTとMCPに同じ入力上限、チャネルごとの提供範囲、費用制限を適用します。区分は次の3つです。
protocol_control:接続の初期化、ツール一覧、ping、通知。計算の利用としては数えませんが、接続とメッセージの上限があります。cheap_read:取得済みの値を返す読み取り。bounded_compute:経路計算など計算を伴う処理。別枠の上限で止まります。
GETとPOSTの違いで上限を決めることはしません。区分はツールの登録時にサーバー側で決めます。
引き継ぎリンク
- 販売店へのリンクには
handoff_mode=user_navigationを付けます。人が操作して遷移することを前提とします。 - 外部のエージェントによる事前取得(prefetch)や自動クリックは案内しません。リンクの配布許可と、botによるクリックの許可は別です。
- 機械向けの追跡URLは、該当プログラムが当該媒体での配布を許可した場合にだけ返します。提携プログラムがサイト本体(web)でだけ配布を許している販売店の出品は、API・MCPでは販売店へのリンクを含めません。省いたことは
field_availability.permitted_handoff_linksのwithheld_by_channel_policyと、withheld_fieldsのmerchant_linkで示します。購入先へのリンクはcanonical_pageのページにあります。提携のない販売店の通常のリンクは、取得元の権限が当該チャネルへの配布を許す場合にだけ含めます。 - 任意のURLを受け取って転送する中継は作りません。
当サイトの取得ボット
- 当サイトは、事前に登録した公式サイトと販売店の公開ページから、セールの事実だけを取得します。
- 名乗りは
DTMFRAMEBot/1.0で、UA文字列にこのページのURLを含めます。 - robots.txtを読み、拒否された経路は取得しません。登録していないドメインには要求を送りません。
- 取得間隔は取得元ごとに決め、既定は60分に1回です。同じ取得元へ1秒に2回以上は要求しません。
- 本文や画像は保存しません。価格、期限、割引率などの事実だけを、取得日時と出典URLとともに記録します。
- 取得を止めてほしい場合は、robots.txtで
DTMFRAMEBotを拒否するか、/contact/から連絡してください。
応答に含まれるもの
catalog_snapshot_id、policy_snapshot_id、ruleset_version、computed_at。evaluation_scope_id、unresolved_constraints、limits_hit、excluded_unknowns。- 取得元との契約で提供できない値は
withheld_by_channel_policyとして示します。値の欠落を別の推薦で埋めることはしません。 affiliate_disclosure:広告関係の状態。
接続
- 公開の無状態読み取りにアカウントは不要です。独自のOAuthや独自の暗号方式は作りません。
- 接続用のスキルは英語で用意します。外部のAIに追加の権限やCookieの提出を求めることはしません。
- 障害時は、古い値を現在価格として返さず、未確認または期限切れとして示します。
- RSS以外の配信(メールやSNS)は行っていません。
- 利用条件:/terms/
- 編集方法:/methodology/
- 広告関係の表示:/disclosures/
In English
DTMFRAME publishes Japanese music-production products (plugins and gear), their current shop prices and running sales. Read-only; no account, no authentication.
- MCP:
https://dtmframe.com/mcp/(Streamable HTTP, stateless). Tools:search_products,get_current_offers,resolve_purchase_request,compare_products,list_deals. - REST and OpenAPI: https://dtmframe.com/api/v1/openapi.json
- Limits per client: 60 reads and 10 computations per minute.
- Responses carry no affiliate tracking links. The shop links, the full price table of every shop and the advertising disclosure are on the page each response names as
canonical_page(andsite_entry_page). - Terms · Privacy · llms.txt
エンドポイント
- OpenAPI:/api/v1/openapi.json(zodスキーマから生成)
- REST(読み取り):
GET /api/v1/products/、GET /api/v1/products/%7Bid%7D/offers/、GET /api/v1/deals/ - REST(計算):
POST /api/v1/resolve/、POST /api/v1/compare/(JSON本文、32KiBまで、応答は常にno-store) - MCP:
POST /mcp/(Streamable HTTP・無状態・JSON応答。GET/DELETEは405。batch配列は-32600で拒否) - MCPの
initializeが返すserverInfo:name=dtmframe、title= DTMFRAME、version=0.1.0(nameは公開ブランドから導いた安定識別子で、内部パッケージ名ではありません)
`tools/list` が返すのは次の5本だけです:search_products get_current_offers resolve_purchase_request compare_products list_deals
AI 向けのサイト案内:/llms.txt。Claude で使うときは Claude に追加(追加の前に Claude の画面で確認があります)。
利用上限の区分(接続元ごと・60秒窓)
| 区分 | 毎分 | 対象 |
|---|---|---|
| protocol_control | 120 | initialize、ping、tools/list、resources/list、prompts/list、notifications、HEAD/OPTIONS、未知のtool名・method |
| cheap_read | 60 | REST GET、tools/call(search_products / get_current_offers / list_deals) |
| bounded_compute | 10 | POST /api/v1/resolve/・/api/v1/compare/、tools/call(resolve_purchase_request / compare_products)、/find/・/upgrade/ のフォーム送信。RESTとMCPで同じ枠 |
| page | 240 | HTMLページ、RSS、sitemap |
本文は32768バイトまで(超過は413)。応答は1048576バイトまで。同時処理は32件。超過時は429または503とRetry-Afterを返します。
引き継ぎリンク
- すべてのリンクは
handoff_mode=user_navigationです。人が選んで遷移する前提で、prefetchや自動クリックは案内しません。 canonical_pageは常にパラメーターなしの正規URLです。entry=api/entry=mcp付きの入口はpermitted_handoff_links[kind=site_entry_page]として別に返します。- 販売店の通常URL(
merchant_plain)は、取得元の権限が当該チャネルへのリンク配布を許す場合だけ含めます。承認済みで、追跡リンクの雛形があり、web だけに許された提携の店舗の出品には、通常URLも付けません(省いたことは応答に示します)。未承認の提携の店舗は、通常URLがそのまま付きます。機械向け追跡URLは返しません。 - すべての応答に、当サイトの製品ページへの入口(
site_entry_page)が付きます。購入先へのリンクと全販売店の価格表、広告関係の表示はそのページにあります。
search_products
例:GET https://dtmframe.com/api/v1/products/?category=mastering_limiter_plugin&limit=20
要求パラメーター(GETのクエリ・MCPのarguments)
| 名前 | 型 | 必須 | 詳細 |
|---|---|---|---|
| category | string | 任意 | 値:daw / instrument_plugin / effect_plugin / mastering_limiter_plugin / mastering_suite / restoration / sample_library / ai_separation / ai_restoration / ai_composition / ai_voice / audio_interface / microphone / headphones / studio_monitor / guitar / bass / keyboard / synthesizer / electronic_instrument / pedal / multi_effect / amp_simulator / dj_controller / dj_player / dj_mixer / midi_controller / accessory / computer / computer_peripheral |
| brand | string | 任意 | 最大長:64 |
| product_id | string | 任意 | 最大長:64 |
| alias | string | 任意 | 最大長:200 |
| format | string | 任意 | 値:vst2 / vst3 / au / aax / clap / standalone |
| os | string | 任意 | 値:macos / windows / linux / ios / android |
| license | string | 任意 | 値:perpetual / subscription / rent_to_own / free / trial / unknown |
| limit | integer | 任意 | 既定:20、範囲:1〜50 |
| cursor | string | 任意 | 最大長:256 |
未知のキーは400で拒否します。aliasは表記正規化のうえ別名辞書へ完全一致し、解決できない場合は0件とunresolved_constraints=["alias_unresolved"]を返します(値は記録しません)。
応答(封筒 + products[] + next_cursor)
| 名前 | 型 | 必須 | 詳細 |
|---|---|---|---|
| schema_version | string | 必須 | |
| request_id | string | 必須 | 最大長:64 |
| catalog_snapshot_id | string | 必須 | 最大長:64 |
| policy_snapshot_id | string | 必須 | 最大長:64 |
| evaluation_scope_id | string | 必須 | |
| response_channel | string | 必須 | 値:api / mcp |
| channel_class | string | 必須 | 値:web / api / mcp / rss / email / social / unknown |
| ruleset_version | string | 必須 | |
| computed_at | string | 必須 | |
| unresolved_constraints | array | 必須 | |
| catalog_scope | string | 必須 | |
| search_complete | boolean | 必須 | |
| limits_hit | array | 必須 | |
| excluded_unknowns | array | 必須 | |
| purchase_execution_available | boolean | 必須 | 固定値:false |
| affiliate_disclosure | string | 必須 | 値:none / program_not_applied / affiliate_link |
| data_mode_notice | string | 任意 | |
| products | array | 必須 | |
| next_cursor | string,null | 必須 |
MCP入力スキーマ(tools/listと同一)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"category": {
"type": "string",
"enum": [
"daw",
"instrument_plugin",
"effect_plugin",
"mastering_limiter_plugin",
"mastering_suite",
"restoration",
"sample_library",
"ai_separation",
"ai_restoration",
"ai_composition",
"ai_voice",
"audio_interface",
"microphone",
"headphones",
"studio_monitor",
"guitar",
"bass",
"keyboard",
"synthesizer",
"electronic_instrument",
"pedal",
"multi_effect",
"amp_simulator",
"dj_controller",
"dj_player",
"dj_mixer",
"midi_controller",
"accessory",
"computer",
"computer_peripheral"
]
},
"brand": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"product_id": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"alias": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"format": {
"type": "string",
"enum": [
"vst2",
"vst3",
"au",
"aax",
"clap",
"standalone"
]
},
"os": {
"type": "string",
"enum": [
"macos",
"windows",
"linux",
"ios",
"android"
]
},
"license": {
"type": "string",
"enum": [
"perpetual",
"subscription",
"rent_to_own",
"free",
"trial",
"unknown"
]
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor": {
"type": "string",
"minLength": 1,
"maxLength": 256
}
},
"additionalProperties": false
} get_current_offers
例:GET https://dtmframe.com/api/v1/products/%7Bproduct_id%20%7C%20slug%20%7C%20edition_id%7D/offers/?region=JP
要求パラメーター
| 名前 | 型 | 必須 | 詳細 |
|---|---|---|---|
| id(path) | string | 必須 | product_id、製品slug、edition_idのいずれか。統合済みの旧IDは301で後継へ、未知は404 |
| region | string | 任意 | 値:JP / US / EU / GB / GLOBAL、既定:JP |
| condition | string | 任意 | 値:new / used / refurbished / unknown |
応答(封筒 + offers[] + offers_coverage + field_availability + withheld_fields)
| 名前 | 型 | 必須 | 詳細 |
|---|---|---|---|
| schema_version | string | 必須 | |
| request_id | string | 必須 | 最大長:64 |
| catalog_snapshot_id | string | 必須 | 最大長:64 |
| policy_snapshot_id | string | 必須 | 最大長:64 |
| evaluation_scope_id | string | 必須 | |
| response_channel | string | 必須 | 値:api / mcp |
| channel_class | string | 必須 | 値:web / api / mcp / rss / email / social / unknown |
| ruleset_version | string | 必須 | |
| computed_at | string | 必須 | |
| unresolved_constraints | array | 必須 | |
| catalog_scope | string | 必須 | |
| search_complete | boolean | 必須 | |
| limits_hit | array | 必須 | |
| excluded_unknowns | array | 必須 | |
| purchase_execution_available | boolean | 必須 | 固定値:false |
| affiliate_disclosure | string | 必須 | 値:none / program_not_applied / affiliate_link |
| data_mode_notice | string | 任意 | |
| offers | array | 必須 | |
| offers_coverage | string | 必須 | 値:none_recorded / partial / recorded |
| lowest_observed | array | 任意 | |
| field_availability | object | 必須 | |
| withheld_fields | array | 必須 |
取得元との契約で当該チャネルへ出せない値はwithheld_by_channel_policyとして示し、推定で埋めません。並び順は全チャネル共通で、報酬額は使いません(同じ価格・条件の店は提携している店を先に並べます)。
MCP入力スキーマ
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"product_id": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"region": {
"default": "JP",
"type": "string",
"enum": [
"JP",
"US",
"EU",
"GB",
"GLOBAL"
]
},
"condition": {
"type": "string",
"enum": [
"new",
"used",
"refurbished",
"unknown"
]
}
},
"required": [
"product_id"
],
"additionalProperties": false
} MCP呼び出し例
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_current_offers",
"arguments": {
"product_id": "{product_id}",
"region": "JP"
}
}
} 応答はcontent[0].text(JSON文字列)とstructuredContentの両方に、RESTと同一の封筒と本文をresponse_channel: "mcp"で返します。
list_deals
開催中・開始前のセールの一覧です。例:GET https://dtmframe.com/api/v1/deals/?limit=20
要求パラメーター(GETのクエリ・MCPのarguments)
| 名前 | 型 | 必須 | 詳細 |
|---|---|---|---|
| brand | string | 任意 | 最大長:128 |
| category | string | 任意 | 最大長:64 |
| kind | string | 任意 | 値:sale / giveaway / purchase_bonus / coupon / bundle_change / cashback / upgrade_offer / seasonal_feature |
| source | string | 任意 | 値:official / merchant / announcement |
| state | string | 任意 | 値:running / ending_soon / scheduled / all、既定:running |
| limit | integer | 任意 | 既定:20、範囲:1〜50 |
| cursor | string | 任意 | 最大長:256 |
応答
| 名前 | 型 | 必須 | 詳細 |
|---|---|---|---|
| schema_version | string | 必須 | |
| request_id | string | 必須 | 最大長:64 |
| catalog_snapshot_id | string | 必須 | 最大長:64 |
| policy_snapshot_id | string | 必須 | 最大長:64 |
| evaluation_scope_id | string | 必須 | |
| response_channel | string | 必須 | 値:api / mcp |
| channel_class | string | 必須 | 値:web / api / mcp / rss / email / social / unknown |
| ruleset_version | string | 必須 | |
| computed_at | string | 必須 | |
| unresolved_constraints | array | 必須 | |
| catalog_scope | string | 必須 | |
| search_complete | boolean | 必須 | |
| limits_hit | array | 必須 | |
| excluded_unknowns | array | 必須 | |
| purchase_execution_available | boolean | 必須 | 固定値:false |
| affiliate_disclosure | string | 必須 | 値:none / program_not_applied / affiliate_link |
| data_mode_notice | string | 任意 | |
| deals | array | 必須 | |
| next_cursor | string,null | 必須 |
MCP入力スキーマ
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brand": {
"description": "Brand slug as on /brands/{slug}/ (the manufacturer_id from search_products is accepted too).",
"type": "string",
"minLength": 1,
"maxLength": 128,
"pattern": "^[a-z0-9][a-z0-9_-]{0,127}$"
},
"category": {
"description": "Category slug as on /categories/{slug}/, e.g. audio-interface (the search_products spelling audio_interface is accepted too).",
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[a-z0-9][a-z0-9_-]{0,127}$"
},
"kind": {
"description": "Campaign kind.",
"type": "string",
"enum": [
"sale",
"giveaway",
"purchase_bonus",
"coupon",
"bundle_change",
"cashback",
"upgrade_offer",
"seasonal_feature"
]
},
"source": {
"description": "official = manufacturer store, merchant = reseller or marketplace listings, announcement = manufacturer announcement without listings.",
"type": "string",
"enum": [
"official",
"merchant",
"announcement"
]
},
"state": {
"default": "running",
"description": "running (default) = active, ending_soon or stale; ending_soon; scheduled; all = every state including ended campaigns.",
"type": "string",
"enum": [
"running",
"ending_soon",
"scheduled",
"all"
]
},
"limit": {
"default": 20,
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor": {
"description": "Opaque next_cursor of the previous page (bound to one published snapshot).",
"type": "string",
"minLength": 1,
"maxLength": 256
}
},
"additionalProperties": false
} resolve_purchase_request(計算)
例:POST https://dtmframe.com/api/v1/resolve/
{
"schema_version": "1.1",
"mode": "find_product",
"constraints": {
"budget": {
"amount_minor": 50000,
"currency": "JPY"
},
"daw": "logic-pro",
"experience": "beginner",
"category": "mastering_limiter_plugin"
},
"ownership_claims": [],
"max_candidates": 3
} 三モード(find_product / build_setup / improve_setup)の条件付き提案を計算します。自由文・予算・お持ちの製品の入力・個別価格はPOST本文だけで受け取り、URL・アクセスログ・エラー記録に入れません。お持ちの製品の入力が空のときはownership_state=not_provided(「何も所有していない」とは扱いません)。計算は固定サイズの計算worker(2 worker・待ち行列16・実行期限1秒・待機期限2秒)で行い、飽和時は503(compute_busy)、期限超過で検証済みの途中案が無いときは504(compute_deadline)を返します。途中案がある場合はsearch_complete=false / optimality_scope=best_foundで返します。
要求本文(上位キー)
| 名前 | 型 | 必須 | 詳細 |
|---|---|---|---|
| schema_version | string | 必須 | 固定値:1.1 |
| locale | string | 任意 | 既定:ja-JP、最大長:32 |
| region | string | 任意 | 値:JP / US / EU / GB / GLOBAL、既定:JP |
| mode | string | 必須 | 値:find_product / build_setup / improve_setup |
| query | string | 任意 | 最大長:2000 |
| constraints | object | 任意 | 既定:[object Object] |
| ownership_claims | array | 任意 | 既定: |
| owned_editions | array | 任意 | 既定: |
| user_supplied_prices | array | 任意 | |
| detail | string | 任意 | 値:summary / full、既定:summary |
| max_candidates | integer | 任意 | 既定:3、範囲:1〜10 |
constraints
| 名前 | 型 | 必須 | 詳細 |
|---|---|---|---|
| budget | object | 任意 | |
| budget_scope | string | 任意 | 値:incremental_upfront_total / total_including_recurring_12m、既定:incremental_upfront_total |
| daw | string | 任意 | 値:logic-pro / ableton-live / cubase / studio-one / fl-studio / pro-tools / reaper / garageband / other |
| experience | string | 任意 | 値:beginner / intermediate / advanced |
| explanation_depth | string | 任意 | 値:standard / detailed |
| license_preference | string | 任意 | 値:perpetual / subscription / rent_to_own / free / trial / unknown |
| bundle_kind | string | 任意 | 値:vendor_bundle / setup_bundle |
| category | string | 任意 | 値:daw / instrument_plugin / effect_plugin / mastering_limiter_plugin / mastering_suite / restoration / sample_library / ai_separation / ai_restoration / ai_composition / ai_voice / audio_interface / microphone / headphones / studio_monitor / guitar / bass / keyboard / synthesizer / electronic_instrument / pedal / multi_effect / amp_simulator / dj_controller / dj_player / dj_mixer / midi_controller / accessory / computer / computer_peripheral |
| brand | string | 任意 | 最大長:128 |
| target_edition_id | string | 任意 | 最大長:128 |
| formats | array | 任意 | |
| os | array | 任意 | |
| presentation_sort | string | 任意 | 値:fit / cost / fewer_steps、既定:fit |
| max_stores | integer | 任意 | 範囲:1〜10 |
| exclude_hardware | boolean | 任意 | |
| delivery_deadline | string | 任意 | |
| setup_goal | string | 任意 | 値:guitar_recording / vocal_recording / dj_start / desktop_mixing |
応答(封筒 + candidates[] + unpriced_candidates[])
| 名前 | 型 | 必須 | 詳細 |
|---|---|---|---|
| schema_version | string | 必須 | 固定値:1.1 |
| request_id | string | 必須 | 最大長:128 |
| catalog_snapshot_id | string | 必須 | 最大長:128 |
| policy_snapshot_id | string | 必須 | 最大長:128 |
| evaluation_scope_id | string | 必須 | |
| response_channel | string | 必須 | 値:web / api / mcp |
| channel_class | string | 必須 | 値:web / api / mcp / rss / email / social / unknown |
| ruleset_version | string | 必須 | 最大長:64 |
| computed_at | string | 必須 | |
| assumptions | array | 必須 | |
| unresolved_constraints | array | 必須 | |
| catalog_scope | string | 必須 | 固定値:published_snapshot |
| search_complete | boolean | 必須 | |
| optimality_scope | string | 必須 | 値:best_found / exhaustive_within_scope |
| limits_hit | array | 必須 | |
| purchase_execution_available | boolean | 必須 | 固定値:false |
| excluded_unknowns | array | 必須 | |
| affiliate_disclosure | string | 必須 | 値:none / program_not_applied / affiliate_link |
| data_mode_notice | string | 任意 | 最大長:400 |
| do_not_persist | boolean | 必須 | |
| mode | string | 必須 | 値:find_product / build_setup / improve_setup |
| presentation_sort | string | 必須 | 値:fit / cost / fewer_steps |
| candidates | array | 必須 | |
| unpriced_candidates | array | 必須 |
MCPのtools/callでは同じ本文をargumentsに入れます。応答はresponse_channel: "mcp"以外RESTと同一です(AC-15)。web限定の販売条件はどちらにも含まれません。
compare_products(計算)
例:POST https://dtmframe.com/api/v1/compare/(edition_ids 2〜10件)
| 名前 | 型 | 必須 | 詳細 |
|---|---|---|---|
| schema_version | string | 必須 | 固定値:1.1 |
| locale | string | 任意 | 既定:ja-JP、最大長:32 |
| region | string | 任意 | 値:JP / US / EU / GB / GLOBAL、既定:JP |
| edition_ids | array | 必須 | |
| constraints | object | 任意 | 既定:[object Object] |
| ownership_claims | array | 任意 | 既定: |
| user_supplied_prices | array | 任意 | |
| detail | string | 任意 | 値:summary / full、既定:summary |
エディションごとのライセンス・形式・OS・機能・最安既知費用・予算区分とdiffering_fieldsを返します。制限と費用区分はresolve_purchase_requestと同じです。
公開データ版 4e74205b 生成 出典・訂正の受付