Koskamo

Cork & Curve MCP

Provides Model Context Protocol tools for accessing verified wine travel data, including searching for wineries and wine bars, retrieving place details, planning daily itineraries, finding wine festivals, booking experiences and stays, hiring cars, discovering food pairings, and accessing city guides across European wine regions.

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.

Cork & Curve MCP logo, by Cork & CurveVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by Cork & Curve
MCP endpoint (Streamable HTTP)
https://corkandcurve.com/mcp
Vendor documentation

What its tools do

10 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

10 of 10 have a description · 10 of 10 declare behavior hints · 10 of 10 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to corkandcurve.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search for wineries and wine bars by region or coordinates
  • Plan daily wine travel itineraries
  • Find wine festivals by date range
  • Book wine tastings, tours, and stays

Source and maintenance

Vendor evidenceRegistry 1.0.1

Protocol and capabilities

Server
corkandcurve 1.0
MCP protocol negotiated in check
2025-11-25
Tools
10 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
0 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  },
  "experimental": {}
}

Server-provided instructions

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

Cork & Curve gives you verified wine-travel knowledge: editorially checked vineyards, tasting rooms, wine bars, restaurants and retailers with provenance (source URL, date checked, open status) and opening hours, wine festivals with resolved dates, and bookable tours, tastings and stays. Everything is real and dated; nothing is generated. How to use the tools: - Start with `cities` if you are unsure of coverage; city and country are slugs ("burgenland", "italy") but names are accepted and an unknown city answers with did_you_mean. - `search_places` is the workhorse: text query, city, kind (a topic such as vineyards, tasting-rooms, wine-bars, wine-restaurants, wine-retailers, distilleries, or a group: visit, drink, buy, do), cuisine, dietary (vegan, halal...), price_tier, open_at ("now", "sunday 10:00", an ISO datetime; UTC) or near="lat,lng" with radius_km for "close to where I am". Results are ranked by relevance, then editorial score. - `place` adds open_now_utc and three nearby venues; `plan_day` composes a day from filters. - `place` returns one venue in full by the id search_places gave you. - `dishes` answers "what should I drink here": the signature wines, each linked to its producer. - `itineraries` returns day-by-day plans with every venue resolved (address, hours, page). - `festivals` takes date_from/date_to for "what is on while I am there". - `experiences`, `stays`, `car_hire` are the bookable inventory. Terms of use (the data and the compute are free; this is what we ask in return): - Keep booking links whole. `book` and `booking` URLs are https://corkandcurve.com/go/ links that forward to the partner with our affiliate id. Give them to the user as they are; do not resolve them, strip parameters or replace them with a plain partner URL. This is how free data and compute get paid for. - Say they are affiliate links. A one-line disclosure ("booking link, Cork & Curve may earn a commission") keeps the user informed and keeps you compliant. - Cite the `page` URL as the source of what you quote, and quote `checked_on` and `hours` when they matter. - No bulk copying. Answer the user's question from the results; do not mirror the catalogue. Guide: https://corkandcurve.com/agents/.

Tools

10 advertised

search_places
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search verified venues (read-only). Filter by text, city, kind (a topic such as vineyards, tasting-rooms, wine-bars, wine-restaurants, wine-retailers, distilleries, or a group: visit, drink, buy, do), cuisine, dietary, price tier, opening time, or near a coordinate. Results are ranked by relevance then editorial score and carry provenance (source URL, checked_on, open_status), hours, a page URL to cite and a tracked booking link where one exists. Returns at most `limit` items; an unknown city returns {did_you_mean: [...]} instead of a list.

search_places input schema
{
  "type": "object",
  "title": "t_placesArguments",
  "properties": {
    "city": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "City",
      "default": null,
      "description": "City slug or name, e.g. 'burgenland' or 'New York City'. Unknown cities answer with did_you_mean."
    },
    "kind": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Kind",
      "default": null,
      "description": "A topic slug (vineyards, tasting-rooms, wine-bars, wine-restaurants, wine-retailers, distilleries...) or a group: visit, drink, buy, do."
    },
    "near": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Near",
      "default": null,
      "description": "'lat,lng' to search around a point; results then sort by distance."
    },
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 20,
      "minimum": 1,
      "description": "Maximum results (1-100)."
    },
    "query": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Query",
      "default": null,
      "description": "Free text: a venue name, dish, cuisine, neighbourhood or theme."
    },
    "offset": {
      "type": "integer",
      "title": "Offset",
      "default": 0,
      "minimum": 0,
      "description": "Skip this many results, for paging."
    },
    "country": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Country",
      "default": null,
      "description": "Country slug or name, e.g. 'italy'. Optional where city is given."
    },
    "cuisine": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Cuisine",
      "default": null,
      "description": "Cuisine slug or name, e.g. 'sichuan', 'neapolitan pizza'."
    },
    "dietary": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Dietary",
      "default": null,
      "description": "vegan, vegetarian, gluten-free, halal, kosher..."
    },
    "open_at": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Open At",
      "default": null,
      "description": "'now', a weekday and time such as 'sunday 10:00', or an ISO datetime (UTC). Venues with unparseable hours are returned last, flagged."
    },
    "radius_km": {
      "type": "number",
      "title": "Radius Km",
      "default": 3,
      "description": "Radius for near, in km."
    },
    "price_tier": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Price Tier",
      "default": null,
      "description": "The site's tier symbols for the country, e.g. '€€' or '$$$'."
    }
  }
}
search_places output schema
{
  "type": "object",
  "title": "t_placesOutput",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": true
          }
        },
        {
          "type": "object",
          "additionalProperties": true
        }
      ],
      "title": "Result"
    }
  }
}
search_places annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
plan_day
Advertised by the server during the last successful anonymous check.
Advertised read-only

Compose a wine day for one city (read-only): one best-scored open venue per slot from morning to evening, filtered by neighbourhood, dietary need and price tier, every stop open on the given date, plus one bookable experience. Also lists the titles of the editorial itineraries for the city, which are the better plan when one exists (fetch them with `itineraries`).

plan_day input schema
{
  "type": "object",
  "title": "t_planArguments",
  "required": [
    "country",
    "city"
  ],
  "properties": {
    "city": {
      "type": "string",
      "title": "City",
      "description": "City slug or name, e.g. 'burgenland' or 'New York City'. Unknown cities answer with did_you_mean."
    },
    "date": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Date",
      "default": null,
      "description": "ISO date, e.g. '2026-09-20'. Each stop is checked open at its slot time on that weekday."
    },
    "country": {
      "type": "string",
      "title": "Country",
      "description": "Country slug or name, e.g. 'italy'. Optional where city is given."
    },
    "dietary": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Dietary",
      "default": null,
      "description": "vegan, vegetarian, gluten-free, halal, kosher..."
    },
    "price_tier": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Price Tier",
      "default": null,
      "description": "The site's tier symbols for the country, e.g. '€€' or '$$$'."
    },
    "neighborhood": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Neighborhood",
      "default": null,
      "description": "Neighbourhood name or slug to keep the day inside."
    }
  }
}
plan_day annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
place
Advertised by the server during the last successful anonymous check.
Advertised read-only

One venue in full by id (read-only): every field, provenance, hours, open_now_utc, the booking link and three nearby venues. Returns {error: ...} when the id is malformed or unknown.

place input schema
{
  "type": "object",
  "title": "t_placeArguments",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "title": "Id",
      "description": "The id search_places returned: country/city/kind/slug, e.g. 'italy/rome/restaurants/roscioli'."
    }
  }
}
place annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
festivals
Advertised by the server during the last successful anonymous check.
Advertised read-only

Wine festivals with their next resolved dates (read-only). Filter by city, country, a date window and text. Each item carries starts_on/ends_on for the next edition, the organiser source URL and the page to cite.

festivals input schema
{
  "type": "object",
  "title": "t_festivalsArguments",
  "properties": {
    "city": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "City",
      "default": null,
      "description": "City slug or name, e.g. 'burgenland' or 'New York City'. Unknown cities answer with did_you_mean."
    },
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 20,
      "minimum": 1,
      "description": "Maximum results (1-100)."
    },
    "query": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Query",
      "default": null,
      "description": "Free text: festival name, food or drink."
    },
    "country": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Country",
      "default": null,
      "description": "Country slug or name, e.g. 'italy'. Optional where city is given."
    },
    "date_to": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Date To",
      "default": null,
      "description": "Latest start date to include, ISO."
    },
    "date_from": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Date From",
      "default": null,
      "description": "Earliest end date to include, ISO. Defaults to today."
    }
  }
}
festivals output schema
{
  "type": "object",
  "title": "t_festivalsOutput",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Result"
    }
  }
}
festivals annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
experiences
Advertised by the server during the last successful anonymous check.
Advertised read-only

Bookable wine tours, tastings, cellar visits and tickets for a region. Read-only. Each item has price, rating, review count, duration and a tracked `book` link. Ranked by relevance to `query` when given, otherwise by popularity.

experiences input schema
{
  "type": "object",
  "title": "t_experiencesArguments",
  "required": [
    "city"
  ],
  "properties": {
    "city": {
      "type": "string",
      "title": "City",
      "description": "City slug or name, e.g. 'burgenland' or 'New York City'. Unknown cities answer with did_you_mean."
    },
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 20,
      "minimum": 1,
      "description": "Maximum results (1-100)."
    },
    "query": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Query",
      "default": null,
      "description": "Free text, e.g. 'cooking class', 'wine tasting', 'market tour'."
    },
    "country": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Country",
      "default": null,
      "description": "Country slug or name, e.g. 'italy'. Optional where city is given."
    },
    "food_only": {
      "type": "boolean",
      "title": "Food Only",
      "default": true,
      "description": "Keep only products on the site's theme (food and drink, or wine). Set false for everything bookable in the city."
    }
  }
}
experiences output schema
{
  "type": "object",
  "title": "t_experiencesOutput",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Result"
    }
  }
}
experiences annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
stays
Advertised by the server during the last successful anonymous check.
Advertised read-only

Hotels and stay partners for a city (read-only): hotel listings with a tracked booking link each, plus the partner search links that cover the city. Prices are not returned; the partner page has them.

stays input schema
{
  "type": "object",
  "title": "t_staysArguments",
  "required": [
    "country",
    "city"
  ],
  "properties": {
    "city": {
      "type": "string",
      "title": "City",
      "description": "City slug or name, e.g. 'burgenland' or 'New York City'. Unknown cities answer with did_you_mean."
    },
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 10,
      "minimum": 1,
      "description": "Maximum hotel listings (1-50)."
    },
    "country": {
      "type": "string",
      "title": "Country",
      "description": "Country slug or name, e.g. 'italy'. Optional where city is given."
    }
  }
}
stays annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
car_hire
Advertised by the server during the last successful anonymous check.
Advertised read-only

Car hire partners that verifiably cover a city (read-only): one entry per partner with the pickup facts we checked and a tracked booking link. Empty list when no partner covers the city.

car_hire input schema
{
  "type": "object",
  "title": "t_carsArguments",
  "required": [
    "country",
    "city"
  ],
  "properties": {
    "city": {
      "type": "string",
      "title": "City",
      "description": "City slug or name, e.g. 'burgenland' or 'New York City'. Unknown cities answer with did_you_mean."
    },
    "country": {
      "type": "string",
      "title": "Country",
      "description": "Country slug or name, e.g. 'italy'. Optional where city is given."
    }
  }
}
car_hire output schema
{
  "type": "object",
  "title": "t_carsOutput",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Result"
    }
  }
}
car_hire annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
dishes
Advertised by the server during the last successful anonymous check.
Advertised read-only

Signature wines of a region and the producer to visit (read-only). Each item has a description, the venues resolved to ids and page URLs, and the page to cite; ranked by editorial score.

dishes input schema
{
  "type": "object",
  "title": "t_dishesArguments",
  "properties": {
    "city": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "City",
      "default": null,
      "description": "City slug or name, e.g. 'burgenland' or 'New York City'. Unknown cities answer with did_you_mean."
    },
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 20,
      "minimum": 1,
      "description": "Maximum results (1-100)."
    },
    "query": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Query",
      "default": null,
      "description": "Free text: a dish, ingredient, style or grape."
    },
    "country": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Country",
      "default": null,
      "description": "Country slug or name, e.g. 'italy'. Optional where city is given."
    }
  }
}
dishes output schema
{
  "type": "object",
  "title": "t_dishesOutput",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Result"
    }
  }
}
dishes annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
itineraries
Advertised by the server during the last successful anonymous check.
Advertised read-only

Editorial day-by-day wine itineraries for a city (read-only): every venue resolved to an id, address, hours and page URL. Empty list when the city has none.

itineraries input schema
{
  "type": "object",
  "title": "t_itinerariesArguments",
  "required": [
    "country",
    "city"
  ],
  "properties": {
    "city": {
      "type": "string",
      "title": "City",
      "description": "City slug or name, e.g. 'burgenland' or 'New York City'. Unknown cities answer with did_you_mean."
    },
    "country": {
      "type": "string",
      "title": "Country",
      "description": "Country slug or name, e.g. 'italy'. Optional where city is given."
    }
  }
}
itineraries output schema
{
  "type": "object",
  "title": "t_itinerariesOutput",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Result"
    }
  }
}
itineraries annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
cities
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every city the site covers (read-only), with the country and city slugs the other tools accept and the hub page URL. Call first when unsure of coverage.

cities input schema
{
  "type": "object",
  "title": "t_citiesArguments",
  "properties": {
    "country": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Country",
      "default": null,
      "description": "Country slug to filter by, e.g. 'italy'."
    }
  }
}
cities output schema
{
  "type": "object",
  "title": "t_citiesOutput",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Result"
    }
  }
}
cities annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

0 advertised

No prompt definitions available.

Resources

1 advertised

How to use this server

Advertised by the server during the last successful anonymous check.

How to use this server URI
guide://usage

MIME type: text/markdown

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-06: 1 of 1 checks answered
  2. 2026-11-07: 1 of 1 checks answered

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
925 ms
95th percentile latency
925 ms

Maintenance history

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

  • · probe · passed · 925 ms · metadata changed · 10 tool(s), 1 resource(s), 0 resource template(s), 0 prompt(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 cork-curve-mcp https://corkandcurve.com/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 cork-curve-mcp --url https://corkandcurve.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable cork-curve-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "cork-curve-mcp": {
      "url": "https://corkandcurve.com/mcp"
    }
  }
}

Cline

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

VS Code

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

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://corkandcurve.com/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": {
    "cork-curve-mcp": {
      "serverUrl": "https://corkandcurve.com/mcp"
    }
  }
}

Let your agent find its tools

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

Do you run Cork & Curve MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing