Claude Hotmail Connector
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Claude Hotmail Connectorlist my unread emails from today"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Claude Hotmail Connector
A locally hosted Model Context Protocol (MCP) server that lets
Claude read email and read/write calendar events in a personal Microsoft account
(@hotmail.com / @outlook.com / @live.com) via the Microsoft Graph API.
Claude's official Microsoft 365 connector only supports work/school (Microsoft Entra) accounts and rejects personal Microsoft accounts. This project fills that gap for a single user, running entirely on your own machine.
Deployment model — Mode A: local stdio
Per the local-hosting investigation, this connector is built as a local stdio MCP server: Claude Desktop or VS Code / Claude Code launches it as a subprocess and talks to it over stdin/stdout. There is no public URL, no tunnel, and no hosting cost — and the entire downstream OAuth machinery (PRM/DCR/PKCE for the Claude ↔ server hop) drops away. Only the upstream Microsoft sign-in is needed, done via a native public-client OAuth 2.0 authorization-code + PKCE flow with a loopback redirect.
Claude Desktop / VS Code ──stdio──▶ this server ──HTTPS──▶ Microsoft Graph (personal account)
(MCP client) (local subprocess) graph.microsoft.com/v1.0Related MCP server: Outlook MCP Server
Tools
Tool | Purpose | Graph permission |
| Confirm the connected account |
|
| Search/list mail (find booking confirmations) |
|
| Read one email as text |
|
| Read the calendar over a date range |
|
| Add a calendar event (timezone-correct, idempotent) |
|
| Edit a calendar event |
|
Mail is read-only (no Mail.Send). There is no hard-delete tool. cancel_event (event
deletion) is deliberately deferred as a gated/destructive action pending explicit approval.
Install (recommended)
The easy path — no Node, no Azure, no config files. On Windows, download the latest
HotmailConnectorSetup.exe (or the portable hotmail-connector.exe) from
Releases and run it. The installer
auto-configures Claude Desktop and runs the one-time Microsoft sign-in for you — the build embeds a
shared public-client id, so there's nothing to register or configure.
Windows shows an "unknown publisher" warning (the build is unsigned, by design) — click More info → Run anyway.
After it finishes, fully quit Claude Desktop from the system tray (closing the window only minimises it) and reopen it.
See docs/installer.md for the details, the SmartScreen note, and how the
packages are built. Want to build or run it yourself instead? Use the developer setup below.
Manual / developer setup
Prerequisites
Node.js 20+ (
node --version).A personal Microsoft account (
@hotmail.com/@outlook.com/@live.com).Claude Desktop and/or VS Code (with MCP support) on the same machine.
A one-time Microsoft Entra app registration (free — see below).
1. Register a Microsoft Entra application (one-time, optional)
You can skip this — the build ships with a bundled shared client id. Only do it to bring your own Entra registration. (Maintainers:
scripts/register-app.ps1automates it; seedocs/installer.md.)
The connector signs in as a public/native client — no client secret is ever used or stored.
Go to the Entra admin center → App registrations → New registration.
Name: e.g.
Claude Hotmail Connector.Supported account types: choose “Accounts in any organizational directory (Any Microsoft Entra ID tenant – Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox).” This is what allows
hotmail.com/outlook.comsign-in.Redirect URI: select platform “Public client/native (mobile & desktop)” and enter
http://localhost. (Microsoft allows any loopback port for native clients, so a specific port is not required.)Click Register, then copy the Application (client) ID.
Under Authentication, confirm the platform is Mobile and desktop applications with
http://localhost, and that “Allow public client flows” is Yes. Do not create a client secret.Under API permissions → Add a permission → Microsoft Graph → Delegated permissions, add:
openid,profile,email,offline_access,User.Read,Mail.Read,Calendars.ReadWrite. (Admin consent is not required for a personal account — you consent at first sign-in.)
2. Install & build
git clone https://github.com/TGoodhew/Claude-Hotmail-Connector.git
cd Claude-Hotmail-Connector
npm install
npm run build # produces dist/index.js3. Configure (optional)
The build ships with a bundled shared client id, so this is optional. To use your own Entra
registration (step 1), set it via a local .env:
cp .env.example .env
# edit .env and set MICROSOFT_CLIENT_ID=<the Application (client) ID from step 1>Configurable environment variables (see .env.example):
Variable | Default | Notes |
| (required) | Entra app registration client id. |
|
|
|
|
| IANA zone for calendar reads/writes. |
|
|
|
| least-privilege set | Space/comma-separated override. |
| per-OS profile dir | Where the encrypted token cache lives. |
4. Sign in once
node dist/index.js loginThis opens your system browser to Microsoft. Sign in with your personal account and consent to
the requested permissions. The refresh token is stored encrypted in your user profile (see
Security); subsequent runs refresh silently. node dist/index.js logout clears it.
Verify:
node dist/index.js whoami # should print your name <tony_goodhew@hotmail.com>5. Wire it into a client
The quickest way is to let the connector configure Claude Desktop for you — the same engine the installer uses:
node dist/index.js setup # detects Claude Desktop (incl. the Microsoft Store build) and wires it upOr configure a client manually — the server is launched as a stdio subprocess. Pass
MICROSOFT_CLIENT_ID via the client's env only if you're bringing your own registration (otherwise
the bundled default is used).
VS Code / Claude Code
Use Command Palette → “MCP: Add Server…” → Command (stdio), pointing node at the built
dist/index.js. Or commit-adjacent, copy .vscode/mcp.json.example to
.vscode/mcp.json and edit the path/client id:
{
"servers": {
"hotmail-connector": {
"type": "stdio",
"command": "node",
"args": ["C:\\Users\\Tony\\Source\\Repos\\Claude-Hotmail-Connector\\dist\\index.js"],
"env": { "MICROSOFT_CLIENT_ID": "<your-entra-app-client-id>" },
},
},
}Claude Desktop
Edit claude_desktop_config.json (see
examples/claude_desktop_config.example.json):
{
"mcpServers": {
"hotmail-connector": {
"command": "node",
"args": ["C:\\Users\\Tony\\Source\\Repos\\Claude-Hotmail-Connector\\dist\\index.js"],
"env": { "MICROSOFT_CLIENT_ID": "<your-entra-app-client-id>" },
},
},
}Restart the client. The connector's tools should appear. If you have not run login yet, do so once
in a terminal first (the server does not pop a browser on its own).
Usage example
“Find my Monsoon Aquatics and Macadamias Australia booking confirmation emails, then add each to my calendar with 15-minute travel-time blocks before and after.”
Claude will use list_messages / get_message to read the confirmations, confirm the details with
you, then call create_event for each booking (and the travel blocks) at the correct
Australia/Brisbane local times — with no duplicates if it retries.
Security
Least privilege:
Mail.Read(read-only) +Calendars.ReadWrite. NoMail.Send, no hard-delete,cancel_eventdeferred.No client secret: public/native client using PKCE.
Token storage: the refresh token is encrypted with AES-256-GCM in your user profile (
%LOCALAPPDATA%\claude-hotmail-connectoron Windows,~/.claude-hotmail-connectorotherwise), with the key in a sibling owner-only file. Never committed, never logged, never returned to the client.Logging: structured logs go to stderr only (stdout is reserved for MCP JSON-RPC) and are scrubbed of tokens,
Authorizationheaders, OAuth codes, and secrets.Timezone-correct writes: events are sent as local wall-clock + IANA time zone (never a UTC
Zwith a named zone), so they land at the intended local time.
Troubleshooting
AADSTS50020/ “account does not exist in tenant” / personal-account rejected: the app registration is not set to multitenant + personal accounts, or you used a tenant other thancommon. Recreate/adjust per step 1.3 and keepMICROSOFT_TENANT=common.AADSTS7000218/ “client_assertion or client_secret required”: the app is registered as a confidential/web client. Register it as a public client with “Allow public client flows” = Yes (step 1.6).redirect_urimismatch: addhttp://localhostunder the Mobile & desktop platform.Event lands an hour off: always pass local wall-clock
dateTime(e.g.2026-07-20T10:00:00) with an IANAtimeZone; never aZ-suffixed value. The connector rejectsZ/offset values for event times.“Not signed in” from a tool: run
node dist/index.js loginonce; if it persists,logoutthenloginagain to reset the token cache.npm installtimes out / hangs (dead IPv6 route): force IPv4 —NODE_OPTIONS="--dns-result-order=ipv4first --no-network-family-autoselection" npm install.
Development
npm run dev # rebuild on change (tsup --watch)
npm run typecheck # tsc --noEmit
npm run lint # eslint
npm run format # prettier --write
npm test # vitest (unit + in-memory + built-subprocess smoke)
npm run build:exe # Windows: Node SEA single executable (postject via npx)
npm run build:installer # Windows: Inno Setup installer (needs iscc on PATH)Layout: src/auth (Microsoft OAuth + encrypted token cache), src/graph (Graph client + mail /
calendar / user modules), src/tools (zod schemas + thin handlers), src/setup (client auto-config
the
setup/unsetupcommands),src/util(time, logging, errors, html),src/mcp.ts+src/index.ts(server assembly + stdio entry).
Requirements & design
The authoritative specifications live in docs/:
docs/personal-outlook-mcp-connector-requirements.md— the main build spec (tools, Graph, security, timezone).docs/local-hosting-investigation-and-requirements.md— why/how to host locally (Mode A stdio, chosen here).docs/installer.md— the packaged Windows installer: auto-config engine, one-timeregister-app, and the SEA/Inno build.
License
MIT © 2026 Tony Goodhew
Available Tools
6 toolscreate_eventCreate a calendar eventAIdempotent
Create a calendar event (e.g. a booking, plus separate travel-time blocks). Times are LOCAL wall-clock paired with an IANA time zone (never a UTC 'Z'), so the event lands at the intended local time. A transactionId makes repeated calls idempotent (no duplicates). IMPORTANT: confirm the details (title, date, start/end, timezone, location) with the user BEFORE calling, then echo back the created event.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Event end (local wall-clock + IANA time zone). | |
| body | No | Plain-text notes/body. | |
| start | Yes | Event start (local wall-clock + IANA time zone). | |
| subject | Yes | Event title. | |
| location | No | Location display name. | |
| isReminderOn | No | Whether a reminder is set. | |
| transactionId | No | Idempotency key; if omitted one is generated so retries don't duplicate. | |
| reminderMinutesBeforeStart | No | Reminder lead time in minutes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false, idempotentHint=true, etc.), the description adds key behavioral traits: time zone handling (local wall-clock, never UTC), idempotency via transactionId, and system-side default time zone. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with purpose, and contains only essential information. Every sentence adds value, and important notes are flagged with 'IMPORTANT'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (8 params, nested objects, no output schema), the description covers idempotency, time zone details, confirmation step, and return behavior indirectly (echo back the created event). It is complete enough for correct invocation, though explicit return structure would push it to 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by highlighting the time zone nuance (local wall-clock, never UTC Z) and idempotency key, which go beyond the schema descriptions. This justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Create a calendar event') and includes an example ('e.g. a booking, plus separate travel-time blocks'), clearly distinguishing it from siblings like list_events and update_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises confirming details with the user before calling and echoing back the created event, providing clear usage context. It does not explicitly mention when not to use or list alternatives, but the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_messageRead an emailARead-only
Read a single email message by id, returning subject, sender, receivedDateTime, webLink, the body (HTML converted to plain text by default), and attachment metadata (names/sizes only — no file contents). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The message id (from list_messages). | |
| format | No | Body format. 'text' converts HTML to plain text (default, token-efficient). | text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the body is HTML converted to plain text by default, that attachment metadata excludes file contents, and that it is read-only. Annotations already mark readOnlyHint=true, so the description adds valuable detail beyond what annotations provide. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that clearly states the tool's purpose and key behaviors without extraneous words. Information about attachments is appended concisely. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with two parameters and no output schema, the description covers the input requirement, the parameter options, the return fields, and important limitations (no file contents). It is complete given the tool's simplicity and the presence of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described in the input schema (100% coverage). The description mentions 'by id' and the format parameter's default, but does not add significant meaning beyond the schema's descriptions. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Read a single email message by id'), specifies the return fields (subject, sender, etc.), and distinguishes from sibling tools like list_messages which does not return the full body. The verb 'Read' and resource 'email message' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (when you need full details of one message) and provides context through the 'format' parameter hint. However, it does not explicitly state when not to use it or mention alternatives like list_messages for overviews, though the sibling context makes this clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsList calendar eventsARead-only
List calendar events in a date range (e.g. to check for conflicts before adding a booking). Times are returned in the requested IANA time zone. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max events to return (1-100). | |
| timeZone | No | IANA time zone for the returned times (defaults to the server's DEFAULT_TIMEZONE). | |
| endDateTime | Yes | Range end, ISO 8601. | |
| startDateTime | Yes | Range start, ISO 8601. Include a timezone offset/Z to pin it precisely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and openWorldHint. The description adds the behavioral detail that times are returned in the requested IANA time zone, which is not in annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. Front-loads the main purpose and use case, then adds time zone and read-only behavior. Highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no output schema and rich annotations, the description covers the core operation, example use, and time zone handling. It does not repeat pagination details (already in schema), which is acceptable. The tool is adequately described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the description adds minimal new meaning. It reinforces the timeZone parameter and links start/end to conflict checking, but does not extend beyond schema documentation. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list' and resource 'calendar events', and provides an example use case ('check for conflicts before adding a booking'). It is distinct from sibling tools like create_event, update_event, and get_message due to the list and read-only nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a specific context for use (checking conflicts before a booking) and declares the tool as read-only. While it does not explicitly state when not to use or mention alternatives, the purpose is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_messagesList / search emailARead-only
Search or list email messages (e.g. to find booking or confirmation emails). Read-only. Returns id, subject, sender, receivedDateTime, webLink, a body preview, and hasAttachments, plus a nextPageToken when more results exist. Use get_message to read a full message body.
| Name | Required | Description | Default |
|---|---|---|---|
| from | No | Sender email address to match. | |
| limit | No | Max results (1-25, default 10). | |
| query | No | Free-text keyword search (maps to Graph $search, KQL-style). | |
| pageToken | No | Opaque token from a previous call's nextPageToken. | |
| receivedAfter | No | Only messages received on/after this ISO 8601 date/time. | |
| receivedBefore | No | Only messages received on/before this ISO 8601 date/time. | |
| subjectContains | No | Text the subject should contain. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds value by listing returned fields (subject, sender, etc.) and pagination behavior, going beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. Front-loaded with purpose and key info, followed by actionable advice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately covers return fields and pagination. It addresses the key aspects for a list tool with 7 parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents parameters. The description does not add parameter-level detail beyond the schema, earning baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it searches or lists email messages, provides concrete examples (booking/confirmation emails), and distinguishes from the sibling get_message tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains when to use the tool (find emails) and advises using get_message for full body reads. While not exhaustive, it provides clear guidance relative to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_eventUpdate a calendar eventADestructiveIdempotent
Update an existing calendar event's time, location, subject, or body. Only the fields you provide are changed. Times use LOCAL wall-clock + IANA time zone. Confirm changes with the user before calling.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The event id to update (from list_events). | |
| end | No | New end (local wall-clock + IANA time zone). | |
| body | No | New plain-text body. | |
| start | No | New start (local wall-clock + IANA time zone). | |
| subject | No | New title. | |
| location | No | New location display name. | |
| isReminderOn | No | ||
| reminderMinutesBeforeStart | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint and destructiveHint. The description adds partial-update behavior ('Only the fields you provide are changed.') and clarifies time format (local wall-clock + IANA time zone), which goes beyond annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences each serving a distinct purpose: purpose, partial update, time format, and usage instruction. No redundancy, front-loaded with the most critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters, nested objects, destructive action, and no output schema, the description covers core functionality, partial update, time handling, and user confirmation. Missing return value description, which would be helpful since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, with detailed descriptions for most parameters. The description adds value by summarizing the partial-update nature and time zone handling, complementing the schema without repeating it. Not all params are mentioned, but the schema covers them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Update' and specifies the resource 'an existing calendar event' and some fields (time, location, subject, body). It distinguishes from list/read tools but does not explicitly differentiate from create_event (e.g., by stating not for creation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for modifying existing events and provides a direct instruction to 'Confirm changes with the user before calling.' However, it does not mention when not to use this tool or name alternatives like create_event for new events.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiShow the connected accountARead-only
Return the signed-in Microsoft account's display name and email address. Useful to confirm the correct personal account is connected. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. Description adds 'Read-only' which is consistent but does not add new behavioral context beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with purpose, no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool has no parameters and no output schema, but description explains return values (display name, email) and usage context. Annotations provide safety info, so description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters (0 params), baseline 4. Description does not need to add parameter info since schema is empty.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'return' and resource 'signed-in account's display name and email' clearly state the tool's function. Distinguishes from sibling tools which are about events and messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States it is useful to confirm correct account connected, providing context for when to use. No explicit exclusions or alternatives given, but siblings are distinct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
6 tool updates
v0.1.0- First observed
create_event - First observed
get_message - First observed
list_events - First observed
list_messages - First observed
update_event - First observed
whoami
TDQS
Each tool targets a distinct resource (events, messages, or user) with clearly separate actions, leaving no ambiguity for an agent selecting between them.
All tools follow a consistent verb_noun pattern in snake_case (e.g., list_events, create_event), making the purpose predictable from the name.
With 6 tools covering calendar and email operations, the set is well-scoped for a personal assistant connector—neither too few nor too many.
The tool set covers core read and create operations for events and messages, but lacks delete capabilities for events or send/reply for emails, leaving minor gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Connect any mailbox to Claude, ChatGPT & AI: read, send, reply, schedule & search emails.
Multiple Google accounts (Gmail, Calendar, Drive, Contacts, Tasks) in one Claude connector.
1Manage Microsoft 365 email, calendar, contacts and inbox rules via the Graph API with OAuth 2.0.
Permissioned access to Outlook, OneDrive and Teams via the user's own Microsoft account
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceConnects Claude with Microsoft Outlook through the Graph API, providing comprehensive email, calendar, folder management, and rules creation capabilities.19-
- AlicenseNot gradedqualityCmaintenanceConnects Claude to Microsoft Outlook through the Microsoft Graph API, enabling email management (list, search, read, send) and calendar operations (list, create, accept, decline, delete events) via OAuth 2.0 authentication.1MIT
- FlicenseNot gradedqualityDmaintenanceProvides Claude Desktop and Claude Code with access to Microsoft 365 email and calendar services via the Microsoft Graph API. It enables users to manage emails, search folders, schedule calendar events, and check availability through natural language commands.-
- AlicenseNot gradedqualityBmaintenanceConnects Claude with Microsoft 365 services such as Email, Calendar, Teams, OneDrive, and more through the Microsoft Graph API.6016MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/TGoodhew/Claude-Hotmail-Connector'
If you have feedback or need assistance with the MCP directory API, please join our Discord server