owa-mail-mcp
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., "@owa-mail-mcpShow me my unread emails"
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.
owa-mail-mcp
MCP-сервер к корпоративному Exchange: почта, календарь, справочник людей.
Наружу Exchange отдаёт только /owa/ (EWS SOAP, MAPI, IMAP/SMTP закрыты), поэтому
сервер работает через OWA JSON API (/owa/service.svc) — тот же протокол, что и
веб-клиент OWA, — поверх NTLM.
Подключение
Конфиг MCP-клиента:
{
"mcpServers": {
"owa-mail": {
"command": "uvx",
"args": ["--from", "git+https://github.com/mainpart/owa-mail-mcp.git", "owa-mail-mcp"],
"env": {
"EXCHANGE_USERNAME": "DOMAIN\\user",
"EXCHANGE_PASSWORD": "..."
}
}
}
}Локальный запуск из клона: uv sync && uv run owa-mail-mcp.
Related MCP server: OWA Exchange MCP Server
Переменные окружения
Переменная | Обяз. | Дефолт | Назначение |
| да | — | учётка NTLM, |
| да | — | пароль |
|
| хост OWA | |
|
| кэш сессии (0600), пишется сервером | |
|
|
| |
|
| куда сохраняются вложения | |
|
| Windows-зона для | |
|
| уровень логов (в stderr) | |
| 20 тулов | allowlist видимых тулов (см. «Конфиг») | |
|
| транспорт |
Методы
Служебное:
Метод | Что делает |
| Жив ли сеанс OWA — делает лёгкий запрос к ящику, возвращает |
Почта:
Метод | Что делает |
| Папки с id, счётчиками и непрочитанными ( |
| Список папки или полнотекстовый поиск ( |
| Письмо целиком: тело, получатели, id вложений, ссылки ( |
| Вся переписка по письму или |
| Отправить письмо или сохранить черновик ( |
| Ответить / ответить всем ( |
| Переслать письмо с вложениями |
| Удалить (в «Удалённые» или |
| Пометить прочитанным / непрочитанным |
| Переместить письмо в папку |
Календарь:
Метод | Что делает |
| События за период ( |
| Событие целиком: тело, участники, статусы ответов |
| Какие календари видны и какие из них реально читаются |
| Занятость человека с темами встреч — даже без доступа к папке |
| Свободные для всех слоты в рабочих часах |
| Создать событие или серию, разослать приглашения |
| Изменить событие и уведомить участников ( |
| Отменить своё событие ( |
| Принять / отклонить / под вопросом ( |
Люди, вложения, автоответчик:
Метод | Что делает |
| Справочник: имя/логин/адрес → адрес; при одном совпадении — полная карточка (должность, отдел, телефоны); |
| Скачать вложение на диск |
| Прочитать настройки автоответчика |
| Включить / выключить / по расписанию |
⚙ — выключены по умолчанию, включаются через MCP_ENABLED_TOOLS.
Конфиг
MCP_ENABLED_TOOLS полностью заменяет дефолт — перечисляйте ровно то, что нужно;
пустая строка выключает все тулы.
Включить всё (24 тула):
check_auth,get_folders,find_emails,get_email,get_thread,send_email,reply_email,forward_email,delete_email,mark_email_read,move_email,get_calendar_events,get_event,get_calendars,get_user_availability,find_meeting_time,create_event,update_event,cancel_event,respond_to_event,get_attachment,find_people,get_oof,set_oofТолько чтение:
check_auth,get_folders,find_emails,get_email,get_thread,get_calendar_events,get_event,get_calendars,get_user_availability,find_peopleAvailable Tools
20 toolscancel_eventCancel Calendar EventADestructive
Cancel an event YOU organize and notify the attendees.
The notice reaches them and cannot be recalled. Only the organizer can cancel: asked to cancel someone else's event this refuses rather than quietly deleting your copy — to take it off your own calendar, decline it with respond_to_event.
For a RECURRING event apply_to is required; nothing is cancelled until you
supply it.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | item_id from get_calendar_events. | |
| message | No | explanation carried by the cancellation notice; without one the attendees get a silent cancellation. | |
| apply_to | No | recurring events only — "this_event" cancels just this one, "whole_series" every remaining event in the series. Required when the event is recurring, ignored for one-off events. Ask the user which they meant rather than picking. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description adds crucial behavioral context: the cancellation notice cannot be recalled, the tool refuses to cancel events for non-organizers, and recurring events require apply_to before anything is cancelled. This enriches the annotation without contradiction.
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 and well-structured: three short paragraphs, each serving a distinct purpose (main action, authorization/alternative, recurring rule). No redundancy or filler; every sentence contributes to understanding the tool.
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 annotations, output schema, and full parameter coverage, the description is complete. It covers the action, recipient notification, irreversibility, authorization, alternative tool, and recurring behavior. The output schema exists, so return values need not be explained.
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 baseline is 3. The description adds value by explicitly highlighting the consequence of not supplying apply_to ('nothing is cancelled') and reinforcing that apply_to is required for recurring events, which is useful beyond the schema's static description.
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 explicitly states the action: 'Cancel an event YOU organize and notify the attendees.' It also distinguishes itself from sibling tools by clarifying that only the organizer can cancel and directing users to respond_to_event for declining someone else's event. This is a specific verb+resource with clear sibling differentiation.
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 provides explicit when-to-use and when-not-to-use guidance: it refuses to cancel others' events and directs users to respond_to_event instead. It also specifies that apply_to is required for recurring events, and nothing is cancelled until provided, offering clear procedural guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_authCheck OWA SessionARead-onlyIdempotent
Is the OWA session live? A health check for this MCP connection.
Makes one light authenticated call to the mailbox — not just a cookie-file check — so the answer covers both the credentials and whether the OWA host is reachable, independent of any particular tool.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by specifying that the tool makes one light authenticated call to the mailbox, not just a cookie-file check, and that the result covers both credentials and host reachability. This adds useful behavioral context about the network call involved, which annotations do not 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?
The description is compact and front-loaded with the primary purpose ('Is the OWA session live?'). The additional sentence provides essential detail about the method without redundancy. Every sentence serves a purpose.
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 tool's simplicity (no parameters) and the presence of an output schema, the description fully explains what the tool does, how it works, and its scope. There are no significant gaps.
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?
The tool has zero parameters, so the description correctly focuses on behavior rather than parameter syntax. The baseline for a no-parameter tool is 4, and the description adds no unnecessary parameter details.
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 defines the tool as a health check for the OWA session, using a specific verb ('check') and resource ('session'). It distinguishes itself from sibling tools (e.g., get_folders, send_email) by explaining it verifies connection health rather than performing a mailbox operation.
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 provides clear context for when to use the tool: to check if the OWA session is live and the host reachable. It notes that it is independent of any particular tool, implying it is a general connectivity check. While it doesn't explicitly name alternatives or exclusions, the unique purpose makes the intended use obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_eventCreate Calendar EventA
Create a calendar event, one-off or recurring, and invite attendees.
With no attendees this is a private appointment and nothing is sent.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | end of the FIRST occurrence, ISO 8601. | |
| body | No | agenda / description. | |
| start | Yes | start time, ISO 8601 (e.g. "2026-07-21T15:00:00"). | |
| repeat | No | makes it a series. | |
| subject | Yes | meeting title. | |
| location | No | room or place, free text. | |
| attendees | No | required attendees — addresses or names (an ambiguous name is refused and nothing is created; pass an exact address). | |
| body_type | No | "HTML" or "Text". | HTML |
| repeat_days | No | weekly only — "Monday" or "Monday Wednesday Friday". Defaults to the weekday of `start`. | |
| repeat_count | No | end after N occurrences. | |
| repeat_until | No | end on this date, ISO 8601. Ignored when repeat_count is set; with neither, the series never ends. | |
| repeat_interval | No | every N days/weeks/months. | |
| reminder_minutes | No | reminder lead time; 0 sets no reminder. | |
| optional_attendees | No | optional attendees, same format. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint false, destructiveHint false, and idempotentHint false, so the agent knows it's a non-destructive write. The description adds valuable behavioral context: with no attendees, it becomes a private appointment and nothing is sent. This goes beyond annotations and clarifies the invitation behavior.
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, front-loaded with the core action, and no filler. Every word earns its place. The second sentence adds crucial behavioral nuance without bloating the description.
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 14 parameters, full schema descriptions, and an output schema, the description need not re-explain return values or parameter details. It covers the essential high-level behavior (creation, recurrence, attendee invites, privacy). Slightly more context about when recurrence or attendees are used could help, but the schema and annotations fill that gap adequately.
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 description coverage is 100%, so the baseline is 3. The overall description does not add parameter-specific meaning beyond what the schema already provides; it only mentions invite attendees, which is also captured in the attendees parameter description. No additional semantic value is added.
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 ('Create a calendar event'), the resource (calendar event), and key distinctions (one-off or recurring, invite attendees). It is easily distinguishable from sibling tools like get_calendar_events, update_event, and cancel_event by its explicit create verb and scope.
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 context (creating events) but does not explicitly state when to use this tool over alternatives or provide exclusions. The note about no attendees affecting privacy is a usage condition, but no alternative tools are mentioned. It is adequate but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_emailDelete EmailADestructive
Delete an email — to Deleted Items by default.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | item_id from find_emails. | |
| hard_delete | No | purge irrecoverably instead of moving to Deleted Items. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive, and the description adds the important qualifier that deletion moves to Deleted Items by default. It doesn't highlight that hard_delete is irrecoverable, but the schema covers that; 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?
One short sentence that is front-loaded and contains no filler. It states the action and the key default behavior efficiently.
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 delete operation with full schema coverage, annotations, and output schema, this description is mostly sufficient. It lacks explicit usage alternatives, but the name and siblings make the purpose clear; a small mention of hard_delete's irreversibility would improve completeness but is not necessary given schema.
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 covers both parameters at 100% with descriptions. The description's phrase 'to Deleted Items by default' reinforces the hard_delete default but adds no information beyond schema; 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?
Description uses specific verb 'Delete' and resource 'email', and adds default behavior 'to Deleted Items'. This clearly distinguishes from sibling event actions and makes the tool's scope obvious.
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?
No explicit when-to-use or when-not-to-use guidance is provided. Usage is implied by the tool name and sibling context, but the description doesn't discuss alternatives or conditions like when a hard delete is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_emailsFind EmailsARead-onlyIdempotent
List emails in a folder, or search the whole mailbox by text.
Newest first. Bodies are not included — a row carries a short preview at
most; full body, attachment ids and links come from get_email.
A listing answers with total/has_more and both continuations, next_offset and next_cursor — take either for the next page. A search has neither a total (the server reports 0 whatever it found) nor a cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | next_cursor from the previous answer. Does not drift. Not combinable with offset, with query, or with limit=200. | |
| limit | No | ||
| query | No | full-text search over the OWA index — subject, body and sender, Exchange KQL (e.g. 'премия' or 'from:ivanov отчёт'). Finds old mail the web client finds. Omitted → plain folder listing. | |
| folder | No | well-known name, custom folder name, or FolderId. With `query`, search covers the whole mailbox unless you narrow it here. | inbox |
| offset | No | skip this many rows. Drifts when mail arrives during a walk. | |
| granularity | No | with `query` only. A thread row lists only the messages that matched, not the whole conversation — for that use get_thread. | threads |
| unread_only | No | filtered by the server on both routes, so it reaches the whole folder or index rather than the page in hand. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses important behaviors: newest-first ordering, bodies omitted, pagination via total/has_more and both continuations, and unusual search behavior (total reports 0, no cursor). This adds significant context not available from 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 compact yet information-dense, front-loaded with the core purpose. Every sentence contributes meaningful detail, and the structure flows logically from function to limitations to pagination specifics.
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 7 parameters and output schema, the description covers all essential operational aspects: listing vs search, result contents, pagination mechanics, and exceptions. It is complete enough for an agent to select and invoke the tool correctly without further documentation.
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 high (86%), so baseline is 3. The description adds value by explaining how pagination parameters work in context ('take either for the next page') and clarifying that search lacks next_cursor, which goes beyond individual parameter descriptions.
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 tool lists emails in a folder or searches the whole mailbox by text. It distinguishes itself from siblings like get_email and get_thread by explicitly noting bodies are excluded and pointing to get_email for full content.
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 provides explicit guidance for when to use this tool vs alternatives: 'full body, attachment ids and links come from get_email' and mentions 'for that use get_thread' in the schema. It also clarifies the two modes (folder listing vs search) and relevant pagination behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_meeting_timeFind Meeting SlotsARead-onlyIdempotent
Concrete meeting slots where everyone is free, in working hours.
Feed a chosen slot straight into create_event. Slots are computed from each attendee's actual busy blocks (absolute times), not from the merged free/busy string — that string comes back shifted by the mailbox time zone on this server and would place meetings on top of existing ones.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | search window end. Default start + 7 days. | |
| limit | No | ||
| start | No | search window start, ISO 8601. Default now. | |
| people | Yes | attendees — addresses or names (an ambiguous name is refused). | |
| work_end | No | end of working hours, local "HH:MM". | 19:00 |
| work_start | No | start of working hours, local "HH:MM". | 09:00 |
| skip_weekends | No | ignore Saturday and Sunday. | |
| duration_minutes | No | meeting length. | |
| tentative_is_busy | No | count tentatively-accepted meetings as busy; False allows double-booking over them. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a significant behavioral detail: slots are computed from actual busy blocks (absolute times) rather than the merged free/busy string, which is shifted by the mailbox time zone and would cause double-booking. This goes well beyond the annotations and gives the agent critical information about correctness.
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 two sentences, front-loading the purpose and then adding a crucial caveat. Every sentence contributes value, with no fluff or repetition of schema/annotation content.
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 9-parameter tool with rich annotations and an output schema, the description covers the key purpose, the critical timezone pitfall, and a clear integration path to create_event. It provides the essential behavioral context an agent would need to use the tool correctly.
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 description coverage is 89%, so the schema already documents most parameters. The description adds context about working hours and the output feeding into create_event, but does not detail individual parameter semantics beyond that. A baseline score of 3 is appropriate given the high schema coverage.
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 states a specific purpose: finding concrete meeting slots where all attendees are free during working hours. It clearly distinguishes itself from siblings like get_user_availability by emphasizing 'everyone is free' and by suggesting a direct follow-up to create_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 provides clear context: use this tool to find common free slots, and then feed the result into create_event. It also warns about the timezone-shifted merged free/busy string, implying this tool is the accurate choice. However, it does not explicitly name alternative tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_peopleFind PeopleARead-onlyIdempotent
Look someone up in the corporate address book.
A single match comes back with the full card — job title, department, office,
phones. Several come back as a compact list, each with the exact SMTP address
send_email and create_event want. has_more only means the page came back
full: the directory reports no honest total.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | name, login, or part of an address. | |
| offset | No | skip this many matches — how to reach the ones past `limit`. | |
| details | No | expand the top matches with title/department/phones even when there are several (one lookup per expanded person). A single match is always expanded regardless. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive, so the safety profile is covered. The description adds valuable non-obvious behavior: single match returns full card vs. compact list for multiple matches, and the has_more caveat that it only means the page is full, not an honest total. This exceeds the structured data.
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 two short paragraphs, front-loaded with the purpose. Every sentence earns its place: the first defines the action, the second explains single vs. multiple results and the SMTP address relevance, and the third clarifies has_more behavior. No wasted 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?
For a read-only lookup tool with an output schema and strong annotations, the description covers purpose, result format nuances, pagination caveat, and integration points with sibling tools. The output schema handles detailed return fields, so the description is complete for an agent to select and invoke correctly.
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% (limit lacks a description), so the baseline is 3. The description does not add new parameter-level semantics beyond what the schema already provides for query, offset, and details. It indirectly references details expansion but does not explain parameter syntax or constraints further.
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 opens with a specific verb and resource: 'Look someone up in the corporate address book.' It clearly distinguishes this tool from siblings like find_emails or get_calendar_events by focusing on people lookup, and even mentions how results feed into send_email and create_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 implies when to use this tool: when you need to look up a person and obtain their SMTP address for other tools like send_email and create_event. It does not explicitly state when not to use it or name alternative people-search tools, but the context is clear enough among the given siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forward_emailForward EmailADestructive
Forward an email with its attachments. Sends immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | recipients — addresses or names (an ambiguous name is refused and nothing is sent; pass an exact address). | |
| body | No | note added above the forwarded content. | |
| item_id | Yes | item_id of the message to forward. | |
| body_type | No | "HTML" or "Text". | HTML |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint=true), the description adds 'Sends immediately,' which signals that the action is executed without delay, and 'with its attachments,' clarifying that attachments are preserved. 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?
Two short sentences that immediately state the core function and a behavioral note. No wasted 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?
Given the simple forward operation, the description covers the primary behavior and timing. The schema and output schema provide parameter and response details. It could have noted that it requires an existing item, but the schema makes that clear.
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?
All 4 parameters are fully documented in the schema with descriptions (100% coverage), so the description's omission of parameter details is acceptable. The description itself does not add parameter semantics beyond the schema.
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 the specific verb 'Forward' and identifies the resource ('an email with its attachments'), clearly distinguishing it from send/reply tools. The phrase 'with its attachments' adds a key characteristic.
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 no guidance on when to use this tool versus alternatives like 'send_email' or 'reply_email'. No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attachmentDownload AttachmentA
Download an attachment to disk and return its path.
Works for both mail and calendar attachments.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | No | override the server-supplied file name. | |
| target_dir | No | destination directory. Default /tmp/attachments (override with EXCHANGE_ATTACHMENT_DIR). | |
| attachment_id | Yes | attachment_id from get_email or get_event. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, so the description's 'download to disk' aligns with that. It adds the return-path behavior and the mail/calendar applicability. However, it doesn't disclose pitfalls like filename collisions or permission requirements. With annotations covering the safety profile, a 3 is appropriate.
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 the core action. No redundant 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?
The combination of annotations, 100% schema coverage, and the description's clear scope makes the tool usable. The only missing context (where attachment_id comes from) is provided by the parameter description. Output schema exists, so return values need no explanation. A 4 reflects a minor gap: no explicit workflow advice, though it's implied.
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?
The input schema covers 100% of parameters with descriptions, and the description itself contains no parameter details. It relies on the schema, which already explains attachment_id source, filename override, and target_dir default. 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 uses a specific verb ('Download') and resource ('attachment'), stating it saves to disk and returns a path. This clearly distinguishes it from sibling tools like get_email or get_event, which handle the parent objects.
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 explicitly states it works for both mail and calendar attachments, giving clear scope. It doesn't mention alternatives or when-not-to-use, but no direct alternative exists among siblings. This is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calendar_eventsList Calendar EventsARead-onlyIdempotent
Calendar events in a time window, recurrences expanded.
is_recurring on a row means it is one occurrence of a series: changing,
cancelling or declining that row needs an explicit apply_to in the write
tools.
There is no paging and nothing to page — the whole window is read every call,
so total is exact. Narrow the answer by moving start/end.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | window end. Default start + 7 days. | |
| limit | No | safety cap on the size of the answer, not a page — a window with more events than this is cut and the answer says so. | |
| start | No | window start, ISO 8601 (e.g. "2026-07-20T00:00:00"). Default now. | |
| folder | No | calendar folder. | calendar |
| person | No | read someone else's calendar — address or name (an ambiguous name is refused). Works only if they shared the calendar folder with you, otherwise the call fails with "Доступ запрещён"; for anyone else use get_user_availability. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits beyond annotations: recurrences are expanded, there is no paging so 'total' is exact, and modifying recurring occurrences requires an explicit 'apply_to' in write tools. Annotations already confirm read-only and idempotent, and the description adds rich operational context without contradicting them.
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 three short, focused paragraphs. The first sentence delivers the core function, the second explains recurrence implications, and the third covers paging behavior and tuning. Every sentence earns its place with no filler.
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 read-only listing tool, this description covers the essential behavioral quirks: recurrence expansion, exact totals due to no paging, and how to narrow results. The output schema exists, so return structure is already defined. The description is notably complete for the tool's complexity.
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?
All 5 parameters have thorough schema descriptions with 100% coverage. The main description adds cross-parameter context, such as 'the whole window is read every call' and how 'limit' acts as a safety cap, clarifying the interaction between start, end, and limit beyond the individual parameter descriptions.
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 states exactly what the tool does: 'Calendar events in a time window, recurrences expanded.' This clearly distinguishes it from siblings like get_event (single event) and get_user_availability. The verb and resource 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 provides explicit context: 'There is no paging and nothing to page — the whole window is read every call' and advises 'Narrow the answer by moving start/end.' It also mentions an explicit alternative in the person parameter description: 'for anyone else use get_user_availability.' It lacks a direct 'when not to use' contrast with get_event, but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calendarsList CalendarsARead-onlyIdempotent
List the calendars in your sidebar — yours and colleagues' — and who you can read.
A colleague's calendar being listed does NOT mean it is readable: the entry
looks identical either way, and only a read attempt tells them apart — hence
check_access. When someone's calendar is closed, their schedule WITH
MEETING SUBJECTS is usually still available via get_user_availability.
| Name | Required | Description | Default |
|---|---|---|---|
| check_access | No | probe each colleague's calendar with a one-day read and report `access` as "readable" or "denied". Costs one call per colleague; False leaves `access` as "unknown". |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses key behaviors: listing does not guarantee readability, access requires a probe request, check_access incurs a per-colleague cost, and closed calendars may still expose meeting subjects via get_user_availability. This adds significant non-obvious context.
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 and front-loaded. The first sentence summarizes the core function, and the second paragraph adds important nuance without redundancy. Every sentence contributes value.
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?
The description covers the listing purpose, access semantics, probe cost, and a relevant alternative tool. With an output schema present, return value details are already handled externally. It fully addresses the openWorldHint by mentioning colleagues' calendars and the access uncertainty.
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?
The input schema already provides a thorough description of check_access, including its cost and effect. The tool description adds motivation for why the parameter exists but no new parameter-level details, so it does not exceed the schema coverage baseline.
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 tool lists calendars in the sidebar, including whose calendars are accessible. This is a specific verb+resource+scope, distinguishing it from sibling tools like get_calendar_events and get_user_availability.
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 practical context: it explains when check_access is needed, notes that a listed calendar may not be readable, and points to get_user_availability as an alternative for meeting subjects on closed calendars. It lacks explicit 'when not to use' but provides clear situational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_emailRead EmailARead-onlyIdempotent
Full email: body, all recipients, and attachment ids for get_attachment.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | item_id from find_emails. | |
| body_format | No | text strips the HTML, html returns it raw. | text |
| include_links | No | also return the links extracted from the body. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description adds behavioral context by specifying the response includes body, all recipients, and attachment IDs, which is useful for understanding what the tool returns. 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 sentence with high information density, front-loaded with 'Full email.'
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?
The tool has an output schema, and the description covers the key return contents. With 3 params all documented, the description is adequate for a simple read tool.
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%, with descriptions for item_id, body_format, and include_links. The description does not add additional parameter semantics beyond the schema, so 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 states 'Full email: body, all recipients, and attachment ids for get_attachment.' This clearly identifies the tool as a read operation for retrieving the complete email, distinguishing it from siblings like find_emails (search) and get_attachment (fetches attachments).
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 when you need the full email content and attachment IDs, specifically noting the dependency on get_attachment. It does not explicitly mention when not to use it, but provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventRead Calendar EventARead-onlyIdempotent
Full calendar event: body, attendees with response status, attachment ids.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | item_id from get_calendar_events. | |
| body_format | No | text strips the HTML, html returns it raw. | text |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint: false, so the safety profile is covered. The description adds what specific data fields are returned (body, attendees, attachment IDs), but does not disclose any additional behavioral traits such as error conditions or external dependencies.
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 concise phrase, front-loaded with the key concept 'Full calendar event', and every word adds value. No superfluous information or repetition.
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 presence of an output schema and strong annotations (read-only, idempotent), the description adequately complements the structured data. It highlights the key return elements without needing to explain return values in detail, and the tool is simple enough that the description is sufficient.
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%, with item_id described as coming from get_calendar_events and body_format explained as text vs html. The description does not add any parameter-specific semantics beyond what the schema already provides, so the baseline score applies.
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 specifies that the tool returns a full calendar event including body, attendee response statuses, and attachment IDs. This distinguishes it from siblings like get_calendar_events (list) and get_attachment (single attachment), even though it lacks an explicit verb.
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 provides no guidance on when to use this tool versus alternatives. It does not mention that it retrieves a single event by ID or contrast it with get_calendar_events, so usage context must be inferred from the name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_foldersList Mail FoldersARead-onlyIdempotent
List mail/calendar folders with their ids, item counts and unread counts.
Use it to turn a custom folder name into the FolderId find_emails and
move_email accept. total is the server's own count of folders in view, so it
is trustworthy.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Deep walks the whole subtree, Shallow only the direct children. | Deep |
| limit | No | ||
| offset | No | skip this many folders — how to reach the ones past `limit`. | |
| parent | No | well-known name ("msgfolderroot", "inbox", …) or a FolderId. | msgfolderroot |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond the annotations: it mentions the output includes item counts and unread counts, explains that 'total' is the server's own count and trustworthy, and hints at depth behavior. This complements the readOnly/idempotent 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 three sentences, front-loaded with the main function, and every sentence adds value. It is concise without being under-specified.
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 presence of an output schema and strong annotations, the description is fairly complete. It covers the purpose, output contents, and a key use case. It doesn't explicitly describe pagination behavior, but the offset parameter description covers that; the note about 'total' adds trustworthiness.
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 description coverage is 75%, so the schema already explains most parameters (depth, offset, parent). The description adds a use case (folder name to FolderId) that implies parent semantics, and the note about 'total' helps interpret pagination. However, it doesn't explain limit/offset beyond what the schema provides.
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 function: 'List mail/calendar folders with their ids, item counts and unread counts.' It also specifies the primary use case of converting folder names to FolderIds for find_emails and move_email, which distinguishes it from sibling tools like get_calendars.
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 explicitly says when to use the tool ('Use it to turn a custom folder name into the FolderId find_emails and move_email accept'), providing clear context. It doesn't explicitly mention alternatives, but given the sibling tools list, the intended use is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_threadRead Email ThreadARead-onlyIdempotent
Every email in a conversation, newest first — the whole back-and-forth.
The only way to read a thread in full: search returns just the messages that matched, get_email returns one. Bodies are not included — follow up with get_email on the messages you need.
has_more only says the thread hit limit: this action has no offset and no
cursor, so raise limit to see the rest.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| item_id | Yes | any message of the thread (item_id from find_emails or get_email), or the conversation_id itself. | |
| include_deleted | No | also include messages sitting in Deleted Items. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behaviors not covered by annotations: bodies are excluded, messages are ordered newest first, and the meaning of 'has_more' with no offset/cursor is explained. This adds significant transparency beyond readOnlyHint and idempotentHint.
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 four sentences, each conveying essential information without redundancy. It front-loads the core purpose and immediately follows with usage distinctions and caveats, maximizing clarity per word.
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 presence of an output schema, the description need not list return fields. It covers the thread scope, ordering, body exclusion, and pagination limitations, making it fully complete for a read operation with no unsupported scenarios.
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?
The description adds meaning to the 'limit' parameter by explaining that raising it is the only way to see more results since there is no offset/cursor. It also reiterates that item_id can be a conversation_id, though the schema already states this. This compensates for the schema's lack of description on 'limit'.
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 specifies the tool's function: reading an entire email conversation, ordered newest first. It distinguishes itself from sibling tools by explicitly contrasting with search (which only returns matched messages) and get_email (which returns a single message), making the unique purpose 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 explicitly states when to use this tool: 'The only way to read a thread in full' and contrasts it with search and get_email. It also provides follow-up guidance on using get_email for message bodies, giving clear decision-making context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_availabilityRead Free/Busy ScheduleARead-onlyIdempotent
Read someone's schedule: their busy blocks, WITH MEETING SUBJECTS.
Works for a colleague who has not shared their calendar folder, where
get_calendar_events(person=…) needs exactly that sharing and otherwise fails
with "Доступ запрещён". Subjects appear when their sharing level exposes
details; otherwise subject is null and the busy intervals remain.
For "when can we all meet?" use find_meeting_time.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | window end. Default start + 7 days. | |
| start | No | window start, ISO 8601. Default now. | |
| people | Yes | addresses or names to check (an ambiguous name is refused). | |
| interval | No | minutes per slot in the merged status string. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds valuable behavioral nuance beyond that: subjects appear conditionally based on sharing level, otherwise subject is null but busy intervals remain. It also documents the exact failure mode of get_calendar_events, giving agents practical expectations without contradicting the 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 compact and front-loaded: the first sentence gives the core function, the second paragraph explains an important edge case and sibling distinction, and the third gives a pointer to an alternative. No filler words; 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?
Given the output schema and annotations, the description is complete enough. It covers the core use case, the key edge case (unshared calendars), the conditional subject behavior, and points to the alternative tool for a different scenario. The output schema handles return value details, so the description does not need to enumerate them.
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% for all 4 parameters, each with descriptions and defaults, so the baseline is 3. The description does not add new parameter-level semantics, but it does indirectly mention the output field 'subject' and how sharing level affects it, which relates to the people parameter. Still, the schema carries the main burden.
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 states a specific verb and resource: 'Read someone's schedule: their busy blocks, WITH MEETING SUBJECTS.' It also distinguishes itself from sibling tools by explicitly mentioning that get_calendar_events requires calendar sharing and that find_meeting_time is for group availability, making the tool's unique purpose clear.
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?
Provides direct usage guidance: 'Works for a colleague who has not shared their calendar folder' versus get_calendar_events which fails without sharing. It also gives a clear alternative for a different scenario: 'For "when can we all meet?" use find_meeting_time.' This is explicit when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_emailReply to EmailADestructive
Reply to an email, quoting the original. Sends immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | your reply text — prepended above the quoted original. | |
| item_id | Yes | item_id of the message being replied to. | |
| body_type | No | "HTML" or "Text". | HTML |
| reply_all | No | reply to every recipient, not just the sender. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, so the description adds valuable context: it 'sends immediately' and 'quoting the original,' which warns the user that the action is irreversible and affects the email thread. This goes beyond the structured annotations without contradicting them.
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 compact and front-loaded: two sentences that convey the core purpose, the quoting behavior, and the immediate-send consequence. Every word earns its place with no filler or repetition.
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 output schema, full annotation coverage, and complete parameter descriptions, the description sufficiently covers the tool's primary behavior. It could mention that replying includes the original text or the immediate-send consequence, which it does. Minor gaps like potential attachments or undo options are not necessary given the structured metadata.
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?
The input schema covers 100% of parameters with descriptions, so the description does not need to repeat them. However, it adds no new parameter-level context beyond what the schema already provides, such as the significance of body_type or reply_all. The baseline of 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 ('Reply to an email'), the resource (email), and key behavior (quoting the original, sending immediately). This distinguishes it from sibling tools like send_email and forward_email, which send new emails or forward existing ones.
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 (when you want to reply to an existing email) but does not explicitly contrast with alternatives like send_email or forward_email, nor provide exclusions. There is no 'when not to use' guidance, so it falls at the implied-usage level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
respond_to_eventRespond to InvitationAIdempotent
Accept, decline or tentatively accept an event invitation.
For a RECURRING event apply_to is required, and it matters: declining the
series tells the organizer you are out of every future meeting, and a sent
decline cannot be recalled. Nothing is sent until you supply it.
| Name | Required | Description | Default |
|---|---|---|---|
| comment | No | text sent to the organizer along with the answer. | |
| item_id | Yes | item_id from get_calendar_events. | |
| apply_to | No | recurring events only — "this_event" answers for just this one, "whole_series" for the whole series. Required when the event is recurring, ignored for one-off events. Ask the user which they meant rather than picking. | |
| response | Yes | ||
| notify_organizer | No | mail the organizer; False records the answer silently. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals critical behavioral traits beyond annotations: apply_to is required for recurring events and has material consequences, a sent decline cannot be recalled, and nothing is sent until the user supplies it. These details add significant context beyond the annotations (readOnlyHint false, idempotentHint true, destructiveHint false) and help the agent understand side effects and timing. 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 compact and front-loaded: the first sentence states the core purpose immediately. The following two sentences provide necessary warnings about recurring events and sent declines without redundancy. Every sentence earns its place, and the structure aids quick comprehension.
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 tool has 5 parameters, an output schema, and moderate complexity, the description covers the most critical context (recurring event handling, irreversibility, and the fact that nothing is sent automatically). It does not elaborate on return values or authentication, but the output schema likely handles return details. The only minor gap is that it doesn't explicitly say what happens for one-off events, though the schema implies apply_to is ignored.
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?
The input schema already provides descriptions for all parameters (80% coverage). The description adds valuable nuance for apply_to, explaining that it is required for recurring events and that its choice carries irreversible implications. It also clarifies that nothing is sent until the user supplies the response, which indirectly highlights the notify_organizer parameter's default behavior. This goes beyond a simple restatement of schema fields.
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 begins with a specific verb and resource: 'Accept, decline or tentatively accept an event invitation.' It clearly identifies the tool's function as responding to invitations, which distinguishes it from siblings like create_event, update_event, or cancel_event. No ambiguity about what the tool does.
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 provides strong usage guidance for recurring events: apply_to is required, and it tells the agent to ask the user which they meant rather than guessing. It also warns about consequences (declining the series means out of all future meetings) and that a decline cannot be recalled. However, it does not explicitly state when to use this tool versus alternatives like send_email or create_event, so it misses explicit sibling differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_emailSend EmailADestructive
Send an email, or save it to Drafts. Sending is immediate — no confirmation step.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | extra recipients, same format as `to`. | |
| to | Yes | recipients — addresses, or names. A name that matches several people or none is refused and nothing is sent; pass an exact address. | |
| bcc | No | extra recipients, same format as `to`. | |
| body | Yes | ||
| draft | No | save to Drafts instead of sending. Returns the draft's item_id; the user finishes and sends it from Outlook/OWA. | |
| subject | Yes | ||
| body_type | No | "HTML" or "Text". | HTML |
| save_copy | No | keep a copy in Sent Items. Ignored for a draft. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a destructive write operation (destructiveHint=true, readOnlyHint=false). The description adds useful behavioral context by stating 'Sending is immediate — no confirmation step,' which informs the agent that the action is irreversible and immediate. It also introduces the draft-saving mode, going beyond the annotation baseline.
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 two sentences, front-loaded with the main purpose, and contains no filler. Every word adds value, making it perfectly concise and well-structured.
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?
The description covers both primary modes (send and draft) and highlights the immediacy of sending. The schema and output schema handle parameter details and return values, so the description is adequately complete for a tool with complex parameters, though it doesn't mention the recipient-ambiguity risk (which is addressed in the schema).
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?
The schema description coverage is 75%, meaning most parameters are already documented. The description adds minimal parameter-specific meaning, only indirectly referencing the `draft` parameter via 'save it to Drafts.' Since coverage is not high enough to warrant a 3 baseline automatically and the description doesn't compensate, a 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 primary action ('Send an email') and the alternative ('save it to Drafts'), with a specific verb and resource. This distinguishes it from sibling tools like reply_email and forward_email, which focus on different email operations.
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 provides clear context for sending a new email or saving a draft, but it does not explicitly mention when to use this tool versus replying or forwarding, nor does it mention any exclusions or alternatives. This is a clear but basic usage description without comparative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_eventUpdate Calendar EventADestructive
Change an existing event and notify attendees. Only the fields you pass change.
For a RECURRING event apply_to is required, and nothing is changed until you
supply it.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | new end time, ISO 8601. | |
| body | No | ||
| start | No | new start time, ISO 8601. | |
| item_id | Yes | item_id from get_calendar_events. | |
| subject | No | ||
| apply_to | No | recurring events only — "this_event" changes just this one, "whole_series" every event in the series. Required when the event is recurring (get_calendar_events marks those with is_recurring), ignored for one-off events. Ask the user which they meant rather than picking. | |
| location | No | ||
| body_type | No | "HTML" or "Text" — applies to `body`. | HTML |
| send_updates | No | send the update to attendees. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint and readOnlyHint, but the description adds valuable context beyond them: it notifies attendees, only applies to passed fields (not a full replace), and for recurring events nothing changes until apply_to is supplied. These are meaningful behavioral details.
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 two short, purposeful sentences. The first states the action and side effect; the second clarifies the recurring-event constraint. No filler or repetition—concise and well-structured.
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 tool with recurring-event complexity and attendee notifications, the description covers the essential behaviors: partial update, notification, and the apply_to requirement. An output schema exists, so return details are not necessary. It lacks error/edge-case guidance but is sufficient for most scenarios.
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 67% and the schema already documents key parameters like apply_to, body_type, and send_updates in detail. The description's mention of apply_to being required repeats schema info without adding new meaning. It also does not compensate for the three undocumented parameters (body, subject, location).
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 ('Change') and resource ('existing event'), and includes 'notify attendees' which distinguishes it from create/cancel/respond siblings. It also clarifies the partial-update behavior, making the tool's purpose unmistakable.
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 clearly implies use for modifying existing events ('Change an existing event') and provides context for recurring events (apply_to required). However, it does not explicitly name alternative tools or state when not to use it, so it falls short of full usage guidance.
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.
20 tool updates
v0.1.0- First observed
cancel_event - First observed
check_auth - First observed
create_event - First observed
delete_email - First observed
find_emails - First observed
find_meeting_time - First observed
find_people - First observed
forward_email - First observed
get_attachment - First observed
get_calendar_events - First observed
get_calendars - First observed
get_email - First observed
get_event - First observed
get_folders - First observed
get_thread - First observed
get_user_availability - First observed
reply_email - First observed
respond_to_event - First observed
send_email - First observed
update_event
TDQS
Most tools target a distinct action and resource, but get_folders and get_calendars have slight overlap since both list folders for mail/calendar. The descriptions clarify the distinction, so ambiguity is low.
All tool names follow a consistent verb_noun pattern in lowercase snake_case. Verbs like get, find, send, create, and update are used predictably, making the API easy to learn and navigate.
At 20 tools, the server is heavier than the typical 3-15 range. While the dual email/calendar scope justifies the number, it falls into the 'heavy' category and could feel overwhelming for agents.
Calendar operations are well-covered with full CRUD and response handling, but the email side has significant gaps: get_folders references move_email, which does not exist, and there is no update or edit operation for emails. This creates dead ends for workflows involving moving or modifying messages.
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
An MCP server that provides email capabilities, hosted on Alpic platform
An MCP server that provides email capabilities, hosted on Alpic platform
An MCP server that provides email capabilities, hosted on Alpic platform
MCP server for Nylas — read email, calendars, events and contacts, and send email or create events.
Related MCP Servers
- AlicenseCqualityBmaintenanceSecure MCP server for on-prem Microsoft Exchange (EWS) with tools for email, calendar, contacts, folders, attachments, and free/busy availability.315MIT
- AlicenseAqualityDmaintenanceMCP server for any Microsoft Exchange / OWA deployment. Gives LLM agents access to email, calendar, directory search, folders, availability, and meeting analytics via 30 tools.307MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for sending and managing Microsoft Outlook email via the Microsoft Graph API, including drafts, replies, contacts, and directory search.114MIT
- AlicenseNot gradedqualityAmaintenanceA local MCP server for on-premises Microsoft Exchange, connecting via EWS and NTLM. It provides mail, template, availability, and calendar workflow tools through stdio, with draft-first safety and Windows Credential Manager integration.7MIT
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/mainpart/owa-mail-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server