Koskamo

Stayspan Schengen Days MCP

A community MCP server that calculates Schengen short-stay compliance using the rolling 90/180 day rule. It allows users to check days used and remaining, identify potential overstay dates, and download daily CSV calculations for itineraries up to 60 stays within a 1,100-day window.

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.

Stayspan Schengen Days MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Zovo
MCP endpoint (Streamable HTTP)
https://schengen-days.zovo.one/mcp
Vendor documentation

What you can do with it

  • Check days used and days left for specific date ranges
  • Identify overstay dates based on rolling window rules
  • Download daily CSV calculations for itinerary planning
  • Plan future stays assuming no further visits

Source and maintenance

Community listingRegistry 1.0.1

Protocol and capabilities

Server
schengen-days 1.0.1
MCP protocol
2025-06-18
Tools
3 advertised
Resources
1 advertised
Resource templates
1 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.

Count Schengen short stays using inclusive entry/exit days and a rolling 180-day window. Use the user's check or entry date. Do not ask for nationality or passport information. Explain the distinction between window days left and maximum continuous stay. Present the calculation-aid limits and CSV link. Dates shown as legal mean compliant with the 90/180 calculation only; they do not authorize entry.

Tools

3 advertised

calculate_schengen_days — Calculate Schengen days
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user needs a schengen calculator, schengen days left, schengen overstay dates or a 90/180 rule calculator for past and planned short stays. Returns days used and left on the check date, stay compliance, overstay dates and daily CSV. Accepts ISO or English US text dates, up to 60 stays over 1,100 days, years 1900–2100. Open stays end at the check date; touching stays merge. Does not model bilateral agreements, residence permits, long-stay visas or visa-sticker limits; calculation aid, not legal advice.

calculate_schengen_days input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "stays",
    "check_date"
  ],
  "properties": {
    "stays": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "entry_date"
        ],
        "properties": {
          "exit_date": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 80,
                "description": "Last day in Schengen, inclusive. Example: 2026-03-20. Omit only for an ongoing stay in calculation or reset mode."
              },
              {
                "type": "null"
              }
            ]
          },
          "entry_date": {
            "type": "string",
            "maxLength": 80,
            "description": "First day in Schengen, inclusive. Example: 2026-03-05 or March 5, 2026."
          }
        },
        "additionalProperties": false
      },
      "maxItems": 60,
      "description": "Up to 60 short stays spanning at most 1,100 days. Example: [{\"entry_date\":\"2026-03-05\",\"exit_date\":\"2026-03-20\"}]. Use [] for none. Exclude residence-permit and type D visa days."
    },
    "check_date": {
      "type": "string",
      "maxLength": 80,
      "description": "Window ends on this day, inclusive. Example: 2026-03-20 or March 20, 2026. Required for an ongoing stay."
    }
  }
}
calculate_schengen_days output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "kind",
    "notes",
    "downloads",
    "note",
    "check_date",
    "window_start",
    "window_end",
    "days_used",
    "days_left",
    "overstay_day_count",
    "first_overstay_date",
    "stay_results",
    "stay_result_count",
    "overstay_ranges",
    "next_legal_entry",
    "next_entry_max_days"
  ],
  "properties": {
    "kind": {
      "type": "string"
    },
    "note": {
      "type": "string"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "days_left": {
      "type": "number"
    },
    "days_used": {
      "type": "number"
    },
    "downloads": {
      "type": "object",
      "required": [
        "csv"
      ],
      "properties": {
        "csv": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "check_date": {
      "type": "string"
    },
    "window_end": {
      "type": "string"
    },
    "stay_results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "stay",
          "entry_date",
          "exit_date",
          "days",
          "legal",
          "first_overstay_date",
          "overstay_days"
        ],
        "properties": {
          "days": {
            "type": "number"
          },
          "stay": {
            "type": "number"
          },
          "legal": {
            "type": "boolean"
          },
          "exit_date": {
            "type": "string"
          },
          "entry_date": {
            "type": "string"
          },
          "overstay_days": {
            "type": "number"
          },
          "first_overstay_date": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    "window_start": {
      "type": "string"
    },
    "overstay_ranges": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "from",
          "through",
          "days"
        ],
        "properties": {
          "days": {
            "type": "number"
          },
          "from": {
            "type": "string"
          },
          "through": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    },
    "next_legal_entry": {
      "type": "string"
    },
    "stay_result_count": {
      "type": "number"
    },
    "overstay_day_count": {
      "type": "number"
    },
    "first_overstay_date": {
      "type": [
        "string",
        "null"
      ]
    },
    "next_entry_max_days": {
      "type": "number"
    }
  },
  "additionalProperties": false
}
calculate_schengen_days annotations
{
  "title": "Calculate Schengen days",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
plan_schengen_trip — Plan Schengen trip
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user asks how many days can I stay in Europe, wants a schengen visa calculator or needs to plan 90 days in 180 days. Finds the maximum consecutive short stay from an entry date and the first entry that supports a requested length. Past stays must be closed and end by entry; up to 60 stays over 1,100 days, years 1900–2100, requested lengths 1–90 days. Does not authorize entry or model bilateral agreements, residence permits, long-stay visas or visa-sticker limits; not legal advice.

plan_schengen_trip input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "past_stays",
    "entry_date"
  ],
  "properties": {
    "entry_date": {
      "type": "string",
      "maxLength": 80,
      "description": "Planned first day in Schengen. Example: 2026-07-01 or July 1, 2026. Past stays must end on or before this day."
    },
    "past_stays": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "entry_date"
        ],
        "properties": {
          "exit_date": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 80,
                "description": "Last day in Schengen, inclusive. Example: 2026-03-20. Omit only for an ongoing stay in calculation or reset mode."
              },
              {
                "type": "null"
              }
            ]
          },
          "entry_date": {
            "type": "string",
            "maxLength": 80,
            "description": "First day in Schengen, inclusive. Example: 2026-03-05 or March 5, 2026."
          }
        },
        "additionalProperties": false
      },
      "maxItems": 60,
      "description": "Up to 60 short stays spanning at most 1,100 days. Example: [{\"entry_date\":\"2026-03-05\",\"exit_date\":\"2026-03-20\"}]. Use [] for none. Exclude residence-permit and type D visa days."
    },
    "planned_length": {
      "type": "integer",
      "maximum": 90,
      "minimum": 1,
      "description": "Optional consecutive trip length, including entry and exit, from 1 to 90 days. Example: 30."
    }
  }
}
plan_schengen_trip output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "kind",
    "notes",
    "downloads",
    "note",
    "entry_date",
    "max_legal_days",
    "last_legal_exit",
    "planned_length",
    "planned_length_possible",
    "first_entry_for_full_length",
    "days_used_before_trip",
    "history_overstay_days"
  ],
  "properties": {
    "kind": {
      "type": "string"
    },
    "note": {
      "type": "string"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "downloads": {
      "type": "object",
      "required": [
        "csv"
      ],
      "properties": {
        "csv": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "entry_date": {
      "type": "string"
    },
    "max_legal_days": {
      "type": "number"
    },
    "planned_length": {
      "type": [
        "number",
        "null"
      ]
    },
    "last_legal_exit": {
      "type": [
        "string",
        "null"
      ]
    },
    "days_used_before_trip": {
      "type": "number"
    },
    "history_overstay_days": {
      "type": "number"
    },
    "planned_length_possible": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "first_entry_for_full_length": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "additionalProperties": false
}
plan_schengen_trip annotations
{
  "title": "Plan Schengen trip",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_schengen_reset_dates — Find Schengen reset dates
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user wants schengen days left to return, a schengen 90 day rule projection or a days in Europe calculator for future availability. Projects window headroom on the next 180 dates with a daily CSV, assuming no further stays and departure by the reference date. Up to 60 stays over 1,100 days, years 1900–2100. Reference date defaults to America/New_York today. Headroom is not maximum consecutive trip length. Does not model bilateral agreements, residence permits, long-stay visas or visa-sticker limits; not legal advice.

find_schengen_reset_dates input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "past_stays"
  ],
  "properties": {
    "past_stays": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "entry_date"
        ],
        "properties": {
          "exit_date": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 80,
                "description": "Last day in Schengen, inclusive. Example: 2026-03-20. Omit only for an ongoing stay in calculation or reset mode."
              },
              {
                "type": "null"
              }
            ]
          },
          "entry_date": {
            "type": "string",
            "maxLength": 80,
            "description": "First day in Schengen, inclusive. Example: 2026-03-05 or March 5, 2026."
          }
        },
        "additionalProperties": false
      },
      "maxItems": 60,
      "description": "Up to 60 short stays spanning at most 1,100 days. Example: [{\"entry_date\":\"2026-03-05\",\"exit_date\":\"2026-03-20\"}]. Use [] for none. Exclude residence-permit and type D visa days."
    },
    "reference_date": {
      "type": "string",
      "maxLength": 80,
      "description": "Projection starts the day after this date. Example: 2026-03-31 or March 31, 2026. If omitted, uses today's date in America/New_York and says so."
    }
  }
}
find_schengen_reset_dates output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "kind",
    "notes",
    "downloads",
    "note",
    "reference_date",
    "days_used",
    "days_left",
    "first_available_date",
    "full_90_available_date",
    "reset_event_count",
    "reset_dates"
  ],
  "properties": {
    "kind": {
      "type": "string"
    },
    "note": {
      "type": "string"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "days_left": {
      "type": "number"
    },
    "days_used": {
      "type": "number"
    },
    "downloads": {
      "type": "object",
      "required": [
        "csv"
      ],
      "properties": {
        "csv": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "reset_dates": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "date",
          "days_used",
          "days_available",
          "days_returned"
        ],
        "properties": {
          "date": {
            "type": "string"
          },
          "days_used": {
            "type": "number"
          },
          "days_returned": {
            "type": "number"
          },
          "days_available": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "reference_date": {
      "type": "string"
    },
    "reset_event_count": {
      "type": "number"
    },
    "first_available_date": {
      "type": [
        "string",
        "null"
      ]
    },
    "full_90_available_date": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "additionalProperties": false
}
find_schengen_reset_dates annotations
{
  "title": "Find Schengen reset dates",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

schengen-days-widget — Stayspan Schengen Days view

Advertised by the server during the last successful anonymous check.

Interactive view for Stayspan Schengen Days.

schengen-days-widget URI
ui://widget/schengen-days-v4-1.0.1-5210f73dd40a82a1e1142d0cbce5f11121e9a94c450ff7f3b31aad348587c8cf.html

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

schengen-days-widget-legacy — Stayspan Schengen Days view (previous versions)

Advertised by the server during the last successful anonymous check.

schengen-days-widget-legacy URI template
ui://widget/schengen-days-{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
461 ms
95th percentile latency
461 ms

Maintenance history

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

  • · probe · passed · 461 ms · metadata changed · 3 tool(s), 1 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 stayspan-schengen-days-mcp https://schengen-days.zovo.one/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 stayspan-schengen-days-mcp --url https://schengen-days.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable stayspan-schengen-days-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "stayspan-schengen-days-mcp": {
      "url": "https://schengen-days.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "stayspan-schengen-days-mcp": {
      "type": "streamableHttp",
      "url": "https://schengen-days.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

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

Let your agent find its tools

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