rubik-jp

A public, read-only MCP server exposing product, job and real-estate listings from Japanese sources that have opted in to this distribution channel.

MCP 2026-07-28 Streamable HTTP, stateless No authentication Read-only Japan only · JPY

日本語 · English

日本語

rubik-jp は、この配信チャネルへの掲載に同意した日本国内の情報源から収集した 商品・求人・不動産のリストを、認証なしで読み取り専用に公開する MCP サーバーです。

接続先

エンドポイントPOST https://mcp.rubik.co.jp/mcp
稼働確認GET https://mcp.rubik.co.jp/healthz
認証不要(登録・トークンの取得は必要ありません)

ツール

商品

search_productsブランド、GTIN、状態、カテゴリ、価格帯
get_productsource_id と id で 1 件、説明文は全文

求人

search_jobs雇用形態、勤務地、給与、リモート
get_job求人 1 件

不動産

search_properties駅、徒歩分数、間取り、賃料、面積
get_property物件 1 件(掲載されている全駅を含む)

全カテゴリ共通

list_sources掲載に同意した情報提供元と、その出典表示文
data_version情報提供元ごとの鮮度
list_values絞り込みで実際に一致する値

はじめに(推奨の手順)

1list_sources — 情報源の一覧と鮮度。他のツールで使う source_id が得られます。
2list_values — 絞り込みに使える実際の値(雇用形態・ブランド・間取り・駅名など)。
3search_products / search_jobs / search_properties — 検索。3 文字以上で関連度順、並び順は sort で指定。ヘッダーの total= で総件数を確認。
4get_product / get_job / get_property — 1 件の全文取得。提示前に data_version で鮮度を確認。

ご利用にあたっての注意

絞り込みの値は推測しないでください。 多くの項目は情報源が公開した日本語そのままです。雇用形態は 正社員 や アルバイト であり、full-time では 0 件になります。 list_values で実際に存在する値を確認してください。0 件という結果は 「該当なし」と区別できません。

list_values の項目名は、原則としてそのまま絞り込み引数として使えます。 次の 4 項目のみ名称が異なります。station_name・line_name は station に、google_product_category は数値 ID なので category_id に渡してください。product_type と address には専用の絞り込みがないため q(全文検索)を ご利用ください。住所は station と max_walk_minutes の 併用を推奨します。

並び順が結果を左右します。 1 回の応答は最大 25 件です。検索語が 3 文字以上の場合は関連度順、それ以外は 新着順が既定です。価格順・賃料順・徒歩分数順が必要な場合は sort を 明示してください。実際に適用された並び順と総件数は応答ヘッダーに記載されます。

2 文字の検索語は全文検索索引では扱えません。 中古・新品・賃貸・新宿 などは 2 文字のため、索引ではなく走査で処理します。結果は正しく返りますが関連度順は 利用できません。3 文字以上で関連度順が有効になります。

求人・不動産の重複排除は行いません。 同一物件が複数の仲介業者から掲載されるのは日本では通常のことです(賃料・礼金の 条件もそれぞれ異なります)。信頼できる突合キーが存在しないため、 source_id で判別してください。商品は gtin で突合できます。

定義されていない引数はエラーになります(無視されません)。 limit・offset・page_size は存在しません。 1 ページは 25 件固定で、続きは cursor のみで取得します。これらを 渡すと Invalid arguments: object property at `/limit` is a disallowed additional property が返ります。

これは意図した動作です。黙って無視する方が危険だからです。項目名を打ち間違えた 場合、たとえば search_properties(statoin="新宿駅") は、絞り込みが 無視されて全件が「正常な検索結果」として返ってしまいます。エラーメッセージには 該当する引数名が含まれますので、名称を修正して再実行してください。

データは定期スナップショットであり、リアルタイムではありません。 情報源ごとに更新時刻が異なります。各結果には情報源の表示名・出典表示テキスト・ 更新日時を付与しています。価格・在庫・募集状況を「現在の情報」として提示する前に data_version で該当情報源の鮮度を確認し、出典を表示してください。

制限

1 回の応答につき 25 件・60 KB(引数で引き上げることはできません)。 1 分あたり 60 リクエスト。リクエスト本文は 256 KB まで。 検索結果の説明文は省略されます(全文は get_* をご利用ください)。 URL・ホスト名・IP アドレス・ファイルパスを受け取る項目はありません。


Connect

EndpointPOST https://mcp.rubik.co.jp/mcp
HealthGET https://mcp.rubik.co.jp/healthz
Server cardGET /.well-known/mcp/server-card.json
AuthNone. There is nothing to register and no token to obtain.

Most MCP clients take a URL:

{
  "mcpServers": {
    "rubik-jp": {
      "type": "http",
      "url": "https://mcp.rubik.co.jp/mcp"
    }
  }
}

Calling it directly: this protocol revision requires MCP-Protocol-Version, Mcp-Method and Mcp-Name headers, and the _meta envelope goes inside params.

curl -sS https://mcp.rubik.co.jp/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' \
  -H 'Mcp-Method: tools/call' \
  -H 'Mcp-Name: search_properties' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{
        "name":"search_properties",
        "arguments":{"station":"新宿","max_walk_minutes":10,"sort":"rent_asc"},
        "_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28",
                 "io.modelcontextprotocol/clientCapabilities":{}}}}'

Tools

Products

search_productsBrand, GTIN, condition, category, price range
get_productOne product by source_id + id, full description

Jobs

search_jobsEmployment type, location, salary, remote
get_jobOne posting

Real estate

search_propertiesStation, walk time, layout, rent, size
get_propertyOne property with every station it lists

Across all verticals

list_sourcesThe opted-in sources and their attribution text
data_versionFreshness per source
list_valuesThe values a given filter will actually match

Where to start

A short path that avoids the dead ends. Each step tells you what the next one can ask for.

1 list_sources — which sources exist, in which vertical, and how fresh each is. Gives you the source_id values every other tool accepts.
2 list_values — the vocabulary. Before filtering on employment_type, brand, layout or station_name, see what is actually in the data. Skipping this is the usual reason a search returns nothing.
3 search_products / search_jobs / search_properties — the search itself. Use a query of three or more characters to get relevance ranking, pass sort when you care about price or distance, and read total= in the header to see how much you did not get.
4 get_product / get_job / get_property — one record by source_id + id, with the full description that search truncates. Check data_version before you quote anything as current.

Five things that will otherwise cost you a day

1. Call list_values before guessing a filter value

Most filters hold the source's own Japanese text. employment_type is 正社員 or アルバイト — never "full-time". A wrong value returns zero rows, which looks identical to "nothing exists". This is the most common way a first integration fails.

list_values(vertical="jobs", field="employment_type")
→ 正社員|2
  アルバイト|1

Most list_values fields are named after the filter that consumes them, so the value goes straight back as that argument. Four are not — worth knowing before you go looking for an argument that isn't there:

list_values fieldpass the value as
station_name, line_namestation — one filter covers both
google_product_categorycategory_id — the values are the numeric ids
product_typeno exact filter; use q, which covers product_type
addressno exact filter; use q, or prefer station + max_walk_minutes

2. Ordering decides what you see

Responses are capped at 25 rows, so the sort chooses which 25. Searches default to relevance when you pass a query of three or more characters, and newest-first otherwise. If you want the cheapest, say so: sort=price_asc, rent_asc, walk_asc, size_desc. Every response header reports the ordering actually applied, plus total= so you can tell "25 of 25" from "25 of 1,400".

3. Two-character Japanese queries work, but are not ranked

中古, 新品, 賃貸, 新宿 are two characters. The full-text index cannot answer a query that short, so these fall back to a scan: results are correct, but relevance is unavailable and the header will say sort=updated_desc. Three characters or more gets you ranking.

4. Jobs and properties are never deduplicated across sources

The same building listed by three agencies is normal in Japan — three different rents, three different key-money terms. There is no reliable join key, so compare source_id yourself. Products can be joined on gtin.

5. An argument a tool does not declare is an error, not a no-op

There is no limit, offset or page_size — page size is fixed at 25 and pagination is by cursor only. Passing one returns Invalid arguments: object property at `/limit` is a disallowed additional property.

This is deliberate, because the alternative is worse. A filter name with a typo in it would otherwise be dropped in silence, and search_properties(statoin="新宿駅") would return the whole table as a successful search that looks exactly like a real answer. The error names the offending argument, so read it, fix the key and retry.

Freshness and attribution

The data is a periodic snapshot, not a live feed. Sources are refreshed independently, so one can be days staler than the dataset as a whole. Every result carries its source's display name, required attribution text and that source's own updated_at. Call data_version before presenting a price, availability or salary as current, and show the attribution.

Limits

25 rows and 60 KB per response, neither raisable by any argument. 60 requests per minute per IP, burst 20. Request bodies capped at 256 KB. Descriptions are truncated in search results — use the get_* tools for full text. No tool accepts a URL, hostname, IP address or file path.

Output is compact delimited text by default, because repeating field names on every row costs tokens for no information. Pass format="json" for a parseable document.