PowerSkills - Work IQ
Microsoft 365 automation through the official Work IQ CLI. Talks straight to Graph via silent SSO, so it reaches mail, calendar, Teams, SharePoint, OneDrive, and People without needing a running Outlook desktop client.
Why not just use outlook?
| Aspect | powerskills workiq |
powerskills outlook |
|---|---|---|
| Backend | Microsoft Graph via Work IQ CLI | Local Outlook COM |
| Reach | Mail + Calendar + Teams + SharePoint + OneDrive + People | Mail + Calendar only |
| Outlook client required | No | Yes (must be running) |
| Elevation | Works from admin or user shell | Non-admin only (COM integrity) |
| Tenant setup | Requires user consent (some tenants need admin consent) | None |
| Output shape | Structured Graph entities + deep-links | COM properties |
Use workiq for the strong, cloud-side path. Keep outlook for offline or COM-only situations.
Requirements
- Windows 10 or 11
- PowerShell 5.1 or later
- Node.js and npm (for
installaction) - Microsoft 365 work account signed in on the machine (Windows Account Manager / SSO)
- Work IQ CLI (
workiq) onPATH- theinstallaction handles this
Setup in one command
If Work IQ is not installed yet, this skill can bootstrap it:
.\powerskills.ps1 workiq install
.\powerskills.ps1 workiq accept-eula
.\powerskills.ps1 workiq check
install runs npm install -g @microsoft/workiq. accept-eula records EULA acceptance. check reports version, EULA state, and whether the CLI is reachable on PATH.
Actions
.\powerskills.ps1 workiq <action> [--params]
| Action | Params | Description |
|---|---|---|
check |
Report install state: installed, version, path, eula_accepted |
|
install |
[--scope user|machine] |
Install Work IQ globally via npm (user scope by default) |
accept-eula |
Accept Work IQ EULA (required once before any query) | |
version |
Show Work IQ CLI version | |
ask |
--question "text" [--agent name] [--timeout 120] |
Natural-language query against a Work IQ agent |
agents |
[--get-card name] |
List Work IQ agents, or return one agent card |
fetch |
--url <graph-path> |
Fetch a Work IQ entity by path (e.g. /me, /me/messages) |
search-paths |
--filter <regex> [--backend graph-v1|sharepoint-rest|dataverse] |
Discover Graph paths by regex (helps build fetch/call-function URLs) |
get-schema |
--path <api-path> [--method get|post|patch|delete] [--api-version v1.0|beta] |
Return the OpenAPI schema for a given path |
call-function |
--url <path-with-query> |
Call a read-only Graph function (e.g. /me/calendar/getSchedule?...). Include the query string in --url. |
do-action |
--url <path> [--body <json>] |
POST a Graph action (e.g. /me/sendMail) |
create |
--url <collection> --body <json> |
POST a new entity (e.g. /me/messages) |
update |
--url <entity> --body <json> |
PATCH an existing entity (e.g. /me/events/{id}) |
delete |
--url <entity> |
DELETE an entity |
debug |
--conversation <id> |
Create a Work IQ debug share link for a conversation |
raw |
--args "arg1 arg2 ..." |
Escape hatch: run any raw workiq sub-command |
help |
Show this file |
Examples
# One-time setup
.\powerskills.ps1 workiq install
.\powerskills.ps1 workiq accept-eula
.\powerskills.ps1 workiq check
# Natural language against your inbox / calendar / Teams
.\powerskills.ps1 workiq ask --question "What's on my calendar tomorrow?"
.\powerskills.ps1 workiq ask --question "Summarize unread emails from the last 24h and prioritize"
.\powerskills.ps1 workiq ask --question "Show Teams messages from #engineering in the last 3 hours"
# List agents available in this tenant
.\powerskills.ps1 workiq agents
# Discover Graph paths and fetch entities
.\powerskills.ps1 workiq search-paths --filter "calendar"
.\powerskills.ps1 workiq fetch --url "/me/messages?$top=5"
.\powerskills.ps1 workiq get-schema --path "/me/calendar/events"
# Call a Graph function (query string lives in --url)
.\powerskills.ps1 workiq call-function --url "/me/calendar/getSchedule?startDateTime=2026-07-02T00:00:00&endDateTime=2026-07-02T23:59:59"
# Send a mail via Graph action
.\powerskills.ps1 workiq do-action --url "/me/sendMail" `
--body '{"message":{"subject":"Hi","body":{"contentType":"Text","content":"Test"},"toRecipients":[{"emailAddress":{"address":"someone@example.com"}}]}}'
# Escape hatch for anything the wrapper does not surface yet
.\powerskills.ps1 workiq raw --args "policy list"
Output
Every action returns the standard PowerSkills envelope:
{
"status": "success",
"exit_code": 0,
"data": { ... },
"timestamp": "2026-07-01T18:00:00+02:00"
}
For actions that surface raw Work IQ output (ask, raw, fetch), data contains:
stdout- the text Work IQ returned (ANSI codes are stripped)stderr- any warnings Work IQ printedexit_code- Work IQ's own exit codecommand- the exact argv that was executed (for debugging)
Structured actions (check, version, agents) return parsed fields.
Notes and quirks
- stdio transport only. Work IQ's
mcpcommand runs over stdio. This skill does not spin up an HTTP MCP server; if you want MCP integration, registerworkiq mcpin your host's MCP config directly. .cmdvs.exe. On Windows, calling shims from Node causesspawn EINVAL. This skill resolves the realworkiq.exeunder%APPDATA%\npm\node_modules\@microsoft\workiq\bin\win-x64\workiq.exewhen possible, and falls back to whatever is onPATH.- First-run consent. The first
askmay pop a browser window for consent. After that, silent SSO takes over. - Tenant policy. Some enterprise tenants require an admin to consent to Work IQ before users can use it. If
askfails with a consent error, share the message with your IT admin. - Deep-links can be long.
askoutput often contains multi-hundred-character deep-link URLs. The wrapper leaves them intact so the agent can follow them.