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.
日本語
rubik-jp は、この配信チャネルへの掲載に同意した日本国内の情報源から収集した 商品・求人・不動産のリストを、認証なしで読み取り専用に公開する MCP サーバーです。
接続先
| エンドポイント | POST https://mcp.rubik.co.jp/mcp |
|---|---|
| 稼働確認 | GET https://mcp.rubik.co.jp/healthz |
| 認証 | 不要(登録・トークンの取得は必要ありません) |
ツール
商品
search_products | ブランド、GTIN、状態、カテゴリ、価格帯 |
|---|---|
get_product | source_id と id で 1 件、説明文は全文 |
求人
search_jobs | 雇用形態、勤務地、給与、リモート |
|---|---|
get_job | 求人 1 件 |
不動産
search_properties | 駅、徒歩分数、間取り、賃料、面積 |
|---|---|
get_property | 物件 1 件(掲載されている全駅を含む) |
全カテゴリ共通
list_sources | 掲載に同意した情報提供元と、その出典表示文 |
|---|---|
data_version | 情報提供元ごとの鮮度 |
list_values | 絞り込みで実際に一致する値 |
はじめに(推奨の手順)
| 1 | list_sources — 情報源の一覧と鮮度。他のツールで使う source_id が得られます。 |
|---|---|
| 2 | list_values — 絞り込みに使える実際の値(雇用形態・ブランド・間取り・駅名など)。 |
| 3 | search_products / search_jobs / search_properties — 検索。3 文字以上で関連度順、並び順は sort で指定。ヘッダーの total= で総件数を確認。 |
| 4 | get_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
| Endpoint | POST https://mcp.rubik.co.jp/mcp |
|---|---|
| Health | GET https://mcp.rubik.co.jp/healthz |
| Server card | GET /.well-known/mcp/server-card.json |
| Auth | None. 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_products | Brand, GTIN, condition, category, price range |
|---|---|
get_product | One product by source_id + id, full description |
Jobs
search_jobs | Employment type, location, salary, remote |
|---|---|
get_job | One posting |
Real estate
search_properties | Station, walk time, layout, rent, size |
|---|---|
get_property | One property with every station it lists |
Across all verticals
list_sources | The opted-in sources and their attribution text |
|---|---|
data_version | Freshness per source |
list_values | The 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 field | pass the value as |
|---|---|
station_name, line_name | station — one filter covers both |
google_product_category | category_id — the values are the numeric ids |
product_type | no exact filter; use q, which covers product_type |
address | no 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
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.