Koskamo

Swervie MCP

A cross-retailer product catalog MCP server that provides AI assistants with consolidated, scored answers per product. It collapses duplicate listings, compares specs, displays live prices, and provides buy links for every seller across US retailers. Responses are deterministic and fast as they are precomputed.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Swervie MCP logo, by Plum Applications, Inc.Community listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Plum Applications, Inc.
MCP endpoint (Streamable HTTP)
https://us-central1-swervie-prod.cloudfunctions.net/mcp
Vendor documentation

What you can do with it

  • Search for products across multiple retailers with live prices
  • Find specific product categories and filter by specs
  • Look up detailed product information and offers
  • Get full product details with provenance and ratings

Source and maintenance

Community listingRegistry 1.6.0
Maintenance checked

Protocol and capabilities

Server
swervie 1.6.0
MCP protocol
2025-06-18
Tools
5 advertised
Resources
2 advertised
Resource templates
1 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  },
  "extensions": {
    "io.modelcontextprotocol/ui": {
      "mimeTypes": [
        "text/html;profile=mcp-app"
      ]
    }
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Swervie is a cross-retailer product catalog: one consolidated, scored answer per product, from data only. search_products answers a free-text shopping query in one call: it resolves a named product (to its detail, offers and shelf rank), or a category with the shopper's constraints as filters and wishes as ranking preferences. find_category returns a category's filter contract, and browse_category applies explicit filters and preferences from that contract. lookup_product resolves one product by name or identifier (ASIN, UPC/EAN/GTIN, brand plus model number). get_products returns full offers, review sub-ratings and spec provenance for product ids; shelf rows already carry buy_url and star ratings. Each search result carries an interpretation receipt: match_quality, fit_note, unparsed_tokens and unsupported_terms record how the query was read and which shopper words no filter covered. 'partial' means rows were served with some shopper words unexplained, or no rows were served because the closest shelf was only a medium-confidence fit. A lookup_product 'ambiguous' result lists the candidates best first; a model number usually resolves it. shelf_context lists higher-scoring alternatives in the same price band. A product flagged under readiness carries no current price. card_specs is the spec order every product card uses. buy_url is the link a shopper follows to buy: every shelf row and every offer carries one, and a price without its buy_url leaves the shopper with no way to reach that seller from the answer. Results that carry buy_url links also carry a `disclosure` field: Swervie's commission disclosure for those links, worded for the shopper. user_signature is an optional pseudonymous id that gives a shopper their own rate-limit quota and attributes their buy_url clicks. Format: 'sv1-' + the first 24 hex characters of SHA-256('swervie/v1|' + id), where id is the user's most stable identifier normalized (lowercase, trimmed; an email with +tags stripped), or 'sv1r-' + a UUID kept for that user. A value that changes every session counts as a new shopper each session. A raw email or phone number is hashed server-side before anything is stored.

Tools

5 advertised

find_category — Find a product category
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Find the Swervie product category that matches a shopping intent and return its filter contract: every filterable specification with its type, units, allowed values, and importance, plus budget, mid, and premium price bands.

find_category input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query"
  ],
  "properties": {
    "query": {
      "type": "string",
      "minLength": 2
    },
    "user_signature": {
      "type": "string",
      "maxLength": 128,
      "description": "Optional opaque, stable, pseudonymous user id: the shopper's own rate-limit quota and click attribution. Format: 'sv1-' + the first 24 hex characters of SHA-256('swervie/v1|' + normalized identifier), or 'sv1r-' + a UUID. A raw email or phone number is hashed server-side before anything is stored."
    }
  },
  "additionalProperties": false
}
find_category annotations
{
  "title": "Find a product category",
  "readOnlyHint": true,
  "openWorldHint": true
}
browse_category — Browse a category shelf
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Return a category's consolidated, ranked shelf: one row per product, with duplicate seller listings already collapsed. Each row carries price, price_band, buy_url and buy_seller (the retailer behind the link), image_url, star ratings, and the category's required and top-weighted spec values. card_specs gives the specs every product card shows, in display order. Filters are hard: a row missing the attribute is excluded. Preferences are soft: rows that measure well on them rank higher and none are excluded (for example Rated Noise, prefer low, or a pet-hair rating, prefer high). Sort by value (default), quality, or price_asc. A filter on the Price dimension applies min/max to the live offer price in cents. Responses that carry buy_url links also carry a disclosure field: the commission disclosure for those links.

browse_category input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "category"
  ],
  "properties": {
    "sort": {
      "enum": [
        "value",
        "quality",
        "price_asc"
      ],
      "type": "string"
    },
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1
    },
    "cursor": {
      "type": "string"
    },
    "filters": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "dimension"
        ],
        "properties": {
          "max": {
            "type": "number"
          },
          "min": {
            "type": "number"
          },
          "any_of": {
            "type": "array",
            "items": {
              "type": [
                "string",
                "number"
              ]
            }
          },
          "equals": {
            "type": [
              "string",
              "number",
              "boolean"
            ]
          },
          "dimension": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "category": {
      "type": "string"
    },
    "preferences": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "dimension",
          "prefer"
        ],
        "properties": {
          "value": {
            "type": [
              "string",
              "number",
              "boolean"
            ],
            "description": "Required with prefer 'equals' (enum/boolean dims)."
          },
          "prefer": {
            "enum": [
              "high",
              "low",
              "equals"
            ],
            "type": "string"
          },
          "dimension": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "maxItems": 6,
      "description": "Soft preferences: rows that measure well on a dimension rank higher, and none are excluded. Each row reports preference_boost."
    },
    "user_signature": {
      "type": "string",
      "maxLength": 128,
      "description": "Optional opaque, stable, pseudonymous user id: the shopper's own rate-limit quota and click attribution. Format: 'sv1-' + the first 24 hex characters of SHA-256('swervie/v1|' + normalized identifier), or 'sv1r-' + a UUID. A raw email or phone number is hashed server-side before anything is stored."
    }
  },
  "additionalProperties": false
}
browse_category annotations
{
  "title": "Browse a category shelf",
  "readOnlyHint": true,
  "openWorldHint": true
}
search_products — Search products
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Answer one free-text shopping query, such as 'TVs under $500 with 120hz refresh rate', 'quiet dishwasher for a small kitchen', 'robot vacuum for pet hair under $600', or 'Sony WH-1000XM5 lowest price'. A query naming one specific product resolves to that product (interpretation.mode 'product'): products[0] holds every seller offer, and shelf_context gives its shelf rank and higher-scoring alternatives. 'A vs B' returns both products with specs in one shared order (mode 'comparison'). Otherwise the category is resolved, hard constraints such as price and specs become filters, and soft wishes such as 'quiet' or 'for pet hair' become ranking preferences that exclude nothing; interpretation.preferences lists them with reasons, and each row's preference_boost shows the effect. The interpretation object records how the query was read: method (deterministic parser or query-understanding model), fit_note (a one-line judgment of the category fit), and match_quality. 'strong' means the shelf plainly fits. 'partial' means either rows are served with some shopper words unexplained (listed in unparsed_tokens and unsupported_terms), or no rows are served because the closest shelf was only a medium-confidence fit (named in interpretation.llm_category). 'weak' and 'none' return no rows and queue the request as demand (queued_for_creation for a missing category, queued_product_request for a missing product). card_specs gives the specs every product card shows, in display order. Responses that carry buy_url links also carry a disclosure field: the commission disclosure for those links.

search_products input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query"
  ],
  "properties": {
    "sort": {
      "enum": [
        "value",
        "quality",
        "price_asc"
      ],
      "type": "string"
    },
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "minLength": 2
    },
    "cursor": {
      "type": "string"
    },
    "user_signature": {
      "type": "string",
      "maxLength": 128,
      "description": "Optional opaque, stable, pseudonymous user id: the shopper's own rate-limit quota and click attribution. Format: 'sv1-' + the first 24 hex characters of SHA-256('swervie/v1|' + normalized identifier), or 'sv1r-' + a UUID. A raw email or phone number is hashed server-side before anything is stored."
    }
  },
  "additionalProperties": false
}
search_products annotations
{
  "title": "Search products",
  "readOnlyHint": true,
  "openWorldHint": true
}
lookup_product — Look up a specific product
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Look up one specific product by name or identifier: a product name such as 'Sony WH-1000XM5' or 'Ninja AF101 air fryer', an ASIN, a UPC/EAN/GTIN, or brand plus model number. match reports the result: 'exact' (identifier hit), 'likely' (one clear name match; interpretation.runner_up names the next best), 'ambiguous' (several fit; rows lists the candidates, best first), or 'none' (not carried; the miss is recorded as demand). On exact or likely, products[0] is the full detail (all specs, review-derived ratings with evidence quotes, every seller offer with buy_url), and shelf_context gives its rank on its category shelf by value and quality, its variants (colorways, sizes), and up to three higher-scoring alternatives in the same price band. A product with no live price or image is still returned, flagged under readiness; its price is not current. Responses that carry buy_url links also carry a disclosure field: the commission disclosure for those links.

lookup_product input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "brand": {
      "type": "string",
      "maxLength": 80
    },
    "query": {
      "type": "string",
      "maxLength": 200,
      "minLength": 2,
      "description": "The product's name as the shopper said it: brand, model, name. May contain an ASIN or barcode."
    },
    "category": {
      "type": "string",
      "maxLength": 200,
      "description": "Restrict the name match to one Swervie category (exact name)."
    },
    "identifiers": {
      "type": "object",
      "properties": {
        "ean": {
          "type": "string",
          "maxLength": 20
        },
        "mpn": {
          "type": "string",
          "maxLength": 64
        },
        "upc": {
          "type": "string",
          "maxLength": 20
        },
        "asin": {
          "type": "string",
          "maxLength": 20
        },
        "gtin": {
          "type": "string",
          "maxLength": 20
        },
        "model_number": {
          "type": "string",
          "maxLength": 64
        }
      },
      "description": "Known identifiers. mpn/model_number need brand to resolve.",
      "additionalProperties": false
    },
    "user_signature": {
      "type": "string",
      "maxLength": 128,
      "description": "Optional opaque, stable, pseudonymous user id: the shopper's own rate-limit quota and click attribution. Format: 'sv1-' + the first 24 hex characters of SHA-256('swervie/v1|' + normalized identifier), or 'sv1r-' + a UUID. A raw email or phone number is hashed server-side before anything is stored."
    }
  },
  "additionalProperties": false
}
lookup_product annotations
{
  "title": "Look up a specific product",
  "readOnlyHint": true,
  "openWorldHint": true
}
get_products — Get product details
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Full detail for up to 25 products: all specifications in the category's standard order (card_specs first), review-derived ratings with verbatim evidence quotes, every seller offer with price and buy_url, and attribute_provenance recording where each spec value came from (manufacturer page, retailer listing, spec table). ids accepts product ids and shelf row ids alike: a group row's id resolves to the product the row is named after (its top_pick_id), and resolved_groups reports each substitution. Responses that carry buy_url links also carry a disclosure field: the commission disclosure for those links.

get_products input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "ids"
  ],
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 25,
      "minItems": 1
    },
    "user_signature": {
      "type": "string",
      "maxLength": 128,
      "description": "Optional opaque, stable, pseudonymous user id: the shopper's own rate-limit quota and click attribution. Format: 'sv1-' + the first 24 hex characters of SHA-256('swervie/v1|' + normalized identifier), or 'sv1r-' + a UUID. A raw email or phone number is hashed server-side before anything is stored."
    }
  },
  "additionalProperties": false
}
get_products annotations
{
  "title": "Get product details",
  "readOnlyHint": true,
  "openWorldHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

2 advertised

swervie-results — Swervie results

Advertised by the server during the last successful anonymous check.

Interactive shelf and product-detail view for search_products, browse_category, and get_products results.

swervie-results URI
ui://swervie/results-cf24175d.html

MIME type: text/html;profile=mcp-app

swervie-results-legacy — Swervie results

Advertised by the server during the last successful anonymous check.

Interactive shelf and product-detail view for search_products, browse_category, and get_products results.

swervie-results-legacy URI
ui://swervie/results.html

MIME type: text/html;profile=mcp-app

swervie-results-versions — Swervie results

Advertised by the server during the last successful anonymous check.

Interactive shelf and product-detail view for search_products, browse_category, and get_products results.

swervie-results-versions URI template
ui://swervie/results-{version}.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1399 ms
95th percentile latency
1399 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1399 ms · metadata changed · 5 tool(s), 2 resource(s), 1 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http swervie-mcp https://us-central1-swervie-prod.cloudfunctions.net/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add swervie-mcp --url https://us-central1-swervie-prod.cloudfunctions.net/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable swervie-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "swervie-mcp": {
      "url": "https://us-central1-swervie-prod.cloudfunctions.net/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "swervie-mcp": {
      "type": "streamableHttp",
      "url": "https://us-central1-swervie-prod.cloudfunctions.net/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start swervie-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "swervie-mcp": {
      "type": "http",
      "url": "https://us-central1-swervie-prod.cloudfunctions.net/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http swervie-mcp https://us-central1-swervie-prod.cloudfunctions.net/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "swervie-mcp": {
      "url": "https://us-central1-swervie-prod.cloudfunctions.net/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "swervie-mcp": {
      "serverUrl": "https://us-central1-swervie-prod.cloudfunctions.net/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Swervie MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.