開発者向け情報

DTMFRAMEは、読み取り専用のRESTとMCPを提供します。公開originはhttps://dtmframe.comです。

MCP
https://dtmframe.com/mcp/
OpenAPI
/api/v1/openapi.jsonzodスキーマから生成
AI向けの案内
/llms.txt
認証
なし(アカウント不要)
操作
読み取りと計算だけ(購入・保存・通知なし)

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.
  • Also listed in the Claude Connectors Directory.
  • REST and OpenAPI: https://dtmframe.com/api/v1/openapi.json
  • Search by name: POST /api/v1/products/search/ with q and limit in the JSON body (the name never goes in the URL); over MCP, search_products with q.
  • 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 (and site_entry_page).
  • Terms · Privacy · llms.txt

エンドポイント

RESTとMCPは同じ処理を呼び、同じ枠で数えます。毎分は接続元ごとの上限です。
メソッドパスMCPツール区分毎分
GET /api/v1/products/ search_products cheap_read 60
POST /api/v1/products/search/ search_productsq cheap_read 60
GET /api/v1/products/{id}/offers/ get_current_offers cheap_read 60
GET /api/v1/deals/ list_deals cheap_read 60
POST /api/v1/resolve/ resolve_purchase_request bounded_compute 10
POST /api/v1/compare/ compare_products bounded_compute 10
POST /mcp/ tools/call上の5本 ツールの区分
  • OpenAPI:/api/v1/openapi.json(zodスキーマから生成)
  • REST(読み取り):GET /api/v1/products/、GET /api/v1/products/{id}/offers/、GET /api/v1/deals/
  • REST(名前で探す):POST /api/v1/products/search/(本文に q と limit。名前は本文で送り、URL には入りません。応答は常にno-store)。MCP では search_products の q で同じ検索ができます。
  • REST(計算):POST /api/v1/resolve/、POST /api/v1/compare/(JSON本文、32KiBまで、応答は常にno-store)

MCPで接続する

Claude に追加 追加の前に Claude の画面で確認があります。Claude のコネクタのディレクトリにも掲載しています。

URL
https://dtmframe.com/mcp/
POST
Streamable HTTP・無状態・JSON応答。batch配列は-32600で拒否
GET
サーバー発イベント用の SSE ストリーム(コメント行のみ、10 分で終了)
OPTIONS / DELETE
OPTIONS は CORS の preflight に 204。DELETE は 405
serverInfo
name = dtmframe、title = DTMFRAME、version = 0.1.0nameは公開ブランドから導いた安定識別子で、内部パッケージ名ではありません

MCPのinitializeが返すserverInfoは上のとおりです。tools/list が返すのは次の5本だけです:search_products、get_current_offers、resolve_purchase_request、compare_products、list_deals

curl -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' 'https://dtmframe.com/mcp/'
tools/list の応答(このサーバーが返すものをそのまま)
{
  "result": {
    "tools": [
      {
        "name": "search_products",
        "title": "Search products",
        "description": "Searches the product catalog of a Japanese music-production buying guide by typed, non-personal vocabulary: category, brand (slug or id), product_id, alias (an exact product name or registered alias, matched after normalization), plugin format, OS and license, or by a free-text product name (q). Returns products with ids, editions, brand, category, product type tokens (roles, e.g. eq, compressor, reverb, synth; absent when unknown), catalog status and checked_at; an unresolved alias returns 0 products with unresolved_constraints=[alias_unresolved]. Current offers of a product are returned by get_current_offers. Optional q (up to 200 characters) is a product name as typed: any spelling, katakana, hiragana or romaji; shopping words such as セール, 最安, sale or upgrade are ignored. A maker name at the start or end is set aside and the rest is matched against that maker's products only (Sennheiser e 935 matches e935 exactly); a model of another maker or an unlisted model gives 0 products. It is matched like the site's own search (exact, prefix, substring, several words, then similar spellings that begin like the query, carry the same numbers and, for several words, cover the last word); a product type or category word (reverb, リバーブ, コンプ, ヘッドフォン) answers with up to 20 products of that type. Typed filters narrow q before the cut to 20. At most 20 products, in match order; matched_alias is the registered spelling that matched and match_kind how (exact, prefix, substring, tokens, fuzzy, role, category); with a maker name, fuzzy only covers a typing error in a listed product name (a word with digits, such as a model number, has to match exactly), and without one it can be a sibling model. No match: 0 products with unresolved_constraints=[q_unresolved]. More than 20 matches: limits_hit=[result_limit] and search_complete=false, and next_cursor pages only within the 20. alias takes precedence over q; a q cursor is valid only for the same q and filters. q is used only to compute the answer; the text itself is not stored or logged. A product the site has measured itself also carries measurements (newest first) in summary form: evidence_id, edition_id, product_version, measured_at, results as named fields each with { value, decimals } (the decimals it was read with, e.g. export_duration_seconds, latency_compensation_samples, integrated_loudness_lufs, true_peak_dbtp), runs, result_statistic and disclosure (provided, loaned or self_purchased). The full record (environment, settings, comparison conditions, procedure, failure cases) is returned by compare_products. They are not a sound-quality rating; the key is absent when there is no measurement. A call with no filter (no q, alias, category, brand, product_id, format, os or license) and no cursor also carries, at the top level, measurements: the site's synthetic demonstrations (record_kind synthetic_demonstration), signal-processing facts shown with signals the site generated, concerning no product, in full: subject_ja, results ({ value, decimals }, e.g. null_residual_peak_dbfs, thd_percent, aliasing_max_dbfs, rt60_seconds), and how to run them again (script_ref path and commit, signal_seed, libraries, artifacts with sha256). canonical_page is the product page on this site; it carries the complete price table (including listings withheld on this channel), the merchant purchase links and the affiliate disclosure. site_entry_page is the same page with the entry marker for this channel. Read-only. Links are user_navigation handoffs (handoff_mode=user_navigation) and are not intended for prefetching or automatic clicking.",
        "inputSchema": {
          "$schema": "http://json-schema.org/draft-07/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",
                "vocal_synth",
                "audio_interface",
                "mixer",
                "preamp_outboard",
                "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": 160
            },
            "product_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            },
            "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
            },
            "q": {
              "description": "A product name as typed (1 to 200 characters), optionally with its maker: any spelling, katakana, hiragana or romaji. A maker name at the start or end (its name, slug, alias or katakana reading, also in the form e935 by Sennheiser or with a possessive) is set aside and the rest is matched against that maker's products only; a model of another maker, or one the catalogue does not list, matches nothing. Shopping words (セール, 最安, sale, upgrade, full version and similar) and a trailing product-type phrase (dynamic microphone and similar, whatever the product's type) are set aside, unless that would leave only a maker name or a type word, and a query of shopping words only matches nothing. Matched like the site's own search: exact, prefix (which can return a longer name of the same series, such as UR44C for UR44), substring, every word of several words, then similar spellings that begin like the query, carry the same numbers and, for several words, cover the last word; with a maker name, a similar spelling only covers a typing error in a listed product name: the same numbers, and a word that differs by one letter (two when both words have eight or more letters); a word with digits, such as a model number, or a three-letter word has to match exactly. A product type or category word (reverb, リバーブ, コンプ, ヘッドフォン), alone or after a maker name, and a maker name with a type phrase (studio headphones, dynamic EQ), answer with up to 20 products of that type; descriptive words such as dynamic or condenser are not checked against the data. It travels only in a request body, never in a URL, and is used only to compute the answer; the text itself is not stored or logged.",
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            }
          }
        },
        "annotations": {
          "title": "Search products",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        },
        "execution": {
          "taskSupport": "forbidden"
        }
      },
      {
        "name": "get_current_offers",
        "title": "Get current offers",
        "description": "Returns the current merchant offers of one product (product_id, product slug or edition_id; region JP by default): price in integer minor units with currency_exponent plus price_display (the same amount formatted, e.g. ¥29,700, or 無料 for a price of zero), tax and shipping status, seller class, presentation_state (active, ending_soon, stale, scheduled, unverified), price_certainty, checked_at, fresh_until and expires_at. Prices are observations with a verification state, not guarantees. An offer past fresh_until has presentation_state stale: its price is the last checked price (see checked_at) and it is not a basis for a lowest price, budget fit, cheapest cost or list_deals prices_from; expired offers are not returned. An offer priced in another currency may carry converted (a yen estimate: amount_minor, display such as 約¥7,800, rate_source ecb_eurofxref, rate_reference_date, rate_basis direct or cross_via_eur, and basis_note, a fixed English sentence saying that this site computed the estimate from the European Central Bank's reference rates of that date and that it is not a price) that is not used for ordering, budget fit, cheapest cost or lowest_observed. field_availability.offers is not_recorded when no offer of the product has been recorded. customer_segment is general, or existing_owner, education or nfr for a row the store names as an upgrade, crossgrade, update, EDU or NFR edition (maker and distributor names are not read). Rows that are not general stay in this list with their segment and are not used for a product's default price, lowest price, list_deals prices_from or largest_discount_percent; lowest_observed has no element for editions named upgrade, crossgrade, update, EDU or NFR. A price or listing that a source keeps off this channel is marked withheld_by_channel_policy (offers_coverage=partial) and is not estimated; Rakuten Ichiba listings, for example, appear only on the web page. Each offer's permitted_handoff_links contains canonical_page and site_entry_page, and merchant_plain only where the source permits link distribution on this channel. An optional lowest_observed[] gives, per edition with price history, the window minimum (window_min_amount_minor, window_min_observed_at, observed_since, missing_days, merchant_count, basis_ja) and names the current offer when it is the lowest price seen so far (current_is_lowest_so_far, label_tier high / probable, label_ja, rule_id). current_is_lowest_so_far is true, false or null; null comes with lowest_so_far_undetermined_reason (no_current_price, current_offer_not_on_this_channel, no_price_drop_observed or not_comparable), and false means the current price is above the window minimum. window_min_display is the window minimum formatted. The window minimum is the lowest of our own observations and recorded external references, stated with its basis; it is not a vendor list price or a regular price. An offer of a subscription or rent-to-own edition carries billing_period (month or year): its price is the charge for one period, and it has no reference_price or discount_rate_bps; field_availability.billing_period is unknown when the period is not verified. Such editions have no lowest_observed element. A bundle product with a complete member list carries bundle_cards[]: per shop and currency, the bundle price, each included single product with its verified price at the same shop (amount_minor null with excluded_reason when there is none; never estimated), break_even_count (bundle price divided by the median single price, two decimals, rounded half up), discount_vs_singles_bps (the bundle price against the sum of the priced single prices in basis points, floored; negative when the bundle costs more than the singles; computed over members_priced of members_total), the formula with its inputs, snapshot_id and computed_at. An optional price_record[] gives, per edition and currency, the lowest price observed in the stated window and the last observed price drop at a shop, with the days since each; it records observations and is not a forecast. An optional record_badges[] gives, per edition and currency, record_low (the current price is the lowest of our own record since record_since, after a higher price was recorded; record_low_ja states it with its scope, and it is not the word 過去最安) with new_low_on, and the previous sale (the most recently ended sale that covered the edition at a store: its days, store and recorded price) with below_previous_sale (the current price is below every price recorded in that sale's days; below_previous_sale_ja). false means the badge is not stated. canonical_page is the product page on this site; it carries the complete price table (including listings withheld on this channel), the merchant purchase links and the affiliate disclosure. site_entry_page is the same page with the entry marker for this channel. Read-only; no purchase execution. Links are user_navigation handoffs (handoff_mode=user_navigation) and are not intended for prefetching or automatic clicking.",
        "inputSchema": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "product_id": {
              "type": "string",
              "minLength": 1,
              "maxLength": 160
            },
            "region": {
              "default": "JP",
              "type": "string",
              "enum": [
                "JP",
                "US",
                "EU",
                "GB",
                "GLOBAL"
              ]
            },
            "condition": {
              "type": "string",
              "enum": [
                "new",
                "used",
                "refurbished",
                "unknown"
              ]
            }
          },
          "required": [
            "product_id"
          ]
        },
        "annotations": {
          "title": "Get current offers",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        },
        "execution": {
          "taskSupport": "forbidden"
        }
      },
      {
        "name": "resolve_purchase_request",
        "title": "Resolve a purchase request",
        "description": "Computation only: conditional product / setup / add-on candidates from typed constraints (category, brand, formats, OS, license, budget), optional free text and user-claimed ownership, bound to one published snapshot. Each candidate has fit reasons, a cost breakdown over the offers this channel may disclose, budget fit, acquisition steps, canonical_page and site_entry_page. For a product candidate, canonical_page is the product page on this site; it carries the complete price table (including listings withheld on this channel), the merchant purchase links and the affiliate disclosure. site_entry_page is the same page with the entry marker for this channel. For a setup candidate canonical_page is the /find/ page. No purchase, no persistence, no notification. For a subscription or rent-to-own edition, cost_breakdown.payable_now is the first charge, recurring_cost one later charge (estimated) and recurring_period its period (month or year); with budget_scope=total_including_recurring_12m the total counts 12 monthly or 1 yearly charge, otherwise budget_fit is judged on the first payment. Where a product has one-off and recurring editions, the default scope prices the one-off edition and the 12-month scope the edition with the smallest 12-month total (assumptions key edition_choice). A price is taken from the default confirmed-route class first (a maker store or a confirmed authorized dealer selling new; for hardware also domestic distribution); when a cheaper confirmed listing of the same edition lies outside that class, the candidate's mismatches state it with its amount. search_complete=false with optimality_scope=best_found marks an answer cut at a limit, a free-text term that looks like a product name (Latin letters, digits or katakana) but matches no registered alias (unresolved_constraints no_alias_match), or no candidates (no_candidates). Free-text aliases match whole words only. With a budget, candidates are ordered by budget_fit first (confirmed, estimated_within, estimated_over, over, unknown) before the answer is cut to max_candidates; when in-budget candidates are still cut, limits_hit contains budget_fit_candidates_truncated. An edition with no price in the requested currency keeps its price in the original currency in cost_breakdown and acquisition_steps[].cost, with budget_fit unknown and the reason in the candidate's mismatches; such an amount may carry converted (a yen estimate: amount_minor, display such as 約¥7,800, rate_source ecb_eurofxref, rate_reference_date, rate_basis direct or cross_via_eur, and basis_note, a fixed English sentence saying that this site computed the estimate from the European Central Bank's reference rates of that date and that it is not a price) that is not used for ordering, budget fit, cheapest cost or lowest_observed. A product's default price uses general rows of unrestricted editions only. When a restricted edition (upgrade, crossgrade, update, EDU or NFR) is named, by constraints.target_edition_id or a free-text alias, or when all of a product's editions are restricted, the answer prices that edition and marks it: customer_segment on cost_breakdown.payable_now and total and on the step cost, reason_codes restricted_edition_price:<segment>, eligibility_status conditional, a sentence in the candidate's mismatches, and the assumption restricted_edition_price (value the segment, basis user_provided, parsed_from_query or default). A product candidate carries product_name, and price_checked_at is the check time of the price used. Stale offers (past fresh_until) are not used for costs or budget fit. Bounded compute class (10 per minute, shared with POST /api/v1/resolve). Links are user_navigation handoffs (handoff_mode=user_navigation) and are not intended for prefetching or automatic clicking.",
        "inputSchema": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "type": "string",
              "const": "1.1"
            },
            "locale": {
              "default": "ja-JP",
              "type": "string",
              "minLength": 2,
              "maxLength": 32
            },
            "region": {
              "default": "JP",
              "type": "string",
              "enum": [
                "JP",
                "US",
                "EU",
                "GB",
                "GLOBAL"
              ]
            },
            "mode": {
              "type": "string",
              "enum": [
                "find_product",
                "build_setup",
                "improve_setup"
              ]
            },
            "query": {
              "type": "string",
              "maxLength": 2000
            },
            "constraints": {
              "default": {
                "budget_scope": "incremental_upfront_total",
                "presentation_sort": "fit"
              },
              "type": "object",
              "properties": {
                "budget": {
                  "type": "object",
                  "properties": {
                    "amount_minor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "currency": {
                      "type": "string",
                      "enum": [
                        "JPY",
                        "USD",
                        "EUR",
                        "GBP",
                        "KWD"
                      ]
                    }
                  },
                  "required": [
                    "amount_minor",
                    "currency"
                  ],
                  "additionalProperties": false
                },
                "budget_scope": {
                  "default": "incremental_upfront_total",
                  "type": "string",
                  "enum": [
                    "incremental_upfront_total",
                    "total_including_recurring_12m"
                  ]
                },
                "daw": {
                  "type": "string",
                  "enum": [
                    "logic-pro",
                    "ableton-live",
                    "cubase",
                    "studio-one",
                    "fl-studio",
                    "pro-tools",
                    "reaper",
                    "garageband",
                    "other"
                  ]
                },
                "experience": {
                  "type": "string",
                  "enum": [
                    "beginner",
                    "intermediate",
                    "advanced"
                  ]
                },
                "explanation_depth": {
                  "type": "string",
                  "enum": [
                    "standard",
                    "detailed"
                  ]
                },
                "license_preference": {
                  "type": "string",
                  "enum": [
                    "perpetual",
                    "subscription",
                    "rent_to_own",
                    "free",
                    "trial",
                    "unknown"
                  ]
                },
                "bundle_kind": {
                  "type": "string",
                  "enum": [
                    "vendor_bundle",
                    "setup_bundle"
                  ]
                },
                "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",
                    "vocal_synth",
                    "audio_interface",
                    "mixer",
                    "preamp_outboard",
                    "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": 160
                },
                "target_edition_id": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 160
                },
                "formats": {
                  "maxItems": 6,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "vst2",
                      "vst3",
                      "au",
                      "aax",
                      "clap",
                      "standalone"
                    ]
                  }
                },
                "os": {
                  "maxItems": 5,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "macos",
                      "windows",
                      "linux",
                      "ios",
                      "android"
                    ]
                  }
                },
                "presentation_sort": {
                  "default": "fit",
                  "type": "string",
                  "enum": [
                    "fit",
                    "cost",
                    "fewer_steps"
                  ]
                },
                "max_stores": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "exclude_hardware": {
                  "type": "boolean"
                },
                "delivery_deadline": {
                  "type": "string"
                },
                "setup_goal": {
                  "type": "string",
                  "enum": [
                    "guitar_recording",
                    "vocal_recording",
                    "dj_start",
                    "desktop_mixing"
                  ]
                }
              },
              "additionalProperties": false
            },
            "ownership_claims": {
              "default": [],
              "maxItems": 200,
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "entitlement_id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160
                  },
                  "edition_id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "perpetual",
                      "time_limited",
                      "trial",
                      "free_giveaway",
                      "hardware_bundled",
                      "nfr",
                      "education"
                    ]
                  },
                  "acquired_at": {
                    "type": "string"
                  },
                  "acquisition_source": {
                    "type": "string",
                    "enum": [
                      "purchase",
                      "giveaway",
                      "bundle",
                      "unknown"
                    ]
                  },
                  "registered": {
                    "type": "boolean"
                  },
                  "region": {
                    "type": "string",
                    "enum": [
                      "JP",
                      "US",
                      "EU",
                      "GB",
                      "GLOBAL"
                    ]
                  },
                  "transferable": {
                    "type": "boolean"
                  },
                  "edition_certainty": {
                    "type": "string",
                    "enum": [
                      "confirmed",
                      "unknown"
                    ]
                  },
                  "verification": {
                    "type": "string",
                    "const": "user_claimed"
                  }
                },
                "required": [
                  "entitlement_id",
                  "edition_id",
                  "kind",
                  "acquisition_source",
                  "registered",
                  "verification"
                ],
                "additionalProperties": false
              }
            },
            "owned_editions": {
              "default": [],
              "maxItems": 200,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 160
              }
            },
            "user_supplied_prices": {
              "maxItems": 10,
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "offer_id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160
                  },
                  "edition_id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160
                  },
                  "price": {
                    "type": "object",
                    "properties": {
                      "amount_minor": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "currency": {
                        "type": "string",
                        "enum": [
                          "JPY",
                          "USD",
                          "EUR",
                          "GBP",
                          "KWD"
                        ]
                      }
                    },
                    "required": [
                      "amount_minor",
                      "currency"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [
                  "price"
                ],
                "additionalProperties": false
              }
            },
            "detail": {
              "default": "summary",
              "type": "string",
              "enum": [
                "summary",
                "full"
              ]
            },
            "max_candidates": {
              "default": 3,
              "type": "integer",
              "minimum": 1,
              "maximum": 10
            }
          },
          "required": [
            "schema_version",
            "mode"
          ]
        },
        "annotations": {
          "title": "Resolve a purchase request",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        },
        "execution": {
          "taskSupport": "forbidden"
        }
      },
      {
        "name": "compare_products",
        "title": "Compare editions",
        "description": "Computation only: per-edition differences (license, billing_period for a subscription or rent-to-own edition, formats, OS, capabilities, cheapest known cost over the offers this channel may disclose, budget fit) for 2 to 10 edition ids under the same channel policy as resolve_purchase_request. Each row has canonical_page and site_entry_page. canonical_page is the product page on this site; it carries the complete price table (including listings withheld on this channel), the merchant purchase links and the affiliate disclosure. site_entry_page is the same page with the entry marker for this channel. cheapest_cost is taken from the default confirmed-route class first, as in resolve_purchase_request; an edition with a cheaper confirmed listing outside that class is named in assumptions (key cheapest_cost_default_route_first, value the edition id, note_ja with the amount). An edition with no price in the requested currency keeps cheapest_cost in the original currency, with budget_fit unknown and the assumption key cheapest_cost_foreign_currency (value the edition id); cheapest_cost may carry converted (a yen estimate: amount_minor, display such as 約¥7,800, rate_source ecb_eurofxref, rate_reference_date, rate_basis direct or cross_via_eur, and basis_note, a fixed English sentence saying that this site computed the estimate from the European Central Bank's reference rates of that date and that it is not a price) that is not used for ordering, budget fit, cheapest cost or lowest_observed. Each row's price_checked_at is the check time of that price. Stale offers (past fresh_until) are not used for cheapest_cost. A general edition is priced from general rows only; a named restricted edition (upgrade, crossgrade, update, EDU or NFR) is priced from its own rows, with customer_segment on cheapest_cost, eligibility_status conditional and the assumption restricted_edition_price once per segment. A row whose edition the site has measured itself also carries measurements in full: environment (host machine, OS, DAW and version, audio interface, sample rate, buffer size, tools), product_version, settings, measured_at, comparison conditions, procedure, results ({ value, decimals } per named field), runs and result_statistic, failure cases, material rights and disclosure. They are not a sound-quality rating and not part of differing_fields; numbers compare only between editions listed in compared_edition_ids. Bounded compute class (shared with POST /api/v1/compare). Links are user_navigation handoffs (handoff_mode=user_navigation) and are not intended for prefetching or automatic clicking.",
        "inputSchema": {
          "$schema": "http://json-schema.org/draft-07/schema#",
          "type": "object",
          "properties": {
            "schema_version": {
              "type": "string",
              "const": "1.1"
            },
            "locale": {
              "default": "ja-JP",
              "type": "string",
              "minLength": 2,
              "maxLength": 32
            },
            "region": {
              "default": "JP",
              "type": "string",
              "enum": [
                "JP",
                "US",
                "EU",
                "GB",
                "GLOBAL"
              ]
            },
            "edition_ids": {
              "minItems": 2,
              "maxItems": 10,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 160
              }
            },
            "constraints": {
              "default": {
                "budget_scope": "incremental_upfront_total"
              },
              "type": "object",
              "properties": {
                "budget": {
                  "type": "object",
                  "properties": {
                    "amount_minor": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "currency": {
                      "type": "string",
                      "enum": [
                        "JPY",
                        "USD",
                        "EUR",
                        "GBP",
                        "KWD"
                      ]
                    }
                  },
                  "required": [
                    "amount_minor",
                    "currency"
                  ],
                  "additionalProperties": false
                },
                "budget_scope": {
                  "default": "incremental_upfront_total",
                  "type": "string",
                  "enum": [
                    "incremental_upfront_total",
                    "total_including_recurring_12m"
                  ]
                },
                "daw": {
                  "type": "string",
                  "enum": [
                    "logic-pro",
                    "ableton-live",
                    "cubase",
                    "studio-one",
                    "fl-studio",
                    "pro-tools",
                    "reaper",
                    "garageband",
                    "other"
                  ]
                },
                "license_preference": {
                  "type": "string",
                  "enum": [
                    "perpetual",
                    "subscription",
                    "rent_to_own",
                    "free",
                    "trial",
                    "unknown"
                  ]
                },
                "formats": {
                  "maxItems": 6,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "vst2",
                      "vst3",
                      "au",
                      "aax",
                      "clap",
                      "standalone"
                    ]
                  }
                },
                "os": {
                  "maxItems": 5,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "macos",
                      "windows",
                      "linux",
                      "ios",
                      "android"
                    ]
                  }
                },
                "exclude_hardware": {
                  "type": "boolean"
                }
              },
              "additionalProperties": false
            },
            "ownership_claims": {
              "default": [],
              "maxItems": 200,
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "entitlement_id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160
                  },
                  "edition_id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160
                  },
                  "kind": {
                    "type": "string",
                    "enum": [
                      "perpetual",
                      "time_limited",
                      "trial",
                      "free_giveaway",
                      "hardware_bundled",
                      "nfr",
                      "education"
                    ]
                  },
                  "acquired_at": {
                    "type": "string"
                  },
                  "acquisition_source": {
                    "type": "string",
                    "enum": [
                      "purchase",
                      "giveaway",
                      "bundle",
                      "unknown"
                    ]
                  },
                  "registered": {
                    "type": "boolean"
                  },
                  "region": {
                    "type": "string",
                    "enum": [
                      "JP",
                      "US",
                      "EU",
                      "GB",
                      "GLOBAL"
                    ]
                  },
                  "transferable": {
                    "type": "boolean"
                  },
                  "edition_certainty": {
                    "type": "string",
                    "enum": [
                      "confirmed",
                      "unknown"
                    ]
                  },
                  "verification": {
                    "type": "string",
                    "const": "user_claimed"
                  }
                },
                "required": [
                  "entitlement_id",
                  "edition_id",
                  "kind",
                  "acquisition_source",
                  "registered",
                  "verification"
                ],
                "additionalProperties": false
              }
            },
            "user_supplied_prices": {
              "maxItems": 10,
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "offer_id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160
                  },
                  "edition_id": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 160
                  },
                  "price": {
                    "type": "object",
                    "properties": {
                      "amount_minor": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      },
                      "currency": {
                        "type": "string",
                        "enum": [
                          "JPY",
                          "USD",
                          "EUR",
                          "GBP",
                          "KWD"
                        ]
                      }
                    },
                    "required": [
                      "amount_minor",
                      "currency"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [
                  "price"
                ],
                "additionalProperties": false
              }
            },
            "detail": {
              "default": "summary",
              "type": "string",
              "enum": [
                "summary",
                "full"
              ]
            }
          },
          "required": [
            "schema_version",
            "edition_ids"
          ]
        },
        "annotations": {
          "title": "Compare editions",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        },
        "execution": {
          "taskSupport": "forbidden"
        }
      },
      {
        "name": "list_deals",
        "title": "List sales and campaigns",
        "description": "Lists the sales and campaigns recorded by a Japanese music-production buying guide (region JP), running ones first: title, kind, source (manufacturer store, merchant listings or manufacturer announcement), state, recorded start and end with deadline_status, checked_at / fresh_until, brands, categories, a sample of target products, prices_from (the lowest current price per currency among the general-segment offers this channel may disclose, stale offers excluded, with a display string; a sale with only restricted rows has prices_from [] and field_availability.prices_from unknown), and the largest discount against the merchant's own reference price among the general-segment offers this channel may disclose (per-period prices of subscription or rent-to-own editions count in neither). has_free_item is true when a disclosable offer of the sale is free (a 100% discount or a price of 0); a giveaway known only from an announcement has kind giveaway and no linked offers, so its has_free_item is false. Filters: brand slug, category slug, kind, source, state (running by default), limit, cursor. No merchant links are returned; offers of one product are returned by get_current_offers. canonical_page is the campaign page on this site; it carries every offer, the complete price table (including listings withheld on this channel), the merchant purchase links and the affiliate disclosure. site_entry_page is the same page with the entry marker for this channel. Read-only. Links are user_navigation handoffs (handoff_mode=user_navigation) and are not intended for prefetching or automatic clicking.",
        "inputSchema": {
          "$schema": "http://json-schema.org/draft-07/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": 160,
              "pattern": "^[a-z0-9][a-z0-9_-]{0,159}$"
            },
            "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": 160,
              "pattern": "^[a-z0-9][a-z0-9_-]{0,159}$"
            },
            "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
            }
          }
        },
        "annotations": {
          "title": "List sales and campaigns",
          "readOnlyHint": true,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        },
        "execution": {
          "taskSupport": "forbidden"
        }
      }
    ]
  },
  "jsonrpc": "2.0",
  "id": 1
}

利用上限の区分(接続元ごと・60秒窓)

区分と毎分の上限。RESTとMCPは同じ枠を共有します。
区分毎分対象
protocol_control120initialize、ping、tools/list、resources/list、prompts/list、notifications、HEAD/OPTIONS、未知のtool名・method
cheap_read60REST GET、POST /api/v1/products/search/、tools/call(search_products / get_current_offers / list_deals)
bounded_compute10POST /api/v1/resolve/・/api/v1/compare/、tools/call(resolve_purchase_request / compare_products)、/find/・/upgrade/ のフォーム送信。RESTとMCPで同じ枠
page240HTMLページ、RSS、sitemap

本文は32768バイトまで(超過は413)。応答は1048576バイトまで。同時処理は32件。超過時は429または503とRetry-Afterを返します。

search_products読み取り

GET/api/v1/products/POST/api/v1/products/search/cheap_read

製品とエディションを、分野・メーカー・形式・OS・ライセンスなどの語彙で探します。名前で探すときは q(MCP)か POST /api/v1/products/search/(REST)を使います。

curl

curl 'https://dtmframe.com/api/v1/products/?category=mastering_limiter_plugin&limit=20'
curl -H 'content-type: application/json' -d '{"schema_version":"1.1","q":"reverb"}' 'https://dtmframe.com/api/v1/products/search/'

MCP

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search_products",
    "arguments": {"q":"reverb"}
  }
}

要求パラメーター(GETのクエリ・MCPのarguments)

名前型必須詳細
categorystring任意値:daw / instrument_plugin / effect_plugin / mastering_limiter_plugin / mastering_suite / restoration / sample_library / ai_separation / ai_restoration / ai_composition / ai_voice / vocal_synth / audio_interface / mixer / preamp_outboard / 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
brandstring任意最大長:160
product_idstring任意最大長:160
aliasstring任意最大長:200
formatstring任意値:vst2 / vst3 / au / aax / clap / standalone
osstring任意値:macos / windows / linux / ios / android
licensestring任意値:perpetual / subscription / rent_to_own / free / trial / unknown
limitinteger任意既定:20、範囲:1〜50
cursorstring任意最大長:256

REST の GET では q を受け付けません(400)。名前で探すときは POST /api/v1/products/search/ を使います。

未知のキーは400で拒否します。aliasは表記正規化のうえ別名辞書へ完全一致し、解決できない場合は0件とunresolved_constraints=["alias_unresolved"]を返します(値は記録しません)。

応答(封筒 + products[] + next_cursor)

名前型必須詳細
productsarray必須
next_cursorstring,null必須
measurementsarray任意
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",
        "vocal_synth",
        "audio_interface",
        "mixer",
        "preamp_outboard",
        "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": 160
    },
    "product_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    },
    "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
    },
    "q": {
      "description": "A product name as typed (1 to 200 characters), optionally with its maker: any spelling, katakana, hiragana or romaji. A maker name at the start or end (its name, slug, alias or katakana reading, also in the form e935 by Sennheiser or with a possessive) is set aside and the rest is matched against that maker's products only; a model of another maker, or one the catalogue does not list, matches nothing. Shopping words (セール, 最安, sale, upgrade, full version and similar) and a trailing product-type phrase (dynamic microphone and similar, whatever the product's type) are set aside, unless that would leave only a maker name or a type word, and a query of shopping words only matches nothing. Matched like the site's own search: exact, prefix (which can return a longer name of the same series, such as UR44C for UR44), substring, every word of several words, then similar spellings that begin like the query, carry the same numbers and, for several words, cover the last word; with a maker name, a similar spelling only covers a typing error in a listed product name: the same numbers, and a word that differs by one letter (two when both words have eight or more letters); a word with digits, such as a model number, or a three-letter word has to match exactly. A product type or category word (reverb, リバーブ, コンプ, ヘッドフォン), alone or after a maker name, and a maker name with a type phrase (studio headphones, dynamic EQ), answer with up to 20 products of that type; descriptive words such as dynamic or condenser are not checked against the data. It travels only in a request body, never in a URL, and is used only to compute the answer; the text itself is not stored or logged.",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    }
  },
  "additionalProperties": false
}

get_current_offers読み取り

GET/api/v1/products/{id}/offers/cheap_read

1製品の、いまの販売条件(店ごとの価格・状態・確認時刻)を返します。例:GET https://dtmframe.com/api/v1/products/{product_id | slug | edition_id}/offers/?region=JP

curl

curl 'https://dtmframe.com/api/v1/products/hw-at-ath-m40x/offers/?region=JP'

MCP

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_current_offers",
    "arguments": {"product_id":"hw-at-ath-m40x","region":"JP"}
  }
}

要求パラメーター

名前型必須詳細
id(path)string必須product_id、製品slug、edition_idのいずれか。統合済みの旧IDは301で後継へ、未知は404
regionstring任意値:JP / US / EU / GB / GLOBAL、既定:JP
conditionstring任意値:new / used / refurbished / unknown

応答(封筒 + offers[] + offers_coverage + field_availability + withheld_fields)

名前型必須詳細
offersarray必須
offers_coveragestring必須値:none_recorded / partial / recorded
lowest_observedarray任意
bundle_cardsarray任意
price_recordarray任意
record_badgesarray任意
field_availabilityobject必須
withheld_fieldsarray必須

取得元との契約で当該チャネルへ出せない値はwithheld_by_channel_policyとして示し、推定で埋めません。並び順は全チャネル共通で、報酬額は使いません(同じ価格・条件の店は提携している店を先に並べます)。

応答はcontent[0].text(JSON文字列)とstructuredContentの両方に、RESTと同一の封筒と本文をresponse_channel: "mcp"で返します。

MCP入力スキーマ
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "product_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    },
    "region": {
      "default": "JP",
      "type": "string",
      "enum": [
        "JP",
        "US",
        "EU",
        "GB",
        "GLOBAL"
      ]
    },
    "condition": {
      "type": "string",
      "enum": [
        "new",
        "used",
        "refurbished",
        "unknown"
      ]
    }
  },
  "required": [
    "product_id"
  ],
  "additionalProperties": false
}

list_deals読み取り

GET/api/v1/deals/cheap_read

開催中・開始前のセールの一覧です。例:GET https://dtmframe.com/api/v1/deals/?limit=20

curl

curl 'https://dtmframe.com/api/v1/deals/?limit=20'

MCP

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_deals",
    "arguments": {"limit":20}
  }
}

要求パラメーター(GETのクエリ・MCPのarguments)

名前型必須詳細
brandstring任意最大長:160
categorystring任意最大長:160
kindstring任意値:sale / giveaway / purchase_bonus / coupon / bundle_change / cashback / upgrade_offer / seasonal_feature
sourcestring任意値:official / merchant / announcement
statestring任意値:running / ending_soon / scheduled / all、既定:running
limitinteger任意既定:20、範囲:1〜50
cursorstring任意最大長:256

応答

名前型必須詳細
dealsarray必須
next_cursorstring,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": 160,
      "pattern": "^[a-z0-9][a-z0-9_-]{0,159}$"
    },
    "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": 160,
      "pattern": "^[a-z0-9][a-z0-9_-]{0,159}$"
    },
    "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/api/v1/resolve/bounded_compute

三モード(find_product / build_setup / improve_setup)の条件付き提案を計算します。例:POST https://dtmframe.com/api/v1/resolve/

curl

curl -H 'content-type: application/json' -d '{"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}' 'https://dtmframe.com/api/v1/resolve/'

MCP

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "resolve_purchase_request",
    "arguments": {"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}
  }
}
要求本文の例(整形)
{
  "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
}

自由文・予算・お持ちの製品の入力・個別価格は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_versionstring必須固定値:1.1
localestring任意既定:ja-JP、最大長:32
regionstring任意値:JP / US / EU / GB / GLOBAL、既定:JP
modestring必須値:find_product / build_setup / improve_setup
querystring任意最大長:2000
constraintsobject任意既定:{"budget_scope":"incremental_upfront_total","presentation_sort":"fit"}
ownership_claimsarray任意既定:[]
owned_editionsarray任意既定:[]
user_supplied_pricesarray任意
detailstring任意値:summary / full、既定:summary
max_candidatesinteger任意既定:3、範囲:1〜10

constraints

名前型必須詳細
budgetobject任意
budget_scopestring任意値:incremental_upfront_total / total_including_recurring_12m、既定:incremental_upfront_total
dawstring任意値:logic-pro / ableton-live / cubase / studio-one / fl-studio / pro-tools / reaper / garageband / other
experiencestring任意値:beginner / intermediate / advanced
explanation_depthstring任意値:standard / detailed
license_preferencestring任意値:perpetual / subscription / rent_to_own / free / trial / unknown
bundle_kindstring任意値:vendor_bundle / setup_bundle
categorystring任意値:daw / instrument_plugin / effect_plugin / mastering_limiter_plugin / mastering_suite / restoration / sample_library / ai_separation / ai_restoration / ai_composition / ai_voice / vocal_synth / audio_interface / mixer / preamp_outboard / 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
brandstring任意最大長:160
target_edition_idstring任意最大長:160
formatsarray任意
osarray任意
presentation_sortstring任意値:fit / cost / fewer_steps、既定:fit
max_storesinteger任意範囲:1〜10
exclude_hardwareboolean任意
delivery_deadlinestring任意
setup_goalstring任意値:guitar_recording / vocal_recording / dj_start / desktop_mixing

応答(封筒 + candidates[] + unpriced_candidates[])

名前型必須詳細
schema_versionstring必須固定値:1.1
response_channelstring必須値:web / api / mcp
ruleset_versionstring必須最大長:64
assumptionsarray必須
catalog_scopestring必須固定値:published_snapshot
optimality_scopestring必須値:best_found / exhaustive_within_scope
data_mode_noticestring任意最大長:400
do_not_persistboolean必須
modestring必須値:find_product / build_setup / improve_setup
presentation_sortstring必須値:fit / cost / fewer_steps
candidatesarray必須
unpriced_candidatesarray必須

MCPのtools/callでは同じ本文をargumentsに入れます。応答はresponse_channel: "mcp"以外RESTと同一です(AC-15)。web限定の販売条件はどちらにも含まれません。

compare_products計算

POST/api/v1/compare/bounded_compute

例:POST https://dtmframe.com/api/v1/compare/(edition_ids 2〜10件)

curl

curl -H 'content-type: application/json' -d '{"schema_version":"1.1","edition_ids":["edn_hw_ath_m50x","edn_hw_ath_m50x_wh"]}' 'https://dtmframe.com/api/v1/compare/'

MCP

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "compare_products",
    "arguments": {"schema_version":"1.1","edition_ids":["edn_hw_ath_m50x","edn_hw_ath_m50x_wh"]}
  }
}
名前型必須詳細
schema_versionstring必須固定値:1.1
localestring任意既定:ja-JP、最大長:32
regionstring任意値:JP / US / EU / GB / GLOBAL、既定:JP
edition_idsarray必須
constraintsobject任意既定:{"budget_scope":"incremental_upfront_total"}
ownership_claimsarray任意既定:[]
user_supplied_pricesarray任意
detailstring任意値:summary / full、既定:summary

エディションごとのライセンス・形式・OS・機能・最安既知費用・予算区分とdiffering_fieldsを返します。制限と費用区分はresolve_purchase_requestと同じです。

共通の封筒

読み取りの3本(search_products・get_current_offers・list_deals)の応答に同じ形で付く項目です。計算の2本では、形の違う項目を各ツールの表に載せています。

名前型必須詳細
schema_versionstring必須
request_idstring必須最大長:160
catalog_snapshot_idstring必須最大長:160
policy_snapshot_idstring必須最大長:160
evaluation_scope_idstring必須
response_channelstring必須値:api / mcp
channel_classstring必須値:web / api / mcp / rss / email / social / unknown
ruleset_versionstring必須
computed_atstring必須
unresolved_constraintsarray必須
catalog_scopestring必須
search_completeboolean必須
limits_hitarray必須
excluded_unknownsarray必須
purchase_execution_availableboolean必須固定値:false
affiliate_disclosurestring必須値:none / program_not_applied / affiliate_link
data_mode_noticestring任意

引き継ぎリンク

  • すべてのリンクは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)が付きます。購入先へのリンクと全販売店の価格表、広告関係の表示はそのページにあります。

提供の方針

現在提供しているツール

現在動作するのは次の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を読み、拒否された経路は取得しません。登録していないドメインには要求を送りません。
  • Steinbergオンラインショップのページが読み込む製品データ(ocl-steinberg-live.steinberg.netのJSON)は、認証なしで公開されている範囲だけを、およそ1時間ごとに読みます。製品データの要求に401・403・429が返った回は、そこで取得を止めます。
  • 取得間隔は取得元ごとに決め、既定は60分に1回です。同じ取得元へ1秒に2回以上は要求しません。
  • 本文や画像は保存しません。価格、期限、割引率などの事実だけを、取得日時と出典URLとともに記録します。
  • 取得を止めてほしい場合は、robots.txtでDTMFRAMEBotを拒否するか、/corrections/のフォームで知らせてください(返信はしません)。
応答に含まれるもの
  • 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/

公開データ版 c3d160ac 生成 出典・訂正の受付