Read documents from DeepLedger storage or QuickBooks attachments. TWO SOURCES: source="deepledger": uploaded invoices/receipts/statements, filtered by folder, status, file type, monthYear (the accounting period a reviewer assigned — this is the month-end filter), upload date range, file-name search, or attachedToTaskId. Use listFolders=true for the folder structure. DEEPLEDGER-ONLY fields: search, folder, listFolders, status, fileType, monthYear, createdAfter, createdBefore, maxResults, offset, documentIds, attachedToTaskId. source="quickbooks": pull attachments off a QB transaction — requires entityId + entityType. Use metadataOnly=true to inspect before downloading. Downloading copies the file into DeepLedger storage under an "AI Agent Downloads" folder. QUICKBOOKS-ONLY fields: entityId, entityType, metadataOnly. STRICT VALIDATION: deepledger-only and quickbooks-only fields must not be mixed. "Expense" in QB UI = "Purchase" entityType. THINGS THAT ARE NOT WHAT THEY LOOK LIKE: (1) A full page is NOT the whole set — a result saying INCOMPLETE has more behind it; pass offset to continue. (2) attachedToTaskId filters ONE database column that holds either a task id or a bank-transaction id, because a human can attach a file on the Tasks page or on the Bank Feed page. Pass whichever record you are asking about. (3) createdAfter/createdBefore are UPLOAD dates and both bounds are inclusive; monthYear is the accounting period the document belongs to, which is usually what a close needs. (4) search and fileType match literally — % and _ are not wildcards, and fileType is a bare extension ("pdf"), never "application/pdf". (5) A QuickBooks attachment can be a NOTE with no file (isNote=true, storagePath=null) — that is not a failed download. (6) Downloading the same QB attachment twice does NOT create a second copy; the second read reports alreadyInStorage=true. (7) Nothing in this server can DELETE a document — removal is the portal Documents page only.