60% (SIXTY PERCENT) catalog MCP server

Read-only Model Context Protocol server for the public catalog of 60% (SIXTY PERCENT), a Japanese online store for Korean and Asian fashion brands operated by SIXTY PERCENT Inc. (株式会社シックスティーパーセント). Server name sixty-percent-catalog, version 1.0.0.

1. Overview

2. Setup

TransportMCP Streamable HTTP (protocol version 2025-06-18 and later; the server also accepts 2025-03-26 clients). Stateless: no session id is issued, every POST is independent, responses are plain JSON.
Endpointhttps://mcp.sixty-percent.com/mcp (POST only; GET returns 405 because there are no server-initiated messages)
AuthenticationNone. The server returns only public catalog data, so no OAuth, API key or account is required. There are no scopes and no user credentials involved. A test account is therefore not needed to exercise any tool; every tool can be called anonymously.
EnvironmentProduction. The data is the live catalog of www.sixty-percent.com (same backend as the website and the 60% apps).
Documentationhttps://mcp.sixty-percent.com/docs (this page)
Health checkGET https://mcp.sixty-percent.com/healthz → 200 ok

Example: list the tools with curl.

curl -s https://mcp.sixty-percent.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

curl -s https://mcp.sixty-percent.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

curl -s https://mcp.sixty-percent.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"search_products","arguments":{"query":"ニット","gender":"women","price_max":8000,"limit":5}}}'

With the MCP Inspector: npx @modelcontextprotocol/inspector, choose transport “Streamable HTTP”, URL https://mcp.sixty-percent.com/mcp, no authentication.

3. Tool classification

All 7 tools are Read in the sense of the Muse connector guidelines (section 3.2): they retrieve information and never create, change or delete data, account state or permissions, and never act on the user's behalf. There are no Write and no Sensitive write tools. No tool sends messages, publishes content, places orders or moves money. Each tool carries the MCP annotations readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false, so clients can run them without per-call approval.

ToolClassificationSensitiveSide effects
search_productsReadNoNone
get_productReadNoNone
list_new_arrivalsReadNoNone
list_sale_productsReadNoNone
search_brandsReadNoNone
get_brandReadNoNone
list_categoriesReadNoNone

4. Tools

Every tool returns the result both as structuredContent (JSON object) and as a text content block containing the same JSON, so it works with clients that read either. Money values are objects {amount: number, currency: "JPY", text: "¥2,945"}. Pagination is cursor based: pass the returned next_cursor as cursor to get the next page; null means the last page. All url fields point to www.sixty-percent.com pages that open in the browser or the 60% app.

search_products Read

Keyword search over the whole catalog with filters for section (women/men), category, brand, price range and sale status.

Classification: Read · Sensitive: no · Side effects: none · Idempotent: yes · Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Inputs

NameType and meaning
querystring ≤ 200 chars, optional. Keywords in Japanese, Korean or English. Omit to browse by filters only.
gender"women" | "men", optional.
secondary_category_idstring, optional. Top-level category id from list_categories.
tertiary_category_idstring, optional. Sub-category id from list_categories. Overrides secondary_category_id.
brand_idstring, optional. Brand id from search_brands / get_brand.
price_mininteger ≥ 0, optional. Minimum price in JPY.
price_maxinteger ≥ 0, optional. Maximum price in JPY.
on_saleboolean, optional. true = discounted items only.
in_stockboolean, default true. true = purchasable now.
sortrecommended (default) | newest | price_low_to_high | price_high_to_low | discount_high_to_low | best_selling | most_favorited | review_rating
limitinteger 1–50, default 20.
cursorstring, optional. next_cursor from the previous page.
language"ja" (default) or "en". Language of names and descriptions. Prices are always JPY.

Output

total_count (number of matches; the search index caps it at 15,000), count, products[] (id, title, url, brand {id, name, url, country}, category, gender, price {amount, currency, text}, price_max, compare_at_price, discount_percent, on_sale, available_for_sale, coming_soon_at, first_published_at, image_url) and next_cursor (null on the last page).

get_product Read

Everything about one product: description, all images, every size/color variant with price and stock level, brand, shop, category, tags, shipping lead time and review summary.

Classification: Read · Sensitive: no · Side effects: none · Idempotent: yes · Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Inputs

NameType and meaning
product_idstring. Product id from search results. Provide this or handle.
handlestring. Last path segment of a product page URL (https://www.sixty-percent.com/products/<handle>).
language"ja" (default) or "en".

Output

id, title, url, brand, shop, category, sub_category, gender, description (plain text), price, price_max, compare_at_price, discount_percent, on_sale, available_for_sale, end_of_sale, sale_type (regular | pre_order | back_order), pre_order_date, coming_soon_at, first_published_at, estimated_delivery_business_days, free_shipping, ships_to (["JP"]), favorite_count, review {average, count}, tags, seasons, images[] {url, color}, size_chart, variants[] {id, title, options, color, price, compare_at_price, available_for_sale, stock (in_stock | low_stock | sold_out)}. Returns an error result (isError) when the product does not exist or is no longer on sale.

list_new_arrivals Read

Most recently added products, newest first, with the same section / category / brand / price filters.

Classification: Read · Sensitive: no · Side effects: none · Idempotent: yes · Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Inputs

NameType and meaning
gender"women" | "men", optional.
secondary_category_idstring, optional. Top-level category id from list_categories.
tertiary_category_idstring, optional. Sub-category id from list_categories. Overrides secondary_category_id.
brand_idstring, optional. Brand id from search_brands / get_brand.
price_mininteger ≥ 0, optional. Minimum price in JPY.
price_maxinteger ≥ 0, optional. Maximum price in JPY.
limitinteger 1–50, default 20.
cursorstring, optional. next_cursor from the previous page.
language"ja" (default) or "en". Language of names and descriptions. Prices are always JPY.

Output

total_count (number of matches; the search index caps it at 15,000), count, products[] (id, title, url, brand {id, name, url, country}, category, gender, price {amount, currency, text}, price_max, compare_at_price, discount_percent, on_sale, available_for_sale, coming_soon_at, first_published_at, image_url) and next_cursor (null on the last page).

list_sale_products Read

Discounted products, biggest discount first by default, with an optional minimum discount.

Classification: Read · Sensitive: no · Side effects: none · Idempotent: yes · Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Inputs

NameType and meaning
min_discount_percent50 | 70 | 90, optional. Only items discounted at least this much.
gender"women" | "men", optional.
secondary_category_idstring, optional. Top-level category id from list_categories.
tertiary_category_idstring, optional. Sub-category id from list_categories. Overrides secondary_category_id.
brand_idstring, optional. Brand id from search_brands / get_brand.
price_mininteger ≥ 0, optional. Minimum price in JPY.
price_maxinteger ≥ 0, optional. Maximum price in JPY.
sortsame values as search_products, default discount_high_to_low.
limitinteger 1–50, default 20.
cursorstring, optional. next_cursor from the previous page.
language"ja" (default) or "en". Language of names and descriptions. Prices are always JPY.

Output

total_count (number of matches; the search index caps it at 15,000), count, products[] (id, title, url, brand {id, name, url, country}, category, gender, price {amount, currency, text}, price_max, compare_at_price, discount_percent, on_sale, available_for_sale, coming_soon_at, first_published_at, image_url) and next_cursor (null on the last page).

search_brands Read

Find brands by name, or list brands, optionally only those running a sale or from a given country.

Classification: Read · Sensitive: no · Side effects: none · Idempotent: yes · Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Inputs

NameType and meaning
querystring ≤ 100 chars, optional. Brand name or part of it.
on_saleboolean, optional. true = brands with a sale running now.
countryISO 3166-1 alpha-2, optional, e.g. KR.
limitinteger 1–50, default 20.
language"ja" (default) or "en".

Output

count, brands[] (id, name, name_kana, url, country, logo_url, favorited_count, products_count, current_sale_max_discount_percent, on_sale, has_recent_new_arrivals). Not paginated: raise limit or narrow the query to see more.

get_brand Read

Profile of one brand with its top products.

Classification: Read · Sensitive: no · Side effects: none · Idempotent: yes · Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Inputs

NameType and meaning
brand_idstring. Brand id. Provide this or handle.
handlestring. Last path segment of https://www.sixty-percent.com/brands/<handle>.
products_limitinteger 0–50, default 12. How many top products to include.
language"ja" (default) or "en".

Output

All fields of a search_brands item plus description, instagram_url, cover_image_url, latest_product_published_at, categories[] {id, name} and top_products[] (same shape as search_products items). Error result when the brand does not exist.

list_categories Read

The category tree (top-level categories with their sub-categories) and the ids to use as filters.

Classification: Read · Sensitive: no · Side effects: none · Idempotent: yes · Annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false

Inputs

NameType and meaning
language"ja" (default) or "en".

Output

categories[] {secondary_category_id, name, handle, sub_categories[] {tertiary_category_id, name, handle}}.

5. Status handling and side effects

6. Errors

SituationResponse
Invalid arguments (wrong type, out of range)Tool result with isError: true whose text starts with MCP error -32602: Input validation error and names the offending field; nothing is executed upstream.
Product or brand not foundTool result with isError: true and a human-readable message.
Upstream catalog API is rate limiting or unavailableTool result with isError: true and a message that says to retry after N seconds. The server never fabricates data.
Too many requests from one clientHTTP 429 with Retry-After: 60 and a JSON-RPC error body (see rate limits).
GET on /mcp, unknown pathHTTP 405 / 404.
Missing Accept: application/json, text/event-stream or wrong Content-TypeHTTP 406 / 415 per the Streamable HTTP specification.

7. Rate limits and performance

8. Data and privacy

9. Support

日本語の要約

このサーバーは 60%(SIXTY PERCENT)の公開カタログ(商品・価格・在庫・ブランド・カテゴリー)を読み取り専用で返す MCP サーバーです。エンドポイントは https://mcp.sixty-percent.com/mcp(Streamable HTTP、認証なし)。ツールは 7 本すべて Read(データ・アカウント・権限を変えず、副作用なし)で、購入・カート・お気に入り・注文状況などログインが要る操作は含みません。価格は日本円(税込)、配送は日本国内のみです。1 クライアント IP あたり 1 分 120 リクエストまで。お問い合わせは ヘルプセンターへ。