Manage Physical Spaces with Microsoft Places MCP Connector
January 12, 2026
Workplace management just got easier with my new Microsoft Places connector for Copilot Studio. This connector brings the full power of Microsoft Places API to your conversational AI agents, enabling natural language management of buildings, floors, rooms, desks, and workspaces—all through the Model Context Protocol (MCP).
Find the complete code in my SharingIsCaring repository.
What is Microsoft Places?
Microsoft Places is a comprehensive workspace management solution that helps organizations:
- Map physical office buildings with addresses and WiFi details
- Organize floors within buildings with proper hierarchy
- Define sections (neighborhoods/zones) within floors
- Manage meeting rooms with capacity, A/V equipment, and booking settings
- Track workspaces for collaboration areas
- Configure individual desks with booking modes (reservable, drop-in, assigned, unavailable)
- Create room lists for Room Finder integration
The Graph API provides programmatic access to all these capabilities, but traditionally required understanding complex API patterns and hierarchical relationships. This MCP connector simplifies everything into natural language tools.
The 13 MCP Tools
The connector exposes comprehensive workspace management through conversational tools:
Discovery Tools (7 tools)
list_buildings- List all buildings in organizationlist_floors- List all floors, optionally filtered by buildinglist_sections- List all sections/neighborhoodslist_rooms- List meeting rooms with capacity and A/V infolist_workspaces- List all workspaceslist_desks- List all desks with booking modeslist_room_lists- List all room lists for Room Finder
Lookup Tools (3 tools)
get_place- Get details of a specific place by ID or emaillist_rooms_in_room_list- List rooms in a specific room listlist_workspaces_in_room_list- List workspaces in a room list
Management Tools (3 tools)
create_place- Create buildings, floors, sections, desks, rooms, or workspacesupdate_place- Update properties of any placedelete_place- Delete buildings, floors, sections, or desks
Conversational Workspace Management
Once integrated with Copilot Studio, your agents handle workspace queries naturally:
User: “List all buildings in our organization”
Agent: Calls list_buildings tool and displays results
User: “Show me all conference rooms with capacity over 10”
Agent: Calls list_rooms tool with filtering
User: “Find available desks in the Engineering Wing”
Agent: Calls list_desks filtered by section
User: “Create a new section called Marketing Hub on Floor 3”
Agent: Calls create_place with section type and parent reference
User: “What’s the booking mode for desk A1?”
Agent: Calls get_place and displays desk details
The agent automatically extracts parameters, validates inputs, and handles errors based on the tool schemas.
Understanding Place Hierarchy
Microsoft Places follows a strict hierarchy that ensures logical organization:
Building
└── Floor (parentId = building)
└── Section (parentId = floor)
├── Desk (parentId = section)
├── Workspace (parentId = section)
└── Room (parentId = floor or section)
This hierarchy is enforced by the API and must be respected when creating places. The connector handles validation to ensure you maintain proper parent-child relationships.
Technical Architecture
Dual Operation Modes
Like my Bookings connector, this supports two modes:
- MCP Mode - For Copilot Studio with 13 conversational tools
- REST Mode - For Power Automate flows with direct Graph API operations
Use MCP for conversational AI scenarios and REST operations for traditional automation workflows.
MCP Protocol Implementation
The connector implements standard MCP methods:
initialize - Establishes protocol capabilities
{
"protocolVersion": "2025-12-01",
"capabilities": {
"tools": { "listChanged": false }
},
"serverInfo": {
"name": "microsoft-places-mcp",
"version": "1.0.0",
"title": "Microsoft Places MCP"
}
}
tools/list - Returns all 13 tools with complete schemas
tools/call - Executes tools with validated arguments
notifications/initialized - Confirms initialization
Dynamic Graph API Execution
The connector dynamically constructs Graph API calls based on tool invocations:
private async Task<HttpResponseMessage> ExecuteToolAsync(string toolName, JObject args, JToken id)
{
switch (toolName)
{
case "list_buildings":
return await CallGraphAsync("GET", "/places/microsoft.graph.building", args, id, new[] { "top", "filter", "select" });
case "create_place":
return await CallGraphAsync("POST", "/places", BuildPlaceBody(args), id);
case "update_place":
return await CallGraphAsync("PATCH", $"/places/{Arg(args, "placeId")}", args["properties"], id);
// ... 13 tools total
}
}
This approach provides:
- Centralized API communication
- Consistent error handling
- Standardized telemetry
- Easy maintenance
Desk and Workspace Modes
Places supports four booking modes for desks and workspaces:
| Mode | Description |
|---|---|
microsoft.graph.reservablePlaceMode |
Can be reserved/booked |
microsoft.graph.dropInPlaceMode |
First-come, first-served |
microsoft.graph.assignedPlaceMode |
Permanently assigned to user |
microsoft.graph.unavailablePlaceMode |
Not available for use |
The connector validates these modes during creation and updates.
Setup and Configuration
Prerequisites
- Microsoft 365 tenant with Microsoft Places enabled
- Azure AD app registration with Places permissions:
Place.Read.All(Delegated) - For read operationsPlace.ReadWrite.All(Delegated) - For create, update, delete
- Exchange Admin role (required for write operations)
- Power Platform environment
Installation Steps
- Create Azure AD app registration
- Go to Azure Portal → Microsoft Entra ID → App registrations
- Create new registration with name “Microsoft Places Connector”
- Set redirect URI:
https://global.consent.azure-apim.net/redirect
- Configure API permissions
- Add
Place.Read.AllandPlace.ReadWrite.All(Delegated) - Grant admin consent for your organization
- Add
- Create client secret
- Go to Certificates & secrets
- Create new client secret and copy the value
- Import connector
- Go to Power Platform maker portal → Custom connectors
- Import from OpenAPI:
apiDefinition.swagger.json - Enable custom code and paste
script.csx - Update app ID in connector settings
- Create connection and test
- Create a new connection
- Grant consent for Places permissions
- Test with
list_buildingstool
Application Insights Telemetry
The connector includes optional Application Insights integration for production monitoring:
Tracked Events
| Event | Description |
|---|---|
RequestReceived |
Every incoming request |
RequestCompleted |
Successful completion with duration |
RequestError |
Failed request with error details |
MCPMethod |
MCP protocol method invoked |
ToolExecuting |
Tool execution started |
ToolExecuted |
Tool completed with duration |
ToolError |
Tool failed with error details |
Sample KQL Queries
Monitor workspace tool usage:
customEvents
| where name == "ToolExecuted"
| extend Tool = tostring(customDimensions.Tool)
| summarize Count = count(), AvgDuration = avg(todouble(customDimensions.DurationMs)) by Tool
| order by Count desc
Track errors:
customEvents
| where name in ("RequestError", "ToolError", "MCPError")
| where timestamp > ago(24h)
| project timestamp, name, Error = customDimensions.ErrorMessage, Tool = customDimensions.Tool
Telemetry is completely optional—leave the connection string empty to disable without affecting functionality.
Creating Places - Examples
Create a Building
{
"@odata.type": "microsoft.graph.building",
"displayName": "Headquarters",
"address": {
"street": "123 Main St",
"city": "Seattle",
"state": "WA",
"postalCode": "98101",
"countryOrRegion": "USA"
}
}
Create a Floor
{
"@odata.type": "microsoft.graph.floor",
"displayName": "Floor 1",
"parentId": "<building-id>",
"sortOrder": 1
}
Create a Section
{
"@odata.type": "microsoft.graph.section",
"displayName": "Engineering Wing",
"parentId": "<floor-id>"
}
Create a Reservable Desk
{
"@odata.type": "microsoft.graph.desk",
"displayName": "Desk A1",
"parentId": "<section-id>",
"mode": {
"@odata.type": "microsoft.graph.reservablePlaceMode"
}
}
Create a Conference Room
{
"@odata.type": "microsoft.graph.room",
"displayName": "Conference Room Alpha",
"parentId": "<floor-or-section-id>",
"capacity": 12,
"bookingType": "standard",
"audioDeviceName": "Conference Phone",
"videoDeviceName": "4K Camera",
"displayDeviceName": "75-inch Display"
}
Real-World Use Cases
Workplace Management Copilot
Create an agent that helps facility managers:
- “List all desks on Floor 3 that are available for booking”
- “Create a new hot desk in the Marketing section”
- “What conference rooms have video conferencing equipment?”
- “Update the capacity of Conference Room Alpha to 15 people”
Space Planning Automation
Integrate with resource planning workflows:
- “How many reservable desks do we have in the building?”
- “Find all rooms with capacity over 20”
- “List all sections in the Engineering building”
- “What’s the booking mode for workspaces in the Innovation Lab?”
Desk Booking Assistant
Help employees find workspace:
- “Show me available drop-in desks near Engineering”
- “Which rooms in the Executive room list are available?”
- “Find quiet workspaces on Floor 2”
- “What A/V equipment is in Conference Room Beta?”
Important Limitations
Be aware of these API constraints:
- Cannot delete: Rooms, workspaces, and room lists (API limitation)
- Cannot update:
id,placeId,emailAddress,displayName, orbookingTypeproperties - Permissions required: Exchange Admin role for all write operations
- No app permissions: Only delegated permissions supported for write operations
The connector validates these constraints and provides clear error messages when limitations are encountered.
Try It Yourself
The complete connector code is in my SharingIsCaring repository:
- README with full documentation
- apiDefinition.swagger.json - OpenAPI specification
- script.csx - MCP implementation
- apiProperties.json - Connector metadata
If you build something with this connector or have ideas for improvements, I’d love to hear about it! Open an issue or submit a PR in the repository.