ioffice-mcp 1.1.0 → 1.2.0
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/.claude-plugin/marketplace.json +42 -0
- package/.claude-plugin/plugin.json +24 -0
- package/.mcp.json +14 -0
- package/SKILL.md +201 -0
- package/dist/bundle.js +22081 -0
- package/dist/client.js +9 -3
- package/package.json +8 -3
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
|
3
|
+
"name": "ioffice-mcp",
|
|
4
|
+
"owner": {
|
|
5
|
+
"name": "Chris Hall",
|
|
6
|
+
"email": "chris.c.hall@gmail.com"
|
|
7
|
+
},
|
|
8
|
+
"metadata": {
|
|
9
|
+
"description": "MCP server for iOffice — natural-language workspace and facility management via the iOffice API",
|
|
10
|
+
"version": "1.1.0"
|
|
11
|
+
},
|
|
12
|
+
"plugins": [
|
|
13
|
+
{
|
|
14
|
+
"name": "ioffice-mcp",
|
|
15
|
+
"source": {
|
|
16
|
+
"source": "npm",
|
|
17
|
+
"package": "ioffice-mcp",
|
|
18
|
+
"version": "1.1.0"
|
|
19
|
+
},
|
|
20
|
+
"description": "MCP server for iOffice — manage buildings, spaces, reservations, visitors, and more via natural language",
|
|
21
|
+
"version": "1.1.0",
|
|
22
|
+
"author": {
|
|
23
|
+
"name": "Chris Hall"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/chrischall/ioffice-mcp",
|
|
26
|
+
"repository": "https://github.com/chrischall/ioffice-mcp",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"keywords": ["ioffice", "workspace", "facility-management", "mcp"],
|
|
29
|
+
"category": "productivity",
|
|
30
|
+
"mcpServers": {
|
|
31
|
+
"ioffice": {
|
|
32
|
+
"command": "npx",
|
|
33
|
+
"args": ["ioffice-mcp"],
|
|
34
|
+
"env": {
|
|
35
|
+
"IOFFICE_HOST": "${IOFFICE_HOST}",
|
|
36
|
+
"IOFFICE_TOKEN": "${IOFFICE_TOKEN}"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ioffice-mcp",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "MCP server for iOffice — natural-language workspace and facility management via the iOffice API",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Chris Hall",
|
|
7
|
+
"email": "chris.c.hall@gmail.com"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/chrischall/ioffice-mcp",
|
|
10
|
+
"repository": "https://github.com/chrischall/ioffice-mcp",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": ["ioffice", "workspace", "facility-management", "mcp"],
|
|
13
|
+
"skills": "./SKILL.md",
|
|
14
|
+
"mcpServers": {
|
|
15
|
+
"ioffice": {
|
|
16
|
+
"command": "npx",
|
|
17
|
+
"args": ["ioffice-mcp"],
|
|
18
|
+
"env": {
|
|
19
|
+
"IOFFICE_HOST": "${IOFFICE_HOST}",
|
|
20
|
+
"IOFFICE_TOKEN": "${IOFFICE_TOKEN}"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
package/.mcp.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"ioffice": {
|
|
4
|
+
"command": "node",
|
|
5
|
+
"args": ["dist/index.js"],
|
|
6
|
+
"env": {
|
|
7
|
+
"IOFFICE_HOST": "${IOFFICE_HOST}",
|
|
8
|
+
"IOFFICE_TOKEN": "${IOFFICE_TOKEN}",
|
|
9
|
+
"IOFFICE_USERNAME": "${IOFFICE_USERNAME}",
|
|
10
|
+
"IOFFICE_PASSWORD": "${IOFFICE_PASSWORD}"
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
package/SKILL.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ioffice-mcp
|
|
3
|
+
description: Access iOffice workspace and facility data via MCP. Use when the user asks about iOffice buildings, floors, spaces, reservations, visitors, maintenance requests, moves, or mail. Triggers on phrases like "book a room in iOffice", "check who's visiting today", "file a maintenance request", "log a package", "schedule a move", or any request involving workplace management in iOffice. Requires ioffice-mcp installed and the ioffice server registered (see Setup below).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ioffice-mcp
|
|
7
|
+
|
|
8
|
+
MCP server for iOffice — natural-language workspace and facility management via the iOffice API.
|
|
9
|
+
|
|
10
|
+
- **npm:** [npmjs.com/package/ioffice-mcp](https://www.npmjs.com/package/ioffice-mcp)
|
|
11
|
+
- **Source:** [github.com/chrischall/ioffice-mcp](https://github.com/chrischall/ioffice-mcp)
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
### Option A — npx (recommended)
|
|
16
|
+
|
|
17
|
+
Add to `.mcp.json` in your project or `~/.claude/mcp.json`:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"mcpServers": {
|
|
22
|
+
"ioffice": {
|
|
23
|
+
"command": "npx",
|
|
24
|
+
"args": ["-y", "ioffice-mcp"],
|
|
25
|
+
"env": {
|
|
26
|
+
"IOFFICE_HOST": "your-tenant.ioffice.com",
|
|
27
|
+
"IOFFICE_TOKEN": "your-token-here"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Option B — from source
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
git clone https://github.com/chrischall/ioffice-mcp
|
|
38
|
+
cd ioffice-mcp
|
|
39
|
+
npm install && npm run build
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Then add to `.mcp.json`:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"mcpServers": {
|
|
47
|
+
"ioffice": {
|
|
48
|
+
"command": "node",
|
|
49
|
+
"args": ["/path/to/ioffice-mcp/dist/index.js"],
|
|
50
|
+
"env": {
|
|
51
|
+
"IOFFICE_HOST": "your-tenant.ioffice.com",
|
|
52
|
+
"IOFFICE_TOKEN": "your-token-here"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Or use a `.env` file in the project directory with `IOFFICE_HOST` and `IOFFICE_TOKEN`.
|
|
60
|
+
|
|
61
|
+
## Authentication
|
|
62
|
+
|
|
63
|
+
Token auth (preferred) — set `IOFFICE_TOKEN`. Alternatively, set `IOFFICE_USERNAME` + `IOFFICE_PASSWORD`. If both are present, the token takes precedence.
|
|
64
|
+
|
|
65
|
+
## Tools
|
|
66
|
+
|
|
67
|
+
### Buildings
|
|
68
|
+
| Tool | Description |
|
|
69
|
+
|------|-------------|
|
|
70
|
+
| `io_list_buildings` | List buildings with optional search, pagination, and sorting |
|
|
71
|
+
| `io_get_building(id)` | Get a single building by ID |
|
|
72
|
+
| `io_create_building(name, address1?, city?, ...)` | Create a new building |
|
|
73
|
+
| `io_update_building(id, ...)` | Update a building — only provide fields to change |
|
|
74
|
+
| `io_delete_building(id)` | Delete a building |
|
|
75
|
+
|
|
76
|
+
### Floors
|
|
77
|
+
| Tool | Description |
|
|
78
|
+
|------|-------------|
|
|
79
|
+
| `io_list_floors(buildingId?)` | List floors, optionally filtered by building |
|
|
80
|
+
| `io_get_floor(id)` | Get a single floor by ID |
|
|
81
|
+
| `io_create_floor(name, buildingId, ...)` | Create a floor within a building |
|
|
82
|
+
| `io_update_floor(id, ...)` | Update a floor |
|
|
83
|
+
| `io_delete_floor(id)` | Delete a floor |
|
|
84
|
+
|
|
85
|
+
### Spaces
|
|
86
|
+
| Tool | Description |
|
|
87
|
+
|------|-------------|
|
|
88
|
+
| `io_list_spaces(floorId?)` | List spaces/rooms, optionally filtered by floor |
|
|
89
|
+
| `io_get_space(id)` | Get a single space by ID |
|
|
90
|
+
| `io_create_space(name, floorId, capacity?, ...)` | Create a space on a floor |
|
|
91
|
+
| `io_update_space(id, ...)` | Update a space |
|
|
92
|
+
| `io_delete_space(id)` | Delete a space |
|
|
93
|
+
|
|
94
|
+
### Users
|
|
95
|
+
| Tool | Description |
|
|
96
|
+
|------|-------------|
|
|
97
|
+
| `io_list_users(search?)` | List users with optional search |
|
|
98
|
+
| `io_get_user(id)` | Get a single user by ID |
|
|
99
|
+
| `io_create_user(firstName, lastName, email, ...)` | Create a new user |
|
|
100
|
+
| `io_update_user(id, ...)` | Update a user |
|
|
101
|
+
| `io_delete_user(id)` | Delete a user |
|
|
102
|
+
|
|
103
|
+
### Reservations
|
|
104
|
+
| Tool | Description |
|
|
105
|
+
|------|-------------|
|
|
106
|
+
| `io_list_reservations(spaceId?, userId?, startDate?, endDate?)` | List reservations with optional filters |
|
|
107
|
+
| `io_get_reservation(id)` | Get a single reservation by ID |
|
|
108
|
+
| `io_create_reservation(title, spaceId, startDate, endDate, ...)` | Reserve a space |
|
|
109
|
+
| `io_update_reservation(id, ...)` | Update a reservation |
|
|
110
|
+
| `io_delete_reservation(id)` | Cancel/delete a reservation |
|
|
111
|
+
| `io_checkin_reservation(id)` | Check in to a reservation, confirming room usage |
|
|
112
|
+
| `io_checkout_reservation(id)` | Check out early, releasing the room |
|
|
113
|
+
|
|
114
|
+
### Visitors
|
|
115
|
+
| Tool | Description |
|
|
116
|
+
|------|-------------|
|
|
117
|
+
| `io_list_visitors(buildingId?, startDate?, endDate?)` | List visitors with optional filters |
|
|
118
|
+
| `io_get_visitor(id)` | Get a single visitor record by ID |
|
|
119
|
+
| `io_create_visitor(firstName, lastName, hostId?, expectedArrival?, ...)` | Pre-register a visitor |
|
|
120
|
+
| `io_update_visitor(id, ...)` | Update a visitor record |
|
|
121
|
+
| `io_checkin_visitor(id)` | Check in a visitor upon arrival |
|
|
122
|
+
| `io_checkout_visitor(id)` | Check out a visitor upon departure |
|
|
123
|
+
|
|
124
|
+
### Maintenance Requests
|
|
125
|
+
| Tool | Description |
|
|
126
|
+
|------|-------------|
|
|
127
|
+
| `io_list_maintenance_requests(status?, spaceId?, buildingId?)` | List maintenance requests |
|
|
128
|
+
| `io_get_maintenance_request(id)` | Get a single maintenance request |
|
|
129
|
+
| `io_create_maintenance_request(title, spaceId?, buildingId?, ...)` | File a new maintenance request |
|
|
130
|
+
| `io_update_maintenance_request(id, ...)` | Update a maintenance request |
|
|
131
|
+
| `io_accept_maintenance_request(id)` | Accept a pending request (pending → accepted) |
|
|
132
|
+
| `io_start_maintenance_request(id)` | Start work (accepted → in-progress) |
|
|
133
|
+
| `io_complete_maintenance_request(id, resolution?)` | Mark as complete |
|
|
134
|
+
| `io_archive_maintenance_request(id)` | Archive a completed request |
|
|
135
|
+
|
|
136
|
+
### Moves
|
|
137
|
+
| Tool | Description |
|
|
138
|
+
|------|-------------|
|
|
139
|
+
| `io_list_moves(status?, buildingId?)` | List move requests |
|
|
140
|
+
| `io_get_move(id)` | Get a single move request |
|
|
141
|
+
| `io_create_move(name, fromSpaceId?, toSpaceId?, scheduledDate?, ...)` | Create a move request |
|
|
142
|
+
| `io_update_move(id, ...)` | Update a move request |
|
|
143
|
+
| `io_approve_move(id, notes?)` | Approve a move request |
|
|
144
|
+
| `io_cancel_move(id, reason?)` | Cancel a move request |
|
|
145
|
+
|
|
146
|
+
### Mail
|
|
147
|
+
| Tool | Description |
|
|
148
|
+
|------|-------------|
|
|
149
|
+
| `io_list_mail(status?, recipientId?, buildingId?)` | List mail items (packages and letters) |
|
|
150
|
+
| `io_get_mail(id)` | Get a single mail item |
|
|
151
|
+
| `io_create_mail(recipientId, buildingId, carrier?, trackingNumber?, ...)` | Log a received mail item |
|
|
152
|
+
| `io_deliver_mail(id, deliveredDate?, signature?)` | Mark a mail item as delivered |
|
|
153
|
+
| `io_return_mail(id, reason?)` | Mark a mail item as returned to sender |
|
|
154
|
+
|
|
155
|
+
## Workflows
|
|
156
|
+
|
|
157
|
+
**Book a meeting room:**
|
|
158
|
+
```
|
|
159
|
+
io_list_buildings → find building ID
|
|
160
|
+
io_list_floors(buildingId) → find floor ID
|
|
161
|
+
io_list_spaces(floorId) → pick a room
|
|
162
|
+
io_create_reservation(title, spaceId, startDate, endDate)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**Pre-register a visitor:**
|
|
166
|
+
```
|
|
167
|
+
io_list_users(search: "host name") → find hostId
|
|
168
|
+
io_create_visitor(firstName, lastName, hostId, buildingId, expectedArrival)
|
|
169
|
+
io_checkin_visitor(id) → when they arrive
|
|
170
|
+
io_checkout_visitor(id) → when they leave
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**File and resolve a maintenance request:**
|
|
174
|
+
```
|
|
175
|
+
io_list_spaces(search: "room name") → find spaceId
|
|
176
|
+
io_create_maintenance_request(title, spaceId, buildingId)
|
|
177
|
+
io_accept_maintenance_request(id)
|
|
178
|
+
io_start_maintenance_request(id)
|
|
179
|
+
io_complete_maintenance_request(id, resolution: "Fixed the issue")
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**Log and deliver a package:**
|
|
183
|
+
```
|
|
184
|
+
io_list_users(search: "recipient name") → find recipientId
|
|
185
|
+
io_create_mail(recipientId, buildingId, carrier: "FedEx", trackingNumber: "...")
|
|
186
|
+
io_deliver_mail(id) → when delivered to recipient
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Schedule and approve a move:**
|
|
190
|
+
```
|
|
191
|
+
io_list_spaces → find fromSpaceId and toSpaceId
|
|
192
|
+
io_create_move(name, fromSpaceId, toSpaceId, scheduledDate)
|
|
193
|
+
io_approve_move(id, notes: "Approved")
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Notes
|
|
197
|
+
|
|
198
|
+
- All dates use ISO 8601 format (e.g. `2026-03-21T09:00:00`)
|
|
199
|
+
- All list tools support `search`, `limit` (default 50, max 100), `startAt`, `orderBy`, and `orderByType`
|
|
200
|
+
- `io_list_floors(buildingId)` and `io_list_spaces(floorId)` use nested API paths when an ID is provided
|
|
201
|
+
- Building → Floor → Space is the physical location hierarchy
|