MCP server exposing GroupDocs.Markdown for .NET as AI-callable tools (ConvertToMarkdown, GetDocumentInfo) for Claude, Cursor, GitHub Copilot, and other MCP agents.
Two tools with comprehensive descriptions and well-structured schemas. ConvertToMarkdown and GetDocumentInfo both have detailed, LLM-optimized descriptions (200+ chars) explaining WHAT, WHEN, and HOW. All parameters are typed and described. Output schemas are implicitly documented in descriptions. Error handling guidance is present ('Conversion to Markdown failed for...', 'Document-info lookup failed for...'). Main gaps: no tool annotations (readOnlyHint/destructiveHint), no pagination support for potential multi-document scenarios, and no explicit output schema documentation in JSON Schema format. Parameter descriptions are strong but could benefit from explicit format/constraint examples.
Converts a document to clean, structured Markdown (.md). Supports PDF, DOCX/DOC/RTF/ODT, XLSX/XLS/ODS/CSV/TSV, EPUB, MOBI, TXT, CHM and 20+ more formats. By default, images are embedded as base64 data URIs so the output is fully self-contained. Use 'images' to control image handling: 'base64' (default), 'file' (save images alongside the .md and reference by path), or 'skip' (omit images — text-only). Use 'pages' to limit output to specific 1-based pages or worksheets. The generated Markdown is saved to storage AND the content is returned inline. Returns the saved file path followed by the Markdown content (long output is truncated inline — the saved .md holds the full text). Call this tool immediately whenever the user asks to convert a document to Markdown, export as MD, or extract as Markdown. Do NOT pre-check whether files exist — just pass the filename the user provided. The tool resolves files from storage and returns an error with available files if a name is not found. On failure, the response text starts with 'Conversion to Markdown failed for' followed by the underlying exception type, message, and inner chain.
Returns document information (file format, page count, title, author, encryption flag) as JSON, without performing a full Markdown conversion. Supports PDF, DOCX, XLSX, EPUB, MOBI, and 20+ more formats recognized by GroupDocs.Markdown. Useful as a precondition check before ConvertToMarkdown — e.g. 'how many pages does this PDF have?' or to decide which pages to request or whether a password is needed. Returns a JSON object with `fileName`, `fileFormat`, `pageCount` (worksheet count for spreadsheets), `title`, `author`, and `isEncrypted`. Do NOT pre-check whether files exist — just pass the filename the user provided. The tool resolves files from storage and returns an error with available files if a name is not found. On failure, the response text starts with 'Document-info lookup failed for' followed by the underlying exception type, message, and inner chain.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint) declared in tool definitions. ConvertToMarkdown is destructive (writes files); GetDocumentInfo is read-only. Annotations help LLMs reason about side effects and retry safety.
Output schemas not formally documented in JSON Schema format. Descriptions mention return structure (e.g., 'Returns the saved file path followed by the Markdown content' for ConvertToMarkdown, 'Returns a JSON object with fileName, fileFormat, pageCount...' for GetDocumentInfo), but no explicit schema definition visible in code.
ConvertToMarkdown accepts 'pages' parameter as comma-separated string (e.g., '1,3,5'). No explicit validation or error message documented for invalid formats (e.g., '1,a,5' or '1-5'). LLMs may pass malformed input.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
No pagination or result limiting documented. If a document has 1000+ pages and user requests all pages, ConvertToMarkdown could return extremely large output, exhausting context window. No mention of max output size or chunking strategy.
Error messages reference exception types and chains ('followed by the underlying exception type, message, and inner chain'), but no guidance on recovery actions. E.g., if file not found, should LLM call GetDocumentInfo first? Should it list available files?