io.github.RichieB2B/onlineafspraken-slots
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@io.github.RichieB2B/onlineafspraken-slotsShow available times for this OnlineAfspraken widget: https://example.onlineafspraken.nl/agenda"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
OnlineAfspraken slots MCP
Read available slots from a public OnlineAfspraken widget URL without an account. This local MCP server reads availability only; it cannot make a booking.
Get started
You need Python 3.10 or newer and an MCP client. The commands below use a Unix shell (macOS or Linux).
Download or clone this repository.
In its directory, install the package and its dependencies:
sh setup.shRegister the server with your MCP client using one of the examples below. Replace
/absolute/path/to/onlineafspraken-slots-mcpwith the full path to your downloaded copy.Start a new chat and provide a public OnlineAfspraken widget URL. For example: “Show today's available times for this widget: [paste the full widget URL here].”
You can also pass the URL of a public booking page that embeds one OnlineAfspraken widget. If the page has several widgets, use the direct URL of the one you want.
Related MCP server: Outsite Availability MCP
Connect your MCP client
Codex
codex mcp add onlineafspraken-slots -- /absolute/path/to/onlineafspraken-slots-mcp/run.sh
codex mcp listClaude Code
claude mcp add --scope user --transport stdio onlineafspraken-slots -- /absolute/path/to/onlineafspraken-slots-mcp/run.sh
claude mcp listThe user scope makes the server available in all your Claude Code projects. See the Claude Code MCP documentation for other scopes.
Claude Desktop
Add this entry under mcpServers in your Claude Desktop configuration, then
restart Claude Desktop:
{
"mcpServers": {
"onlineafspraken-slots": {
"command": "/absolute/path/to/onlineafspraken-slots-mcp/run.sh"
}
}
}If you already have an mcpServers object, add just the
onlineafspraken-slots entry to it. The Claude Desktop local server
guide
explains where to manage local servers and check their connection status.
OpenCode
opencode mcp add onlineafspraken-slots --global -- /absolute/path/to/onlineafspraken-slots-mcp/run.sh
opencode mcp listThe global option makes the server available in every OpenCode project. See the OpenCode MCP documentation for project-specific configuration.
After the first PyPI release, clients that support a package runner can launch
the onlineafspraken-slots-mcp command from that package instead of using a
local checkout.
Tool inputs
The server exposes get_available_slots:
Input | Required | Meaning |
| Yes | Full HTTPS URL of a public OnlineAfspraken widget or a page that embeds it. |
| No | Date in |
| No | Part of an appointment type name to filter the results. |
Results include the appointment type names, available start times, date,
timezone, and the time the availability was checked. The room input is named
for the original use case; it works with any appointment type.
Limitations
The server uses the widget's public, undocumented read endpoint. A provider change may require an update. A booking page must expose its widget URL in a script, iframe, or link for automatic discovery. Available slots can change between lookup and booking.
License
Publishing a release
For maintainers: keep the version in pyproject.toml and server.json in
sync. To publish the first release, configure a pending PyPI trusted
publisher
with these values:
PyPI field | Value |
PyPI project name |
|
Owner |
|
Repository |
|
Workflow |
|
Environment |
|
Then publish a GitHub release tagged v0.1.0. The
release workflow builds and checks the
distributions, uploads them to PyPI through trusted publishing, and publishes
the matching version to the official MCP Registry through GitHub OIDC.
The official MCP Registry guide
explains the publishing process. The registry checks the mcp-name marker
above against the README included in the PyPI release.
Available Tools
1 toolget_available_slotsA
Get public OnlineAfspraken slots for a booking page and ISO date.
booking_page may be a page embedding one OnlineAfspraken widget or the widget URL itself. Omit date_iso for today in Europe/Amsterdam. Optionally filter by part of an appointment type name. This tool never books.
| Name | Required | Description | Default |
|---|---|---|---|
| room | No | ||
| date_iso | No | ||
| booking_page | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states 'This tool never books,' clearly signaling a read-only, non-destructive operation. It also mentions the default date behavior, which is a behavioral detail. However, it doesn't discuss potential side effects, rate limits, or error handling, but for a simple getter this is sufficient context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It opens with the core purpose, then provides parameter-specific guidance, and ends with a clear behavioral note. Each sentence adds value without redundancy. The front-loading of the main action and the use of short, clear sentences make it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 parameters, no nested objects, no output schema), the description covers the essential information: purpose, parameter usage, and a key behavioral trait (non-booking). It does not describe the return format, but the tool name implies it returns available slots. For a straightforward read operation, this is adequate, though a note about the response shape would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero description coverage, so the description must explain the parameters. It explains 'booking_page' thoroughly (page or widget URL), explains 'date_iso' usage ('Omit date_iso for today'), and hints at a filter ('Optionally filter by part of an appointment type name'). However, it does not explicitly map this filter to the 'room' parameter, leaving ambiguity about which parameter is used for filtering. The description adds meaning beyond the schema but is not fully explicit about all parameter roles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get public OnlineAfspraken slots for a booking page and ISO date.' It specifies the resource (public slots), the action (get), and the required context (booking page and date). It also mentions an optional filter, giving a complete picture of the tool's purpose. Since there are no sibling tools, no differentiation is needed, but the description is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete usage instructions: how to specify the booking_page (page embedding a widget or the widget URL itself), how to handle the date ('Omit date_iso for today in Europe/Amsterdam'), and the optional filter by appointment type name. It also explicitly states 'This tool never books,' which is a clear exclusion that guides the agent on when not to use it (for booking actions). While it doesn't list alternatives, the absence of siblings makes this acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.0- First observed
get_available_slots
Related MCP Connectors
Find available slots and manage bookings, users, and forms in the SuperSaaS scheduling service
Read appointments, types, calendars and availability; create, cancel or reschedule bookings.
WhatsApp® reminders and rescheduling for Calendly. Public read-only MCP endpoint.
- InfrapageOAuthpage.infra
Read-only access to your Infrapage dashboards: pages, widgets, live values, weekly recaps.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables reading Proton Calendar events via a secret ICS share link, with tools to list, search, and get event details.-
- AlicenseNot gradedqualityBmaintenanceEnables read-only research of public Outsite locations, quoted stay rates, and individual room calendars.MIT
- AlicenseAqualityAmaintenanceEnables read-only access to SimplePractice Client Portal data — appointments, billing, documents, and announcements — via the portal's JSON:API, using passwordless portal sign-in.15949 npmMIT
- AlicenseAqualityCmaintenanceEnables searching the public Dutch AGB-register for healthcare providers, practices and locations by AGB-code, name, zorgsoort, place or postcode, and retrieving full registrations with their kwalificaties, erkenningen and relations. Runs live against the register with no API key or account, and also looks up zorgsoort and kwalificatie codes offline.41MIT