ask-marcel-office-cli 1.0.0 → 1.5.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 +65 -0
- package/README.md +153 -384
- package/dist/cli.js +13222 -94112
- package/dist/commands.json +1500 -135
- package/dist/composition/build-deps.d.ts +13 -0
- package/dist/composition/cli.d.ts +8 -0
- package/dist/domain/iso-datetime.d.ts +30 -0
- package/dist/domain/utilities/archive-status.d.ts +18 -0
- package/dist/domain/utilities/site-url-classifier.d.ts +15 -0
- package/dist/index.js +10912 -92275
- package/dist/infra/auth.d.ts +56 -3
- package/dist/infra/browser-auth.d.ts +100 -10
- package/dist/infra/graph-client.d.ts +40 -0
- package/dist/infra/legacy-doc-extractor.d.ts +14 -0
- package/dist/infra/msg-reader-adapter.d.ts +83 -0
- package/dist/infra/network-error.d.ts +9 -0
- package/dist/infra/ooxml-media-extractor.d.ts +27 -0
- package/dist/infra/ooxml-zip-adapter.d.ts +28 -0
- package/dist/infra/pdf-image-extractor.d.ts +18 -0
- package/dist/infra/pdf-text-extractor.d.ts +41 -0
- package/dist/infra/png-encode.d.ts +15 -0
- package/dist/infra/sheetjs-adapter.d.ts +1 -1
- package/dist/infra/system-browser-auth.d.ts +35 -0
- package/dist/infra/system-browser-loader.d.ts +3 -0
- package/dist/infra/token-callback-server.d.ts +31 -0
- package/dist/infra/zip-reader.d.ts +32 -0
- package/dist/presenter/error-hints.d.ts +41 -0
- package/dist/presenter/output.d.ts +2 -1
- package/dist/use-cases/commands/build-command.d.ts +30 -8
- package/dist/use-cases/commands/command-types.d.ts +53 -1
- package/dist/use-cases/commands/convert-calendar-event-attachment-to-markdown.d.ts +15 -0
- package/dist/use-cases/commands/{download-drive-item-version-as-pdf.d.ts → convert-calendar-event-attachment-to-pdf.d.ts} +2 -3
- package/dist/use-cases/commands/convert-drive-item-zip.d.ts +26 -0
- package/dist/use-cases/commands/convert-local-file.d.ts +37 -0
- package/dist/use-cases/commands/convert-mail-attachment-to-markdown.d.ts +7 -1
- package/dist/use-cases/commands/convert-mail-attachment-to-pdf.d.ts +2 -1
- package/dist/use-cases/commands/convert-mail-attachment-zip.d.ts +24 -0
- package/dist/use-cases/commands/convert-mail-to-markdown.d.ts +8 -0
- package/dist/use-cases/commands/create-mail-draft.d.ts +22 -0
- package/dist/use-cases/commands/doc-to-markdown.d.ts +14 -0
- package/dist/use-cases/commands/docs-render.d.ts +7 -2
- package/dist/use-cases/commands/docs.d.ts +44 -1
- package/dist/use-cases/commands/docx-comment-anchors.d.ts +22 -0
- package/dist/use-cases/commands/docx-metadata-to-markdown.d.ts +3 -0
- package/dist/use-cases/commands/docx-metadata.d.ts +69 -0
- package/dist/use-cases/commands/docx-to-markdown.d.ts +8 -3
- package/dist/use-cases/commands/download-drive-item-as-markdown.d.ts +9 -0
- package/dist/use-cases/commands/download-drive-item-version.d.ts +21 -0
- package/dist/use-cases/commands/{download-drive-item-version-as-markdown.d.ts → extract-drive-item-images.d.ts} +0 -1
- package/dist/use-cases/commands/extract-local-file-images.d.ts +21 -0
- package/dist/use-cases/commands/{download-drive-item-version-content.d.ts → extract-mail-attachment-images.d.ts} +2 -3
- package/dist/use-cases/commands/extract-sharepoint-links-in-documents.d.ts +33 -0
- package/dist/use-cases/commands/extract-sharepoint-links-in-mail.d.ts +1 -8
- package/dist/use-cases/commands/fetch-raw-bytes.d.ts +2 -1
- package/dist/use-cases/commands/file-counts.d.ts +7 -0
- package/dist/use-cases/commands/filter-archived-sites.d.ts +17 -0
- package/dist/use-cases/commands/find-chats-with-user.d.ts +10 -0
- package/dist/use-cases/commands/first-sentence.d.ts +12 -0
- package/dist/use-cases/commands/get-chat.d.ts +1 -5
- package/dist/use-cases/commands/get-excel-chart-image.d.ts +20 -0
- package/dist/use-cases/commands/get-excel-used-range.d.ts +7 -2
- package/dist/use-cases/commands/get-onenote-page-as-markdown.d.ts +8 -0
- package/dist/use-cases/commands/get-teams-chat-message.d.ts +9 -0
- package/dist/use-cases/commands/get-todo-task.d.ts +9 -2
- package/dist/use-cases/commands/image-extraction.d.ts +10 -0
- package/dist/use-cases/commands/iso-datetime-schema.d.ts +21 -0
- package/dist/use-cases/commands/link-shape.d.ts +13 -0
- package/dist/use-cases/commands/list-accessible-drives.d.ts +14 -0
- package/dist/use-cases/commands/list-calendar-event-attachments.d.ts +14 -0
- package/dist/use-cases/commands/list-calendar-view-delta.d.ts +2 -2
- package/dist/use-cases/commands/list-teams-chat-history.d.ts +16 -0
- package/dist/use-cases/commands/list-teams-chat-messages.d.ts +8 -0
- package/dist/use-cases/commands/list-teams-chats-with-messages.d.ts +9 -0
- package/dist/use-cases/commands/mail-quote-stripper.d.ts +25 -0
- package/dist/use-cases/commands/markdown-dispatch.d.ts +29 -0
- package/dist/use-cases/commands/markdown-pipeline.d.ts +6 -2
- package/dist/use-cases/commands/media-files.d.ts +20 -0
- package/dist/use-cases/commands/msg-to-markdown.d.ts +28 -0
- package/dist/use-cases/commands/odf-content-to-markdown.d.ts +5 -0
- package/dist/use-cases/commands/odf-metadata-to-markdown.d.ts +3 -0
- package/dist/use-cases/commands/odf-metadata.d.ts +26 -0
- package/dist/use-cases/commands/odf-to-markdown.d.ts +17 -0
- package/dist/use-cases/commands/office-extensions.d.ts +13 -0
- package/dist/use-cases/commands/office-to-markdown.d.ts +6 -2
- package/dist/use-cases/commands/onenote-metadata.d.ts +21 -0
- package/dist/use-cases/commands/onenote-resource-embedder.d.ts +3 -0
- package/dist/use-cases/commands/ooxml-metadata-to-markdown.d.ts +16 -0
- package/dist/use-cases/commands/ooxml-metadata.d.ts +23 -0
- package/dist/use-cases/commands/ooxml-xml-walker.d.ts +36 -0
- package/dist/use-cases/commands/option-descriptions.d.ts +5 -0
- package/dist/use-cases/commands/output-path.d.ts +23 -0
- package/dist/use-cases/commands/pdf-to-markdown.d.ts +19 -0
- package/dist/use-cases/commands/pptx-comments.d.ts +24 -0
- package/dist/use-cases/commands/pptx-metadata-to-markdown.d.ts +3 -0
- package/dist/use-cases/commands/pptx-metadata.d.ts +33 -0
- package/dist/use-cases/commands/pptx-slides.d.ts +17 -0
- package/dist/use-cases/commands/pptx-to-markdown.d.ts +7 -0
- package/dist/use-cases/commands/read-mail-attachment.d.ts +15 -0
- package/dist/use-cases/commands/resolve-calendar-link.d.ts +8 -0
- package/dist/use-cases/commands/resolve-drive-share-link.d.ts +8 -0
- package/dist/use-cases/commands/resolve-mail-link.d.ts +8 -0
- package/dist/use-cases/commands/resolve-teams-link.d.ts +8 -0
- package/dist/use-cases/commands/search-all-accessible-sites.d.ts +12 -0
- package/dist/use-cases/commands/search-index-total.d.ts +3 -0
- package/dist/use-cases/commands/search-sharepoint-sites-by-name.d.ts +3 -2
- package/dist/use-cases/commands/sharepoint-link-extractor.d.ts +17 -12
- package/dist/use-cases/commands/text-passthrough.d.ts +15 -2
- package/dist/use-cases/commands/todo-parse-uri-rewrite.d.ts +7 -0
- package/dist/use-cases/commands/update-mail-draft.d.ts +22 -0
- package/dist/use-cases/commands/version-id.d.ts +7 -6
- package/dist/use-cases/commands/xlsx-comments.d.ts +29 -0
- package/dist/use-cases/commands/xlsx-metadata-to-markdown.d.ts +3 -0
- package/dist/use-cases/commands/xlsx-metadata.d.ts +39 -0
- package/dist/use-cases/commands/xlsx-to-markdown.d.ts +9 -2
- package/dist/use-cases/commands/zip-archive-to-markdown.d.ts +30 -0
- package/dist/use-cases/ports/filesystem.d.ts +10 -0
- package/docs/COMMANDS.md +259 -0
- package/docs/USAGE.md +266 -0
- package/docs/commands.json +1500 -135
- package/package.json +16 -8
- /package/dist/use-cases/commands/{download-onedrive-file-content.d.ts → download-drive-item-content.d.ts} +0 -0
package/docs/commands.json
CHANGED
|
@@ -1,11 +1,162 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "ask-marcel-office-cli",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"generatedAt": "2026-
|
|
3
|
+
"version": "1.5.0",
|
|
4
|
+
"generatedAt": "2026-06-16T16:14:42.738Z",
|
|
5
5
|
"commands": [
|
|
6
|
+
{
|
|
7
|
+
"name": "convert-calendar-event-attachment-to-markdown",
|
|
8
|
+
"summary": "Convert an attachment on an Outlook calendar event to markdown. Polymorphic on the attachment’s `@odata.type` (shares the mail-attachment pipeline): fileAttachment decodes the inline bytes and runs them through the local conversion pipeline (docx via mammoth, xlsx via sheetjs, csv as markdown table, odt/ods/odp via content.xml, plus plain-text passthrough); referenceAttachment resolves via /shares/{token}/driveItem and routes through the same dispatcher; itemAttachment (embedded mail / event / contact) is rendered locally. For pptx decks attached to a meeting, `convert-calendar-event-attachment-to-pdf` preserves slide layout (a pptx here yields only its speaker notes / titles / comments via `## PPTX metadata` with `--include-metadata true`). For pdf/rtf/etc. also use the PDF sibling.",
|
|
9
|
+
"category": "calendar",
|
|
10
|
+
"graphMethod": "GET",
|
|
11
|
+
"graphPathTemplate": "/me/events/{event-id}/attachments/{attachment-id}",
|
|
12
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/attachment-get",
|
|
13
|
+
"options": [
|
|
14
|
+
{
|
|
15
|
+
"name": "event-id",
|
|
16
|
+
"key": "eventId",
|
|
17
|
+
"required": true,
|
|
18
|
+
"description": "Outlook calendar event ID. Returned by `list-calendar-events` or `get-calendar-event`."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "attachment-id",
|
|
22
|
+
"key": "attachmentId",
|
|
23
|
+
"required": true,
|
|
24
|
+
"description": "Attachment ID inside that event. Returned by `list-calendar-event-attachments`."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "include-metadata",
|
|
28
|
+
"key": "includeMetadata",
|
|
29
|
+
"required": false,
|
|
30
|
+
"description": "Pass `--include-metadata true` to surface side-channel content for docx, xlsx, pptx, and OpenDocument attachments. docx → `## DOCX metadata`; xlsx → `## Workbook metadata`; pptx → `## PPTX metadata` (standalone, since pptx has no convertible body); odt/ods/odp → `## OpenDocument metadata`, appended after the converted body. No-op on other attachment types and on itemAttachment renderers.",
|
|
31
|
+
"argumentHint": {
|
|
32
|
+
"kind": "magicValue",
|
|
33
|
+
"values": [
|
|
34
|
+
"true",
|
|
35
|
+
"false"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"example": "ask-marcel convert-calendar-event-attachment-to-markdown --event-id 'AAMkAD...' --attachment-id 'AAMkAD...attach1'",
|
|
41
|
+
"responseShape": "`{ contentType: \"text/markdown\", size, text }` on success (file/reference attachments converted via Graph + turndown; itemAttachment rendered locally). Plain-text source extensions return the raw-bytes envelope; unsupported types return an api_error with status 400.",
|
|
42
|
+
"producesBytes": true
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "convert-calendar-event-attachment-to-pdf",
|
|
46
|
+
"summary": "Convert an attachment on an Outlook calendar event to PDF on the fly (shares the mail-attachment pipeline). fileAttachment uploads the bytes to a temp folder under /me/drive, runs Graph `?format=pdf`, then deletes the temp item; referenceAttachment resolves via /shares/{token}/driveItem and converts in place; plain-text and `pdf` sources short-circuit to a raw-bytes envelope (Graph’s `?format=pdf` does not accept `pdf` as an input). image attachments are rejected (Graph rejects image inputs); itemAttachment (embedded mail/event/contact) is unsupported — use convert-calendar-event-attachment-to-markdown. Best for the deck attached to a meeting, where PDF preserves slide layout for a vision-capable LLM.",
|
|
47
|
+
"category": "calendar",
|
|
48
|
+
"graphMethod": "GET",
|
|
49
|
+
"graphPathTemplate": "/me/events/{event-id}/attachments/{attachment-id}",
|
|
50
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/attachment-get",
|
|
51
|
+
"options": [
|
|
52
|
+
{
|
|
53
|
+
"name": "event-id",
|
|
54
|
+
"key": "eventId",
|
|
55
|
+
"required": true,
|
|
56
|
+
"description": "Outlook calendar event ID. Returned by `list-calendar-events` or `get-calendar-event`."
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "attachment-id",
|
|
60
|
+
"key": "attachmentId",
|
|
61
|
+
"required": true,
|
|
62
|
+
"description": "Attachment ID inside that event. Returned by `list-calendar-event-attachments`."
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
"example": "ask-marcel convert-calendar-event-attachment-to-pdf --event-id 'AAMkAD...' --attachment-id 'AAMkAD...attach1' --output-path ./deck.pdf",
|
|
66
|
+
"responseShape": "`{ contentType: \"application/pdf\", size, base64 }` — the PDF bytes, inlined. Plain-text and pdf sources short-circuit to `{ contentType, size, base64, note }`; image attachments return api_error 415; itemAttachment returns api_error 400. Pair with the global `--output-path` to land the bytes on disk and replace `base64` with `savedTo`.",
|
|
67
|
+
"producesBytes": true
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "convert-drive-item-zip",
|
|
71
|
+
"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`.",
|
|
72
|
+
"category": "drive",
|
|
73
|
+
"graphMethod": "GET",
|
|
74
|
+
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/content",
|
|
75
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/driveitem-get-content",
|
|
76
|
+
"options": [
|
|
77
|
+
{
|
|
78
|
+
"name": "drive-id",
|
|
79
|
+
"key": "driveId",
|
|
80
|
+
"required": true,
|
|
81
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"name": "item-id",
|
|
85
|
+
"key": "itemId",
|
|
86
|
+
"required": true,
|
|
87
|
+
"description": "driveItem ID of the .zip file. Returned by `list-folder-files` or `search-onedrive-files`."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "include-metadata",
|
|
91
|
+
"key": "includeMetadata",
|
|
92
|
+
"required": false,
|
|
93
|
+
"description": "Pass `--include-metadata true` to append each converted Office file’s side-channel metadata block (`## DOCX metadata` / `## Workbook metadata` / `## PPTX metadata` / `## OpenDocument metadata`, etc.) after its body.",
|
|
94
|
+
"argumentHint": {
|
|
95
|
+
"kind": "magicValue",
|
|
96
|
+
"values": [
|
|
97
|
+
"true",
|
|
98
|
+
"false"
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
],
|
|
103
|
+
"example": "ask-marcel convert-drive-item-zip --drive-id 'b!1234' --item-id '01ABC'",
|
|
104
|
+
"responseShape": "`{ count, files: [{ path, contentType, size, text }] }` — one entry per file in the archive (sorted by path). Convertible files carry `{ contentType, size, text }` (the markdown); unsupported / failed entries carry `{ path, note }` instead. When the archive has more than 100 entries the response adds `truncated: true` + `totalEntries` and only the first 100 are converted."
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"name": "convert-local-file",
|
|
108
|
+
"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, 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.",
|
|
109
|
+
"category": "meta",
|
|
110
|
+
"graphMethod": "GET",
|
|
111
|
+
"graphPathTemplate": "(local) reads {path} from the local filesystem; not a Graph endpoint",
|
|
112
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/",
|
|
113
|
+
"options": [
|
|
114
|
+
{
|
|
115
|
+
"name": "path",
|
|
116
|
+
"key": "path",
|
|
117
|
+
"required": true,
|
|
118
|
+
"description": "Filesystem path of the file to convert (absolute, or relative to the current working directory). E.g. `./report.docx`, `/tmp/handover.zip`."
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"name": "include-metadata",
|
|
122
|
+
"key": "includeMetadata",
|
|
123
|
+
"required": false,
|
|
124
|
+
"description": "Pass `--include-metadata true` to append the converted Office file’s side-channel metadata block (`## DOCX metadata` / `## Workbook metadata` / `## PPTX metadata` / `## OpenDocument metadata`, etc.) after its body. Applies inside a `.zip` too.",
|
|
125
|
+
"argumentHint": {
|
|
126
|
+
"kind": "magicValue",
|
|
127
|
+
"values": [
|
|
128
|
+
"true",
|
|
129
|
+
"false"
|
|
130
|
+
]
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"name": "inline-images",
|
|
135
|
+
"key": "inlineImages",
|
|
136
|
+
"required": false,
|
|
137
|
+
"description": "Pass `--inline-images true` to embed a docx's images as base64 `data:` URIs. Default `false` — each image becomes an `[image: <alt>]` placeholder. No-op on non-docx sources.",
|
|
138
|
+
"argumentHint": {
|
|
139
|
+
"kind": "magicValue",
|
|
140
|
+
"values": [
|
|
141
|
+
"true",
|
|
142
|
+
"false"
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"name": "max-cells",
|
|
148
|
+
"key": "maxCells",
|
|
149
|
+
"required": false,
|
|
150
|
+
"description": "Per-sheet cell cap (positive integer; default 50 000) for xlsx/csv sources. A sheet whose used range exceeds the cap renders as a truncation hint instead of a multi-hundred-MB table. No-op on other sources."
|
|
151
|
+
}
|
|
152
|
+
],
|
|
153
|
+
"example": "ask-marcel convert-local-file --path ./report.docx",
|
|
154
|
+
"responseShape": "`{ contentType: \"text/markdown\" | \"text/plain\", size, text }` for a single file; `{ count, files: [{ path, contentType, size, text } | { path, note }] }` for a `.zip` (one entry per contained file, unsupported entries noted). A missing file returns api_error 404 with the path. Pair with the global `--output-path` to land the markdown on disk.",
|
|
155
|
+
"producesBytes": true
|
|
156
|
+
},
|
|
6
157
|
{
|
|
7
158
|
"name": "convert-mail-attachment-to-markdown",
|
|
8
|
-
"summary": "Convert an Outlook mail attachment to markdown. Polymorphic on the attachment’s `@odata.type`: fileAttachment decodes the inline bytes and runs them through the local conversion pipeline (docx via mammoth, xlsx via sheetjs, csv as markdown table, plus plain-text passthrough); referenceAttachment resolves via /shares/{token}/driveItem and routes through the same dispatcher; itemAttachment (embedded mail / event / contact) is rendered locally via dedicated renderers. For pptx
|
|
159
|
+
"summary": "Convert an Outlook mail attachment to markdown. Polymorphic on the attachment’s `@odata.type`: fileAttachment decodes the inline bytes and runs them through the local conversion pipeline (docx via mammoth, xlsx via sheetjs, csv as markdown table, odt/ods/odp via content.xml, pptx as per-slide text (titles + bullets + speaker notes inline), pdf via text-layer extraction (unpdf → text/plain), legacy .xls via sheetjs and legacy .doc via word-extractor (text only), an Outlook .msg attachment rendered to markdown — headers + body with its own attachments converted recursively — plus plain-text passthrough); referenceAttachment resolves via /shares/{token}/driveItem and routes through the same dispatcher; itemAttachment (embedded mail / event / contact) is rendered locally via dedicated renderers. For pptx layout / images, `convert-mail-attachment-to-pdf` + a vision model reads the rendered deck better. A scanned / image-only PDF (no text layer), legacy .ppt, and rtf/etc. point to the PDF sibling. Loop/Fluid/Whiteboard reference-attachments use Graph `?format=html` (the four inputs Microsoft documents).",
|
|
9
160
|
"category": "mail",
|
|
10
161
|
"graphMethod": "GET",
|
|
11
162
|
"graphPathTemplate": "/me/messages/{message-id}/attachments/{attachment-id}",
|
|
@@ -22,10 +173,24 @@
|
|
|
22
173
|
"key": "attachmentId",
|
|
23
174
|
"required": true,
|
|
24
175
|
"description": "Attachment ID inside that message. Returned by `list-mail-attachments`."
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"name": "include-metadata",
|
|
179
|
+
"key": "includeMetadata",
|
|
180
|
+
"required": false,
|
|
181
|
+
"description": "Pass `--include-metadata true` to surface side-channel content for docx, xlsx, pptx, and OpenDocument attachments (file + reference). docx → `## DOCX metadata` (properties, people, hyperlinks, comments, tracked changes, hidden text, fields, bookmarks); xlsx → `## Workbook metadata` (properties, external relationships, defined names, hidden / very-hidden sheets, cell + threaded comments, persons); pptx → `## PPTX metadata` (properties, external relationships, slide tags, comment authors + comments, per-slide title / speaker notes / hidden flag) as a standalone document, since pptx has no convertible body; odt/ods/odp → `## OpenDocument metadata` (Dublin Core + ODF properties, keywords, user-defined fields), appended after the converted body. Each OOXML family also covers its macro-enabled and template variants, with a `### Macros (VBA)` section flagging an embedded `vbaProject.bin`. No-op on other attachment types and on itemAttachment renderers.",
|
|
182
|
+
"argumentHint": {
|
|
183
|
+
"kind": "magicValue",
|
|
184
|
+
"values": [
|
|
185
|
+
"true",
|
|
186
|
+
"false"
|
|
187
|
+
]
|
|
188
|
+
}
|
|
25
189
|
}
|
|
26
190
|
],
|
|
27
191
|
"example": "ask-marcel convert-mail-attachment-to-markdown --message-id 'AAMkAD...' --attachment-id 'AAMkAD...attach1'",
|
|
28
|
-
"responseShape": "`{ contentType: \"text/markdown\", size, text }` on success (file/reference attachments converted via Graph + turndown; itemAttachment rendered locally). Plain-text source extensions return the raw-bytes envelope; unsupported types return an api_error with status 400."
|
|
192
|
+
"responseShape": "`{ contentType: \"text/markdown\", size, text }` on success (file/reference attachments converted via Graph + turndown; itemAttachment rendered locally). Plain-text source extensions return the raw-bytes envelope; unsupported types return an api_error with status 400.",
|
|
193
|
+
"producesBytes": true
|
|
29
194
|
},
|
|
30
195
|
{
|
|
31
196
|
"name": "convert-mail-attachment-to-pdf",
|
|
@@ -49,11 +214,49 @@
|
|
|
49
214
|
}
|
|
50
215
|
],
|
|
51
216
|
"example": "ask-marcel convert-mail-attachment-to-pdf --message-id 'AAMkAD...' --attachment-id 'AAMkAD...attach1'",
|
|
52
|
-
"responseShape": "`{ contentType: \"application/pdf\", size, base64 }` — the PDF bytes, inlined. The CLI follows the SharePoint media-transform redirect internally so the LLM never has to fetch an external URL. Plain-text source extensions and pdf sources short-circuit to `{ contentType, size, base64, note }` with their native bytes; itemAttachment returns api_error 400. Pair with the global `--output-path` to land the bytes on disk and replace `base64` with `savedTo` for multi-MB PDFs."
|
|
217
|
+
"responseShape": "`{ contentType: \"application/pdf\", size, base64 }` — the PDF bytes, inlined. The CLI follows the SharePoint media-transform redirect internally so the LLM never has to fetch an external URL. Plain-text source extensions and pdf sources short-circuit to `{ contentType, size, base64, note }` with their native bytes; itemAttachment returns api_error 400. Pair with the global `--output-path` to land the bytes on disk and replace `base64` with `savedTo` for multi-MB PDFs.",
|
|
218
|
+
"producesBytes": true
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"name": "convert-mail-attachment-zip",
|
|
222
|
+
"summary": "Unzip a `.zip` Outlook mail attachment and convert every contained file in one call — the mail-side mirror of `convert-drive-item-zip`, 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).",
|
|
223
|
+
"category": "mail",
|
|
224
|
+
"graphMethod": "GET",
|
|
225
|
+
"graphPathTemplate": "/me/messages/{message-id}/attachments/{attachment-id}",
|
|
226
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/attachment-get",
|
|
227
|
+
"options": [
|
|
228
|
+
{
|
|
229
|
+
"name": "message-id",
|
|
230
|
+
"key": "messageId",
|
|
231
|
+
"required": true,
|
|
232
|
+
"description": "Outlook message ID. Returned by `list-mail-messages` or `list-mail-folder-messages`."
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"name": "attachment-id",
|
|
236
|
+
"key": "attachmentId",
|
|
237
|
+
"required": true,
|
|
238
|
+
"description": "Attachment ID of the .zip fileAttachment. Returned by `list-mail-attachments`."
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"name": "include-metadata",
|
|
242
|
+
"key": "includeMetadata",
|
|
243
|
+
"required": false,
|
|
244
|
+
"description": "Pass `--include-metadata true` to append each converted Office file’s side-channel metadata block (`## DOCX metadata` / `## Workbook metadata` / `## PPTX metadata` / `## OpenDocument metadata`, etc.) after its body.",
|
|
245
|
+
"argumentHint": {
|
|
246
|
+
"kind": "magicValue",
|
|
247
|
+
"values": [
|
|
248
|
+
"true",
|
|
249
|
+
"false"
|
|
250
|
+
]
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
],
|
|
254
|
+
"example": "ask-marcel convert-mail-attachment-zip --message-id 'AAMkAD...' --attachment-id 'AAMkAD...attach1'",
|
|
255
|
+
"responseShape": "`{ count, files: [{ path, contentType, size, text }] }` — one entry per file in the archive (sorted by path; non-mojibake names). Convertible files carry `{ contentType, size, text }` (the markdown); unsupported / failed entries carry `{ path, note }`. When the archive has more than 100 entries the response adds `truncated: true` + `totalEntries` and only the first 100 are converted. A non-fileAttachment (itemAttachment / referenceAttachment) or a non-zip payload returns an api_error."
|
|
53
256
|
},
|
|
54
257
|
{
|
|
55
258
|
"name": "convert-mail-to-markdown",
|
|
56
|
-
"summary": "Render a single Outlook email as markdown — headers (`**Subject:**`, `**From:**`, `**To:**`, `**Cc:**` only when present, `**Date:**`), followed by the body run through turndown.
|
|
259
|
+
"summary": "Render a single Outlook email as markdown — headers (`**Subject:**`, `**From:**`, `**To:**`, `**Cc:**` only when present, `**Date:**`), followed by the body run through turndown. By default, inline images (`isInline:true` + `image/*` content-type, size ≤ 2 MB) are embedded as base64 `data:` URIs so the output is self-contained (non-image inline attachments are NOT embedded; oversize inline images are replaced with a placeholder note). For LLM callers that only want the text body, pass `--inline-images false` to skip the per-image bytes fetch entirely — the body keeps raw `cid:<contentId>` references and the inline images surface in the file-attachments list so you can decide whether to fetch them separately via `get-mail-attachment`. File attachments are always listed below the body by name + size + id; their bytes are NOT fetched here — call `convert-mail-attachment-to-pdf` or `get-mail-attachment` with the id when you actually need them. Staged-fetch design (audit v1.0.0): one call for the body, one for the attachments-metadata list (only if `hasAttachments:true`), and one per small inline image — replaces the old `?$expand=attachments` which timed out / truncated on messages with multi-MB attachments.",
|
|
57
260
|
"category": "mail",
|
|
58
261
|
"graphMethod": "GET",
|
|
59
262
|
"graphPathTemplate": "/me/messages/{message-id}",
|
|
@@ -63,15 +266,121 @@
|
|
|
63
266
|
"name": "message-id",
|
|
64
267
|
"key": "messageId",
|
|
65
268
|
"required": true,
|
|
66
|
-
"
|
|
269
|
+
"aliases": [
|
|
270
|
+
{
|
|
271
|
+
"name": "id",
|
|
272
|
+
"key": "id"
|
|
273
|
+
}
|
|
274
|
+
],
|
|
275
|
+
"description": "Outlook message ID. Returned by `list-mail-messages` or `list-mail-folder-messages`. Accepts `--id` as an alias."
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
"name": "inline-images",
|
|
279
|
+
"key": "inlineImages",
|
|
280
|
+
"required": false,
|
|
281
|
+
"description": "Pass `--inline-images false` to skip the per-image bytes fetch + base64 embedding. Default is `true` (embed). Disabling cuts the response size dramatically on emails with several inline images (a 6 KB body with 6 inline images shipped at ~36 KB by default; with `--inline-images false` it stays close to 6 KB). The body keeps raw `cid:<contentId>` references and the inline images surface in the file-attachments list instead, so the LLM caller can still see what is there and fetch any specific image via `get-mail-attachment` on demand."
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"name": "keep-quoted",
|
|
285
|
+
"key": "keepQuoted",
|
|
286
|
+
"required": false,
|
|
287
|
+
"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` and Gmail `gmail_quote`; in plain-text bodies the `Original Message` banner, the `On … wrote:` attribution line, and leading `>` quote lines.",
|
|
288
|
+
"argumentHint": {
|
|
289
|
+
"kind": "magicValue",
|
|
290
|
+
"values": [
|
|
291
|
+
"true",
|
|
292
|
+
"false"
|
|
293
|
+
]
|
|
294
|
+
}
|
|
67
295
|
}
|
|
68
296
|
],
|
|
69
297
|
"example": "ask-marcel convert-mail-to-markdown --message-id 'AAMkAD...'",
|
|
70
|
-
"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."
|
|
298
|
+
"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 (use `--keep-quoted true` to include it).",
|
|
299
|
+
"producesBytes": true
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"name": "create-mail-draft",
|
|
303
|
+
"summary": "Create a new mail draft. POST /me/messages (or /me/mailFolders/{id}/messages when --mail-folder-id is set). The draft is saved in the Drafts folder (or the specified folder) and can be sent later via the Outlook client or Graph sendMail. Recipients are comma-separated email addresses. Returns the created message object with its id — use this id with update-mail-draft to modify the draft before sending.",
|
|
304
|
+
"category": "mail",
|
|
305
|
+
"graphMethod": "POST",
|
|
306
|
+
"graphPathTemplate": "/me/messages (or /me/mailFolders/{mail-folder-id}/messages)",
|
|
307
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/user-post-messages",
|
|
308
|
+
"options": [
|
|
309
|
+
{
|
|
310
|
+
"name": "subject",
|
|
311
|
+
"key": "subject",
|
|
312
|
+
"required": true,
|
|
313
|
+
"description": "Email subject line."
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"name": "body-content",
|
|
317
|
+
"key": "bodyContent",
|
|
318
|
+
"required": true,
|
|
319
|
+
"description": "Email body content. Plain text by default; pass --body-content-type HTML for rich text."
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"name": "body-content-type",
|
|
323
|
+
"key": "bodyContentType",
|
|
324
|
+
"required": false,
|
|
325
|
+
"description": "Body format: Text (default) or HTML.",
|
|
326
|
+
"argumentHint": {
|
|
327
|
+
"kind": "magicValue",
|
|
328
|
+
"values": [
|
|
329
|
+
"Text",
|
|
330
|
+
"HTML"
|
|
331
|
+
]
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
"name": "to-recipients",
|
|
336
|
+
"key": "toRecipients",
|
|
337
|
+
"required": true,
|
|
338
|
+
"description": "Comma-separated list of recipient email addresses (e.g. \"alice@example.com,bob@example.com\")."
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
"name": "cc-recipients",
|
|
342
|
+
"key": "ccRecipients",
|
|
343
|
+
"required": false,
|
|
344
|
+
"description": "Comma-separated list of CC recipient email addresses."
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"name": "bcc-recipients",
|
|
348
|
+
"key": "bccRecipients",
|
|
349
|
+
"required": false,
|
|
350
|
+
"description": "Comma-separated list of BCC recipient email addresses."
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"name": "importance",
|
|
354
|
+
"key": "importance",
|
|
355
|
+
"required": false,
|
|
356
|
+
"description": "Email importance: Low, Normal (default), or High.",
|
|
357
|
+
"argumentHint": {
|
|
358
|
+
"kind": "magicValue",
|
|
359
|
+
"values": [
|
|
360
|
+
"Low",
|
|
361
|
+
"Normal",
|
|
362
|
+
"High"
|
|
363
|
+
]
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
"name": "mail-folder-id",
|
|
368
|
+
"key": "mailFolderId",
|
|
369
|
+
"required": false,
|
|
370
|
+
"description": "Target folder ID to create the draft in. Defaults to the Drafts folder. Source from list-mail-folders.",
|
|
371
|
+
"argumentHint": {
|
|
372
|
+
"kind": "idOrName"
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
],
|
|
376
|
+
"example": "ask-marcel create-mail-draft --subject \"Q3 Report\" --body-content \"Please review the attached report.\" --to-recipients \"alice@example.com,bob@example.com\" --importance High",
|
|
377
|
+
"responseShape": "The created Microsoft Graph message object: `{ id, subject, body, from, toRecipients, ccRecipients, bccRecipients, receivedDateTime, isDraft, … }`. The `id` field is the draft message ID — use it with `update-mail-draft` to modify before sending.",
|
|
378
|
+
"bodyTemplate": "{ subject: '{subject}', body: { contentType: '{body-content-type}', content: '{body-content}' }, toRecipients: '{to-recipients}', ccRecipients: '{cc-recipients}', bccRecipients: '{bcc-recipients}', importance: '{importance}' }",
|
|
379
|
+
"mutates": true
|
|
71
380
|
},
|
|
72
381
|
{
|
|
73
382
|
"name": "download-drive-item-as-markdown",
|
|
74
|
-
"summary": "Download a OneDrive / SharePoint file converted to markdown via local conversion pipelines. Supported: docx (mammoth → turndown
|
|
383
|
+
"summary": "Download a OneDrive / SharePoint file converted to markdown via local conversion pipelines. Supported: docx (mammoth → turndown; embedded images are replaced with `[image]` placeholders by default — pass `--inline-images true` to embed them as base64 `data:` URIs, or pull the full-resolution originals with `extract-drive-item-images`; tables become GFM pipe tables), xlsx (one markdown table per sheet via sheetjs; any sheet whose used range exceeds the `--max-cells` cap, default 50 000, is summarised with a band-by-band read hint instead of a multi-hundred-MB table), csv (rendered as a markdown table), odt/ods/odp (OpenDocument body walked from content.xml — headings, lists, tables, named sheets, per-slide text, including style-hidden content), plus plain-text passthrough (txt/md/html/json/yaml/log/xml/etc.) — the bytes are followed through any CDN redirect and returned inline as `{ contentType: \"text/plain\", size, text }` so the LLM never needs a separate fetch step. Loop/Fluid/Whiteboard files use Graph `?format=html` (the four inputs Microsoft documents — https://learn.microsoft.com/en-us/graph/api/driveitem-get-content-format). pptx is flattened to per-slide text (titles, bullets, text-box / table text, with speaker notes inline) as `## Slide N` sections — document order, not guaranteed visual order; for layout / images / charts, `download-drive-item-as-pdf` + a vision-capable LLM reads the rendered deck better. pdf has its text layer extracted locally (via unpdf) and returned as `{ contentType: \"text/plain\", size, text }`; a scanned / image-only PDF with no text layer points you at `download-drive-item-as-pdf` + a vision model. Legacy OLE Office: .xls (Excel 97-2003) is read by sheetjs (same markdown-table path as .xlsx); .doc (Word 97-2003) is extracted by word-extractor as plain text (body only, no structure); .ppt (PowerPoint 97-2003) has no pure-JS path — use `download-drive-item-as-pdf` first, then a vision model. Outlook .msg (a saved email, also an OLE container) is rendered to markdown — an H1 subject, a From/To/Cc/Date header block, the message body, then an `## Attachments` section where each attachment is converted recursively through this same pipeline (the same way a .zip is unpacked); inline / image attachments are listed with a note. For rtf/etc. use `download-drive-item-as-pdf` — Graph `?format=pdf` accepts 38 input extensions.",
|
|
75
384
|
"category": "drive",
|
|
76
385
|
"graphMethod": "GET",
|
|
77
386
|
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/content?format=html",
|
|
@@ -88,14 +397,47 @@
|
|
|
88
397
|
"key": "itemId",
|
|
89
398
|
"required": true,
|
|
90
399
|
"description": "driveItem ID of the file to convert. Returned by `list-folder-files` or `search-onedrive-files`."
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
"name": "include-metadata",
|
|
403
|
+
"key": "includeMetadata",
|
|
404
|
+
"required": false,
|
|
405
|
+
"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 (insertions + deletions), 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.",
|
|
406
|
+
"argumentHint": {
|
|
407
|
+
"kind": "magicValue",
|
|
408
|
+
"values": [
|
|
409
|
+
"true",
|
|
410
|
+
"false"
|
|
411
|
+
]
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
"name": "inline-images",
|
|
416
|
+
"key": "inlineImages",
|
|
417
|
+
"required": false,
|
|
418
|
+
"description": "Pass `--inline-images true` to embed a docx's images as base64 `data:` URIs (self-contained markdown). Default is `false` — each image becomes an `[image: <alt>]` placeholder that keeps its position in the text without the base64 bloat (a single embedded photo can dwarf the prose). To get the actual pictures, run `extract-drive-item-images` on the same drive/item — it returns the full-resolution, un-cropped originals as files (via `--output-dir`). No-op on non-docx sources (xlsx/csv/odf have no inline images).",
|
|
419
|
+
"argumentHint": {
|
|
420
|
+
"kind": "magicValue",
|
|
421
|
+
"values": [
|
|
422
|
+
"true",
|
|
423
|
+
"false"
|
|
424
|
+
]
|
|
425
|
+
}
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
"name": "max-cells",
|
|
429
|
+
"key": "maxCells",
|
|
430
|
+
"required": false,
|
|
431
|
+
"description": "Per-sheet cell cap (positive integer; default 50 000) for xlsx sources. A worksheet whose used range (rows × cols) exceeds the cap is rendered as its `## SheetName` header plus a one-line hint pointing at `get-excel-used-range` / `get-excel-range` for band-by-band reads, instead of a full markdown table — a genuinely dense 49 MB workbook otherwise builds a multi-hundred-MB string and OOMs the process. Raise it to force a larger render. No-op on non-xlsx sources."
|
|
91
432
|
}
|
|
92
433
|
],
|
|
93
434
|
"example": "ask-marcel download-drive-item-as-markdown --drive-id 'b!1234' --item-id '01ABC'",
|
|
94
|
-
"responseShape": "`{ contentType: \"text/markdown\", size: <chars>, text: \"...\" }` for the locally-converted case (docx/xlsx/csv); `{ contentType: \"text/plain\", size, text }` for plain-text passthrough sources (txt/md/html/etc.) — bytes are inlined whether Graph returns them directly or via a CDN redirect that the CLI follows internally."
|
|
435
|
+
"responseShape": "`{ contentType: \"text/markdown\", size: <chars>, text: \"...\" }` for the locally-converted case (docx/xlsx/csv/.msg); `{ contentType: \"text/plain\", size, text }` for plain-text passthrough sources (txt/md/html/etc.) — bytes are inlined whether Graph returns them directly or via a CDN redirect that the CLI follows internally.",
|
|
436
|
+
"producesBytes": true
|
|
95
437
|
},
|
|
96
438
|
{
|
|
97
439
|
"name": "download-drive-item-as-pdf",
|
|
98
|
-
"summary": "Download a OneDrive / SharePoint file converted to PDF on the fly by Graph (`?format=pdf`). Source must be one of the Office formats Graph supports — doc, docx, ppt, pptx, xls, xlsx, rtf, csv, odp, ods, odt, etc. The command pre-fetches the filename and short-circuits to a raw download in two cases: plain-text source extensions (txt, md, html, json, …) where conversion is meaningless, and `pdf` sources where the source IS already a PDF (Graph’s `?format=pdf` does not list `pdf` in its supported input set — the CDN responds 406 InputFormatNotSupported on `pdf → pdf`). Worst-case wall-clock is two
|
|
440
|
+
"summary": "Download a OneDrive / SharePoint file converted to PDF on the fly by Graph (`?format=pdf`). Source must be one of the Office formats Graph supports — doc, docx, ppt, pptx, xls, xlsx, rtf, csv, odp, ods, odt, etc. The command pre-fetches the filename and short-circuits to a raw download in two cases: plain-text source extensions (txt, md, html, json, …) where conversion is meaningless, and `pdf` sources where the source IS already a PDF (Graph’s `?format=pdf` does not list `pdf` in its supported input set — the CDN responds 406 InputFormatNotSupported on `pdf → pdf`). Worst-case wall-clock is two back-to-back Graph round-trips; the `?format=pdf` transform can run up to the 5-minute request timeout on large or complex sources.",
|
|
99
441
|
"category": "drive",
|
|
100
442
|
"graphMethod": "GET",
|
|
101
443
|
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/content?format=pdf",
|
|
@@ -115,15 +457,19 @@
|
|
|
115
457
|
}
|
|
116
458
|
],
|
|
117
459
|
"example": "ask-marcel download-drive-item-as-pdf --drive-id 'b!1234' --item-id '01ABC'",
|
|
118
|
-
"responseShape": "`{ contentType: \"application/pdf\", size, base64 }` — the PDF bytes, inlined. The CLI follows the SharePoint media-transform redirect internally so the LLM never has to fetch an external URL. Plain-text and pdf sources skip the format=pdf round-trip and return the raw file bytes under the same envelope shape (with their native contentType) plus `passthrough: true` and a `note` explaining why conversion was skipped — the LLM can branch on the flag if it cares whether Graph actually converted. Pair with the global `--output-path` to land the bytes on disk and replace `base64` with `savedTo` for multi-MB PDFs."
|
|
460
|
+
"responseShape": "`{ contentType: \"application/pdf\", size, base64 }` — the PDF bytes, inlined. The CLI follows the SharePoint media-transform redirect internally so the LLM never has to fetch an external URL. Plain-text and pdf sources skip the format=pdf round-trip and return the raw file bytes under the same envelope shape (with their native contentType) plus `passthrough: true` and a `note` explaining why conversion was skipped — the LLM can branch on the flag if it cares whether Graph actually converted. Pair with the global `--output-path` to land the bytes on disk and replace `base64` with `savedTo` for multi-MB PDFs.",
|
|
461
|
+
"producesBytes": true
|
|
119
462
|
},
|
|
120
463
|
{
|
|
121
|
-
"name": "download-drive-item-
|
|
122
|
-
"summary": "Download
|
|
464
|
+
"name": "download-drive-item-content",
|
|
465
|
+
"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.",
|
|
123
466
|
"category": "drive",
|
|
467
|
+
"commandAliases": [
|
|
468
|
+
"download-onedrive-file-content"
|
|
469
|
+
],
|
|
124
470
|
"graphMethod": "GET",
|
|
125
|
-
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/
|
|
126
|
-
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/
|
|
471
|
+
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/content",
|
|
472
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/driveitem-get-content",
|
|
127
473
|
"options": [
|
|
128
474
|
{
|
|
129
475
|
"name": "drive-id",
|
|
@@ -135,24 +481,19 @@
|
|
|
135
481
|
"name": "item-id",
|
|
136
482
|
"key": "itemId",
|
|
137
483
|
"required": true,
|
|
138
|
-
"description": "driveItem ID of the file. Returned by `list-folder-files` or `search-onedrive-files`."
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
"name": "version-id",
|
|
142
|
-
"key": "versionId",
|
|
143
|
-
"required": true,
|
|
144
|
-
"description": "driveItemVersion ID. Returned by `ask-marcel list-drive-item-versions`. Pick a non-current version (the first entry is the live file and Graph rejects this endpoint for it)."
|
|
484
|
+
"description": "driveItem ID of the file to download. Returned by `ask-marcel list-folder-files` (works on SharePoint library drives too) or `search-onedrive-files`."
|
|
145
485
|
}
|
|
146
486
|
],
|
|
147
|
-
"example": "ask-marcel download-drive-item-
|
|
148
|
-
"responseShape": "`{ contentType: \"text/
|
|
487
|
+
"example": "ask-marcel download-drive-item-content --drive-id 'b!1234' --item-id '01ABC'",
|
|
488
|
+
"responseShape": "`{ contentType: \"text/plain\", size, text }` when the bytes decode as valid UTF-8; `{ contentType, size, base64 }` otherwise (binary, or non-UTF-8-encoded text). Pair with the global `--output-path <path>` flag to land the bytes on disk and replace the inline field with `savedTo` for multi-MB files.",
|
|
489
|
+
"producesBytes": true
|
|
149
490
|
},
|
|
150
491
|
{
|
|
151
|
-
"name": "download-drive-item-version
|
|
152
|
-
"summary": "
|
|
492
|
+
"name": "download-drive-item-version",
|
|
493
|
+
"summary": "Download a *non-current* historical version of a OneDrive / SharePoint file. `--format original` (default) returns the raw bytes — Graph refuses to serve the current version through this endpoint with \"You cannot get the content of the current version\"; for the current version use `download-drive-item-content`. `--format pdf` runs Graph `?format=pdf` for Office docs; plain-text and `pdf` sources short-circuit to raw bytes with `passthrough: true` + a note (Graph rejects `pdf → pdf` with InputFormatNotSupported). `--format markdown` runs the local conversion pipeline (mammoth for docx, sheetjs for xlsx, csv → table, odt/ods/odp via content.xml, plain-text passthrough). All three formats use an M365ChatClient-elevated Graph token (captured at login from m365.cloud.microsoft) — the Teams web client token returns 403 logicalPermissionAccessDenied on historical-version stream content. The CLI follows the SharePoint streamContent redirect internally so the LLM never has to fetch an external URL. Audit v1.0.0 §D4 caveat for `--format pdf`: Graph sometimes silently falls back to raw source bytes for the current version (which Graph occasionally serves through this endpoint) — when the response carries `passthrough: true`, save with the source extension, not `.pdf` (the global output-path flag refuses the mismatch).",
|
|
153
494
|
"category": "drive",
|
|
154
495
|
"graphMethod": "GET",
|
|
155
|
-
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/versions/{version-id}/content
|
|
496
|
+
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/versions/{version-id}/content",
|
|
156
497
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/driveitemversion-get-content",
|
|
157
498
|
"options": [
|
|
158
499
|
{
|
|
@@ -171,19 +512,48 @@
|
|
|
171
512
|
"name": "version-id",
|
|
172
513
|
"key": "versionId",
|
|
173
514
|
"required": true,
|
|
174
|
-
"description": "driveItemVersion ID. Returned by `ask-marcel list-drive-item-versions`. Pick a non-current version — the first entry (e.g. `12.0`) is the live file and Graph rejects this endpoint for it; use `value[1]` or older."
|
|
515
|
+
"description": "driveItemVersion ID. Returned by `ask-marcel list-drive-item-versions`. Use the `id` field of an entry under `value[]`. Pick a non-current version — the first entry (e.g. `12.0`) is the live file and Graph rejects this endpoint for it; use `value[1]` or older."
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
"name": "format",
|
|
519
|
+
"key": "format",
|
|
520
|
+
"required": false,
|
|
521
|
+
"description": "Output format. `original` (default) returns the raw historical-version bytes. `pdf` runs Graph `?format=pdf` for Office sources (docx/pptx/xlsx) — plain-text and pdf sources short-circuit to raw bytes with `passthrough: true`. `markdown` runs the local conversion pipeline (mammoth/sheetjs/csv/odf/plain-text). All formats inline the bytes; pair with the global `--output-path` to land them on disk.",
|
|
522
|
+
"argumentHint": {
|
|
523
|
+
"kind": "magicValue",
|
|
524
|
+
"values": [
|
|
525
|
+
"original",
|
|
526
|
+
"pdf",
|
|
527
|
+
"markdown"
|
|
528
|
+
]
|
|
529
|
+
}
|
|
530
|
+
},
|
|
531
|
+
{
|
|
532
|
+
"name": "include-metadata",
|
|
533
|
+
"key": "includeMetadata",
|
|
534
|
+
"required": false,
|
|
535
|
+
"description": "Pass `--include-metadata true` to surface side-channel content (only meaningful with `--format markdown` AND a docx / xlsx / pptx / odt / ods / odp source — silently ignored otherwise). docx → `## DOCX metadata` (properties, people, hyperlinks, comments, tracked changes, hidden text, fields, bookmarks); xlsx → `## Workbook metadata` (properties, external relationships, defined names, hidden / very-hidden sheets, cell + threaded comments, persons); pptx → `## PPTX metadata` (properties, external relationships, slide tags, comment authors + comments, per-slide title / speaker notes / hidden flag); odt/ods/odp → `## OpenDocument metadata` (Dublin Core + ODF properties, keywords, user-defined fields). Each OOXML family covers its macro-enabled and template variants too, with a `### Macros (VBA)` section flagging an embedded `vbaProject.bin`.",
|
|
536
|
+
"argumentHint": {
|
|
537
|
+
"kind": "magicValue",
|
|
538
|
+
"values": [
|
|
539
|
+
"true",
|
|
540
|
+
"false"
|
|
541
|
+
]
|
|
542
|
+
}
|
|
175
543
|
}
|
|
176
544
|
],
|
|
177
|
-
"example": "ask-marcel download-drive-item-version
|
|
178
|
-
"responseShape": "`{ contentType
|
|
545
|
+
"example": "ask-marcel download-drive-item-version --drive-id 'b!1234' --item-id '01ABC' --version-id '4.0' --format pdf",
|
|
546
|
+
"responseShape": "`--format original` & `--format pdf`: `{ contentType, size, base64 }` — the bytes, inlined. `--format pdf` adds `passthrough: true` + `note` when Graph short-circuits (plain-text or pdf source) OR silently falls back to raw source bytes — in that case save with the source extension, NOT `.pdf` (the global output-path flag refuses the mismatch). `--format markdown`: `{ contentType: \"text/markdown\", size: <chars>, text: \"...\" }` for the converted case; raw-bytes envelope for plain-text source extensions. Pair with the global `--output-path` to land bytes on disk and replace `base64`/`text` with `savedTo` for multi-MB versions.",
|
|
547
|
+
"producesBytes": true,
|
|
548
|
+
"needsElevatedToken": true
|
|
179
549
|
},
|
|
180
550
|
{
|
|
181
|
-
"name": "
|
|
182
|
-
"summary": "
|
|
551
|
+
"name": "extract-drive-item-images",
|
|
552
|
+
"summary": "Extract the embedded images from a OneDrive / SharePoint document. For docx / xlsx / pptx (and their macro-enabled / template variants) it reads the OOXML media parts directly (png/jpg/gif/bmp/tiff/webp/svg) — including original full-resolution / un-cropped originals and images on hidden slides the rendered view never shows. For a pdf it walks every page via unpdf and re-encodes each painted image as PNG (note: page-oriented — it captures images as painted on each page, but NOT layer-hidden/unpainted XObjects or the full uncropped original behind a clipped image). Pair with the global output-dir flag to write every image to a folder; otherwise the bytes ride back base64-encoded in the response. svg rides back as its XML source (which carries the diagram text labels); legacy vector (emf/wmf) and audio/video are skipped. For any other format the command returns a 415 pointing at `download-drive-item-content`.",
|
|
183
553
|
"category": "drive",
|
|
184
554
|
"graphMethod": "GET",
|
|
185
|
-
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/
|
|
186
|
-
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/
|
|
555
|
+
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/content",
|
|
556
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/driveitem-get-content",
|
|
187
557
|
"options": [
|
|
188
558
|
{
|
|
189
559
|
"name": "drive-id",
|
|
@@ -195,21 +565,60 @@
|
|
|
195
565
|
"name": "item-id",
|
|
196
566
|
"key": "itemId",
|
|
197
567
|
"required": true,
|
|
198
|
-
"description": "driveItem ID of the file. Returned by `list-folder-files` or `search-onedrive-files`."
|
|
568
|
+
"description": "driveItem ID of the pdf / docx / xlsx / pptx file. Returned by `list-folder-files` or `search-onedrive-files`."
|
|
569
|
+
}
|
|
570
|
+
],
|
|
571
|
+
"example": "ask-marcel extract-drive-item-images --drive-id 'b!1234' --item-id '01ABC' --output-dir ./deck-images",
|
|
572
|
+
"responseShape": "`{ count, media: [{ path, contentType, sizeBytes, base64 }] }`. `path` is the source part path — `ppt/media/image3.png` for OOXML, `pdf/page2/<key>.png` for PDF (every PDF image is re-encoded as PNG). Pair with the global `--output-dir <dir>` to write each image to that folder — the response then replaces each `base64` with `savedTo: <dir>/<filename>` (the part path is flattened, e.g. `pdf_page2_Im0.png`). `count: 0` with an empty `media` array means the document embeds no extractable images (after the emf/wmf/audio/video filter).",
|
|
573
|
+
"producesMedia": true
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"name": "extract-local-file-images",
|
|
577
|
+
"summary": "Extract the embedded images from a file ON DISK — the local sibling of `extract-drive-item-images`, and like `convert-local-file` it never calls Microsoft Graph (works offline, no login). Same per-extension dispatch: docx / xlsx / pptx (and their macro-enabled / template variants) have their OOXML media parts read directly (png/jpg/gif/bmp/tiff/webp/svg — full-resolution originals, including images on hidden slides); a pdf is walked page by page via unpdf with each painted image re-encoded as PNG. Two flows only this command completes: a Graph-rendered PDF saved locally (legacy `.ppt` → `download-drive-item-as-pdf` with the global output-path flag → this command pulls the slide images for OCR), and Office files unpacked from a local archive. Pair with the global output-dir flag to write every image to a folder; otherwise the bytes ride back base64-encoded. Any other extension returns a 415 naming the local ways out.",
|
|
578
|
+
"category": "meta",
|
|
579
|
+
"graphMethod": "GET",
|
|
580
|
+
"graphPathTemplate": "(local) reads {path} from the local filesystem; not a Graph endpoint",
|
|
581
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/",
|
|
582
|
+
"options": [
|
|
583
|
+
{
|
|
584
|
+
"name": "path",
|
|
585
|
+
"key": "path",
|
|
586
|
+
"required": true,
|
|
587
|
+
"description": "Filesystem path of the pdf / docx / xlsx / pptx file to extract from (absolute, or relative to the current working directory). E.g. `/tmp/deck.pdf`, `./report.docx`."
|
|
588
|
+
}
|
|
589
|
+
],
|
|
590
|
+
"example": "ask-marcel extract-local-file-images --path /tmp/deck.pdf --output-dir ./deck-images",
|
|
591
|
+
"responseShape": "`{ count, media: [{ path, contentType, sizeBytes, base64 }] }`. `path` is the source part path — `ppt/media/image3.png` for OOXML, `pdf/page2/<key>.png` for PDF (every PDF image is re-encoded as PNG). Pair with the global `--output-dir <dir>` to write each image to that folder — the response then replaces each `base64` with `savedTo: <dir>/<filename>` (the part path is flattened, e.g. `pdf_page2_Im0.png`). `count: 0` with an empty `media` array means the document embeds no extractable images (after the emf/wmf/audio/video filter). A missing file returns api_error 404 with the path.",
|
|
592
|
+
"producesMedia": true
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
"name": "extract-mail-attachment-images",
|
|
596
|
+
"summary": "Extract the embedded images from an Outlook mail attachment that is a pdf or a docx / xlsx / pptx (and their macro-enabled / template variants). OOXML reads the media parts directly (png/jpg/gif/bmp/tiff/webp/svg), including full-resolution / un-cropped originals and images on hidden slides; pdf walks every page via unpdf and re-encodes each painted image as PNG (page-oriented — not layer-hidden/unpainted/uncropped originals). fileAttachment decodes the inline bytes; referenceAttachment resolves via /shares/{token}/driveItem and fetches the content. Pair with the global output-dir flag to write every image to a folder; otherwise the bytes ride back base64-encoded. svg rides back as its XML source (which carries the diagram text labels); legacy vector (emf/wmf) and audio/video are skipped. itemAttachment and unsupported formats return a 415.",
|
|
597
|
+
"category": "mail",
|
|
598
|
+
"graphMethod": "GET",
|
|
599
|
+
"graphPathTemplate": "/me/messages/{message-id}/attachments/{attachment-id}",
|
|
600
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/attachment-get",
|
|
601
|
+
"options": [
|
|
602
|
+
{
|
|
603
|
+
"name": "message-id",
|
|
604
|
+
"key": "messageId",
|
|
605
|
+
"required": true,
|
|
606
|
+
"description": "Outlook message ID. Returned by `list-mail-messages` or `list-mail-folder-messages`."
|
|
199
607
|
},
|
|
200
608
|
{
|
|
201
|
-
"name": "
|
|
202
|
-
"key": "
|
|
609
|
+
"name": "attachment-id",
|
|
610
|
+
"key": "attachmentId",
|
|
203
611
|
"required": true,
|
|
204
|
-
"description": "
|
|
612
|
+
"description": "Attachment ID inside that message. Returned by `list-mail-attachments`."
|
|
205
613
|
}
|
|
206
614
|
],
|
|
207
|
-
"example": "ask-marcel
|
|
208
|
-
"responseShape": "`{ contentType,
|
|
615
|
+
"example": "ask-marcel extract-mail-attachment-images --message-id 'AAMkAD...' --attachment-id 'AAMkAD...attach1' --output-dir ./att-images",
|
|
616
|
+
"responseShape": "`{ count, media: [{ path, contentType, sizeBytes, base64 }] }`. `path` is the in-package part path (e.g. `ppt/media/image3.png`). Pair with the global `--output-dir <dir>` to write each image to that folder — the response then replaces each `base64` with `savedTo` (the part path is flattened, e.g. `pdf_page2_Im0.png`). `count: 0` means the attachment embeds no extractable images (after the emf/wmf/audio/video filter).",
|
|
617
|
+
"producesMedia": true
|
|
209
618
|
},
|
|
210
619
|
{
|
|
211
|
-
"name": "
|
|
212
|
-
"summary": "
|
|
620
|
+
"name": "extract-sharepoint-links-in-documents",
|
|
621
|
+
"summary": "Find every `*.sharepoint.com` URL embedded in a Word / Excel / PowerPoint or OpenDocument file on OneDrive or SharePoint and resolve each one to its driveItem (driveId, itemId, name, webUrl) so the agent can feed those into `download-drive-item-as-pdf` / `-as-markdown` etc. The document sibling of `extract-sharepoint-links-in-mail`. For OOXML (.docx/.xlsx/.pptx) it reads external hyperlinks from the package’s relationship parts (`_rels/*.rels`, `TargetMode=\"External\"`); for OpenDocument (.odt/.ods/.odp) it reads the inline `xlink:href` links in content.xml / styles.xml — either way it catches links wherever they live (body text, headers/footers, cell formulas, slide shapes). Read-only — no conversion happens here. Capped at 25 unique URLs per call (returns `truncated: true` and `skippedCount` when there are more); duplicates are deduplicated; per-link errors are captured inside each entry instead of failing the whole call. Non-zip inputs (pdf/images) return an api_error.",
|
|
213
622
|
"category": "drive",
|
|
214
623
|
"graphMethod": "GET",
|
|
215
624
|
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/content",
|
|
@@ -219,17 +628,17 @@
|
|
|
219
628
|
"name": "drive-id",
|
|
220
629
|
"key": "driveId",
|
|
221
630
|
"required": true,
|
|
222
|
-
"description": "Microsoft Graph drive ID.
|
|
631
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
223
632
|
},
|
|
224
633
|
{
|
|
225
634
|
"name": "item-id",
|
|
226
635
|
"key": "itemId",
|
|
227
636
|
"required": true,
|
|
228
|
-
"description": "driveItem ID of the
|
|
637
|
+
"description": "driveItem ID of the .docx/.xlsx/.pptx or .odt/.ods/.odp file. Returned by `list-folder-files` or `search-onedrive-files`."
|
|
229
638
|
}
|
|
230
639
|
],
|
|
231
|
-
"example": "ask-marcel
|
|
232
|
-
"responseShape": "`{
|
|
640
|
+
"example": "ask-marcel extract-sharepoint-links-in-documents --drive-id 'b!1234' --item-id '01ABC'",
|
|
641
|
+
"responseShape": "`{ driveId, itemId, links: [{ url, driveId, itemId, name, webUrl } | { url, error }], truncated, skippedCount }` — one entry per unique SharePoint URL found in the document’s external relationships."
|
|
233
642
|
},
|
|
234
643
|
{
|
|
235
644
|
"name": "extract-sharepoint-links-in-mail",
|
|
@@ -243,12 +652,50 @@
|
|
|
243
652
|
"name": "message-id",
|
|
244
653
|
"key": "messageId",
|
|
245
654
|
"required": true,
|
|
246
|
-
"
|
|
655
|
+
"aliases": [
|
|
656
|
+
{
|
|
657
|
+
"name": "id",
|
|
658
|
+
"key": "id"
|
|
659
|
+
}
|
|
660
|
+
],
|
|
661
|
+
"description": "Outlook message ID. Returned by `list-mail-messages` or `list-mail-folder-messages`. Accepts `--id` as an alias."
|
|
247
662
|
}
|
|
248
663
|
],
|
|
249
664
|
"example": "ask-marcel extract-sharepoint-links-in-mail --message-id 'AAMkADk0...'",
|
|
250
665
|
"responseShape": "`{ messageId, subject, links: [{ url, driveId, itemId, name, webUrl } | { url, error }], truncated, skippedCount }` — one entry per unique SharePoint URL found in the body, ordered by first occurrence."
|
|
251
666
|
},
|
|
667
|
+
{
|
|
668
|
+
"name": "find-chats-with-user",
|
|
669
|
+
"summary": "Find every Microsoft Teams chat that includes a member matching `--name` (substring search across display-name, email, given-name, surname, MRI, and object-id). Both sides are Unicode-folded (NFD + combining-mark strip) and lowercased before comparison, so `--name Jane` matches `Jane DOE` AND `jane.doe@example.com` AND `JANE` — important because a dual-identity user often carries the accented display-name on one identity and the un-accented email on the other. Walks the paginated chat-list substrate up to `--max-pages` and returns matching chats with their `matchedMembers[]`. Collapses the canonical \"all conversations with person X\" workflow into a single call AND surfaces dual-identity people (e.g. someone with both an org MRI and a guest-tenant MRI). **Best-effort, may break on Microsoft client updates** — the chat substrate is not in the public Microsoft Graph API.",
|
|
670
|
+
"category": "chats",
|
|
671
|
+
"graphMethod": "GET",
|
|
672
|
+
"graphPathTemplate": "https://teams.microsoft.com/api/csa/{region}/api/v3/teams/users/me/chats",
|
|
673
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/chat-list",
|
|
674
|
+
"options": [
|
|
675
|
+
{
|
|
676
|
+
"name": "name",
|
|
677
|
+
"key": "name",
|
|
678
|
+
"required": true,
|
|
679
|
+
"description": "Substring to search across each chat member's `displayName`, `email`, `userPrincipalName`, `givenName`, `surname`, `mri`, `objectId`, and `jobTitle`. Both the query and each field are NFD-normalized + diacritics-stripped + lowercased before comparison, so `Jane` ↔ `Jane` ↔ `JANE` are equivalent and a query for the accented name still matches a member whose displayName is the un-accented email. Use the full name or an unambiguous fragment. Quoted multi-word values match on the joined substring, not per-token."
|
|
680
|
+
},
|
|
681
|
+
{
|
|
682
|
+
"name": "max-pages",
|
|
683
|
+
"key": "maxPages",
|
|
684
|
+
"required": false,
|
|
685
|
+
"description": "Safety cap on the chat-list walk (positive integer; default 10). Each page returns up to `--page-size` chats. Raise carefully on busy accounts — every page is one HTTP round-trip."
|
|
686
|
+
},
|
|
687
|
+
{
|
|
688
|
+
"name": "page-size",
|
|
689
|
+
"key": "pageSize",
|
|
690
|
+
"required": false,
|
|
691
|
+
"description": "Chats per page (positive integer; default 100, same value Teams web uses). Server may silently cap."
|
|
692
|
+
}
|
|
693
|
+
],
|
|
694
|
+
"example": "ask-marcel find-chats-with-user --name 'Jane DOE'",
|
|
695
|
+
"responseShape": "`{ name, matches: [{ chatId, title, chatType, threadType, memberCount, lastMessageAt?, matchedMembers: [{ mri, displayName, email, userSubType }] }], matchCount, pagesFetched, chatsScanned, hasMore, nextContinuationToken? }`. `matchedMembers` always carries the matching entries' identifying fields — pass `chatId` into `list-teams-chat-history` to read message bodies. `hasMore: true` means `--max-pages` was hit before exhausting the chat list; chain with the existing `--continuation-token` flag on `list-teams-chats-with-messages` if you need to scan further (this command does not advertise a `--continuation-token` because resuming a partial search is rare; users either widen `--max-pages` or refine `--name`).",
|
|
696
|
+
"needsSubstrateToken": true,
|
|
697
|
+
"stability": "experimental"
|
|
698
|
+
},
|
|
252
699
|
{
|
|
253
700
|
"name": "get-calendar-event",
|
|
254
701
|
"summary": "Fetch a single calendar event by ID from the signed-in user’s default calendar. Pass `--select` to project only the fields you need (the full event body can be large with HTML body and attendee lists).",
|
|
@@ -261,6 +708,12 @@
|
|
|
261
708
|
"name": "event-id",
|
|
262
709
|
"key": "eventId",
|
|
263
710
|
"required": true,
|
|
711
|
+
"aliases": [
|
|
712
|
+
{
|
|
713
|
+
"name": "id",
|
|
714
|
+
"key": "id"
|
|
715
|
+
}
|
|
716
|
+
],
|
|
264
717
|
"description": "Microsoft Graph event ID. Returned by `ask-marcel list-calendar-events` in the `id` field of each event."
|
|
265
718
|
},
|
|
266
719
|
{
|
|
@@ -281,7 +734,7 @@
|
|
|
281
734
|
},
|
|
282
735
|
{
|
|
283
736
|
"name": "get-channel-files-folder",
|
|
284
|
-
"summary": "Return the SharePoint folder that backs a Teams channel's Files tab. Returned `driveItem` includes `parentReference.driveId` and `id` so you can pivot into `list-folder-files`, `download-
|
|
737
|
+
"summary": "Return the SharePoint folder that backs a Teams channel's Files tab. Returned `driveItem` includes `parentReference.driveId` and `id` so you can pivot into `list-folder-files`, `download-drive-item-content`, etc., and treat the channel like any other OneDrive folder. Requires that the signed-in user is a member of the channel — restricted channels return `AccessDenied`.",
|
|
285
738
|
"category": "teams",
|
|
286
739
|
"graphMethod": "GET",
|
|
287
740
|
"graphPathTemplate": "/teams/{team-id}/channels/{channel-id}/filesFolder",
|
|
@@ -317,7 +770,7 @@
|
|
|
317
770
|
},
|
|
318
771
|
{
|
|
319
772
|
"name": "get-chat",
|
|
320
|
-
"summary": "Return metadata for a single Microsoft Teams chat (1:1, group, or meeting).
|
|
773
|
+
"summary": "Return metadata for a single Microsoft Teams chat (1:1, group, or meeting). The CLI ships a slim default `--select=id,topic,chatType,createdDateTime,lastUpdatedDateTime`; pass `--select id,topic,webUrl,onlineMeetingInfo` (or any other comma-separated field list) to widen. Pass `--expand members` to inline membership. Returns metadata only — not the messages (which need `Chat.Read*`). Requires the M365ChatClient elevated token captured at login (the basic Teams web client token lacks `Chat.ReadBasic`).",
|
|
321
774
|
"category": "chats",
|
|
322
775
|
"graphMethod": "GET",
|
|
323
776
|
"graphPathTemplate": "/chats/{chat-id}",
|
|
@@ -327,15 +780,34 @@
|
|
|
327
780
|
"name": "chat-id",
|
|
328
781
|
"key": "chatId",
|
|
329
782
|
"required": true,
|
|
783
|
+
"aliases": [
|
|
784
|
+
{
|
|
785
|
+
"name": "id",
|
|
786
|
+
"key": "id"
|
|
787
|
+
}
|
|
788
|
+
],
|
|
330
789
|
"description": "Microsoft Teams chat ID, e.g. `19:abc...@thread.v2`. Returned by `list-chats`."
|
|
790
|
+
},
|
|
791
|
+
{
|
|
792
|
+
"name": "select",
|
|
793
|
+
"key": "select",
|
|
794
|
+
"required": false,
|
|
795
|
+
"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`."
|
|
796
|
+
},
|
|
797
|
+
{
|
|
798
|
+
"name": "expand",
|
|
799
|
+
"key": "expand",
|
|
800
|
+
"required": false,
|
|
801
|
+
"description": "OData $expand: navigation properties to include inline (e.g. `attachments`). Increases response size; use sparingly."
|
|
331
802
|
}
|
|
332
803
|
],
|
|
333
804
|
"example": "ask-marcel get-chat --chat-id '19:abc...@thread.v2'",
|
|
334
|
-
"responseShape": "single Microsoft Graph `chat` resource"
|
|
805
|
+
"responseShape": "single Microsoft Graph `chat` resource projected to the default `--select` set (or, when overridden, to the requested fields). `--expand members` adds an inline `members[]` array.",
|
|
806
|
+
"needsElevatedToken": true
|
|
335
807
|
},
|
|
336
808
|
{
|
|
337
809
|
"name": "get-current-user",
|
|
338
|
-
"summary": "Return the signed-in user
|
|
810
|
+
"summary": "Return the signed-in user's Microsoft Graph profile. The CLI ships a slim default `--select=id,displayName,mail,userPrincipalName,jobTitle,officeLocation,mobilePhone` covering the common identity fields. Pass `--select id,displayName,givenName,surname,preferredLanguage,...` to widen, or `--select '*'` for everything Graph returns.",
|
|
339
811
|
"category": "user",
|
|
340
812
|
"graphMethod": "GET",
|
|
341
813
|
"graphPathTemplate": "/me",
|
|
@@ -354,8 +826,8 @@
|
|
|
354
826
|
"description": "OData $expand: navigation properties to include inline (e.g. `attachments`). Increases response size; use sparingly."
|
|
355
827
|
}
|
|
356
828
|
],
|
|
357
|
-
"example": "ask-marcel get-current-user
|
|
358
|
-
"responseShape": "single Microsoft Graph `user` resource (or
|
|
829
|
+
"example": "ask-marcel get-current-user",
|
|
830
|
+
"responseShape": "single Microsoft Graph `user` resource projected to the default `--select` set (or, when overridden, to the requested fields)"
|
|
359
831
|
},
|
|
360
832
|
{
|
|
361
833
|
"name": "get-drive-delta",
|
|
@@ -369,7 +841,7 @@
|
|
|
369
841
|
"name": "drive-id",
|
|
370
842
|
"key": "driveId",
|
|
371
843
|
"required": true,
|
|
372
|
-
"description": "Microsoft Graph drive ID.
|
|
844
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
373
845
|
},
|
|
374
846
|
{
|
|
375
847
|
"name": "item-id",
|
|
@@ -430,7 +902,7 @@
|
|
|
430
902
|
"name": "drive-id",
|
|
431
903
|
"key": "driveId",
|
|
432
904
|
"required": true,
|
|
433
|
-
"description": "Microsoft Graph drive ID.
|
|
905
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
434
906
|
},
|
|
435
907
|
{
|
|
436
908
|
"name": "item-id",
|
|
@@ -466,7 +938,7 @@
|
|
|
466
938
|
"name": "drive-id",
|
|
467
939
|
"key": "driveId",
|
|
468
940
|
"required": true,
|
|
469
|
-
"description": "OneDrive
|
|
941
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
470
942
|
},
|
|
471
943
|
{
|
|
472
944
|
"name": "item-id",
|
|
@@ -490,7 +962,7 @@
|
|
|
490
962
|
"name": "drive-id",
|
|
491
963
|
"key": "driveId",
|
|
492
964
|
"required": true,
|
|
493
|
-
"description": "OneDrive
|
|
965
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
494
966
|
},
|
|
495
967
|
{
|
|
496
968
|
"name": "item-id",
|
|
@@ -526,7 +998,7 @@
|
|
|
526
998
|
"name": "drive-id",
|
|
527
999
|
"key": "driveId",
|
|
528
1000
|
"required": true,
|
|
529
|
-
"description": "OneDrive
|
|
1001
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
530
1002
|
},
|
|
531
1003
|
{
|
|
532
1004
|
"name": "item-id",
|
|
@@ -562,7 +1034,7 @@
|
|
|
562
1034
|
"name": "drive-id",
|
|
563
1035
|
"key": "driveId",
|
|
564
1036
|
"required": true,
|
|
565
|
-
"description": "OneDrive
|
|
1037
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
566
1038
|
},
|
|
567
1039
|
{
|
|
568
1040
|
"name": "item-id",
|
|
@@ -641,7 +1113,13 @@
|
|
|
641
1113
|
"name": "drive-id",
|
|
642
1114
|
"key": "driveId",
|
|
643
1115
|
"required": true,
|
|
644
|
-
"
|
|
1116
|
+
"aliases": [
|
|
1117
|
+
{
|
|
1118
|
+
"name": "id",
|
|
1119
|
+
"key": "id"
|
|
1120
|
+
}
|
|
1121
|
+
],
|
|
1122
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
645
1123
|
},
|
|
646
1124
|
{
|
|
647
1125
|
"name": "select",
|
|
@@ -661,7 +1139,7 @@
|
|
|
661
1139
|
},
|
|
662
1140
|
{
|
|
663
1141
|
"name": "get-drive-special-folder",
|
|
664
|
-
"summary": "Resolve a OneDrive well-known folder via `--folder-name` (one of `documents`, `photos`, `cameraroll`, `approot`, `music`, `attachments`) without having to navigate from the root. Returns the folder's driveItem (id, name, parentReference, etc.) ready to feed into `list-folder-files` or `download-
|
|
1142
|
+
"summary": "Resolve a OneDrive well-known folder via `--folder-name` (one of `documents`, `photos`, `cameraroll`, `approot`, `music`, `attachments`) without having to navigate from the root. Returns the folder's driveItem (id, name, parentReference, etc.) ready to feed into `list-folder-files` or `download-drive-item-content`.",
|
|
665
1143
|
"category": "drive",
|
|
666
1144
|
"graphMethod": "GET",
|
|
667
1145
|
"graphPathTemplate": "/me/drive/special/{folder-name}",
|
|
@@ -674,20 +1152,63 @@
|
|
|
674
1152
|
"description": "Well-known folder name. One of: `documents`, `photos`, `cameraroll`, `approot`, `music`, `attachments`. Returns the corresponding driveItem (folder) — use the returned `id` with `list-folder-files` etc."
|
|
675
1153
|
},
|
|
676
1154
|
{
|
|
677
|
-
"name": "select",
|
|
678
|
-
"key": "select",
|
|
679
|
-
"required": false,
|
|
680
|
-
"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`."
|
|
1155
|
+
"name": "select",
|
|
1156
|
+
"key": "select",
|
|
1157
|
+
"required": false,
|
|
1158
|
+
"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`."
|
|
1159
|
+
},
|
|
1160
|
+
{
|
|
1161
|
+
"name": "expand",
|
|
1162
|
+
"key": "expand",
|
|
1163
|
+
"required": false,
|
|
1164
|
+
"description": "OData $expand: navigation properties to include inline (e.g. `attachments`). Increases response size; use sparingly."
|
|
1165
|
+
}
|
|
1166
|
+
],
|
|
1167
|
+
"example": "ask-marcel get-drive-special-folder --folder-name 'documents'",
|
|
1168
|
+
"responseShape": "single Microsoft Graph `driveItem` resource (folder)"
|
|
1169
|
+
},
|
|
1170
|
+
{
|
|
1171
|
+
"name": "get-excel-chart-image",
|
|
1172
|
+
"summary": "Render a chart on an Excel worksheet as a PNG (base64). Calls Graph's chart `Image()` function (natural size, aspect-preserving) so a vision-capable LLM can read the plotted data itself — not just the chart's title / position metadata that `list-excel-worksheet-charts` returns. The chart id or name comes from `list-excel-worksheet-charts`.",
|
|
1173
|
+
"category": "excel",
|
|
1174
|
+
"graphMethod": "GET",
|
|
1175
|
+
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/charts/{chart-id}/Image(width=0,height=0,fittingMode='Fit')",
|
|
1176
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/chart-image",
|
|
1177
|
+
"options": [
|
|
1178
|
+
{
|
|
1179
|
+
"name": "drive-id",
|
|
1180
|
+
"key": "driveId",
|
|
1181
|
+
"required": true,
|
|
1182
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
1183
|
+
},
|
|
1184
|
+
{
|
|
1185
|
+
"name": "item-id",
|
|
1186
|
+
"key": "itemId",
|
|
1187
|
+
"required": true,
|
|
1188
|
+
"description": "driveItem ID of the .xlsx file."
|
|
1189
|
+
},
|
|
1190
|
+
{
|
|
1191
|
+
"name": "worksheet-id",
|
|
1192
|
+
"key": "worksheetId",
|
|
1193
|
+
"required": true,
|
|
1194
|
+
"description": "Worksheet display name (e.g. `Sheet1`) or the worksheet `id` GUID returned by `list-excel-worksheets`.",
|
|
1195
|
+
"argumentHint": {
|
|
1196
|
+
"kind": "idOrName"
|
|
1197
|
+
}
|
|
681
1198
|
},
|
|
682
1199
|
{
|
|
683
|
-
"name": "
|
|
684
|
-
"key": "
|
|
685
|
-
"required":
|
|
686
|
-
"description": "
|
|
1200
|
+
"name": "chart-id",
|
|
1201
|
+
"key": "chartId",
|
|
1202
|
+
"required": true,
|
|
1203
|
+
"description": "Chart name (e.g. `Chart 1`) or `id`, as returned by `list-excel-worksheet-charts`.",
|
|
1204
|
+
"argumentHint": {
|
|
1205
|
+
"kind": "idOrName"
|
|
1206
|
+
}
|
|
687
1207
|
}
|
|
688
1208
|
],
|
|
689
|
-
"example": "ask-marcel get-drive-
|
|
690
|
-
"responseShape": "
|
|
1209
|
+
"example": "ask-marcel get-excel-chart-image --drive-id 'b!1234' --item-id '01ABC' --worksheet-id 'Sheet1' --chart-id 'Chart 1' --output-path ./chart.png",
|
|
1210
|
+
"responseShape": "`{ contentType: \"image/png\", size, base64 }` — the rendered chart PNG, inlined. Pair with the global `--output-path <file>` to write the PNG to disk (the response then replaces `base64` with `savedTo`).",
|
|
1211
|
+
"producesBytes": true
|
|
691
1212
|
},
|
|
692
1213
|
{
|
|
693
1214
|
"name": "get-excel-range",
|
|
@@ -701,7 +1222,7 @@
|
|
|
701
1222
|
"name": "drive-id",
|
|
702
1223
|
"key": "driveId",
|
|
703
1224
|
"required": true,
|
|
704
|
-
"description": "Microsoft Graph drive ID containing the workbook.
|
|
1225
|
+
"description": "Microsoft Graph drive ID containing the workbook. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
705
1226
|
},
|
|
706
1227
|
{
|
|
707
1228
|
"name": "item-id",
|
|
@@ -743,7 +1264,7 @@
|
|
|
743
1264
|
"name": "drive-id",
|
|
744
1265
|
"key": "driveId",
|
|
745
1266
|
"required": true,
|
|
746
|
-
"description": "Microsoft Graph drive ID containing the workbook.
|
|
1267
|
+
"description": "Microsoft Graph drive ID containing the workbook. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
747
1268
|
},
|
|
748
1269
|
{
|
|
749
1270
|
"name": "item-id",
|
|
@@ -763,7 +1284,7 @@
|
|
|
763
1284
|
},
|
|
764
1285
|
{
|
|
765
1286
|
"name": "get-excel-used-range",
|
|
766
|
-
"summary": "Return the worksheet's used range — the bounding box of every non-empty cell — as a single Excel range. Avoids fetching the entire 1M × 16K-cell sheet when only a small data island is populated.",
|
|
1287
|
+
"summary": "Return the worksheet's used range — the bounding box of every non-empty cell — as a single Excel range. The CLI ships a slim default that strips the redundant `text` / `numberFormat` / `formulas` 2D arrays Graph returns (mostly `\"General\"` repeated cell-by-cell), keeping `address` / `rowCount` / `columnCount` / `values`. Pass `--full true` to return the raw four-array Graph shape. `--max-cells` (default 50 000) caps the size of the projected `values[]`; oversize ranges drop `values` and surface a hint pointing at `get-excel-range` for band-by-band reads. Avoids fetching the entire 1M × 16K-cell sheet when only a small data island is populated.",
|
|
767
1288
|
"category": "excel",
|
|
768
1289
|
"graphMethod": "GET",
|
|
769
1290
|
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/workbook/worksheets/{worksheet-id}/usedRange()",
|
|
@@ -773,7 +1294,7 @@
|
|
|
773
1294
|
"name": "drive-id",
|
|
774
1295
|
"key": "driveId",
|
|
775
1296
|
"required": true,
|
|
776
|
-
"description": "OneDrive
|
|
1297
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
777
1298
|
},
|
|
778
1299
|
{
|
|
779
1300
|
"name": "item-id",
|
|
@@ -789,10 +1310,22 @@
|
|
|
789
1310
|
"argumentHint": {
|
|
790
1311
|
"kind": "idOrName"
|
|
791
1312
|
}
|
|
1313
|
+
},
|
|
1314
|
+
{
|
|
1315
|
+
"name": "full",
|
|
1316
|
+
"key": "full",
|
|
1317
|
+
"required": false,
|
|
1318
|
+
"description": "Pass `--full true` to return the raw Graph `workbookRange` shape with all four 2D arrays (`values`, `text`, `numberFormat`, `formulas`). Default (`--full false`, or omitted) drops the three redundant arrays and ships only `values`. The raw shape on a 3×148 sheet is ~125 KB (most of it duplicated `\"General\"` numberFormat strings); the slim default is ~5-15 KB."
|
|
1319
|
+
},
|
|
1320
|
+
{
|
|
1321
|
+
"name": "max-cells",
|
|
1322
|
+
"key": "maxCells",
|
|
1323
|
+
"required": false,
|
|
1324
|
+
"description": "Cap (positive integer; default 50 000) on the size of the projected `values[]` in slim mode. When the used-range exceeds the cap, the response keeps `address` / `rowCount` / `columnCount` but drops `values[]` and adds `truncated: true` plus a hint pointing at `get-excel-range` for band-by-band reads. Ignored when `--full true` is set (the caller has opted into the full payload regardless of size)."
|
|
792
1325
|
}
|
|
793
1326
|
],
|
|
794
1327
|
"example": "ask-marcel get-excel-used-range --drive-id 'b!1234' --item-id '01ABC' --worksheet-id 'Sheet1'",
|
|
795
|
-
"responseShape": "
|
|
1328
|
+
"responseShape": "Slim projection (default): `{ address, rowCount, columnCount, values, projection: 'slim' }` — `values[]` is the 2D cell-value array. Oversize variant: `{ address, rowCount, columnCount, projection: 'slim', truncated: true, maxCells, hint }` (no `values`). With `--full true`: the raw Graph `workbookRange` resource (adds `text`, `numberFormat`, `formulas` 2D arrays) plus `projection: 'full'`. Workbook Online (WAC) errors are translated to a clear `item is not an accessible Excel workbook` envelope (see `excel-error.ts`)."
|
|
796
1329
|
},
|
|
797
1330
|
{
|
|
798
1331
|
"name": "get-group",
|
|
@@ -806,6 +1339,12 @@
|
|
|
806
1339
|
"name": "group-id",
|
|
807
1340
|
"key": "groupId",
|
|
808
1341
|
"required": true,
|
|
1342
|
+
"aliases": [
|
|
1343
|
+
{
|
|
1344
|
+
"name": "id",
|
|
1345
|
+
"key": "id"
|
|
1346
|
+
}
|
|
1347
|
+
],
|
|
809
1348
|
"description": "Azure AD group object ID. Use `list-groups` to find one."
|
|
810
1349
|
},
|
|
811
1350
|
{
|
|
@@ -826,7 +1365,7 @@
|
|
|
826
1365
|
},
|
|
827
1366
|
{
|
|
828
1367
|
"name": "get-mail-attachment",
|
|
829
|
-
"summary": "Get a single attachment on an Outlook message (metadata, plus the base64 `contentBytes` for file attachments). For fileAttachments, the response also carries a `base64` mirror of `contentBytes` so the global output-path flag can land the bytes on disk in one call.
|
|
1368
|
+
"summary": "Get a single attachment on an Outlook message (metadata, plus the base64 `contentBytes` for file attachments). For fileAttachments, the response also carries a `base64` mirror of `contentBytes` so the global output-path flag can land the bytes on disk in one call — and when an output-path is set the CLI strips BOTH `contentBytes` and `base64` from stdout, leaving a compact metadata envelope with `savedTo` (the file is on disk; no multi-MB base64 in the terminal). When you only want metadata, use `--select id,name,contentType,size` to skip the `contentBytes` payload.",
|
|
830
1369
|
"category": "mail",
|
|
831
1370
|
"graphMethod": "GET",
|
|
832
1371
|
"graphPathTemplate": "/me/messages/{message-id}/attachments/{attachment-id}",
|
|
@@ -858,11 +1397,12 @@
|
|
|
858
1397
|
}
|
|
859
1398
|
],
|
|
860
1399
|
"example": "ask-marcel get-mail-attachment --message-id 'AAMkAGI2...' --attachment-id 'AAMkABC...'",
|
|
861
|
-
"responseShape": "single Microsoft Graph `attachment` resource. fileAttachments include `contentBytes` (Graph) AND `base64` (CLI mirror) so `--output-path` works; itemAttachments and referenceAttachments are returned unchanged."
|
|
1400
|
+
"responseShape": "single Microsoft Graph `attachment` resource. fileAttachments include `contentBytes` (Graph) AND `base64` (CLI mirror) so `--output-path` works; with `--output-path` set, both byte fields are stripped from stdout and replaced by `savedTo`. itemAttachments and referenceAttachments are returned unchanged.",
|
|
1401
|
+
"producesBytes": true
|
|
862
1402
|
},
|
|
863
1403
|
{
|
|
864
1404
|
"name": "get-mail-message",
|
|
865
|
-
"summary": "Get a single Outlook message by ID
|
|
1405
|
+
"summary": "Get a single Outlook message by ID. The CLI ships a slim default `--select=id,subject,from,toRecipients,ccRecipients,receivedDateTime,hasAttachments,isRead,importance,bodyPreview` so an LLM caller doesn't pull a 41 KB resource just to read a subject line. Pass `--select id,subject,body` (or any other comma-separated field list) to override; for the raw RFC-822 source use `get-mail-message-mime` instead.",
|
|
866
1406
|
"category": "mail",
|
|
867
1407
|
"graphMethod": "GET",
|
|
868
1408
|
"graphPathTemplate": "/me/messages/{message-id}",
|
|
@@ -872,7 +1412,13 @@
|
|
|
872
1412
|
"name": "message-id",
|
|
873
1413
|
"key": "messageId",
|
|
874
1414
|
"required": true,
|
|
875
|
-
"
|
|
1415
|
+
"aliases": [
|
|
1416
|
+
{
|
|
1417
|
+
"name": "id",
|
|
1418
|
+
"key": "id"
|
|
1419
|
+
}
|
|
1420
|
+
],
|
|
1421
|
+
"description": "Outlook message ID. Returned by `ask-marcel list-mail-messages` or `list-mail-folder-messages`. Accepts `--id` as an alias."
|
|
876
1422
|
},
|
|
877
1423
|
{
|
|
878
1424
|
"name": "select",
|
|
@@ -887,8 +1433,8 @@
|
|
|
887
1433
|
"description": "OData $expand: navigation properties to include inline (e.g. `attachments`). Increases response size; use sparingly."
|
|
888
1434
|
}
|
|
889
1435
|
],
|
|
890
|
-
"example": "ask-marcel get-mail-message --message-id 'AAMkAGI2...'
|
|
891
|
-
"responseShape": "single Microsoft Graph `message` resource (or
|
|
1436
|
+
"example": "ask-marcel get-mail-message --message-id 'AAMkAGI2...'",
|
|
1437
|
+
"responseShape": "single Microsoft Graph `message` resource projected to the default `--select` set (or, when overridden, to the requested fields). The default omits `body`, `internetMessageHeaders`, and `uniqueBody` — request them explicitly via `--select` when you need the full HTML."
|
|
892
1438
|
},
|
|
893
1439
|
{
|
|
894
1440
|
"name": "get-mail-message-mime",
|
|
@@ -902,11 +1448,18 @@
|
|
|
902
1448
|
"name": "message-id",
|
|
903
1449
|
"key": "messageId",
|
|
904
1450
|
"required": true,
|
|
905
|
-
"
|
|
1451
|
+
"aliases": [
|
|
1452
|
+
{
|
|
1453
|
+
"name": "id",
|
|
1454
|
+
"key": "id"
|
|
1455
|
+
}
|
|
1456
|
+
],
|
|
1457
|
+
"description": "Outlook message ID. Returned by `list-mail-messages` or `search-mail-messages`. Accepts `--id` as an alias."
|
|
906
1458
|
}
|
|
907
1459
|
],
|
|
908
1460
|
"example": "ask-marcel get-mail-message-mime --message-id 'AAMkAD...'",
|
|
909
|
-
"responseShape": "`{ contentType: \"text/plain\", size, base64 }` — Graph returns the raw MIME envelope wrapped as `text/plain` (NOT `message/rfc822` as the older docs suggested). Pair with the global `--output-path <path>` flag to land the .eml on disk and replace `base64` with `savedTo` for messages with large attachments."
|
|
1461
|
+
"responseShape": "`{ contentType: \"text/plain\", size, base64 }` — Graph returns the raw MIME envelope wrapped as `text/plain` (NOT `message/rfc822` as the older docs suggested). Pair with the global `--output-path <path>` flag to land the .eml on disk and replace `base64` with `savedTo` for messages with large attachments.",
|
|
1462
|
+
"producesBytes": true
|
|
910
1463
|
},
|
|
911
1464
|
{
|
|
912
1465
|
"name": "get-mail-rule",
|
|
@@ -928,6 +1481,10 @@
|
|
|
928
1481
|
"required": true,
|
|
929
1482
|
"description": "Message rule ID. Returned by `list-mail-rules`.",
|
|
930
1483
|
"aliases": [
|
|
1484
|
+
{
|
|
1485
|
+
"name": "id",
|
|
1486
|
+
"key": "id"
|
|
1487
|
+
},
|
|
931
1488
|
{
|
|
932
1489
|
"name": "rule-id",
|
|
933
1490
|
"key": "ruleId"
|
|
@@ -1006,11 +1563,12 @@
|
|
|
1006
1563
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/profilephoto-get",
|
|
1007
1564
|
"options": [],
|
|
1008
1565
|
"example": "ask-marcel get-my-profile-photo",
|
|
1009
|
-
"responseShape": "`{ contentType: \"image/jpeg\", size: <bytes>, base64: \"<encoded>\" }` — the photo bytes, inlined. Pair with the global `--output-path <path>` flag to land the image on disk and replace `base64` with `savedTo`."
|
|
1566
|
+
"responseShape": "`{ contentType: \"image/jpeg\", size: <bytes>, base64: \"<encoded>\" }` — the photo bytes, inlined. Pair with the global `--output-path <path>` flag to land the image on disk and replace `base64` with `savedTo`.",
|
|
1567
|
+
"producesBytes": true
|
|
1010
1568
|
},
|
|
1011
1569
|
{
|
|
1012
1570
|
"name": "get-onenote-page-as-markdown",
|
|
1013
|
-
"summary": "Get the body of a single OneNote page as markdown. Graph
|
|
1571
|
+
"summary": "Get the body of a single OneNote page as markdown. Graph returns OneNote pages as HTML, which this command runs through turndown locally. By default the page’s inline images (its `…/onenote/resources/{id}/$value` references) are fetched and embedded as base64 `data:` URIs so the markdown is self-contained — pass `--inline-images false` to keep the raw Graph resource URLs instead. Image embedding is per-image isolated: any resource that fails to fetch, is oversize (> 2 MB), or is not an image is left as a URL rather than failing the page. Pass `--include-metadata true` to append a `## OneNote metadata` block (title, created / last-modified timestamps, parent section + notebook). For the raw HTML use `get-onenote-page-content`.",
|
|
1014
1572
|
"category": "notes",
|
|
1015
1573
|
"graphMethod": "GET",
|
|
1016
1574
|
"graphPathTemplate": "/me/onenote/pages/{onenote-page-id}/content",
|
|
@@ -1022,15 +1580,46 @@
|
|
|
1022
1580
|
"required": true,
|
|
1023
1581
|
"description": "OneNote page ID. Returned by `ask-marcel list-onenote-section-pages`.",
|
|
1024
1582
|
"aliases": [
|
|
1583
|
+
{
|
|
1584
|
+
"name": "id",
|
|
1585
|
+
"key": "id"
|
|
1586
|
+
},
|
|
1025
1587
|
{
|
|
1026
1588
|
"name": "page-id",
|
|
1027
1589
|
"key": "pageId"
|
|
1028
1590
|
}
|
|
1029
1591
|
]
|
|
1592
|
+
},
|
|
1593
|
+
{
|
|
1594
|
+
"name": "inline-images",
|
|
1595
|
+
"key": "inlineImages",
|
|
1596
|
+
"required": false,
|
|
1597
|
+
"description": "Pass `--inline-images false` to skip fetching + embedding the page’s `onenote/resources/{id}/$value` images and keep the raw Graph resource URLs in the markdown. Default is `true` (embed as base64 `data:` URIs so the output is self-contained). Embedding is per-image isolated — a failed / oversize / non-image resource is left as a URL either way.",
|
|
1598
|
+
"argumentHint": {
|
|
1599
|
+
"kind": "magicValue",
|
|
1600
|
+
"values": [
|
|
1601
|
+
"true",
|
|
1602
|
+
"false"
|
|
1603
|
+
]
|
|
1604
|
+
}
|
|
1605
|
+
},
|
|
1606
|
+
{
|
|
1607
|
+
"name": "include-metadata",
|
|
1608
|
+
"key": "includeMetadata",
|
|
1609
|
+
"required": false,
|
|
1610
|
+
"description": "Pass `--include-metadata true` to append a `## OneNote metadata` block after the body: page title, created / last-modified timestamps, and the parent section + notebook display names (one extra GET, expanded). Default omits it.",
|
|
1611
|
+
"argumentHint": {
|
|
1612
|
+
"kind": "magicValue",
|
|
1613
|
+
"values": [
|
|
1614
|
+
"true",
|
|
1615
|
+
"false"
|
|
1616
|
+
]
|
|
1617
|
+
}
|
|
1030
1618
|
}
|
|
1031
1619
|
],
|
|
1032
1620
|
"example": "ask-marcel get-onenote-page-as-markdown --onenote-page-id '1-abc...'",
|
|
1033
|
-
"responseShape": "`{ contentType: \"text/markdown\", size
|
|
1621
|
+
"responseShape": "`{ contentType: \"text/markdown\", size, text }` — turndown-rendered page body with inline images embedded as data URIs by default. With `--include-metadata true`, a `## OneNote metadata` block is appended after the body.",
|
|
1622
|
+
"producesBytes": true
|
|
1034
1623
|
},
|
|
1035
1624
|
{
|
|
1036
1625
|
"name": "get-onenote-page-content",
|
|
@@ -1046,6 +1635,10 @@
|
|
|
1046
1635
|
"required": true,
|
|
1047
1636
|
"description": "OneNote page ID. Returned by `ask-marcel list-onenote-section-pages`.",
|
|
1048
1637
|
"aliases": [
|
|
1638
|
+
{
|
|
1639
|
+
"name": "id",
|
|
1640
|
+
"key": "id"
|
|
1641
|
+
},
|
|
1049
1642
|
{
|
|
1050
1643
|
"name": "page-id",
|
|
1051
1644
|
"key": "pageId"
|
|
@@ -1054,7 +1647,8 @@
|
|
|
1054
1647
|
}
|
|
1055
1648
|
],
|
|
1056
1649
|
"example": "ask-marcel get-onenote-page-content --onenote-page-id '1-abc...'",
|
|
1057
|
-
"responseShape": "`{ contentType: \"text/html\", size: <chars>, text: \"<html>...\" }` — the rendered OneNote page body wrapped in a JSON envelope"
|
|
1650
|
+
"responseShape": "`{ contentType: \"text/html\", size: <chars>, text: \"<html>...\" }` — the rendered OneNote page body wrapped in a JSON envelope",
|
|
1651
|
+
"producesBytes": true
|
|
1058
1652
|
},
|
|
1059
1653
|
{
|
|
1060
1654
|
"name": "get-organization",
|
|
@@ -1094,6 +1688,10 @@
|
|
|
1094
1688
|
"required": true,
|
|
1095
1689
|
"description": "Planner bucket ID. Returned by `ask-marcel list-plan-buckets`.",
|
|
1096
1690
|
"aliases": [
|
|
1691
|
+
{
|
|
1692
|
+
"name": "id",
|
|
1693
|
+
"key": "id"
|
|
1694
|
+
},
|
|
1097
1695
|
{
|
|
1098
1696
|
"name": "bucket-id",
|
|
1099
1697
|
"key": "bucketId"
|
|
@@ -1118,6 +1716,10 @@
|
|
|
1118
1716
|
"required": true,
|
|
1119
1717
|
"description": "Planner plan ID. Returned in the `planId` field of any task from `ask-marcel list-planner-tasks`.",
|
|
1120
1718
|
"aliases": [
|
|
1719
|
+
{
|
|
1720
|
+
"name": "id",
|
|
1721
|
+
"key": "id"
|
|
1722
|
+
},
|
|
1121
1723
|
{
|
|
1122
1724
|
"name": "plan-id",
|
|
1123
1725
|
"key": "planId"
|
|
@@ -1142,6 +1744,10 @@
|
|
|
1142
1744
|
"required": true,
|
|
1143
1745
|
"description": "Planner task ID. Returned by `ask-marcel list-planner-tasks` or `list-plan-tasks`. Accepts `--task-id` as a shorter alias (each task command targets exactly one of Planner or To Do, so within this command's flag set there is no ambiguity).",
|
|
1144
1746
|
"aliases": [
|
|
1747
|
+
{
|
|
1748
|
+
"name": "id",
|
|
1749
|
+
"key": "id"
|
|
1750
|
+
},
|
|
1145
1751
|
{
|
|
1146
1752
|
"name": "task-id",
|
|
1147
1753
|
"key": "taskId"
|
|
@@ -1166,6 +1772,10 @@
|
|
|
1166
1772
|
"required": true,
|
|
1167
1773
|
"description": "Planner task ID. Returned by `ask-marcel list-planner-tasks` or `list-plan-tasks`. Accepts `--task-id` as a shorter alias (each task command targets exactly one of Planner or To Do, so within this command's flag set there is no ambiguity).",
|
|
1168
1774
|
"aliases": [
|
|
1775
|
+
{
|
|
1776
|
+
"name": "id",
|
|
1777
|
+
"key": "id"
|
|
1778
|
+
},
|
|
1169
1779
|
{
|
|
1170
1780
|
"name": "task-id",
|
|
1171
1781
|
"key": "taskId"
|
|
@@ -1269,6 +1879,12 @@
|
|
|
1269
1879
|
"name": "site-id",
|
|
1270
1880
|
"key": "siteId",
|
|
1271
1881
|
"required": true,
|
|
1882
|
+
"aliases": [
|
|
1883
|
+
{
|
|
1884
|
+
"name": "id",
|
|
1885
|
+
"key": "id"
|
|
1886
|
+
}
|
|
1887
|
+
],
|
|
1272
1888
|
"description": "SharePoint site ID. Either the composite ID (`hostname,site-collection-id,site-id`) returned by `ask-marcel search-sharepoint-sites-by-name`, or the literal `root` to refer to the tenant root site."
|
|
1273
1889
|
},
|
|
1274
1890
|
{
|
|
@@ -1465,7 +2081,8 @@
|
|
|
1465
2081
|
}
|
|
1466
2082
|
],
|
|
1467
2083
|
"example": "ask-marcel get-sharepoint-site-onenote-page-content --site-id 'contoso.sharepoint.com,...' --onenote-page-id 'p1'",
|
|
1468
|
-
"responseShape": "`{ contentType: \"text/html\", size: <chars>, text: \"<html>...\" }` — the rendered OneNote page body wrapped in a JSON envelope. Pair with the global `--output-path <path>` to write the raw HTML to disk."
|
|
2084
|
+
"responseShape": "`{ contentType: \"text/html\", size: <chars>, text: \"<html>...\" }` — the rendered OneNote page body wrapped in a JSON envelope. Pair with the global `--output-path <path>` to write the raw HTML to disk.",
|
|
2085
|
+
"producesBytes": true
|
|
1469
2086
|
},
|
|
1470
2087
|
{
|
|
1471
2088
|
"name": "get-site-analytics",
|
|
@@ -1479,6 +2096,12 @@
|
|
|
1479
2096
|
"name": "site-id",
|
|
1480
2097
|
"key": "siteId",
|
|
1481
2098
|
"required": true,
|
|
2099
|
+
"aliases": [
|
|
2100
|
+
{
|
|
2101
|
+
"name": "id",
|
|
2102
|
+
"key": "id"
|
|
2103
|
+
}
|
|
2104
|
+
],
|
|
1482
2105
|
"description": "SharePoint site ID."
|
|
1483
2106
|
}
|
|
1484
2107
|
],
|
|
@@ -1533,6 +2156,12 @@
|
|
|
1533
2156
|
"name": "team-id",
|
|
1534
2157
|
"key": "teamId",
|
|
1535
2158
|
"required": true,
|
|
2159
|
+
"aliases": [
|
|
2160
|
+
{
|
|
2161
|
+
"name": "id",
|
|
2162
|
+
"key": "id"
|
|
2163
|
+
}
|
|
2164
|
+
],
|
|
1536
2165
|
"description": "Microsoft Teams team ID. Returned by `ask-marcel list-joined-teams`."
|
|
1537
2166
|
},
|
|
1538
2167
|
{
|
|
@@ -1599,6 +2228,12 @@
|
|
|
1599
2228
|
"name": "team-id",
|
|
1600
2229
|
"key": "teamId",
|
|
1601
2230
|
"required": true,
|
|
2231
|
+
"aliases": [
|
|
2232
|
+
{
|
|
2233
|
+
"name": "id",
|
|
2234
|
+
"key": "id"
|
|
2235
|
+
}
|
|
2236
|
+
],
|
|
1602
2237
|
"description": "Microsoft Teams team ID. Returned by `list-joined-teams`."
|
|
1603
2238
|
},
|
|
1604
2239
|
{
|
|
@@ -1617,9 +2252,35 @@
|
|
|
1617
2252
|
"example": "ask-marcel get-team-primary-channel --team-id 'tm1'",
|
|
1618
2253
|
"responseShape": "single Microsoft Graph `channel` resource"
|
|
1619
2254
|
},
|
|
2255
|
+
{
|
|
2256
|
+
"name": "get-teams-chat-message",
|
|
2257
|
+
"summary": "Return a single Microsoft Teams chat message by its id via the chat substrate. Uses the chatsvcagg-audience bearer captured at login (same identity as the basic Teams token, different audience). **Best-effort, may break on Microsoft client updates** — the chat substrate is not in the public Microsoft Graph API. Source the chat-id + message-id via `list-teams-chats-with-messages` or `list-teams-chat-messages`.",
|
|
2258
|
+
"category": "chats",
|
|
2259
|
+
"graphMethod": "GET",
|
|
2260
|
+
"graphPathTemplate": "https://teams.microsoft.com/api/csa/{region}/api/v1/chats/{chat-id}/messages/{message-id}",
|
|
2261
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/chatmessage-get",
|
|
2262
|
+
"options": [
|
|
2263
|
+
{
|
|
2264
|
+
"name": "chat-id",
|
|
2265
|
+
"key": "chatId",
|
|
2266
|
+
"required": true,
|
|
2267
|
+
"description": "Teams chat ID. Source via `list-chats` or `list-teams-chats-with-messages`."
|
|
2268
|
+
},
|
|
2269
|
+
{
|
|
2270
|
+
"name": "message-id",
|
|
2271
|
+
"key": "messageId",
|
|
2272
|
+
"required": true,
|
|
2273
|
+
"description": "Teams chat message ID. Source via `list-teams-chats-with-messages` or `list-teams-chat-messages`."
|
|
2274
|
+
}
|
|
2275
|
+
],
|
|
2276
|
+
"example": "ask-marcel get-teams-chat-message --chat-id '19:abc...@unq.gbl.spaces' --message-id '1700000000000'",
|
|
2277
|
+
"responseShape": "single Teams chat message — `id`, `from`, `imDisplayName`, `content`, `contentType`, `composeTime`, `originalArrivalTime`, etc. **Microsoft-internal schema — fields may change without notice.**",
|
|
2278
|
+
"needsSubstrateToken": true,
|
|
2279
|
+
"stability": "experimental"
|
|
2280
|
+
},
|
|
1620
2281
|
{
|
|
1621
2282
|
"name": "get-todo-task",
|
|
1622
|
-
"summary": "Get a single Microsoft To Do task by its ID and its parent list ID. Use `--select` to slim the response (e.g. `--select id,
|
|
2283
|
+
"summary": "Get a single Microsoft To Do task by its ID and its parent list ID. Use `--select` to slim the response (e.g. `--select id,status`) or `--expand checklistItems` / `--expand linkedResources` to inline child collections. Known Graph quirk: any `--select` combo that includes `title` trips `RequestBroker--ParseUri` on this endpoint; the CLI rewrites that opaque error to a hint.",
|
|
1623
2284
|
"category": "tasks",
|
|
1624
2285
|
"graphMethod": "GET",
|
|
1625
2286
|
"graphPathTemplate": "/me/todo/lists/{todo-task-list-id}/tasks/{todo-task-id}",
|
|
@@ -1681,6 +2342,12 @@
|
|
|
1681
2342
|
"name": "user-id",
|
|
1682
2343
|
"key": "userId",
|
|
1683
2344
|
"required": true,
|
|
2345
|
+
"aliases": [
|
|
2346
|
+
{
|
|
2347
|
+
"name": "id",
|
|
2348
|
+
"key": "id"
|
|
2349
|
+
}
|
|
2350
|
+
],
|
|
1684
2351
|
"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)."
|
|
1685
2352
|
},
|
|
1686
2353
|
{
|
|
@@ -1699,6 +2366,36 @@
|
|
|
1699
2366
|
"example": "ask-marcel get-user-manager --user-id 'alice@contoso.com' --select 'id,displayName,mail'",
|
|
1700
2367
|
"responseShape": "single Microsoft Graph `user` resource on success, OR `{ manager: null, note: <string> }` when the target user has no manager set. Detect the no-manager case via `data.manager === null` (same discriminator as `get-my-manager`)."
|
|
1701
2368
|
},
|
|
2369
|
+
{
|
|
2370
|
+
"name": "list-accessible-drives",
|
|
2371
|
+
"summary": "Enumerate every drive (document library) the signed-in user can reach — personal OneDrive(s), Teams libraries, SharePoint M365-group sites, drives behind files shared with the user, private/shared Teams channel sites, drives behind recently-used / followed / trending items (activity signals), AND every NON-default document library of each discovered SharePoint site — by unioning `/me/drives`, `/me/joinedTeams`, `/me/memberOf` (Unified groups → `/groups/{id}/drive`), `/me/drive/sharedWithMe`, per-team `/teams/{id}/channels` → `/channels/{ch}/filesFolder` (private/shared channels only — their files live in their own site, not the team default drive), `/me/drive/recent` + `/me/drive/following` + `/me/insights/{trending,used,shared}`, and a path-addressed `/sites/{host}:/sites/{name}:/drives` per discovered site (catches secondary libraries like \"Teams Wiki Data\" the default-drive vectors miss). Unlike `search-sharepoint-sites-by-name` (which relies on the tenant search index and misses direct-link-only sites + OneDrives), these vectors surface drives the search index never returns; the index in turn returns sites you can open but are not a member of, so the *union of both commands* is the practical maximum on a delegated token. Each drive is tagged with the `sources[]` that found it (a drive can have several). Per-resource \"can't reach this one\" failures are dropped silently (404 no drive, 403 access-denied / non-member private channel, 423 admin-locked site, 400 stale/unresolvable id); only actionable failures (auth, throttling, 5xx, network) appear in `partialErrors[]`, so it stays signal-only. Fans out one `/groups/{id}/drive` + one `/teams/{id}/channels` call per joined team + member group, a `filesFolder` call per private/shared channel, five fixed activity calls, and one `/sites/{id}/drives` call per discovered site (all capped by `--max-groups`, default 100; raise carefully — large memberships can hit 429 throttling). `/me/followedSites` is not used — it 403s on this token.",
|
|
2372
|
+
"category": "drive",
|
|
2373
|
+
"graphMethod": "GET",
|
|
2374
|
+
"graphPathTemplate": "/me/drives + /me/joinedTeams + /me/memberOf + /me/drive/sharedWithMe + per-group /groups/<id>/drive + per-team /teams/<id>/channels/<ch>/filesFolder + /me/drive/recent + /me/drive/following + /me/insights/<trending|used|shared> + per-site /sites/<host>:/sites/<name>:/drives",
|
|
2375
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/drive-list",
|
|
2376
|
+
"options": [
|
|
2377
|
+
{
|
|
2378
|
+
"name": "max-groups",
|
|
2379
|
+
"key": "maxGroups",
|
|
2380
|
+
"required": false,
|
|
2381
|
+
"description": "Safety cap on each fan-out (positive integer; default 100): the per-group `/groups/{id}/drive` calls, the per-team `/teams/{id}/channels` enumeration, the per-private/shared-channel `filesFolder` lookups, the per-site `/sites/{id}/drives` enumeration, and the `/drives/{id}` enrichment for shared-, channel-, and activity-only drives. A user in hundreds of teams/groups/sites would otherwise issue hundreds of parallel requests (429 risk). When any cap is hit the response carries `truncated: true`.",
|
|
2382
|
+
"argumentHint": {
|
|
2383
|
+
"kind": "magicValue",
|
|
2384
|
+
"values": [
|
|
2385
|
+
"100"
|
|
2386
|
+
]
|
|
2387
|
+
}
|
|
2388
|
+
},
|
|
2389
|
+
{
|
|
2390
|
+
"name": "count-files",
|
|
2391
|
+
"key": "countFiles",
|
|
2392
|
+
"required": false,
|
|
2393
|
+
"description": "Pass `--count-files true` to add `estimatedFileCount` to each drive — the Microsoft Search index's security-trimmed `driveItem` total (files + folders) scoped to that drive's `webUrl` via KQL `path:`. OFF by default because it issues ONE extra Search query per drive (chunked, capped at 200) — a real fan-out with 429-throttling risk on large drive sets. It is an estimate, not an exact count."
|
|
2394
|
+
}
|
|
2395
|
+
],
|
|
2396
|
+
"example": "ask-marcel list-accessible-drives --output json",
|
|
2397
|
+
"responseShape": "`{ value: [{ id, name, driveType, webUrl, sources: [\"activity\"|\"channel\"|\"joinedTeam\"|\"memberOfGroup\"|\"personal\"|\"sharedWithMe\"|\"siteLibrary\"], groupId?, size?, estimatedFileCount? }], count, fileEstimate?, truncated?: true, partialErrors?: [{ source, error }] }`. `estimatedFileCount` appears only with `--count-files true` — the security-trimmed `driveItem` (files+folders) estimate scoped to each drive, omitted past the 200-drive count cap or when the per-drive query fails. `value[]` is deduped by drive `id` and sorted by id; `sources[]` lists every vector that surfaced the drive (`channel` = a private/shared Teams channel files folder; `activity` = a recently-used / followed / trending item drive; `siteLibrary` = a non-default document library of a discovered site); `groupId` is present only for Teams/group drives. `size` (when present) is the drive's total bytes used (`quota.used`, recursive) — surfaced free from the drive resource, omitted for the rare drive without a quota facet; it is a data-volume signal, not a file count. `fileEstimate` (best-effort, omitted if the extra query fails) is the Microsoft Search index's security-trimmed `driveItem` count — roughly how many files+folders you can access across ALL of SharePoint/OneDrive; it is INDEX-WIDE, not limited to the `value[]` drives above. `truncated: true` means a `--max-groups` cap was hit — raise it to see more. `partialErrors[]` (present only when something actionable failed) names each vector/group/channel/site whose sub-call returned an actionable error (auth, throttling, 5xx, network); benign \"can't reach this one\" results (404/403/423/400) are dropped, not listed."
|
|
2398
|
+
},
|
|
1702
2399
|
{
|
|
1703
2400
|
"name": "list-all-onenote-sections",
|
|
1704
2401
|
"summary": "List every OneNote section the signed-in user can see, across all notebooks.",
|
|
@@ -1748,6 +2445,67 @@
|
|
|
1748
2445
|
"responseShape": "collection of Microsoft Graph `onenoteSection` resources under `value[]`",
|
|
1749
2446
|
"pagination": true
|
|
1750
2447
|
},
|
|
2448
|
+
{
|
|
2449
|
+
"name": "list-calendar-event-attachments",
|
|
2450
|
+
"summary": "List the attachments (file, item, reference) on a single Outlook calendar event. Ships an opinionated default `--select=id,name,contentType,size,isInline` so an LLM doesn't accidentally pull multi-MB `contentBytes` for every attachment. The `@odata.type` discriminator is always returned by Graph regardless of `$select` (and Graph rejects asking for it explicitly). To read one, call `convert-calendar-event-attachment-to-markdown` (or `convert-calendar-event-attachment-to-pdf` for slide / layout fidelity).",
|
|
2451
|
+
"category": "calendar",
|
|
2452
|
+
"graphMethod": "GET",
|
|
2453
|
+
"graphPathTemplate": "/me/events/{event-id}/attachments",
|
|
2454
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/event-list-attachments",
|
|
2455
|
+
"options": [
|
|
2456
|
+
{
|
|
2457
|
+
"name": "event-id",
|
|
2458
|
+
"key": "eventId",
|
|
2459
|
+
"required": true,
|
|
2460
|
+
"aliases": [
|
|
2461
|
+
{
|
|
2462
|
+
"name": "id",
|
|
2463
|
+
"key": "id"
|
|
2464
|
+
}
|
|
2465
|
+
],
|
|
2466
|
+
"description": "Outlook calendar event ID. Returned by `ask-marcel list-calendar-events` or `get-calendar-event`."
|
|
2467
|
+
},
|
|
2468
|
+
{
|
|
2469
|
+
"name": "top",
|
|
2470
|
+
"key": "top",
|
|
2471
|
+
"required": false,
|
|
2472
|
+
"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."
|
|
2473
|
+
},
|
|
2474
|
+
{
|
|
2475
|
+
"name": "skip",
|
|
2476
|
+
"key": "skip",
|
|
2477
|
+
"required": false,
|
|
2478
|
+
"description": "OData $skip: skip the first N items before returning results (non-negative integer). Useful with $top for offset paging."
|
|
2479
|
+
},
|
|
2480
|
+
{
|
|
2481
|
+
"name": "select",
|
|
2482
|
+
"key": "select",
|
|
2483
|
+
"required": false,
|
|
2484
|
+
"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`."
|
|
2485
|
+
},
|
|
2486
|
+
{
|
|
2487
|
+
"name": "filter",
|
|
2488
|
+
"key": "filter",
|
|
2489
|
+
"required": false,
|
|
2490
|
+
"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."
|
|
2491
|
+
},
|
|
2492
|
+
{
|
|
2493
|
+
"name": "orderby",
|
|
2494
|
+
"key": "orderby",
|
|
2495
|
+
"required": false,
|
|
2496
|
+
"description": "OData $orderby: sort expression with optional asc/desc (e.g. `receivedDateTime desc`). Some Graph filter combinations are rejected; remove $orderby if InefficientFilter occurs."
|
|
2497
|
+
},
|
|
2498
|
+
{
|
|
2499
|
+
"name": "expand",
|
|
2500
|
+
"key": "expand",
|
|
2501
|
+
"required": false,
|
|
2502
|
+
"description": "OData $expand: navigation properties to include inline (e.g. `attachments`). Increases response size; use sparingly."
|
|
2503
|
+
}
|
|
2504
|
+
],
|
|
2505
|
+
"example": "ask-marcel list-calendar-event-attachments --event-id 'AAMkAGI2...'",
|
|
2506
|
+
"responseShape": "collection of Microsoft Graph `attachment` resources under `value[]` (slim metadata by default — see summary). Graph always includes `@odata.type` and `@odata.mediaContentType` on every entry regardless of `--select` — that discriminator is what the attachment-converting commands branch on.",
|
|
2507
|
+
"pagination": true
|
|
2508
|
+
},
|
|
1751
2509
|
{
|
|
1752
2510
|
"name": "list-calendar-event-instances",
|
|
1753
2511
|
"summary": "List the individual occurrences of a recurring calendar event over a date range. Both ISO date-time params are required by Graph. `--calendar-id` is optional and defaults to `primary` (the signed-in user’s default calendar) — most callers know the event-id but not which calendar it lives in. Pass an explicit `--calendar-id` only when targeting a non-default calendar.",
|
|
@@ -1773,19 +2531,37 @@
|
|
|
1773
2531
|
"name": "event-id",
|
|
1774
2532
|
"key": "eventId",
|
|
1775
2533
|
"required": true,
|
|
2534
|
+
"aliases": [
|
|
2535
|
+
{
|
|
2536
|
+
"name": "id",
|
|
2537
|
+
"key": "id"
|
|
2538
|
+
}
|
|
2539
|
+
],
|
|
1776
2540
|
"description": "Recurring event ID. Returned by `ask-marcel list-specific-calendar-events`."
|
|
1777
2541
|
},
|
|
1778
2542
|
{
|
|
1779
2543
|
"name": "start-date-time",
|
|
1780
2544
|
"key": "startDateTime",
|
|
1781
2545
|
"required": true,
|
|
1782
|
-
"
|
|
2546
|
+
"aliases": [
|
|
2547
|
+
{
|
|
2548
|
+
"name": "start",
|
|
2549
|
+
"key": "start"
|
|
2550
|
+
}
|
|
2551
|
+
],
|
|
2552
|
+
"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)."
|
|
1783
2553
|
},
|
|
1784
2554
|
{
|
|
1785
2555
|
"name": "end-date-time",
|
|
1786
2556
|
"key": "endDateTime",
|
|
1787
2557
|
"required": true,
|
|
1788
|
-
"
|
|
2558
|
+
"aliases": [
|
|
2559
|
+
{
|
|
2560
|
+
"name": "end",
|
|
2561
|
+
"key": "end"
|
|
2562
|
+
}
|
|
2563
|
+
],
|
|
2564
|
+
"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)."
|
|
1789
2565
|
},
|
|
1790
2566
|
{
|
|
1791
2567
|
"name": "top",
|
|
@@ -1908,6 +2684,12 @@
|
|
|
1908
2684
|
"name": "calendar-group-id",
|
|
1909
2685
|
"key": "calendarGroupId",
|
|
1910
2686
|
"required": true,
|
|
2687
|
+
"aliases": [
|
|
2688
|
+
{
|
|
2689
|
+
"name": "id",
|
|
2690
|
+
"key": "id"
|
|
2691
|
+
}
|
|
2692
|
+
],
|
|
1911
2693
|
"description": "Calendar group ID. Returned by `list-calendar-groups`."
|
|
1912
2694
|
},
|
|
1913
2695
|
{
|
|
@@ -2002,7 +2784,7 @@
|
|
|
2002
2784
|
},
|
|
2003
2785
|
{
|
|
2004
2786
|
"name": "list-calendar-view",
|
|
2005
|
-
"summary": "List the signed-in user
|
|
2787
|
+
"summary": "List the signed-in user's default-calendar events with recurrence expanded into individual occurrences in a date range. Both date-time params accept strict ISO 8601 (`2026-04-01T00:00:00Z`) AND the CLI's relative shapes (`7d`, `today`, `monday`, `start-of-month`, …) so a question like \"what's on my calendar this week\" no longer requires the LLM to compute timestamps by hand.",
|
|
2006
2788
|
"category": "calendar",
|
|
2007
2789
|
"graphMethod": "GET",
|
|
2008
2790
|
"graphPathTemplate": "/me/calendarView?startDateTime={start-date-time}&endDateTime={end-date-time}",
|
|
@@ -2012,13 +2794,25 @@
|
|
|
2012
2794
|
"name": "start-date-time",
|
|
2013
2795
|
"key": "startDateTime",
|
|
2014
2796
|
"required": true,
|
|
2015
|
-
"
|
|
2797
|
+
"aliases": [
|
|
2798
|
+
{
|
|
2799
|
+
"name": "start",
|
|
2800
|
+
"key": "start"
|
|
2801
|
+
}
|
|
2802
|
+
],
|
|
2803
|
+
"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)."
|
|
2016
2804
|
},
|
|
2017
2805
|
{
|
|
2018
2806
|
"name": "end-date-time",
|
|
2019
2807
|
"key": "endDateTime",
|
|
2020
2808
|
"required": true,
|
|
2021
|
-
"
|
|
2809
|
+
"aliases": [
|
|
2810
|
+
{
|
|
2811
|
+
"name": "end",
|
|
2812
|
+
"key": "end"
|
|
2813
|
+
}
|
|
2814
|
+
],
|
|
2815
|
+
"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)."
|
|
2022
2816
|
},
|
|
2023
2817
|
{
|
|
2024
2818
|
"name": "top",
|
|
@@ -2057,7 +2851,7 @@
|
|
|
2057
2851
|
"description": "OData $expand: navigation properties to include inline (e.g. `attachments`). Increases response size; use sparingly."
|
|
2058
2852
|
}
|
|
2059
2853
|
],
|
|
2060
|
-
"example": "ask-marcel list-calendar-view --start-date-time '
|
|
2854
|
+
"example": "ask-marcel list-calendar-view --start-date-time 'start-of-week' --end-date-time 'end-of-week'",
|
|
2061
2855
|
"responseShape": "collection of Microsoft Graph `event` resources (single occurrences) under `value[]`"
|
|
2062
2856
|
},
|
|
2063
2857
|
{
|
|
@@ -2072,13 +2866,25 @@
|
|
|
2072
2866
|
"name": "start-date-time",
|
|
2073
2867
|
"key": "startDateTime",
|
|
2074
2868
|
"required": true,
|
|
2075
|
-
"
|
|
2869
|
+
"aliases": [
|
|
2870
|
+
{
|
|
2871
|
+
"name": "start",
|
|
2872
|
+
"key": "start"
|
|
2873
|
+
}
|
|
2874
|
+
],
|
|
2875
|
+
"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)."
|
|
2076
2876
|
},
|
|
2077
2877
|
{
|
|
2078
2878
|
"name": "end-date-time",
|
|
2079
2879
|
"key": "endDateTime",
|
|
2080
2880
|
"required": true,
|
|
2081
|
-
"
|
|
2881
|
+
"aliases": [
|
|
2882
|
+
{
|
|
2883
|
+
"name": "end",
|
|
2884
|
+
"key": "end"
|
|
2885
|
+
}
|
|
2886
|
+
],
|
|
2887
|
+
"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)."
|
|
2082
2888
|
},
|
|
2083
2889
|
{
|
|
2084
2890
|
"name": "top",
|
|
@@ -2152,6 +2958,12 @@
|
|
|
2152
2958
|
"name": "chat-id",
|
|
2153
2959
|
"key": "chatId",
|
|
2154
2960
|
"required": true,
|
|
2961
|
+
"aliases": [
|
|
2962
|
+
{
|
|
2963
|
+
"name": "id",
|
|
2964
|
+
"key": "id"
|
|
2965
|
+
}
|
|
2966
|
+
],
|
|
2155
2967
|
"description": "Microsoft Teams chat ID, e.g. `19:abc...@thread.v2`. Source the ID via `ask-marcel 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`."
|
|
2156
2968
|
},
|
|
2157
2969
|
{
|
|
@@ -2175,11 +2987,12 @@
|
|
|
2175
2987
|
],
|
|
2176
2988
|
"example": "ask-marcel list-chat-members --chat-id '19:abc...@thread.v2'",
|
|
2177
2989
|
"responseShape": "collection of Microsoft Graph `conversationMember` resources under `value[]`",
|
|
2178
|
-
"pagination": true
|
|
2990
|
+
"pagination": true,
|
|
2991
|
+
"needsElevatedToken": true
|
|
2179
2992
|
},
|
|
2180
2993
|
{
|
|
2181
2994
|
"name": "list-chats",
|
|
2182
|
-
"summary": "List the signed-in user's Microsoft Teams chats (1:1, group, and meeting chats).
|
|
2995
|
+
"summary": "List the signed-in user's Microsoft Teams chats (1:1, group, and meeting chats). The CLI ships a slim default `--select=id,topic,chatType,createdDateTime,lastUpdatedDateTime`; pass `--select id,topic,webUrl,...` to widen. Returns chat metadata only — reading chat *messages* needs `Chat.Read*` which neither token grants. Requires the M365ChatClient elevated token captured at login (the basic Teams web client token lacks `Chat.ReadBasic`). Graph rejects `$orderby` and hangs on `$expand` for this endpoint, so the CLI advertises only the subset Graph honours (`--top`, `--skip`, `--select`, `--filter`).",
|
|
2183
2996
|
"category": "chats",
|
|
2184
2997
|
"graphMethod": "GET",
|
|
2185
2998
|
"graphPathTemplate": "/me/chats",
|
|
@@ -2211,8 +3024,9 @@
|
|
|
2211
3024
|
}
|
|
2212
3025
|
],
|
|
2213
3026
|
"example": "ask-marcel list-chats",
|
|
2214
|
-
"responseShape": "collection of Microsoft Graph `chat` resources under `value[]`",
|
|
2215
|
-
"pagination": true
|
|
3027
|
+
"responseShape": "collection of Microsoft Graph `chat` resources under `value[]`, each projected to the default `--select` set (or, when overridden, to the requested fields).",
|
|
3028
|
+
"pagination": true,
|
|
3029
|
+
"needsElevatedToken": true
|
|
2216
3030
|
},
|
|
2217
3031
|
{
|
|
2218
3032
|
"name": "list-conversation-messages",
|
|
@@ -2226,6 +3040,12 @@
|
|
|
2226
3040
|
"name": "conversation-id",
|
|
2227
3041
|
"key": "conversationId",
|
|
2228
3042
|
"required": true,
|
|
3043
|
+
"aliases": [
|
|
3044
|
+
{
|
|
3045
|
+
"name": "id",
|
|
3046
|
+
"key": "id"
|
|
3047
|
+
}
|
|
3048
|
+
],
|
|
2229
3049
|
"description": "Outlook `conversationId` of any message in the thread (returned by every mail-listing command and by `get-mail-message`)."
|
|
2230
3050
|
},
|
|
2231
3051
|
{
|
|
@@ -2269,7 +3089,7 @@
|
|
|
2269
3089
|
"name": "drive-id",
|
|
2270
3090
|
"key": "driveId",
|
|
2271
3091
|
"required": true,
|
|
2272
|
-
"description": "Microsoft Graph drive ID.
|
|
3092
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
2273
3093
|
},
|
|
2274
3094
|
{
|
|
2275
3095
|
"name": "item-id",
|
|
@@ -2324,7 +3144,7 @@
|
|
|
2324
3144
|
"name": "drive-id",
|
|
2325
3145
|
"key": "driveId",
|
|
2326
3146
|
"required": true,
|
|
2327
|
-
"description": "OneDrive
|
|
3147
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
2328
3148
|
},
|
|
2329
3149
|
{
|
|
2330
3150
|
"name": "item-id",
|
|
@@ -2369,7 +3189,7 @@
|
|
|
2369
3189
|
},
|
|
2370
3190
|
{
|
|
2371
3191
|
"name": "list-drive-item-versions",
|
|
2372
|
-
"summary": "List the historical versions of a OneDrive / SharePoint file (each save creates a new version). Note: each version's `id` is a stringified float like `\"79.0\"` (NOT an integer like `79`) — pass it literally to
|
|
3192
|
+
"summary": "List the historical versions of a OneDrive / SharePoint file (each save creates a new version). Note: each version's `id` is a stringified float like `\"79.0\"` (NOT an integer like `79`) — pass it literally to the `download-drive-item-version` command (it accepts an `original | pdf | markdown` format selector); numeric coercion silently fails because Graph rejects `79` against a path templated for stringified floats.",
|
|
2373
3193
|
"category": "drive",
|
|
2374
3194
|
"graphMethod": "GET",
|
|
2375
3195
|
"graphPathTemplate": "/drives/{drive-id}/items/{item-id}/versions",
|
|
@@ -2483,7 +3303,7 @@
|
|
|
2483
3303
|
"name": "drive-id",
|
|
2484
3304
|
"key": "driveId",
|
|
2485
3305
|
"required": true,
|
|
2486
|
-
"description": "OneDrive
|
|
3306
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
2487
3307
|
},
|
|
2488
3308
|
{
|
|
2489
3309
|
"name": "item-id",
|
|
@@ -2544,7 +3364,7 @@
|
|
|
2544
3364
|
"name": "drive-id",
|
|
2545
3365
|
"key": "driveId",
|
|
2546
3366
|
"required": true,
|
|
2547
|
-
"description": "OneDrive
|
|
3367
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
2548
3368
|
},
|
|
2549
3369
|
{
|
|
2550
3370
|
"name": "item-id",
|
|
@@ -2605,7 +3425,7 @@
|
|
|
2605
3425
|
"name": "drive-id",
|
|
2606
3426
|
"key": "driveId",
|
|
2607
3427
|
"required": true,
|
|
2608
|
-
"description": "Microsoft Graph drive ID containing the workbook.
|
|
3428
|
+
"description": "Microsoft Graph drive ID containing the workbook. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
2609
3429
|
},
|
|
2610
3430
|
{
|
|
2611
3431
|
"name": "item-id",
|
|
@@ -2660,7 +3480,7 @@
|
|
|
2660
3480
|
"name": "drive-id",
|
|
2661
3481
|
"key": "driveId",
|
|
2662
3482
|
"required": true,
|
|
2663
|
-
"description": "Microsoft Graph drive ID containing the workbook.
|
|
3483
|
+
"description": "Microsoft Graph drive ID containing the workbook. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
2664
3484
|
},
|
|
2665
3485
|
{
|
|
2666
3486
|
"name": "item-id",
|
|
@@ -2709,7 +3529,7 @@
|
|
|
2709
3529
|
"name": "drive-id",
|
|
2710
3530
|
"key": "driveId",
|
|
2711
3531
|
"required": true,
|
|
2712
|
-
"description": "OneDrive
|
|
3532
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
2713
3533
|
},
|
|
2714
3534
|
{
|
|
2715
3535
|
"name": "item-id",
|
|
@@ -2779,7 +3599,7 @@
|
|
|
2779
3599
|
"name": "drive-id",
|
|
2780
3600
|
"key": "driveId",
|
|
2781
3601
|
"required": true,
|
|
2782
|
-
"description": "OneDrive
|
|
3602
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
2783
3603
|
},
|
|
2784
3604
|
{
|
|
2785
3605
|
"name": "item-id",
|
|
@@ -2849,7 +3669,7 @@
|
|
|
2849
3669
|
"name": "drive-id",
|
|
2850
3670
|
"key": "driveId",
|
|
2851
3671
|
"required": true,
|
|
2852
|
-
"description": "Microsoft Graph drive ID containing the workbook.
|
|
3672
|
+
"description": "Microsoft Graph drive ID containing the workbook. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
2853
3673
|
},
|
|
2854
3674
|
{
|
|
2855
3675
|
"name": "item-id",
|
|
@@ -2941,7 +3761,7 @@
|
|
|
2941
3761
|
"name": "drive-id",
|
|
2942
3762
|
"key": "driveId",
|
|
2943
3763
|
"required": true,
|
|
2944
|
-
"description": "Microsoft Graph drive ID.
|
|
3764
|
+
"description": "Microsoft Graph drive ID. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
2945
3765
|
},
|
|
2946
3766
|
{
|
|
2947
3767
|
"name": "item-id",
|
|
@@ -3045,19 +3865,37 @@
|
|
|
3045
3865
|
"name": "group-id",
|
|
3046
3866
|
"key": "groupId",
|
|
3047
3867
|
"required": true,
|
|
3868
|
+
"aliases": [
|
|
3869
|
+
{
|
|
3870
|
+
"name": "id",
|
|
3871
|
+
"key": "id"
|
|
3872
|
+
}
|
|
3873
|
+
],
|
|
3048
3874
|
"description": "Azure AD group object ID for a unified (Microsoft 365) group."
|
|
3049
3875
|
},
|
|
3050
3876
|
{
|
|
3051
3877
|
"name": "start-date-time",
|
|
3052
3878
|
"key": "startDateTime",
|
|
3053
3879
|
"required": true,
|
|
3054
|
-
"
|
|
3880
|
+
"aliases": [
|
|
3881
|
+
{
|
|
3882
|
+
"name": "start",
|
|
3883
|
+
"key": "start"
|
|
3884
|
+
}
|
|
3885
|
+
],
|
|
3886
|
+
"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)."
|
|
3055
3887
|
},
|
|
3056
3888
|
{
|
|
3057
3889
|
"name": "end-date-time",
|
|
3058
3890
|
"key": "endDateTime",
|
|
3059
3891
|
"required": true,
|
|
3060
|
-
"
|
|
3892
|
+
"aliases": [
|
|
3893
|
+
{
|
|
3894
|
+
"name": "end",
|
|
3895
|
+
"key": "end"
|
|
3896
|
+
}
|
|
3897
|
+
],
|
|
3898
|
+
"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)."
|
|
3061
3899
|
},
|
|
3062
3900
|
{
|
|
3063
3901
|
"name": "top",
|
|
@@ -3112,6 +3950,12 @@
|
|
|
3112
3950
|
"name": "group-id",
|
|
3113
3951
|
"key": "groupId",
|
|
3114
3952
|
"required": true,
|
|
3953
|
+
"aliases": [
|
|
3954
|
+
{
|
|
3955
|
+
"name": "id",
|
|
3956
|
+
"key": "id"
|
|
3957
|
+
}
|
|
3958
|
+
],
|
|
3115
3959
|
"description": "Azure AD group object ID for a unified (Microsoft 365) group."
|
|
3116
3960
|
},
|
|
3117
3961
|
{
|
|
@@ -3167,6 +4011,12 @@
|
|
|
3167
4011
|
"name": "group-id",
|
|
3168
4012
|
"key": "groupId",
|
|
3169
4013
|
"required": true,
|
|
4014
|
+
"aliases": [
|
|
4015
|
+
{
|
|
4016
|
+
"name": "id",
|
|
4017
|
+
"key": "id"
|
|
4018
|
+
}
|
|
4019
|
+
],
|
|
3170
4020
|
"description": "Azure AD group object ID for a unified (Microsoft 365) group. Use `list-groups` to find one."
|
|
3171
4021
|
},
|
|
3172
4022
|
{
|
|
@@ -3222,6 +4072,12 @@
|
|
|
3222
4072
|
"name": "group-id",
|
|
3223
4073
|
"key": "groupId",
|
|
3224
4074
|
"required": true,
|
|
4075
|
+
"aliases": [
|
|
4076
|
+
{
|
|
4077
|
+
"name": "id",
|
|
4078
|
+
"key": "id"
|
|
4079
|
+
}
|
|
4080
|
+
],
|
|
3225
4081
|
"description": "Azure AD group object ID. Use `list-groups` to find one."
|
|
3226
4082
|
},
|
|
3227
4083
|
{
|
|
@@ -3277,6 +4133,12 @@
|
|
|
3277
4133
|
"name": "group-id",
|
|
3278
4134
|
"key": "groupId",
|
|
3279
4135
|
"required": true,
|
|
4136
|
+
"aliases": [
|
|
4137
|
+
{
|
|
4138
|
+
"name": "id",
|
|
4139
|
+
"key": "id"
|
|
4140
|
+
}
|
|
4141
|
+
],
|
|
3280
4142
|
"description": "Azure AD group object ID. Use `list-groups` to find one."
|
|
3281
4143
|
},
|
|
3282
4144
|
{
|
|
@@ -3332,6 +4194,12 @@
|
|
|
3332
4194
|
"name": "group-id",
|
|
3333
4195
|
"key": "groupId",
|
|
3334
4196
|
"required": true,
|
|
4197
|
+
"aliases": [
|
|
4198
|
+
{
|
|
4199
|
+
"name": "id",
|
|
4200
|
+
"key": "id"
|
|
4201
|
+
}
|
|
4202
|
+
],
|
|
3335
4203
|
"description": "Azure AD group object ID for a unified (Microsoft 365) group."
|
|
3336
4204
|
},
|
|
3337
4205
|
{
|
|
@@ -3481,6 +4349,10 @@
|
|
|
3481
4349
|
"required": true,
|
|
3482
4350
|
"description": "todoTaskList ID. Returned by `ask-marcel 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.",
|
|
3483
4351
|
"aliases": [
|
|
4352
|
+
{
|
|
4353
|
+
"name": "id",
|
|
4354
|
+
"key": "id"
|
|
4355
|
+
},
|
|
3484
4356
|
{
|
|
3485
4357
|
"name": "task-list-id",
|
|
3486
4358
|
"key": "taskListId"
|
|
@@ -3556,7 +4428,13 @@
|
|
|
3556
4428
|
"name": "message-id",
|
|
3557
4429
|
"key": "messageId",
|
|
3558
4430
|
"required": true,
|
|
3559
|
-
"
|
|
4431
|
+
"aliases": [
|
|
4432
|
+
{
|
|
4433
|
+
"name": "id",
|
|
4434
|
+
"key": "id"
|
|
4435
|
+
}
|
|
4436
|
+
],
|
|
4437
|
+
"description": "Outlook message ID. Returned by `ask-marcel list-mail-messages` or `list-mail-folder-messages`. Accepts `--id` as an alias."
|
|
3560
4438
|
},
|
|
3561
4439
|
{
|
|
3562
4440
|
"name": "top",
|
|
@@ -3611,6 +4489,12 @@
|
|
|
3611
4489
|
"name": "mail-folder-id",
|
|
3612
4490
|
"key": "mailFolderId",
|
|
3613
4491
|
"required": true,
|
|
4492
|
+
"aliases": [
|
|
4493
|
+
{
|
|
4494
|
+
"name": "id",
|
|
4495
|
+
"key": "id"
|
|
4496
|
+
}
|
|
4497
|
+
],
|
|
3614
4498
|
"description": "mailFolder ID. Returned by `ask-marcel list-mail-folders`. Well-known names also work, e.g. `inbox`, `sentitems`, `drafts`."
|
|
3615
4499
|
},
|
|
3616
4500
|
{
|
|
@@ -3666,6 +4550,12 @@
|
|
|
3666
4550
|
"name": "mail-folder-id",
|
|
3667
4551
|
"key": "mailFolderId",
|
|
3668
4552
|
"required": true,
|
|
4553
|
+
"aliases": [
|
|
4554
|
+
{
|
|
4555
|
+
"name": "id",
|
|
4556
|
+
"key": "id"
|
|
4557
|
+
}
|
|
4558
|
+
],
|
|
3669
4559
|
"description": "mailFolder ID. Returned by `ask-marcel list-mail-folders`. Well-known names also work, e.g. `inbox`, `sentitems`, `drafts`."
|
|
3670
4560
|
},
|
|
3671
4561
|
{
|
|
@@ -3721,6 +4611,12 @@
|
|
|
3721
4611
|
"name": "mail-folder-id",
|
|
3722
4612
|
"key": "mailFolderId",
|
|
3723
4613
|
"required": true,
|
|
4614
|
+
"aliases": [
|
|
4615
|
+
{
|
|
4616
|
+
"name": "id",
|
|
4617
|
+
"key": "id"
|
|
4618
|
+
}
|
|
4619
|
+
],
|
|
3724
4620
|
"description": "Mail folder ID or well-known name (`inbox`, `archive`, `sentitems`, `deleteditems`, `junkemail`, `drafts`). Returned by `list-mail-folders`."
|
|
3725
4621
|
},
|
|
3726
4622
|
{
|
|
@@ -3827,7 +4723,7 @@
|
|
|
3827
4723
|
},
|
|
3828
4724
|
{
|
|
3829
4725
|
"name": "list-mail-messages",
|
|
3830
|
-
"summary": "List the most recent messages from across the signed-in user
|
|
4726
|
+
"summary": "List the most recent messages from across the signed-in user's entire Outlook mailbox (every folder including Sent, Archive, Junk; default sort `receivedDateTime` desc). The CLI ships a slim default `--select=id,subject,from,toRecipients,ccRecipients,receivedDateTime,hasAttachments,isRead,importance,bodyPreview` so a page of 25 messages stays ~30-60 KB instead of ~1 MB. Pass `--select id,subject,body` (or any other comma-separated field list) to override. Use `list-mail-folder-messages` to scope to a single folder such as Inbox.",
|
|
3831
4727
|
"category": "mail",
|
|
3832
4728
|
"graphMethod": "GET",
|
|
3833
4729
|
"graphPathTemplate": "/me/messages",
|
|
@@ -3871,7 +4767,7 @@
|
|
|
3871
4767
|
}
|
|
3872
4768
|
],
|
|
3873
4769
|
"example": "ask-marcel list-mail-messages",
|
|
3874
|
-
"responseShape": "collection of Microsoft Graph `message` resources under `value[]`",
|
|
4770
|
+
"responseShape": "collection of Microsoft Graph `message` resources under `value[]`, each projected to the default `--select` set (or the requested fields when overridden). The default omits `body`, `internetMessageHeaders`, and `uniqueBody`.",
|
|
3875
4771
|
"pagination": true
|
|
3876
4772
|
},
|
|
3877
4773
|
{
|
|
@@ -4051,6 +4947,12 @@
|
|
|
4051
4947
|
"name": "notebook-id",
|
|
4052
4948
|
"key": "notebookId",
|
|
4053
4949
|
"required": true,
|
|
4950
|
+
"aliases": [
|
|
4951
|
+
{
|
|
4952
|
+
"name": "id",
|
|
4953
|
+
"key": "id"
|
|
4954
|
+
}
|
|
4955
|
+
],
|
|
4054
4956
|
"description": "OneNote notebook ID. Returned by `ask-marcel list-onenote-notebooks`."
|
|
4055
4957
|
},
|
|
4056
4958
|
{
|
|
@@ -4157,6 +5059,10 @@
|
|
|
4157
5059
|
"required": true,
|
|
4158
5060
|
"description": "OneNote section ID. Returned by `ask-marcel list-onenote-notebook-sections` or `list-all-onenote-sections`.",
|
|
4159
5061
|
"aliases": [
|
|
5062
|
+
{
|
|
5063
|
+
"name": "id",
|
|
5064
|
+
"key": "id"
|
|
5065
|
+
},
|
|
4160
5066
|
{
|
|
4161
5067
|
"name": "section-id",
|
|
4162
5068
|
"key": "sectionId"
|
|
@@ -4229,6 +5135,10 @@
|
|
|
4229
5135
|
"required": true,
|
|
4230
5136
|
"description": "Planner plan ID. Returned in the `planId` field of any task from `ask-marcel list-planner-tasks`.",
|
|
4231
5137
|
"aliases": [
|
|
5138
|
+
{
|
|
5139
|
+
"name": "id",
|
|
5140
|
+
"key": "id"
|
|
5141
|
+
},
|
|
4232
5142
|
{
|
|
4233
5143
|
"name": "plan-id",
|
|
4234
5144
|
"key": "planId"
|
|
@@ -4260,6 +5170,10 @@
|
|
|
4260
5170
|
"required": true,
|
|
4261
5171
|
"description": "Planner plan ID. Returned in the `planId` field of any task from `ask-marcel list-planner-tasks`.",
|
|
4262
5172
|
"aliases": [
|
|
5173
|
+
{
|
|
5174
|
+
"name": "id",
|
|
5175
|
+
"key": "id"
|
|
5176
|
+
},
|
|
4263
5177
|
{
|
|
4264
5178
|
"name": "plan-id",
|
|
4265
5179
|
"key": "planId"
|
|
@@ -4384,7 +5298,7 @@
|
|
|
4384
5298
|
},
|
|
4385
5299
|
{
|
|
4386
5300
|
"name": "list-recently-used-insights",
|
|
4387
|
-
"summary": "List documents the signed-in user has *personally* used recently (Microsoft's machine-learning recency signal — distinct from `list-recent-files` which is the OneDrive recency feed).
|
|
5301
|
+
"summary": "List documents the signed-in user has *personally* used recently (Microsoft's machine-learning recency signal — distinct from `list-recent-files` which is the OneDrive recency feed). Each item carries a `lastUsed` (a `usageDetails` object) with `lastAccessedDateTime` + `lastModifiedDateTime`.",
|
|
4388
5302
|
"category": "drive",
|
|
4389
5303
|
"graphMethod": "GET",
|
|
4390
5304
|
"graphPathTemplate": "/me/insights/used",
|
|
@@ -4639,6 +5553,12 @@
|
|
|
4639
5553
|
"name": "user-id",
|
|
4640
5554
|
"key": "userId",
|
|
4641
5555
|
"required": true,
|
|
5556
|
+
"aliases": [
|
|
5557
|
+
{
|
|
5558
|
+
"name": "id",
|
|
5559
|
+
"key": "id"
|
|
5560
|
+
}
|
|
5561
|
+
],
|
|
4642
5562
|
"description": "Azure AD user ID or UPN whose calendar to read. Requires `Calendars.Read.Shared` access (granted by the calendar owner)."
|
|
4643
5563
|
},
|
|
4644
5564
|
{
|
|
@@ -4694,19 +5614,37 @@
|
|
|
4694
5614
|
"name": "user-id",
|
|
4695
5615
|
"key": "userId",
|
|
4696
5616
|
"required": true,
|
|
5617
|
+
"aliases": [
|
|
5618
|
+
{
|
|
5619
|
+
"name": "id",
|
|
5620
|
+
"key": "id"
|
|
5621
|
+
}
|
|
5622
|
+
],
|
|
4697
5623
|
"description": "Azure AD user ID or UPN of the calendar owner."
|
|
4698
5624
|
},
|
|
4699
5625
|
{
|
|
4700
5626
|
"name": "start-date-time",
|
|
4701
5627
|
"key": "startDateTime",
|
|
4702
5628
|
"required": true,
|
|
4703
|
-
"
|
|
5629
|
+
"aliases": [
|
|
5630
|
+
{
|
|
5631
|
+
"name": "start",
|
|
5632
|
+
"key": "start"
|
|
5633
|
+
}
|
|
5634
|
+
],
|
|
5635
|
+
"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)."
|
|
4704
5636
|
},
|
|
4705
5637
|
{
|
|
4706
5638
|
"name": "end-date-time",
|
|
4707
5639
|
"key": "endDateTime",
|
|
4708
5640
|
"required": true,
|
|
4709
|
-
"
|
|
5641
|
+
"aliases": [
|
|
5642
|
+
{
|
|
5643
|
+
"name": "end",
|
|
5644
|
+
"key": "end"
|
|
5645
|
+
}
|
|
5646
|
+
],
|
|
5647
|
+
"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)."
|
|
4710
5648
|
},
|
|
4711
5649
|
{
|
|
4712
5650
|
"name": "top",
|
|
@@ -4871,6 +5809,12 @@
|
|
|
4871
5809
|
"name": "user-id",
|
|
4872
5810
|
"key": "userId",
|
|
4873
5811
|
"required": true,
|
|
5812
|
+
"aliases": [
|
|
5813
|
+
{
|
|
5814
|
+
"name": "id",
|
|
5815
|
+
"key": "id"
|
|
5816
|
+
}
|
|
5817
|
+
],
|
|
4874
5818
|
"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)."
|
|
4875
5819
|
},
|
|
4876
5820
|
{
|
|
@@ -4916,7 +5860,7 @@
|
|
|
4916
5860
|
},
|
|
4917
5861
|
{
|
|
4918
5862
|
"name": "list-shared-with-me",
|
|
4919
|
-
"summary": "List driveItems shared with the signed-in user (typically by colleagues). Each entry includes the original drive + item ID under `remoteItem` so you can chain into `get-drive-item`, `download-
|
|
5863
|
+
"summary": "List driveItems shared with the signed-in user (typically by colleagues). Each entry includes the original drive + item ID under `remoteItem` so you can chain into `get-drive-item`, `download-drive-item-content`, etc. Note: Graph does NOT honor any OData query parameters on this endpoint (top/select/filter/etc. are all silently ignored), so the CLI does not advertise them. The full collection (~500 items in a typical tenant) is always returned; slice client-side or pair with the global output-path flag to land the raw JSON on disk.",
|
|
4920
5864
|
"category": "drive",
|
|
4921
5865
|
"graphMethod": "GET",
|
|
4922
5866
|
"graphPathTemplate": "/me/drive/sharedWithMe",
|
|
@@ -5040,6 +5984,12 @@
|
|
|
5040
5984
|
"name": "site-id",
|
|
5041
5985
|
"key": "siteId",
|
|
5042
5986
|
"required": true,
|
|
5987
|
+
"aliases": [
|
|
5988
|
+
{
|
|
5989
|
+
"name": "id",
|
|
5990
|
+
"key": "id"
|
|
5991
|
+
}
|
|
5992
|
+
],
|
|
5043
5993
|
"description": "SharePoint site ID. Returned by `ask-marcel search-sharepoint-sites-by-name`."
|
|
5044
5994
|
},
|
|
5045
5995
|
{
|
|
@@ -5147,6 +6097,12 @@
|
|
|
5147
6097
|
"name": "site-id",
|
|
5148
6098
|
"key": "siteId",
|
|
5149
6099
|
"required": true,
|
|
6100
|
+
"aliases": [
|
|
6101
|
+
{
|
|
6102
|
+
"name": "id",
|
|
6103
|
+
"key": "id"
|
|
6104
|
+
}
|
|
6105
|
+
],
|
|
5150
6106
|
"description": "SharePoint site ID. Returned by `ask-marcel search-sharepoint-sites-by-name`."
|
|
5151
6107
|
},
|
|
5152
6108
|
{
|
|
@@ -5257,6 +6213,12 @@
|
|
|
5257
6213
|
"name": "site-id",
|
|
5258
6214
|
"key": "siteId",
|
|
5259
6215
|
"required": true,
|
|
6216
|
+
"aliases": [
|
|
6217
|
+
{
|
|
6218
|
+
"name": "id",
|
|
6219
|
+
"key": "id"
|
|
6220
|
+
}
|
|
6221
|
+
],
|
|
5260
6222
|
"description": "SharePoint site ID."
|
|
5261
6223
|
},
|
|
5262
6224
|
{
|
|
@@ -5379,6 +6341,12 @@
|
|
|
5379
6341
|
"name": "site-id",
|
|
5380
6342
|
"key": "siteId",
|
|
5381
6343
|
"required": true,
|
|
6344
|
+
"aliases": [
|
|
6345
|
+
{
|
|
6346
|
+
"name": "id",
|
|
6347
|
+
"key": "id"
|
|
6348
|
+
}
|
|
6349
|
+
],
|
|
5382
6350
|
"description": "SharePoint site ID."
|
|
5383
6351
|
},
|
|
5384
6352
|
{
|
|
@@ -5428,6 +6396,12 @@
|
|
|
5428
6396
|
"name": "site-id",
|
|
5429
6397
|
"key": "siteId",
|
|
5430
6398
|
"required": true,
|
|
6399
|
+
"aliases": [
|
|
6400
|
+
{
|
|
6401
|
+
"name": "id",
|
|
6402
|
+
"key": "id"
|
|
6403
|
+
}
|
|
6404
|
+
],
|
|
5431
6405
|
"description": "SharePoint site ID. Returned by `search-sharepoint-sites-by-name`."
|
|
5432
6406
|
},
|
|
5433
6407
|
{
|
|
@@ -5458,6 +6432,12 @@
|
|
|
5458
6432
|
"name": "site-id",
|
|
5459
6433
|
"key": "siteId",
|
|
5460
6434
|
"required": true,
|
|
6435
|
+
"aliases": [
|
|
6436
|
+
{
|
|
6437
|
+
"name": "id",
|
|
6438
|
+
"key": "id"
|
|
6439
|
+
}
|
|
6440
|
+
],
|
|
5461
6441
|
"description": "SharePoint site ID."
|
|
5462
6442
|
},
|
|
5463
6443
|
{
|
|
@@ -5507,6 +6487,12 @@
|
|
|
5507
6487
|
"name": "calendar-id",
|
|
5508
6488
|
"key": "calendarId",
|
|
5509
6489
|
"required": true,
|
|
6490
|
+
"aliases": [
|
|
6491
|
+
{
|
|
6492
|
+
"name": "id",
|
|
6493
|
+
"key": "id"
|
|
6494
|
+
}
|
|
6495
|
+
],
|
|
5510
6496
|
"description": "Calendar ID, or the well-known short name `primary` / `default` for the signed-in user’s default calendar. Use `ask-marcel list-calendars` to discover non-default calendar IDs."
|
|
5511
6497
|
},
|
|
5512
6498
|
{
|
|
@@ -5562,19 +6548,37 @@
|
|
|
5562
6548
|
"name": "calendar-id",
|
|
5563
6549
|
"key": "calendarId",
|
|
5564
6550
|
"required": true,
|
|
6551
|
+
"aliases": [
|
|
6552
|
+
{
|
|
6553
|
+
"name": "id",
|
|
6554
|
+
"key": "id"
|
|
6555
|
+
}
|
|
6556
|
+
],
|
|
5565
6557
|
"description": "Calendar ID, or `primary` / `default` for the signed-in user’s default calendar. Returned by `ask-marcel list-calendars`."
|
|
5566
6558
|
},
|
|
5567
6559
|
{
|
|
5568
6560
|
"name": "start-date-time",
|
|
5569
6561
|
"key": "startDateTime",
|
|
5570
6562
|
"required": true,
|
|
5571
|
-
"
|
|
6563
|
+
"aliases": [
|
|
6564
|
+
{
|
|
6565
|
+
"name": "start",
|
|
6566
|
+
"key": "start"
|
|
6567
|
+
}
|
|
6568
|
+
],
|
|
6569
|
+
"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)."
|
|
5572
6570
|
},
|
|
5573
6571
|
{
|
|
5574
6572
|
"name": "end-date-time",
|
|
5575
6573
|
"key": "endDateTime",
|
|
5576
6574
|
"required": true,
|
|
5577
|
-
"
|
|
6575
|
+
"aliases": [
|
|
6576
|
+
{
|
|
6577
|
+
"name": "end",
|
|
6578
|
+
"key": "end"
|
|
6579
|
+
}
|
|
6580
|
+
],
|
|
6581
|
+
"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)."
|
|
5578
6582
|
},
|
|
5579
6583
|
{
|
|
5580
6584
|
"name": "top",
|
|
@@ -5628,6 +6632,12 @@
|
|
|
5628
6632
|
"name": "team-id",
|
|
5629
6633
|
"key": "teamId",
|
|
5630
6634
|
"required": true,
|
|
6635
|
+
"aliases": [
|
|
6636
|
+
{
|
|
6637
|
+
"name": "id",
|
|
6638
|
+
"key": "id"
|
|
6639
|
+
}
|
|
6640
|
+
],
|
|
5631
6641
|
"description": "Microsoft Teams team ID. Returned by `ask-marcel list-joined-teams`."
|
|
5632
6642
|
},
|
|
5633
6643
|
{
|
|
@@ -5648,7 +6658,7 @@
|
|
|
5648
6658
|
},
|
|
5649
6659
|
{
|
|
5650
6660
|
"name": "list-team-installed-apps",
|
|
5651
|
-
"summary": "List the Teams apps installed in a team. The CLI hard-pins `$expand=teamsAppDefinition` so every entry includes `displayName`, `version`, and `distributionMethod` (the bare endpoint returns only opaque IDs). Useful for surfacing which integrations are wired into a given team. Graph rejects
|
|
6661
|
+
"summary": "List the Teams apps installed in a team. The CLI hard-pins `$expand=teamsAppDefinition` so every entry includes `displayName`, `version`, and `distributionMethod` (the bare endpoint returns only opaque IDs). Useful for surfacing which integrations are wired into a given team. Graph rejects user-supplied OData query parameters on this endpoint (`Query option 'Top' is not allowed`) — so the standard OData flags are intentionally NOT exposed here. The response itself is still server-paginated via `@odata.nextLink` when the team has many installed apps; chain with `next-page` to walk subsequent pages.",
|
|
5652
6662
|
"category": "teams",
|
|
5653
6663
|
"graphMethod": "GET",
|
|
5654
6664
|
"graphPathTemplate": "/teams/{team-id}/installedApps?$expand=teamsAppDefinition",
|
|
@@ -5658,6 +6668,12 @@
|
|
|
5658
6668
|
"name": "team-id",
|
|
5659
6669
|
"key": "teamId",
|
|
5660
6670
|
"required": true,
|
|
6671
|
+
"aliases": [
|
|
6672
|
+
{
|
|
6673
|
+
"name": "id",
|
|
6674
|
+
"key": "id"
|
|
6675
|
+
}
|
|
6676
|
+
],
|
|
5661
6677
|
"description": "Microsoft Teams team ID."
|
|
5662
6678
|
}
|
|
5663
6679
|
],
|
|
@@ -5665,6 +6681,114 @@
|
|
|
5665
6681
|
"responseShape": "collection of Microsoft Graph `teamsAppInstallation` resources under `value[]`, each with an inline `teamsAppDefinition` (`displayName`, `version`, `distributionMethod`)",
|
|
5666
6682
|
"pagination": true
|
|
5667
6683
|
},
|
|
6684
|
+
{
|
|
6685
|
+
"name": "list-teams-chat-history",
|
|
6686
|
+
"summary": "Deep read of a Microsoft Teams chat's message history via the IC3 substrate (`teams.microsoft.com/api/chatsvc/<region>/v1/...`). Unlike `list-teams-chat-messages` (which caps at the 200 most recent messages with no working pagination cursor), this command follows the server-provided `_metadata.syncState` URL backward through history, fetching up to `--page-size` * `--max-pages` messages per invocation (default 200 * 20 = 4000). Uses the IC3-audience bearer captured at login (same Teams web client identity as the basic Teams token). The CLI ships a slim default projection — each message is reduced to `id, sequenceId, composetime, originalarrivaltime, messagetype, from, imdisplayname, content` and `content` is truncated to 4096 chars (with `truncated: true` and `originalContentChars` set on the affected entries). Pass `--full true` to opt out of projection and truncation; pass `--max-content-chars N` to override the truncation cap. **Best-effort, may break on Microsoft client updates** — the IC3 substrate is not in the public Microsoft Graph API. To page beyond `--max-pages`, take the response's `nextSyncState` and pass it back as `--sync-state` on the next call.",
|
|
6687
|
+
"category": "chats",
|
|
6688
|
+
"graphMethod": "GET",
|
|
6689
|
+
"graphPathTemplate": "https://teams.microsoft.com/api/chatsvc/{region}/v1/users/ME/conversations/{chat-id}/messages",
|
|
6690
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/chatmessage-list",
|
|
6691
|
+
"options": [
|
|
6692
|
+
{
|
|
6693
|
+
"name": "chat-id",
|
|
6694
|
+
"key": "chatId",
|
|
6695
|
+
"required": true,
|
|
6696
|
+
"aliases": [
|
|
6697
|
+
{
|
|
6698
|
+
"name": "id",
|
|
6699
|
+
"key": "id"
|
|
6700
|
+
}
|
|
6701
|
+
],
|
|
6702
|
+
"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`."
|
|
6703
|
+
},
|
|
6704
|
+
{
|
|
6705
|
+
"name": "sync-state",
|
|
6706
|
+
"key": "syncState",
|
|
6707
|
+
"required": false,
|
|
6708
|
+
"description": "Opaque pagination URL returned in the prior response's `nextSyncState` field. Pass it back to continue paging backward from where the previous invocation stopped. Omit on the first call."
|
|
6709
|
+
},
|
|
6710
|
+
{
|
|
6711
|
+
"name": "page-size",
|
|
6712
|
+
"key": "pageSize",
|
|
6713
|
+
"required": false,
|
|
6714
|
+
"description": "Messages per IC3 page (positive integer; default 200). Server may silently cap."
|
|
6715
|
+
},
|
|
6716
|
+
{
|
|
6717
|
+
"name": "max-pages",
|
|
6718
|
+
"key": "maxPages",
|
|
6719
|
+
"required": false,
|
|
6720
|
+
"description": "Safety cap on the backward walk (positive integer; default 20). Each page can return up to `--page-size` messages, so default ceiling is ~4000 messages or ~4 MB inline JSON per invocation. Raise carefully — response is buffered fully before returning."
|
|
6721
|
+
},
|
|
6722
|
+
{
|
|
6723
|
+
"name": "full",
|
|
6724
|
+
"key": "full",
|
|
6725
|
+
"required": false,
|
|
6726
|
+
"description": "Pass `--full true` to return the raw IC3 substrate shape (every field on every message, no truncation). Default (`--full false`, or omitted) projects each message down to `id, sequenceId, composetime, originalarrivaltime, messagetype, from, imdisplayname, content` — covering 'who said what, when' without the IC3 envelope noise."
|
|
6727
|
+
},
|
|
6728
|
+
{
|
|
6729
|
+
"name": "max-content-chars",
|
|
6730
|
+
"key": "maxContentChars",
|
|
6731
|
+
"required": false,
|
|
6732
|
+
"description": "When the slim projection is active (i.e. `--full` is not `true`), cap each message `content` at this many characters; messages cut at the cap also carry `truncated: true` and `originalContentChars` so a consumer can decide whether to re-fetch with `--full true`. Default 4096. Ignored when `--full true` is set."
|
|
6733
|
+
}
|
|
6734
|
+
],
|
|
6735
|
+
"example": "ask-marcel list-teams-chat-history --chat-id '19:abc...@unq.gbl.spaces' --max-pages 5",
|
|
6736
|
+
"responseShape": "`{ messages: [...], hasMore: boolean, pagesFetched: number, nextSyncState?: string, projection: 'slim' | 'full' }`. Slim projection (default) emits `{ id, sequenceId, composetime, originalarrivaltime, messagetype, from, imdisplayname, content }` per message, with `truncated: true` + `originalContentChars` on entries whose `content` exceeded `--max-content-chars` (default 4096). With `--full true`, returns the raw IC3 substrate shape: `id`, `sequenceId` (monotonic per-chat counter), `composetime`, `originalarrivaltime`, `messagetype`, `content`, `from`, `imdisplayname`, `properties.subject`, etc. **`hasMore: true`** means the safety cap was hit and there is older history beyond what was returned — chain a follow-up call with `--sync-state $(jq -r .data.nextSyncState <prev>)` to continue. **`hasMore: false`** means the chat's earliest message was reached. **Microsoft-internal schema — fields may change without notice.**",
|
|
6737
|
+
"needsSubstrateToken": true,
|
|
6738
|
+
"stability": "experimental"
|
|
6739
|
+
},
|
|
6740
|
+
{
|
|
6741
|
+
"name": "list-teams-chat-messages",
|
|
6742
|
+
"summary": "List the most recent messages in a single Microsoft Teams chat via the chat substrate. Companion to `list-teams-chats-with-messages` when the inlined `lastMessage` isn't deep enough. Uses the chatsvcagg-audience bearer captured at login. **Best-effort, may break on Microsoft client updates** — the chat substrate is not in the public Microsoft Graph API. **No pagination**: the route caps at the 200 most recent messages per chat and the CLI cannot reach older history (Teams web itself uses WebSockets for scrollback, and the official `Chat.Read` Graph scope that would enable paginated reads is outside the appid's scope ceiling).",
|
|
6743
|
+
"category": "chats",
|
|
6744
|
+
"graphMethod": "GET",
|
|
6745
|
+
"graphPathTemplate": "https://teams.microsoft.com/api/csa/{region}/api/v1/chats/{chat-id}/messages",
|
|
6746
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/chatmessage-list",
|
|
6747
|
+
"options": [
|
|
6748
|
+
{
|
|
6749
|
+
"name": "chat-id",
|
|
6750
|
+
"key": "chatId",
|
|
6751
|
+
"required": true,
|
|
6752
|
+
"aliases": [
|
|
6753
|
+
{
|
|
6754
|
+
"name": "id",
|
|
6755
|
+
"key": "id"
|
|
6756
|
+
}
|
|
6757
|
+
],
|
|
6758
|
+
"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`."
|
|
6759
|
+
}
|
|
6760
|
+
],
|
|
6761
|
+
"example": "ask-marcel list-teams-chat-messages --chat-id '19:abc...@unq.gbl.spaces'",
|
|
6762
|
+
"responseShape": "Substrate envelope: `{ messages: [...], messageToken: string }`. Returns up to the 200 most recent messages per chat — older history is NOT reachable via this endpoint. Each message has `id`, `from`, `imDisplayName`, `content`, `contentType`, `composeTime`, `originalArrivalTime`, `sequenceId`, etc. `messageToken` is returned for forward compatibility but is currently a static snapshot identifier (server ignores it as a pagination cursor). **Microsoft-internal schema — fields may change without notice.** For history older than the 200 most recent, use `list-teams-chat-history` (rides the IC3 substrate with a working syncState cursor).",
|
|
6763
|
+
"needsSubstrateToken": true,
|
|
6764
|
+
"stability": "experimental"
|
|
6765
|
+
},
|
|
6766
|
+
{
|
|
6767
|
+
"name": "list-teams-chats-with-messages",
|
|
6768
|
+
"summary": "List the signed-in user's Microsoft Teams chats with the last message body inlined per chat. Uses the chatsvcagg-audience bearer captured at login. Paginated via `continuationToken` (default page size 100; pass the response's `continuationToken` back as `--continuation-token` while `hasMoreData: true`). **Best-effort, may break on Microsoft client updates**: the chat substrate is not part of the public Microsoft Graph API; Microsoft can change route shapes without notice. Caller Graph scopes do NOT matter here; the substrate server gates access on the appid + identity, not on Graph scopes.",
|
|
6769
|
+
"category": "chats",
|
|
6770
|
+
"graphMethod": "GET",
|
|
6771
|
+
"graphPathTemplate": "https://teams.microsoft.com/api/csa/{region}/api/v3/teams/users/me/chats",
|
|
6772
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/chat-list",
|
|
6773
|
+
"options": [
|
|
6774
|
+
{
|
|
6775
|
+
"name": "page-size",
|
|
6776
|
+
"key": "pageSize",
|
|
6777
|
+
"required": false,
|
|
6778
|
+
"description": "Chats per page (positive integer; default 100, same value Teams web uses). Server may silently cap."
|
|
6779
|
+
},
|
|
6780
|
+
{
|
|
6781
|
+
"name": "continuation-token",
|
|
6782
|
+
"key": "continuationToken",
|
|
6783
|
+
"required": false,
|
|
6784
|
+
"description": "Opaque pagination cursor returned in the prior response's `continuationToken` field. Omit on the first call; loop until `hasMoreData` is false."
|
|
6785
|
+
}
|
|
6786
|
+
],
|
|
6787
|
+
"example": "ask-marcel list-teams-chats-with-messages --page-size 100",
|
|
6788
|
+
"responseShape": "`{ chats: [...], continuationToken?: string, hasMoreData?: boolean }`. Each chat carries `id`, `title`, `chatType`, `threadType`, `members[]` (with each member's `mri`, `displayName`, `email`), `createdAt`, AND `lastMessage` (the most recent message body inlined — `content`, `from`, `composeTime`, `imDisplayName`, etc.). When `hasMoreData: true`, chain a follow-up call with `--continuation-token \"$(jq -r .data.continuationToken <prev>)\"`. **Microsoft-internal schema — fields may change without notice; treat the response as semi-structured.**",
|
|
6789
|
+
"needsSubstrateToken": true,
|
|
6790
|
+
"stability": "experimental"
|
|
6791
|
+
},
|
|
5668
6792
|
{
|
|
5669
6793
|
"name": "list-todo-linked-resources",
|
|
5670
6794
|
"summary": "List the linked resources (URLs, emails, files) attached to a Microsoft To Do task.",
|
|
@@ -5793,6 +6917,10 @@
|
|
|
5793
6917
|
"required": true,
|
|
5794
6918
|
"description": "To Do task list ID. Returned by `ask-marcel list-todo-task-lists`.",
|
|
5795
6919
|
"aliases": [
|
|
6920
|
+
{
|
|
6921
|
+
"name": "id",
|
|
6922
|
+
"key": "id"
|
|
6923
|
+
},
|
|
5796
6924
|
{
|
|
5797
6925
|
"name": "task-list-id",
|
|
5798
6926
|
"key": "taskListId"
|
|
@@ -5858,6 +6986,10 @@
|
|
|
5858
6986
|
"required": true,
|
|
5859
6987
|
"description": "Microsoft To Do task list ID. Returned by `list-todo-task-lists`.",
|
|
5860
6988
|
"aliases": [
|
|
6989
|
+
{
|
|
6990
|
+
"name": "id",
|
|
6991
|
+
"key": "id"
|
|
6992
|
+
},
|
|
5861
6993
|
{
|
|
5862
6994
|
"name": "task-list-id",
|
|
5863
6995
|
"key": "taskListId"
|
|
@@ -5934,6 +7066,12 @@
|
|
|
5934
7066
|
"name": "user-id",
|
|
5935
7067
|
"key": "userId",
|
|
5936
7068
|
"required": true,
|
|
7069
|
+
"aliases": [
|
|
7070
|
+
{
|
|
7071
|
+
"name": "id",
|
|
7072
|
+
"key": "id"
|
|
7073
|
+
}
|
|
7074
|
+
],
|
|
5937
7075
|
"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)."
|
|
5938
7076
|
},
|
|
5939
7077
|
{
|
|
@@ -5998,14 +7136,14 @@
|
|
|
5998
7136
|
},
|
|
5999
7137
|
{
|
|
6000
7138
|
"name": "my-quick-context",
|
|
6001
|
-
"summary": "One-shot discovery for the IDs every other command needs. Issues
|
|
7139
|
+
"summary": "One-shot discovery for the IDs every other command needs, plus the user's job title and tenant timezone / locale / working-hours. Issues 9 Graph calls in parallel and returns what each succeeded for. Partial-result mode: only `/me` is load-bearing — if any other sub-call fails (missing license, scope, or tenant policy) the corresponding field is `undefined` but the rest are still returned. Replaces the audit's 5-call discovery chain — feed the IDs straight into `list-mail-folder-messages`, `list-folder-files`, `list-planner-tasks`, `list-onenote-notebook-sections`, etc. For Microsoft To Do lists call `list-todo-task-lists` on demand (intentionally dropped from this command's fan-out — the array of {id, displayName, wellknownListName} entries crowded the envelope with IDs an LLM rarely needs on first contact). Audit Jane-session §5.2: `tenantTimeZone` lets an LLM stop treating every datetime as UTC on first contact.",
|
|
6002
7140
|
"category": "meta",
|
|
6003
7141
|
"graphMethod": "GET",
|
|
6004
|
-
"graphPathTemplate": "(meta) parallel: /me, /me/drive, /me/mailFolders/inbox, /me/
|
|
7142
|
+
"graphPathTemplate": "(meta) parallel: /me, /me/drive, /me/mailFolders/inbox, /me/calendar, /me/planner/plans, /me/onenote/notebooks, /me/joinedTeams, /me/drive/recent, /me/mailboxSettings",
|
|
6005
7143
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/user-get",
|
|
6006
7144
|
"options": [],
|
|
6007
7145
|
"example": "ask-marcel my-quick-context",
|
|
6008
|
-
"responseShape": "{ user: { id, displayName, userPrincipalName, mail }, primaryDriveId?, inboxId?,
|
|
7146
|
+
"responseShape": "`{ user: { id, displayName, userPrincipalName, mail, jobTitle? }, primaryDriveId?, inboxId?, primaryCalendarId?, primaryPlannerPlanId?, defaultNotebookId?, firstJoinedTeamId?, recentDriveItemId?, tenantTimeZone?, tenantLocale?, tenantWorkingHours?: { start, end, timeZone? } }` — every field except `user.id` is optional and absent when its source call failed. `user.jobTitle` is the user's role string from Azure AD (e.g. \"Engineering Manager\"). `tenantTimeZone` is the Outlook timezone string (e.g. \"Romance Standard Time\", \"Pacific Standard Time\"); `tenantLocale` is the IETF tag (e.g. \"en-US\"). For Microsoft To Do lists, call `list-todo-task-lists` separately — they were dropped from this command's fan-out to keep the envelope LLM-tractable."
|
|
6009
7147
|
},
|
|
6010
7148
|
{
|
|
6011
7149
|
"name": "next-page",
|
|
@@ -6028,20 +7166,155 @@
|
|
|
6028
7166
|
"example": "ask-marcel next-page --url 'https://graph.microsoft.com/v1.0/me/messages?$skip=10'",
|
|
6029
7167
|
"responseShape": "same shape as the originating endpoint — `{ ok: true, data: { value: [...] }, nextLink: \"...\" }` with the cursor at envelope level."
|
|
6030
7168
|
},
|
|
7169
|
+
{
|
|
7170
|
+
"name": "read-mail-attachment",
|
|
7171
|
+
"summary": "Read an Outlook mail attachment whatever it is — one command that auto-routes by file type, preferring the content-type when the filename extension is misleading (a real `.jpg` that is actually a spreadsheet still converts), so a caller never has to choose between the convert-mail-attachment-* siblings. A `.zip` fileAttachment is unpacked and every entry converted (mirrors `convert-mail-attachment-zip`, returning the `{ count, files }` envelope; legacy GBK/CP437 names decoded). Any other attachment — docx/xlsx/pptx/odt/ods/odp + macro/template variants → markdown, csv → table, pdf → text layer (with `pageCount`), legacy .xls/.doc extracted, an inner Outlook .msg rendered recursively, plain text passed through, referenceAttachment resolved via `/shares`, and itemAttachment (embedded mail/event/contact) rendered — goes through the same dispatch as `convert-mail-attachment-to-markdown` (returning its `{ contentType, size, text }` envelope). Images, scanned/image-only PDFs, and legacy .ppt return an actionable 415 pointing at `convert-mail-attachment-to-pdf` + a vision model or `get-mail-attachment` for the raw bytes. Pass `--include-metadata true` to append Office side-channel metadata. Use the explicit `convert-mail-attachment-to-markdown` / `-to-pdf` / `-zip` siblings only when you need to force a specific output format.",
|
|
7172
|
+
"category": "mail",
|
|
7173
|
+
"graphMethod": "GET",
|
|
7174
|
+
"graphPathTemplate": "/me/messages/{message-id}/attachments/{attachment-id}",
|
|
7175
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/attachment-get",
|
|
7176
|
+
"options": [
|
|
7177
|
+
{
|
|
7178
|
+
"name": "message-id",
|
|
7179
|
+
"key": "messageId",
|
|
7180
|
+
"required": true,
|
|
7181
|
+
"description": "Outlook message ID. Returned by `list-mail-messages` or `list-mail-folder-messages`."
|
|
7182
|
+
},
|
|
7183
|
+
{
|
|
7184
|
+
"name": "attachment-id",
|
|
7185
|
+
"key": "attachmentId",
|
|
7186
|
+
"required": true,
|
|
7187
|
+
"description": "Attachment ID inside that message. Returned by `list-mail-attachments`."
|
|
7188
|
+
},
|
|
7189
|
+
{
|
|
7190
|
+
"name": "include-metadata",
|
|
7191
|
+
"key": "includeMetadata",
|
|
7192
|
+
"required": false,
|
|
7193
|
+
"description": "Pass `--include-metadata true` to append each converted Office file’s side-channel metadata block (docx / xlsx / pptx / OpenDocument). No-op on images, embedded items, and plain text.",
|
|
7194
|
+
"argumentHint": {
|
|
7195
|
+
"kind": "magicValue",
|
|
7196
|
+
"values": [
|
|
7197
|
+
"true",
|
|
7198
|
+
"false"
|
|
7199
|
+
]
|
|
7200
|
+
}
|
|
7201
|
+
}
|
|
7202
|
+
],
|
|
7203
|
+
"example": "ask-marcel read-mail-attachment --message-id 'AAMkAD...' --attachment-id 'AAMkAD...attach1'",
|
|
7204
|
+
"responseShape": "Polymorphic by attachment content-type. A zip → `{ count, files: [{ path, contentType, size, text } | { path, note }], truncated? }` (the convert-mail-attachment-zip shape). Everything else → `{ contentType: \"text/markdown\" | \"text/plain\", size, text, pageCount? }` (the convert-mail-attachment-to-markdown shape; `pageCount` present for PDF sources). Unsupported types (image / scanned PDF / legacy .ppt) return an api_error (415/400) naming the right next command.",
|
|
7205
|
+
"producesBytes": true
|
|
7206
|
+
},
|
|
7207
|
+
{
|
|
7208
|
+
"name": "resolve-calendar-link",
|
|
7209
|
+
"summary": "Parse a Microsoft Outlook calendar item link (the URL emitted by the \"Copy link\" / share action on a calendar event) into its `eventId`. Pure transformation — no Graph call. Pipe the result into `get-calendar-event` to fetch the event body. For Outlook mail message links use `resolve-mail-link` instead — this command rejects them with a pointer.",
|
|
7210
|
+
"category": "calendar",
|
|
7211
|
+
"graphMethod": "GET",
|
|
7212
|
+
"graphPathTemplate": "{url}",
|
|
7213
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/event-get",
|
|
7214
|
+
"options": [
|
|
7215
|
+
{
|
|
7216
|
+
"name": "url",
|
|
7217
|
+
"key": "url",
|
|
7218
|
+
"required": true,
|
|
7219
|
+
"description": "Outlook web URL for a single calendar item. Accepted hosts: `outlook.office.com`, `outlook.office365.com`, `outlook.live.com`. Accepted shapes: path-style (`/calendar/item/AAMkA...`) and OWA query-style with calendar path (`/owa/?itemid=AAMkA...&path=/calendar/item`). Mail links (`/mail/...` or `/owa/?itemid=...` without `path=/calendar`) are rejected with `cli_reject_mail_link_on_calendar_resolver` — use `resolve-mail-link` for those."
|
|
7220
|
+
}
|
|
7221
|
+
],
|
|
7222
|
+
"example": "ask-marcel resolve-calendar-link --url 'https://outlook.office.com/calendar/item/AAMkAGI2THVS...'",
|
|
7223
|
+
"responseShape": "`{ eventId: string }`. `eventId` is URL-decoded and ready to pass to `get-calendar-event --event-id <id>`."
|
|
7224
|
+
},
|
|
7225
|
+
{
|
|
7226
|
+
"name": "resolve-drive-share-link",
|
|
7227
|
+
"summary": "Encode a OneDrive / SharePoint sharing URL into the Graph `/shares/{token}` share token (`u!<base64url>` per [shares-get](https://learn.microsoft.com/en-us/graph/api/shares-get)). Pure transformation — no Graph call. Pipe the returned `graphPath` (`/shares/{token}/driveItem`) into a sibling lookup (`get-drive-item`, `download-drive-item-content`, `convert-mail-attachment-to-pdf`, etc.) once the file has been resolved to a `driveItem`. Accepts any `*.sharepoint.com` URL (tenant + `*-my.sharepoint.com` personal OneDrive) and Microsoft's short-link host `1drv.ms`.",
|
|
7228
|
+
"category": "drive",
|
|
7229
|
+
"graphMethod": "GET",
|
|
7230
|
+
"graphPathTemplate": "{url}",
|
|
7231
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/shares-get",
|
|
7232
|
+
"options": [
|
|
7233
|
+
{
|
|
7234
|
+
"name": "url",
|
|
7235
|
+
"key": "url",
|
|
7236
|
+
"required": true,
|
|
7237
|
+
"description": "A OneDrive / SharePoint sharing URL — the address from the \"Copy link\" / \"Share\" action in the OneDrive or SharePoint UI. Examples: `https://contoso.sharepoint.com/:b:/s/sitename/EaB1cD...`, `https://contoso-my.sharepoint.com/personal/user_contoso_com/Documents/file.pdf`, `https://1drv.ms/b/s!AbCdEfGh...`. The CLI does not follow the redirect on `1drv.ms` links — the short URL itself is encoded as the share token (Graph resolves it on the server side)."
|
|
7238
|
+
}
|
|
7239
|
+
],
|
|
7240
|
+
"example": "ask-marcel resolve-drive-share-link --url 'https://contoso.sharepoint.com/:b:/s/team/EaB1cD2eF...?e=abc'",
|
|
7241
|
+
"responseShape": "`{ shareToken: string, graphPath: string, originalUrl: string }`. `shareToken` is the `u!<base64url>` form. `graphPath` is the ready-to-use `/shares/{token}/driveItem` URL — pass it to `ask-marcel next-page --url <link>` for a one-shot driveItem fetch, or feed the `shareToken` into any future `/shares/{token}/...` endpoint. `originalUrl` is echoed back for round-trip confirmation."
|
|
7242
|
+
},
|
|
7243
|
+
{
|
|
7244
|
+
"name": "resolve-mail-link",
|
|
7245
|
+
"summary": "Parse a Microsoft Outlook web mail link (the URL emitted by the \"Copy link\" / address-bar share of an email) into its `messageId`. Pure transformation — no Graph call. Pipe the result into `get-mail-message` to fetch the body, or `convert-mail-to-markdown` to render it. For Outlook calendar links use `resolve-calendar-link` instead — this command rejects them with a pointer.",
|
|
7246
|
+
"category": "mail",
|
|
7247
|
+
"graphMethod": "GET",
|
|
7248
|
+
"graphPathTemplate": "{url}",
|
|
7249
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/message-get",
|
|
7250
|
+
"options": [
|
|
7251
|
+
{
|
|
7252
|
+
"name": "url",
|
|
7253
|
+
"key": "url",
|
|
7254
|
+
"required": true,
|
|
7255
|
+
"description": "Outlook web URL for a single mail message. Accepted hosts: `outlook.office.com`, `outlook.office365.com`, `outlook.live.com`. Accepted shapes: OWA query-style (`/owa/?itemid=AAMkA...` or `/owa/?ItemID=AAMkA...`), modern path-style (`/mail/inbox/id/AAMkA...`), legacy short (`/mail/AAMkA...`). Calendar links (`/calendar/item/...` or `?path=/calendar/item`) are rejected with `cli_reject_calendar_link_on_mail_resolver` — use `resolve-calendar-link` for those."
|
|
7256
|
+
}
|
|
7257
|
+
],
|
|
7258
|
+
"example": "ask-marcel resolve-mail-link --url 'https://outlook.office.com/mail/inbox/id/AAMkAGI2THVS...'",
|
|
7259
|
+
"responseShape": "`{ messageId: string }`. `messageId` is URL-decoded and ready to pass to `get-mail-message --message-id <id>` or `convert-mail-to-markdown --message-id <id>`."
|
|
7260
|
+
},
|
|
7261
|
+
{
|
|
7262
|
+
"name": "resolve-teams-link",
|
|
7263
|
+
"summary": "Parse a Microsoft Teams `Copy link` URL (the share link emitted by the message context menu in Teams) into its `chatId` + `messageId` components. Pure transformation — no Graph call. Pipe the result into `get-teams-chat-message` to fetch the message body, or into `list-teams-chat-history` to read the chat that contains it.",
|
|
7264
|
+
"category": "chats",
|
|
7265
|
+
"graphMethod": "GET",
|
|
7266
|
+
"graphPathTemplate": "{url}",
|
|
7267
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/chatmessage-get",
|
|
7268
|
+
"options": [
|
|
7269
|
+
{
|
|
7270
|
+
"name": "url",
|
|
7271
|
+
"key": "url",
|
|
7272
|
+
"required": true,
|
|
7273
|
+
"description": "Teams message link, copied from Teams web/desktop via the message's `Copy link` action. Expected shape: `https://teams.microsoft.com/l/message/<url-encoded-chat-id>/<message-id>?tenantId=...&groupId=...&ctx=...`"
|
|
7274
|
+
}
|
|
7275
|
+
],
|
|
7276
|
+
"example": "ask-marcel resolve-teams-link --url 'https://teams.microsoft.com/l/message/19%3A...%40unq.gbl.spaces/1700000000000?tenantId=...&groupId=...&ctx=chat'",
|
|
7277
|
+
"responseShape": "`{ chatId: string, messageId: string, tenantId?: string, groupId?: string, parentMessageId?: string, context?: string }`. `chatId` and `messageId` are URL-decoded and ready to pass to other commands. Optional fields are included only when the source URL carried them."
|
|
7278
|
+
},
|
|
6031
7279
|
{
|
|
6032
7280
|
"name": "scopes-check",
|
|
6033
|
-
"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).",
|
|
7281
|
+
"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 (added Jane-session §4) 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.",
|
|
6034
7282
|
"category": "meta",
|
|
6035
7283
|
"graphMethod": "GET",
|
|
6036
7284
|
"graphPathTemplate": "(meta) cached-token introspection — no Graph endpoint",
|
|
6037
7285
|
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/permissions-reference",
|
|
6038
7286
|
"options": [],
|
|
6039
7287
|
"example": "ask-marcel scopes-check",
|
|
6040
|
-
"responseShape": "{ scopes: string[], audience: string, expiresAt: string (ISO 8601) }"
|
|
7288
|
+
"responseShape": "`{ scopes: string[], audience: string, expiresAt: string (ISO 8601), expiresInSeconds: number }`. `expiresInSeconds` is negative when the cached token has already expired (run `login`); `audience` is the JWT `aud` claim (typically `https://graph.microsoft.com`)."
|
|
7289
|
+
},
|
|
7290
|
+
{
|
|
7291
|
+
"name": "search-all-accessible-sites",
|
|
7292
|
+
"summary": "Enumerate EVERY SharePoint site the signed-in user can access via the Microsoft Search index — far more than `search-sharepoint-sites-by-name`, which calls `GET /sites?search=` and returns a single capped page with no continuation. This command deep-pages the Search API (`POST /search/query` with `entityTypes: [\"site\"]`) using `from`/`size`, following the index's own `moreResultsAvailable` flag until exhausted (or the page ceiling of 60×25 = 1500 is reached, signalled by `truncated: true`), and dedupes site resources by id. The index is security-trimmed, so it returns sites you can open even when you are not a member (the gap `list-accessible-drives` cannot fill). Conversely it does NOT return OneDrives, private channel sites, or direct-link-only sites — so the *union of this command and `list-accessible-drives` is the practical maximum reachable on a delegated token* (a truly exhaustive list of every site in the tenant needs admin-only app permissions: `GET /sites/getAllSites`). Sites you cannot open are EXCLUDED so the list is not polluted with 404s: `nonNavigableExcluded` drops add-in app domains, `/contentstorage/` (SharePoint Embedded) containers, and `/_layouts/` system URLs by URL shape (no probe); each remaining site is probed (`GET /sites/{id}?$select=…,siteCollection`) and `archivedExcluded` drops archived / `423 resourceLocked` sites (e.g. an auto-archived OneDrive of a departed user) while `notFoundExcluded` drops probes that 404. Active personal OneDrives are kept. All three counters are omitted when 0. Optional `--query` narrows the index (default `*` = all accessible sites) and keeps the per-site probe cheap.",
|
|
7293
|
+
"category": "sharepoint",
|
|
7294
|
+
"graphMethod": "POST",
|
|
7295
|
+
"graphPathTemplate": "/search/query",
|
|
7296
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/search-query",
|
|
7297
|
+
"options": [
|
|
7298
|
+
{
|
|
7299
|
+
"name": "query",
|
|
7300
|
+
"key": "query",
|
|
7301
|
+
"required": false,
|
|
7302
|
+
"description": "Optional KQL filter applied to the site index (default `*` = every site you can access). Examples: a name fragment like `budget`, or `contentclass:STS_Site` to restrict to site collections. Free text is matched against site title/url."
|
|
7303
|
+
},
|
|
7304
|
+
{
|
|
7305
|
+
"name": "count-files",
|
|
7306
|
+
"key": "countFiles",
|
|
7307
|
+
"required": false,
|
|
7308
|
+
"description": "Pass `--count-files true` to add `estimatedFileCount` to each kept site — the Microsoft Search index's security-trimmed `driveItem` total (files + folders) scoped to that site's `webUrl` via KQL `path:`. OFF by default because it issues ONE extra Search query per site (chunked, capped at 200) — a real fan-out with 429-throttling risk; narrow with `--query` first. It is an estimate, not an exact count."
|
|
7309
|
+
}
|
|
7310
|
+
],
|
|
7311
|
+
"example": "ask-marcel search-all-accessible-sites --output json",
|
|
7312
|
+
"responseShape": "`{ value: [<Microsoft Graph site resource: { id, name, displayName?, webUrl, size?, estimatedFileCount?, … }>], count, fileEstimate?, archivedExcluded?, nonNavigableExcluded?, notFoundExcluded?, archiveProbeErrors?, truncated?: true, archiveProbeTruncated?: true }`. `estimatedFileCount` appears only with `--count-files true` — the security-trimmed `driveItem` (files+folders) estimate scoped to each site, omitted past the 200-site count cap or when the per-site query fails. `value[]` is deduped by site `id` across pages; `count` is the number of distinct sites returned (the authoritative figure). `size` (when present) is the site's DEFAULT document library's total bytes used (`drive.quota.used`, recursive) — folded onto the same per-site probe for free, omitted for sites past the probe ceiling or without a default drive; it is a data-volume signal, not a file count. `fileEstimate` (best-effort, omitted if the extra query fails) is the Microsoft Search index's security-trimmed `driveItem` count — roughly how many files+folders the user can access across all of SharePoint/OneDrive. `truncated: true` means paging stopped early (page ceiling hit, or a later page errored) — narrow with `--query` to see the rest; its absence means the sweep ran to completion. `archivedExcluded` (omitted when 0) counts sites dropped as archived/locked by the per-site probe; `nonNavigableExcluded` counts sites dropped by URL shape (add-in app domains, `/contentstorage/` SharePoint Embedded containers, `/_layouts/` system pages); `notFoundExcluded` counts sites whose probe returned 404. `archiveProbeErrors` (omitted when 0) counts sites whose probe failed for an unrelated reason — those are KEPT, so an archived one could slip through. `archiveProbeTruncated: true` means more sites were returned than the probe ceiling (250); the overflow is kept unprobed — narrow with `--query`.",
|
|
7313
|
+
"bodyTemplate": "{ requests: [{ entityTypes: ['site'], query: { queryString: '{query}' }, from: <page*25>, size: 25 }] } — `{query}` defaults to `*` (all accessible sites); re-issued per page, advancing `from` by 25 until `moreResultsAvailable` is false"
|
|
6041
7314
|
},
|
|
6042
7315
|
{
|
|
6043
7316
|
"name": "search-mail-messages",
|
|
6044
|
-
"summary": "Search the signed-in user's entire Outlook mailbox using KQL or free text. Results are ranked by Graph relevance. Note: Graph does not allow `$search` and `$filter` together — the CLI rejects `--filter` client-side with a pointer to `list-mail-messages` (which supports OData filtering). For sorting, server-side `$orderby` is also not allowed with `$search`; use the relevance ranking Graph returns.",
|
|
7317
|
+
"summary": "Search the signed-in user's entire Outlook mailbox using KQL or free text. Results are ranked by Graph relevance. The CLI ships a slim default `--select=id,subject,from,toRecipients,ccRecipients,receivedDateTime,hasAttachments,isRead,importance,bodyPreview` (same as `list-mail-messages`) so a 3-result page stays ~3 KB instead of ~30 KB. Pass `--select id,subject,body` to widen, or override entirely. Note: Graph does not allow `$search` and `$filter` together — the CLI rejects `--filter` client-side with a pointer to `list-mail-messages` (which supports OData filtering). For sorting, server-side `$orderby` is also not allowed with `$search`; use the relevance ranking Graph returns. **KQL quoting gotcha**: pass the raw KQL expression, e.g. `--query 'subject:invoice from:alice'`; do NOT wrap your terms in extra double-quotes (Graph then rejects with `BadRequest: An identifier was expected at position 0` because it sees `\"...\"` after the `$search=` interpolation). The CLI already wraps the entire `--query` value in `\"...\"` on the wire.",
|
|
6045
7318
|
"category": "mail",
|
|
6046
7319
|
"graphMethod": "GET",
|
|
6047
7320
|
"graphPathTemplate": "/me/messages?$search=\"{query}\"",
|
|
@@ -6091,7 +7364,7 @@
|
|
|
6091
7364
|
}
|
|
6092
7365
|
],
|
|
6093
7366
|
"example": "ask-marcel search-mail-messages --query 'from:alice subject:Q3'",
|
|
6094
|
-
"responseShape": "collection of Microsoft Graph `message` resources under `value[]`, ranked by relevance",
|
|
7367
|
+
"responseShape": "collection of Microsoft Graph `message` resources under `value[]`, ranked by relevance, each projected to the default `--select` set (or the requested fields when overridden). The default omits `body`, `internetMessageHeaders`, and `uniqueBody`.",
|
|
6095
7368
|
"pagination": true
|
|
6096
7369
|
},
|
|
6097
7370
|
{
|
|
@@ -6155,7 +7428,13 @@
|
|
|
6155
7428
|
"name": "drive-id",
|
|
6156
7429
|
"key": "driveId",
|
|
6157
7430
|
"required": true,
|
|
6158
|
-
"
|
|
7431
|
+
"aliases": [
|
|
7432
|
+
{
|
|
7433
|
+
"name": "id",
|
|
7434
|
+
"key": "id"
|
|
7435
|
+
}
|
|
7436
|
+
],
|
|
7437
|
+
"description": "Microsoft Graph drive ID to search inside. Use `ask-marcel list-drives` for the personal OneDrive, or `ask-marcel list-sharepoint-site-drives --site-id <id>` for a SharePoint document library."
|
|
6159
7438
|
},
|
|
6160
7439
|
{
|
|
6161
7440
|
"name": "query",
|
|
@@ -6305,8 +7584,94 @@
|
|
|
6305
7584
|
}
|
|
6306
7585
|
],
|
|
6307
7586
|
"example": "ask-marcel search-sharepoint-sites-by-name --query 'marketing'",
|
|
6308
|
-
"responseShape": "collection of Microsoft Graph `site` resources under `value[]` (up to 25)",
|
|
7587
|
+
"responseShape": "collection of Microsoft Graph `site` resources under `value[]` (up to 25), each carrying `size?` — its default document library's total bytes used (`drive.quota.used`, recursive), folded onto the same probe for free (a data-volume signal, not a file count; omitted when the site has no default drive). Sites you cannot open are excluded: `nonNavigableExcluded` drops add-in app domains, `/contentstorage/` (SharePoint Embedded) containers, and `/_layouts/` system URLs by URL shape (no probe); each remaining match is probed (`GET /sites/{id}?$select=…,siteCollection&$expand=drive($select=quota)`) and `archivedExcluded` drops archived / `423 resourceLocked` sites while `notFoundExcluded` drops probes that 404. All three counters are omitted when 0. `archiveProbeErrors` (omitted when 0) counts matches kept because their probe failed for an unrelated reason. Active personal OneDrives are kept.",
|
|
6309
7588
|
"pagination": true
|
|
7589
|
+
},
|
|
7590
|
+
{
|
|
7591
|
+
"name": "update-mail-draft",
|
|
7592
|
+
"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. Returns the updated message object. Use get-mail-message to verify the final state before sending.",
|
|
7593
|
+
"category": "mail",
|
|
7594
|
+
"graphMethod": "PATCH",
|
|
7595
|
+
"graphPathTemplate": "/me/messages/{message-id}",
|
|
7596
|
+
"graphDocsUrl": "https://learn.microsoft.com/en-us/graph/api/message-update",
|
|
7597
|
+
"options": [
|
|
7598
|
+
{
|
|
7599
|
+
"name": "message-id",
|
|
7600
|
+
"key": "messageId",
|
|
7601
|
+
"required": true,
|
|
7602
|
+
"aliases": [
|
|
7603
|
+
{
|
|
7604
|
+
"name": "id",
|
|
7605
|
+
"key": "id"
|
|
7606
|
+
}
|
|
7607
|
+
],
|
|
7608
|
+
"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.",
|
|
7609
|
+
"argumentHint": {
|
|
7610
|
+
"kind": "idOrName"
|
|
7611
|
+
}
|
|
7612
|
+
},
|
|
7613
|
+
{
|
|
7614
|
+
"name": "subject",
|
|
7615
|
+
"key": "subject",
|
|
7616
|
+
"required": false,
|
|
7617
|
+
"description": "New email subject line. Omit to keep the current subject."
|
|
7618
|
+
},
|
|
7619
|
+
{
|
|
7620
|
+
"name": "body-content",
|
|
7621
|
+
"key": "bodyContent",
|
|
7622
|
+
"required": false,
|
|
7623
|
+
"description": "New email body content. Replaces the entire body. Pass --body-content-type HTML for rich text."
|
|
7624
|
+
},
|
|
7625
|
+
{
|
|
7626
|
+
"name": "body-content-type",
|
|
7627
|
+
"key": "bodyContentType",
|
|
7628
|
+
"required": false,
|
|
7629
|
+
"description": "Body format for the new body: Text (default) or HTML. Only used when --body-content is provided.",
|
|
7630
|
+
"argumentHint": {
|
|
7631
|
+
"kind": "magicValue",
|
|
7632
|
+
"values": [
|
|
7633
|
+
"Text",
|
|
7634
|
+
"HTML"
|
|
7635
|
+
]
|
|
7636
|
+
}
|
|
7637
|
+
},
|
|
7638
|
+
{
|
|
7639
|
+
"name": "to-recipients",
|
|
7640
|
+
"key": "toRecipients",
|
|
7641
|
+
"required": false,
|
|
7642
|
+
"description": "Comma-separated list of recipient email addresses. Replaces the entire toRecipients list."
|
|
7643
|
+
},
|
|
7644
|
+
{
|
|
7645
|
+
"name": "cc-recipients",
|
|
7646
|
+
"key": "ccRecipients",
|
|
7647
|
+
"required": false,
|
|
7648
|
+
"description": "Comma-separated list of CC recipient email addresses. Replaces the entire ccRecipients list."
|
|
7649
|
+
},
|
|
7650
|
+
{
|
|
7651
|
+
"name": "bcc-recipients",
|
|
7652
|
+
"key": "bccRecipients",
|
|
7653
|
+
"required": false,
|
|
7654
|
+
"description": "Comma-separated list of BCC recipient email addresses. Replaces the entire bccRecipients list."
|
|
7655
|
+
},
|
|
7656
|
+
{
|
|
7657
|
+
"name": "importance",
|
|
7658
|
+
"key": "importance",
|
|
7659
|
+
"required": false,
|
|
7660
|
+
"description": "Email importance: Low, Normal, or High.",
|
|
7661
|
+
"argumentHint": {
|
|
7662
|
+
"kind": "magicValue",
|
|
7663
|
+
"values": [
|
|
7664
|
+
"Low",
|
|
7665
|
+
"Normal",
|
|
7666
|
+
"High"
|
|
7667
|
+
]
|
|
7668
|
+
}
|
|
7669
|
+
}
|
|
7670
|
+
],
|
|
7671
|
+
"example": "ask-marcel update-mail-draft --message-id \"AAMkAD...\" --subject \"Updated: Q3 Report\" --to-recipients \"alice@example.com,charlie@example.com\"",
|
|
7672
|
+
"responseShape": "The updated Microsoft Graph message object: `{ id, subject, body, from, toRecipients, ccRecipients, bccRecipients, receivedDateTime, isDraft, … }`. Graph returns 204 No Content on success with no body — the CLI surfaces `{ ok: true }` in that case.",
|
|
7673
|
+
"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",
|
|
7674
|
+
"mutates": true
|
|
6310
7675
|
}
|
|
6311
7676
|
]
|
|
6312
7677
|
}
|