roamer-x-mcp
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., "@roamer-x-mcpBook me a meeting room at the LIC tomorrow from 14:00 to 16:00."
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.
roamer-x-mcp
Early version: sign-in, search, booking and cancellation are verified on the ULB/VUB tenant.
Let your AI assistant book rooms for you through Roamer X, the app ULB and VUB use for the LIC building. Ask things like:
Book me a meeting room at the LIC tomorrow from 14:00 to 16:00. What have I booked this week? Cancel my Thursday booking.
roamer-x-mcp is an MCP server: a small program that AI apps (Claude Code,
Claude Desktop, Codex, Cursor…) launch in the background to get extra tools. It talks to the ICONICS IBSS API
behind Roamer X with your own session, and can only do what you can do in the app.
Made for the ULB/VUB tenant (uob, the default), but it should work with any IBSS tenant
(roamer-x-mcp login --tenant <name>).
Install
1. Install uv if you do not have it:
curl -LsSf https://astral.sh/uv/install.sh | sh (macOS / Linux), then open a new terminal.
2. Install roamer-x-mcp and sign in
uv tool install git+https://github.com/Nicolas-Prn/roamer-x-mcp
roamer-x-mcp loginlogin opens a browser window on the IBSS Hub where you sign in with your university account (Microsoft),
then offers to register the server in every AI app it finds: Claude Code, Claude Desktop, Codex, Cursor,
Gemini CLI, Windsurf and OpenClaw. Restart open desktop apps afterwards.
The session is kept in a dedicated browser profile under
~/.config/roamer-x-mcp/. The API token lasts about an hour; the server renews it in the background by reopening the Hub headless, and signs in again silently with Microsoft's "stay signed in" cookie when the Hub session has expired. Your password is never seen or stored. Runloginagain if Microsoft asks for your password or MFA.Browser: your installed Google Chrome, else a system Chromium (
/usr/bin/chromium, e.g. on a Raspberry Pi), else Playwright's (uvx playwright install chromium).Headless machine (server, Raspberry Pi):
loginneeds a window once. Run it over SSH with X forwarding (ssh -X host, with XQuartz on macOS) or from the machine's desktop session.
Other commands: roamer-x-mcp install [client…] / uninstall [client…] to (un)register the server,
roamer-x-mcp status to check the connection and see detected apps.
Related MCP server: DiSH MCP Server
Tools
Tool | What it does |
| Buildings, floors and searchable space types |
| Spaces free for a whole slot (type, floor, capacity), with their booking rules |
| Details and booking rules of one space |
| Your bookings over a period |
| Books a space in your name (checks the rules first) |
| Cancels one of your bookings |
| Checks the connection |
Development
uv sync
uv run pytest
uv run roamer-x-mcp statusHow the IBSS API works and which endpoints are used: see docs/api.md.
License
MIT
Available Tools
7 toolsbook_spaceA
Book a space for the user. date=YYYY-MM-DD, start/end=HH:MM (building local time).
name: booking title shown in Roamer X; defaults to the user's name.
Checks the space's booking policy first (duration, how far ahead). Confirm with the user before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| date | Yes | ||
| name | No | ||
| start | Yes | ||
| space_id | Yes | ||
| building_id | No | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, non-idempotent, openWorld). The description adds genuine context beyond that: a policy check must happen first and human confirmation is required before invoking. It stops short of describing failure behavior (e.g. what happens when the slot is taken or policy is violated).
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?
Format constraints are front-loaded in the first line, followed by the name/default note and the policy/confirmation rule. Every sentence has a purpose, though the fragmented line layout is slightly choppier than a single tight paragraph.
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?
For a non-idempotent, open-world mutation with no output schema and seven params, the description covers formats and preconditions but omits what a successful call returns (booking id?), how conflicts are handled, and what space_id/building_id mean. Adequate but with clear gaps.
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?
Schema coverage is 0%, so the description carries the burden, and it documents date, start, end formats and the name default. However space_id, building_id, and description — three of seven parameters — get no explanation anywhere, so it only partly compensates for the coverage gap.
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?
States a specific verb and resource ('Book a space') and supplies the date/time format up front, so an agent immediately knows what it does. It doesn't name siblings, but cancel_booking/list_my_bookings are obviously different operations, so differentiation is implicit rather than stated.
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?
Gives clear preconditions: check the space's booking policy (duration, how far ahead) and confirm with the user before calling. This is actionable when-to-use guidance, though it never names an alternative tool or a when-not-to-use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_bookingADestructiveIdempotent
Cancel one of the user's bookings (booking_id from list_my_bookings). Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| booking_id | Yes | ||
| building_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds a real behavioral requirement not in the annotations: user confirmation before execution. It does not say whether a cancellation can be undone or what happens to the slot afterwards.
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?
Two short sentences, front-loaded with the action and the parameter provenance, with no wasted wording. The confirmation instruction is tacked on but still earns its place.
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?
For a destructive, open-world mutation with no output schema, the definition covers the action and confirmation but leaves out the second parameter, post-cancellation outcome, and failure modes. Adequate to call correctly on the happy path, thin on consequences.
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?
Schema coverage is 0%, so the description is the only source of parameter meaning. It usefully explains where booking_id comes from, but building_id is left completely unexplained, so compensation for the coverage gap is only partial.
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?
States a specific verb and resource ('Cancel one of the user's bookings') and scopes it to the calling user, which cleanly separates it from book_space and list_my_bookings. An agent can identify the operation without opening the schema.
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?
Gives the precondition (get booking_id from list_my_bookings) and a mandatory pre-step ('Confirm with the user first'), so the calling sequence is clear. It stops short of stating when not to cancel or naming alternatives beyond the listing tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connection_statusARead-only
Check that the Roamer X connection works (signed in, token accepted by the API).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real value beyond them by unpacking what 'works' means ('signed in, token accepted by the API'), which tells the agent what failure conditions this surfaces. It does not describe the shape of a failed result, keeping it from a 5.
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?
One short sentence with the key qualifier (what 'works' means) placed immediately after the claim. No filler, no repetition of the tool name.
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?
With no parameters, no output schema and annotations covering read-only/open-world behavior, the definition is nearly complete for its complexity. The remaining gap is that it doesn't say what an agent receives on success versus failure (boolean, error, message), which matters for a pure diagnostic tool with no output schema.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly does not invent parameter discussion.
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?
States a specific verb ('check') and resource ('Roamer X connection') and parenthetically defines what a working connection means (signed in, token accepted by the API). That definition makes clear it is a diagnostic/health-check tool, implicitly distinct from the booking-oriented siblings. It stops short of naming a sibling, so 4 rather than 5.
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?
Use is only implied: an agent can infer this is a connectivity/auth pre-check, but the description never says when to call it (e.g. before other calls, on suspected auth failure) or what to do instead. No exclusions or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_spaceARead-only
Details and booking rules of one space (by its space id, e.g. "LIC.4.17").
| Name | Required | Description | Default |
|---|---|---|---|
| space_id | Yes | ||
| building_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds that the return includes booking rules, not just static attributes, which is genuinely useful context. It says nothing about behavior on unknown ids, the effect of building_id scoping, or data richness.
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?
A single front-loaded sentence with the resource, the scope constraint, and the id format example. No filler, and the example is placed where it is immediately usable.
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?
With no output schema and zero schema description coverage, the description carries most of the burden. Naming 'details and booking rules' gives the agent a sense of the payload, but the undocumented building_id and the absence of any error/not-found behavior leave real gaps for a two-parameter lookup tool.
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?
Schema coverage is 0%, so the description must compensate. It does well for space_id by giving the expected format and a concrete example ('LIC.4.17'), which the schema lacks entirely. The second parameter, building_id, is not mentioned at all, leaving its purpose (disambiguation? routing?) unexplained.
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?
States a specific verb+resource: retrieving details and booking rules for a single space, keyed by space id. The singular lookup is implicitly distinguished from list-style siblings like search_spaces and list_locations, but no sibling is named explicitly.
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 phrase 'one space (by its space id)' implies this is the by-id detail lookup rather than a search, so the agent can infer usage. However, there is no explicit when-to-use vs search_spaces, and no mention of prerequisites (e.g., whether the id must come from search_spaces first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_locationsARead-only
List buildings and their floors (ids, names, time zone) and the space types you can search for.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, and the description adds valuable detail about the returned entities: buildings, floors, ids, names, time zone, and space types. It does not cover scoping or pagination, but for a no-parameter list tool this is reasonably transparent.
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 a single efficient sentence with no wasted words. The key return contents are front-loaded and easy to parse.
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?
For a simple read-only list tool with no parameters and no output schema, the description gives enough information about what is returned. It could more fully specify the shape of space types or the relationship to search_spaces, but it is largely complete.
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 tool has zero parameters, so parameter semantics are not applicable. The baseline score for a parameterless tool is 4.
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 provides a clear verb and resource: it lists buildings, floors, and searchable space types. It does not explicitly distinguish itself from sibling tools like search_spaces or get_space, so it falls short of a 5.
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 phrase 'space types you can search for' implies this is useful before searching, but it does not explicitly state when to use this tool versus search_spaces or get_space. Usage is only indirectly signaled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_bookingsBRead-only
List the user's bookings from from_date (YYYY-MM-DD, default today) over days days.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| from_date | No | ||
| building_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds useful default behavior (from_date defaults to today) and the idea of a forward-looking window, but says nothing about result volume, ordering, or how building_id affects behavior.
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?
One sentence, no filler, with the format and default for the key parameter front-loaded. Slightly awkward phrasing ('from from_date ... over `days` days') costs a point but nothing is wasted.
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?
For a simple read-only listing tool with no output schema, the core invocation semantics are present. The omission of building_id's filter effect is the main gap an agent would hit in practice.
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?
Schema description coverage is 0%, so the description must carry parameter meaning — it does explain from_date's YYYY-MM-DD format and today default, and gestures at `days`. However, the third parameter building_id is never mentioned and 'over `days` days' is ambiguous about whether it is a window length or a count.
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?
States a specific verb and resource ('List the user's bookings') and scopes it to the caller's own bookings, which separates it from search_spaces/list_locations. It does not mention cancel_booking or book_space, but the read-only listing intent 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?
No guidance on when to use this versus siblings such as search_spaces, or when to prefer a wider date window. The only implicit cue is 'the user's bookings', which signals personal scope but gives no exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_spacesARead-only
Find spaces free for the whole slot. date=YYYY-MM-DD, start/end=HH:MM (building local time).
space_type: "Desk" (study seats), "MeetingRoom", "Boardroom", "LectureTheatre"... (see list_locations).
floor: floor number ("-1", "4"), name or id. Returns space ids to pass to book_space, with booking rules.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ||
| date | Yes | ||
| floor | No | ||
| limit | No | ||
| start | Yes | ||
| space_type | No | Desk | |
| building_id | No | ||
| min_capacity | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag readOnly and openWorld, so the description is free to add the useful parts: results include booking rules and space ids meant for book_space. It doesn't mention result caps (limit default 40) or what happens when nothing is free, which would have completed the picture.
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?
Front-loads the core purpose, then formats and enum hints in a compact block. Slightly telegraphic and the trailing newline is wasted, but there is no filler.
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?
No output schema and eight parameters, four of which the description explains. Missing guidance on limit, building_id, and min_capacity, plus no indication of result shape or empty-result behavior, leaves real gaps for a multi-parameter search tool.
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?
Schema coverage is 0%, so the description must carry parameter meaning. It does well for date/start/end formats, space_type values, and floor formats, but says nothing about limit, building_id, or min_capacity, leaving three of eight parameters undocumented anywhere.
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?
States a specific verb and resource with a scope qualifier ('free for the whole slot') that separates it from get_space and list_locations. The closing line tying output to book_space makes the tool's role in the workflow unmistakable.
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?
Points to list_locations for the space_type list and says results feed book_space, which routes the agent through the booking workflow. It stops short of explicit 'use X instead when...' exclusions against get_space or list_my_bookings, but the practical context is clear.
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.
7 tool updates
v0.1.0- First observed
book_space - First observed
cancel_booking - First observed
connection_status - First observed
get_space - First observed
list_locations - First observed
list_my_bookings - First observed
search_spaces
TDQS
Scored across 7 tools
Each tool has a clearly distinct role: list_locations provides building/floor metadata, get_space retrieves one space's details, search_spaces finds available spaces, and the booking tools handle create/list/cancel. connection_status is also clearly separate. There is no meaningful overlap that would cause misselection.
Most tools follow a consistent snake_case verb_noun pattern (list_locations, get_space, search_spaces, list_my_bookings, book_space, cancel_booking). The only minor deviation is connection_status, which is noun-first rather than verb-first, but the overall convention remains predictable.
Seven tools are well-scoped for a space-booking server, covering discovery, availability search, booking management, and connection validation without bloat. Each tool earns its place in the workflow.
The core booking lifecycle is covered: discover locations, inspect spaces, search availability, book, list bookings, and cancel. A notable minor gap is updating or rescheduling an existing booking, though agents can work around this by cancelling and rebooking.
Maintenance
Related MCP Connectors
Run hotels, apartments, job offers and real-estate listings in MyBooking.ai from your AI assistant.
- FitnitoOAuthcom.fitnito
Schedule, members, and bookings in your AI tools
Manage your Twitch raid-train schedule from an AI assistant: claim, release & trade slots via OAuth.
Read and update your Everway trips and itineraries from any MCP-compatible AI assistant.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables Claude to search for available meeting rooms, check reservation status, and create room bookings through an integrated SSO-authenticated meeting room system. Supports natural language queries for room availability by date, time, floor, and duration requirements.-
- FlicenseAqualityDmaintenanceEnables interaction with the DiSH room booking platform to search availability, create bookings, and manage reservations. It allows AI assistants to handle meeting room logistics directly through natural language commands.3-
- FlicenseBqualityDmaintenanceEnables natural language booking and management of rooms in Nexudus coworking spaces, including listing rooms, checking availability, booking, viewing/cancelling bookings, and schedules.6-
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to browse, search, and book meeting rooms across multiple buildings with realistic seed data and conflict detection.-