{"_id":"@mindstone/mcp-server-microsoft-calendar","_rev":"4-2fc13825ed02ce9546e5401799694cb8","name":"@mindstone/mcp-server-microsoft-calendar","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@mindstone/mcp-server-microsoft-calendar","version":"0.1.0","license":"FSL-1.1-MIT","_id":"@mindstone/mcp-server-microsoft-calendar@0.1.0","maintainers":[{"name":"mindstone-engineering","email":"engineering@mindstone.com"}],"homepage":"https://github.com/mindstone/mcp-servers/tree/main/connectors/microsoft-calendar","bugs":{"url":"https://github.com/mindstone/mcp-servers/issues"},"bin":{"mcp-server-microsoft-calendar":"dist/index.js"},"dist":{"shasum":"803ee0c8c5734e993ded58977df1f34e85818905","tarball":"https://registry.npmjs.org/@mindstone/mcp-server-microsoft-calendar/-/mcp-server-microsoft-calendar-0.1.0.tgz","fileCount":33,"integrity":"sha512-UGN02/j/lB1tuCOSNF0Nn7qVUXetGX0XsAmPy7Dc0dgAsPOh8zI3inTjUmmo2T0Hcxv1Vo0FbFqkJ8rm89js6A==","signatures":[{"sig":"MEQCICPtrfUulsDewyntPtsCjr1k9nPhAlfr8dMlTHgKKxbOAiAhIcfJPNziAi0AyrSrJoq7ezJQoPMe6YZCzB3nHqbWUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106122},"type":"module","engines":{"node":">=20"},"gitHead":"a49de3e19e784f88bea43a06bcfb82e3c2386aa5","mcpName":"io.github.mindstone/mcp-server-microsoft-calendar","scripts":{"test":"vitest run","build":"shx rm -rf dist && tsc && shx chmod +x dist/index.js && npm run security:internal-refs","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm test","security:internal-refs":"node scripts/check-internal-refs.mjs"},"_npmUser":{"name":"mindstone-engineering","email":"engineering@mindstone.com"},"repository":{"url":"git+https://github.com/mindstone/mcp-servers.git","type":"git","directory":"connectors/microsoft-calendar"},"_npmVersion":"11.11.1","description":"Microsoft 365 Outlook Calendar MCP server — list, get, create, update, delete, respond to events, check free/busy, and list calendars via Microsoft Graph","directories":{},"_nodeVersion":"25.8.2","dependencies":{"zod":"^3.23.0","@modelcontextprotocol/sdk":"^1.26.0","@mindstone/mcp-server-microsoft-shared":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.13.2","shx":"^0.3.4","vitest":"^4.1.3","typescript":"^5.8.2","@types/node":"^22","@vitest/coverage-v8":"^4.1.3","@mindstone/mcp-test-harness":"file:../../test-harness"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server-microsoft-calendar_0.1.0_1779223867733_0.02223199481155569","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@mindstone/mcp-server-microsoft-calendar","version":"0.1.1","license":"FSL-1.1-MIT","_id":"@mindstone/mcp-server-microsoft-calendar@0.1.1","maintainers":[{"name":"mindstone-engineering","email":"engineering@mindstone.com"}],"homepage":"https://github.com/mindstone/mcp-servers/tree/main/connectors/microsoft-calendar","bugs":{"url":"https://github.com/mindstone/mcp-servers/issues"},"bin":{"mcp-server-microsoft-calendar":"dist/index.js"},"dist":{"shasum":"becd0310cba4972b3334b83d65146981f4307e71","tarball":"https://registry.npmjs.org/@mindstone/mcp-server-microsoft-calendar/-/mcp-server-microsoft-calendar-0.1.1.tgz","fileCount":33,"integrity":"sha512-uBBph1n9StJMjyr+zLRqCnKp2BE71f68dqkqhV+Ibmnh/qn1T/6wdFFgLnUAzT2wP9YanpqRFQC82OedZsAT8w==","signatures":[{"sig":"MEUCIQC1GrdUf29ccNz/RCVr+DJdmwoHpyTWlXEVeAxeRnx9VgIgPLjsLGI+ZEEluZHnwYwHCVQ5w0omJKZPqoH/KhjrNnQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109870},"type":"module","engines":{"node":">=20"},"gitHead":"2318e6429c67600786dad9cc697f2cde0b94b3a8","mcpName":"io.github.mindstone/mcp-server-microsoft-calendar","scripts":{"test":"vitest run","build":"shx rm -rf dist && tsc && shx chmod +x dist/index.js && npm run security:internal-refs","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm test","security:internal-refs":"node scripts/check-internal-refs.mjs"},"_npmUser":{"name":"mindstone-engineering","email":"engineering@mindstone.com"},"repository":{"url":"git+https://github.com/mindstone/mcp-servers.git","type":"git","directory":"connectors/microsoft-calendar"},"_npmVersion":"11.11.1","description":"Microsoft 365 Outlook calendar via Graph: list, get, create, update, respond, free/busy.","directories":{},"_nodeVersion":"25.8.2","dependencies":{"zod":"^3.23.0","@modelcontextprotocol/sdk":"^1.26.0","@mindstone/mcp-server-microsoft-shared":"0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.13.2","shx":"^0.3.4","vitest":"^4.1.3","typescript":"^5.8.2","@types/node":"^22","@vitest/coverage-v8":"^4.1.3","@mindstone/mcp-test-harness":"file:../../test-harness"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server-microsoft-calendar_0.1.1_1779281002100_0.10458848853088676","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@mindstone/mcp-server-microsoft-calendar","version":"0.1.2","license":"FSL-1.1-MIT","_id":"@mindstone/mcp-server-microsoft-calendar@0.1.2","maintainers":[{"name":"mindstone-engineering","email":"engineering@mindstone.com"}],"homepage":"https://github.com/mindstone/mcp-servers/tree/main/connectors/microsoft-calendar","bugs":{"url":"https://github.com/mindstone/mcp-servers/issues"},"bin":{"mcp-server-microsoft-calendar":"dist/index.js"},"dist":{"shasum":"62414fcb03d58f3601f10f2e309660e76582572a","tarball":"https://registry.npmjs.org/@mindstone/mcp-server-microsoft-calendar/-/mcp-server-microsoft-calendar-0.1.2.tgz","fileCount":21,"integrity":"sha512-uKhvcx3D5KxJtLrkuVmKPBSzJG7aI0/4TAukX7RMTWICK50+J3fi6TGIeaOfPS5QBrUPoSQRlL5wc1CJEjqULw==","signatures":[{"sig":"MEYCIQC1eUzXaWRGKy3y7qg9fl/NKzCJPwdn+nTNL8fxiq5CQwIhAKCGdja/3ZSL0LIfaK0L+2q0SBGgZs84mDSeA1XEK8gu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mindstone%2fmcp-server-microsoft-calendar@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":79809},"type":"module","_from":"file:mindstone-mcp-server-microsoft-calendar-0.1.2.tgz","engines":{"node":">=20"},"mcpName":"io.github.mindstone/mcp-server-microsoft-calendar","scripts":{"test":"vitest run","build":"shx rm -rf dist && tsc && shx chmod +x dist/index.js && npm run security:internal-refs","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build && npm test","security:internal-refs":"node scripts/check-internal-refs.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3d3cbf34-73df-443e-94a2-268359f78d4c"}},"_resolved":"/home/runner/work/mcp-servers/mcp-servers/mindstone-mcp-server-microsoft-calendar-0.1.2.tgz","_integrity":"sha512-uKhvcx3D5KxJtLrkuVmKPBSzJG7aI0/4TAukX7RMTWICK50+J3fi6TGIeaOfPS5QBrUPoSQRlL5wc1CJEjqULw==","repository":{"url":"git+https://github.com/mindstone/mcp-servers.git","type":"git","directory":"connectors/microsoft-calendar"},"_npmVersion":"11.16.0","description":"Microsoft 365 Outlook calendar via Graph: list, get, create, update, respond, free/busy.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.23.0","@modelcontextprotocol/sdk":"^1.26.0","@mindstone/mcp-server-microsoft-shared":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.13.2","shx":"^0.3.4","vitest":"^4.1.3","typescript":"^5.8.2","@types/node":"^22","@vitest/coverage-v8":"^4.1.3","@mindstone/mcp-test-harness":"file:../../test-harness"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server-microsoft-calendar_0.1.2_1783094256700_0.24260191757984106","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@mindstone/mcp-server-microsoft-calendar","version":"0.2.0","mcpName":"io.github.mindstone/mcp-server-microsoft-calendar","description":"Microsoft 365 Outlook calendar via Graph: list, get, create, update, respond, free/busy.","license":"FSL-1.1-MIT","type":"module","bin":{"mcp-server-microsoft-calendar":"dist/index.js"},"repository":{"type":"git","url":"git+https://github.com/mindstone/mcp-servers.git","directory":"connectors/microsoft-calendar"},"homepage":"https://github.com/mindstone/mcp-servers/tree/main/connectors/microsoft-calendar","publishConfig":{"access":"public"},"scripts":{"build":"shx rm -rf dist && tsc && shx chmod +x dist/index.js && npm run security:internal-refs","prepare":"npm run build","prepublishOnly":"npm run build && npm test","watch":"tsc --watch","start":"node dist/index.js","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","security:internal-refs":"node scripts/check-internal-refs.mjs"},"dependencies":{"@mindstone/mcp-server-microsoft-shared":"^0.1.0","@modelcontextprotocol/sdk":"^1.26.0","zod":"^3.23.0"},"devDependencies":{"@mindstone/mcp-test-harness":"file:../../test-harness","@types/node":"^22","@vitest/coverage-v8":"^4.1.3","msw":"^2.13.2","shx":"^0.3.4","typescript":"^5.8.2","vitest":"^4.1.3"},"engines":{"node":">=20"},"_id":"@mindstone/mcp-server-microsoft-calendar@0.2.0","bugs":{"url":"https://github.com/mindstone/mcp-servers/issues"},"_integrity":"sha512-zR6HbAOcDm/YZYIraK07R/P5GX65sbF3i050Hww+KmX8QKYsx5VrwTOWwKDzNuH7wSmnU0PI6gf0VkdzC03hxw==","_resolved":"/home/runner/work/mcp-servers/mcp-servers/mindstone-mcp-server-microsoft-calendar-0.2.0.tgz","_from":"file:mindstone-mcp-server-microsoft-calendar-0.2.0.tgz","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-zR6HbAOcDm/YZYIraK07R/P5GX65sbF3i050Hww+KmX8QKYsx5VrwTOWwKDzNuH7wSmnU0PI6gf0VkdzC03hxw==","shasum":"9bec43cf57a1501290fe2905150a7ceceb35a9bc","tarball":"https://registry.npmjs.org/@mindstone/mcp-server-microsoft-calendar/-/mcp-server-microsoft-calendar-0.2.0.tgz","fileCount":21,"unpackedSize":147106,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@mindstone%2fmcp-server-microsoft-calendar@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD6RfqGmoLxK7+hduOIW+VVoouhAsM8EAZRr2hWvnN7BgIhAPdZn8cM+S1HwjeSkMTSgyq9DMf55z1OWnoxvCAdOom0"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3d3cbf34-73df-443e-94a2-268359f78d4c"}},"directories":{},"maintainers":[{"name":"mindstone-engineering","email":"engineering@mindstone.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-server-microsoft-calendar_0.2.0_1786110268802_0.17116345857215798"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-19T20:51:07.532Z","modified":"2026-08-07T13:44:29.322Z","0.1.0":"2026-05-19T20:51:07.873Z","0.1.1":"2026-05-20T12:43:22.281Z","0.1.2":"2026-07-03T15:57:36.828Z","0.2.0":"2026-08-07T13:44:28.956Z"},"bugs":{"url":"https://github.com/mindstone/mcp-servers/issues"},"license":"FSL-1.1-MIT","homepage":"https://github.com/mindstone/mcp-servers/tree/main/connectors/microsoft-calendar","repository":{"type":"git","url":"git+https://github.com/mindstone/mcp-servers.git","directory":"connectors/microsoft-calendar"},"description":"Microsoft 365 Outlook calendar via Graph: list, get, create, update, respond, free/busy.","maintainers":[{"name":"mindstone-engineering","email":"engineering@mindstone.com"}],"readme":"# @mindstone/mcp-server-microsoft-calendar\n\n[![npm version](https://img.shields.io/npm/v/@mindstone/mcp-server-microsoft-calendar.svg)](https://www.npmjs.com/package/@mindstone/mcp-server-microsoft-calendar)\n[![License: FSL-1.1-MIT](https://img.shields.io/badge/License-FSL--1.1--MIT-blue.svg)](./LICENSE)\n\nMicrosoft 365 Outlook Calendar MCP server — list, get, create, update, delete, cancel, and respond to events, check free/busy, find meeting times, and list calendars via the Microsoft Graph API.\n\n*Cohort-style Microsoft 365 calendar MCP. Reuses the OAuth surface owned by [`@mindstone/mcp-server-microsoft-mail`](../microsoft-mail/) so the host signs in once and gets calendar plus mail plus files plus Teams plus SharePoint from the same credentials.*\n\n## Status\n\n- **Version:** [0.2.0](./CHANGELOG.md) · [npm](https://www.npmjs.com/package/@mindstone/mcp-server-microsoft-calendar)\n- **Auth:** OAuth (host-orchestrated, shared with [`mcp-server-microsoft-mail`](../microsoft-mail/)) ([`MS_CLIENT_ID`](./server.json))\n- **Tools:** [10](./src/tools.ts) (events, calendars, free-busy, scheduling)\n- **Surface:** cloud-api\n- **Machine-readable:** [`STATUS.json`](./STATUS.json)\n- **Shared library:** [`@mindstone/mcp-server-microsoft-shared`](https://www.npmjs.com/package/@mindstone/mcp-server-microsoft-shared)\n\n## Why this exists\n\nWhen we ported this in May 2026, Microsoft's own [Graph MCP](https://github.com/microsoft/mcp) lineup did not yet ship a stand-alone Outlook Calendar server, and the community options at the time treated calendar as its own login surface — every connector ran a separate OAuth dance and stored its own copy of the refresh token. We pulled the bundled connector out of MindstoneRebel as a 1:1 port so that the same five-connector Microsoft 365 cohort (mail, calendar, files, teams, SharePoint) shares a single set of credentials, a single shared-library package for token persistence and request timeouts, and the structured `auth_required` envelope the host already knows how to recover from. Calendar reuses [`@mindstone/mcp-server-microsoft-mail`](../microsoft-mail/)'s `authenticate_microsoft_account` tool rather than declaring its own.\n\n## Example interaction\n\n> \"What's on my calendar this afternoon, and find a 30-minute slot tomorrow when both Alice and I are free.\"\n\nTools the host calls:\n1. `list_events` — date range covering the rest of today.\n2. `find_meeting_times` — suggests slots tomorrow when both Alice and the user are free.\n\nResponse (trimmed):\n\n```json\n{\n  \"today\": [\n    { \"id\": \"AA...=\", \"subject\": \"Q3 review\", \"start\": \"2026-05-19T15:00:00Z\", \"end\": \"2026-05-19T16:00:00Z\" }\n  ],\n  \"tomorrow_suggestions\": [\n    { \"start\": \"2026-05-20T10:00:00\", \"end\": \"2026-05-20T10:30:00\" },\n    { \"start\": \"2026-05-20T14:30:00\", \"end\": \"2026-05-20T15:00:00\" }\n  ]\n}\n```\n\n## Requirements\n\n- Node.js 20+\n- npm\n- A host application that performs the Microsoft OAuth flow and writes per-account token files into `${MS_CONFIG_DIR}/credentials/${sanitised-email}.token.json` and an `${MS_CONFIG_DIR}/accounts.json` index. This server reads those files; it does not initiate OAuth itself.\n\n<!-- BEGIN INSTALL_LINKS: do not edit by hand; regenerated by scripts/gen-install-links.mjs -->\n## One-click install\n\n[![Add to Cursor](https://img.shields.io/badge/Add_to_Cursor-black?style=for-the-badge&logo=cursor&logoColor=white)](cursor://anysphere.cursor-deeplink/mcp/install?name=Microsoft%20365%20Calendar&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBtaW5kc3RvbmUvbWNwLXNlcnZlci1taWNyb3NvZnQtY2FsZW5kYXIiXSwiZW52Ijp7Ik1TX0NMSUVOVF9JRCI6IiIsIk1TX0NPTkZJR19ESVIiOiIiLCJNU19NQ1BfUEFDS0FHRV9JRCI6Ik1pY3Jvc29mdDM2NUNhbGVuZGFyIiwiTUlDUk9TT0ZUX1JFUVVFU1RfVElNRU9VVF9NUyI6IjYwMDAwIn19)\n[![Add to VS Code](https://img.shields.io/badge/Add_to_VS_Code-007ACC?style=for-the-badge&logo=visual-studio-code&logoColor=white)](vscode:mcp/install?%7B%22name%22%3A%22Microsoft%20365%20Calendar%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40mindstone%2Fmcp-server-microsoft-calendar%22%5D%2C%22env%22%3A%7B%22MS_CLIENT_ID%22%3A%22%22%2C%22MS_CONFIG_DIR%22%3A%22%22%2C%22MS_MCP_PACKAGE_ID%22%3A%22Microsoft365Calendar%22%2C%22MICROSOFT_REQUEST_TIMEOUT_MS%22%3A%2260000%22%7D%7D)\n[![Add to VS Code Insiders](https://img.shields.io/badge/Add_to_VS_Code_Insiders-24bfa5?style=for-the-badge&logo=visual-studio-code&logoColor=white)](vscode-insiders:mcp/install?%7B%22name%22%3A%22Microsoft%20365%20Calendar%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40mindstone%2Fmcp-server-microsoft-calendar%22%5D%2C%22env%22%3A%7B%22MS_CLIENT_ID%22%3A%22%22%2C%22MS_CONFIG_DIR%22%3A%22%22%2C%22MS_MCP_PACKAGE_ID%22%3A%22Microsoft365Calendar%22%2C%22MICROSOFT_REQUEST_TIMEOUT_MS%22%3A%2260000%22%7D%7D)\n\nAfter clicking the button, your host will prompt you to fill: `MS_CLIENT_ID`, `MS_CONFIG_DIR`, `MS_MCP_PACKAGE_ID`, `MICROSOFT_REQUEST_TIMEOUT_MS`.\n\n<details>\n<summary>Manual config for Claude Desktop / Claude Code / Goose / Continue.dev (Microsoft 365 Calendar)</summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"Microsoft 365 Calendar\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@mindstone/mcp-server-microsoft-calendar\"\n      ],\n      \"env\": {\n        \"MS_CLIENT_ID\": \"\",\n        \"MS_CONFIG_DIR\": \"\",\n        \"MS_MCP_PACKAGE_ID\": \"Microsoft365Calendar\",\n        \"MICROSOFT_REQUEST_TIMEOUT_MS\": \"60000\"\n      }\n    }\n  }\n}\n```\n\n</details>\n<!-- END INSTALL_LINKS -->\n\n## Quick Start\n\n### Install & build\n\n```bash\ncd <path-to-repo>/connectors/microsoft-calendar\nnpm install\nnpm run build\n```\n\n### npx (once published)\n\n```bash\nnpx -y @mindstone/mcp-server-microsoft-calendar\n```\n\n### Local\n\n```bash\nnode dist/index.js\n```\n\n## Configuration\n\nThis server runs alongside a host application that owns the Microsoft 365 OAuth flow. The host writes credentials to disk; this server reads them.\n\n### Required environment variables\n\n| Name | Description |\n| ---- | ----------- |\n| `MS_CLIENT_ID` | Microsoft Entra (Azure AD) application client ID. |\n| `MS_CONFIG_DIR` | Path to the per-user Microsoft config directory (`credentials/`, `accounts.json`). |\n\n### Optional environment variables\n\n| Name | Description | Default |\n| ---- | ----------- | ------- |\n| `MS_ACCOUNT_EMAIL` | Account email when running in multi-account per-instance mode. | First account in `accounts.json`. |\n| `MS_MCP_PACKAGE_ID` | Logical package ID surfaced in error responses. | `Microsoft365Calendar` |\n| `MICROSOFT_REQUEST_TIMEOUT_MS` | Override the upstream Microsoft Graph request timeout (max `300000` ms). | `60000` |\n| `MICROSOFT_DISABLE_REFRESH` | Set to `1` to disable token refresh on this surface. Tools fail closed with the structured `auth_required` response so the host can drive reauth. Cloud surfaces set this to `1`. | unset |\n\n## Host configuration examples\n\n### Claude Desktop / Cursor\n\n```json\n{\n  \"mcpServers\": {\n    \"Microsoft365Calendar\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@mindstone/mcp-server-microsoft-calendar\"],\n      \"env\": {\n        \"MS_CLIENT_ID\": \"your-entra-application-client-id\",\n        \"MS_CONFIG_DIR\": \"/absolute/path/to/microsoft-config\"\n      }\n    }\n  }\n}\n```\n\nSign in via [`@mindstone/mcp-server-microsoft-mail`](../microsoft-mail/)'s `authenticate_microsoft_account` first; the calendar tools then reuse the credentials it writes to `${MS_CONFIG_DIR}/`.\n\n### Local development (no npm publish needed)\n\n```json\n{\n  \"mcpServers\": {\n    \"Microsoft365Calendar\": {\n      \"command\": \"node\",\n      \"args\": [\"<path-to-repo>/connectors/microsoft-calendar/dist/index.js\"],\n      \"env\": {\n        \"MS_CLIENT_ID\": \"your-entra-application-client-id\",\n        \"MS_CONFIG_DIR\": \"/absolute/path/to/microsoft-config\"\n      }\n    }\n  }\n}\n```\n\n## Tools (10)\n\n| Tool | Description |\n| ---- | ----------- |\n| `list_events` | List calendar events within a date range (JSON with per-attendee RSVP status, or agenda-style text). Reports `truncated: true` when Graph has more pages — narrow the range or raise `top` (max 100). |\n| `get_event` | Get detailed information about a specific calendar event (optionally including attachment metadata; `attachmentsTruncated` flags further pages). |\n| `create_event` | Create a new calendar event (with optional Teams meeting and recurrence). |\n| `update_event` | Update an existing calendar event (including adding/removing attendees and recurrence). |\n| `delete_event` | Delete a calendar event. |\n| `cancel_event` | Cancel a meeting as organizer with an optional message to attendees. |\n| `respond_to_event` | Accept, decline, or tentatively accept an event invitation. |\n| `get_free_busy` | Check availability/free-busy status for users. |\n| `find_meeting_times` | Suggest slots when all given attendees are free. Slots are only suggested when availability for every requested attendee was resolved; otherwise the unresolved attendees are listed in `unresolvableAttendees`. |\n| `list_calendars` | List all calendars the user has access to. |\n\n## Security notes\n\n- No authentication tool of its own; sign-in is delegated to [`@mindstone/mcp-server-microsoft-mail`](../microsoft-mail/) so the cohort has a single OAuth surface.\n- Token files are written by the host with mode `0600`; this server reads them via the cohort-shared library, which fails closed on malformed files.\n- `MICROSOFT_DISABLE_REFRESH=1` is the default on cloud surfaces so the desktop session remains the sole refresh-token authority.\n- Per-tool Graph calls run under a composed caller + cohort timeout signal.\n- All Graph-sourced text is returned inside `<untrusted-content>` envelopes; structural-looking fields (IDs, URLs, enum-like values, timestamps) pass through raw only when they match their documented closed format and are enveloped otherwise. Vendor error messages are enveloped before they reach the model.\n- Tool inputs are validated fail-closed (email addresses, ISO date-times, bounded numerics, strict recurrence objects) before any Graph request is made.\n- Event/calendar IDs interpolated into Graph request paths are validated fail-closed (rejecting `?`, `#`, `%`, `\\`, whitespace, and `.`/`..` segments) before any network request and URL-encoded at the interpolation site, so a crafted ID cannot reroute the authenticated request.\n- Graph pagination is never silently dropped: list endpoints report `truncated` / `attachmentsTruncated` instead of following vendor-supplied continuation URLs.\n\n## Licence\n\n[FSL-1.1-MIT](./LICENSE) — Functional Source License, Version 1.1, with MIT future licence. Free for non-competing use; relicenses to MIT on the converter date in `LICENSE`.\n","readmeFilename":"README.md"}