A web-based MCP server that exposes Korean customs import data through WebMCP tools, enabling AI agents to search products, analyze pricing trends, identify suppliers, and draft sourcing requests alongside a human user.
Strong tool definitions with excellent descriptions and clear naming. All 7 tools have verb-noun names (search_, get_, pin_, highlight_, draft_) and detailed, LLM-optimized descriptions (150-400 chars). Input schemas are complete with typed properties and descriptions. However, output schemas are not documented, responses are inferred from code but not formally specified. Error handling is present but could be more granular. Tool composition is well-designed with clear dependencies (search_import_products must be called first). Session-based caching for Tier B tools is clever but undocumented in tool descriptions.
Draft an outbound RFQ (request for quotation) to a supplier. Composes an email-like message with product, quantity, and notes, then displays an approval modal showing the exact draft before sending. Nothing leaves the page without explicit human approval. Tier C tool: action with approval gate.
List the Korean companies already importing a product. Returns named importers with their clearance counts. These are real registered buyers from customs records. Renders an importer table on screen. Use it when the user asks who in Korea buys a product, or wants to find a potential customer. Requires the exact product name from search_import_products.
Get the average import unit price (USD/kg) for a product, plus how that price breaks down by exporting country. This is the landed customs price actually paid by Korean importers, not a retail or listing price. Renders a price card on screen for the user as a side effect. Use it when the user asks what something costs to import, whether a price is reasonable, or which country is cheapest. Requires the exact product name from search_import_products.
List the overseas manufacturers and exporters actually shipping a product into Korea. Returns named companies — one row per exporting company, with its country and clearance count — plus a per-country total. These are real registered suppliers from clearance records, not a directory listing. Renders a supplier table on screen. Use it when the user asks who supplies a product, where it comes from, or wants to find a source. For a country-versus-country decision, call get_import_price_trend first for the price side, then this tool for the supplier side. Requires the exact product name from search_import_products.
Output schemas not formally documented. Tool descriptions explain what is returned (price card, supplier table, importer table) but JSON Schema output structure is not specified. LLMs cannot plan downstream operations or extract fields reliably.
Tier B tools (pin_to_comparison_board, highlight_supplier_country) claim 'zero network requests' but this is not formally declared via toolAnnotations. readOnlyHint or idempotentHint would make this machine-readable and prevent agents from treating them as stateful.
draft_sourcing_request describes an approval modal but does not formally declare this as a Multi Round-Trip Request (result 'input_required'). The approval gate is a critical UX pattern that should be machine-readable.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 79 | 2026-07-28+ | v2 |
Highlight all supplier rows from one country on the current screen. Visually emphasizes suppliers from that origin across all visible cards. Makes zero network requests; purely a screen-control tool. Tier B tool: screen control only.
Add a product card to the on-screen comparison board. The card shows price, suppliers, and importers for that product. If a country is named, the card is scoped to that origin only — useful for comparing the same product from different sources (e.g. Thai mango vs Brazilian mango). Makes zero network requests; reads only from the session cache populated by earlier lookup tools. Tier B tool: screen control only.
Search for an imported food product by name (English or Korean) and get the exact product name used in Korean customs clearance records. Call this FIRST whenever the user names any food product ("frozen mango", "olive oil", "kimchi"). The other tools need the exact name returned here, not the user's wording — passing free-form text to them returns an empty result rather than an error, so do not skip this step. Returns matching products with their 2025 clearance counts. If several match, take the one with the highest count unless the user's wording clearly points at another. If nothing matches, say so and ask the user to rephrase — do not guess a name and pass it on, because the other tools answer a wrong name with an empty result, not an error, and that reads as "this product is never imported" when it is not.
Error responses in code use fail() helper returning isError: true, but error categorization (retryable vs user-fixable vs fatal) is not explicit. 'No product matches' and 'Price withheld' are handled differently but both return ok(), inconsistent error semantics.
Session cache (Map<koreanName, data>) is undocumented in tool descriptions. Tier B tools depend on prior Tier A calls populating this cache, but agents are not told this dependency explicitly. resolveLoaded() silently returns null if cache miss, no guidance to call search_import_products first.