Ms Mail Skill logo

Ms Mail Skill

Community
zeenie-ai
ms-mail-skill

Send, read, search, reply to, and handle attachments of Outlook email via Microsoft Graph — for your own mailbox or a shared mailbox. Compose messages, list recent mail, search by text, reply/reply-all, and list or download file attachments (e.g. PDFs) for parsing.

Overview

Publisherzeenie-ai
RepositoryOpenCompany
Skill namems-mail-skill
Stars
912
Forks
137
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by zeenie-ai on GitHub. Read the source before you install it.

Installation

Install the Ms Mail Skill AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/zeenie-ai/OpenCompany.git /tmp/OpenCompany
mkdir -p .claude/skills
cp -r /tmp/OpenCompany/server/skills/productivity_agent/ms-mail-skill .claude/skills/ms-mail-skill
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Ms Mail Skill in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Ms Mail Skill on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Ms Mail Skill is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Outlook Mail Skill

Send, read, search, reply to, and handle attachments of email using the Microsoft Graph API (Outlook / Microsoft 365).

Tool: ms_mail

Consolidated Outlook Mail tool with an operation parameter.

Operations

OperationDescriptionRequired Fields
sendSend an emailto, subject, body
readRead a message by ID, or list recent mail when no ID is given(message_id optional)
searchSearch messages by textquery
replyReply to a messagereply_message_id, comment
list_attachmentsList a message's attachments (metadata only, no download)message_id
download_attachmentsDownload file attachments into the workspacemessage_id

Every read/search result includes a has_attachments boolean per message — check it before calling list_attachments / download_attachments.

send - Send an email

FieldTypeRequiredDescription
operationstringYesMust be "send"
tostringYesRecipient address(es), comma-separated
subjectstringYesEmail subject line
bodystringYesEmail body (plain text or HTML)
ccstringNoCC recipients (comma-separated)
bccstringNoBCC recipients (comma-separated)
body_typestringNo"text" or "html" (default: text)

Example - Send plain text email:

json
{
  "operation": "send",
  "to": "alice@contoso.com",
  "subject": "Meeting Tomorrow",
  "body": "Hi,\n\nJust a reminder about our meeting tomorrow at 2pm.\n\nBest regards"
}

Example - Send to multiple recipients with CC:

json
{
  "operation": "send",
  "to": "alice@contoso.com, bob@contoso.com",
  "cc": "manager@contoso.com",
  "subject": "Weekly Report",
  "body": "<h1>Weekly Report</h1><p>Highlights...</p>",
  "body_type": "html"
}

read - Read a message or list recent mail

FieldTypeRequiredDescription
operationstringYesMust be "read"
message_idstringNoMessage ID to fetch (with body). Omit to list recent messages.
max_resultsintegerNoMax messages when listing (default: 10, max: 100)

Each returned message includes has_attachments (boolean). When true, use list_attachments / download_attachments with that message_id.

Example - Read a specific message:

json
{
  "operation": "read",
  "message_id": "AAMkAGI2..."
}

Example - List the 20 most recent messages:

json
{
  "operation": "read",
  "max_results": 20
}

search - Search messages

FieldTypeRequiredDescription
operationstringYesMust be "search"
querystringYesFree-text search (Microsoft Graph $search)
search_max_resultsintegerNoMax results (default: 10, max: 100)

Microsoft Graph search matches across subject, body, sender, and recipients. Use natural keywords (e.g. invoice, from:jane quarterly plan); it does not use Gmail-style operators.

Example:

json
{
  "operation": "search",
  "query": "quarterly plan",
  "search_max_results": 20
}

reply - Reply to a message

FieldTypeRequiredDescription
operationstringYesMust be "reply"
reply_message_idstringYesID of the message to reply to (from search/read)
commentstringYesThe reply text
reply_allbooleanNoReply to all recipients (default: false)

Example:

json
{
  "operation": "reply",
  "reply_message_id": "AAMkAGI2...",
  "comment": "Thanks - looks good to me.",
  "reply_all": true
}

list_attachments - List a message's attachments (metadata only)

FieldTypeRequiredDescription
operationstringYesMust be "list_attachments"
message_idstringYesThe message whose attachments to list
include_inlinebooleanNoInclude inline body images (e.g. signature logos). Default false.

Returns attachments: [{attachment_id, name, content_type, size, is_inline, kind}] and count. kind is "file" for a downloadable file attachment; other values (itemAttachment, referenceAttachment) are shown so you know they cannot be downloaded as bytes. Inline images are excluded unless include_inline: true. This op does NOT download bytes — it is a cheap metadata lookup.

Example:

json
{
  "operation": "list_attachments",
  "message_id": "AAMkAGI2..."
}

download_attachments - Download file attachments into the workspace

FieldTypeRequiredDescription
operationstringYesMust be "download_attachments"
message_idstringYesThe message whose attachments to download
attachment_idstringNoDownload only this attachment. Omit to download all file attachments.
include_inlinebooleanNoInclude inline body images. Default false.

Saves each file attachment into the workflow workspace and returns:

  • attachments: [{filename, path, mime_type, size, ref}]path is the absolute file path on disk (feed it to the Document Parser's file_path).
  • download_dir — the absolute directory the files landed in (feed it to the Document Parser's input_dir to parse all of them).
  • count, and skipped: [{name, reason}] for anything not downloaded (inline images, item/reference attachments, or files over the size limit).

Only real file attachments are downloaded. Item/reference attachments and (by default) inline images are skipped. Bytes are never returned inline — you get a path/reference, not the file contents.

Example - download all file attachments:

json
{
  "operation": "download_attachments",
  "message_id": "AAMkAGI2..."
}

Example - download one specific attachment:

json
{
  "operation": "download_attachments",
  "message_id": "AAMkAGI2...",
  "attachment_id": "AAMkAGI2...=="
}

Parsing an attachment (e.g. a PDF)

ms_mail downloads the file; it does NOT extract text. To read a PDF's contents, pair it with the Document Parser node on the canvas:

  1. ms_mail download_attachments → returns download_dir (and per-file path).
  2. Document Parser with input_dir = {{msMail.download_dir}} and file_pattern = *.pdf (or file_path = {{msMail.attachments[0].path}} for one file).
  3. Document Parser returns documents[].content — the extracted text.

Common Workflows

  1. Triage recent mail: read with no ID to list recent messages, then read a specific message_id for full content.
  2. Find a thread: search by keyword, take the message_id, then reply.
  3. Send an update: send to one or more recipients, optionally as HTML.
  4. Process an attachment: on a message with has_attachments: true, call download_attachments, then run the Document Parser over download_dir to get the text.

Shared mailboxes

Every operation accepts an optional mailbox field. Leave it empty to use the signed-in user's own mailbox (default). Set it to a shared/other mailbox address (e.g. support@contoso.com) to operate on that mailbox instead — the node then calls /users/{address}/… rather than /me/….

Requirements for a shared mailbox:

  • The signed-in account must have Full Access on the mailbox (and Send As / Send on Behalf to send from it).
  • The Mail.ReadWrite.Shared / Mail.Send.Shared scopes must be granted (reconnect in the Credentials Modal after these are added to re-consent).

Example - read a shared mailbox:

json
{
  "operation": "read",
  "mailbox": "support@contoso.com",
  "max_results": 20
}

Setup Requirements

  1. Connect the Outlook Mail node to an AI Agent's input-tools handle.
  2. Authenticate with Microsoft Graph in the Credentials Modal (Work/School account).
  3. Ensure the Mail.Send and Mail.ReadWrite scopes are granted (plus the .Shared variants if you use the mailbox field for a shared mailbox).

Frequently asked questions

What does the Ms Mail Skill AI skill do?

Send, read, search, reply to, and handle attachments of Outlook email via Microsoft Graph — for your own mailbox or a shared mailbox. Compose messages, list recent mail, search by text, reply/reply-all, and list or download file attachments (e.g. PDFs) for parsing.

Why use Ms Mail Skill on TypingMind?

Because you install it once and use it with any model. Ms Mail Skill is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Ms Mail Skill in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/zeenie-ai/OpenCompany/tree/main/server/skills/productivity_agent/ms-mail-skill. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Ms Mail Skill?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Ms Mail Skill?

As many as you like. As long as a model supports skills, you can use Ms Mail Skill with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Ms Mail Skill AI skill free?

Yes. It is published on GitHub by zeenie-ai under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇