Β· 14 min read

Cowork Skills, Tools, and Skill Management

Going deeper into Cowork custom skills as an extensibility method to look at how to create, improve with the help of some powerful features with Skill Tools and a Quality Framework in use to assess your own skills to make effective skills that tailor capabilities to suit your personal ways of working.

Going deeper into Cowork custom skills as an extensibility method to look at how to create, improve with the help of some powerful features with Skill Tools and a Quality Framework in use to assess your own skills to make effective skills that tailor capabilities to suit your personal ways of working.

Introduction

In my earlier post about exploring the Cowork agent, I touched on custom skills toward the end - how you can create a SKILL.md file in your OneDrive and have Cowork use it as a personalised set of instructions for specific tasks. At the time, I noted a casing issue with the skills folder that prevented them from loading, but once fixed the feature started to work.

Since then I’ve been spending more time with skills: building new ones, understanding how the agent picks them up, and working out the best way to improve them over time with the new Skills Management skill. This post is a deeper look at all of that.

What Are Cowork Skills?

Skills are markdown files you author yourself that give Cowork specific, repeatable instructions for a type of task. Think of them as personal standard operating procedures - you define the steps once, and Cowork can follow them whenever a matching task comes up.

This is different from a prompt you type each time. A skill lives in your OneDrive, persists across sessions, and can be reused without you needing to remember or repeat the details.

Where Skills Live

Skills are stored in a specific folder in your OneDrive:

/Documents/Cowork/skills/

Each skill gets its own sub-folder named after the skill, and inside that folder you create a SKILL.md file. Using the example in my last blog post, the folder structure looks like this:

OneDrive/
└── Documents/
    └── Cowork/
        └── skills/
            β”œβ”€β”€ report-important-information-to-my-manager/
            β”‚   └── SKILL.md
            └── your-next-skill/
                └── SKILL.md

Important: At the moment, the folder name is case-sensitive. Use skills (all lowercase) β€” if your folder is named Skills or SKILLS, Cowork will not pick them up.

Location of skills folder in OneDrive showing the Cowork/skills folder structure

This structure follows a very similar pattern to GitHub Copilot Skills within a repo, or SharePoint Skills within the Agent Assets folder (Yes! That’s a thing now).

Creating a Skill File and it’s Structure

A SKILL.md file has two parts: a YAML frontmatter block and a markdown body. Not familiar with Markdown, check out this great resource Markdown Cheat Sheet to learn.

Frontmatter provides the metadata Cowork uses to identify and describe the skill, when analysing your Cowork task and prompt it will consider best fit or you can explicitly call them under the Add Work Content option. Here is an example of the skill file:

---
name: your-skill-name
description: A short description of what this skill does and when it should be used
---

Body is where you write the actual instructions. You can be as detailed as you need β€” Cowork will follow the steps you define. Structure it clearly with headings and bullet points.

Here is a full example:

---
name: report-important-information-to-my-manager
description: When I have important information to report to my line manager, I want to be able to do so in a clear and concise manner, so that they can understand the situation and take appropriate action if necessary with either Email or Teams Notifications
---

# Report Important Information to my Line Manager

You are a notification skill that helps me quickly report important information to my line manager.

## What should this skill do

Follow this process when reporting information

- Find my line manager
- Ask whether to notify by email or Teams message
- Ask how critical this is: Notify, Important, or Critical
- Ask the user what has happened, or refer to an email or message
- Ask the user if anyone else should be notified
- Write a message explaining the situation, including the criticality level
- Start a Teams chat to coordinate on the issue, named by the topic

Checking and Diagnosing Skills

Once you have created your skills, you can verify Cowork can see them by using the /skill command inside the Cowork chat. This will list the skills Cowork has loaded from your OneDrive folder.

Note: This feature was originally called β€œSkills” in the skills tab, which has been renamed to β€œSkills Management” and has some really good feature enhancements.

Screen showing the /skill command used to check which skills are loaded in Cowork

If a skill is missing or it is not behaving, either:

  • The skills list isn’t alphabetically organised, in my exploration this appears at the bottom of the list
  • Alternatively and the best way to diagnost the issues is to create a Cowork session and ask the agent if it can find the skill calling the /skills or Skill Management skill expclitly.

Building and Improving Skills with help from Cowork

When demoing Cowork recently, I showed the Skills Management Feature and it surprised me when it came out with a quality report after requesting a β€œQuality Audit” on the skill (from above and last blog post- 45/100 - Woot!. Actually despite a low score, this came up with some great suggestions to improve.

Cowork quality audit showing 45/100 as a result

Actually, this was a eye opener on multiple levels:

  • not only it has shown how to improve my own skill
  • it has shown the internal tools for Cowork that is called upon when running tasks e.g. GetManagerDetails, SendEmailWithAttachments, PostMessage. As it has indicated this being a flaw in my skill
  • Cowork Metadata? This is another aspect not in the docs, but feels like it would make sense since other built in skills have icons associated with them.

The tools aspect caught my eye the strongest, as this is the first time I have seen some form of reference to the full capabilities of the agent. There is a small voice in my mind this could have been made up by the LLM, but its the first time I have seen anything like this coming from an agent.

Documentation

Note: Supplied by Skills Management skill

As this next bit was based on the output from a prompt - this is a long reference. Here’s the full documentation for every tool organized by category:

πŸ“§ Outlook β€” Email

  • ListMessages β€” List emails ordered by date with optional filters (sender, date range, unread, flagged, has attachments, importance). Use this for β€œlatest emails” or β€œunread emails.” Supports pagination via next_link.

  • GetMessage β€” Get full content (subject, body, sender, attachments) of a specific email by ID. ID must come from a prior list/search call.

  • SearchM365 β€” Unified search across files, email, Teams, calendar, Power BI. Files use semantic search; email/Teams/calendar use keyword KQL. Filterable by date and sender.

  • SendEmailWithAttachments β€” Compose and send an email immediately. Supports recipients (names or addresses), CC/BCC, attachments (workspace files or OneDrive URIs), and importance level.

  • CreateDraftMessage β€” Create a draft in your Drafts folder without sending. Pair with UpdateDraft / AddDraftAttachments / SendDraftMessage.

  • UpdateDraft β€” Modify an existing draft’s recipients, subject, or body. Does not send.

  • SendDraftMessage β€” Send an existing draft by ID.

  • AddDraftAttachments β€” Attach workspace files to an existing draft.

  • ReplyToMessage β€” Reply to the sender of an email. Optional CC/BCC. Sends immediately.

  • ReplyAllToMessage β€” Reply to all original recipients. Optional additional CC/BCC.

  • ReplyWithFullThread β€” Same as ReplyToMessage but preserves the full quoted thread; supports adding new to recipients.

  • ReplyAllWithFullThread β€” Same as ReplyAllToMessage but preserves the full quoted thread.

  • ForwardMessage β€” Forward an email to new recipients with the quoted thread, optional comment.

  • ForwardMessageWithFullThread β€” Identical to ForwardMessage (alias).

  • MoveMessage β€” Move an email to a different folder (use folder ID or well-known name like inbox/archive/junkemail).

  • DeleteMessage β€” Soft-delete (moves to Deleted Items).

  • UpdateMessage β€” Edit mutable properties: read status, importance, categories, focused/other classification.

  • FlagEmail β€” Set or clear follow-up flag (flagged / notFlagged / complete).

  • UploadAttachment β€” Upload a small attachment (≀3 MB, base64) to a message.

  • UploadLargeAttachment β€” Upload a large attachment (3–150 MB, base64, chunked).

  • DeleteAttachment β€” Remove an attachment from a draft.

  • ListMailFolders β€” List inbox folders with unread counts and IDs.

  • GetMailFolder β€” Get details of a specific folder, optionally with child folders.

  • CreateMailFolder β€” Create a new mail folder.

  • ListMailRules β€” List inbox rules with conditions and actions.

  • CreateMailRule β€” Create an inbox rule. Simplified params for common conditions (sender, subject contains) and actions (move, forward, mark read, etc.).

  • UpdateMailRule β€” Modify an existing rule (e.g., enable/disable).

  • DeleteMailRule β€” Remove an inbox rule.

  • GetAutoReplySettings β€” Read current out-of-office state.

  • SetAutoReply β€” Enable OOO with internal/external messages, audience, optional schedule.

  • DisableAutoReply β€” Turn off OOO.


πŸ“… Outlook β€” Calendar

  • ListEvents β€” List calendar events. Returns master series for recurring meetings (not expanded instances).

  • ListCalendarView β€” List events in a date range with recurring meetings expanded into instances. Use for β€œwhat’s on my calendar this week.”

  • FindMeetingTimes β€” Suggest meeting times based on attendee availability, with duration and search window.

  • CreateEvent β€” Create a calendar event. Defaults to 30-minute Teams meeting unless is_online_meeting=false. Supports recurrence patterns.

  • UpdateEvent β€” Modify an event (time, attendees, body, location). Use scope=all_in_series for recurring series.

  • DeleteEventById β€” Delete an event. Series scope supported.

  • CancelEvent β€” Cancel an event you organized, with optional message.

  • AcceptEvent β€” Accept a meeting invite with optional comment.

  • DeclineEvent β€” Decline a meeting invite.

  • TentativelyAcceptEvent β€” Tentatively accept.

  • ForwardEvent β€” Forward an event as FYI (does not add as attendee β€” use UpdateEvent for that).

  • GetRooms β€” List meeting rooms in your tenant.

  • GetUserDateAndTimeZoneSettings β€” Get your mailbox time zone and working hours.


πŸ’¬ Teams

  • ListTeams β€” List teams you’ve joined.

  • GetTeam β€” Get details of a specific team.

  • ListChannels β€” List channels in a team.

  • GetChannel β€” Get details of a specific channel.

  • CreateChannel β€” Create a standard channel.

  • CreatePrivateChannel β€” Create a private channel with an owner.

  • UpdateChannel β€” Edit a channel’s display name or description.

  • ListChannelMembers β€” List members of a channel.

  • AddChannelMember β€” Add a user to a channel (use roles=['owner'] only for private channels).

  • UpdateChannelMember β€” Change a member’s role (owner / member).

  • ListChannelMessages β€” Read recent messages from a channel.

  • PostChannelMessage β€” Post a message to a channel (by team_id+channel_id or names). Supports subject line, attachments, and Adaptive Cards.

  • ReplyToChannelMessage β€” Reply to a specific message in a channel.

  • ListChats β€” List your recent chats. Filter by type (oneOnOne / group / meeting), unread, or member.

  • GetChat β€” Get details of a specific chat.

  • CreateChat β€” Create a new 1:1 or group chat. Provide other participants (you’re added automatically).

  • UpdateChat β€” Change a chat’s topic.

  • ListChatMembers β€” List members of a chat.

  • AddChatMember β€” Add a member to an existing chat.

  • ListChatMessages β€” Read messages from a chat. Pass person (name/email) to find their 1:1 chat automatically. Supports keyword and date filters.

  • GetChatMessage β€” Get a specific message from a chat.

  • PostMessage β€” Send a Teams message. Pass recipients (names or emails) β€” 1 person = 1:1, 2+ = group. Use recipients=['me'] for self-chat. Supports attachments and Adaptive Cards.

  • UpdateChatMessage β€” Edit the content of a chat message.

  • DeleteChatMessage β€” Delete a chat message.

  • GetMyRecentTranscripts β€” Get transcripts from your recent meetings within a date range.

  • ListMeetingTranscripts β€” List available transcripts for a Teams meeting (by join URL).

  • GetMeetingTranscript β€” Get the full text of a meeting transcript (timestamped, speaker-attributed).


πŸ“ SharePoint & OneDrive

  • GetSite β€” Get a SharePoint site by hostname+path or site ID.

  • SearchSites β€” Search for sites by name.

  • ListSubsites β€” List subsites of a parent site.

  • GetDefaultDrive β€” Get your personal OneDrive (no args), or a SharePoint site’s default doc library (with site_id).

  • ListDrives β€” List document libraries in a SharePoint site.

  • SearchDrive β€” Search for files/folders within a drive.

  • GetDriveChildren β€” List contents of a folder (by drive_id+item_id, item_path, or web_url).

  • GetDriveItem β€” Get metadata for a file or folder.

  • ReadFileContent β€” Read a file’s text content. Fastest with a download_url from a prior list/search. Binary files (docx, pdf) saved to workspace and path returned.

  • CreateFolder β€” Create a new folder in a drive.

  • ListLists β€” List SharePoint lists in a site.

  • ListListColumns β€” List columns in a SharePoint list.

  • ListListItems β€” List items in a SharePoint list with field values.


πŸ‘₯ People & Profile

  • GetMyDetails β€” Your own profile (name, email, title, department, office).

  • GetUserDetails β€” Look up a user by UPN or object ID. Will not work with display names β€” use SearchPeople first.

  • GetMultipleUsersDetails β€” Look up several users at once by UPN/IDs.

  • SearchPeople β€” Search by name or email; resolves contacts then directory.

  • GetManagerDetails β€” Get a user’s manager (defaults to you).

  • GetDirectReportsDetails β€” Get a user’s direct reports.


πŸ”Œ Microsoft Graph (raw)

  • QueryGraph β€” Make a GET request to any Graph API endpoint.

  • CallGraph β€” POST/PUT/PATCH to Graph (DELETE disabled). For operations not covered by specialized tools.

  • SearchM365 β€” Already listed under Email; spans files, email, Teams, calendar, Power BI.


πŸ—‚ Workspace File Operations

  • Read β€” Read a file’s contents. Supports text, images, PDFs (with page ranges), and Jupyter notebooks.

  • Write β€” Create or overwrite a file. Must read first if file exists.

  • Edit β€” Make exact string replacements in a file. Use replace_all for renames.

  • NotebookEdit β€” Edit a specific cell in a Jupyter notebook (replace, insert, delete).

  • Glob β€” Find files by pattern (e.g., input/**/*.xlsx).

  • Grep β€” Ripgrep-powered content search. Supports regex, file-type filters, multiline, context lines.

  • Bash β€” Run shell commands. Supports background execution and timeouts. Working directory persists.


🌐 Web & Images

  • web_search β€” Bing-powered search for current information. Use parallel calls for distinct subjects.

  • web_fetch β€” Fetch a web page and return its full text content.

  • search_images β€” Find public-license images by keyword. Returns 20+ Bing-hosted thumbnails per call.

  • render_ui β€” Render structured data as Adaptive Cards (charts, tables, KPIs, dashboards). One call per response.


βœ… Tasks & Planning

  • TaskCreate β€” Create a tracked task (subject, description, optional activeForm spinner text).

  • TaskUpdate β€” Update a task’s status, owner, dependencies, or details.

  • TaskGet β€” Get full details of a task.

  • TaskList β€” List all tasks with status and dependencies.

  • TaskOutput β€” Read output from a background task (deprecated β€” prefer reading the output file).

  • TaskStop β€” Stop a running background task.

  • AskUserQuestion β€” Pose 1–4 multiple-choice questions to the user (each with 2–4 options).

  • EnterPlanMode β€” Enter planning mode for non-trivial implementation work.

  • ExitPlanMode β€” Exit plan mode after the plan file is written.

  • EnterWorktree β€” Create an isolated git worktree (only on explicit instruction).

  • ExitWorktree β€” Leave a worktree session, keeping or removing it.

  • Skill β€” Invoke a skill by name (e.g., pdf, docx, daily-briefing).

  • Agent β€” Delegate a task to a specialized subagent (general-purpose, Explore, Plan, deep-research-agent, statusline-setup).


⏰ Scheduled Tasks

  • SetupScheduledPrompt β€” Create a recurring task. Frequency: Minute / Hour / Day / Week / Month / Once. One prompt per task.

  • GetScheduledPrompts β€” Read your existing scheduled tasks (returns version numbers).

  • EditScheduledPrompt β€” Modify an existing schedule (provide version for safe updates). Use state: paused to pause.

  • DeleteScheduledPrompt β€” Permanently remove a scheduled task.


WOW - This gives us all lots of areas to explore, and whilst I haven’t tested every single tool, not only can we β€œdeclare” them to be used in our skills, I have seen these types of actions happening when interacting with Cowork.

I have more: Skills Framework

Yes, there was a second discovery, In understanding how Cowork assesses skills, I just asked: β€œIs there a skills framework you use to assess skills?” - Yes there is a quality system to help you improve your skills with a scoring system, so let’s break this down into the follow areas based on the response:

  • Trigger Clarity - How precisely does the description tell the system when to invoke this skill?
  • Instruction Specificity - How actionable is the body?
  • Scope Boundaries - Does the skill know what it does NOT do?
  • Robustness - Does it handle edge cases and failures?

With additional tests in

  • Trigger Coverage Test - running evals about phrases of what should and shouldn’t trigger the skill
  • Optimisation Principles

All of the above are factors in the scoring system. Whilst this may change, try asking Cowork (when calling /skills feature) yourself against your skills.

Conclusion

Every time I look at Cowork either for building skills or using to explore the features, I find my self being mind-blown with the level and depth of features in this agent.

Custom skills are one of the most interesting parts of the Cowork experience, as this gives me as a developer and architect ways to tailor experience and discover opportunities to add value to others using the agent + plus I like to play with new toys lol.

I do feel that the Quality and ability to list the tools should be part of ALL agents Microsoft produce to see the full extent of the capabilities or an agent itself - why? Its the same problem of what Copilot aims to solve to break that β€œcreative or writers block”, there is a feeling of a β€œprompt block”, in where to start the conversation, and knowing the full extent of capabilities of the agent - like seeing all the colours in a colour palette.

I will keep building on my skills library and will share any patterns that emerge. If you build something interesting, I would love to hear about it.

Resources

The following resources could be useful for you to learn further:

Enjoy!

Back to Blog