Koskamo

IYT Test MCP

A public, read-only MCP server that allows AI assistants to quiz users on sailing certification levels, check answers, run mock exams, and access theory articles in English and Russian.

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.

IYT Test MCP logo, by IYT TestCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by IYT Test
MCP endpoint (Streamable HTTP)
https://iyt.rycrentals.com/api/mcp
Vendor documentation

What its tools do

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

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

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Quiz user on IALA buoyage for Bareboat Skipper
  • Run and grade a Yachtmaster Coastal mock exam
  • Explain cardinal marks and test knowledge
  • Ask the question of the day in Russian

Source and maintenance

Community listingRegistry 1.0.1
Maintenance checked

Protocol and capabilities

Server
iyt-test 1.0.1
MCP protocol negotiated in check
2025-11-25
Tools
13 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

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

IYT Test: practice questions and theory for IYT sailing certification levels, the Racing Rules of Sailing and the charter check-in (6100 questions). Call list_levels first. Ask questions one at a time with options A to D and never reveal the answer before the student chooses; check_answer gives the verdict, the note and the theory section to read. Most questions have a drawing: show figure.url to the student (an SVG image) because the question usually depends on it; if you describe the drawing instead, say what is seen without naming what the question asks. The questions and articles are study material, not official IYT exam content. The app itself: https://iyt.rycrentals.com and the Telegram bot @iyt_test_bot.

Tools

13 advertised

list_levels — List levels
Advertised by the server during the last successful anonymous check.
Advertised read-only

The levels with a question bank (IYT courses, the Racing Rules of Sailing, the charter check-in): topics, number of questions, mock-exam settings and which topics have a theory article.

list_levels input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    }
  },
  "additionalProperties": false
}
list_levels annotations
{
  "title": "List levels",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_questions — Get practice questions
Advertised by the server during the last successful anonymous check.
Advertised read-only

Random practice questions of a level, of one topic or difficulty when given, without the answers.

get_questions input schema
{
  "type": "object",
  "required": [
    "level"
  ],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "count": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "How many (default 5)."
    },
    "level": {
      "type": "string",
      "description": "Level id, e.g. bareboat-skipper."
    },
    "topic": {
      "type": "string",
      "description": "Topic id, to practise one topic."
    },
    "exclude": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Question ids the student has already had in this conversation, so they are not repeated."
    },
    "text_only": {
      "type": "boolean",
      "description": "Only questions without a drawing, for when images cannot be shown."
    },
    "difficulty": {
      "enum": [
        1,
        2,
        3
      ],
      "type": "integer",
      "description": "1 easy, 2 medium, 3 hard."
    }
  },
  "additionalProperties": false
}
get_questions annotations
{
  "title": "Get practice questions",
  "readOnlyHint": true,
  "openWorldHint": false
}
check_answer — Check an answer
Advertised by the server during the last successful anonymous check.
Advertised read-only

Whether an option of a question is right: the right option, the one-line note that names the rule, and the theory section that explains it.

check_answer input schema
{
  "type": "object",
  "required": [
    "question_id",
    "option"
  ],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "option": {
      "enum": [
        "A",
        "B",
        "C",
        "D"
      ],
      "type": "string",
      "description": "The option chosen: A, B, C or D."
    },
    "question_id": {
      "type": "string",
      "description": "Question id, e.g. bs-001."
    }
  },
  "additionalProperties": false
}
check_answer annotations
{
  "title": "Check an answer",
  "readOnlyHint": true,
  "openWorldHint": false
}
search_questions — Search questions
Advertised by the server during the last successful anonymous check.
Advertised read-only

Questions whose text, options, rule reference or topic have the words (e.g. "cardinal mark", "MAYDAY"), without the answers.

search_questions input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "count": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "How many (default 10)."
    },
    "level": {
      "type": "string",
      "description": "Level id, e.g. bareboat-skipper."
    },
    "query": {
      "type": "string",
      "description": "Words to look for; all of them must be there."
    }
  },
  "additionalProperties": false
}
search_questions annotations
{
  "title": "Search questions",
  "readOnlyHint": true,
  "openWorldHint": false
}
start_mock_exam — Start a mock exam
Advertised by the server during the last successful anonymous check.
Advertised read-only

A mock exam of a level: the exam's number of questions spread evenly over all topics, with the time allowed and the pass mark, without the answers.

start_mock_exam input schema
{
  "type": "object",
  "required": [
    "level"
  ],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "level": {
      "type": "string",
      "description": "Level id, e.g. bareboat-skipper."
    }
  },
  "additionalProperties": false
}
start_mock_exam annotations
{
  "title": "Start a mock exam",
  "readOnlyHint": true,
  "openWorldHint": false
}
grade_exam — Grade a mock exam
Advertised by the server during the last successful anonymous check.
Advertised read-only

The marks of a finished mock exam: the score, pass or fail, the result per topic, every mistake with the right answer and its note, and the theory sections to read. A question with option null was not answered and counts as wrong.

grade_exam input schema
{
  "type": "object",
  "required": [
    "answers"
  ],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "answers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "question_id"
        ],
        "properties": {
          "option": {
            "enum": [
              "A",
              "B",
              "C",
              "D",
              null
            ],
            "type": [
              "string",
              "null"
            ],
            "description": "A, B, C, D, or null when not answered."
          },
          "question_id": {
            "type": "string",
            "description": "Question id, e.g. bs-001."
          }
        },
        "additionalProperties": false
      },
      "maxItems": 100,
      "minItems": 1,
      "description": "One item per question of the exam."
    }
  },
  "additionalProperties": false
}
grade_exam annotations
{
  "title": "Grade a mock exam",
  "readOnlyHint": true,
  "openWorldHint": false
}
question_of_the_day — Question of the day
Advertised by the server during the last successful anonymous check.
Advertised read-only

Today's question, the same one the Telegram bot @iyt_test_bot sends: one text question per day (UTC), for one level when a level is given, without the answer.

question_of_the_day input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "level": {
      "type": "string",
      "description": "Level id, e.g. bareboat-skipper."
    }
  },
  "additionalProperties": false
}
question_of_the_day annotations
{
  "title": "Question of the day",
  "readOnlyHint": true,
  "openWorldHint": false
}
list_theory — List theory articles
Advertised by the server during the last successful anonymous check.
Advertised read-only

The theory articles: one per topic, each in sections. With a level, the sections of its articles; without, which topics of every level have an article. Some topics have no article yet.

list_theory input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "level": {
      "type": "string",
      "description": "Level id, e.g. bareboat-skipper."
    }
  },
  "additionalProperties": false
}
list_theory annotations
{
  "title": "List theory articles",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_theory — Read a theory article
Advertised by the server during the last successful anonymous check.
Advertised read-only

A theory article, or one section of it, as text: the rule, the reason, tables and links to the drawings. Study notes close to the syllabus, not official IYT text.

get_theory input schema
{
  "type": "object",
  "required": [
    "level",
    "topic"
  ],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "level": {
      "type": "string",
      "description": "Level id, e.g. bareboat-skipper."
    },
    "topic": {
      "type": "string",
      "description": "Topic id, e.g. buoyage."
    },
    "section": {
      "type": "string",
      "description": "Section id, to read one section only."
    }
  },
  "additionalProperties": false
}
get_theory annotations
{
  "title": "Read a theory article",
  "readOnlyHint": true,
  "openWorldHint": false
}
search_theory — Search theory
Advertised by the server during the last successful anonymous check.
Advertised read-only

The sections of the theory articles that have the words (e.g. "scope", "cardinal marks"), with an excerpt of each.

search_theory input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "count": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "How many (default 8)."
    },
    "level": {
      "type": "string",
      "description": "Level id, e.g. bareboat-skipper."
    },
    "query": {
      "type": "string",
      "description": "Words to look for; all of them must be there."
    }
  },
  "additionalProperties": false
}
search_theory annotations
{
  "title": "Search theory",
  "readOnlyHint": true,
  "openWorldHint": false
}
explain_question — Explain a question
Advertised by the server during the last successful anonymous check.
Advertised read-only

A question with its answer, the note that names the rule and the full text of the theory section that explains it.

explain_question input schema
{
  "type": "object",
  "required": [
    "question_id"
  ],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "question_id": {
      "type": "string",
      "description": "Question id, e.g. bs-001."
    }
  },
  "additionalProperties": false
}
explain_question annotations
{
  "title": "Explain a question",
  "readOnlyHint": true,
  "openWorldHint": false
}
practice_section — Practise a theory section
Advertised by the server during the last successful anonymous check.
Advertised read-only

The questions on what a theory section explains, at random, without the answers.

practice_section input schema
{
  "type": "object",
  "required": [
    "level",
    "topic",
    "section"
  ],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "count": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "How many (default 5)."
    },
    "level": {
      "type": "string",
      "description": "Level id, e.g. bareboat-skipper."
    },
    "topic": {
      "type": "string",
      "description": "Topic id, e.g. buoyage."
    },
    "exclude": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Question ids the student has already had in this conversation, so they are not repeated."
    },
    "section": {
      "type": "string",
      "description": "Section id, e.g. cardinal."
    }
  },
  "additionalProperties": false
}
practice_section annotations
{
  "title": "Practise a theory section",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_figure — Get a drawing
Advertised by the server during the last successful anonymous check.
Advertised read-only

The drawing of a question or of a theory section as SVG markup.

get_figure input schema
{
  "type": "object",
  "required": [
    "figure"
  ],
  "properties": {
    "lang": {
      "enum": [
        "en",
        "ru"
      ],
      "type": "string",
      "description": "Language of the text: en (default) or ru. What is not translated yet comes in English."
    },
    "figure": {
      "type": "string",
      "description": "A question id (bs-001), or a theory drawing as level/topic/section/number (bareboat-skipper/buoyage/lateral/1)."
    }
  },
  "additionalProperties": false
}
get_figure annotations
{
  "title": "Get a drawing",
  "readOnlyHint": true,
  "openWorldHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

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 (1 of 1 answered).

  1. 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
575 ms
95th percentile latency
575 ms

Maintenance history

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

  • · probe · passed · 575 ms · metadata changed · 13 tool(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 iyt-test-mcp https://iyt.rycrentals.com/api/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 iyt-test-mcp --url https://iyt.rycrentals.com/api/mcp

Cursor

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

Cline

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

VS Code

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

Let your agent find its tools

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