MCPサーバー

okun-koneosa

fi.okunkoneosa/okun-koneosa
コマース・小売 公開・接続可能 MCP 2025-11-25

このMCPでできること

Searches a Finnish industrial-supplies catalog, returns product details and stock, explains store policies, and creates cart links.

create_cart_link
Build a link that puts the given products into the customer's cart. This tool writes nothing. It returns a URL; the products are added only when the customer opens that URL in their own browser. Give the URL to the customer and let them click it. Args: items: 1-20 rows of {"product_id": int >= 1, "quantity": int 1-50}. Unknown fields are rejected. Repeated product_ids are merged into one row and their quantities summed. checkout: If True, opening the link takes the customer straight to checkout; if False (default) it opens the cart review page. Returns: JSON with cart_url, the normalised items, item_count, total_quantity, the echoed checkout flag and a short note to show the customer. Errors (isError=true, body {"error": {...}}): - products_not_found: one or more product_ids do not exist or are not published. The message lists the offending ids. - shop_api_unavailable: the shop could not be reached; retryable. Notes: - The link SETS the quantities, it does not add to what is already in the cart. Opening the same link twice gives the same result as opening it once, so the customer can safely click it again. - Stock is re-checked when the link is opened. If stock ran out in the meantime, the quantity is reduced or the row skipped — the link can never oversell. - Checkout requires a customer account, so the customer may be asked to log in or register before paying.
読み取り専用 外部アクセスあり 冪等
入力スキーマ
{'type': 'object', 'required': ['items'], 'properties': {'items': {'type': 'array', 'items': {'type': 'object', 'required': ['product_id'], 'properties': {'quantity': {'type': 'integer', 'default': 1, 'maximum': 50, 'minimum': 1, 'description': '1-50'}, 'product_id': {'type': 'integer', 'minimum': 1, 'description': 'Product ID from search_catalog'}}, 'description': 'One cart row. Unknown fields are rejected.', 'additionalProperties': False}, 'maxItems': 20, 'minItems': 1, 'description': '1-20 products to put in the cart'}, 'checkout': {'type': 'boolean', 'default': False, 'description': 'If True, the link goes straight to checkout; otherwise (default) to the cart review page'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', '$defs': {'CartLinkItem': {'type': 'object', 'title': 'CartLinkItem', 'required': ['product_id', 'quantity'], 'properties': {'quantity': {'type': 'integer', 'title': 'Quantity', 'maximum': 50, 'minimum': 1}, 'product_id': {'type': 'integer', 'title': 'Product Id', 'minimum': 1}}}}, 'title': 'CreateCartLinkResult', 'required': ['cart_url', 'items', 'item_count', 'total_quantity', 'note'], 'properties': {'note': {'type': 'string', 'title': 'Note'}, 'items': {'type': 'array', 'items': {'$ref': '#/$defs/CartLinkItem'}, 'title': 'Items'}, 'cart_url': {'type': 'string', 'title': 'Cart Url', 'description': 'Open in a browser to fill the cart'}, 'checkout': {'type': 'boolean', 'title': 'Checkout', 'default': False, 'description': 'True if the link goes straight to checkout, False to cart review'}, 'item_count': {'type': 'integer', 'title': 'Item Count', 'description': 'Number of distinct products'}, 'total_quantity': {'type': 'integer', 'title': 'Total Quantity', 'description': 'Sum of quantities'}}, 'description': 'create_cart_link -vastaus.'}
get_product_details
Get full details and current stock for one Okun Koneosa product. Args: product_id: The numeric product id returned by search_catalog. Returns: JSON with the full product record: id, name, name_raw, sku, ean, brand, category, full description (not truncated), price_gross, price_net, vat_percent, currency, unit, weight_kg, product_url, image_url, plus a freshly checked in_stock / stock_quantity. Notes: - Stock is read at call time from a separate availability endpoint, so it is more current than the value returned by search_catalog. - Returns {"error": "product_not_found"} for unknown or unpublished ids. Products that are out of stock are unpublished, so a previously valid id can stop resolving. - To let the user buy, pass product_url, or build a cart link with create_cart_link.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'required': ['product_id'], 'properties': {'product_id': {'type': 'integer', 'minimum': 1, 'description': 'Product ID from search_catalog'}}}
出力スキーマ
{'type': 'object', 'title': 'ProductDetails', 'required': ['id', 'name', 'price_gross', 'price_net', 'in_stock', 'stock_quantity', 'product_url', 'stock_checked', 'disclaimer'], 'properties': {'id': {'type': 'integer', 'title': 'Id', 'description': 'Product ID â\x80\x94 pass to get_product_details or create_cart_link'}, 'ean': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Ean', 'default': None, 'description': 'EAN/GTIN barcode, when known'}, 'sku': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Sku', 'default': None, 'description': 'Ordering number used by the shop'}, 'name': {'type': 'string', 'title': 'Name', 'description': 'Readable product name'}, 'unit': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Unit', 'default': None, 'description': "Selling unit, e.g. 'kpl'"}, 'brand': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Brand', 'default': None, 'description': 'Manufacturer'}, 'category': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Category', 'default': None}, 'currency': {'type': 'string', 'const': 'EUR', 'title': 'Currency', 'default': 'EUR'}, 'in_stock': {'type': 'boolean', 'title': 'In Stock'}, 'name_raw': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Name Raw', 'default': None, 'description': "Supplier's own spelling, often ALL CAPS"}, 'image_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Image Url', 'default': None, 'description': 'Null for most products â\x80\x94 photography is still being collected'}, 'price_net': {'type': 'number', 'title': 'Price Net', 'description': 'Price excl. VAT'}, 'weight_kg': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Weight Kg', 'default': None}, 'disclaimer': {'type': 'string', 'title': 'Disclaimer'}, 'description': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Description', 'default': None, 'description': 'Full description, not truncated'}, 'price_gross': {'type': 'number', 'title': 'Price Gross', 'description': 'Price incl. Finnish VAT 25.5%'}, 'product_url': {'type': 'string', 'title': 'Product Url', 'description': 'Public product page'}, 'vat_percent': {'type': 'number', 'title': 'Vat Percent', 'default': 25.5}, 'stock_checked': {'type': 'boolean', 'title': 'Stock Checked', 'description': 'True if stock was re-read from the availability endpoint'}, 'stock_quantity': {'type': 'number', 'title': 'Stock Quantity', 'description': 'Units available right now'}, 'description_truncated': {'type': 'boolean', 'title': 'Description Truncated', 'default': False, 'description': 'True if description was cut â\x80\x94 use get_product_details'}}, 'description': 'get_product_details -vastaus: kuten hakutulos mutta täysi kuvaus.'}
search_catalog
Search the Okun Koneosa product catalog. Okun Koneosa Oy (okunkoneosa.fi) is a Finnish industrial supplies store in Outokumpu, North Karelia. Around 6500 products: bearings, belts, seals, hydraulics, pneumatics, fasteners, hand tools, protective equipment and machine parts. Everything listed is physically in stock. Prices in EUR, including Finnish VAT 25.5%. Free shipping on orders over 150 EUR. Args: query: Free-text search — matches product name, ordering number (SKU) or EAN code. Leave empty to browse a category. category_id: Restrict to one category. The category list is available at https://okunkoneosa.fi/api/v1/categories (a plain REST endpoint, not an MCP tool). in_stock_only: True by default. The shop only publishes products that are in stock, so this rarely changes the result. sort: "name" (default), "price_asc", "price_desc" or "newest". limit: Products per page, 1-50 (default 10). page: Page number for paging through larger result sets. Returns: JSON with: - products: list of products, each with id, name, name_raw, sku, ean, brand, category, price_gross (incl. VAT), price_net, currency, unit, in_stock, stock_quantity, weight_kg, product_url, image_url and a shortened description (description_truncated tells if it was cut). - total, page, per_page, total_pages - disclaimer: prices and availability are confirmed at checkout Notes: - `name` is cleaned for reading; `name_raw` is the supplier's own spelling, useful for exact matching against a supplier catalogue. - `image_url` is null for most products — the shop is still collecting product photography from suppliers. A missing image does not mean the product is unavailable. - Use get_product_details(id) for the full description and a fresh stock check.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'properties': {'page': {'type': 'integer', 'default': 1, 'minimum': 1, 'description': 'Page number (>= 1)'}, 'sort': {'enum': ['name', 'price_asc', 'price_desc', 'newest'], 'type': 'string', 'default': 'name'}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 50, 'minimum': 1, 'description': '1-50'}, 'query': {'type': 'string', 'default': '', 'description': 'Free-text search term'}, 'category_id': {'anyOf': [{'type': 'integer', 'minimum': 1}, {'type': 'null'}], 'default': None, 'description': 'Category ID'}, 'in_stock_only': {'type': 'boolean', 'default': True}}}
出力スキーマ
{'type': 'object', '$defs': {'ProductSummary': {'type': 'object', 'title': 'ProductSummary', 'required': ['id', 'name', 'price_gross', 'price_net', 'in_stock', 'stock_quantity', 'product_url'], 'properties': {'id': {'type': 'integer', 'title': 'Id', 'description': 'Product ID â\x80\x94 pass to get_product_details or create_cart_link'}, 'ean': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Ean', 'default': None, 'description': 'EAN/GTIN barcode, when known'}, 'sku': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Sku', 'default': None, 'description': 'Ordering number used by the shop'}, 'name': {'type': 'string', 'title': 'Name', 'description': 'Readable product name'}, 'unit': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Unit', 'default': None, 'description': "Selling unit, e.g. 'kpl'"}, 'brand': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Brand', 'default': None, 'description': 'Manufacturer'}, 'category': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Category', 'default': None}, 'currency': {'type': 'string', 'const': 'EUR', 'title': 'Currency', 'default': 'EUR'}, 'in_stock': {'type': 'boolean', 'title': 'In Stock'}, 'name_raw': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Name Raw', 'default': None, 'description': "Supplier's own spelling, often ALL CAPS"}, 'image_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Image Url', 'default': None, 'description': 'Null for most products â\x80\x94 photography is still being collected'}, 'price_net': {'type': 'number', 'title': 'Price Net', 'description': 'Price excl. VAT'}, 'weight_kg': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Weight Kg', 'default': None}, 'description': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Description', 'default': None, 'description': 'Shortened to 200 chars'}, 'price_gross': {'type': 'number', 'title': 'Price Gross', 'description': 'Price incl. Finnish VAT 25.5%'}, 'product_url': {'type': 'string', 'title': 'Product Url', 'description': 'Public product page'}, 'vat_percent': {'type': 'number', 'title': 'Vat Percent', 'default': 25.5}, 'stock_quantity': {'type': 'number', 'title': 'Stock Quantity', 'description': 'Units available right now'}, 'description_truncated': {'type': 'boolean', 'title': 'Description Truncated', 'default': False, 'description': 'True if description was cut â\x80\x94 use get_product_details'}}, 'description': 'Tuote hakutuloksessa.'}}, 'title': 'SearchCatalogResult', 'required': ['total', 'page', 'per_page', 'total_pages', 'disclaimer'], 'properties': {'page': {'type': 'integer', 'title': 'Page'}, 'total': {'type': 'integer', 'title': 'Total', 'description': 'Total matches across all pages'}, 'per_page': {'type': 'integer', 'title': 'Per Page'}, 'products': {'type': 'array', 'items': {'$ref': '#/$defs/ProductSummary'}, 'title': 'Products'}, 'disclaimer': {'type': 'string', 'title': 'Disclaimer'}, 'total_pages': {'type': 'integer', 'title': 'Total Pages'}, 'suggested_queries': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Suggested Queries', 'default': None, 'description': 'Alternative spellings that DO return results â\x80\x94 only present when total is 0'}}, 'description': 'search_catalog -vastaus.'}
search_shop_catalog
Search the Okun Koneosa product catalog. Okun Koneosa Oy (okunkoneosa.fi) is a Finnish industrial supplies store in Outokumpu, North Karelia. Around 6500 products: bearings, belts, seals, hydraulics, pneumatics, fasteners, hand tools, protective equipment and machine parts. Everything listed is physically in stock. Prices in EUR, including Finnish VAT 25.5%. Free shipping on orders over 150 EUR. Args: query: Free-text search — matches product name, ordering number (SKU) or EAN code. Leave empty to browse a category. category_id: Restrict to one category. The category list is available at https://okunkoneosa.fi/api/v1/categories (a plain REST endpoint, not an MCP tool). in_stock_only: True by default. The shop only publishes products that are in stock, so this rarely changes the result. sort: "name" (default), "price_asc", "price_desc" or "newest". limit: Products per page, 1-50 (default 10). page: Page number for paging through larger result sets. Returns: JSON with: - products: list of products, each with id, name, name_raw, sku, ean, brand, category, price_gross (incl. VAT), price_net, currency, unit, in_stock, stock_quantity, weight_kg, product_url, image_url and a shortened description (description_truncated tells if it was cut). - total, page, per_page, total_pages - disclaimer: prices and availability are confirmed at checkout Notes: - `name` is cleaned for reading; `name_raw` is the supplier's own spelling, useful for exact matching against a supplier catalogue. - `image_url` is null for most products — the shop is still collecting product photography from suppliers. A missing image does not mean the product is unavailable. - Use get_product_details(id) for the full description and a fresh stock check.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'properties': {'page': {'type': 'integer', 'default': 1, 'minimum': 1, 'description': 'Page number (>= 1)'}, 'sort': {'enum': ['name', 'price_asc', 'price_desc', 'newest'], 'type': 'string', 'default': 'name'}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 50, 'minimum': 1, 'description': '1-50'}, 'query': {'type': 'string', 'default': '', 'description': 'Free-text search term'}, 'category_id': {'anyOf': [{'type': 'integer', 'minimum': 1}, {'type': 'null'}], 'default': None, 'description': 'Category ID'}, 'in_stock_only': {'type': 'boolean', 'default': True}}}
出力スキーマ
{'type': 'object', '$defs': {'ProductSummary': {'type': 'object', 'title': 'ProductSummary', 'required': ['id', 'name', 'price_gross', 'price_net', 'in_stock', 'stock_quantity', 'product_url'], 'properties': {'id': {'type': 'integer', 'title': 'Id', 'description': 'Product ID â\x80\x94 pass to get_product_details or create_cart_link'}, 'ean': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Ean', 'default': None, 'description': 'EAN/GTIN barcode, when known'}, 'sku': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Sku', 'default': None, 'description': 'Ordering number used by the shop'}, 'name': {'type': 'string', 'title': 'Name', 'description': 'Readable product name'}, 'unit': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Unit', 'default': None, 'description': "Selling unit, e.g. 'kpl'"}, 'brand': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Brand', 'default': None, 'description': 'Manufacturer'}, 'category': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Category', 'default': None}, 'currency': {'type': 'string', 'const': 'EUR', 'title': 'Currency', 'default': 'EUR'}, 'in_stock': {'type': 'boolean', 'title': 'In Stock'}, 'name_raw': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Name Raw', 'default': None, 'description': "Supplier's own spelling, often ALL CAPS"}, 'image_url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Image Url', 'default': None, 'description': 'Null for most products â\x80\x94 photography is still being collected'}, 'price_net': {'type': 'number', 'title': 'Price Net', 'description': 'Price excl. VAT'}, 'weight_kg': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Weight Kg', 'default': None}, 'description': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Description', 'default': None, 'description': 'Shortened to 200 chars'}, 'price_gross': {'type': 'number', 'title': 'Price Gross', 'description': 'Price incl. Finnish VAT 25.5%'}, 'product_url': {'type': 'string', 'title': 'Product Url', 'description': 'Public product page'}, 'vat_percent': {'type': 'number', 'title': 'Vat Percent', 'default': 25.5}, 'stock_quantity': {'type': 'number', 'title': 'Stock Quantity', 'description': 'Units available right now'}, 'description_truncated': {'type': 'boolean', 'title': 'Description Truncated', 'default': False, 'description': 'True if description was cut â\x80\x94 use get_product_details'}}, 'description': 'Tuote hakutuloksessa.'}}, 'title': 'SearchCatalogResult', 'required': ['total', 'page', 'per_page', 'total_pages', 'disclaimer'], 'properties': {'page': {'type': 'integer', 'title': 'Page'}, 'total': {'type': 'integer', 'title': 'Total', 'description': 'Total matches across all pages'}, 'per_page': {'type': 'integer', 'title': 'Per Page'}, 'products': {'type': 'array', 'items': {'$ref': '#/$defs/ProductSummary'}, 'title': 'Products'}, 'disclaimer': {'type': 'string', 'title': 'Disclaimer'}, 'total_pages': {'type': 'integer', 'title': 'Total Pages'}, 'suggested_queries': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'Suggested Queries', 'default': None, 'description': 'Alternative spellings that DO return results â\x80\x94 only present when total is 0'}}, 'description': 'search_catalog -vastaus.'}
search_shop_policies_and_faqs
Search Okun Koneosa's shop policies and terms. Covers delivery terms, privacy policy, terms of service, the consumer right of withdrawal / returns, and company information. Use this instead of guessing when the customer asks about delivery times, shipping costs, returns, warranty or how their data is handled. Args: query: Finnish keyword, e.g. "palautus", "toimitusaika", "takuu", "toimituskulut". Leave empty to list all sections. limit: Maximum sections to return (1-20, default 5). Returns: JSON with: - sections: each with page, page_title, heading, content and url - total: how many sections matched - query: the term that was searched Notes: - Content is split by heading, so you get the relevant paragraph rather than a whole page. Always cite the `url` so the customer can read the full terms. - These are the shop's own terms. They do not override Finnish consumer law.
読み取り専用 冪等
入力スキーマ
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 5, 'maximum': 20, 'minimum': 1, 'description': 'Max sections (1-20)'}, 'query': {'type': 'string', 'default': '', 'description': "What to look for, e.g. 'palautus', 'toimitusaika'"}}}
出力スキーマ
{'type': 'object', '$defs': {'PolicySection': {'type': 'object', 'title': 'PolicySection', 'required': ['page', 'page_title', 'content', 'url'], 'properties': {'url': {'type': 'string', 'title': 'Url', 'description': 'Public page URL â\x80\x94 cite this to the customer'}, 'page': {'type': 'string', 'title': 'Page', 'description': "Page slug, e.g. 'toimitusehdot'"}, 'content': {'type': 'string', 'title': 'Content'}, 'heading': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Heading', 'default': None, 'description': 'Section heading, null for intro'}, 'page_title': {'type': 'string', 'title': 'Page Title'}}}}, 'title': 'PolicySearchResult', 'required': ['total'], 'properties': {'query': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Query', 'default': None}, 'total': {'type': 'integer', 'title': 'Total'}, 'sections': {'type': 'array', 'items': {'$ref': '#/$defs/PolicySection'}, 'title': 'Sections'}}, 'description': 'search_shop_policies_and_faqs -vastaus.'}
追加
search_shop_policies_and_faqs
2026年9月17日12:39
追加
create_cart_link
2026年9月17日12:39
追加
get_product_details
2026年9月17日12:39
追加
search_shop_catalog
2026年9月17日12:39
追加
search_catalog
2026年9月17日12:39