Skip to main content
Glama
marlonluo2018

Microsoft Graph MCP Server

Microsoft Graph MCP Server

A beautifully simple way to give your AI assistant superpowers inside Microsoft 365.

This project turns Microsoft Graph into an easy‑to‑use MCP server — so Claude, your custom agents, or any MCP client can instantly work with your Email, Calendar, and Contacts.

No Azure setup. No Graph API knowledge. Just install → sign in → your AI becomes a Microsoft 365 power user.


⭐ Why Developers Love This Project

  • Your AI can read, search, reply to, and organize email naturally

  • Batch email operations — delete or archive multiple emails in ONE call (no more one-by-one!)

  • It understands and manages your calendar with real availability checks

  • It handles contacts with simple MCP tools

  • It works securely using Microsoft's device login — no secrets, no risk

  • It just works on local machines with zero configuration

This is the fastest way to make your AI agent actually useful at work.

If this project saves you time:
👉 Please star the repo — it really helps!Star on GitHub


Related MCP server: Microsoft Graph MCP Server

🚀 Quick Start

1. Install

pip install -r requirements.txt

Multimodal Support: Image compression requires Pillow>=10.0.0 (included in requirements.txt). If not installed, images will be returned without compression.

Or:

pip install uv
uvx .

Open:

%APPDATA%/Claude/claude_desktop_config.json

Choose one of the following configuration methods:

Method 1: Using uv run (Recommended)

{
  "mcpServers": {
    "microsoft-graph": {
      "command": "uv",
      "args": ["run", "--directory", "<path-to-your-local-repo>", "microsoft-graph-mcp-server"]
    }
  }
}

Recommended: This method uses your local code directly, so changes take effect immediately without reinstalling.

Method 2: Using uvx (Local Path)

{
  "mcpServers": {
    "microsoft-graph": {
      "command": "uvx",
      "args": ["--from", "<path-to-your-local-repo>", "microsoft-graph-mcp-server"]
    }
  }
}

Note:

  • First time or after code changes, run: uv tool install --force <path-to-your-local-repo>

  • uvx caches the package, so you need to reinstall to pick up code updates

Method 3: Using python -m

{
  "mcpServers": {
    "microsoft-graph": {
      "command": "py",
      "args": ["-m", "microsoft_graph_mcp_server"]
    }
  }
}

Note:

  • Windows: Use py (Python Launcher) which automatically finds your Python installation

  • Linux/Mac: Replace py with python or python3

  • Run from the project directory or install via pip install -e .

3. Sign In

In Claude, simply ask: "Please help me sign in to Microsoft Graph"

Claude will call:

{
  "tool": "auth",
  "action": "start"
}

Follow the link → enter the code → sign in.
Then tell Claude: "I have completed the browser login"

Then Claude will finalize:

{
  "tool": "auth",
  "action": "complete"
}

You're connected. Your AI assistant now has Microsoft 365 access.


🌟 What Your AI Can Do

Below is the friendly but complete feature overview — designed to impress potential users and help people understand the project's power at a glance.


Copy the system prompt to your AI assistant configuration:

SYSTEM_PROMPT.md

For Claude Desktop, add to your project or custom instructions. This provides:

  • Smart workflow selection (AI auto-chooses Quick Mode for simple emails, Full Mode for complex ones)

  • HTML formatting rules for emails

  • Calendar conflict detection awareness

  • Best practices for using MCP tools

For other AI assistants, use the SYSTEM_PROMPT.md content as system instructions.


📧 Email Superpowers

Your AI can:

  • Search emails by sender, subject, body, or natural filters

  • Focused Inbox support - by default searches "focused" emails, with option to search "other" or all

  • Open full email content including attachments

  • Download attachments to workspace for LLM analysis (Excel, PDF, images, etc.)

  • Image analysis for multimodal LLMs - View and analyze image attachments inline (screenshots, photos, diagrams)

  • Reply, forward, and compose new messages with HTML

  • Move, delete, archive, or bulk‑manage messages

  • Browse emails with fast local caching

  • Filter by time ranges ("today", "this week", "last 30 days")

  • Handle folders: create, rename, delete, move

Example

{
  "tool": "search_emails",
  "query": "invoices",
  "search_type": "subject"
}

Attachment Download Example

{
  "tool": "get_email_content",
  "cache_number": 1,
  "download_attachments": true
}

Attachments are saved to workspace/attachments and can be processed by other tools (file readers, image viewers, etc.).

Focused Inbox Example

{
  "tool": "search_emails",
  "query": "newsletter",
  "inference_classification": "other"
}

📅 Calendar Intelligence

Your AI can:

  • Search all upcoming events

  • Create or modify meetings

  • Cancel events and notify attendees

  • Accept or decline invitations

  • Check availability for multiple attendees

  • Create recurring events

  • Handle timezones automatically

Example

{
  "tool": "manage_event_as_organizer",
  "action": "create",
  "subject": "Project Sync",
  "start": "2026-02-26T14:00",
  "end": "2026-02-26T14:30"
}

  • Find people in your organization by name or email

  • Fallback to fuzzy matching when needed

  • Works instantly after login

{
  "tool": "search_contacts",
  "query": "john li"
}


🧠 Why This Project Exists

Modern AI assistants need to interact with your real work tools — email, meetings, files.
Microsoft Graph offers all of this, but:

  • The API is complex

  • Authentication is intimidating

  • Azure app registration is painful

  • Developers want simplicity, not bureaucracy

This MCP server solves all of it:

  • Zero Azure setup

  • Zero Graph API learning curve

  • Zero complexity

Just install and go.


🔥 Real‑World Use Cases & AI‑Friendly Workflows

These practical examples show potential users exactly why this project matters, with workflows designed specifically for AI usage — simple, predictable, and reliable.


Use Case: "Automated Reporting Agent"

Your AI can scan your inbox and calendar, then build a weekly summary report.

  • Pull last week's emails

  • Extract key events

  • Identify action items

  • Draft a clean weekly summary email

  • Send it to your team

Workflow

  1. Ask Claude to search emails: "Find emails from the last 7 days"

Claude will call:

{
  "tool": "search_emails",
  "days": 7
}
  1. Ask Claude to browse the results: "Analyze the emails for me"

Claude will call:

{
  "tool": "browse_email_cache",
  "page_number": 1,
  "mode": "llm"
}

Returns: Email summaries with sender, subject, date, and cache numbers for easy reference. In llm mode, Claude gets more emails per page (default 20) for efficient analysis.

  1. Ask Claude to search events: "Find calendar events from last week"

Claude will call:

{
  "tool": "search_events",
  "time_range": "last_week"
}
  1. Ask Claude to send summary email: "Send a weekly summary to the team"

Claude will call:

{
  "tool": "send_email",
  "action": "send_new",
  "to": ["team@example.com"],
  "subject": "Weekly Summary",
  "htmlbody": "<p>Here's the update...</p>"
}

Use Case: Batch BCC Forward

Your AI can search for emails and forward them to multiple recipients via BCC using a CSV file.

Workflow

  1. Ask Claude to search emails by subject: "Find emails with subject 'Company Announcement'"

Claude will call:

{
  "tool": "search_emails",
  "query": "Company Announcement",
  "search_type": "subject"
}
  1. Ask Claude to browse the email cache: "Show me the emails with subject 'Company Announcement'"

Claude will call:

{
  "tool": "browse_email_cache",
  "page_number": 1,
  "mode": "llm"
}
  1. Ask Claude to verify email content: "Show me email number 1"

Claude will call:

{
  "tool": "get_email_content",
  "cache_number": 1
}
  1. Ask Claude to batch forward via BCC using CSV: "Forward email number 1 to all recipients in the CSV file"

Claude will call:

{
  "tool": "send_email",
  "action": "forward",
  "cache_number": 1,
  "bcc_csv_file": "C:/path/to/recipients.csv",
  "subject": "Fwd: Company Announcement",
  "htmlbody": "<p>Please see the company announcement below.</p>"
}

Note: The CSV file should have a single column with header 'Email' containing all recipient email addresses.


Use Case: Schedule a Meeting

Your AI can check availability and schedule meetings with Teams links.

Workflow

  1. Ask Claude to check attendee availability: "Check availability for John and Jane on March 1st"

Claude will call:

{
  "tool": "check_attendee_availability",
  "attendees": ["john@example.com", "jane@example.com"],
  "date": "2026-03-01"
}
  1. Ask Claude to schedule a meeting: "Schedule a meeting with John and Jane on March 1st at 2 PM for 30 minutes"

Claude will call:

{
  "tool": "manage_event_as_organizer",
  "action": "create",
  "subject": "Project Discussion",
  "start": "2026-03-01T14:00",
  "end": "2026-03-01T14:30",
  "attendees": ["john@example.com", "jane@example.com"],
  "team": true
}

Note: The "team": true parameter adds a Teams meeting link to the event.


Use Case: Clean Up Your Inbox

Your AI can help you batch delete or archive multiple emails in one operation.

Workflow

  1. Ask Claude to search emails: "Find emails from newsletter@example.com"

Claude will call:

{
  "tool": "search_emails",
  "query": "newsletter@example.com",
  "search_type": "sender"
}
  1. Ask Claude to browse the results: "Show me these emails"

Claude will call:

{
  "tool": "browse_email_cache",
  "page_number": 1,
  "mode": "llm"
}
  1. Ask Claude to delete multiple emails: "Delete emails 1, 2, 3, 4, and 5"

Claude will call:

{
  "tool": "manage_emails",
  "action": "delete_multiple",
  "cache_numbers": [1, 2, 3, 4, 5]
}

Or archive them instead: "Archive emails 1 through 5"

Claude will call:

{
  "tool": "manage_emails",
  "action": "archive_multiple",
  "cache_numbers": [1, 2, 3, 4, 5]
}

Note: All emails are processed in ONE batch call - efficient and fast!


Use Case: Download and Analyze Attachments

Your AI can download email attachments and analyze them with other tools.

Workflow

  1. Ask Claude to search emails with attachments: "Find emails with Excel attachments"

Claude will call:

{
  "tool": "search_emails",
  "query": "xlsx",
  "search_type": "body"
}
  1. Ask Claude to browse the results: "Show me these emails"

Claude will call:

{
  "tool": "browse_email_cache",
  "page_number": 1,
  "mode": "llm"
}

Returns: Email summaries with attachment info (name, size, contentType) visible upfront.

  1. Ask Claude to download attachments: "Download the Excel attachment from email number 1"

Claude will call:

{
  "tool": "get_email_content",
  "cache_number": 1,
  "download_attachments": true,
  "attachment_names": ["report.xlsx"]
}

Returns: Email content with attachment saved to workspace/attachments/report.xlsx

  1. Use other tools to analyze: "Read the Excel file and summarize it"

Claude can now use file reading tools to process the downloaded attachment.

Key Features:

  • See attachment names/types before downloading (in browse_email_cache)

  • Download only specific attachments with attachment_names parameter

  • Custom download path with download_path parameter

  • Inline attachments (embedded images) are automatically skipped


Use Case: Analyze Image Attachments (Multimodal)

Your AI can view and analyze image attachments directly when using a multimodal LLM.

Workflow

  1. Ask Claude to search emails with images: "Find emails with image attachments"

Claude will call:

{
  "tool": "search_emails",
  "days": 7
}
  1. Ask Claude to browse the results: "Show me the emails"

Claude will call:

{
  "tool": "browse_email_cache",
  "page_number": 1,
  "mode": "llm"
}

Returns: Email summaries showing attachment types (e.g., contentType: image/png)

  1. Ask Claude to view the email with images: "Show me email number 1 with the images"

Claude will call:

{
  "tool": "get_email_content",
  "cache_number": 1,
  "return_html": true
}

Returns: Email content with images returned as ImageContent for multimodal LLMs to analyze directly.

  1. Claude analyzes the images: "What's in the screenshot?"

Claude will describe what it sees in the images - screenshots, diagrams, photos, charts, etc.

Configuration (in .env):

MULTIMODAL_SUPPORTED=true
IMAGE_MAX_SIZE_KB=50
IMAGE_MAX_DIMENSION=1024
IMAGE_QUALITY=75

Note: Images are automatically compressed to fit within LLM API limits.


User Mode Email Browsing

For human browsing (when you want to see emails page by page):

  1. Ask Claude to search emails: "Find emails from this week"

Claude will call:

{
  "tool": "search_emails",
  "time_range": "this_week"
}
  1. Ask Claude to browse page by page: "Show me the first page of emails"

Claude will call:

{
  "tool": "browse_email_cache",
  "page_number": 1,
  "mode": "user"
}

Returns: Email summaries with sender, subject, date, and cache numbers. In user mode, you get fewer emails per page (default 5) for easier human reading.

  1. Navigate to next page: "Show me the next page"

Claude will call:

{
  "tool": "browse_email_cache",
  "page_number": 2,
  "mode": "user"
}
  1. View specific email: "Show me email number 3"

Claude will call:

{
  "tool": "get_email_content",
  "cache_number": 3
}
  1. Ask Claude to reply to the email: "Reply to email number 3 saying thank you"

Claude will call:

{
  "tool": "send_email",
  "action": "reply",
  "cache_number": 3,
  "htmlbody": "<p>Thank you!</p>"
}

Key difference: Use "mode": "user" when you want to browse emails manually, page by page, with smaller page sizes that are easier for humans to read.


Email Workflow (LLM Mode)

  1. Ask Claude to search emails: "Find emails about budget"

Claude will call:

{
  "tool": "search_emails",
  "query": "budget"
}
  1. Ask Claude to browse the results: "Show me the budget emails"

Claude will call:

{
  "tool": "browse_email_cache",
  "page_number": 1,
  "mode": "llm"
}

Returns: Email summaries with sender, subject, date, and cache numbers for easy reference. In llm mode, Claude gets more emails per page (default 20) for efficient analysis.

  1. Ask Claude to view specific email: "Show me the second email"

Claude will call:

{
  "tool": "get_email_content",
  "cache_number": 2
}
  1. Ask Claude to reply: "Reply to this email saying it looks good"

Claude will call:

{
  "tool": "send_email",
  "action": "reply",
  "cache_number": 2,
  "htmlbody": "<p>Looks good!</p>"
}

Calendar Workflow

  1. Ask Claude to search events: "Find calendar events from this week"

Claude will call:

{
  "tool": "search_events",
  "time_range": "this_week"
}
  1. Ask Claude to browse events: "Show me the first page of events"

Claude will call:

{
  "tool": "browse_events",
  "page_number": 1,
  "mode": "user"
}
  1. Ask Claude to view event details: "Show me event number 1"

Claude will call:

{
  "tool": "get_event_detail",
  "cache_number": 1
}
  1. Ask Claude to respond to event: "Accept event number 1"

Claude will call:

{
  "tool": "manage_event_as_attendee",
  "action": "accept",
  "cache_number": 1
}


🙌 Want to Support the Project?

If this helps you, please consider starring the repository.
It motivates ongoing development and helps others discover the tool.


� Complete MCP Tool Reference

Here's a comprehensive list of all available MCP tools with simple explanations:

🔐 Authentication & Settings

  • auth - Manage Microsoft Graph authentication (start, complete, refresh, logout)

  • user_settings - Configure user preferences like timezone, search days, and page sizes

📧 Email Management

  • search_emails - Search or list emails by sender, subject, body, or time range. Supports Focused Inbox filtering (focused, other, all). Use end_date="now" to search from a specific date until current time

  • browse_email_cache - Browse cached emails with pagination (user mode for humans, llm mode for AI analysis)

  • get_email_content - Get full email content including attachments. Use return_html=true to get full HTML body

  • send_email - Send new emails, replies, or forwards with HTML support

  • manage_emails - Move, delete, archive, flag, or categorize emails

  • manage_mail_folder - Create, rename, delete, or move email folders

📅 Calendar Management

  • search_events - Search or list calendar events by subject or organizer

  • browse_events - Browse cached calendar events with pagination

  • get_event_detail - Get detailed information for specific events

  • manage_event_as_organizer - Create, update, cancel, forward, or email attendees for your own events

  • manage_event_as_attendee - Accept, decline, tentatively accept, propose new times, email attendees, or delete cancelled event invitations

  • check_attendee_availability - Check availability for meeting scheduling

👥 People & Contacts

  • search_contacts - Find people in your organization by name or email

🔑 Key Workflow Patterns

Email Workflow:

  1. search_emails - Load emails into cache

  2. browse_email_cache - Browse with appropriate mode (llm for AI, user for humans)

  3. get_email_content - View specific email details

  4. send_email or manage_emails - Take action

Calendar Workflow:

  1. search_events - Load events into cache

  2. browse_events - Browse events

  3. get_event_detail - View specific event

  4. manage_event_as_attendee or manage_event_as_organizer - Take action

Authentication Workflow:

  1. Try auth with refresh action FIRST - if authenticated, proceed

  2. If refresh fails (no token or expired): auth with start → get verification URL and code

  3. Open URL in browser, enter the code, complete Microsoft login

  4. auth with complete action → authentication finished

Note: Refresh tokens are valid for ~90 days. Always try refresh first when authentication is needed.

All tools follow the JSON format with "tool": "tool_name" as the first parameter, making them easy to use with AI assistants like Claude.


Available Tools

15 tools
authA

Manage authentication with Microsoft Graph. Four simple actions:

• 'start' - Start login flow, returns verification URL and code to enter in browser • 'complete' - Complete login after browser authentication (auto-loads device code) • 'check_status' - Check auth status: returns authenticated or need login • 'logout' - Clear all authentication tokens

WHEN AUTHENTICATION NEEDED: Always try 'check_status' FIRST. If it fails (no token or expired), then call 'start'.

WORKFLOW:

  1. Call auth action='start' → get URL and code

  2. Open URL in browser, enter the code, complete Microsoft login

  3. Call auth action='complete' → authentication finished

AUTO-REFRESH: Access tokens auto-refresh when expired (no user action needed). Refresh tokens are valid for ~90 days.

Returns:

  • check_status: {status: string, authenticated: boolean, message: string}

  • start: {status: string, verification_uri: string, user_code: string, message: string}

  • complete: {status: string, authenticated: boolean, message: string}

  • logout: {status: string, authenticated: false, message: string}

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction: 'start' to begin login (get URL/code), 'complete' to finish login after browser auth, 'check_status' to check authentication status, 'logout' to sign out

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses token auto-refresh, 90-day refresh token validity, and return formats for each action. No annotations provided, so description carries full burden; slightly missing error state details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with bullet points, sections, and front-loaded summary. Every sentence adds value despite length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description provides explicit return formats for each action. Covers entire workflow and authentication lifecycle.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and description adds workflow context for each enum value. Baseline 3 plus extra value from detailed action descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Manage authentication with Microsoft Graph' and enumerates four actions. This distinguishes it from sibling tools dealing with emails, events, etc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Always try check_status first', then start if needed, with a clear step-by-step workflow. No ambiguity about when to use each action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browse_email_cacheA

Browse emails in the cache with pagination. Returns summary information with number column indicating position in cache. Use page_number to navigate. Automatically manages browsing state with disk cache for persistence. WORKFLOW: Use search_emails to load emails into the cache first. ATTACHMENT INFO: Each email now includes attachment details (id, name, size, contentType) so you can see what attachments are available before downloading. IMAGE ATTACHMENTS: When you see image attachments (contentType starts with 'image/'), use get_email_content to retrieve them. Image content will be included automatically for multimodal analysis (requires MULTIMODAL_SUPPORTED=true). You MUST then analyze the images - they often contain critical information not mentioned in text. Returns: {current_page: integer, total_pages: integer, count: integer, total_count: integer, emails: array (with attachments array), date_range: string, filter_date_range: string, timezone: string}.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoBrowsing mode. DEFAULT to 'llm' for most cases - use 'llm' when user wants you to analyze, summarize, or process emails (~20 per page for comprehensive view). Use 'user' ONLY when user EXPLICITLY requests to browse page-by-page themselves (~5 per page for human reading).llm
page_numberYesPage number to view (starts at 1)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully handles transparency. It reveals the tool returns paginated summary info, manages browsing state with disk cache, and includes attachment details. It also specifies that image attachments require get_email_content for retrieval and multimodal analysis. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but well-structured: primary function, workflow, attachment handling, return format. Each part serves a purpose without undue repetition. Minor verbosity, but overall efficient and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (2 parameters, no output schema), the description is remarkably complete. It provides the return structure, explains caching, attachment inclusion, and multimodal workflow. Sibling tools are appropriately referenced (search_emails, get_email_content). No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for both parameters. The description adds significant value beyond schema: explains mode enum behavior in detail (defaults, page sizes, usage contexts) and the role of page_number in navigation. The parameter semantics are well-enriched.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool browses cached emails with pagination. It distinguishes from sibling tools like search_emails (loads cache) and get_email_content (retrieves images), making the specific function unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit workflow is provided: use search_emails first. The mode parameter is explained with detailed guidance on when to use 'llm' vs 'user'. Also instructs to use get_email_content for image attachments, covering when-not-to-use and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

browse_eventsA

Browse calendar events in the cache with pagination. Returns summary information with number column indicating position in cache. Use page_number to navigate. Automatically manages browsing state with disk cache for persistence. WORKFLOW: Use search_events to load events into the cache first. Returns: {current_page: integer, total_pages: integer, count: integer, total_count: integer, events: array, date_range: string, timezone: string}.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoBrowsing mode. DEFAULT to 'llm' for most cases - use 'llm' when user wants you to analyze, summarize, or process events (~20 per page for comprehensive view). Use 'user' ONLY when user EXPLICITLY requests to browse page-by-page themselves (~5 per page for human reading).llm
page_numberYesPage number to view (starts at 1)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so description carries full burden. Discloses caching behavior, state management, and return structure. Does not hide side effects like disk cache persistence.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is front-loaded with primary action, then details and workflow. Every sentence is informative. Slightly long but no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description provides return object structure. Covers workflow, mode, and state management. Adequate for a tool with 2 simple parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage, but description adds significant value beyond schema for 'mode' parameter, explaining when to use each enum option. Page_number description mirrors schema, no extra value needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Browse calendar events in the cache with pagination', providing specific verb and resource. It distinguishes from sibling 'search_events' which loads events, indicating this tool is for navigation after loading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs 'Use search_events to load events into the cache first', establishing a clear workflow. Explains when to use 'llm' vs 'user' mode. Lacks explicit exclusions of other siblings like get_event_detail, but provides strong context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_attendee_availabilityA

Check availability of attendees for a given date. WORKFLOW: Typically use before calling manage_my_event with create action to find optimal meeting times. Automatically includes the organizer (you) in the availability check to ensure overlap-free time slots. Automatically calculates time range based on all attendees' working hours. Returns: {success: boolean, message: string, availability_view: string, schedule_items: array, top_slots: array}. Availability view string uses single-character codes for each time interval: 0=Free, 1=Tentative, 2=Busy, 3=Out of office (OOF), 4=Working elsewhere, ?=Unknown. Note: Supports up to 20 attendees total (mandatory + optional).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDate in ISO format. Example: '2024-01-01'. The time range will be automatically calculated based on all attendees' working hours.
attendeesYesList of mandatory attendee email addresses to check availability for
time_zoneNoTimezone for the time range. Optional - defaults to user's mailbox settings. Example: 'India Standard Time', 'Pacific Standard Time', 'UTC'
top_slotsNoNumber of top time slots to display in the summary. Optional, default: 5
meeting_durationNoRequired meeting duration in minutes. Optional, default: 30. Used to find continuous free time slots that can accommodate the meeting. Valid values: 15, 30, 45, 60, 90, 120, etc.
optional_attendeesNoList of optional attendee email addresses to check availability for (optional)
availability_view_intervalNoTime interval in minutes for availability view. Optional, default: 30. Valid values: 5, 6, 10, 15, 30, 60

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses automatic inclusion of organizer, automatic time range calculation based on working hours, and support limit of 20 attendees. Return format and availability codes are explained. Lacks details on authentication or side effects, but adequate for a read-like tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise: 5-6 well-organized sentences. First sentence states purpose, then workflow, automatic behaviors, return format with codes, and a final note on limits. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, description details return fields including availability view codes. Covers all 7 parameters and key behaviors. For a 2-required-param tool with good description, it is complete enough for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (all 7 parameters described). Description adds meaning beyond schema: 'time range will be automatically calculated' for date, 'Used to find continuous free time slots' for meeting_duration, and explains top_slots and availability_view_interval purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description starts with a clear verb+resource: 'Check availability of attendees for a given date.' It distinguishes from siblings by specifying the workflow: 'Typically use before calling manage_my_event with create action to find optimal meeting times.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit context: 'Typically use before calling manage_my_event with create action to find optimal meeting times.' It also notes automatic behaviors (includes organizer, auto-calculates time range). No explicit alternatives or when-not-to-use, but clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_email_contentA

Get full email content by cache number. Use the cache number from browse_email_cache (e.g., 1, 2, 3) to retrieve complete email with body, attachments, and all details. Returns: {success: boolean, subject: string, from: string, to: array, cc: array, bcc: array, body: string, attachments: array, sent_date: string, received_date: string}. Note: Invalid cache_number returns appropriate error message. ATTACHMENT DOWNLOAD: Set download_attachments=true to download attachments to the workspace/attachments folder. Attachments are saved with their original names. Use attachment_names to download only specific attachments. IMAGE ATTACHMENTS: When an email has image attachments (contentType starts with 'image/'), image content will be included automatically for multimodal analysis (requires MULTIMODAL_SUPPORTED=true in config). IMPORTANT: If images appear in the response, you MUST analyze them immediately - they often contain critical information (screenshots, photos, diagrams, charts, instructions) not mentioned in the text body. Do NOT skip image analysis.

ParametersJSON Schema
NameRequiredDescriptionDefault
return_htmlNoIf true, return full HTML body. If false (default), return plain text body. Note: This only affects email body format, not image attachments.
cache_numberYesCache number from browse_email_cache (e.g., 1, 2, 3)
download_pathNoOptional custom path for downloading attachments. If not specified, defaults to workspace/attachments folder.
attachment_namesNoOptional list of specific attachment names to download. If not specified, downloads all non-inline attachments.
download_attachmentsNoIf true, download email attachments to the workspace/attachments folder. Default: false. Attachments will include 'downloaded' and 'file_path' fields in the response.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses return format, error behavior for invalid cache numbers, attachment download mechanics, and image handling requirements. It does not mention side effects but is transparent about read operations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections for attachments and images, and the main purpose is front-loaded. While detailed, each part adds value, though some notes could be more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description fully defines the return object structure. It covers all five parameters with usage scenarios, error handling, and special cases like image attachments, making it complete for agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 100% schema coverage, the description adds substantial context beyond the schema, including the relationship to browse_email_cache, download mechanics, image handling, and default paths. This significantly aids parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves full email content using a cache number from browse_email_cache. It distinguishes itself by specifying it returns complete email details (body, attachments, etc.) unlike the sibling browse_email_cache.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to use cache numbers from browse_email_cache and provides guidance on downloading attachments and image analysis. It lacks explicit when-not-to-use statements but gives sufficient context for typical usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_event_detailA

Get detailed information for a specific calendar event by its cache number. WORKFLOW: First call browse_events or search_events to get event list, then use this tool with cache number from results. Returns: Event object with id, subject, start, end, location, attendees, body, recurrence, and online meeting details. Note: Invalid cache_number returns appropriate error message.

ParametersJSON Schema
NameRequiredDescriptionDefault
cache_numberYesCache number from browse_events or search_events (e.g., 1, 2, 3)

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description covers return type ('Event object with id, subject, start, end...') and error handling. It implies a read operation with no side effects, but could mention permissions or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three focused sentences: purpose, workflow, return details. No filler, front-loaded with essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool, the description covers purpose, workflow, return fields, and error behavior. Fully sufficient for correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description covers the parameter with examples. The tool description adds workflow context (e.g., where cache_number comes from), which is valuable beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get detailed information for a specific calendar event by its cache number.' It specifies the resource and action, and distinguishes from sibling tools like browse_events and search_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly outlines the workflow: 'First call browse_events or search_events to get event list, then use this tool with cache number from results.' Also notes error behavior for invalid input.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_emailsA

Manage emails with multiple actions. Supports moving, deleting, archiving, flagging, and categorizing emails. Actions include: move_single, move_all, delete_single, delete_multiple, delete_all, archive_single, archive_multiple, flag_single, flag_multiple, categorize_single, categorize_multiple. Returns: {success: boolean, message: string, moved_count: integer, failed_count: integer, errors: array}. Note: Invalid cache_number returns appropriate error message.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform: 'move_single' to move a single email, 'move_all' to move all emails from a folder, 'delete_single' to delete a single email, 'delete_multiple' to delete multiple emails in ONE batch call (provide cache_numbers array with all items), 'delete_all' to delete all emails from a folder, 'archive_single' to archive a single email, 'archive_multiple' to archive multiple emails in ONE batch call, 'flag_single' to flag a single email, 'flag_multiple' to flag multiple emails in ONE batch call, 'categorize_single' to categorize a single email, 'categorize_multiple' to categorize multiple emails in ONE batch call
categoriesNoList of category names to apply (e.g., ['Important', 'Work']). Required for 'categorize_single' and 'categorize_multiple' actions
flag_statusNoFlag status: 'flagged' to mark as flagged, 'complete' to mark as complete. Required for 'flag_single' and 'flag_multiple' actions
cache_numberNoCache number from browse_email_cache (e.g., 1, 2, 3). Required for 'move_single', 'delete_single', 'archive_single', 'flag_single', and 'categorize_single' actions
cache_numbersNoList of cache numbers from browse_email_cache (e.g., [1, 2, 3]). Required for 'delete_multiple', 'archive_multiple', 'flag_multiple', and 'categorize_multiple' actions. IMPORTANT: Pass ALL cache numbers in a SINGLE call - do NOT call multiple times for individual items
source_folderNoSource folder path (e.g., 'Inbox', 'Archive/2024'). Required for 'move_all' and 'delete_all' actions
destination_folderNoDestination folder path (e.g., 'Archive/2024', 'Inbox/Projects'). Required for 'move_single' and 'move_all' actions

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full burden. It specifies the return structure ({success, message, moved_count, etc.}) and notes error behavior for invalid cache_number, but lacks disclosure of side effects (e.g., permanence of deletes, folder creation needs) or authorization requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately sized with a clear structure (actions list, return info, note), but it repeats the action list already present in the schema enums, making it slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, 11 actions) and no output schema, the description provides return structure and an error note, but lacks context on prerequisites (e.g., dependency on browse_email_cache for cache numbers), batch operation implications, or side effects of actions like deletion.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with detailed parameter descriptions, so baseline is 3. The description adds the return structure and a note about invalid cache_number errors, but does not augment parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Manage emails with multiple actions' and explicitly lists all supported actions (move, delete, archive, flag, categorize), clearly distinguishing the tool from siblings like send_email or search_emails which serve different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives like search_emails or browse_email_cache; usage is implied by the listed actions but no guidance on exclusions or prerequisites is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_event_as_attendeeA

Manage calendar events where you are an attendee (events organized by others). Actions: accept, decline, tentatively_accept, propose_new_time, delete_cancelled, email_attendees. WORKFLOW: Use cache_number from browse_events or search_events results. Returns: Response confirmation message with action status and updated event information. Note: If event is already responded to, returns appropriate error message. IMPORTANT: accept/decline/tentatively_accept/propose_new_time actions will automatically handle events where the organizer didn't request responses. For accept: updates the event to showAs='busy' and enables reminders. For tentatively_accept: updates the event to showAs='tentative' and enables reminders. For decline: deletes the event from your calendar. For propose_new_time: deletes the event from your calendar and instructs you to contact organizer directly (since proposals require responses). This matches Outlook's behavior. The delete_cancelled action is specifically for removing a CANCELLED event from your calendar (ONLY use when organizer has cancelled the event - do NOT use to decline invitations). The email_attendees action sends email to event attendees (to=required attendees, cc=optional attendees, organizer excluded from recipients).

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoList of 'cc' recipient email addresses for email_attendees action (optional, defaults to optional event attendees)
toNoList of 'to' recipient email addresses for email_attendees action (optional, defaults to required event attendees)
bodyNoEmail body content for email_attendees action (optional, defaults to event body content)
actionYesAction to perform: 'accept' to accept event invitation, 'decline' to decline event invitation, 'tentatively_accept' to tentatively accept event invitation, 'propose_new_time' to decline and propose new time to organizer (if responses aren't requested, deletes the event and instructs to contact organizer directly), 'delete_cancelled' to remove a CANCELLED event from your calendar (ONLY use when organizer has cancelled the event - do NOT use to decline invitations), 'email_attendees' to send email to event attendees (to=required attendees, cc=optional attendees, organizer excluded from recipients)
seriesNoFor accept/decline/tentatively_accept actions on recurring events: set to true to accept/decline entire series, or false (default) for single occurrence only
commentNoOptional comment for accept, decline, tentatively_accept, propose_new_time actions
cache_numberYesCache number from browse_events or search_events (required for all actions, e.g., 1, 2, 3)
email_subjectNoEmail subject for email_attendees action (optional, default: 'Re: Event')
send_responseNoWhether to send response to organizer for accept, decline, tentatively_accept actions (optional, default: true)
propose_new_timeNoPropose a new time when using propose_new_time action (required for propose_new_time action). Note: If the organizer hasn't requested responses, the event will be deleted and you'll need to contact the organizer directly to suggest the new time.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits: automatic handling for events without response requests, specific effects for each action (e.g., 'updates the event to showAs='busy''), and error behavior for already responded events. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with sections, bullet points, and important notes. It front-loads purpose and action list. Every sentence adds value, though slight conciseness improvements could be made without losing clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (10 parameters, multiple actions, no output schema), the description covers workflow, action effects, parameter usage, error conditions, and return value information. It is comprehensive for an AI agent to correctly invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 description adds value by explaining workflow (e.g., cache_number usage) and clarifying propose_new_time behavior, but does not significantly exceed schema-level detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it manages calendar events where the user is an attendee. It lists specific actions and distinguishes from 'manage_event_as_organizer' sibling. The phrase 'events organized by others' makes the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides workflow instructions (use cache_number from browse_events or search_events) and explains when to use each action, including specific warnings like 'do NOT use delete_cancelled to decline invitations'. It lacks explicit alternative tool guidance but the context of 'as an attendee' implies differentiation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_event_as_organizerA

Manage calendar events where you are the organizer (events you created). Actions: create, update, cancel, forward, email_attendees. WORKFLOW: For update, cancel, forward, and email_attendees actions, use cache number from browse_events or returned when creating an event. Returns: Event object with id, subject, start, end, location, attendees, body, recurrence, and online meeting details. Note: Conflict errors may occur when updating event times that overlap with existing events.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoList of 'cc' recipient email addresses for email_attendees action (optional, defaults to optional event attendees)
toNoList of 'to' recipient email addresses for email_attendees action (optional, defaults to required event attendees)
endNoEnd date and time in your local timezone. Example: '2024-01-01T15:30' or '2024-01-01 15:30'. The system will automatically convert to UTC using the timezone parameter or your timezone settings from your Microsoft 365 profile or .env configuration. Required for create, optional for update
bodyNoEvent body content in HTML format (optional for create, update, reply). IMPORTANT: (1) Do NOT use <br> between <p> tags - use </p><p> directly for paragraph separation. (2) Do NOT add newlines or whitespace between HTML block elements - keep HTML compact. Use <p> for paragraphs, <strong>/<em> for emphasis.
startNoStart date and time in your local timezone. Example: '2024-01-01T14:30' or '2024-01-01 14:30'. The system will automatically convert to UTC using the timezone parameter or your timezone settings from your Microsoft 365 profile or .env configuration. Required for create, optional for update
actionYesAction to perform: 'create' to create a new calendar event, 'update' to update an existing event, 'cancel' to cancel an event and send cancellation notifications to attendees, 'forward' to forward event by adding new optional attendees, 'email_attendees' to send email to event attendees using event body as content (to=required attendees, cc=optional attendees)
commentNoOptional comment for cancel, forward actions
subjectNoEvent subject (required for create, optional for update)
locationNoEvent location (optional for create, update)
timezoneNoTimezone for the event in IANA format. Examples: 'Asia/Singapore', 'America/New_York', 'Europe/London', 'UTC'. Optional for create and update actions - if not provided, will use your timezone settings from your Microsoft 365 profile or .env configuration
attendeesNoList of required attendee email addresses (optional for create, update, required for forward)
recurrenceNoRecurrence pattern for the event (optional for create, update). Defines how the event repeats
cache_numberNoCache number from browse_events or returned when creating an event (required for update, cancel, forward, email_attendees actions, e.g., 1, 2, 3)
email_subjectNoEmail subject for email_attendees action (optional, default: 'Re: Event')
isOnlineMeetingNoWhether to create the event as an online meeting (optional for create, update). If true, creates a Teams meeting when onlineMeetingProvider is 'teamsForBusiness'. For other providers (Zoom, Google Meet, etc.), set isOnlineMeeting to true and include the join link in the body field
body_content_typeNoBody content type (optional for create, update, default: HTML)
optional_attendeesNoList of optional attendee email addresses (optional for create, update)
onlineMeetingProviderNoOnline meeting provider (optional for create, update). Use 'teamsForBusiness' for Teams meetings, 'skypeForBusiness' for Skype for Business, 'skypeForConsumer' for Skype Consumer, or 'unknown' for other providers. For 'unknown' or other providers (Zoom, Google Meet, etc.), include the join link in the body field. Requires isOnlineMeeting to be true

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses that cancel sends cancellation notifications, email_attendees sends emails to attendees, and forward adds optional attendees. It also mentions potential conflict errors when updating times. However, it does not detail authorization requirements or rate limits, which are minor omissions for a complex tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively long but well-structured: first sentence defines purpose, then lists actions and workflow, followed by return value and a note on conflicts. It is front-loaded with essential information and avoids redundancy, though some parameter details are repeated from schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 18 parameters, no output schema, complex nested objects (recurrence), and no annotations, the description is quite complete. It covers actions, workflow, return value, and parameter usage. It lacks explicit explanation of the return object's full structure, but since there is no output schema, stating it returns an event object with key fields is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline 3. The description adds significant value beyond schema: examples for timezone, important notes for body HTML formatting, explanation of email_subject default, and workflow for cache_number. This enhances parameter understanding beyond the schema's descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool manages calendar events where the user is organizer, listing five specific actions (create, update, cancel, forward, email_attendees). It distinguishes from sibling tools like manage_event_as_attendee and browse_events by focusing on organizer-only actions and referencing a cache number from browse_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a workflow: for certain actions, use cache number from browse_events or creation. It implies use when user is organizer, but does not explicitly exclude use cases for non-organizer events or specify when not to use. However, the context from sibling names and the description itself provides clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_mail_folderB

Manage mail folders. Supports list, create, delete, rename, get_details, and move operations. Returns: {success: boolean, message: string, path: string, displayName: string, totalItemCount: integer, unreadItemCount: integer, childFolderCount: integer}. Note: Invalid folder paths return appropriate error messages.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform: 'list' to list all mail folders, 'create' to create a new folder, 'delete' to delete a folder, 'rename' to rename a folder, 'get_details' to get folder information, 'move' to move a folder to a new parent
new_nameNoNew name for the folder. Required for rename action
folder_nameNoName of the folder to create. Required for create action
folder_pathNoPath of the folder (e.g., 'Inbox', 'Archive/2024'). Required for delete, rename, get_details, and move actions
parent_folderNoOptional parent folder path for create action (e.g., 'Inbox', 'Archive/2024'). If not provided, creates a top-level folder
destination_parentNoPath of the destination parent folder (e.g., 'Archive', 'Sent Items'). Required for move action

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description bears full responsibility. It notes the return format and that invalid paths produce error messages, but lacks important behavioral details such as destructive warnings (e.g., delete is irreversible), permission requirements, side effects, or operation restrictions (e.g., cannot delete system folders).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one sentence followed by a return format and a note. It is concise and front-loaded with the main purpose. However, structuring the operations as a bullet list could improve readability. Minimal waste, but not perfectly structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (6 parameters, 6 actions, no output schema), the description covers operations and return format adequately. However, it omits important context like whether actions are synchronous, permissions needed, or restrictions on deleting system folders. The note on error messages is helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description does not add additional context beyond what the schema already provides for each parameter. For example, it doesn't clarify how parent_folder interacts with folder_path for create operations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool manages mail folders and lists six specific operations (list, create, delete, rename, get_details, move). It distinguishes itself from sibling tools like manage_emails (which handles messages) and browse_email_cache (which deals with cached content).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for folder CRUD operations but does not explicitly state when to use this tool versus alternatives (e.g., search_emails or manage_emails). No explicit when-not-to-use or related 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.

search_contactsA

FIND PEOPLE/CONTACTS ONLY. Search for people by name or email address in organization directory. Returns contact information (name, email, etc.). DO NOT use this to search email messages - use search_emails for that. Use this when you need to find information about a person, such as 'who is John Smith' or 'find contact with email john@company.com'. Default limit: 10. Note: If you encounter a rate limit error (429), the response will include a 'retry_after' field indicating how many seconds to wait before retrying. Returns: {success: boolean, contacts: array, count: integer, limit_reached: boolean, message: string, retry_after: integer (if rate limited)}.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query (person's name or email address)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses default limit of 10, rate limit handling with retry_after, and return format. No annotations present, so description carries full burden; covers key aspects but could mention pagination or error cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise with front-loaded emphasis. Two sentences plus a note and return format; no wasted language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, description provides full return structure. Single parameter is well-documented. Complete for the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema provides 100% coverage for the single parameter with description. Description does not add additional semantic detail beyond restating purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool is for finding people/contacts by name or email. Explicitly distinguishes from searching email messages, avoiding confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use context (finding people) and when-not-to-use (searching email messages). Directly names alternative tool 'search_emails'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_emailsA

SEARCH EMAIL MESSAGES ONLY. Search or list email messages by keywords, sender, subject, or body. Returns matching email messages with summary information. DO NOT use this to find people/contacts - use search_contacts for that. If no search_type and query are provided, lists emails within the specified time range. All time parameters use your local timezone. PARAMETER PRECEDENCE (highest to lowest): 1) time_range (overrides all other time parameters), 2) start_date/end_date (overrides days), 3) days (used only if no other time parameters provided). IMPORTANT FOR OLD EMAILS: The 'days' parameter has a maximum limit (default 90 days). To search emails older than this limit, use start_date/end_date parameters instead - they have NO date range restriction and can search any historical emails. Example: start_date='2023-01-01', end_date='2023-12-31'. FOCUSED INBOX: By default, searches only 'focused' emails (Outlook's Focused Inbox). Use inference_classification='other' to search 'other' emails, or inference_classification='all' to search both. Returns: {success: boolean, emails: array, count: integer, date_range: string, filter_date_range: string, timezone: string}. Note: Rate limit errors (HTTP 429) return retry_after field with seconds to wait. Invalid folder paths return appropriate error messages.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoNumber of days to look back. Default: 7, maximum: 90. LOWEST PRIORITY: Used only when no time_range, start_date, or end_date are provided. **TIP**: For searching emails older than 90 days, use start_date and end_date parameters instead.
queryNoSearch query for email messages. For 'sender': email address only. For 'subject': subject text. For 'body': body text content. Required when search_type is provided. Optional - if not provided with search_type, lists emails within the time range
folderNoOptional folder path to search (e.g., 'Inbox', 'Inbox/Projects', 'Archive/2024'). Default: InboxInbox
end_dateNoEnd date in your local timezone (e.g., '2024-12-31' or '2024-12-31T23:59'). Overridden by time_range if both are provided. **NO DATE RANGE LIMIT**: Unlike 'days' parameter, end_date has no restriction - use this to search old emails beyond the default 90-day limit. **SPECIAL VALUE**: Use 'now' to search from start_date until current time (e.g., start_date='2024-01-01', end_date='now' searches from Jan 1 to now).
start_dateNoStart date in your local timezone (e.g., '2024-01-01' or '2024-01-01T14:30'). Overridden by time_range if both are provided. **NO DATE RANGE LIMIT**: Unlike 'days' parameter, start_date has no restriction - use this to search old emails beyond the default 90-day limit.
time_rangeNoTime range type (case-insensitive). Optional, in your local timezone. Accepted values: 'today', 'tomorrow', 'this_week', 'next_week', 'this_month', 'next_month' (any case). HIGHEST PRIORITY: If provided, overrides start_date, end_date, and days. Returns a user-friendly display string in the response. Examples: 'today', 'Today', 'THIS_WEEK', 'Next_Month'
search_typeNoType of search to perform (optional). Options: 'sender' (search by sender email address only), 'subject' (search by subject text with exact substring matching), 'body' (search by body content with exact substring matching). If not provided, lists emails within the time range without filtering
inference_classificationNoFilter by Outlook Focused Inbox classification. 'focused' (default): important emails shown in Focused tab. 'other': less important emails shown in Other tab. 'all': search both focused and other emails. Default: focusedfocused

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully covers behavioral aspects: default focused inbox, rate limit error handling, folder path errors, timezone handling, and parameter precedence. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with sections, bold emphasis, and clear warnings. Slightly long but each sentence is necessary; no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters, no output schema, and no annotations, the description covers return format, error handling, edge cases (old emails, focused inbox), and usage constraints. Fully adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds extra context like the 90-day limit tip, focused inbox default, and parameter precedence. This goes beyond what schema provides, justifying above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb ('search'), specific resource ('email messages'), and explicit differentiation from sibling tool 'search_contacts'. The description states purpose upfront and in bold.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly warns against using for contacts, gives parameter precedence, explains when to use start_date/end_date vs days for old emails, and provides examples. Covers when to use and when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_eventsA

Search or list calendar events by keywords. Returns matching events with summary information. If no query is provided, lists events within the specified time range. All time parameters use your local timezone. When using time_range, the response includes a user-friendly display string (e.g., 'Today', 'This Week', 'This Month'). Returns: {success: boolean, events: array, count: integer, date_range: string, timezone: string}. Note: Subject search uses exact substring matching, organizer search uses fuzzy matching.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoSearch query. For 'subject': event title text. For 'organizer': organizer name. Optional - if not provided, lists events within the time range
end_dateNoEnd date in your local timezone (e.g., '2024-12-31' or '2024-12-31T23:59') (optional)
start_dateNoStart date in your local timezone (e.g., '2024-01-01' or '2024-01-01T14:30') (optional)
time_rangeNoTime range type (case-insensitive, optional, in your local timezone). Accepted values: 'today', 'tomorrow', 'this_week', 'next_week', 'this_month', 'next_month' (any case). If provided, overrides start_date and end_date. Returns a user-friendly display string in the response. Examples: 'today', 'Today', 'THIS_WEEK', 'Next_Month'.
search_typeNoField to search in (optional). Options: 'subject' (search by event title with exact substring matching), 'organizer' (search by organizer name/email with fuzzy matching). Default: 'subject'

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses exact substring matching for subject, fuzzy matching for organizer, timezone handling, time_range override, and return format. This gives sufficient behavioral transparency, though rate limits or idempotency are not mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is 5-6 sentences, front-loaded with purpose, then behavior, return format, and a note. Every sentence adds value; no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (5 parameters, no output schema), the description comprehensively covers behavior, search modes, time handling, and return fields. It is complete enough for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline 3. The description adds context: time_range overrides start/end date, search_type defaults to subject, and provides specifics on matching behavior. This adds value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'search or list calendar events by keywords' and explains the difference with and without a query. It differentiates between subject and organizer searches, but does not explicitly distinguish from sibling tools like browse_events.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context for when to use search vs list (with/without query) and mentions timezone and time_range. However, it does not tell when not to use this tool or suggest alternatives like get_event_detail for detailed info.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_emailA

Send emails directly without creating drafts. Supports three actions: 'send_new' to send a new email, 'reply' to reply to an existing email, and 'forward' to forward an existing email. All actions send emails immediately - no drafts are created. Supports multiple recipients, CC, and BCC. The htmlbody parameter accepts HTML format for rich email content. RECOMMENDED FOR BCC: Use bcc_csv_file parameter to provide BCC recipients from a CSV file - this is the preferred method for handling large BCC lists with automatic batching support (up to 500 recipients per batch by default). NOTE: For forward action, 'to' is optional when using 'bcc_csv_file' or 'bcc' - you can forward emails using only BCC recipients. Returns: {success: boolean, message: string, sent_count: integer, failed_count: integer, recipients: array}.

ParametersJSON Schema
NameRequiredDescriptionDefault
ccNoList of CC recipient email addresses (optional). For reply: if not provided, defaults to original CC recipients; if provided (even if empty), replaces original CC recipients.
toNoList of recipient email addresses (required for send_new, optional for reply and forward). For reply: if not provided, defaults to original sender and recipients; if provided (even if empty), replaces original recipients. For forward: optional when bcc_csv_file is provided.
bccNoList of BCC recipient email addresses (optional)
actionYesAction to perform: 'send_new' to send a new email immediately (no draft), 'reply' to reply to existing email, 'forward' to forward existing email
subjectNoEmail subject (required for send_new, optional for reply/forward)
htmlbodyYesEmail body content in HTML format. IMPORTANT HTML FORMATTING RULES: (1) Do NOT use <br> between <p> tags - use </p><p> directly for paragraph separation. Using both creates excessive spacing in email clients. (2) Do NOT add newlines or whitespace between HTML block elements (<p>, <div>, <ul>, etc.) - keep HTML compact. (3) Use <p> for paragraphs, <strong>/<em> for emphasis, <ul>/<li> for lists. (4) Only use <br> for line breaks WITHIN a paragraph, not between paragraphs. Correct example: '<p>Hello,</p><p>This is <strong>important</strong>.</p><p>Best regards</p>'
importanceNoEmail importance level: 'normal' (default), 'high', or 'low' (optional)
bcc_csv_fileNo**PREFERRED METHOD FOR BCC**: Path to CSV file containing BCC recipients. This is the recommended approach for handling BCC recipients, especially for large lists. CSV must have a single column with header 'Email' or 'email'. The system automatically batches large BCC lists (up to 500 recipients per batch by default) and sends multiple emails as needed. Only available for 'forward' action. When both 'bcc' and 'bcc_csv_file' are provided, they are combined.
cache_numberNoCache number from browse_email_cache (required for reply/forward, e.g., 1, 2, 3)

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states that emails are sent immediately without drafts, explains batching for BCC CSV (up to 500 per batch), and describes the return object. It does not cover rate limits, authentication needs, or error handling, but the disclosed behaviors are clear and useful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is verbose and includes some redundancy (e.g., repeating 'send immediately - no drafts' in multiple places). It uses bold for emphasis and is structured logically, but could be more concise by eliminating repetition and unnecessary phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of an output schema, the description compensates by listing return fields (success, message, sent_count, etc.). It covers all 9 parameters, explains batching, and addresses all three actions. It lacks discussion of error scenarios or prerequisites, but overall it is sufficiently 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage, but the description adds substantial extra meaning: it explains how parameters behave differently per action (e.g., 'to' optional for forward with BCC CSV), provides HTML formatting rules, and recommends BCC CSV over the 'bcc' array. This goes significantly beyond the schema to guide correct usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it sends emails directly without creating drafts, and lists three specific actions (send_new, reply, forward) with brief explanations. It effectively communicates the core verb-resource pairing but does not explicitly distinguish itself from sibling tools like manage_emails, which may also send emails.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides some context, such as recommending BCC CSV for large BCC lists and noting optional 'to' for forward actions. However, it lacks explicit when-to-use or when-not-to-use guidance and does not compare this tool to alternative siblings for similar tasks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

user_settingsA

Manage user settings with two actions: 'init' to initialize settings when configuration is missing or corrupted (requires multimodal_supported parameter to indicate if LLM supports image processing), 'update' to update one or more settings (supports partial updates). Note: 'init' action attempts to get user timezone from Graph API if authenticated, but works without login. 'update' action is purely local and requires no authentication. MULTIMODAL DETECTION: If you are a multimodal LLM that can process images, please set multimodal_supported=true when calling init or update.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform: 'init' to initialize settings when configuration is missing (requires multimodal_supported), 'update' to update one or more settings (partial update supported)
timezoneNoUser timezone in IANA format. Examples: 'America/New_York', 'Asia/Shanghai', 'Europe/London', 'UTC'. Only used with 'update' action.
page_sizeNoPage size for user browsing (default: 5, recommended range: 3-10). Only used with 'update' action.
llm_page_sizeNoPage size for LLM browsing (default: 20, recommended range: 10-50). Only used with 'update' action.
max_search_daysNoMaximum allowed search range in days (default: 90). Only used with 'update' action.
default_search_daysNoDefault number of days to search for emails when not specified (default: 7). Only used with 'update' action.
multimodal_supportedNoSet to true if the LLM supports multimodal capabilities (can process images). Used with both 'init' and 'update' actions. When true, email image attachments will include base64 content for the LLM to analyze.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose all behavioral traits. It does so comprehensively: explains that 'init' may attempt Graph API but works without login, 'update' is local and requires no auth, and includes a multimodal detection directive. 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections and no redundant sentences. It efficiently covers purpose, usage, parameter context, and behavioral notes without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (two actions, multiple parameters, auth context, no output schema), the description fully equips an agent to select and invoke correctly. It covers all necessary details: action selection, parameter applicability, authentication nuances, and a multimodal detection note.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 significant context by grouping parameters under actions and explaining the multimodal_supported parameter's role for LLMs, which goes beyond schema descriptions. However, it does not elaborate on parameter formats beyond what the schema provides, so not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool manages user settings with two distinct actions: 'init' for initialization and 'update' for modifications. It uniquely identifies each action's purpose and resource, and no sibling tool overlaps, ensuring clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance on when to use each action: 'init' when configuration is missing or corrupted, 'update' for partial updates. It also clarifies authentication requirements and the multimodal_supported parameter, leaving no ambiguity.

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.

  1. 15 tool updatesv0.1.0
    • First observedauth
    • First observedbrowse_email_cache
    • First observedbrowse_events
    • First observedcheck_attendee_availability
    • First observedget_email_content
    • First observedget_event_detail
    • First observedmanage_emails
    • First observedmanage_event_as_attendee
    • First observedmanage_event_as_organizer
    • First observedmanage_mail_folder
    • First observedsearch_contacts
    • First observedsearch_emails
    • First observedsearch_events
    • First observedsend_email
    • First observeduser_settings

TDQS

A4.1/5.0
Disambiguation4/5

Most tools have distinct purposes, but there is potential confusion between browse and search tools for emails and events. While descriptions clarify workflows, an agent might misuse browse vs search, causing some ambiguity.

Naming Consistency5/5

All tool names follow a consistent snake_case pattern with descriptive verb_noun or noun_verb combinations. The naming is predictable and intuitive across the entire set.

Tool Count5/5

15 tools is a well-scoped number for a server covering authentication, email, calendar, contacts, and settings. Each tool serves a clear function without being excessive or sparse.

Completeness4/5

The tool set covers core email and calendar operations thoroughly, including search, browse, manage, and send. However, it lacks contact creation/update/delete and other Graph features (e.g., users, groups, files), which are minor gaps.

Maintenance

ActivityInactive
ResponsivenessSyncing

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

Related MCP Servers

Latest Blog Posts

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/marlonluo2018/microsoft_graph_mcp_server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server