Koskamo

IT-Schulungen.com MCP

A public, read-only Model Context Protocol server that allows AI assistants to search the IT-Schulungen.com seminar catalog. It enables users to find courses, view content and pricing, check schedules and locations, and identify appropriate skill levels for IT training topics across Germany, Austria, and Switzerland.

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.

IT-Schulungen.com MCP logo, by IT-Schulungen.comVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by IT-Schulungen.com
MCP endpoint (Streamable HTTP)
https://webmcp.it-schulungen.com/mcp
Vendor documentation

What you can do with it

  • Find IT seminars by topic or natural language query
  • View course content, prerequisites, and pricing details
  • Check training dates and locations in DACH region
  • Identify beginner, intermediate, or expert level courses

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
IT-Schulungen.com MCP 0.1.0
MCP protocol
2025-06-18
Tools
7 advertised
Resources
3 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {},
  "resources": {}
}

Server-provided instructions

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

Read-only access to the IT-Schulungen.com course catalogue. Every tool is safe to call and never changes anything. Results are cached and may be a few minutes old. Requests are rate limited per client, so prefer one specific query over many broad ones. Responses are deliberately narrow: list results are paginated and return a small set of fields. Ask for more fields explicitly when a task needs them rather than requesting everything up front. The usual path is seminars_search to find candidates, with their prices in brief; seminar_get for the agenda and the full prices, with what is included and what costs extra; seminar_dates for when and where. seminar_topics, seminar_locations and seminar_difficulties turn what a customer says into filter values. Two things this data cannot tell you, so do not claim them: whether a date is still bookable, and any price that was not returned. A date is scheduled, not confirmed; a missing price is price on request. Quote a price only with its delivery form and its unit -- an open seminar is per participant, an in-house seminar per day -- and always as net, plus VAT. When the delivery form is not known, lead with the open seminar. This server takes no enquiries and no bookings. Every seminar carries a `url` to its page on IT-Schulungen.com; end a recommendation with that link, so the customer can go on from there, exactly as returned -- its query string is part of the link. Never invent one.

Tools

7 advertised

ping — Ping the server
Advertised by the server during the last successful anonymous check.
Advertised read-only

Checks that this MCP server is reachable and reports its version. Use this only to diagnose connection problems. It returns no course data.

ping input schema
{
  "type": "object",
  "properties": {}
}
ping output schema
{
  "type": "object",
  "required": [
    "status",
    "server",
    "version",
    "time"
  ],
  "properties": {
    "time": {
      "type": "string",
      "format": "date-time",
      "description": "Server time, UTC, ISO 8601"
    },
    "server": {
      "type": "string",
      "description": "Server name"
    },
    "status": {
      "type": "string",
      "const": "ok"
    },
    "version": {
      "type": "string",
      "description": "Server version"
    }
  },
  "additionalProperties": false
}
ping annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
seminars_search — Search seminars
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Finds seminars in the IT-Schulungen.com catalogue. Use this first when a topic is known but the seminar identifier is not. The search is semantic and covers the whole seminar text, so describe the goal in the customer's own words -- "wie sichere ich unsere Container-Umgebung ab" finds Docker and Kubernetes security seminars that share no word with the question. A keyword list works worse than a sentence. Results come back by relevance. Two operators exist: a phrase in double quotes, and a term prefixed with a minus sign to exclude it. Either one turns the search back into a keyword match, so use them only to correct a search that went wide. Each record carries `topics`, the subjects the seminar is tagged with -- use them to say why a seminar fits and to tell close candidates apart. Each record also carries `prices`, one per delivery form: the amount and what it is per, nothing more. What is included and what costs extra -- an exam voucher, catering on site -- comes only from `seminar_get`, so call it before stating what a seminar costs in total; until then say "from". All amounts are net, plus VAT. When the delivery form is not known, lead with the open seminar, priced per participant; name the in-house price per day only when a team or company is asking or there is no open seminar, and coaching or a subscription only when asked. A price without an amount is price on request, and so is a seminar without `prices`. Returns a compact record per seminar, each with `url`: the page on IT-Schulungen.com. Enquiries and bookings do not run through this server, so that link is where a customer has to go -- name it whenever a seminar is recommended, exactly as returned: its query string is part of the link. Call `seminar_get` with a `guid` from this list for the agenda and prerequisites, and `seminar_dates` for scheduled dates.

seminars_search input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "default": 1,
      "description": "Page number, starting at 1"
    },
    "limit": {
      "type": "integer",
      "default": 20,
      "description": "Records per page, 1-50, default 20"
    },
    "query": {
      "type": "string",
      "description": "What the seminar should be about, at least 2 characters"
    },
    "topic": {
      "type": [
        "null",
        "string"
      ],
      "default": null,
      "description": "Exact topic name or identifier from `seminar_topics`"
    },
    "language": {
      "type": [
        "null",
        "string"
      ],
      "default": null,
      "description": "Two-letter language code (ISO 639-1), e.g. \"de\" or \"en\""
    },
    "difficulty": {
      "type": [
        "null",
        "string"
      ],
      "default": null,
      "description": "Difficulty identifier from `seminar_difficulties`"
    }
  }
}
seminars_search output schema
{
  "type": "object",
  "required": [
    "items",
    "returned",
    "page",
    "has_more"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "page": {
      "type": "integer"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "guid"
        ],
        "properties": {
          "url": {
            "type": "string"
          },
          "guid": {
            "type": "string"
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "type": {
            "type": [
              "string",
              "null"
            ]
          },
          "prices": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "topics": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "seminar": {
            "type": "object",
            "properties": {
              "duration": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "duration_unit": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "language": {
            "type": [
              "string",
              "null"
            ]
          },
          "product_difficulty_guid": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      }
    },
    "total": {
      "type": "integer"
    },
    "has_more": {
      "type": "boolean"
    },
    "returned": {
      "type": "integer"
    }
  }
}
seminars_search annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
seminar_get — Get a seminar
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Returns one seminar with its description, agenda and prerequisites. The texts are markdown. Prices come along in full, one per delivery form with what is included and what costs extra -- the only place that says so; `seminars_search` carries the amounts alone. `url` is the seminar's page on IT-Schulungen.com and the place to send a customer: this server answers questions, it does not take enquiries or bookings. Hand it on exactly as returned, query string included. If the field is missing, fall back to the portal's own search rather than guessing an address. A seminar carries one price per delivery form, not one price: an open seminar is priced per participant, an in-house seminar and a coaching per day. All amounts are net, plus VAT. Always name which form a price belongs to, and read `calculation_unit` before stating an amount. `offer_type` says how far the price commits: `not-binding-inquiry` is a starting point for an enquiry, not a quote.

seminar_get input schema
{
  "type": "object",
  "required": [
    "guid"
  ],
  "properties": {
    "guid": {
      "type": "string",
      "description": "Seminar identifier, e.g. \"NE-PRDCT-1f2dbdfa-d740-47ac-9921-9f5ac767cc86\""
    }
  }
}
seminar_get output schema
{
  "type": "object",
  "required": [
    "guid"
  ],
  "properties": {
    "url": {
      "type": "string"
    },
    "guid": {
      "type": "string"
    },
    "name": {
      "type": [
        "string",
        "null"
      ]
    },
    "type": {
      "type": [
        "string",
        "null"
      ]
    },
    "_note": {
      "type": "string"
    },
    "prices": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "topics": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "seminar": {
      "type": "object",
      "properties": {
        "duration": {
          "type": [
            "number",
            "null"
          ]
        },
        "duration_unit": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "language": {
      "type": [
        "string",
        "null"
      ]
    },
    "product_difficulty_guid": {
      "type": [
        "string",
        "null"
      ]
    }
  }
}
seminar_get annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
seminar_dates — Get seminar dates
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Lists the scheduled dates of a seminar, soonest first. Past dates are never returned. Without `from` the window starts today. `from` and `to` are calendar days in German time, and both are included. An empty result means nothing is currently scheduled -- it does not mean the seminar does not exist. Each date carries the cities it runs in; a city of type `virtual` is an online delivery, `place` is on site. Dates that are cancelled, postponed or already over are never returned. `status` is what to lead with when suggesting a date: guaranteed this seminar runs, whatever else happens -- recommend these first, and say so, because it is the customer's strongest reason to pick one date over another planned scheduled and open for enrolment, not yet confirmed to run `direct_booking` appears only on dates that can be booked straight through the portal, with `direct_booking_until` as the last day for it. **Its absence says nothing about availability.** Every date listed here can be enquired about and enrolled in; direct booking is a shortcut, not a condition. Never tell a customer a date is unavailable because this field is missing. `seminar` names the course the dates belong to -- name, duration and its `url` -- so the list can be presented under that heading. It is left out only when the lookup failed; the dates still stand. `begin` and `finish`, per date and per day in `days`, are UTC. The seminars run in local time (Europe/Berlin; Vienna and Zurich are the same zone): convert before quoting a time, so 07:00Z is 09:00 in summer and 08:00 in winter, never "7 Uhr".

seminar_dates input schema
{
  "type": "object",
  "required": [
    "seminar_guid"
  ],
  "properties": {
    "to": {
      "type": [
        "null",
        "string"
      ],
      "default": null,
      "description": "Latest start date, \"YYYY-MM-DD\", included"
    },
    "city": {
      "type": [
        "null",
        "string"
      ],
      "default": null,
      "description": "Place name such as \"München\", or \"online\" for virtual delivery"
    },
    "from": {
      "type": [
        "null",
        "string"
      ],
      "default": null,
      "description": "Earliest start date, \"YYYY-MM-DD\". Defaults to today"
    },
    "page": {
      "type": "integer",
      "default": 1,
      "description": "Page number, starting at 1"
    },
    "limit": {
      "type": "integer",
      "default": 20,
      "description": "Records per page, 1-50, default 20"
    },
    "seminar_guid": {
      "type": "string",
      "description": "Seminar identifier from `seminars_search`"
    }
  }
}
seminar_dates output schema
{
  "type": "object",
  "required": [
    "items",
    "returned",
    "page",
    "has_more"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "page": {
      "type": "integer"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "guid",
          "begin",
          "finish",
          "status"
        ],
        "properties": {
          "days": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "begin": {
                  "type": "string",
                  "format": "date-time",
                  "description": "UTC"
                },
                "finish": {
                  "type": "string",
                  "format": "date-time",
                  "description": "UTC"
                }
              }
            }
          },
          "guid": {
            "type": "string"
          },
          "begin": {
            "type": "string",
            "format": "date-time",
            "description": "UTC"
          },
          "cities": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "guid": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "type": {
                  "enum": [
                    "place",
                    "virtual"
                  ]
                }
              }
            }
          },
          "finish": {
            "type": "string",
            "format": "date-time",
            "description": "UTC"
          },
          "status": {
            "enum": [
              "guaranteed",
              "planned"
            ]
          },
          "product_guid": {
            "type": "string"
          },
          "direct_booking": {
            "type": "boolean"
          },
          "direct_booking_until": {
            "type": "string"
          }
        }
      }
    },
    "total": {
      "type": "integer"
    },
    "seminar": {
      "type": "object",
      "required": [
        "guid"
      ],
      "properties": {
        "url": {
          "type": "string"
        },
        "guid": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "duration": {
          "type": "number"
        },
        "duration_unit": {
          "type": "string"
        }
      }
    },
    "has_more": {
      "type": "boolean"
    },
    "returned": {
      "type": "integer"
    }
  }
}
seminar_dates annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
seminar_topics — Search topics
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Searches the topic vocabulary seminars are tagged with. Use this to turn a customer's wording into a filter value for `seminars_search`, and to check whether a product or technology is covered at all. Aliases are searched too, so "K8s" finds "Kubernetes" and "AKS" finds "Azure Kubernetes Services". This is a filter axis, not a catalogue: a hit means the topic exists, not that a seminar on it does. `seminars_search` answers that.

seminar_topics input schema
{
  "type": "object",
  "properties": {
    "page": {
      "type": "integer",
      "default": 1,
      "description": "Page number, starting at 1"
    },
    "type": {
      "type": [
        "null",
        "string"
      ],
      "default": null,
      "description": "One of manufacturer, topic, technology, software, software_version, audience"
    },
    "limit": {
      "type": "integer",
      "default": 20,
      "description": "Records per page, 1-50, default 20"
    },
    "query": {
      "type": [
        "null",
        "string"
      ],
      "default": null,
      "description": "Part of a topic name or alias, e.g. \"Kubernetes\""
    }
  }
}
seminar_topics output schema
{
  "type": "object",
  "required": [
    "items",
    "returned",
    "page",
    "has_more"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "page": {
      "type": "integer"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "guid",
          "name"
        ],
        "properties": {
          "guid": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": [
              "string",
              "null"
            ]
          },
          "alias": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          }
        }
      }
    },
    "total": {
      "type": "integer"
    },
    "has_more": {
      "type": "boolean"
    },
    "returned": {
      "type": "integer"
    }
  }
}
seminar_topics annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
seminar_locations — List locations
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Lists the places seminars are held at. The catalogue runs in a fixed set of cities, plus a virtual classroom for online delivery. Use this to answer "where do you teach this?" and to check a place before passing it to `seminar_dates` -- a city that is not in this list has no dates, however the customer spells it.

seminar_locations input schema
{
  "type": "object",
  "properties": {
    "query": {
      "type": [
        "null",
        "string"
      ],
      "default": null,
      "description": "Part of a place name, e.g. \"Frank\""
    }
  }
}
seminar_locations output schema
{
  "type": "object",
  "required": [
    "items",
    "returned",
    "page",
    "has_more"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "page": {
      "type": "integer"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "guid",
          "name"
        ],
        "properties": {
          "guid": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": [
              "string",
              "null"
            ]
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      }
    },
    "total": {
      "type": "integer"
    },
    "has_more": {
      "type": "boolean"
    },
    "returned": {
      "type": "integer"
    }
  }
}
seminar_locations annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
seminar_difficulties — List difficulty levels
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Lists the difficulty levels a seminar can be filtered by. Call this before passing `difficulty` to `seminars_search`; the filter takes an identifier, not a label.

seminar_difficulties input schema
{
  "type": "object",
  "properties": {}
}
seminar_difficulties output schema
{
  "type": "object",
  "required": [
    "items",
    "returned",
    "page",
    "has_more"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "page": {
      "type": "integer"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "guid",
          "name"
        ],
        "properties": {
          "guid": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "sort_order": {
            "type": [
              "integer",
              "null"
            ]
          }
        }
      }
    },
    "total": {
      "type": "integer"
    },
    "has_more": {
      "type": "boolean"
    },
    "returned": {
      "type": "integer"
    }
  }
}
seminar_difficulties annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

3 advertised

seminar-search-view — Seminar search results

Advertised by the server during the last successful anonymous check.

Seminar search results as cards.

seminar-search-view URI
ui://seminars/6a09c318/search.html

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

seminar-dates-view — Seminar dates

Advertised by the server during the last successful anonymous check.

Scheduled seminar dates as a table.

seminar-dates-view URI
ui://seminars/6a09c318/dates.html

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

seminar-detail-view — Seminar details

Advertised by the server during the last successful anonymous check.

One seminar: overview, prices with their delivery form and unit, texts.

seminar-detail-view URI
ui://seminars/6a09c318/seminar.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
1314 ms
95th percentile latency
1314 ms

Maintenance history

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

  • · probe · passed · 1314 ms · metadata changed · 7 tool(s), 3 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 it-schulungen-com-mcp https://webmcp.it-schulungen.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 it-schulungen-com-mcp --url https://webmcp.it-schulungen.com/mcp

Cursor

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

Cline

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

VS Code

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

Let your agent find its tools

Find servers like IT-Schulungen.com 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 IT-Schulungen.com 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