Find a PDF in iCloud Drive and read it. Cross-platform, read-only, unofficial.
Five tools with clear verb-noun naming (status, list_folder, search, download, read_text) and documented descriptions (avg 95 chars). All tools have input schemas with typed parameters and descriptions. However, output schemas are not explicitly documented in the source, responses are inferred from code patterns (ok() wrapper, item.to_dict()). Parameter descriptions are present but minimal (avg 45 chars). Error handling returns structured dicts with 'ok', 'code', 'error' fields, but recovery guidance is sparse. No tool annotations (readOnlyHint, destructiveHint). Risk classification is present in metadata but not in tool definitions themselves.
Download Drive files to the local cache directory. Returns local paths, not bytes.
List one iCloud Drive folder (not recursive). Empty path is the configured root.
Download a Drive file if needed and return extracted text (pdf, docx, xlsx, txt).
Search Drive filenames and paths. Optional ext filter like pdf or .docx. Capped.
Check whether the Apple ID session is trusted and iCloud Drive is reachable.
Output schemas not documented. Tools return structured dicts (ok(), item.to_dict()) but LLMs cannot see the response field structure. Responses include 'ok', 'code', 'error', 'path', 'count', 'items', 'truncated', 'visited', none of which are formally declared.
Parameter descriptions are minimal (avg 45 chars, baseline 72). E.g., 'path' in list_folder is 'Folder path in iCloud Drive', lacks guidance on format, depth, or root behavior. 'ext' in search is 'Optional file extension filter like pdf or .docx', example values in description risk literal reuse by LLM.
No tool annotations. download() is destructive (WRITE risk) and read_text() is idempotent, but these hints are not declared in tool metadata. LLMs cannot infer retry safety or side-effect scope.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
Error recovery guidance is sparse. ICloudError.to_dict() returns {'ok': False, 'code': '...', 'error': '...'} but does not suggest next steps. E.g., NEED_LOGIN returns a code but does not tell the LLM to call 'icloud-docs-mcp login' in a terminal.
search() result limit is capped at 30 (default) but no pagination support. If truncated=true, LLM cannot fetch the next page. No offset, cursor, or next_token field in response.