ask-marcel-office-cli 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +201 -0
- package/README.md +45 -26
- package/dist/cli.js +2964 -2446
- package/dist/commands.json +254 -727
- package/dist/composition/run-registry-command.d.ts +12 -3
- package/dist/domain/utilities/base64.d.ts +11 -0
- package/dist/index.js +2121 -1737
- package/dist/infra/auth.d.ts +30 -4
- package/dist/infra/browser-auth.d.ts +21 -1
- package/dist/presenter/output-text.d.ts +1 -1
- package/dist/presenter/output.d.ts +2 -2
- package/dist/presenter/render-to-string.d.ts +42 -2
- package/dist/use-cases/commands/command-types.d.ts +1 -20
- package/dist/use-cases/commands/create-forward-draft.d.ts +1 -1
- package/dist/use-cases/commands/create-reply-draft.d.ts +1 -1
- package/dist/use-cases/commands/docs-render.d.ts +0 -1
- package/dist/use-cases/commands/docx-metadata.d.ts +32 -2
- package/dist/use-cases/commands/draft-comment-splicer.d.ts +8 -1
- package/dist/use-cases/commands/include-hidden-folders.d.ts +2 -0
- package/dist/use-cases/commands/list-mail-folder-messages-delta.d.ts +10 -2
- package/dist/use-cases/commands/list-shared-mailbox-child-folders.d.ts +4 -0
- package/dist/use-cases/commands/list-shared-mailbox-folders.d.ts +4 -0
- package/dist/use-cases/commands/login-status.d.ts +2 -0
- package/dist/use-cases/commands/login.d.ts +18 -8
- package/dist/use-cases/commands/next-page.d.ts +1 -0
- package/dist/use-cases/commands/ooxml-xml-walker.d.ts +31 -6
- package/dist/use-cases/commands/pptx-comments.d.ts +8 -5
- package/dist/use-cases/commands/reject-unknown-params.d.ts +16 -0
- package/dist/use-cases/commands/resolve-command.d.ts +7 -9
- package/dist/use-cases/commands/search-onenote-pages.d.ts +1 -1
- package/dist/use-cases/commands/token-tier-capability.d.ts +5 -0
- package/dist/use-cases/commands/update-mail-draft.d.ts +4 -0
- package/docs/COMMANDS.md +15 -13
- package/docs/USAGE.md +2 -2
- package/package.json +25 -9
package/dist/commands.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "ask-marcel-office-cli",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"generatedAt": "2026-
|
|
3
|
+
"version": "2.4.0",
|
|
4
|
+
"generatedAt": "2026-09-02T16:06:32.040Z",
|
|
5
5
|
"commands": [
|
|
6
6
|
{
|
|
7
7
|
"name": "convert-calendar-event-attachment-to-markdown",
|
|
@@ -83,9 +83,6 @@
|
|
|
83
83
|
"name": "convert-drive-item-zip-to-markdown",
|
|
84
84
|
"summary": "Unzip a `.zip` from a OneDrive / SharePoint item and convert every contained file in one call — so \"read the handover archive\" doesn't need a separate unzip + per-file conversion. Office files (docx/xlsx/pptx/odt/ods/odp and their macro-enabled / template variants) are converted to markdown via the local pipelines; plain-text entries (txt/md/csv/json/yaml/…) are decoded inline; legacy OLE .xls (sheetjs) and .doc (word-extractor, text only) are extracted; an Outlook .msg entry is rendered to markdown (headers + body, with its own attachments converted recursively); PDFs have their text layer extracted (text/plain); images, binaries, nested archives, legacy .ppt, and scanned/image-only PDFs (no text layer) are listed with a note (not unpacked) so one unsupported entry never fails the whole archive. Pass `--include-metadata true` to append each Office file's side-channel metadata block. Capped at 100 entries (the archive is buffered in memory); beyond that the response is flagged `truncated`.",
|
|
85
85
|
"category": "drive",
|
|
86
|
-
"commandAliases": [
|
|
87
|
-
"convert-drive-item-zip"
|
|
88
|
-
],
|
|
89
86
|
"graphMethod": "GET",
|
|
90
87
|
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/content",
|
|
91
88
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/driveitem-get-content",
|
|
@@ -142,9 +139,6 @@
|
|
|
142
139
|
"name": "convert-local-file-to-markdown",
|
|
143
140
|
"summary": "Convert a file ON DISK to markdown — the only command that never calls Microsoft Graph (works offline, no login). Runs the same local pipelines as `download-drive-item-as-markdown`: docx (mammoth → turndown), xlsx (sheetjs tables, `--max-cells` OOM cap), pptx (per-slide text), odt/ods/odp, csv, pdf (text layer via unpdf), legacy OLE .xls / .doc, Outlook .msg (headers + body with the quoted reply chain stripped — `--keep-quoted true` restores it — and inline `cid:` images shown as placeholders, attachments converted recursively), plain-text passthrough — and a `.zip` is unpacked with every contained file converted in one call (legacy GBK / CP437 entry names decoded, not mojibaked). What it canNOT do locally: convert TO pdf, and Loop/Fluid/Whiteboard sources — both need a Graph server round-trip (upload to OneDrive and use the drive-item siblings). Pass `--include-metadata true` for the Office side-channel metadata blocks; `--inline-images true` to embed docx images as base64 data URIs.",
|
|
144
141
|
"category": "meta",
|
|
145
|
-
"commandAliases": [
|
|
146
|
-
"convert-local-file"
|
|
147
|
-
],
|
|
148
142
|
"graphMethod": "GET",
|
|
149
143
|
"graphPathTemplate": "(local) reads {path} from the local filesystem; not a Graph endpoint",
|
|
150
144
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/",
|
|
@@ -298,9 +292,6 @@
|
|
|
298
292
|
"name": "convert-mail-attachment-zip-to-markdown",
|
|
299
293
|
"summary": "Unzip a `.zip` Outlook mail attachment and convert every contained file in one call — the mail-side mirror of `convert-drive-item-zip-to-markdown`, so reading a zipped vendor deck doesn't need `get-mail-attachment` + manual `unzip` + per-file conversion. Pulls the fileAttachment bytes, unzips them (legacy GBK / CP437 entry names — Chinese vendor archives written by WinRAR / Windows Explorer — are decoded correctly, not mojibaked), and runs each file through the local pipelines: Office files (docx/xlsx/pptx/odt/ods/odp and macro-enabled / template variants) → markdown; plain-text entries decoded inline; legacy OLE .xls (sheetjs) and .doc (word-extractor, text only) extracted; an inner Outlook .msg rendered; PDFs have their text layer extracted; images, binaries, nested archives, legacy .ppt, and scanned/image-only PDFs are listed with a note (not unpacked) so one unsupported entry never fails the whole archive. Pass `--include-metadata true` to append each Office file's side-channel metadata block. Capped at 100 entries; beyond that the response is flagged `truncated`. itemAttachment / referenceAttachment are rejected (no inline zip payload).",
|
|
300
294
|
"category": "mail",
|
|
301
|
-
"commandAliases": [
|
|
302
|
-
"convert-mail-attachment-zip"
|
|
303
|
-
],
|
|
304
295
|
"graphMethod": "GET",
|
|
305
296
|
"graphPathTemplate": "/me/messages/{message-id}/attachments/{attachment-id}",
|
|
306
297
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/attachment-get",
|
|
@@ -359,13 +350,7 @@
|
|
|
359
350
|
"name": "message-id",
|
|
360
351
|
"key": "messageId",
|
|
361
352
|
"required": true,
|
|
362
|
-
"
|
|
363
|
-
{
|
|
364
|
-
"name": "id",
|
|
365
|
-
"key": "id"
|
|
366
|
-
}
|
|
367
|
-
],
|
|
368
|
-
"description": "Outlook message ID. Returned by `list-mail-messages` or `list-mail-folder-messages`. Accepts `--id` as an alias."
|
|
353
|
+
"description": "Outlook message ID. Returned by `list-mail-messages` or `list-mail-folder-messages`."
|
|
369
354
|
},
|
|
370
355
|
{
|
|
371
356
|
"name": "inline-images",
|
|
@@ -377,7 +362,7 @@
|
|
|
377
362
|
"name": "keep-quoted",
|
|
378
363
|
"key": "keepQuoted",
|
|
379
364
|
"required": false,
|
|
380
|
-
"description": "Quoted reply chains and forwarded-message blocks are stripped by default (they duplicate content already present in earlier messages and inflate the context budget). The stripped tail is replaced with a single visible marker naming this flag, so nothing is removed silently. Pass `--keep-quoted true` to preserve the full body. Only well-known structural markers are cut: in HTML bodies Outlook `divRplyFwdMsg` / `appendonsend` / `stopSpelling`, Gmail `gmail_quote`, the Outlook reply border separator (`#E1E1E1` on desktop, `#B5C4DF` on Mac/mobile), and a bold `From:`/`Sent:` header-label pair (localized variants recognized: 发件人/发送时间, De/Envoyé, Von/Gesendet, Da/Inviato, De/Enviado, Van/Verzonden, 差出人/送信日時, 보낸 사람/보낸 날짜 — a lone bolded \"From:\" without its companion label never cuts); in plain-text bodies the `Original Message` banner, the `On … wrote:` attribution line, leading `>` quote lines, and the same localized `From:`+`Sent:` line pairs.",
|
|
365
|
+
"description": "Quoted reply chains and forwarded-message blocks are stripped by default (they duplicate content already present in earlier messages and inflate the context budget). The stripped tail is replaced with a single visible marker naming this flag, so nothing is removed silently. Pass `--keep-quoted true` to preserve the full body. Only well-known structural markers are cut: in HTML bodies Outlook `divRplyFwdMsg` / `appendonsend` / `stopSpelling`, Gmail `gmail_quote`, the Outlook reply border separator (`#E1E1E1` on desktop, `#B5C4DF` on Mac/mobile, in either the hex or the `border-color:rgb(…)` longhand new Outlook writes), the new-Outlook `mail-editor-reference-message-container` but only when a header block opens inside it (the same id also wraps a body that quotes nothing, so the id alone never cuts), and a bold `From:`/`Sent:` header-label pair (localized variants recognized: 发件人/发送时间, De/Envoyé, Von/Gesendet, Da/Inviato, De/Enviado, Van/Verzonden, 差出人/送信日時, 보낸 사람/보낸 날짜 — a lone bolded \"From:\" without its companion label never cuts); in plain-text bodies the `Original Message` banner, the `On … wrote:` attribution line, leading `>` quote lines, and the same localized `From:`+`Sent:` line pairs. When a chain is stripped the `note` reports what share of the body’s readable text went with it (`removed 62% of the body text`), so a caller can tell a normal strip from one that swallowed the message without refetching to compare.",
|
|
381
366
|
"argumentHint": {
|
|
382
367
|
"kind": "magicValue",
|
|
383
368
|
"values": [
|
|
@@ -388,7 +373,7 @@
|
|
|
388
373
|
}
|
|
389
374
|
],
|
|
390
375
|
"example": "ask-marcel-office convert-mail-to-markdown --message-id 'AAMkAD...'",
|
|
391
|
-
"responseShape": "`{ contentType: \"text/markdown\", size, text, note? }` — headers + turndown-rendered body + (when present) a file-attachments list. The optional `note` carries a partial-success hint when the attachments-metadata fetch fails after the body succeeded, and/or a flag that a quoted reply chain was stripped (
|
|
376
|
+
"responseShape": "`{ contentType: \"text/markdown\", size, text, note? }` — headers + turndown-rendered body + (when present) a file-attachments list. The optional `note` carries a partial-success hint when the attachments-metadata fetch fails after the body succeeded, and/or a flag that a quoted reply chain was stripped, carrying the share of the body’s readable text that went with it (`quoted reply chain stripped (removed 62% of the body text) — pass --keep-quoted true to include it`). A share near 100% on a message that should have had a real reply above the quote is the signature of a mis-detected boundary: refetch with `--keep-quoted true` to confirm.",
|
|
392
377
|
"producesBytes": true
|
|
393
378
|
},
|
|
394
379
|
{
|
|
@@ -403,13 +388,7 @@
|
|
|
403
388
|
"name": "forward-message-id",
|
|
404
389
|
"key": "forwardMessageId",
|
|
405
390
|
"required": true,
|
|
406
|
-
"
|
|
407
|
-
{
|
|
408
|
-
"name": "id",
|
|
409
|
-
"key": "id"
|
|
410
|
-
}
|
|
411
|
-
],
|
|
412
|
-
"description": "The message being forwarded. Source from list-mail-folder-messages or search-mail-messages. Accepts `--id` as an alias.",
|
|
391
|
+
"description": "The message being forwarded. Source from list-mail-folder-messages or search-mail-messages.",
|
|
413
392
|
"argumentHint": {
|
|
414
393
|
"kind": "idOrName"
|
|
415
394
|
}
|
|
@@ -427,10 +406,10 @@
|
|
|
427
406
|
"description": "Comma-separated list of CC recipient email addresses."
|
|
428
407
|
},
|
|
429
408
|
{
|
|
430
|
-
"name": "
|
|
431
|
-
"key": "
|
|
409
|
+
"name": "comment",
|
|
410
|
+
"key": "comment",
|
|
432
411
|
"required": true,
|
|
433
|
-
"description": "The comment text, placed above the quoted forwarded message. Plain text by default; pass --body-content-type HTML to send it as markup."
|
|
412
|
+
"description": "The comment text, placed above the quoted forwarded message. Named for Graph's own createForward payload field, and the same word update-mail-draft uses for the same role. Plain text by default; pass --body-content-type HTML to send it as markup."
|
|
434
413
|
},
|
|
435
414
|
{
|
|
436
415
|
"name": "subject",
|
|
@@ -442,7 +421,7 @@
|
|
|
442
421
|
"name": "body-content-type",
|
|
443
422
|
"key": "bodyContentType",
|
|
444
423
|
"required": false,
|
|
445
|
-
"description": "Format of --
|
|
424
|
+
"description": "Format of --comment: Text (default) or HTML. Text is handed to Graph as the forward comment, which HTML-escapes it, so markup shows as literal characters. HTML instead creates the draft with an empty comment and splices your markup in at the TOP of the body — above Graph's separator (the `<hr>` line) and the forwarded original, so your comment leads the body content — leaving the original and its styles byte-identical. Rejected when your markup itself contains a quote boundary marker (a pasted reply chain), and when the original is a plain-text message.",
|
|
446
425
|
"argumentHint": {
|
|
447
426
|
"kind": "magicValue",
|
|
448
427
|
"values": [
|
|
@@ -452,9 +431,9 @@
|
|
|
452
431
|
}
|
|
453
432
|
}
|
|
454
433
|
],
|
|
455
|
-
"example": "ask-marcel-office create-forward-draft --forward-message-id \"AAMkAD...\" --to-recipients \"bob@example.com\" --
|
|
434
|
+
"example": "ask-marcel-office create-forward-draft --forward-message-id \"AAMkAD...\" --to-recipients \"bob@example.com\" --comment \"Bob owns this now, forwarding for your action.\"",
|
|
456
435
|
"responseShape": "A confirmation of the write, NOT the whole message: `{ id, subject, toRecipients, ccRecipients, bccRecipients, importance, bodyPreview, isDraft, webLink, conversationId }` (only the fields Graph returned; `{ ok: true }` when Graph answers 204). The `body` is deliberately omitted — you just wrote it, and echoing a long thread's quoted history back cost ~174 KB of context per call. Read the full body with `get-mail-message --id <the returned id>` when you actually need it; `bodyPreview` is Graph's ~255-char summary, enough to confirm WHICH draft answered. The `id` is the draft — refine it with `update-mail-draft`, or open Outlook Drafts to review and send. Dedup caveat: a `conversationId` `$filter` on the Drafts folder is not a reliable 'does a draft already exist on this thread' check. Reply and forward drafts do not always inherit the inbound message's `conversationId` (one thread can split across several), and Graph `$filter` on Drafts is not read-your-writes consistent, so a just-created draft can be missed. To find existing drafts, use the `find-mail-drafts` command, which scans recent drafts and matches client-side on subject and recipients; to revise a draft this session created, reuse the returned `id`.",
|
|
457
|
-
"bodyTemplate": "Text: POST { comment: '{
|
|
436
|
+
"bodyTemplate": "Text: POST { comment: '{comment}', toRecipients: '{to-recipients}' } then optional PATCH { ccRecipients?: '{cc-recipients}', subject?: '{subject}' }. HTML ({body-content-type}): POST { comment: '', toRecipients: '{to-recipients}' } then ONE PATCH { body: { contentType: 'HTML', content: <'{comment}' spliced at the top of the body, above Graph's <hr> separator and the quote> }, ccRecipients?: '{cc-recipients}', subject?: '{subject}' }",
|
|
458
437
|
"mutates": true
|
|
459
438
|
},
|
|
460
439
|
{
|
|
@@ -549,28 +528,22 @@
|
|
|
549
528
|
"name": "reply-to-message-id",
|
|
550
529
|
"key": "replyToMessageId",
|
|
551
530
|
"required": true,
|
|
552
|
-
"
|
|
553
|
-
{
|
|
554
|
-
"name": "id",
|
|
555
|
-
"key": "id"
|
|
556
|
-
}
|
|
557
|
-
],
|
|
558
|
-
"description": "The message being replied to. Source from list-mail-folder-messages or search-mail-messages. Accepts `--id` as an alias.",
|
|
531
|
+
"description": "The message being replied to. Source from list-mail-folder-messages or search-mail-messages.",
|
|
559
532
|
"argumentHint": {
|
|
560
533
|
"kind": "idOrName"
|
|
561
534
|
}
|
|
562
535
|
},
|
|
563
536
|
{
|
|
564
|
-
"name": "
|
|
565
|
-
"key": "
|
|
537
|
+
"name": "comment",
|
|
538
|
+
"key": "comment",
|
|
566
539
|
"required": true,
|
|
567
|
-
"description": "The reply text, placed above the quoted history. Plain text by default; pass --body-content-type HTML to send it as markup."
|
|
540
|
+
"description": "The reply text, placed above the quoted history. Named for Graph's own createReply payload field, and the same word update-mail-draft uses for the same role. Plain text by default; pass --body-content-type HTML to send it as markup."
|
|
568
541
|
},
|
|
569
542
|
{
|
|
570
543
|
"name": "body-content-type",
|
|
571
544
|
"key": "bodyContentType",
|
|
572
545
|
"required": false,
|
|
573
|
-
"description": "Format of --
|
|
546
|
+
"description": "Format of --comment: Text (default) or HTML. Text is handed to Graph as the reply comment, which HTML-escapes it, so markup shows as literal characters. HTML instead creates the draft with an empty comment and splices your markup in at the TOP of the body — above Graph's reply separator (the `<hr>` line) and the quoted thread, so your reply leads the body content — leaving the quoted thread and its styles byte-identical. Rejected when your markup itself contains a quote boundary marker (a pasted reply chain), and when the thread is a plain-text one.",
|
|
574
547
|
"argumentHint": {
|
|
575
548
|
"kind": "magicValue",
|
|
576
549
|
"values": [
|
|
@@ -599,9 +572,9 @@
|
|
|
599
572
|
}
|
|
600
573
|
}
|
|
601
574
|
],
|
|
602
|
-
"example": "ask-marcel-office create-reply-draft --reply-to-message-id \"AAMkAD...\" --
|
|
575
|
+
"example": "ask-marcel-office create-reply-draft --reply-to-message-id \"AAMkAD...\" --comment \"Confirmed for Contoso, aligned with the group choice.\"",
|
|
603
576
|
"responseShape": "A confirmation of the write, NOT the whole message: `{ id, subject, toRecipients, ccRecipients, bccRecipients, importance, bodyPreview, isDraft, webLink, conversationId }` (only the fields Graph returned; `{ ok: true }` when Graph answers 204). The `body` is deliberately omitted — you just wrote it, and echoing a long thread's quoted history back cost ~174 KB of context per call. Read the full body with `get-mail-message --id <the returned id>` when you actually need it; `bodyPreview` is Graph's ~255-char summary, enough to confirm WHICH draft answered. The `id` is the draft — refine it with `update-mail-draft`, or open Outlook Drafts to review and send. Dedup caveat: a `conversationId` `$filter` on the Drafts folder is not a reliable 'does a draft already exist on this thread' check. Reply and forward drafts do not always inherit the inbound message's `conversationId` (one thread can split across several), and Graph `$filter` on Drafts is not read-your-writes consistent, so a just-created draft can be missed. To find existing drafts, use the `find-mail-drafts` command, which scans recent drafts and matches client-side on subject and recipients; to revise a draft this session created, reuse the returned `id`.",
|
|
604
|
-
"bodyTemplate": "Text: POST { comment: '{
|
|
577
|
+
"bodyTemplate": "Text: POST { comment: '{comment}' } then optional PATCH { subject?: '{subject}' }. HTML ({body-content-type}): POST { comment: '' } then ONE PATCH { body: { contentType: 'HTML', content: <'{comment}' spliced at the top of the body, above Graph's <hr> separator and the quote> }, subject?: '{subject}' }",
|
|
605
578
|
"mutates": true
|
|
606
579
|
},
|
|
607
580
|
{
|
|
@@ -634,7 +607,7 @@
|
|
|
634
607
|
"name": "include-metadata",
|
|
635
608
|
"key": "includeMetadata",
|
|
636
609
|
"required": false,
|
|
637
|
-
"description": "Pass `--include-metadata true` to surface the side-channel content the rendered body hides. For docx (`## DOCX metadata`): core/app/custom document properties, people registry, external hyperlinks, comments, tracked changes (
|
|
610
|
+
"description": "Pass `--include-metadata true` to surface the side-channel content the rendered body hides. For docx (`## DOCX metadata`): core/app/custom document properties, people registry, external hyperlinks, comments, tracked changes (a deletion sitting next to an insertion by the same author is reported once as a `replacement` carrying `before` + `after`; the halves that pair with nothing stay under `insertions` / `deletions`; `moves` joins the two ends of a moved span by its range name; `formatChanges` names which run or paragraph properties a reviewer altered. Table-structure revisions — cell insert / delete / merge, numbering and section properties — are still unreported), hidden-formatted text (w:vanish), field instructions (MERGEFIELD / HYPERLINK / DOCVARIABLE), bookmarks. For xlsx (`## Workbook metadata`): core/app/custom properties, external relationships, defined names, hidden / very-hidden sheets, legacy cell comments, threaded comments, persons. For pptx (`## PPTX metadata`): properties, external relationships, slide tags, comment authors + comments (legacy + modern), and per-slide title / speaker notes / hidden flag — returned as a standalone document since pptx has no convertible body (use `download-drive-item-as-pdf` for slide visuals). For OpenDocument (`.odt`/`.ods`/`.odp`, `## OpenDocument metadata`): Dublin Core + ODF properties, keywords, user-defined custom fields — appended after the converted body. Each OOXML family also covers its macro-enabled (`.docm` / `.xlsm` / `.pptm`) and template (`.dotx` / `.xltx` / `.potx`, etc.) variants, with a `### Macros (VBA)` section flagging an embedded `vbaProject.bin`. No-op on other sources.",
|
|
638
611
|
"argumentHint": {
|
|
639
612
|
"kind": "magicValue",
|
|
640
613
|
"values": [
|
|
@@ -715,9 +688,6 @@
|
|
|
715
688
|
"name": "download-drive-item-content",
|
|
716
689
|
"summary": "Download the binary content of a file stored in OneDrive / SharePoint, with the bytes inlined. The CLI follows the Graph 302 → SharePoint media-transform redirect internally so the LLM never has to fetch an external URL. The bytes are CONTENT-SNIFFED, not judged by extension: if they decode as valid UTF-8 they come back as `{contentType: \"text/plain\", size, text}` (avoids ~33% base64 bloat, works for any text file regardless of name); otherwise as `{contentType, size, base64}`. A binary file that happens to be named `.txt` is returned faithfully as base64 — never silently corrupted into `�` by a forced text decode.",
|
|
717
690
|
"category": "drive",
|
|
718
|
-
"commandAliases": [
|
|
719
|
-
"download-onedrive-file-content"
|
|
720
|
-
],
|
|
721
691
|
"graphMethod": "GET",
|
|
722
692
|
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/content",
|
|
723
693
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/driveitem-get-content",
|
|
@@ -915,13 +885,7 @@
|
|
|
915
885
|
"name": "message-id",
|
|
916
886
|
"key": "messageId",
|
|
917
887
|
"required": true,
|
|
918
|
-
"
|
|
919
|
-
{
|
|
920
|
-
"name": "id",
|
|
921
|
-
"key": "id"
|
|
922
|
-
}
|
|
923
|
-
],
|
|
924
|
-
"description": "Outlook message ID. Returned by `list-mail-messages` or `list-mail-folder-messages`. Accepts `--id` as an alias."
|
|
888
|
+
"description": "Outlook message ID. Returned by `list-mail-messages` or `list-mail-folder-messages`."
|
|
925
889
|
}
|
|
926
890
|
],
|
|
927
891
|
"example": "ask-marcel-office extract-sharepoint-links-in-mail --message-id 'AAMkADk0...'",
|
|
@@ -995,12 +959,6 @@
|
|
|
995
959
|
"name": "event-id",
|
|
996
960
|
"key": "eventId",
|
|
997
961
|
"required": true,
|
|
998
|
-
"aliases": [
|
|
999
|
-
{
|
|
1000
|
-
"name": "id",
|
|
1001
|
-
"key": "id"
|
|
1002
|
-
}
|
|
1003
|
-
],
|
|
1004
962
|
"description": "Microsoft Graph event ID. Returned by `ask-marcel-office list-calendar-events` in the `id` field of each event."
|
|
1005
963
|
},
|
|
1006
964
|
{
|
|
@@ -1067,12 +1025,6 @@
|
|
|
1067
1025
|
"name": "chat-id",
|
|
1068
1026
|
"key": "chatId",
|
|
1069
1027
|
"required": true,
|
|
1070
|
-
"aliases": [
|
|
1071
|
-
{
|
|
1072
|
-
"name": "id",
|
|
1073
|
-
"key": "id"
|
|
1074
|
-
}
|
|
1075
|
-
],
|
|
1076
1028
|
"description": "Microsoft Teams chat ID, e.g. `19:abc...@thread.v2`. Returned by `list-chats`."
|
|
1077
1029
|
},
|
|
1078
1030
|
{
|
|
@@ -1134,13 +1086,7 @@
|
|
|
1134
1086
|
"name": "item-id",
|
|
1135
1087
|
"key": "itemId",
|
|
1136
1088
|
"required": true,
|
|
1137
|
-
"description": "driveItem ID of the folder whose subtree to track. Use the root folder ID from `get-drive-root-item` to track the entire drive.
|
|
1138
|
-
"aliases": [
|
|
1139
|
-
{
|
|
1140
|
-
"name": "folder-id",
|
|
1141
|
-
"key": "folderId"
|
|
1142
|
-
}
|
|
1143
|
-
]
|
|
1089
|
+
"description": "driveItem ID of the folder whose subtree to track. Use the root folder ID from `get-drive-root-item` to track the entire drive."
|
|
1144
1090
|
},
|
|
1145
1091
|
{
|
|
1146
1092
|
"name": "top",
|
|
@@ -1154,18 +1100,6 @@
|
|
|
1154
1100
|
"required": false,
|
|
1155
1101
|
"description": "OData $select: comma-separated list of fields to include in each item (e.g. `id,subject,from`). May shrink payloads dramatically — Graph honors $select on most endpoints, but some collections (notably `/me/mailboxSettings`, `/me/outlook/masterCategories`, `/me/mailFolders/inbox/messageRules`) silently ignore it and always return the full resource. Bogus field names are silently dropped by Graph — if a field you asked for is missing from the response, double-check the spelling against the documented `responseShape`."
|
|
1156
1102
|
},
|
|
1157
|
-
{
|
|
1158
|
-
"name": "filter",
|
|
1159
|
-
"key": "filter",
|
|
1160
|
-
"required": false,
|
|
1161
|
-
"description": "OData $filter: predicate to narrow results server-side. Quoting rules: string literals MUST use SINGLE quotes (`subject eq 'invoice'`), NOT double quotes — Graph rejects `subject eq \"invoice\"` with `InvalidFilterClause`. To embed a single quote inside a string, double it (`subject eq 'O''Brien'`). Booleans, numbers, and dates are unquoted (`isRead eq false`, `receivedDateTime ge 2026-01-01T00:00:00Z`). Wrap the whole flag value in shell DOUBLE quotes so the inner single quotes survive (`--filter \"subject eq 'invoice'\"`). Same syntax Graph documents per resource type."
|
|
1162
|
-
},
|
|
1163
|
-
{
|
|
1164
|
-
"name": "orderby",
|
|
1165
|
-
"key": "orderby",
|
|
1166
|
-
"required": false,
|
|
1167
|
-
"description": "OData $orderby: sort expression with optional asc/desc (e.g. `receivedDateTime desc`). Some Graph filter combinations are rejected; remove $orderby if InefficientFilter occurs."
|
|
1168
|
-
},
|
|
1169
1103
|
{
|
|
1170
1104
|
"name": "expand",
|
|
1171
1105
|
"key": "expand",
|
|
@@ -1377,18 +1311,6 @@
|
|
|
1377
1311
|
"required": false,
|
|
1378
1312
|
"description": "OData $select: comma-separated list of fields to include in each item (e.g. `id,subject,from`). May shrink payloads dramatically — Graph honors $select on most endpoints, but some collections (notably `/me/mailboxSettings`, `/me/outlook/masterCategories`, `/me/mailFolders/inbox/messageRules`) silently ignore it and always return the full resource. Bogus field names are silently dropped by Graph — if a field you asked for is missing from the response, double-check the spelling against the documented `responseShape`."
|
|
1379
1313
|
},
|
|
1380
|
-
{
|
|
1381
|
-
"name": "filter",
|
|
1382
|
-
"key": "filter",
|
|
1383
|
-
"required": false,
|
|
1384
|
-
"description": "OData $filter: predicate to narrow results server-side. Quoting rules: string literals MUST use SINGLE quotes (`subject eq 'invoice'`), NOT double quotes — Graph rejects `subject eq \"invoice\"` with `InvalidFilterClause`. To embed a single quote inside a string, double it (`subject eq 'O''Brien'`). Booleans, numbers, and dates are unquoted (`isRead eq false`, `receivedDateTime ge 2026-01-01T00:00:00Z`). Wrap the whole flag value in shell DOUBLE quotes so the inner single quotes survive (`--filter \"subject eq 'invoice'\"`). Same syntax Graph documents per resource type."
|
|
1385
|
-
},
|
|
1386
|
-
{
|
|
1387
|
-
"name": "orderby",
|
|
1388
|
-
"key": "orderby",
|
|
1389
|
-
"required": false,
|
|
1390
|
-
"description": "OData $orderby: sort expression with optional asc/desc (e.g. `receivedDateTime desc`). Some Graph filter combinations are rejected; remove $orderby if InefficientFilter occurs."
|
|
1391
|
-
},
|
|
1392
1314
|
{
|
|
1393
1315
|
"name": "expand",
|
|
1394
1316
|
"key": "expand",
|
|
@@ -1412,12 +1334,6 @@
|
|
|
1412
1334
|
"name": "drive-id",
|
|
1413
1335
|
"key": "driveId",
|
|
1414
1336
|
"required": true,
|
|
1415
|
-
"aliases": [
|
|
1416
|
-
{
|
|
1417
|
-
"name": "id",
|
|
1418
|
-
"key": "id"
|
|
1419
|
-
}
|
|
1420
|
-
],
|
|
1421
1337
|
"description": "Microsoft Graph drive ID. Use `ask-marcel-office list-drives` for the personal OneDrive, or `ask-marcel-office list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
1422
1338
|
},
|
|
1423
1339
|
{
|
|
@@ -1638,12 +1554,6 @@
|
|
|
1638
1554
|
"name": "group-id",
|
|
1639
1555
|
"key": "groupId",
|
|
1640
1556
|
"required": true,
|
|
1641
|
-
"aliases": [
|
|
1642
|
-
{
|
|
1643
|
-
"name": "id",
|
|
1644
|
-
"key": "id"
|
|
1645
|
-
}
|
|
1646
|
-
],
|
|
1647
1557
|
"description": "Azure AD group object ID. Use `list-groups` to find one."
|
|
1648
1558
|
},
|
|
1649
1559
|
{
|
|
@@ -1711,13 +1621,7 @@
|
|
|
1711
1621
|
"name": "message-id",
|
|
1712
1622
|
"key": "messageId",
|
|
1713
1623
|
"required": true,
|
|
1714
|
-
"
|
|
1715
|
-
{
|
|
1716
|
-
"name": "id",
|
|
1717
|
-
"key": "id"
|
|
1718
|
-
}
|
|
1719
|
-
],
|
|
1720
|
-
"description": "Outlook message ID. Returned by `ask-marcel-office list-mail-messages` or `list-mail-folder-messages`. Accepts `--id` as an alias."
|
|
1624
|
+
"description": "Outlook message ID. Returned by `ask-marcel-office list-mail-messages` or `list-mail-folder-messages`."
|
|
1721
1625
|
},
|
|
1722
1626
|
{
|
|
1723
1627
|
"name": "select",
|
|
@@ -1747,13 +1651,7 @@
|
|
|
1747
1651
|
"name": "message-id",
|
|
1748
1652
|
"key": "messageId",
|
|
1749
1653
|
"required": true,
|
|
1750
|
-
"
|
|
1751
|
-
{
|
|
1752
|
-
"name": "id",
|
|
1753
|
-
"key": "id"
|
|
1754
|
-
}
|
|
1755
|
-
],
|
|
1756
|
-
"description": "Outlook message ID. Returned by `list-mail-messages` or `search-mail-messages`. Accepts `--id` as an alias."
|
|
1654
|
+
"description": "Outlook message ID. Returned by `list-mail-messages` or `search-mail-messages`."
|
|
1757
1655
|
}
|
|
1758
1656
|
],
|
|
1759
1657
|
"example": "ask-marcel-office get-mail-message-mime --message-id 'AAMkAD...'",
|
|
@@ -1778,17 +1676,7 @@
|
|
|
1778
1676
|
"name": "message-rule-id",
|
|
1779
1677
|
"key": "messageRuleId",
|
|
1780
1678
|
"required": true,
|
|
1781
|
-
"description": "Message rule ID. Returned by `list-mail-rules`."
|
|
1782
|
-
"aliases": [
|
|
1783
|
-
{
|
|
1784
|
-
"name": "id",
|
|
1785
|
-
"key": "id"
|
|
1786
|
-
},
|
|
1787
|
-
{
|
|
1788
|
-
"name": "rule-id",
|
|
1789
|
-
"key": "ruleId"
|
|
1790
|
-
}
|
|
1791
|
-
]
|
|
1679
|
+
"description": "Message rule ID. Returned by `list-mail-rules`."
|
|
1792
1680
|
}
|
|
1793
1681
|
],
|
|
1794
1682
|
"example": "ask-marcel-office get-mail-rule --message-rule-id 'AQAAANC...'",
|
|
@@ -1806,13 +1694,7 @@
|
|
|
1806
1694
|
"name": "message-id",
|
|
1807
1695
|
"key": "messageId",
|
|
1808
1696
|
"required": false,
|
|
1809
|
-
"
|
|
1810
|
-
{
|
|
1811
|
-
"name": "id",
|
|
1812
|
-
"key": "id"
|
|
1813
|
-
}
|
|
1814
|
-
],
|
|
1815
|
-
"description": "Read the signature from THIS message instead of scanning the sent folder. Use when the scan finds nothing (the message was composed in Outlook desktop) or to pin a specific signature. Source from list-mail-folder-messages --mail-folder-id sentitems. Accepts `--id` as an alias.",
|
|
1697
|
+
"description": "Read the signature from THIS message instead of scanning the sent folder. Use when the scan finds nothing (the message was composed in Outlook desktop) or to pin a specific signature. Source from list-mail-folder-messages --mail-folder-id sentitems.",
|
|
1816
1698
|
"argumentHint": {
|
|
1817
1699
|
"kind": "idOrName"
|
|
1818
1700
|
}
|
|
@@ -1905,17 +1787,7 @@
|
|
|
1905
1787
|
"name": "onenote-page-id",
|
|
1906
1788
|
"key": "onenotePageId",
|
|
1907
1789
|
"required": true,
|
|
1908
|
-
"description": "OneNote page ID. Returned by `ask-marcel-office list-onenote-section-pages`."
|
|
1909
|
-
"aliases": [
|
|
1910
|
-
{
|
|
1911
|
-
"name": "id",
|
|
1912
|
-
"key": "id"
|
|
1913
|
-
},
|
|
1914
|
-
{
|
|
1915
|
-
"name": "page-id",
|
|
1916
|
-
"key": "pageId"
|
|
1917
|
-
}
|
|
1918
|
-
]
|
|
1790
|
+
"description": "OneNote page ID. Returned by `ask-marcel-office list-onenote-section-pages`."
|
|
1919
1791
|
},
|
|
1920
1792
|
{
|
|
1921
1793
|
"name": "inline-images",
|
|
@@ -1960,17 +1832,7 @@
|
|
|
1960
1832
|
"name": "onenote-page-id",
|
|
1961
1833
|
"key": "onenotePageId",
|
|
1962
1834
|
"required": true,
|
|
1963
|
-
"description": "OneNote page ID. Returned by `ask-marcel-office list-onenote-section-pages`."
|
|
1964
|
-
"aliases": [
|
|
1965
|
-
{
|
|
1966
|
-
"name": "id",
|
|
1967
|
-
"key": "id"
|
|
1968
|
-
},
|
|
1969
|
-
{
|
|
1970
|
-
"name": "page-id",
|
|
1971
|
-
"key": "pageId"
|
|
1972
|
-
}
|
|
1973
|
-
]
|
|
1835
|
+
"description": "OneNote page ID. Returned by `ask-marcel-office list-onenote-section-pages`."
|
|
1974
1836
|
}
|
|
1975
1837
|
],
|
|
1976
1838
|
"example": "ask-marcel-office get-onenote-page-content --onenote-page-id '1-abc...'",
|
|
@@ -2013,17 +1875,7 @@
|
|
|
2013
1875
|
"name": "planner-bucket-id",
|
|
2014
1876
|
"key": "plannerBucketId",
|
|
2015
1877
|
"required": true,
|
|
2016
|
-
"description": "Planner bucket ID. Returned by `ask-marcel-office list-plan-buckets`."
|
|
2017
|
-
"aliases": [
|
|
2018
|
-
{
|
|
2019
|
-
"name": "id",
|
|
2020
|
-
"key": "id"
|
|
2021
|
-
},
|
|
2022
|
-
{
|
|
2023
|
-
"name": "bucket-id",
|
|
2024
|
-
"key": "bucketId"
|
|
2025
|
-
}
|
|
2026
|
-
]
|
|
1878
|
+
"description": "Planner bucket ID. Returned by `ask-marcel-office list-plan-buckets`."
|
|
2027
1879
|
}
|
|
2028
1880
|
],
|
|
2029
1881
|
"example": "ask-marcel-office get-planner-bucket --planner-bucket-id 'sFNeQRFu_kqhxpwwAhmA15gAGfoT'",
|
|
@@ -2041,17 +1893,7 @@
|
|
|
2041
1893
|
"name": "planner-plan-id",
|
|
2042
1894
|
"key": "plannerPlanId",
|
|
2043
1895
|
"required": true,
|
|
2044
|
-
"description": "Planner plan ID. Returned in the `planId` field of any task from `ask-marcel-office list-planner-tasks`."
|
|
2045
|
-
"aliases": [
|
|
2046
|
-
{
|
|
2047
|
-
"name": "id",
|
|
2048
|
-
"key": "id"
|
|
2049
|
-
},
|
|
2050
|
-
{
|
|
2051
|
-
"name": "plan-id",
|
|
2052
|
-
"key": "planId"
|
|
2053
|
-
}
|
|
2054
|
-
]
|
|
1896
|
+
"description": "Planner plan ID. Returned in the `planId` field of any task from `ask-marcel-office list-planner-tasks`."
|
|
2055
1897
|
}
|
|
2056
1898
|
],
|
|
2057
1899
|
"example": "ask-marcel-office get-planner-plan --planner-plan-id 'xqQg5FS2LkCp935s-FIFm5gAB6'",
|
|
@@ -2069,17 +1911,7 @@
|
|
|
2069
1911
|
"name": "planner-task-id",
|
|
2070
1912
|
"key": "plannerTaskId",
|
|
2071
1913
|
"required": true,
|
|
2072
|
-
"description": "Planner task ID. Returned by `ask-marcel-office list-planner-tasks` or `list-plan-tasks`.
|
|
2073
|
-
"aliases": [
|
|
2074
|
-
{
|
|
2075
|
-
"name": "id",
|
|
2076
|
-
"key": "id"
|
|
2077
|
-
},
|
|
2078
|
-
{
|
|
2079
|
-
"name": "task-id",
|
|
2080
|
-
"key": "taskId"
|
|
2081
|
-
}
|
|
2082
|
-
]
|
|
1914
|
+
"description": "Planner task ID. Returned by `ask-marcel-office list-planner-tasks` or `list-plan-tasks`."
|
|
2083
1915
|
}
|
|
2084
1916
|
],
|
|
2085
1917
|
"example": "ask-marcel-office get-planner-task --planner-task-id '01tx7Ic7-USXEwt0lvR1cmgAH8gK'",
|
|
@@ -2097,17 +1929,7 @@
|
|
|
2097
1929
|
"name": "planner-task-id",
|
|
2098
1930
|
"key": "plannerTaskId",
|
|
2099
1931
|
"required": true,
|
|
2100
|
-
"description": "Planner task ID. Returned by `ask-marcel-office list-planner-tasks` or `list-plan-tasks`.
|
|
2101
|
-
"aliases": [
|
|
2102
|
-
{
|
|
2103
|
-
"name": "id",
|
|
2104
|
-
"key": "id"
|
|
2105
|
-
},
|
|
2106
|
-
{
|
|
2107
|
-
"name": "task-id",
|
|
2108
|
-
"key": "taskId"
|
|
2109
|
-
}
|
|
2110
|
-
]
|
|
1932
|
+
"description": "Planner task ID. Returned by `ask-marcel-office list-planner-tasks` or `list-plan-tasks`."
|
|
2111
1933
|
}
|
|
2112
1934
|
],
|
|
2113
1935
|
"example": "ask-marcel-office get-planner-task-details --planner-task-id '01tx7Ic7-USXEwt0lvR1cmgAH8gK'",
|
|
@@ -2125,36 +1947,18 @@
|
|
|
2125
1947
|
"name": "schedules",
|
|
2126
1948
|
"key": "schedules",
|
|
2127
1949
|
"required": true,
|
|
2128
|
-
"aliases": [
|
|
2129
|
-
{
|
|
2130
|
-
"name": "emails",
|
|
2131
|
-
"key": "emails"
|
|
2132
|
-
}
|
|
2133
|
-
],
|
|
2134
1950
|
"description": "Comma-separated SMTP addresses of the users and/or room resources to check (e.g. `alice@contoso.com,bob@contoso.com,room-4a@contoso.com`). Resolve names to addresses first via `list-relevant-people` or `microsoft-search-query`."
|
|
2135
1951
|
},
|
|
2136
1952
|
{
|
|
2137
1953
|
"name": "start-date-time",
|
|
2138
1954
|
"key": "startDateTime",
|
|
2139
1955
|
"required": true,
|
|
2140
|
-
"aliases": [
|
|
2141
|
-
{
|
|
2142
|
-
"name": "start",
|
|
2143
|
-
"key": "start"
|
|
2144
|
-
}
|
|
2145
|
-
],
|
|
2146
1956
|
"description": "Window lower bound (interpreted as UTC). ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
2147
1957
|
},
|
|
2148
1958
|
{
|
|
2149
1959
|
"name": "end-date-time",
|
|
2150
1960
|
"key": "endDateTime",
|
|
2151
1961
|
"required": true,
|
|
2152
|
-
"aliases": [
|
|
2153
|
-
{
|
|
2154
|
-
"name": "end",
|
|
2155
|
-
"key": "end"
|
|
2156
|
-
}
|
|
2157
|
-
],
|
|
2158
1962
|
"description": "Window upper bound (interpreted as UTC). Graph caps the span at 62 days. ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
2159
1963
|
},
|
|
2160
1964
|
{
|
|
@@ -2261,12 +2065,6 @@
|
|
|
2261
2065
|
"name": "site-id",
|
|
2262
2066
|
"key": "siteId",
|
|
2263
2067
|
"required": true,
|
|
2264
|
-
"aliases": [
|
|
2265
|
-
{
|
|
2266
|
-
"name": "id",
|
|
2267
|
-
"key": "id"
|
|
2268
|
-
}
|
|
2269
|
-
],
|
|
2270
2068
|
"description": "SharePoint site ID. Either the composite ID (`hostname,site-collection-id,site-id`) returned by `ask-marcel-office search-sharepoint-sites-by-name`, or the literal `root` to refer to the tenant root site."
|
|
2271
2069
|
},
|
|
2272
2070
|
{
|
|
@@ -2411,13 +2209,7 @@
|
|
|
2411
2209
|
"name": "list-item-id",
|
|
2412
2210
|
"key": "listItemId",
|
|
2413
2211
|
"required": true,
|
|
2414
|
-
"description": "listItem ID (typically a small integer). Returned by `ask-marcel-office list-sharepoint-site-list-items`."
|
|
2415
|
-
"aliases": [
|
|
2416
|
-
{
|
|
2417
|
-
"name": "item-id",
|
|
2418
|
-
"key": "itemId"
|
|
2419
|
-
}
|
|
2420
|
-
]
|
|
2212
|
+
"description": "listItem ID (typically a small integer). Returned by `ask-marcel-office list-sharepoint-site-list-items`."
|
|
2421
2213
|
},
|
|
2422
2214
|
{
|
|
2423
2215
|
"name": "select",
|
|
@@ -2453,13 +2245,7 @@
|
|
|
2453
2245
|
"name": "onenote-page-id",
|
|
2454
2246
|
"key": "onenotePageId",
|
|
2455
2247
|
"required": true,
|
|
2456
|
-
"description": "OneNote page ID inside the site."
|
|
2457
|
-
"aliases": [
|
|
2458
|
-
{
|
|
2459
|
-
"name": "page-id",
|
|
2460
|
-
"key": "pageId"
|
|
2461
|
-
}
|
|
2462
|
-
]
|
|
2248
|
+
"description": "OneNote page ID inside the site."
|
|
2463
2249
|
}
|
|
2464
2250
|
],
|
|
2465
2251
|
"example": "ask-marcel-office get-sharepoint-site-onenote-page-content --site-id 'contoso.sharepoint.com,...' --onenote-page-id 'p1'",
|
|
@@ -2478,12 +2264,6 @@
|
|
|
2478
2264
|
"name": "site-id",
|
|
2479
2265
|
"key": "siteId",
|
|
2480
2266
|
"required": true,
|
|
2481
|
-
"aliases": [
|
|
2482
|
-
{
|
|
2483
|
-
"name": "id",
|
|
2484
|
-
"key": "id"
|
|
2485
|
-
}
|
|
2486
|
-
],
|
|
2487
2267
|
"description": "SharePoint site ID."
|
|
2488
2268
|
}
|
|
2489
2269
|
],
|
|
@@ -2538,12 +2318,6 @@
|
|
|
2538
2318
|
"name": "team-id",
|
|
2539
2319
|
"key": "teamId",
|
|
2540
2320
|
"required": true,
|
|
2541
|
-
"aliases": [
|
|
2542
|
-
{
|
|
2543
|
-
"name": "id",
|
|
2544
|
-
"key": "id"
|
|
2545
|
-
}
|
|
2546
|
-
],
|
|
2547
2321
|
"description": "Microsoft Teams team ID. Returned by `ask-marcel-office list-joined-teams`."
|
|
2548
2322
|
},
|
|
2549
2323
|
{
|
|
@@ -2610,12 +2384,6 @@
|
|
|
2610
2384
|
"name": "team-id",
|
|
2611
2385
|
"key": "teamId",
|
|
2612
2386
|
"required": true,
|
|
2613
|
-
"aliases": [
|
|
2614
|
-
{
|
|
2615
|
-
"name": "id",
|
|
2616
|
-
"key": "id"
|
|
2617
|
-
}
|
|
2618
|
-
],
|
|
2619
2387
|
"description": "Microsoft Teams team ID. Returned by `list-joined-teams`."
|
|
2620
2388
|
},
|
|
2621
2389
|
{
|
|
@@ -2672,29 +2440,13 @@
|
|
|
2672
2440
|
"name": "todo-task-list-id",
|
|
2673
2441
|
"key": "todoTaskListId",
|
|
2674
2442
|
"required": true,
|
|
2675
|
-
"description": "To Do task list ID. Returned by `ask-marcel-office list-todo-task-lists`."
|
|
2676
|
-
"aliases": [
|
|
2677
|
-
{
|
|
2678
|
-
"name": "task-list-id",
|
|
2679
|
-
"key": "taskListId"
|
|
2680
|
-
},
|
|
2681
|
-
{
|
|
2682
|
-
"name": "todo-list-id",
|
|
2683
|
-
"key": "todoListId"
|
|
2684
|
-
}
|
|
2685
|
-
]
|
|
2443
|
+
"description": "To Do task list ID. Returned by `ask-marcel-office list-todo-task-lists`."
|
|
2686
2444
|
},
|
|
2687
2445
|
{
|
|
2688
2446
|
"name": "todo-task-id",
|
|
2689
2447
|
"key": "todoTaskId",
|
|
2690
2448
|
"required": true,
|
|
2691
|
-
"description": "To Do task ID. Returned by `ask-marcel-office list-todo-tasks`.
|
|
2692
|
-
"aliases": [
|
|
2693
|
-
{
|
|
2694
|
-
"name": "task-id",
|
|
2695
|
-
"key": "taskId"
|
|
2696
|
-
}
|
|
2697
|
-
]
|
|
2449
|
+
"description": "To Do task ID. Returned by `ask-marcel-office list-todo-tasks`."
|
|
2698
2450
|
},
|
|
2699
2451
|
{
|
|
2700
2452
|
"name": "select",
|
|
@@ -2714,7 +2466,7 @@
|
|
|
2714
2466
|
},
|
|
2715
2467
|
{
|
|
2716
2468
|
"name": "get-user",
|
|
2717
|
-
"summary": "Look up a directory user. Pass an Azure AD id, UPN, or email as --user-id and get that user's FULL profile (displayName, mail, jobTitle, department, officeLocation, phones) via GET /users/{id} on the elevated M365 token
|
|
2469
|
+
"summary": "Look up a directory user. Pass an Azure AD id, UPN, or email as --user-id and get that user's FULL profile (displayName, mail, jobTitle, department, officeLocation, phones) via GET /users/{id} on the basic token — no elevated login needed. On a tenant that restricts basic directory reads the id path falls back to the elevated M365 token; re-capture that with `ask-marcel-office login` (preflight tiers with `ask-marcel-office scopes-check`, no Graph call). An email resolves even when it is the user's `mail` rather than their sign-in UPN: guest / B2B users carry a `#EXT#` UPN whose local part is NOT their email address, so when the direct lookup 404s the command falls back to `GET /users?$filter=mail eq '<email>'` and returns the single match. Only THIS tenant's directory is queried: a person's home-tenant object id (e.g. a cross-tenant Teams `8:orgid:<home-id>` participant, whose id lives in their own tenant) and any email that is not their `mail`/UPN here are unresolvable by design — reach an external person via their LOCAL guest projection (by name, or by their real `mail`), never by their home id. Pass a NAME instead and it searches your relevant-people graph (GET /me/people) and returns candidate matches (id, displayName, mail, jobTitle, department) so you can pick the right person and re-query. Re-query by the candidate's `id` when it is a directory GUID; an EXTERNAL contact's candidate carries a base64-ish People-API id instead, which nothing can resolve — re-query those by the candidate's `mail` (the CLI rejects an opaque contact id with that remedy rather than returning empty matches). Name search covers colleagues in your people graph, not the whole tenant directory; use `microsoft-search-query` for a broader tenant-wide person search. Without `--select`, the profile ships a default projection of id, displayName, userPrincipalName, mail, jobTitle, department, officeLocation, businessPhones, mobilePhone.",
|
|
2718
2470
|
"category": "user",
|
|
2719
2471
|
"graphMethod": "GET",
|
|
2720
2472
|
"graphPathTemplate": "/users/{user-id} (id / UPN; an email that misses falls back to /users?$filter=mail eq) OR /me/people?$search=\"{user-id}\" (a bare name)",
|
|
@@ -2724,13 +2476,7 @@
|
|
|
2724
2476
|
"name": "user-id",
|
|
2725
2477
|
"key": "userId",
|
|
2726
2478
|
"required": true,
|
|
2727
|
-
"
|
|
2728
|
-
{
|
|
2729
|
-
"name": "id",
|
|
2730
|
-
"key": "id"
|
|
2731
|
-
}
|
|
2732
|
-
],
|
|
2733
|
-
"description": "Azure AD user ID, UPN, or email (returns the full profile via the elevated token), OR a display name (returns relevant-people candidates on the basic token). Discover ids via `list-relevant-people` or `microsoft-search-query`."
|
|
2479
|
+
"description": "Azure AD user ID, UPN, or email (returns the full profile via the basic token, falling back to the elevated token only on tenants that restrict basic directory reads), OR a display name (returns relevant-people candidates on the basic token). Discover ids via `list-relevant-people` or `microsoft-search-query`."
|
|
2734
2480
|
},
|
|
2735
2481
|
{
|
|
2736
2482
|
"name": "select",
|
|
@@ -2746,7 +2492,7 @@
|
|
|
2746
2492
|
}
|
|
2747
2493
|
],
|
|
2748
2494
|
"example": "ask-marcel-office get-user --user-id 'alice@contoso.com' --select 'id,displayName,mail,jobTitle,department'",
|
|
2749
|
-
"responseShape": "For an id / UPN / email: a single Microsoft Graph `user` resource projected to the default `$select` (id, displayName, userPrincipalName, mail, jobTitle, department, officeLocation, businessPhones, mobilePhone) unless `--select` overrides it; honours `--expand`. An email is tried against the sign-in UPN first, then falls back to the `mail` attribute (`$filter=mail eq`) so guest/B2B users resolve; an email that matches nobody returns the direct-path 404. For a name: `{ query, matches: [{ id, displayName, mail, jobTitle, department }] }` from the People API (empty `matches` when nobody in your relevant-people graph matches; re-query by a chosen GUID `id`, or by `mail` when the candidate is an external contact with a base64-ish People-API id — passing that id back is rejected with the same remedy). The id path
|
|
2495
|
+
"responseShape": "For an id / UPN / email: a single Microsoft Graph `user` resource projected to the default `$select` (id, displayName, userPrincipalName, mail, jobTitle, department, officeLocation, businessPhones, mobilePhone) unless `--select` overrides it; honours `--expand`. An email is tried against the sign-in UPN first, then falls back to the `mail` attribute (`$filter=mail eq`) so guest/B2B users resolve; an email that matches nobody returns the direct-path 404. For a name: `{ query, matches: [{ id, displayName, mail, jobTitle, department }] }` from the People API (empty `matches` when nobody in your relevant-people graph matches; re-query by a chosen GUID `id`, or by `mail` when the candidate is an external contact with a base64-ish People-API id — passing that id back is rejected with the same remedy). The id path resolves on the basic token; on a tenant that restricts basic directory reads it falls back to the elevated M365 token, which fail-fasts with `secondary_token_unavailable` when that token is cold (preflight with `ask-marcel-office scopes-check`, re-capture with `ask-marcel-office login`).",
|
|
2750
2496
|
"needsElevatedToken": true
|
|
2751
2497
|
},
|
|
2752
2498
|
{
|
|
@@ -2761,12 +2507,6 @@
|
|
|
2761
2507
|
"name": "user-id",
|
|
2762
2508
|
"key": "userId",
|
|
2763
2509
|
"required": true,
|
|
2764
|
-
"aliases": [
|
|
2765
|
-
{
|
|
2766
|
-
"name": "id",
|
|
2767
|
-
"key": "id"
|
|
2768
|
-
}
|
|
2769
|
-
],
|
|
2770
2510
|
"description": "Azure AD user ID or UPN — typically the user's email address. Discover via `list-relevant-people` (relevance-ranked colleagues) or `microsoft-search-query --query <name>` (federated person search across the tenant directory)."
|
|
2771
2511
|
},
|
|
2772
2512
|
{
|
|
@@ -2876,12 +2616,6 @@
|
|
|
2876
2616
|
"name": "event-id",
|
|
2877
2617
|
"key": "eventId",
|
|
2878
2618
|
"required": true,
|
|
2879
|
-
"aliases": [
|
|
2880
|
-
{
|
|
2881
|
-
"name": "id",
|
|
2882
|
-
"key": "id"
|
|
2883
|
-
}
|
|
2884
|
-
],
|
|
2885
2619
|
"description": "Outlook calendar event ID. Returned by `ask-marcel-office list-calendar-events` or `get-calendar-event`."
|
|
2886
2620
|
},
|
|
2887
2621
|
{
|
|
@@ -2950,36 +2684,18 @@
|
|
|
2950
2684
|
"name": "event-id",
|
|
2951
2685
|
"key": "eventId",
|
|
2952
2686
|
"required": true,
|
|
2953
|
-
"aliases": [
|
|
2954
|
-
{
|
|
2955
|
-
"name": "id",
|
|
2956
|
-
"key": "id"
|
|
2957
|
-
}
|
|
2958
|
-
],
|
|
2959
2687
|
"description": "Recurring event ID. Returned by `ask-marcel-office list-specific-calendar-events`."
|
|
2960
2688
|
},
|
|
2961
2689
|
{
|
|
2962
2690
|
"name": "start-date-time",
|
|
2963
2691
|
"key": "startDateTime",
|
|
2964
2692
|
"required": true,
|
|
2965
|
-
"aliases": [
|
|
2966
|
-
{
|
|
2967
|
-
"name": "start",
|
|
2968
|
-
"key": "start"
|
|
2969
|
-
}
|
|
2970
|
-
],
|
|
2971
2693
|
"description": "Lower bound. ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
2972
2694
|
},
|
|
2973
2695
|
{
|
|
2974
2696
|
"name": "end-date-time",
|
|
2975
2697
|
"key": "endDateTime",
|
|
2976
2698
|
"required": true,
|
|
2977
|
-
"aliases": [
|
|
2978
|
-
{
|
|
2979
|
-
"name": "end",
|
|
2980
|
-
"key": "end"
|
|
2981
|
-
}
|
|
2982
|
-
],
|
|
2983
2699
|
"description": "Upper bound. ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
2984
2700
|
},
|
|
2985
2701
|
{
|
|
@@ -3103,12 +2819,6 @@
|
|
|
3103
2819
|
"name": "calendar-group-id",
|
|
3104
2820
|
"key": "calendarGroupId",
|
|
3105
2821
|
"required": true,
|
|
3106
|
-
"aliases": [
|
|
3107
|
-
{
|
|
3108
|
-
"name": "id",
|
|
3109
|
-
"key": "id"
|
|
3110
|
-
}
|
|
3111
|
-
],
|
|
3112
2822
|
"description": "Calendar group ID. Returned by `list-calendar-groups`."
|
|
3113
2823
|
},
|
|
3114
2824
|
{
|
|
@@ -3213,24 +2923,12 @@
|
|
|
3213
2923
|
"name": "start-date-time",
|
|
3214
2924
|
"key": "startDateTime",
|
|
3215
2925
|
"required": true,
|
|
3216
|
-
"aliases": [
|
|
3217
|
-
{
|
|
3218
|
-
"name": "start",
|
|
3219
|
-
"key": "start"
|
|
3220
|
-
}
|
|
3221
|
-
],
|
|
3222
2926
|
"description": "Lower bound. ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
3223
2927
|
},
|
|
3224
2928
|
{
|
|
3225
2929
|
"name": "end-date-time",
|
|
3226
2930
|
"key": "endDateTime",
|
|
3227
2931
|
"required": true,
|
|
3228
|
-
"aliases": [
|
|
3229
|
-
{
|
|
3230
|
-
"name": "end",
|
|
3231
|
-
"key": "end"
|
|
3232
|
-
}
|
|
3233
|
-
],
|
|
3234
2932
|
"description": "Upper bound. ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
3235
2933
|
},
|
|
3236
2934
|
{
|
|
@@ -3285,24 +2983,12 @@
|
|
|
3285
2983
|
"name": "start-date-time",
|
|
3286
2984
|
"key": "startDateTime",
|
|
3287
2985
|
"required": true,
|
|
3288
|
-
"aliases": [
|
|
3289
|
-
{
|
|
3290
|
-
"name": "start",
|
|
3291
|
-
"key": "start"
|
|
3292
|
-
}
|
|
3293
|
-
],
|
|
3294
2986
|
"description": "Lower bound (required on the first call only — the deltaLink token encodes it for resumes). ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
3295
2987
|
},
|
|
3296
2988
|
{
|
|
3297
2989
|
"name": "end-date-time",
|
|
3298
2990
|
"key": "endDateTime",
|
|
3299
2991
|
"required": true,
|
|
3300
|
-
"aliases": [
|
|
3301
|
-
{
|
|
3302
|
-
"name": "end",
|
|
3303
|
-
"key": "end"
|
|
3304
|
-
}
|
|
3305
|
-
],
|
|
3306
2992
|
"description": "Upper bound (required on the first call only — the deltaLink token encodes it for resumes). ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
3307
2993
|
},
|
|
3308
2994
|
{
|
|
@@ -3377,12 +3063,6 @@
|
|
|
3377
3063
|
"name": "chat-id",
|
|
3378
3064
|
"key": "chatId",
|
|
3379
3065
|
"required": true,
|
|
3380
|
-
"aliases": [
|
|
3381
|
-
{
|
|
3382
|
-
"name": "id",
|
|
3383
|
-
"key": "id"
|
|
3384
|
-
}
|
|
3385
|
-
],
|
|
3386
3066
|
"description": "Microsoft Teams chat ID, e.g. `19:abc...@thread.v2`. Source the ID via `ask-marcel-office list-chats` (returns chat metadata for the signed-in user). Alternative sources outside the CLI: the Teams desktop / web client (Open in browser → URL contains the chat thread ID), Microsoft Graph Explorer, or URL-decode the `19%3ameeting_...%40thread.v2` segment of an `onlineMeeting.joinUrl` from `list-calendar-events`."
|
|
3387
3067
|
},
|
|
3388
3068
|
{
|
|
@@ -3458,12 +3138,6 @@
|
|
|
3458
3138
|
"name": "conversation-id",
|
|
3459
3139
|
"key": "conversationId",
|
|
3460
3140
|
"required": true,
|
|
3461
|
-
"aliases": [
|
|
3462
|
-
{
|
|
3463
|
-
"name": "id",
|
|
3464
|
-
"key": "id"
|
|
3465
|
-
}
|
|
3466
|
-
],
|
|
3467
3141
|
"description": "Outlook `conversationId` of any message in the thread (returned by every mail-listing command and by `get-mail-message`)."
|
|
3468
3142
|
},
|
|
3469
3143
|
{
|
|
@@ -3492,7 +3166,7 @@
|
|
|
3492
3166
|
}
|
|
3493
3167
|
],
|
|
3494
3168
|
"example": "ask-marcel-office list-conversation-messages --conversation-id 'AAQkAD...=' --top 5 --select id,subject,receivedDateTime",
|
|
3495
|
-
"responseShape": "collection of Microsoft Graph `message` resources under `value[]` (unordered)",
|
|
3169
|
+
"responseShape": "collection of Microsoft Graph `message` resources under `value[]` (unordered). This command ships no default `$select`, so an unflagged call returns the full `message` resource. `internetMessageHeaders` IS honored here (verified live 2026-08-29): naming it in `--select` returns the raw RFC 5322 headers for every message in the thread in ONE call, so a per-message `get-mail-message --select internetMessageHeaders` follow-up is unnecessary. Use `get-mail-message-mime` when the complete raw source, not just the headers, is needed.",
|
|
3496
3170
|
"pagination": true
|
|
3497
3171
|
},
|
|
3498
3172
|
{
|
|
@@ -4203,13 +3877,7 @@
|
|
|
4203
3877
|
"name": "item-id",
|
|
4204
3878
|
"key": "itemId",
|
|
4205
3879
|
"required": true,
|
|
4206
|
-
"description": "driveItem ID of the folder (Graph identifies folders as driveItems too — there is no separate folder type). Use the root folder ID from `ask-marcel-office get-drive-root-item` to list the top of a drive.
|
|
4207
|
-
"aliases": [
|
|
4208
|
-
{
|
|
4209
|
-
"name": "folder-id",
|
|
4210
|
-
"key": "folderId"
|
|
4211
|
-
}
|
|
4212
|
-
]
|
|
3880
|
+
"description": "driveItem ID of the folder (Graph identifies folders as driveItems too — there is no separate folder type). Use the root folder ID from `ask-marcel-office get-drive-root-item` to list the top of a drive."
|
|
4213
3881
|
},
|
|
4214
3882
|
{
|
|
4215
3883
|
"name": "top",
|
|
@@ -4307,36 +3975,18 @@
|
|
|
4307
3975
|
"name": "group-id",
|
|
4308
3976
|
"key": "groupId",
|
|
4309
3977
|
"required": true,
|
|
4310
|
-
"aliases": [
|
|
4311
|
-
{
|
|
4312
|
-
"name": "id",
|
|
4313
|
-
"key": "id"
|
|
4314
|
-
}
|
|
4315
|
-
],
|
|
4316
3978
|
"description": "Azure AD group object ID for a unified (Microsoft 365) group."
|
|
4317
3979
|
},
|
|
4318
3980
|
{
|
|
4319
3981
|
"name": "start-date-time",
|
|
4320
3982
|
"key": "startDateTime",
|
|
4321
3983
|
"required": true,
|
|
4322
|
-
"aliases": [
|
|
4323
|
-
{
|
|
4324
|
-
"name": "start",
|
|
4325
|
-
"key": "start"
|
|
4326
|
-
}
|
|
4327
|
-
],
|
|
4328
3984
|
"description": "Start of the window (recurrences are expanded across it). ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
4329
3985
|
},
|
|
4330
3986
|
{
|
|
4331
3987
|
"name": "end-date-time",
|
|
4332
3988
|
"key": "endDateTime",
|
|
4333
3989
|
"required": true,
|
|
4334
|
-
"aliases": [
|
|
4335
|
-
{
|
|
4336
|
-
"name": "end",
|
|
4337
|
-
"key": "end"
|
|
4338
|
-
}
|
|
4339
|
-
],
|
|
4340
3990
|
"description": "End of the window. ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
4341
3991
|
},
|
|
4342
3992
|
{
|
|
@@ -4392,12 +4042,6 @@
|
|
|
4392
4042
|
"name": "group-id",
|
|
4393
4043
|
"key": "groupId",
|
|
4394
4044
|
"required": true,
|
|
4395
|
-
"aliases": [
|
|
4396
|
-
{
|
|
4397
|
-
"name": "id",
|
|
4398
|
-
"key": "id"
|
|
4399
|
-
}
|
|
4400
|
-
],
|
|
4401
4045
|
"description": "Azure AD group object ID for a unified (Microsoft 365) group."
|
|
4402
4046
|
},
|
|
4403
4047
|
{
|
|
@@ -4453,12 +4097,6 @@
|
|
|
4453
4097
|
"name": "group-id",
|
|
4454
4098
|
"key": "groupId",
|
|
4455
4099
|
"required": true,
|
|
4456
|
-
"aliases": [
|
|
4457
|
-
{
|
|
4458
|
-
"name": "id",
|
|
4459
|
-
"key": "id"
|
|
4460
|
-
}
|
|
4461
|
-
],
|
|
4462
4100
|
"description": "Azure AD group object ID for a unified (Microsoft 365) group. Use `list-groups` to find one."
|
|
4463
4101
|
},
|
|
4464
4102
|
{
|
|
@@ -4514,12 +4152,6 @@
|
|
|
4514
4152
|
"name": "group-id",
|
|
4515
4153
|
"key": "groupId",
|
|
4516
4154
|
"required": true,
|
|
4517
|
-
"aliases": [
|
|
4518
|
-
{
|
|
4519
|
-
"name": "id",
|
|
4520
|
-
"key": "id"
|
|
4521
|
-
}
|
|
4522
|
-
],
|
|
4523
4155
|
"description": "Azure AD group object ID. Use `list-groups` to find one."
|
|
4524
4156
|
},
|
|
4525
4157
|
{
|
|
@@ -4575,12 +4207,6 @@
|
|
|
4575
4207
|
"name": "group-id",
|
|
4576
4208
|
"key": "groupId",
|
|
4577
4209
|
"required": true,
|
|
4578
|
-
"aliases": [
|
|
4579
|
-
{
|
|
4580
|
-
"name": "id",
|
|
4581
|
-
"key": "id"
|
|
4582
|
-
}
|
|
4583
|
-
],
|
|
4584
4210
|
"description": "Azure AD group object ID. Use `list-groups` to find one."
|
|
4585
4211
|
},
|
|
4586
4212
|
{
|
|
@@ -4636,12 +4262,6 @@
|
|
|
4636
4262
|
"name": "group-id",
|
|
4637
4263
|
"key": "groupId",
|
|
4638
4264
|
"required": true,
|
|
4639
|
-
"aliases": [
|
|
4640
|
-
{
|
|
4641
|
-
"name": "id",
|
|
4642
|
-
"key": "id"
|
|
4643
|
-
}
|
|
4644
|
-
],
|
|
4645
4265
|
"description": "Azure AD group object ID for a unified (Microsoft 365) group."
|
|
4646
4266
|
},
|
|
4647
4267
|
{
|
|
@@ -4789,21 +4409,7 @@
|
|
|
4789
4409
|
"name": "todo-task-list-id",
|
|
4790
4410
|
"key": "todoTaskListId",
|
|
4791
4411
|
"required": true,
|
|
4792
|
-
"description": "todoTaskList ID. Returned by `ask-marcel-office list-todo-task-lists`. The well-known name `tasks` (the default list) is accepted on this incomplete-tasks endpoint specifically — sibling commands like `list-todo-tasks` and `list-todo-tasks-delta` only accept resolved IDs. There is no Graph endpoint that returns incomplete tasks across every list — call this once per list."
|
|
4793
|
-
"aliases": [
|
|
4794
|
-
{
|
|
4795
|
-
"name": "id",
|
|
4796
|
-
"key": "id"
|
|
4797
|
-
},
|
|
4798
|
-
{
|
|
4799
|
-
"name": "task-list-id",
|
|
4800
|
-
"key": "taskListId"
|
|
4801
|
-
},
|
|
4802
|
-
{
|
|
4803
|
-
"name": "todo-list-id",
|
|
4804
|
-
"key": "todoListId"
|
|
4805
|
-
}
|
|
4806
|
-
]
|
|
4412
|
+
"description": "todoTaskList ID. Returned by `ask-marcel-office list-todo-task-lists`. The well-known name `tasks` (the default list) is accepted on this incomplete-tasks endpoint specifically — sibling commands like `list-todo-tasks` and `list-todo-tasks-delta` only accept resolved IDs. There is no Graph endpoint that returns incomplete tasks across every list — call this once per list."
|
|
4807
4413
|
},
|
|
4808
4414
|
{
|
|
4809
4415
|
"name": "top",
|
|
@@ -4870,13 +4476,7 @@
|
|
|
4870
4476
|
"name": "message-id",
|
|
4871
4477
|
"key": "messageId",
|
|
4872
4478
|
"required": true,
|
|
4873
|
-
"
|
|
4874
|
-
{
|
|
4875
|
-
"name": "id",
|
|
4876
|
-
"key": "id"
|
|
4877
|
-
}
|
|
4878
|
-
],
|
|
4879
|
-
"description": "Outlook message ID. Returned by `ask-marcel-office list-mail-messages` or `list-mail-folder-messages`. Accepts `--id` as an alias."
|
|
4479
|
+
"description": "Outlook message ID. Returned by `ask-marcel-office list-mail-messages` or `list-mail-folder-messages`."
|
|
4880
4480
|
},
|
|
4881
4481
|
{
|
|
4882
4482
|
"name": "top",
|
|
@@ -4931,14 +4531,21 @@
|
|
|
4931
4531
|
"name": "mail-folder-id",
|
|
4932
4532
|
"key": "mailFolderId",
|
|
4933
4533
|
"required": true,
|
|
4934
|
-
"aliases": [
|
|
4935
|
-
{
|
|
4936
|
-
"name": "id",
|
|
4937
|
-
"key": "id"
|
|
4938
|
-
}
|
|
4939
|
-
],
|
|
4940
4534
|
"description": "mailFolder ID. Returned by `ask-marcel-office list-mail-folders`. Well-known names also work, e.g. `inbox`, `sentitems`, `drafts`."
|
|
4941
4535
|
},
|
|
4536
|
+
{
|
|
4537
|
+
"name": "include-hidden-folders",
|
|
4538
|
+
"key": "includeHiddenFolders",
|
|
4539
|
+
"required": false,
|
|
4540
|
+
"description": "Graph HIDES folders flagged as hidden from this listing by default (a mailbox typically hides system folders such as `Social Activity Notifications`, and an Outlook client can hide any folder). Pass `true` to append the plain `includeHiddenFolders=true` query parameter and get them as well; every returned folder then carries `isHidden` to tell the two apart. Omit it for the default visible-only listing.",
|
|
4541
|
+
"argumentHint": {
|
|
4542
|
+
"kind": "magicValue",
|
|
4543
|
+
"values": [
|
|
4544
|
+
"true",
|
|
4545
|
+
"false"
|
|
4546
|
+
]
|
|
4547
|
+
}
|
|
4548
|
+
},
|
|
4942
4549
|
{
|
|
4943
4550
|
"name": "top",
|
|
4944
4551
|
"key": "top",
|
|
@@ -4992,12 +4599,6 @@
|
|
|
4992
4599
|
"name": "mail-folder-id",
|
|
4993
4600
|
"key": "mailFolderId",
|
|
4994
4601
|
"required": true,
|
|
4995
|
-
"aliases": [
|
|
4996
|
-
{
|
|
4997
|
-
"name": "id",
|
|
4998
|
-
"key": "id"
|
|
4999
|
-
}
|
|
5000
|
-
],
|
|
5001
4602
|
"description": "mailFolder ID. Returned by `ask-marcel-office list-mail-folders`. Well-known names also work, e.g. `inbox`, `sentitems`, `drafts`. When listing `drafts`, a `conversationId` `$filter` is not a reliable check for whether a draft already exists on a thread: reply and forward drafts can split across several conversationIds, and `$filter` on Drafts is not read-your-writes consistent. Match client-side on subject and recipients instead, or use the `find-mail-drafts` command, which does exactly that."
|
|
5002
4603
|
},
|
|
5003
4604
|
{
|
|
@@ -5043,7 +4644,7 @@
|
|
|
5043
4644
|
},
|
|
5044
4645
|
{
|
|
5045
4646
|
"name": "list-mail-folder-messages-delta",
|
|
5046
|
-
"summary": "Track incremental changes (added / updated / deleted messages) within a single mail folder using Microsoft Graph delta tokens. The first call returns the current snapshot plus a `@odata.deltaLink`; subsequent calls with that link return only what has changed since.",
|
|
4647
|
+
"summary": "Track incremental changes (added / updated / deleted messages) within a single mail folder using Microsoft Graph delta tokens. The first call returns the current snapshot plus a `@odata.deltaLink`; subsequent calls with that link return only what has changed since. `--top` is translated into the `Prefer: odata.maxpagesize=N` header: as a `$top` query parameter Graph reads a satisfied count as \"sync complete\" and hands back a deltaLink after N items, silently abandoning the rest of the folder. `$skip` and `$orderby` are NOT exposed — Graph ignores the former on this endpoint and rejects the latter unless it merely restates the default `receivedDateTime desc`.",
|
|
5047
4648
|
"category": "mail",
|
|
5048
4649
|
"graphMethod": "GET",
|
|
5049
4650
|
"graphPathTemplate": "/me/mailFolders/{mail-folder-id}/messages/delta()",
|
|
@@ -5053,12 +4654,6 @@
|
|
|
5053
4654
|
"name": "mail-folder-id",
|
|
5054
4655
|
"key": "mailFolderId",
|
|
5055
4656
|
"required": true,
|
|
5056
|
-
"aliases": [
|
|
5057
|
-
{
|
|
5058
|
-
"name": "id",
|
|
5059
|
-
"key": "id"
|
|
5060
|
-
}
|
|
5061
|
-
],
|
|
5062
4657
|
"description": "Mail folder ID or well-known name (`inbox`, `archive`, `sentitems`, `deleteditems`, `junkemail`, `drafts`). Returned by `list-mail-folders`."
|
|
5063
4658
|
},
|
|
5064
4659
|
{
|
|
@@ -5067,12 +4662,6 @@
|
|
|
5067
4662
|
"required": false,
|
|
5068
4663
|
"description": "OData $top: maximum number of items to return on this page (positive integer, ≤ 1000). Graph silently caps at 1000 on every collection endpoint, so the CLI rejects larger values with a clear validation error rather than letting the request silently truncate. Combine with `next-page` to paginate beyond the cap."
|
|
5069
4664
|
},
|
|
5070
|
-
{
|
|
5071
|
-
"name": "skip",
|
|
5072
|
-
"key": "skip",
|
|
5073
|
-
"required": false,
|
|
5074
|
-
"description": "OData $skip: skip the first N items before returning results (non-negative integer). Useful with $top for offset paging."
|
|
5075
|
-
},
|
|
5076
4665
|
{
|
|
5077
4666
|
"name": "select",
|
|
5078
4667
|
"key": "select",
|
|
@@ -5085,12 +4674,6 @@
|
|
|
5085
4674
|
"required": false,
|
|
5086
4675
|
"description": "OData $filter: predicate to narrow results server-side. Quoting rules: string literals MUST use SINGLE quotes (`subject eq 'invoice'`), NOT double quotes — Graph rejects `subject eq \"invoice\"` with `InvalidFilterClause`. To embed a single quote inside a string, double it (`subject eq 'O''Brien'`). Booleans, numbers, and dates are unquoted (`isRead eq false`, `receivedDateTime ge 2026-01-01T00:00:00Z`). Wrap the whole flag value in shell DOUBLE quotes so the inner single quotes survive (`--filter \"subject eq 'invoice'\"`). Same syntax Graph documents per resource type."
|
|
5087
4676
|
},
|
|
5088
|
-
{
|
|
5089
|
-
"name": "orderby",
|
|
5090
|
-
"key": "orderby",
|
|
5091
|
-
"required": false,
|
|
5092
|
-
"description": "OData $orderby: sort expression with optional asc/desc (e.g. `receivedDateTime desc`). Some Graph filter combinations are rejected; remove $orderby if InefficientFilter occurs."
|
|
5093
|
-
},
|
|
5094
4677
|
{
|
|
5095
4678
|
"name": "expand",
|
|
5096
4679
|
"key": "expand",
|
|
@@ -5099,7 +4682,7 @@
|
|
|
5099
4682
|
}
|
|
5100
4683
|
],
|
|
5101
4684
|
"example": "ask-marcel-office list-mail-folder-messages-delta --mail-folder-id 'inbox'",
|
|
5102
|
-
"responseShape": "collection of Microsoft Graph `message` resources under `data.value[]`. Cursor tokens are hoisted to envelope level: top-level `nextLink` while paging, then top-level `deltaLink` on the final page (CLI strips the original `@odata.*` keys from `data`).",
|
|
4685
|
+
"responseShape": "collection of Microsoft Graph `message` resources under `data.value[]`. Cursor tokens are hoisted to envelope level: top-level `nextLink` while paging, then top-level `deltaLink` on the final page (CLI strips the original `@odata.*` keys from `data`). A `deltaLink` on the FIRST page means the folder is fully synced, not that it was truncated.",
|
|
5103
4686
|
"pagination": true
|
|
5104
4687
|
},
|
|
5105
4688
|
{
|
|
@@ -5110,6 +4693,19 @@
|
|
|
5110
4693
|
"graphPathTemplate": "/me/mailFolders",
|
|
5111
4694
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/user-list-mailfolders",
|
|
5112
4695
|
"options": [
|
|
4696
|
+
{
|
|
4697
|
+
"name": "include-hidden-folders",
|
|
4698
|
+
"key": "includeHiddenFolders",
|
|
4699
|
+
"required": false,
|
|
4700
|
+
"description": "Graph HIDES folders flagged as hidden from this listing by default (a mailbox typically hides system folders such as `Social Activity Notifications`, and an Outlook client can hide any folder). Pass `true` to append the plain `includeHiddenFolders=true` query parameter and get them as well; every returned folder then carries `isHidden` to tell the two apart. Omit it for the default visible-only listing.",
|
|
4701
|
+
"argumentHint": {
|
|
4702
|
+
"kind": "magicValue",
|
|
4703
|
+
"values": [
|
|
4704
|
+
"true",
|
|
4705
|
+
"false"
|
|
4706
|
+
]
|
|
4707
|
+
}
|
|
4708
|
+
},
|
|
5113
4709
|
{
|
|
5114
4710
|
"name": "top",
|
|
5115
4711
|
"key": "top",
|
|
@@ -5389,12 +4985,6 @@
|
|
|
5389
4985
|
"name": "notebook-id",
|
|
5390
4986
|
"key": "notebookId",
|
|
5391
4987
|
"required": true,
|
|
5392
|
-
"aliases": [
|
|
5393
|
-
{
|
|
5394
|
-
"name": "id",
|
|
5395
|
-
"key": "id"
|
|
5396
|
-
}
|
|
5397
|
-
],
|
|
5398
4988
|
"description": "OneNote notebook ID. Returned by `ask-marcel-office list-onenote-notebooks`."
|
|
5399
4989
|
},
|
|
5400
4990
|
{
|
|
@@ -5499,17 +5089,7 @@
|
|
|
5499
5089
|
"name": "onenote-section-id",
|
|
5500
5090
|
"key": "onenoteSectionId",
|
|
5501
5091
|
"required": true,
|
|
5502
|
-
"description": "OneNote section ID. Returned by `ask-marcel-office list-onenote-notebook-sections` or `list-all-onenote-sections`."
|
|
5503
|
-
"aliases": [
|
|
5504
|
-
{
|
|
5505
|
-
"name": "id",
|
|
5506
|
-
"key": "id"
|
|
5507
|
-
},
|
|
5508
|
-
{
|
|
5509
|
-
"name": "section-id",
|
|
5510
|
-
"key": "sectionId"
|
|
5511
|
-
}
|
|
5512
|
-
]
|
|
5092
|
+
"description": "OneNote section ID. Returned by `ask-marcel-office list-onenote-notebook-sections` or `list-all-onenote-sections`."
|
|
5513
5093
|
},
|
|
5514
5094
|
{
|
|
5515
5095
|
"name": "top",
|
|
@@ -5575,17 +5155,7 @@
|
|
|
5575
5155
|
"name": "planner-plan-id",
|
|
5576
5156
|
"key": "plannerPlanId",
|
|
5577
5157
|
"required": true,
|
|
5578
|
-
"description": "Planner plan ID. Returned in the `planId` field of any task from `ask-marcel-office list-planner-tasks`."
|
|
5579
|
-
"aliases": [
|
|
5580
|
-
{
|
|
5581
|
-
"name": "id",
|
|
5582
|
-
"key": "id"
|
|
5583
|
-
},
|
|
5584
|
-
{
|
|
5585
|
-
"name": "plan-id",
|
|
5586
|
-
"key": "planId"
|
|
5587
|
-
}
|
|
5588
|
-
]
|
|
5158
|
+
"description": "Planner plan ID. Returned in the `planId` field of any task from `ask-marcel-office list-planner-tasks`."
|
|
5589
5159
|
},
|
|
5590
5160
|
{
|
|
5591
5161
|
"name": "select",
|
|
@@ -5610,17 +5180,7 @@
|
|
|
5610
5180
|
"name": "planner-plan-id",
|
|
5611
5181
|
"key": "plannerPlanId",
|
|
5612
5182
|
"required": true,
|
|
5613
|
-
"description": "Planner plan ID. Returned in the `planId` field of any task from `ask-marcel-office list-planner-tasks`."
|
|
5614
|
-
"aliases": [
|
|
5615
|
-
{
|
|
5616
|
-
"name": "id",
|
|
5617
|
-
"key": "id"
|
|
5618
|
-
},
|
|
5619
|
-
{
|
|
5620
|
-
"name": "plan-id",
|
|
5621
|
-
"key": "planId"
|
|
5622
|
-
}
|
|
5623
|
-
]
|
|
5183
|
+
"description": "Planner plan ID. Returned in the `planId` field of any task from `ask-marcel-office list-planner-tasks`."
|
|
5624
5184
|
}
|
|
5625
5185
|
],
|
|
5626
5186
|
"example": "ask-marcel-office list-plan-tasks --planner-plan-id 'xqQg5FS2LkCp935s-FIFm5gAB6'",
|
|
@@ -5995,12 +5555,6 @@
|
|
|
5995
5555
|
"name": "user-id",
|
|
5996
5556
|
"key": "userId",
|
|
5997
5557
|
"required": true,
|
|
5998
|
-
"aliases": [
|
|
5999
|
-
{
|
|
6000
|
-
"name": "id",
|
|
6001
|
-
"key": "id"
|
|
6002
|
-
}
|
|
6003
|
-
],
|
|
6004
5558
|
"description": "Azure AD user ID or UPN whose calendar to read. Requires `Calendars.Read.Shared` access (granted by the calendar owner)."
|
|
6005
5559
|
},
|
|
6006
5560
|
{
|
|
@@ -6056,36 +5610,18 @@
|
|
|
6056
5610
|
"name": "user-id",
|
|
6057
5611
|
"key": "userId",
|
|
6058
5612
|
"required": true,
|
|
6059
|
-
"aliases": [
|
|
6060
|
-
{
|
|
6061
|
-
"name": "id",
|
|
6062
|
-
"key": "id"
|
|
6063
|
-
}
|
|
6064
|
-
],
|
|
6065
5613
|
"description": "Azure AD user ID or UPN of the calendar owner."
|
|
6066
5614
|
},
|
|
6067
5615
|
{
|
|
6068
5616
|
"name": "start-date-time",
|
|
6069
5617
|
"key": "startDateTime",
|
|
6070
5618
|
"required": true,
|
|
6071
|
-
"aliases": [
|
|
6072
|
-
{
|
|
6073
|
-
"name": "start",
|
|
6074
|
-
"key": "start"
|
|
6075
|
-
}
|
|
6076
|
-
],
|
|
6077
5619
|
"description": "Start of the window. ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
6078
5620
|
},
|
|
6079
5621
|
{
|
|
6080
5622
|
"name": "end-date-time",
|
|
6081
5623
|
"key": "endDateTime",
|
|
6082
5624
|
"required": true,
|
|
6083
|
-
"aliases": [
|
|
6084
|
-
{
|
|
6085
|
-
"name": "end",
|
|
6086
|
-
"key": "end"
|
|
6087
|
-
}
|
|
6088
|
-
],
|
|
6089
5625
|
"description": "End of the window. ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
6090
5626
|
},
|
|
6091
5627
|
{
|
|
@@ -6178,6 +5714,80 @@
|
|
|
6178
5714
|
"responseShape": "collection of Microsoft Graph `sharedInsight` resources under `value[]`",
|
|
6179
5715
|
"pagination": true
|
|
6180
5716
|
},
|
|
5717
|
+
{
|
|
5718
|
+
"name": "list-shared-mailbox-child-folders",
|
|
5719
|
+
"summary": "List the subfolders of one mail folder in a shared or delegated mailbox. The `/me` sibling is `list-mail-child-folders`. Walk it from the folder IDs `list-shared-mailbox-folders` returns to reach nested custom folders. 403 if the signed-in user does not have shared access to that mailbox.",
|
|
5720
|
+
"category": "mail",
|
|
5721
|
+
"graphMethod": "GET",
|
|
5722
|
+
"graphPathTemplate": "/users/{user-id}/mailFolders/{mail-folder-id}/childFolders",
|
|
5723
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/mailfolder-list-childfolders",
|
|
5724
|
+
"options": [
|
|
5725
|
+
{
|
|
5726
|
+
"name": "user-id",
|
|
5727
|
+
"key": "userId",
|
|
5728
|
+
"required": true,
|
|
5729
|
+
"description": "Azure AD user ID or UPN of the shared mailbox or delegated user. The signed-in user must have `Mail.Read.Shared` access (granted by the mailbox owner)."
|
|
5730
|
+
},
|
|
5731
|
+
{
|
|
5732
|
+
"name": "mail-folder-id",
|
|
5733
|
+
"key": "mailFolderId",
|
|
5734
|
+
"required": true,
|
|
5735
|
+
"description": "Mail folder ID or well-known name (`inbox`, `sentitems`, etc.) inside that mailbox. Returned by `ask-marcel-office list-shared-mailbox-folders`."
|
|
5736
|
+
},
|
|
5737
|
+
{
|
|
5738
|
+
"name": "include-hidden-folders",
|
|
5739
|
+
"key": "includeHiddenFolders",
|
|
5740
|
+
"required": false,
|
|
5741
|
+
"description": "Graph HIDES folders flagged as hidden from this listing by default (a mailbox typically hides system folders such as `Social Activity Notifications`, and an Outlook client can hide any folder). Pass `true` to append the plain `includeHiddenFolders=true` query parameter and get them as well; every returned folder then carries `isHidden` to tell the two apart. Omit it for the default visible-only listing.",
|
|
5742
|
+
"argumentHint": {
|
|
5743
|
+
"kind": "magicValue",
|
|
5744
|
+
"values": [
|
|
5745
|
+
"true",
|
|
5746
|
+
"false"
|
|
5747
|
+
]
|
|
5748
|
+
}
|
|
5749
|
+
},
|
|
5750
|
+
{
|
|
5751
|
+
"name": "top",
|
|
5752
|
+
"key": "top",
|
|
5753
|
+
"required": false,
|
|
5754
|
+
"description": "OData $top: maximum number of items to return on this page (positive integer, ≤ 1000). Graph silently caps at 1000 on every collection endpoint, so the CLI rejects larger values with a clear validation error rather than letting the request silently truncate. Combine with `next-page` to paginate beyond the cap."
|
|
5755
|
+
},
|
|
5756
|
+
{
|
|
5757
|
+
"name": "skip",
|
|
5758
|
+
"key": "skip",
|
|
5759
|
+
"required": false,
|
|
5760
|
+
"description": "OData $skip: skip the first N items before returning results (non-negative integer). Useful with $top for offset paging."
|
|
5761
|
+
},
|
|
5762
|
+
{
|
|
5763
|
+
"name": "select",
|
|
5764
|
+
"key": "select",
|
|
5765
|
+
"required": false,
|
|
5766
|
+
"description": "OData $select: comma-separated list of fields to include in each item (e.g. `id,subject,from`). May shrink payloads dramatically — Graph honors $select on most endpoints, but some collections (notably `/me/mailboxSettings`, `/me/outlook/masterCategories`, `/me/mailFolders/inbox/messageRules`) silently ignore it and always return the full resource. Bogus field names are silently dropped by Graph — if a field you asked for is missing from the response, double-check the spelling against the documented `responseShape`."
|
|
5767
|
+
},
|
|
5768
|
+
{
|
|
5769
|
+
"name": "filter",
|
|
5770
|
+
"key": "filter",
|
|
5771
|
+
"required": false,
|
|
5772
|
+
"description": "OData $filter: predicate to narrow results server-side. Quoting rules: string literals MUST use SINGLE quotes (`subject eq 'invoice'`), NOT double quotes — Graph rejects `subject eq \"invoice\"` with `InvalidFilterClause`. To embed a single quote inside a string, double it (`subject eq 'O''Brien'`). Booleans, numbers, and dates are unquoted (`isRead eq false`, `receivedDateTime ge 2026-01-01T00:00:00Z`). Wrap the whole flag value in shell DOUBLE quotes so the inner single quotes survive (`--filter \"subject eq 'invoice'\"`). Same syntax Graph documents per resource type."
|
|
5773
|
+
},
|
|
5774
|
+
{
|
|
5775
|
+
"name": "orderby",
|
|
5776
|
+
"key": "orderby",
|
|
5777
|
+
"required": false,
|
|
5778
|
+
"description": "OData $orderby: sort expression with optional asc/desc (e.g. `receivedDateTime desc`). Some Graph filter combinations are rejected; remove $orderby if InefficientFilter occurs."
|
|
5779
|
+
},
|
|
5780
|
+
{
|
|
5781
|
+
"name": "expand",
|
|
5782
|
+
"key": "expand",
|
|
5783
|
+
"required": false,
|
|
5784
|
+
"description": "OData $expand: navigation properties to include inline (e.g. `attachments`). Increases response size; use sparingly."
|
|
5785
|
+
}
|
|
5786
|
+
],
|
|
5787
|
+
"example": "ask-marcel-office list-shared-mailbox-child-folders --user-id 'shared-mailbox@contoso.com' --mail-folder-id 'inbox'",
|
|
5788
|
+
"responseShape": "collection of Microsoft Graph `mailFolder` resources under `value[]`",
|
|
5789
|
+
"pagination": true
|
|
5790
|
+
},
|
|
6181
5791
|
{
|
|
6182
5792
|
"name": "list-shared-mailbox-folder-messages",
|
|
6183
5793
|
"summary": "List messages in a single folder of a shared / delegated mailbox.",
|
|
@@ -6239,6 +5849,74 @@
|
|
|
6239
5849
|
"responseShape": "collection of Microsoft Graph `message` resources under `value[]`",
|
|
6240
5850
|
"pagination": true
|
|
6241
5851
|
},
|
|
5852
|
+
{
|
|
5853
|
+
"name": "list-shared-mailbox-folders",
|
|
5854
|
+
"summary": "List the top-level mail folders of a shared or delegated mailbox. The `/me` sibling is `list-mail-folders`. Use it to discover the folder IDs that `list-shared-mailbox-folder-messages` needs: without it only the well-known names (`inbox`, `sentitems`, `drafts`, …) are reachable, so custom folders are invisible. 403 if the signed-in user does not have shared access to that mailbox.",
|
|
5855
|
+
"category": "mail",
|
|
5856
|
+
"graphMethod": "GET",
|
|
5857
|
+
"graphPathTemplate": "/users/{user-id}/mailFolders",
|
|
5858
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/user-list-mailfolders",
|
|
5859
|
+
"options": [
|
|
5860
|
+
{
|
|
5861
|
+
"name": "user-id",
|
|
5862
|
+
"key": "userId",
|
|
5863
|
+
"required": true,
|
|
5864
|
+
"description": "Azure AD user ID or UPN of the shared mailbox or delegated user. The signed-in user must have `Mail.Read.Shared` access (granted by the mailbox owner)."
|
|
5865
|
+
},
|
|
5866
|
+
{
|
|
5867
|
+
"name": "include-hidden-folders",
|
|
5868
|
+
"key": "includeHiddenFolders",
|
|
5869
|
+
"required": false,
|
|
5870
|
+
"description": "Graph HIDES folders flagged as hidden from this listing by default (a mailbox typically hides system folders such as `Social Activity Notifications`, and an Outlook client can hide any folder). Pass `true` to append the plain `includeHiddenFolders=true` query parameter and get them as well; every returned folder then carries `isHidden` to tell the two apart. Omit it for the default visible-only listing.",
|
|
5871
|
+
"argumentHint": {
|
|
5872
|
+
"kind": "magicValue",
|
|
5873
|
+
"values": [
|
|
5874
|
+
"true",
|
|
5875
|
+
"false"
|
|
5876
|
+
]
|
|
5877
|
+
}
|
|
5878
|
+
},
|
|
5879
|
+
{
|
|
5880
|
+
"name": "top",
|
|
5881
|
+
"key": "top",
|
|
5882
|
+
"required": false,
|
|
5883
|
+
"description": "OData $top: maximum number of items to return on this page (positive integer, ≤ 1000). Graph silently caps at 1000 on every collection endpoint, so the CLI rejects larger values with a clear validation error rather than letting the request silently truncate. Combine with `next-page` to paginate beyond the cap."
|
|
5884
|
+
},
|
|
5885
|
+
{
|
|
5886
|
+
"name": "skip",
|
|
5887
|
+
"key": "skip",
|
|
5888
|
+
"required": false,
|
|
5889
|
+
"description": "OData $skip: skip the first N items before returning results (non-negative integer). Useful with $top for offset paging."
|
|
5890
|
+
},
|
|
5891
|
+
{
|
|
5892
|
+
"name": "select",
|
|
5893
|
+
"key": "select",
|
|
5894
|
+
"required": false,
|
|
5895
|
+
"description": "OData $select: comma-separated list of fields to include in each item (e.g. `id,subject,from`). May shrink payloads dramatically — Graph honors $select on most endpoints, but some collections (notably `/me/mailboxSettings`, `/me/outlook/masterCategories`, `/me/mailFolders/inbox/messageRules`) silently ignore it and always return the full resource. Bogus field names are silently dropped by Graph — if a field you asked for is missing from the response, double-check the spelling against the documented `responseShape`."
|
|
5896
|
+
},
|
|
5897
|
+
{
|
|
5898
|
+
"name": "filter",
|
|
5899
|
+
"key": "filter",
|
|
5900
|
+
"required": false,
|
|
5901
|
+
"description": "OData $filter: predicate to narrow results server-side. Quoting rules: string literals MUST use SINGLE quotes (`subject eq 'invoice'`), NOT double quotes — Graph rejects `subject eq \"invoice\"` with `InvalidFilterClause`. To embed a single quote inside a string, double it (`subject eq 'O''Brien'`). Booleans, numbers, and dates are unquoted (`isRead eq false`, `receivedDateTime ge 2026-01-01T00:00:00Z`). Wrap the whole flag value in shell DOUBLE quotes so the inner single quotes survive (`--filter \"subject eq 'invoice'\"`). Same syntax Graph documents per resource type."
|
|
5902
|
+
},
|
|
5903
|
+
{
|
|
5904
|
+
"name": "orderby",
|
|
5905
|
+
"key": "orderby",
|
|
5906
|
+
"required": false,
|
|
5907
|
+
"description": "OData $orderby: sort expression with optional asc/desc (e.g. `receivedDateTime desc`). Some Graph filter combinations are rejected; remove $orderby if InefficientFilter occurs."
|
|
5908
|
+
},
|
|
5909
|
+
{
|
|
5910
|
+
"name": "expand",
|
|
5911
|
+
"key": "expand",
|
|
5912
|
+
"required": false,
|
|
5913
|
+
"description": "OData $expand: navigation properties to include inline (e.g. `attachments`). Increases response size; use sparingly."
|
|
5914
|
+
}
|
|
5915
|
+
],
|
|
5916
|
+
"example": "ask-marcel-office list-shared-mailbox-folders --user-id 'shared-mailbox@contoso.com'",
|
|
5917
|
+
"responseShape": "collection of Microsoft Graph `mailFolder` resources under `value[]`",
|
|
5918
|
+
"pagination": true
|
|
5919
|
+
},
|
|
6242
5920
|
{
|
|
6243
5921
|
"name": "list-shared-mailbox-messages",
|
|
6244
5922
|
"summary": "List messages from a shared or delegated mailbox the signed-in user has read access to. Same shape as `list-mail-messages` but scoped to a specific mailbox owner. 403 if the signed-in user does not have shared access to that mailbox.",
|
|
@@ -6251,12 +5929,6 @@
|
|
|
6251
5929
|
"name": "user-id",
|
|
6252
5930
|
"key": "userId",
|
|
6253
5931
|
"required": true,
|
|
6254
|
-
"aliases": [
|
|
6255
|
-
{
|
|
6256
|
-
"name": "id",
|
|
6257
|
-
"key": "id"
|
|
6258
|
-
}
|
|
6259
|
-
],
|
|
6260
5932
|
"description": "Azure AD user ID or UPN of the shared mailbox or delegated user. The signed-in user must have `Mail.Read.Shared` access (granted by the mailbox owner)."
|
|
6261
5933
|
},
|
|
6262
5934
|
{
|
|
@@ -6371,13 +6043,7 @@
|
|
|
6371
6043
|
"name": "list-item-id",
|
|
6372
6044
|
"key": "listItemId",
|
|
6373
6045
|
"required": true,
|
|
6374
|
-
"description": "List item ID inside the list. Returned by `list-sharepoint-site-list-items`."
|
|
6375
|
-
"aliases": [
|
|
6376
|
-
{
|
|
6377
|
-
"name": "item-id",
|
|
6378
|
-
"key": "itemId"
|
|
6379
|
-
}
|
|
6380
|
-
]
|
|
6046
|
+
"description": "List item ID inside the list. Returned by `list-sharepoint-site-list-items`."
|
|
6381
6047
|
},
|
|
6382
6048
|
{
|
|
6383
6049
|
"name": "top",
|
|
@@ -6426,12 +6092,6 @@
|
|
|
6426
6092
|
"name": "site-id",
|
|
6427
6093
|
"key": "siteId",
|
|
6428
6094
|
"required": true,
|
|
6429
|
-
"aliases": [
|
|
6430
|
-
{
|
|
6431
|
-
"name": "id",
|
|
6432
|
-
"key": "id"
|
|
6433
|
-
}
|
|
6434
|
-
],
|
|
6435
6095
|
"description": "SharePoint site ID. Returned by `ask-marcel-office search-sharepoint-sites-by-name`."
|
|
6436
6096
|
},
|
|
6437
6097
|
{
|
|
@@ -6539,12 +6199,6 @@
|
|
|
6539
6199
|
"name": "site-id",
|
|
6540
6200
|
"key": "siteId",
|
|
6541
6201
|
"required": true,
|
|
6542
|
-
"aliases": [
|
|
6543
|
-
{
|
|
6544
|
-
"name": "id",
|
|
6545
|
-
"key": "id"
|
|
6546
|
-
}
|
|
6547
|
-
],
|
|
6548
6202
|
"description": "SharePoint site ID. Returned by `ask-marcel-office search-sharepoint-sites-by-name`."
|
|
6549
6203
|
},
|
|
6550
6204
|
{
|
|
@@ -6655,12 +6309,6 @@
|
|
|
6655
6309
|
"name": "site-id",
|
|
6656
6310
|
"key": "siteId",
|
|
6657
6311
|
"required": true,
|
|
6658
|
-
"aliases": [
|
|
6659
|
-
{
|
|
6660
|
-
"name": "id",
|
|
6661
|
-
"key": "id"
|
|
6662
|
-
}
|
|
6663
|
-
],
|
|
6664
6312
|
"description": "SharePoint site ID."
|
|
6665
6313
|
},
|
|
6666
6314
|
{
|
|
@@ -6722,13 +6370,7 @@
|
|
|
6722
6370
|
"name": "onenote-section-id",
|
|
6723
6371
|
"key": "onenoteSectionId",
|
|
6724
6372
|
"required": true,
|
|
6725
|
-
"description": "OneNote section ID inside the site."
|
|
6726
|
-
"aliases": [
|
|
6727
|
-
{
|
|
6728
|
-
"name": "section-id",
|
|
6729
|
-
"key": "sectionId"
|
|
6730
|
-
}
|
|
6731
|
-
]
|
|
6373
|
+
"description": "OneNote section ID inside the site."
|
|
6732
6374
|
},
|
|
6733
6375
|
{
|
|
6734
6376
|
"name": "top",
|
|
@@ -6783,12 +6425,6 @@
|
|
|
6783
6425
|
"name": "site-id",
|
|
6784
6426
|
"key": "siteId",
|
|
6785
6427
|
"required": true,
|
|
6786
|
-
"aliases": [
|
|
6787
|
-
{
|
|
6788
|
-
"name": "id",
|
|
6789
|
-
"key": "id"
|
|
6790
|
-
}
|
|
6791
|
-
],
|
|
6792
6428
|
"description": "SharePoint site ID."
|
|
6793
6429
|
},
|
|
6794
6430
|
{
|
|
@@ -6838,12 +6474,6 @@
|
|
|
6838
6474
|
"name": "site-id",
|
|
6839
6475
|
"key": "siteId",
|
|
6840
6476
|
"required": true,
|
|
6841
|
-
"aliases": [
|
|
6842
|
-
{
|
|
6843
|
-
"name": "id",
|
|
6844
|
-
"key": "id"
|
|
6845
|
-
}
|
|
6846
|
-
],
|
|
6847
6477
|
"description": "SharePoint site ID. Returned by `search-sharepoint-sites-by-name`."
|
|
6848
6478
|
},
|
|
6849
6479
|
{
|
|
@@ -6874,12 +6504,6 @@
|
|
|
6874
6504
|
"name": "site-id",
|
|
6875
6505
|
"key": "siteId",
|
|
6876
6506
|
"required": true,
|
|
6877
|
-
"aliases": [
|
|
6878
|
-
{
|
|
6879
|
-
"name": "id",
|
|
6880
|
-
"key": "id"
|
|
6881
|
-
}
|
|
6882
|
-
],
|
|
6883
6507
|
"description": "SharePoint site ID."
|
|
6884
6508
|
},
|
|
6885
6509
|
{
|
|
@@ -6929,12 +6553,6 @@
|
|
|
6929
6553
|
"name": "calendar-id",
|
|
6930
6554
|
"key": "calendarId",
|
|
6931
6555
|
"required": true,
|
|
6932
|
-
"aliases": [
|
|
6933
|
-
{
|
|
6934
|
-
"name": "id",
|
|
6935
|
-
"key": "id"
|
|
6936
|
-
}
|
|
6937
|
-
],
|
|
6938
6556
|
"description": "Calendar ID, or the well-known short name `primary` / `default` for the signed-in user’s default calendar. Use `ask-marcel-office list-calendars` to discover non-default calendar IDs."
|
|
6939
6557
|
},
|
|
6940
6558
|
{
|
|
@@ -6990,36 +6608,18 @@
|
|
|
6990
6608
|
"name": "calendar-id",
|
|
6991
6609
|
"key": "calendarId",
|
|
6992
6610
|
"required": true,
|
|
6993
|
-
"aliases": [
|
|
6994
|
-
{
|
|
6995
|
-
"name": "id",
|
|
6996
|
-
"key": "id"
|
|
6997
|
-
}
|
|
6998
|
-
],
|
|
6999
6611
|
"description": "Calendar ID, or `primary` / `default` for the signed-in user’s default calendar. Returned by `ask-marcel-office list-calendars`."
|
|
7000
6612
|
},
|
|
7001
6613
|
{
|
|
7002
6614
|
"name": "start-date-time",
|
|
7003
6615
|
"key": "startDateTime",
|
|
7004
6616
|
"required": true,
|
|
7005
|
-
"aliases": [
|
|
7006
|
-
{
|
|
7007
|
-
"name": "start",
|
|
7008
|
-
"key": "start"
|
|
7009
|
-
}
|
|
7010
|
-
],
|
|
7011
6617
|
"description": "Lower bound. ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
7012
6618
|
},
|
|
7013
6619
|
{
|
|
7014
6620
|
"name": "end-date-time",
|
|
7015
6621
|
"key": "endDateTime",
|
|
7016
6622
|
"required": true,
|
|
7017
|
-
"aliases": [
|
|
7018
|
-
{
|
|
7019
|
-
"name": "end",
|
|
7020
|
-
"key": "end"
|
|
7021
|
-
}
|
|
7022
|
-
],
|
|
7023
6623
|
"description": "Upper bound. ISO 8601 UTC (e.g. `2026-04-01T00:00:00Z` or `2026-04-01`) OR a relative shape: `7d` / `1w` / `2h` / `30m` (past), `+7d` (future), `today` / `yesterday` / `tomorrow` / `now`, `monday`-`sunday` (most recent), `last-<weekday>` / `next-<weekday>`, `start-of-week|month|year`, `end-of-week|month|year`. Relative forms resolve at request time relative to the CLI process clock (UTC)."
|
|
7024
6624
|
},
|
|
7025
6625
|
{
|
|
@@ -7074,12 +6674,6 @@
|
|
|
7074
6674
|
"name": "team-id",
|
|
7075
6675
|
"key": "teamId",
|
|
7076
6676
|
"required": true,
|
|
7077
|
-
"aliases": [
|
|
7078
|
-
{
|
|
7079
|
-
"name": "id",
|
|
7080
|
-
"key": "id"
|
|
7081
|
-
}
|
|
7082
|
-
],
|
|
7083
6677
|
"description": "Microsoft Teams team ID. Returned by `ask-marcel-office list-joined-teams`."
|
|
7084
6678
|
},
|
|
7085
6679
|
{
|
|
@@ -7110,12 +6704,6 @@
|
|
|
7110
6704
|
"name": "team-id",
|
|
7111
6705
|
"key": "teamId",
|
|
7112
6706
|
"required": true,
|
|
7113
|
-
"aliases": [
|
|
7114
|
-
{
|
|
7115
|
-
"name": "id",
|
|
7116
|
-
"key": "id"
|
|
7117
|
-
}
|
|
7118
|
-
],
|
|
7119
6707
|
"description": "Microsoft Teams team ID."
|
|
7120
6708
|
}
|
|
7121
6709
|
],
|
|
@@ -7135,12 +6723,6 @@
|
|
|
7135
6723
|
"name": "chat-id",
|
|
7136
6724
|
"key": "chatId",
|
|
7137
6725
|
"required": true,
|
|
7138
|
-
"aliases": [
|
|
7139
|
-
{
|
|
7140
|
-
"name": "id",
|
|
7141
|
-
"key": "id"
|
|
7142
|
-
}
|
|
7143
|
-
],
|
|
7144
6726
|
"description": "Teams chat ID — typically `19:<thread>@unq.gbl.spaces` (1:1) or `19:<thread>@thread.v2` (group). Source via `list-chats` or `list-teams-chats-with-messages`."
|
|
7145
6727
|
},
|
|
7146
6728
|
{
|
|
@@ -7191,12 +6773,6 @@
|
|
|
7191
6773
|
"name": "chat-id",
|
|
7192
6774
|
"key": "chatId",
|
|
7193
6775
|
"required": true,
|
|
7194
|
-
"aliases": [
|
|
7195
|
-
{
|
|
7196
|
-
"name": "id",
|
|
7197
|
-
"key": "id"
|
|
7198
|
-
}
|
|
7199
|
-
],
|
|
7200
6776
|
"description": "Teams chat ID — typically `19:<thread>@unq.gbl.spaces` (1:1) or `19:<thread>@thread.v2` (group). Source via `list-chats` or `list-teams-chats-with-messages`."
|
|
7201
6777
|
}
|
|
7202
6778
|
],
|
|
@@ -7243,29 +6819,13 @@
|
|
|
7243
6819
|
"name": "todo-task-list-id",
|
|
7244
6820
|
"key": "todoTaskListId",
|
|
7245
6821
|
"required": true,
|
|
7246
|
-
"description": "To Do task list ID. Returned by `ask-marcel-office list-todo-task-lists`."
|
|
7247
|
-
"aliases": [
|
|
7248
|
-
{
|
|
7249
|
-
"name": "task-list-id",
|
|
7250
|
-
"key": "taskListId"
|
|
7251
|
-
},
|
|
7252
|
-
{
|
|
7253
|
-
"name": "todo-list-id",
|
|
7254
|
-
"key": "todoListId"
|
|
7255
|
-
}
|
|
7256
|
-
]
|
|
6822
|
+
"description": "To Do task list ID. Returned by `ask-marcel-office list-todo-task-lists`."
|
|
7257
6823
|
},
|
|
7258
6824
|
{
|
|
7259
6825
|
"name": "todo-task-id",
|
|
7260
6826
|
"key": "todoTaskId",
|
|
7261
6827
|
"required": true,
|
|
7262
|
-
"description": "To Do task ID. Returned by `ask-marcel-office list-todo-tasks`.
|
|
7263
|
-
"aliases": [
|
|
7264
|
-
{
|
|
7265
|
-
"name": "task-id",
|
|
7266
|
-
"key": "taskId"
|
|
7267
|
-
}
|
|
7268
|
-
]
|
|
6828
|
+
"description": "To Do task ID. Returned by `ask-marcel-office list-todo-tasks`."
|
|
7269
6829
|
},
|
|
7270
6830
|
{
|
|
7271
6831
|
"name": "top",
|
|
@@ -7357,21 +6917,7 @@
|
|
|
7357
6917
|
"name": "todo-task-list-id",
|
|
7358
6918
|
"key": "todoTaskListId",
|
|
7359
6919
|
"required": true,
|
|
7360
|
-
"description": "To Do task list ID. Returned by `ask-marcel-office list-todo-task-lists`."
|
|
7361
|
-
"aliases": [
|
|
7362
|
-
{
|
|
7363
|
-
"name": "id",
|
|
7364
|
-
"key": "id"
|
|
7365
|
-
},
|
|
7366
|
-
{
|
|
7367
|
-
"name": "task-list-id",
|
|
7368
|
-
"key": "taskListId"
|
|
7369
|
-
},
|
|
7370
|
-
{
|
|
7371
|
-
"name": "todo-list-id",
|
|
7372
|
-
"key": "todoListId"
|
|
7373
|
-
}
|
|
7374
|
-
]
|
|
6920
|
+
"description": "To Do task list ID. Returned by `ask-marcel-office list-todo-task-lists`."
|
|
7375
6921
|
},
|
|
7376
6922
|
{
|
|
7377
6923
|
"name": "top",
|
|
@@ -7426,21 +6972,7 @@
|
|
|
7426
6972
|
"name": "todo-task-list-id",
|
|
7427
6973
|
"key": "todoTaskListId",
|
|
7428
6974
|
"required": true,
|
|
7429
|
-
"description": "Microsoft To Do task list ID. Returned by `list-todo-task-lists`."
|
|
7430
|
-
"aliases": [
|
|
7431
|
-
{
|
|
7432
|
-
"name": "id",
|
|
7433
|
-
"key": "id"
|
|
7434
|
-
},
|
|
7435
|
-
{
|
|
7436
|
-
"name": "task-list-id",
|
|
7437
|
-
"key": "taskListId"
|
|
7438
|
-
},
|
|
7439
|
-
{
|
|
7440
|
-
"name": "todo-list-id",
|
|
7441
|
-
"key": "todoListId"
|
|
7442
|
-
}
|
|
7443
|
-
]
|
|
6975
|
+
"description": "Microsoft To Do task list ID. Returned by `list-todo-task-lists`."
|
|
7444
6976
|
}
|
|
7445
6977
|
],
|
|
7446
6978
|
"example": "ask-marcel-office list-todo-tasks-delta --todo-task-list-id 'AAMkAD...'",
|
|
@@ -7508,12 +7040,6 @@
|
|
|
7508
7040
|
"name": "user-id",
|
|
7509
7041
|
"key": "userId",
|
|
7510
7042
|
"required": true,
|
|
7511
|
-
"aliases": [
|
|
7512
|
-
{
|
|
7513
|
-
"name": "id",
|
|
7514
|
-
"key": "id"
|
|
7515
|
-
}
|
|
7516
|
-
],
|
|
7517
7043
|
"description": "Azure AD user ID or userPrincipalName (UPN) — typically the user's email address. Discover via `list-relevant-people` (relevance-ranked colleagues) or `microsoft-search-query --query <name>` (federated person search across the tenant directory)."
|
|
7518
7044
|
},
|
|
7519
7045
|
{
|
|
@@ -7589,7 +7115,7 @@
|
|
|
7589
7115
|
},
|
|
7590
7116
|
{
|
|
7591
7117
|
"name": "next-page",
|
|
7592
|
-
"summary": "Fetch the next page of a paginated Graph response. Pass the cursor the previous command emitted — in text mode the `---` footer prints the whole ready-to-run command (`next: ask-marcel-office next-page --url '<url>'`), so copy the line as-is (the URL is single-quoted because it contains `$`); in JSON mode use the top-level `nextLink` field. Never reach into `data[\"@odata.nextLink\"]`; the CLI strips that and surfaces it as a first-class envelope/footer field. Automatically signs `/me/chats` and `/chats/...` cursors with the M365ChatClient elevated token to match the chat-metadata commands.",
|
|
7118
|
+
"summary": "Fetch the next page of a paginated Graph response. Pass the cursor the previous command emitted — in text mode the `---` footer prints the whole ready-to-run command (`next: ask-marcel-office next-page --url '<url>'`), so copy the line as-is (the URL is single-quoted because it contains `$`); in JSON mode use the top-level `nextLink` field. Never reach into `data[\"@odata.nextLink\"]`; the CLI strips that and surfaces it as a first-class envelope/footer field. Automatically signs `/me/chats` and `/chats/...` cursors with the M365ChatClient elevated token to match the chat-metadata commands. When the cursor came from a partner-tenant (guest) drive listing, pass the same `--tenant-id` you used on the originating command, since the cursor carries no tenant and without it page 2 fails with `invalidAudienceUri`.",
|
|
7593
7119
|
"category": "meta",
|
|
7594
7120
|
"graphMethod": "GET",
|
|
7595
7121
|
"graphPathTemplate": "{url}",
|
|
@@ -7603,6 +7129,12 @@
|
|
|
7603
7129
|
"argumentHint": {
|
|
7604
7130
|
"kind": "graphSubpath"
|
|
7605
7131
|
}
|
|
7132
|
+
},
|
|
7133
|
+
{
|
|
7134
|
+
"name": "tenant-id",
|
|
7135
|
+
"key": "tenantId",
|
|
7136
|
+
"required": false,
|
|
7137
|
+
"description": "Tenant GUID of a PARTNER tenant you are a guest in. Pass it only to continue a partner-tenant drive listing (a folder / `*-drive-item` cursor whose file lives in another tenant), using the same `--tenant-id` you gave the originating command (ultimately from `resolve-drive-share-link`). The page is then signed with a guest token for that tenant; without it a partner-tenant cursor 401s with `invalidAudienceUri` on page 2 even though page 1 succeeded. Omit it for your own tenant and for every `/me/...` and chat cursor (the normal case)."
|
|
7606
7138
|
}
|
|
7607
7139
|
],
|
|
7608
7140
|
"example": "ask-marcel-office next-page --url 'https://graph.microsoft.com/v1.0/me/messages?$skip=10'",
|
|
@@ -7733,14 +7265,14 @@
|
|
|
7733
7265
|
},
|
|
7734
7266
|
{
|
|
7735
7267
|
"name": "scopes-check",
|
|
7736
|
-
"summary": "Decode the cached Teams web client access token and return its scopes, audience, and expiry without making a Graph call. Use this as a self-test before running a command an LLM expects to fail with `accessDenied` — if the required scope isn't in the returned list, the call will reject regardless of tenant config. Each command's `scopesRequired` field in `help-json` lists the scopes that command needs; intersect with the array returned here for a pre-flight check (pipe both through `jq` and diff). The `expiresInSeconds` field lets an LLM decide pre-emptively to `login` again — typically worth doing under ~5 minutes (300 s) so a long-running session doesn't hit the wall mid-command. The `elevated` block reports whether the *separate* M365ChatClient-elevated token (needed by the historical-version download / convert commands) is cached and still usable — so a fresh process can pre-flight `deep-scan`-style workloads instead of discovering a 403 mid-run; `available:false` when it is absent, expired, or within the same 5-minute buffer the download path applies. The `chatsvcagg` and `ic3` blocks report the two Teams-chat substrate tokens (used by `list-teams-chat*` / `find-chats-with-user`) the same way; both self-heal from the shared refresh token, so they are informational rather than a preflight gate. Every tier block also lists that token's OWN granted scopes (decoded from its `scp` claim, distinct per token) and its `refresh` route (`automatic` = self-heals from the shared refresh token; `interactive` = the elevated tier, which carries no refresh token of its own and is re-captured by a browser login); the `hint` field says how to refresh them.",
|
|
7268
|
+
"summary": "Decode the cached Teams web client access token and return its scopes, audience, and expiry without making a Graph call. It never opens a browser: an expired or missing session is reported as such (negative `expiresInSeconds`, or a not-signed-in error), and `login` is the command that refreshes it. Use this as a self-test before running a command an LLM expects to fail with `accessDenied` — if the required scope isn't in the returned list, the call will reject regardless of tenant config. Each command's `scopesRequired` field in `help-json` lists the scopes that command needs; intersect with the array returned here for a pre-flight check (pipe both through `jq` and diff). The `expiresInSeconds` field lets an LLM decide pre-emptively to `login` again — typically worth doing under ~5 minutes (300 s) so a long-running session doesn't hit the wall mid-command. The `elevated` block reports whether the *separate* M365ChatClient-elevated token (needed by the historical-version download / convert commands) is cached and still usable — so a fresh process can pre-flight `deep-scan`-style workloads instead of discovering a 403 mid-run; `available:false` when it is absent, expired, or within the same 5-minute buffer the download path applies. The `chatsvcagg` and `ic3` blocks report the two Teams-chat substrate tokens (used by `list-teams-chat*` / `find-chats-with-user`) the same way; both self-heal from the shared refresh token, so they are informational rather than a preflight gate. Every tier block also lists that token's OWN granted scopes (decoded from its `scp` claim, distinct per token) and its `refresh` route (`automatic` = self-heals from the shared refresh token; `interactive` = the elevated tier, which carries no refresh token of its own and is re-captured by a browser login); the `hint` field says how to refresh them.",
|
|
7737
7269
|
"category": "meta",
|
|
7738
7270
|
"graphMethod": "GET",
|
|
7739
7271
|
"graphPathTemplate": "(meta) cached-token introspection — no Graph endpoint",
|
|
7740
7272
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/permissions-reference",
|
|
7741
7273
|
"options": [],
|
|
7742
7274
|
"example": "ask-marcel-office scopes-check",
|
|
7743
|
-
"responseShape": "`{ scopes: string[], audience: string, expiresAt: string (ISO 8601), expiresInSeconds: number, elevated: TokenTier, chatsvcagg: TokenTier, ic3: TokenTier, hint: string }` where `TokenTier = { available: boolean, expiresInSeconds?: number, scopes: string[], refresh: \"automatic\" | \"interactive\", reason?: string }`. Top-level `scopes`/`audience`/`expiresAt`/`expiresInSeconds` describe the basic Teams token (back-compat). Each tier block also carries that token's OWN `scopes` (decoded from its `scp` claim: elevated ~20 Graph scopes, chatsvcagg `user_impersonation`, ic3 `Teams.AccessAsUser.All`) and its `refresh` route (`automatic` = self-heals from the shared refresh token; `interactive` = the elevated token, re-captured only by a browser login). `available` is `true` only when the token is present and beyond the 5-minute buffer; `expiresInSeconds` is the raw remaining seconds (negative when expired) and is omitted when the token is absent. `reason` is present ONLY when `available` is `false` — a plain-language note on why the tier is missing and how to restore it (so an empty `scopes: []` on an absent token is not mistaken for \"no scopes\"); it is omitted when the token is available. `hint` names `login --force` as the single refresh action."
|
|
7275
|
+
"responseShape": "`{ scopes: string[], audience: string, expiresAt: string (ISO 8601), expiresInSeconds: number, elevated: TokenTier, chatsvcagg: TokenTier, ic3: TokenTier, hint: string }` where `TokenTier = { available: boolean, expiresInSeconds?: number, scopes: string[], refresh: \"automatic\" | \"interactive\", reason?: string }`. Top-level `scopes`/`audience`/`expiresAt`/`expiresInSeconds` describe the basic Teams token (back-compat). Each tier block also carries that token's OWN `scopes` (decoded from its `scp` claim: elevated ~20 Graph scopes, chatsvcagg `user_impersonation`, ic3 `Teams.AccessAsUser.All`) and its `refresh` route (`automatic` = self-heals from the shared refresh token; `interactive` = the elevated token, re-captured only by a browser login). `available` is `true` only when the token is present and beyond the 5-minute buffer; `expiresInSeconds` is the raw remaining seconds (negative when expired) and is omitted when the token is absent. `reason` is present ONLY when `available` is `false` — a plain-language note on why the tier is missing and how to restore it (so an empty `scopes: []` on an absent token is not mistaken for \"no scopes\"); it is omitted when the token is available. `hint` names `login --force` as the single refresh action. EVERY tier — `basic` included — is reported as its own block with the SAME shape, and each block carries a `reads` line: a plain-language description of what that tier lets you read (e.g. `chatsvcagg` -> \"Teams chat message content\"), so a caller never has to know what a tier codename means. The `basic` block mirrors the loose top-level `scopes`/`expiresAt`/`expiresInSeconds` fields, which are still emitted unchanged for back-compat; prefer the block. `basic.available` applies the same 300-second freshness buffer as the other tiers, so `available` means the same thing everywhere."
|
|
7744
7276
|
},
|
|
7745
7277
|
{
|
|
7746
7278
|
"name": "search-all-accessible-sites",
|
|
@@ -7902,12 +7434,6 @@
|
|
|
7902
7434
|
"name": "drive-id",
|
|
7903
7435
|
"key": "driveId",
|
|
7904
7436
|
"required": true,
|
|
7905
|
-
"aliases": [
|
|
7906
|
-
{
|
|
7907
|
-
"name": "id",
|
|
7908
|
-
"key": "id"
|
|
7909
|
-
}
|
|
7910
|
-
],
|
|
7911
7437
|
"description": "Microsoft Graph drive ID to search inside. Use `ask-marcel-office list-drives` for the personal OneDrive, or `ask-marcel-office list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
7912
7438
|
},
|
|
7913
7439
|
{
|
|
@@ -7956,20 +7482,14 @@
|
|
|
7956
7482
|
"summary": "Find OneNote pages whose title contains a substring (case-sensitive — page content is NOT searched). Microsoft removed full-text OneNote `?search=` from v1.0 Graph; only $filter against `title` remains, which is what this command runs. Accepts the OData passthrough flags top/skip/select/orderby/expand. The filter passthrough is intentionally omitted — the path already pins a `$filter` for the title-contains predicate, and Graph rejects two `$filter` query params.",
|
|
7957
7483
|
"category": "notes",
|
|
7958
7484
|
"graphMethod": "GET",
|
|
7959
|
-
"graphPathTemplate": "/me/onenote/pages?$filter=contains(title,'{
|
|
7485
|
+
"graphPathTemplate": "/me/onenote/pages?$filter=contains(title,'{query}')",
|
|
7960
7486
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/onenote-list-pages",
|
|
7961
7487
|
"options": [
|
|
7962
7488
|
{
|
|
7963
|
-
"name": "
|
|
7964
|
-
"key": "
|
|
7489
|
+
"name": "query",
|
|
7490
|
+
"key": "query",
|
|
7965
7491
|
"required": true,
|
|
7966
|
-
"description": "Substring to look for inside OneNote page
|
|
7967
|
-
"aliases": [
|
|
7968
|
-
{
|
|
7969
|
-
"name": "query",
|
|
7970
|
-
"key": "query"
|
|
7971
|
-
}
|
|
7972
|
-
]
|
|
7492
|
+
"description": "Substring to look for inside OneNote page TITLES (case-sensitive, exact substring — not a full-text query, despite the flag name shared with the other search commands). Full-text body search is not available on OneNote pages in v1.0 Graph. Use `list-onenote-section-pages` if you already know the section."
|
|
7973
7493
|
},
|
|
7974
7494
|
{
|
|
7975
7495
|
"name": "top",
|
|
@@ -8002,7 +7522,7 @@
|
|
|
8002
7522
|
"description": "OData $expand: navigation properties to include inline (e.g. `attachments`). Increases response size; use sparingly."
|
|
8003
7523
|
}
|
|
8004
7524
|
],
|
|
8005
|
-
"example": "ask-marcel-office search-onenote-pages --
|
|
7525
|
+
"example": "ask-marcel-office search-onenote-pages --query 'meeting notes' --top 25",
|
|
8006
7526
|
"responseShape": "collection of Microsoft Graph `onenotePage` resources under `value[]` whose title contains the substring",
|
|
8007
7527
|
"pagination": true
|
|
8008
7528
|
},
|
|
@@ -8063,23 +7583,17 @@
|
|
|
8063
7583
|
},
|
|
8064
7584
|
{
|
|
8065
7585
|
"name": "update-mail-draft",
|
|
8066
|
-
"summary": "Update an existing mail draft. PATCH /me/messages/{id} — modifies a draft created by create-mail-draft (or any existing draft in the Drafts folder). Only the fields you pass are updated; omitted fields are left unchanged. At least one field must be provided. On a THREADED draft (one made by create-reply-draft / create-forward-draft), revise your text with --comment, which rewrites only what sits above the quoted history and leaves the quote byte-identical; --body-content
|
|
7586
|
+
"summary": "Update an existing mail draft. PATCH /me/messages/{id} — modifies a draft created by create-mail-draft (or any existing draft in the Drafts folder). Only the fields you pass are updated; omitted fields are left unchanged. At least one field must be provided. On a THREADED draft (one made by create-reply-draft / create-forward-draft), revise your text with --comment, which rewrites only what sits above the quoted history and leaves the quote byte-identical; --body-content replaces the whole body and would drop the thread, so it is REFUSED on a draft that still carries a quote unless you pass --replace-quoted-history true. Passing an EMPTY string to a recipient flag clears that list, which is how you drop recipients a reply-all or forward inherited; omitting the flag leaves the list alone. Returns a slim confirmation (id, subject, recipients, importance, bodyPreview, …) - NOT the full body, which you just wrote; read it back with get-mail-message if you need the whole draft before sending.",
|
|
8067
7587
|
"category": "mail",
|
|
8068
7588
|
"graphMethod": "PATCH",
|
|
8069
|
-
"graphPathTemplate": "/me/messages/{message-id} (+ a GET of body,isDraft first when {comment} is used)",
|
|
7589
|
+
"graphPathTemplate": "/me/messages/{message-id} (+ a GET of body,isDraft first when {comment} is used, or when {body-content} is used without {replace-quoted-history})",
|
|
8070
7590
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/message-update",
|
|
8071
7591
|
"options": [
|
|
8072
7592
|
{
|
|
8073
7593
|
"name": "message-id",
|
|
8074
7594
|
"key": "messageId",
|
|
8075
7595
|
"required": true,
|
|
8076
|
-
"
|
|
8077
|
-
{
|
|
8078
|
-
"name": "id",
|
|
8079
|
-
"key": "id"
|
|
8080
|
-
}
|
|
8081
|
-
],
|
|
8082
|
-
"description": "Draft message ID to update. Source from create-mail-draft response or list-mail-folder-messages --mail-folder-id drafts. Accepts `--id` as an alias.",
|
|
7596
|
+
"description": "Draft message ID to update. Source from create-mail-draft response or list-mail-folder-messages --mail-folder-id drafts.",
|
|
8083
7597
|
"argumentHint": {
|
|
8084
7598
|
"kind": "idOrName"
|
|
8085
7599
|
}
|
|
@@ -8094,7 +7608,7 @@
|
|
|
8094
7608
|
"name": "body-content",
|
|
8095
7609
|
"key": "bodyContent",
|
|
8096
7610
|
"required": false,
|
|
8097
|
-
"description": "New email body content. Replaces the ENTIRE body, quoted history included. On a threaded reply or forward draft
|
|
7611
|
+
"description": "New email body content. Replaces the ENTIRE body, quoted history included. On a threaded reply or forward draft that is almost never what you want, so the command reads the draft first and REFUSES when it still carries a quote - use --comment to revise only your own text and keep the quote, or pass --replace-quoted-history true to drop it deliberately. Note the sibling commands: create-reply-draft / create-forward-draft name their above-the-quote text --comment; --body-content exists only here. Pass --body-content-type HTML for rich text. Mutually exclusive with --comment."
|
|
8098
7612
|
},
|
|
8099
7613
|
{
|
|
8100
7614
|
"name": "comment",
|
|
@@ -8102,6 +7616,19 @@
|
|
|
8102
7616
|
"required": false,
|
|
8103
7617
|
"description": "Rewrite ONLY the reply text above the quoted history on a threaded draft, keeping the quote and its styles byte-identical. This is the flag for revising a draft made by create-reply-draft or create-forward-draft; repeated edits replace your text rather than stacking. Refused when the draft has no quoted history (use --body-content), when it is not a draft, and when HTML markup you pass carries a quote boundary marker of its own. Mutually exclusive with --body-content."
|
|
8104
7618
|
},
|
|
7619
|
+
{
|
|
7620
|
+
"name": "replace-quoted-history",
|
|
7621
|
+
"key": "replaceQuotedHistory",
|
|
7622
|
+
"required": false,
|
|
7623
|
+
"description": "Allow --body-content to drop the quoted history on a threaded draft. Without it, --body-content is REFUSED when the draft still carries a quote, because replacing the whole body there silently loses the thread; the refusal points at --comment, which revises only your own text. Pass `true` for the deliberate case: strip the quote but keep the draft threaded on its conversation. Ignored in comment mode, which never touches the quote.",
|
|
7624
|
+
"argumentHint": {
|
|
7625
|
+
"kind": "magicValue",
|
|
7626
|
+
"values": [
|
|
7627
|
+
"true",
|
|
7628
|
+
"false"
|
|
7629
|
+
]
|
|
7630
|
+
}
|
|
7631
|
+
},
|
|
8105
7632
|
{
|
|
8106
7633
|
"name": "body-content-type",
|
|
8107
7634
|
"key": "bodyContentType",
|
|
@@ -8150,7 +7677,7 @@
|
|
|
8150
7677
|
],
|
|
8151
7678
|
"example": "ask-marcel-office update-mail-draft --message-id \"AAMkAD...\" --subject \"Updated: Q3 Report\" --to-recipients \"alice@example.com,charlie@example.com\"",
|
|
8152
7679
|
"responseShape": "A confirmation of the write, NOT the whole message: `{ id, subject, toRecipients, ccRecipients, bccRecipients, importance, bodyPreview, isDraft, webLink, conversationId }` (only the fields Graph returned; `{ ok: true }` when Graph answers 204). The `body` is deliberately omitted — you just wrote it, and echoing a long thread's quoted history back cost ~174 KB of context per call. Read the full body with `get-mail-message --id <the returned id>` when you actually need it; `bodyPreview` is Graph's ~255-char summary, enough to confirm WHICH draft answered. The `id` is the draft — refine it with `update-mail-draft`, or open Outlook Drafts to review and send. Dedup caveat: a `conversationId` `$filter` on the Drafts folder is not a reliable 'does a draft already exist on this thread' check. Reply and forward drafts do not always inherit the inbound message's `conversationId` (one thread can split across several), and Graph `$filter` on Drafts is not read-your-writes consistent, so a just-created draft can be missed. To find existing drafts, use the `find-mail-drafts` command, which scans recent drafts and matches client-side on subject and recipients; to revise a draft this session created, reuse the returned `id`.",
|
|
8153
|
-
"bodyTemplate": "{ subject?: '{subject}', body?: { contentType: '{body-content-type}', content: '{body-content}' }, toRecipients?: '{to-recipients}', ccRecipients?: '{cc-recipients}', bccRecipients?: '{bcc-recipients}', importance?: '{importance}' } — only provided fields are sent. With '{comment}': body.content is the draft's own body with the text above the quote replaced, and body.contentType is the draft's own, unchanged",
|
|
7680
|
+
"bodyTemplate": "{ subject?: '{subject}', body?: { contentType: '{body-content-type}', content: '{body-content}' }, toRecipients?: '{to-recipients}', ccRecipients?: '{cc-recipients}', bccRecipients?: '{bcc-recipients}', importance?: '{importance}' } — only provided fields are sent. With '{comment}': body.content is the draft's own body with the text above the quote replaced, and body.contentType is the draft's own, unchanged. A '{body-content}' aimed at a draft that still carries a quote costs one GET of body,isDraft and is refused unless '{replace-quoted-history}' is true",
|
|
8154
7681
|
"mutates": true
|
|
8155
7682
|
}
|
|
8156
7683
|
]
|