verification
use it
# add to stunt.yaml
services:
microsoft-graph:
adapter: embedded:microsoft-graph-style
# then
$ stunt upThe embedded: source extracts this adapter from the binary — no git clone, fully offline.
how to mock the Microsoft Graph API locally
Install stunt, paste the service block above into stunt.yaml, run stunt up — then point your client at localhost instead of Microsoft Graph API. It works offline, keeps state across requests and restarts, and every response is synthetic: the route shapes, status codes, pagination, and webhook delivery follow the real Microsoft Graph API v1.0 surface — the data is fake, the behavior is real.
backing stores
messageseventschatschat_messagesfiles
api surface (55)
generated from the adapter manifest — exactly what boots, nothing more · covers 0% of the real API's 17531 routes (derived from spec msgraph-metadata v1.0 @ v1.0)
55 routes
GET/v1.0/me
POST/v1.0/subscriptions
GET/v1.0/subscriptions
GET/v1.0/subscriptions/{id}
DELETE/v1.0/subscriptions/{id}
GET/v1.0/users
GET/v1.0/users/{id}
GET/v1.0/me/mailFolders
GET/v1.0/me/mailFolders/{id}/messages
GET/v1.0/me/messages
POST/v1.0/me/messages
POST/v1.0/me/messages/{id}/send
GET/v1.0/me/messages/{id}
PATCH/v1.0/me/messages/{id}
DELETE/v1.0/me/messages/{id}
POST/v1.0/me/sendMail
GET/v1.0/me/calendarView
GET/v1.0/me/calendar/calendarView
GET/v1.0/me/events
POST/v1.0/me/events
POST/v1.0/me/events/{id}/accept
POST/v1.0/me/events/{id}/decline
POST/v1.0/me/events/{id}/tentativelyAccept
GET/v1.0/me/events/{id}
DELETE/v1.0/me/events/{id}
PATCH/v1.0/me/events/{id}
GET/v1.0/me/drive
GET/v1.0/me/drive/root/children
POST/v1.0/me/drive/root/children
GET/v1.0/me/drive/items/{id}/children
POST/v1.0/me/drive/items/{id}/children
GET/v1.0/me/drive/items/{id}/content
POST/v1.0/me/drive/items/{id}/restore
GET/v1.0/me/drive/items/{id}
DELETE/v1.0/me/drive/items/{id}
PUT/v1.0/me/drive/root:/{item}/content
PUT/v1.0/me/drive/items/{parent}/{item}/content
POST/v1.0/me/drive/root:/{item}/createUploadSession
POST/v1.0/me/drive/items/{parent}/{item}/createUploadSession
PUT/v1.0/_upload/{session}
GET/v1.0/me/drive/root:/{item}
GET/v1.0/groups/{id}/sites
GET/v1.0/me/chats
POST/v1.0/me/chats
DELETE/v1.0/chats/{id}
GET/v1.0/chats/{id}/messages
POST/v1.0/chats/{id}/messages
DELETE/v1.0/chats/{id}/messages/{messageId}
GET/v1.0/me/drive/items/{id}/workbook/worksheets
POST/v1.0/me/drive/items/{id}/workbook/tables/{name}/rows/add
GET/v1.0/me/drive/items/{id}/workbook/tables/{name}/rows
POST/v1.0/me/drive/items/{id}/workbook/tables/{name}/rows
PATCH/v1.0/me/drive/items/{id}/workbook/tables/{name}/rows/{index}
DELETE/v1.0/me/drive/items/{id}/workbook/tables/{name}/rows/{index}
GET/v1.0/me/drive/items/{id}/workbook/tables/{name}/range
SDK-verified behaviors (10)
- ✓/me resolves the signed-in profile
- ✓users directory pages via $top and the @odata.nextLink cursor
- ✓$filter and $select are applied server-side
- ✓draft lifecycle: create, PATCH, send, land in Sent Items
- ✓sendMail posts straight to Sent Items (no draft)
- ✓subscription lifecycle with clientState-echoed notifications
- ✓calendar: create, calendarView window, accept records the response
- ✓teams chat: create chat, send message, list, delete
- ✓drive: quota, simple upload round-trip, path resolution
- ✓error envelope: unknown user 404, unknown token 401
Not implemented (8)
- No Excel workbook sessions (createSession, refreshSession, closeSession)
- No mail reply/forward, attachments, or message move/copy endpoints
- No calendar or mail folder create/update/delete, no event instances
- No drive item copy, move, rename, permissions, or sharing invites
- No drive search, delta, recent, or sharedWithMe endpoints
- No teams or channels endpoints (chats and chat messages only)
- No Excel worksheet or table create/update/delete, no workbook calculate
- No todo, planner, contacts, presence, or /search surfaces
Differs from the real API (6)
- Webhook validationToken handshake not enforced; subscription accepted immediately
- Upload session ids are deterministic counters, not unguessable tokens
- OData $filter limited to the equality pattern (field eq value)
- Static seeded mock-bearer-token bypasses the entra-id token flow
- @odata.nextLink/@odata.context point at graph.microsoft.com, not the serving host (prod-faithful; a local SDK harness must rebase)
- Resumable upload session URLs are absolute http:// — the JS SDK's OneDriveLargeFileUploadTask urlJoins them into a broken path
want more of the Microsoft Graph API surface? adapters are YAML + Starlark — the authoring guide covers adding routes, fixtures, and state machines. Open an issue for anything big first, or just file a PR — merged routes ship in the next release.