plavecka-akademia-mcp

plavecka-akademia-mcp

Enables querying children's swimming course listings from plaveckaakademia.sk with complex filters and cross-category slot finding, all through natural language.

Category
访问服务器

README

plavecka-akademia-mcp

A remote MCP (Model Context Protocol) server that turns plaveckaakademia.sk's children's swimming course listings into structured tools an LLM can call, so prompts like "Žralok on Friday in Devínska" or "a date and place where I can book Žralok + Delfín + Korytnačka at the same location" are answerable in one or two tool calls instead of manually paging through the site.

The site itself has no API: it's a Drupal 7 Views exposed-filter form supporting only a centre and a sub-level filter, no day/time filter and no way to ask a cross-category question. This server fetches and parses the site's own HTML and layers the richer filtering on top, server-side.

It runs as an Azure Function App and is meant to be added to Claude as a custom connector — see Add it to Claude below.

Tools

list_categories

No arguments. Lists the four course categories (Morský koník, Korytnačka, Delfín, Žralok) with their slug, age range, whether they offer */** sub-levels, and the centres each is offered at.

list_courses

{
  category: string,        // slug or display name, diacritic/case-insensitive, e.g. "zralok" or "Žralok"
  location?: string,       // centre name, diacritic/case-insensitive, e.g. "devinska" -> "Devínska"
  level?: "*" | "**" | "any",
  day?: string,            // Slovak or English weekday, e.g. "piatok" or "friday"
  timeFrom?: string,       // "HH:MM"
  timeTo?: string,         // "HH:MM"
  startAfter?: string,     // ISO date
  startBefore?: string,    // ISO date
  maxPrice?: number,
  limit?: number,
  offset?: number,
}

Returns { total, returned, offset, courses[] }. An unknown location, day or category is rejected with an error message listing the valid values — it never silently falls through to an empty result.

get_course

{ courseId?: string } | { url?: string }

Fetches the live detail page for one course (by numeric id, or by its full URL) and returns address, date range, day/time, price, lesson counts, age range, availability, booking URL and the per-session calendar.

find_common_slots

{
  categories: { category: string, level?: "*" | "**" | "any" }[],
  location?: string,
  day?: string,
  limit?: number,
  offset?: number,
}

Returns only the centre/day combinations where every requested { category, level } has at least one matching course, with the concrete courses per requirement attached (groups[] on each match). This is what answers "book Žralok** + Delfín* at the same place" in one call — the same category can be requested twice at different levels (e.g. one child ready for Žralok**, a sibling still on Žralok*). Omit level (or pass "any") for no level restriction.

Returns { total, returned, offset, matches[] }, where total counts every match and matches is the requested slice — a broad request (one category, no location) matches most centre/day pairs, so pass limit unless you really want all of them.

Add it to Claude

The endpoint is https://<your-function-app-name>.azurewebsites.net/api/mcp?code=<key> — gated by an Azure Functions key rather than a login, since this is a read-only proxy over public listings with no per-user data (see Security & trust model).

If you're pointing this at an already-deployed instance, ask whoever deployed it for the URL (including the ?code= part) and skip to step 2. If you're deploying your own copy, see ARCHITECTURE.md first, then come back here.

  1. Get a function key, if you don't already have one. Create a dedicated named key rather than reusing the default/host master key, so it can be revoked independently later:

    az functionapp function keys set \
      --name <your-function-app-name> \
      --resource-group <your-resource-group> \
      --function-name mcp \
      --key-name claude-connector \
      --key-value "$(openssl rand -base64 32)"
    

    Or via the Portal: Function App → FunctionsmcpFunction Keys+ New function key.

  2. In Claude, go to Settings → Connectors → Add custom connector, and point it at the full URL above, including the ?code= query parameter.

  3. Try a prompt like "What Žralok courses are available on Friday in Devínska?" to confirm it's wired up.

Rotating or deleting the key immediately invalidates any URL using it — update the connector's URL in Claude after rotating.

Security & trust model

This server is a read-only proxy over public course listings, so there's nothing to protect behind a login — but that's not the same as nothing to think about:

  • A function key, not user authentication, gates the endpoint. It's a shared-secret gate against casual/automated abuse, not per-caller accounting or rate limiting. Anyone with the key can drive unlimited requests at plaveckaakademia.sk from the server's IP.
  • get_course's url input is validated, not just fetched — only an exactly-matching allowlisted host, https, and a course-detail-shaped path are accepted, so it can't be used as an open proxy for arbitrary URLs.
  • Upstream text is untrusted input to the calling model. Fields like address and venueName are scraped verbatim from the site and flow into the LLM's context — treat tool output as data, not instructions.

See ARCHITECTURE.md's Security & trust model for the full reasoning, including known limitations.

Contributing

See CONTRIBUTING.md for the development workflow, coding conventions, how to re-record fixtures when the site changes, and what a pull request is expected to include.

For how the server is built, how the site is scraped, and how it's deployed, see ARCHITECTURE.md. If you're working on this repo with Claude Code, CLAUDE.md carries the project context and the non-obvious site-scraping gotchas that are easy to reintroduce.

License

GNU General Public License v3.0 — see LICENSE.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选