yarooms-mcp 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,40 +2,57 @@
2
2
 
3
3
  MCP server for the [YAROOMS](https://www.yarooms.com) workplace management platform. Enables AI agents (Claude, ChatGPT, Copilot, etc.) to search rooms, book spaces, manage visitors, and set work status through the Model Context Protocol.
4
4
 
5
- ## Setup
5
+ ## Quick Start
6
+
7
+ ### Claude Code
6
8
 
7
9
  ```bash
8
- npm install
10
+ claude mcp add --transport http yarooms https://mcp.yarooms.com/mcp
9
11
  ```
10
12
 
11
- ### Environment Variables
13
+ Authenticate via `/mcp` when prompted — uses OAuth with your YAROOMS account.
14
+
15
+ ### Claude Desktop / npx (local stdio)
16
+
17
+ ```json
18
+ {
19
+ "mcpServers": {
20
+ "yarooms": {
21
+ "command": "npx",
22
+ "args": ["-y", "yarooms-mcp"],
23
+ "env": {
24
+ "YAROOMS_API_TOKEN": "your-api-token",
25
+ "YAROOMS_BASE_URL": "https://your-tenant.yarooms.com/api"
26
+ }
27
+ }
28
+ }
29
+ }
30
+ ```
12
31
 
13
- Create a `.env` file (see `.env.example`):
32
+ ## Running Modes
14
33
 
15
- ```
16
- YAROOMS_API_TOKEN=your-api-token
17
- YAROOMS_BASE_URL=https://your-tenant.yarooms.com/api
18
- ```
34
+ ### Remote HTTP (OAuth)
19
35
 
20
- ## Usage
36
+ The hosted server at `mcp.yarooms.com` uses OAuth via `id.yarooms.com`. Each user authenticates with their own YAROOMS account — no shared tokens.
21
37
 
22
- ### Local (stdio)
38
+ To self-host in OAuth mode, set only `YAROOMS_OAUTH_URL`:
23
39
 
24
40
  ```bash
25
- npm run stdio
41
+ YAROOMS_OAUTH_URL=https://id.yarooms.com npm start
26
42
  ```
27
43
 
28
- ### Smithery Dev Mode
44
+ ### Remote HTTP (legacy single-tenant)
45
+
46
+ For a single-tenant deployment with a shared API token:
29
47
 
30
48
  ```bash
31
- npm run dev
49
+ YAROOMS_API_TOKEN=your-token YAROOMS_BASE_URL=https://your-tenant.yarooms.com/api npm start
32
50
  ```
33
51
 
34
- ### Smithery Production
52
+ ### Local stdio
35
53
 
36
54
  ```bash
37
- npm run build
38
- npm start
55
+ YAROOMS_API_TOKEN=your-token YAROOMS_BASE_URL=https://your-tenant.yarooms.com/api npm run stdio
39
56
  ```
40
57
 
41
58
  ## Tools
@@ -43,17 +60,31 @@ npm start
43
60
  | Tool | Description |
44
61
  |------|-------------|
45
62
  | `search_available_spaces` | Search for available rooms/desks on a floor |
46
- | `create_booking` | Book a room or desk |
63
+ | `create_booking` | Book a room or desk — supports daily/weekly/monthly/custom recurrence, incognito (private) bookings, and booking on behalf of another user |
47
64
  | `get_my_bookings` | View your bookings |
48
65
  | `cancel_booking` | Cancel a booking |
49
- | `modify_booking` | Change booking time, space, or title |
66
+ | `modify_booking` | Change a booking's time, space, title, or owner (reassign). Multi-date bookings accept non-date edits only |
50
67
  | `check_in_booking` | Check in to a booking |
51
68
  | `check_out_booking` | Check out of a booking |
69
+ | `get_all_bookings` | List bookings across the organization — filter by single date, date range (startDate/endDate), "when" shortcut (today/tomorrow/only_future), location, space, booker, title, status, or updatedSince timestamp (access scoped by Bookings: View) |
70
+ | `get_occupancy_analytics` | Organization-wide occupancy and utilization stats for a date range (requires Analytics: Utilization) |
71
+ | `get_hybrid_work_analytics` | In-office / WFH / OOO breakdown per location, with compliance percentages (requires Analytics: Hybrid Work) |
72
+ | `list_accounts` | Paginated list of user accounts — server-side filters for search, location, team, role, activation, suspension, 2FA, provisioning source (requires Workplace: Manage users) |
52
73
  | `get_locations` | List office locations |
53
74
  | `get_floors` | List floors for a location |
54
75
  | `get_floor_info` | Get floor details and spaces |
55
76
  | `get_room_schedule` | View room booking timeline |
56
77
  | `get_space_types` | List space types (Desk, Meeting Room, etc.) |
78
+ | `list_space_groups` | List space groups with their booking rules (strategies, slots, granularity, check-in, incognito/recurrence policy) |
79
+ | `get_space` | Get full metadata for a single space (location, floor, type, group, features, capacity, assigned user, check-in policy, position) |
80
+ | `list_spaces` | Paginated list of spaces — filter by name, location, floor, type, group, assigned user, features, or workspace-ness |
81
+ | `create_space` | Create a desk/room/parking (requires Workplace: Manage) |
82
+ | `update_space` | Partial update of any space field; features=[] clears, assignedToAccountId=0/null unassigns |
83
+ | `delete_space` | Delete a space (requires Workplace: Delete) |
84
+ | `list_maintenance` | List scheduled maintenance windows — filter by location, floor, space group, space, name, or date range (requires Workplace: Maintenance) |
85
+ | `create_maintenance` | Schedule a maintenance window blocking bookings on one or more locations, optionally narrowed to a floor/space group/space |
86
+ | `update_maintenance` | Partially update an existing maintenance window (name, dates, locations, scope) |
87
+ | `delete_maintenance` | Delete a maintenance window, making affected spaces bookable again |
57
88
  | `get_location_schedule` | Get operating hours for a location |
58
89
  | `get_booking_options` | Get valid booking intervals for a space (resolves booking strategy) |
59
90
  | `get_work_status` | View work status (WFH, office, etc.) |
@@ -61,13 +92,13 @@ npm start
61
92
  | `register_visitor` | Register a visitor |
62
93
  | `list_visitors` | List visitors for a date/location |
63
94
  | `cancel_visitor` | Cancel a visitor registration |
64
- | `get_all_bookings` | List all bookings (admin) — filter by date, location, space, booker, title, status |
65
95
  | `get_pending_approvals` | List booking requests pending your approval |
66
96
  | `approve_booking` | Approve pending booking requests |
67
97
  | `reject_booking` | Reject pending booking requests with optional reason |
68
98
  | `search_people` | Search for people by name or email |
69
99
  | `get_my_profile` | Get your profile — name, email, team, location |
70
100
  | `get_teammates` | List members of your team |
101
+ | `list_teams` | List all teams (user groups) in the organization with role tier, member count, managers, and suspension state (requires Workplace: Manage users) |
71
102
  | `get_teammate_status` | View a teammate's work status |
72
103
  | `get_teammate_bookings` | View a teammate's bookings for a date |
73
104
 
@@ -77,12 +108,29 @@ npm start
77
108
  |----------|-----|-------------|
78
109
  | Work Status Options | `yarooms://work-status-options` | Available status options with IDs |
79
110
 
80
- ## Testing
111
+ ## Environment Variables
81
112
 
82
- ```bash
83
- # Unit tests
84
- npm test
113
+ | Variable | Required | Description |
114
+ |----------|----------|-------------|
115
+ | `YAROOMS_API_TOKEN` | Legacy mode | API token (enables legacy X-Token auth) |
116
+ | `YAROOMS_BASE_URL` | Legacy mode | Tenant API URL (e.g. `https://your-tenant.yarooms.com/api`) |
117
+ | `YAROOMS_OAUTH_URL` | OAuth mode | Auth server URL (default: `https://id.yarooms.com`) |
118
+ | `PORT` | No | HTTP server port (default: `3000`) |
119
+ | `MCP_ACCESS_LOG` | No | Structured access log for `/mcp` requests (default: `true`; set to `false` to disable) |
85
120
 
86
- # Integration tests (requires API credentials)
87
- RUN_INTEGRATION=true npm test
121
+ If `YAROOMS_API_TOKEN` is set, the server runs in **legacy mode** (single shared token). If omitted, it runs in **OAuth mode** (per-user authentication via wrapper JWTs from the auth server).
122
+
123
+ ## Development
124
+
125
+ ```bash
126
+ npm install
127
+ npm test # unit tests
128
+ npm run serve # HTTP server (dev, uses tsx)
129
+ npm run stdio # stdio transport (dev)
130
+ npm run build # compile TypeScript
131
+ RUN_INTEGRATION=true npm test # integration tests (requires API credentials)
88
132
  ```
133
+
134
+ ## License
135
+
136
+ MIT
package/dist/client.js CHANGED
@@ -64,14 +64,17 @@ export class YaroomsClient {
64
64
  catch {
65
65
  throw new YaroomsApiError(`YAROOMS API ${method} ${path} returned non-JSON response (${res.status}). The server may be down for maintenance.`, res.status);
66
66
  }
67
- // Dual envelope handling:
68
- // GET responses: {status: 1, data: <payload>} return <payload>
69
- // Error responses: {status: 0, error: "..."} throw
70
- // Mutation responses: {success: 1, message: "..."} → return as-is
71
- if ('status' in json && json.status === 0) {
67
+ // YAROOMS envelope shapes we've observed:
68
+ // Error: {status: 0, error|message: "..."} throw
69
+ // GET success: {status: 1, data: <payload>} return <payload>
70
+ // Mutation: {status: 1, message: "..."} or {success: 1, ...} → return whole object
71
+ // Partial: {status: 1} with no data key → return whole object
72
+ // Only unwrap `data` when it's paired with an explicit success status, so a malformed response
73
+ // like {status: 0, data: null} can't silently surface null as a successful payload.
74
+ if (json.status === 0) {
72
75
  throw new YaroomsApiError(json.error || json.message || 'Unknown API error');
73
76
  }
74
- if ('data' in json)
77
+ if (json.status === 1 && 'data' in json)
75
78
  return json.data;
76
79
  return json;
77
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function normalizeApiBaseUrl(baseUrl: string): string;
@@ -0,0 +1,5 @@
1
+ export function normalizeApiBaseUrl(baseUrl) {
2
+ const normalized = baseUrl.replace(/\/+$/, '');
3
+ return normalized.endsWith('/api') ? normalized : `${normalized}/api`;
4
+ }
5
+ //# sourceMappingURL=http-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-utils.js","sourceRoot":"","sources":["../src/http-utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,MAAM,CAAC;AACxE,CAAC"}