Koskamo

WORN Fit MCP

An MCP server that determines how a watch fits a wrist by comparing case and lug-to-lug dimensions against wrist circumference. It provides fit assessments, size suggestions, and generates to-scale drawings or try-on links using phone camera measurements.

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.

WORN Fit MCP logo, by WORNCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by WORN
You need:No sign-in for the public toolsChatGPT needs Developer mode turned on, which depends on the planShops on WORN's Boutique plan connect with their key (Authorization: Bearer)
MCP endpoint (Streamable HTTP)
https://worn.club/mcp
Vendor documentation

What you can do with it

  • Determine if a specific watch fits a user's wrist size
  • Suggest case diameters and lug-to-lug spans suitable for a wrist
  • Generate a link to measure wrist size via phone camera
  • Retrieve try-on results showing watches on the user's wrist

Source and maintenance

Community listingRegistry 2.0.0

Protocol and capabilities

Server
worn-fit 2.0.0
MCP protocol
2025-06-18
Tools
4 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

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

WORN Fit says how a watch fits a wrist, from WORN's catalogue of 46,000 watches. fit_watch gives a verdict for one to three watches on a wrist size (how far the lugs stop from the wrist's edges, how big each wears, how it sits under a cuff) and a link to them drawn to scale. suggest_sizes gives the case sizes that suit a wrist. start_try_on makes a link that measures the wrist with a phone camera and shows the watches on it; get_try_on_result returns the measured wrist once the person sends it. start_try_on takes a straight-on picture of each watch (image_url) and cuts the watch out of a plain background itself.

Tools

4 advertised

fit_watch — Fit watches to a wrist
Advertised by the server during the last successful anonymous check.
Advertised read-only

How one to three watches fit a wrist of a given size, checked against WORN's catalogue of 46,000 watches (case, thickness, lug width): how far each watch's lugs stop from the edges of the wrist, whether it wears bigger or smaller than its case, and how it sits under a shirt cuff. Returns the verdicts in words, a link to the watches drawn to scale on the wrist, and the drawing as a card where cards are shown. Names are matched as people say them; case_mm and lug_to_lug_mm, when known, make the answer exact.

fit_watch input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "wrist_mm",
    "watches"
  ],
  "properties": {
    "watches": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 80,
            "minLength": 1,
            "description": "The watch's brand and model as the person would say them, e.g. 'Tudor Black Bay 58' or 'Omega Seamaster Diver 300M'. WORN looks it up in its catalogue of 46,000 watches"
          },
          "note": {
            "type": "string",
            "maxLength": 140,
            "description": "One short line on why you suggest this watch, shown under it"
          },
          "shape": {
            "enum": [
              "round",
              "square"
            ],
            "type": "string",
            "description": "Case shape, for the drawing"
          },
          "case_mm": {
            "type": "number",
            "maximum": 60,
            "minimum": 20,
            "description": "Case diameter in mm (width, for a square case), if you know it; it picks the right size where the model comes in several. Leave out and WORN uses its catalogue"
          },
          "thickness_mm": {
            "type": "number",
            "maximum": 30,
            "minimum": 3,
            "description": "Case thickness in mm, if you know it; WORN's catalogue fills it where it can"
          },
          "lug_to_lug_mm": {
            "type": "number",
            "maximum": 75,
            "minimum": 20,
            "description": "Lug-to-lug span in mm from the maker's specs, if you know it. WORN's catalogue does not hold it: left out, it is estimated at 1.2 times the case and said to be"
          }
        }
      },
      "maxItems": 3,
      "minItems": 1
    },
    "wrist_mm": {
      "type": "number",
      "maximum": 260,
      "minimum": 120,
      "description": "Wrist circumference in mm, measured where a watch sits (17 cm is 170)"
    }
  }
}
fit_watch annotations
{
  "title": "Fit watches to a wrist",
  "readOnlyHint": true,
  "openWorldHint": false
}
suggest_sizes — Watch sizes for a wrist
Advertised by the server during the last successful anonymous check.
Advertised read-only

The case diameters and lug-to-lug spans that fit a wrist of a given circumference, and why lug to lug matters more than the case.

suggest_sizes input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "wrist_mm"
  ],
  "properties": {
    "wrist_mm": {
      "type": "number",
      "maximum": 260,
      "minimum": 120,
      "description": "Wrist circumference in mm, measured where a watch sits (17 cm is 170)"
    }
  }
}
suggest_sizes annotations
{
  "title": "Watch sizes for a wrist",
  "readOnlyHint": true,
  "openWorldHint": false
}
start_try_on — Measure the wrist and try watches on
Advertised by the server during the last successful anonymous check.

For a person who does not know their wrist size, or wants to see watches on their own wrist. Makes a link, with a QR code for a computer, that opens on their phone: the back camera measures the wrist in a few seconds with no tape or coin, then draws each watch on a photo of their own wrist at true size, to switch between. Nothing of the picture leaves the phone; tapping Send shares only the size and the watch they liked, which get_try_on_result returns with the code. Up to three watches; the link works for an hour. A picture of each watch can come as a link in image_url (a cutout with a transparent background, or the maker's or a shop's product photo on a plain white or grey background, which WORN cuts out) or as an uploaded file in photos; WORN shows it on the wrist at true size in place of its drawing.

start_try_on input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "watches"
  ],
  "properties": {
    "photos": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "download_url",
          "file_id"
        ],
        "properties": {
          "watch": {
            "type": "string",
            "maxLength": 80,
            "description": "The name of the watch in the picture, as given in watches; left out, the pictures go to the watches in order"
          },
          "file_id": {
            "type": "string",
            "description": "The file's id, as ChatGPT gives it"
          },
          "file_name": {
            "type": "string"
          },
          "mime_type": {
            "type": "string"
          },
          "download_url": {
            "type": "string",
            "description": "The file's download URL, as ChatGPT gives it"
          }
        }
      },
      "maxItems": 3,
      "description": "Pictures of the watches the person uploaded, straight on, to draw on their wrist in place of the drawing: a cutout, or the watch on a plain background, which WORN cuts out"
    },
    "watches": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 80,
            "minLength": 1,
            "description": "The watch's brand and model as the person would say them, e.g. 'Tudor Black Bay 58' or 'Omega Seamaster Diver 300M'. WORN looks it up in its catalogue of 46,000 watches"
          },
          "note": {
            "type": "string",
            "maxLength": 140,
            "description": "One short line on why you suggest this watch, shown under it"
          },
          "shape": {
            "enum": [
              "round",
              "square"
            ],
            "type": "string",
            "description": "Case shape, for the drawing"
          },
          "case_mm": {
            "type": "number",
            "maximum": 60,
            "minimum": 20,
            "description": "Case diameter in mm (width, for a square case), if you know it; it picks the right size where the model comes in several. Leave out and WORN uses its catalogue"
          },
          "image_url": {
            "type": "string",
            "maxLength": 1000,
            "description": "https link to the best picture you have of this exact watch, seen from the front, straight on, 12 o'clock up and the crown to the right (PNG, WebP or JPEG). Best is a cutout with a transparent background; a product photo on a plain white or grey background works too, as WORN cuts the watch out of it. WORN draws it on the person's own wrist at true size; a watch shot on a wrist, at an angle or on a busy background is drawn from its sizes instead"
          },
          "thickness_mm": {
            "type": "number",
            "maximum": 30,
            "minimum": 3,
            "description": "Case thickness in mm, if you know it; WORN's catalogue fills it where it can"
          },
          "image_case_px": {
            "type": "number",
            "description": "Width in pixels of the case in that picture, edge to edge without the crown (40 to 4000), if you know it; left out, WORN measures it from the watch's outline"
          },
          "lug_to_lug_mm": {
            "type": "number",
            "maximum": 75,
            "minimum": 20,
            "description": "Lug-to-lug span in mm from the maker's specs, if you know it. WORN's catalogue does not hold it: left out, it is estimated at 1.2 times the case and said to be"
          }
        }
      },
      "maxItems": 3,
      "minItems": 1,
      "description": "The watches to try on"
    }
  }
}
start_try_on annotations
{
  "title": "Measure the wrist and try watches on",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_try_on_result — Get the measured wrist
Advertised by the server during the last successful anonymous check.
Advertised read-only

The wrist size the person measured with their phone through a try-on link (start_try_on), the watch they liked best, and how each watch fits that wrist. Says when they have not sent it yet, or when the link has expired.

get_try_on_result input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "code"
  ],
  "properties": {
    "code": {
      "type": "string",
      "maxLength": 12,
      "minLength": 4,
      "description": "The code start_try_on returned"
    }
  }
}
get_try_on_result annotations
{
  "title": "Get the measured wrist",
  "readOnlyHint": true,
  "openWorldHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

WORN Fit card

Advertised by the server during the last successful anonymous check.

Watches drawn to scale on a wrist, with how each fits

WORN Fit card URI
ui://worn/fit-card.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
985 ms
95th percentile latency
985 ms

Maintenance history

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

  • · probe · passed · 985 ms · metadata changed · 4 tool(s), 1 resource(s), 0 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 worn-fit-mcp https://worn.club/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 worn-fit-mcp --url https://worn.club/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable worn-fit-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "worn-fit-mcp": {
      "url": "https://worn.club/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "worn-fit-mcp": {
      "type": "streamableHttp",
      "url": "https://worn.club/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start worn-fit-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "worn-fit-mcp": {
      "type": "http",
      "url": "https://worn.club/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 worn-fit-mcp https://worn.club/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": {
    "worn-fit-mcp": {
      "url": "https://worn.club/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": {
    "worn-fit-mcp": {
      "serverUrl": "https://worn.club/mcp"
    }
  }
}

Let your agent find its tools

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