
List attachments for an email message with pagination support. Returns metadata only (id, name, size, contentType, isInline, lastModifiedDateTime) — use getmessageattachment for one attachment's content. selectfields overrides which fields are returned. messageid runs over 150 characters: copy it exactly from search results, and do not truncate it.
Get a specific attachment from an email message by ID. Returns full attachment details including base64-encoded content. Set returndownloadurl=true for a short-lived download URL instead (file attachments only). Both messageid and attachmentid run over 150 characters: copy them exactly from listmessageattachments, and do not truncate or rebuild them.
Get metadata for all attachments in an email message without downloading content. Returns only essential fields (id, name, size, contentType) with pagination support.
Retrieve calendar events within a time range with pagination support. When starttime and endtime are provided, automatically expands recurring meetings into individual occurrences. Returns event type and seriesMasterId.
Get a specific calendar event by ID. Event bodies are returned as plain text by default; pass bodyformat='html' for raw HTML. Use selectfields to limit which fields are returned.
Create a calendar event (one-time or recurring). Use recurrence parameter for recurring events.
Update a calendar event. For recurring events: updating an occurrence ID changes only that instance (creates an exception); updating the seriesMasterId (found in occurrence's seriesMasterId field) changes all future occurrences.
Delete a calendar event
Get today's calendar events
Get upcoming calendar events
Get past calendar events from previous days
Create a meeting with attendees (one-time or recurring)
Create a Teams meeting with enhanced online meeting support
Search for calendar events with pagination support
Get free/busy schedule information for users, distribution lists, or resources for a specified time period
Find optimal meeting times based on attendee availability, suggesting times that work for required participants
Retrieve contacts from a folder with pagination support
Get a specific contact by ID
Create a new contact
Update a contact
Delete a contact
Search for contacts with pagination support
Find contacts by email address with pagination support
Find contacts by company name with pagination support
Get all mail folders with pagination support
Get a specific mail folder by ID
Create a new mail folder
Update a mail folder
Delete a mail folder
Copy a mail folder
Move a mail folder
Get child folders of a parent folder with pagination support
Get a well-known folder by name
Get message counts for a folder
Retrieve messages from a mailbox folder, with pagination. Default fields: id, subject, from, toRecipients, receivedDateTime, sentDateTime, isRead, hasAttachments, importance, bodyPreview, conversationId, webLink. Body NOT included: use getmessage, or pass selectfields with the fields you want plus 'body' (it replaces the default). body_format applies only when a body is included.
Get a specific message by ID, including its body. Bodies are plain text by default; pass bodyformat='html' for raw HTML (HTML bodies can be very large). Set uniquebodyonly=true on a reply chain to get only this message's new content, dropping quoted history; it returns a wide but explicit field set, so a few rarely-read metadata fields are omitted. Use selectfields to limit fields returned.
Create a draft message. Attach files inline via attachments (base64 contentbytes, small files) and/or ONE large staged file via filereference (from the file upload API, POST /api/v1/files/, 3 MB to 100 MB) with filereferencefilename. Staged bytes stream into the draft without entering the model's context.
Send an email message
Update a message. Subject, body and recipients can only be changed while the message is still a draft; on sent or received mail only is_read, categories and importance are writable.
Delete a message
Move a message to another mail folder by folder ID. Use getmailfolders or getwellknown_folder to find the destination folder ID (e.g. the 'archive' folder).
Reply to an email message. Sends a reply to the original sender with the given comment text (set reply_all=true to reply to all recipients). Sends immediately; does not create a draft.
Mark a message as read
Mark a message as unread
Get unread messages from a folder with pagination support. Returns the same lean field set as getmessages (no message body); use getmessage to read one, or pass select_fields including 'body' to widen.
Search for messages with pagination support. Returns the same lean field set as getmessages (no message body); use getmessage to read one. Returns message IDs that are 150+ characters long. Copy the entire 'id' field exactly, and do not truncate or rebuild it.
List users in the organization with pagination support, filtering, ordering. B2B guests are excluded, so a page may return fewer than top rows; use pageinfo.nextskip_token to keep paging.
Search for users by name, email with pagination support and full-text search. B2B guests are excluded, so a page may return fewer than top rows; use pageinfo.nextskip_token to keep paging.
Get detailed user information by email address (userPrincipalName)
Validate Microsoft Graph API credentials by attempting to fetch the authenticated user's profile

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now