{"owner":"microsoft","repo":"markitdown","hasSkills":true,"totalSkillsCount":11,"totalTokensCount":11506,"categories":["anthropic-skill","plugin-manifest"],"hasMcp":true,"mcpConfig":{"mcpServers":{"markitdown":{"command":"npx","args":["-y","@modelcontextprotocol/server-markitdown"]}}},"found":["packages/markitdown/ThirdPartyNotices.md","packages/markitdown-ocr/README.md","packages/markitdown/tests/test_files/test.json","packages/markitdown/README.md","packages/markitdown-sample-plugin/README.md","packages/markitdown-mcp/README.md","packages/markitdown/tests/test_files/expected_outputs/test.md","packages/markitdown/tests/test_files/expected_outputs/REPAIR-2022-INV-001_multipage.md","packages/markitdown/tests/test_files/expected_outputs/movie-theater-booking-2024.md","packages/markitdown/tests/test_files/expected_outputs/RECEIPT-2024-TXN-98765_retail_purchase.md","packages/markitdown/tests/test_files/expected_outputs/SPARSE-2024-INV-1234_borderless_table.md"],"skills":{"packages/markitdown/ThirdPartyNotices.md":"# THIRD-PARTY SOFTWARE NOTICES AND INFORMATION\n\n**Do Not Translate or Localize**\n\nThis project incorporates components from the projects listed below. The original copyright notices and the licenses \nunder which MarkItDown received such components are set forth below. MarkItDown reserves all rights not expressly \ngranted herein, whether by implication, estoppel or otherwise.\n\n1.dwml (https://github.com/xiilei/dwml)\n\ndwml NOTICES AND INFORMATION BEGIN HERE\n\n-----------------------------------------\n\nNOTE 1: What follows is a verbatim copy of dwml's LICENSE file, as it appeared on March 28th, 2025 - including \nplaceholders for the copyright owner and year.\n\nNOTE 2: The Apache License, Version 2.0, requires that modifications to the dwml source code be documented.  \nThe following section summarizes these changes. The full details are available in the MarkItDown source code \nrepository under PR #1160 (https://github.com/microsoft/markitdown/pull/1160)\n\nThis project incorporates `dwml/latex_dict.py` and `dwml/omml.py` files without any additional logic modifications (which \nlives in `packages/markitdown/src/markitdown/converter_utils/docx/math` location). However, we have reformatted the code\naccording to `black` code formatter.  From `tests/docx.py` file, we have used `DOCXML_ROOT` XML namespaces and the rest of \nthe file is not used.\n\n-----------------------------------------\n\nApache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n-----------------------------------------\nEND OF dwml NOTICES AND INFORMATION","packages/markitdown-ocr/README.md":"# MarkItDown OCR Plugin\n\nLLM Vision plugin for MarkItDown that extracts text from images embedded in PDF, DOCX, PPTX, and XLSX files.\n\nUses the same `llm_client` / `llm_model` pattern that MarkItDown already supports for image descriptions — no new ML libraries or binary dependencies required.\n\n## Features\n\n- **Enhanced PDF Converter**: Extracts text from images within PDFs, with full-page OCR fallback for scanned documents\n- **Enhanced DOCX Converter**: OCR for images in Word documents\n- **Enhanced PPTX Converter**: OCR for images in PowerPoint presentations\n- **Enhanced XLSX Converter**: OCR for images in Excel spreadsheets\n- **Context Preservation**: Maintains document structure and flow when inserting extracted text\n\n## Installation\n\nRequires `markitdown>=0.1.8,<0.2.0`, which provides the Office image-rendering hooks used by this plugin. Installing the plugin automatically resolves a compatible core version.\n\n```bash\npip install markitdown-ocr\n```\n\nThe plugin uses whatever OpenAI-compatible client you already have. Install one if you don't have it yet:\n\n```bash\npip install openai\n```\n\n## Usage\n\n### Command Line\n\n```bash\nmarkitdown document.pdf --use-plugins --llm-client openai --llm-model gpt-4o\n```\n\n### Python API\n\nPass `llm_client` and `llm_model` to `MarkItDown()` exactly as you would for image descriptions:\n\n```python\nfrom markitdown import MarkItDown\nfrom openai import OpenAI\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),\n    llm_model=\"gpt-4o\",\n)\n\nresult = md.convert(\"document_with_images.pdf\")\nprint(result.text_content)\n```\n\nIf no `llm_client` is provided the plugin still loads, but OCR is silently skipped — falling back to the standard built-in converter.\n\n### Custom Prompt\n\nOverride the default extraction prompt for specialized documents:\n\n```python\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),\n    llm_model=\"gpt-4o\",\n    llm_prompt=\"Extract all text from this image, preserving table structure.\",\n)\n```\n\n### Any OpenAI-Compatible Client\n\nWorks with any client that follows the OpenAI API:\n\n```python\nfrom openai import AzureOpenAI\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=AzureOpenAI(\n        api_key=\"...\",\n        azure_endpoint=\"https://your-resource.openai.azure.com/\",\n        api_version=\"2024-02-01\",\n    ),\n    llm_model=\"gpt-4o\",\n)\n```\n\n## How It Works\n\nWhen `MarkItDown(enable_plugins=True, llm_client=..., llm_model=...)` is called:\n\n1. MarkItDown discovers the plugin via the `markitdown.plugin` entry point group\n2. It calls `register_converters()`, forwarding all kwargs including `llm_client` and `llm_model`\n3. The plugin creates an `LLMVisionOCRService` from those kwargs\n4. Four OCR-enhanced converters are registered at **priority -1.0** — before the built-in converters at priority 0.0\n\nWhen a file is converted:\n\n1. The OCR converter accepts the file\n2. It extracts embedded images from the document\n3. Each image is sent to the LLM with an extraction prompt\n4. The returned text is placed alongside document content (XLSX images follow their sheet's table)\n5. If the LLM call fails, conversion continues without that image's text\n\nThe DOCX, PPTX, and XLSX converters subclass their core counterparts and override the same semi-private `_image_to_html` method. Core handles native content, preprocessing, and placement; the plugin supplies escaped OCR HTML, which passes through the shared HTML-to-Markdown renderer. PDF uses its separate existing pipeline.\n\n## Supported File Formats\n\n### PDF\n\n- Embedded images are extracted by position (via `page.images` / page XObjects) and OCR'd inline, interleaved with the surrounding text in vertical reading order.\n- **Scanned PDFs** (pages with no extractable text) are detected automatically: each page is rendered at 300 DPI and sent to the LLM as a full-page image.\n- **Malformed PDFs** that pdfplumber/pdfminer cannot open (e.g. truncated EOF) are retried with PyMuPDF page rendering, so content is still recovered.\n\n### DOCX\n\n- Inherits core DOCX preprocessing, styles, math, and Mammoth conversion.\n- Mammoth provides each embedded image to `_image_to_html`. OCR fragments are inserted into the document's HTML before Markdown rendering, not substituted into finished Markdown.\n- Block fragments split enclosing paragraphs where necessary and remain inside their table cell or list item. Table-cell line breaks follow the shared HTML converter's existing limitations.\n\n### PPTX\n\n- Picture shapes, placeholder shapes with images, and images inside groups are all supported.\n- Inherits core shape ordering, native text, tables, charts, and speaker notes.\n- Slide content now uses the core converter's real line breaks rather than the old plugin's literal `\\n` text, and inherits its empty-title and empty-notes handling.\n- If an `llm_client` is configured, the LLM is asked for a description first; OCR is used as the fallback when no description is returned.\n\n### XLSX\n\n- Inherits core workbook repair and table rendering; images are read from the same repaired workbook.\n- Images are listed under a `### Images in this sheet:` section after the sheet's data table — they are not interleaved into the table rows.\n- Sheet heading spacing follows the core converter; no new cell-position labels are added.\n- Legacy `.xls` files remain handled by the existing core converter, without image OCR.\n\n### Output format\n\nEvery extracted OCR block is wrapped as:\n\n```text\n*[Image OCR]\n<extracted text>\n[End OCR]*\n```\n\nFor Office formats, recognized text is escaped as literal HTML text before Markdown rendering. Markdown escaping and line breaks therefore follow the shared HTML converter: for example, underscores may be backslash-escaped, and direct converter results use Markdown hard breaks. `MarkItDown` subsequently strips trailing whitespace from each output line. Empty recognition retains the native image representation (XLSX normally omits images).\n\nRepeated image bytes are recognized once per conversion, while the result is placed at every occurrence. The cache is not shared across documents or service overrides.\n\n## Troubleshooting\n\n### OCR text missing from output\n\nThe most likely cause is a missing `llm_client` or `llm_model`. Verify:\n\n```python\nfrom openai import OpenAI\nfrom markitdown import MarkItDown\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),   # required\n    llm_model=\"gpt-4o\",    # required\n)\n```\n\n### Plugin not loading\n\nConfirm the plugin is installed and discovered:\n\n```bash\nmarkitdown --list-plugins   # should show: ocr\n```\n\n### API errors\n\nThe plugin propagates LLM API errors as warnings and continues conversion. Check your API key, quota, and that the chosen model supports vision inputs.\n\nFor Office OCR, a service-reported error emits a warning and retains native image rendering. Exceptions raised by custom OCR services propagate from direct converter calls; `MarkItDown` can retry another applicable converter through its normal fallback behavior.\n\n## Development\n\n### Running Tests\n\n```bash\ncd packages/markitdown-ocr\npytest tests/ -v\n```\n\n### Building from Source\n\n```bash\ngit clone https://github.com/microsoft/markitdown.git\ncd markitdown\npip install -e 'packages/markitdown[docx,pptx,xlsx]' -e packages/markitdown-ocr\n```\n\n## Contributing\n\nContributions are welcome! See the [MarkItDown repository](https://github.com/microsoft/markitdown) for guidelines.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n## Changelog\n\n### 0.1.0 (Initial Release)\n\n- LLM Vision OCR for PDF, DOCX, PPTX, XLSX\n- Full-page OCR fallback for scanned PDFs\n- Context-aware inline text insertion\n- Priority-based converter replacement (no code changes required)\n","packages/markitdown/tests/test_files/test.json":"{\n    \"key1\": \"string_value\",\n    \"key2\": 1234,\n    \"key3\": [\n        \"list_value1\",\n        \"list_value2\"\n    ],\n    \"5b64c88c-b3c3-4510-bcb8-da0b200602d8\": \"uuid_key\",\n    \"uuid_value\": \"9700dc99-6685-40b4-9a3a-5e406dcb37f3\"\n}\n","packages/markitdown/README.md":"# MarkItDown\n\n> [!TIP]\n> MarkItDown is a Python package and command-line utility for converting various files to Markdown (e.g., for indexing, text analysis, etc).\n>\n> For more information, and full documentation, see the project [README.md](https://github.com/microsoft/markitdown) on GitHub.\n\n> [!IMPORTANT]\n> MarkItDown performs I/O with the privileges of the current process. Like open() or requests.get(), it will access resources that the process itself can access. Sanitize your inputs in untrusted environments, and call the narrowest `convert_*` function needed for your use case (e.g., `convert_stream()`, or `convert_local()`). See the [Security Considerations](https://github.com/microsoft/markitdown#security-considerations) section of the documentation for more information.\n\n## Installation\n\nFrom PyPI:\n\n```bash\npip install 'markitdown[all]'\n```\n\nFrom source:\n\n```bash\ngit clone git@github.com:microsoft/markitdown.git\ncd markitdown\npip install -e 'packages/markitdown[all]'\n```\n\n## Usage\n\n### Command-Line\n\n```bash\nmarkitdown path-to-file.pdf > document.md\n```\n\n### Python API\n\n```python\nfrom markitdown import MarkItDown\n\nmd = MarkItDown()\nresult = md.convert(\"test.xlsx\")\nprint(result.markdown)\n```\n\n### More Information\n\nFor more information, and full documentation, see the project [README.md](https://github.com/microsoft/markitdown) on GitHub.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n","packages/markitdown-sample-plugin/README.md":"# MarkItDown Sample Plugin\n\n[![PyPI](https://img.shields.io/pypi/v/markitdown-sample-plugin.svg)](https://pypi.org/project/markitdown-sample-plugin/)\n![PyPI - Downloads](https://img.shields.io/pypi/dd/markitdown-sample-plugin)\n[![Built by AutoGen Team](https://img.shields.io/badge/Built%20by-AutoGen%20Team-blue)](https://github.com/microsoft/autogen)\n\n\nThis project shows how to create a sample plugin for MarkItDown. The most important parts are as follows:\n\nFirst, implement your custom DocumentConverter:\n\n```python\nfrom typing import BinaryIO, Any\nfrom markitdown import MarkItDown, DocumentConverter, DocumentConverterResult, StreamInfo, PRIORITY_SPECIFIC_FILE_FORMAT\n\nclass RtfConverter(DocumentConverter):\n\n    def __init__(\n        self, priority: float = PRIORITY_SPECIFIC_FILE_FORMAT\n    ):\n        super().__init__(priority=priority)\n\n    def accepts(\n        self,\n        file_stream: BinaryIO,\n        stream_info: StreamInfo,\n        **kwargs: Any,\n    ) -> bool:\n\n        # Implement logic to check if the file stream is an RTF file\n        # ...\n        raise NotImplementedError()\n\n\n    def convert(\n        self,\n        file_stream: BinaryIO,\n        stream_info: StreamInfo,\n        **kwargs: Any,\n    ) -> DocumentConverterResult:\n\n        # Implement logic to convert the file stream to Markdown\n        # ...\n        raise NotImplementedError()\n```\n\nNext, make sure your package implements and exports the following:\n\n```python\n# The version of the plugin interface that this plugin uses.\n# The only supported version is 1 for now.\n__plugin_interface_version__ = 1\n\n# The main entrypoint for the plugin. This is called each time MarkItDown instances are created.\ndef register_converters(markitdown: MarkItDown, **kwargs):\n    \"\"\"\n    Called during construction of MarkItDown instances to register converters provided by plugins.\n    \"\"\"\n\n    # Simply create and attach an RtfConverter instance\n    markitdown.register_converter(RtfConverter())\n```\n\n\nFinally, create an entrypoint in the `pyproject.toml` file:\n\n```toml\n[project.entry-points.\"markitdown.plugin\"]\nsample_plugin = \"markitdown_sample_plugin\"\n```\n\nHere, the value of `sample_plugin` can be any key, but should ideally be the name of the plugin. The value is the fully qualified name of the package implementing the plugin.\n\n\n## Installation\n\nTo use the plugin with MarkItDown, it must be installed. To install the plugin from the current directory use:\n\n```bash\npip install -e .\n```\n\nOnce the plugin package is installed, verify that it is available to MarkItDown by running:\n\n```bash\nmarkitdown --list-plugins\n```\n\nTo use the plugin for a conversion use the `--use-plugins` flag. For example, to convert an RTF file:\n\n```bash\nmarkitdown --use-plugins path-to-file.rtf\n```\n\nIn Python, plugins can be enabled as follows:\n\n```python\nfrom markitdown import MarkItDown\n\nmd = MarkItDown(enable_plugins=True)\nresult = md.convert(\"path-to-file.rtf\")\nprint(result.text_content)\n```\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n","packages/markitdown-mcp/README.md":"# MarkItDown-MCP\n\n> [!IMPORTANT]\n> The MarkItDown-MCP package is meant for **local use**, with local trusted agents. In particular, when running the MCP server with Streamable HTTP or SSE, it binds to `localhost` by default, and is not exposed to other machines on the network or Internet. In this configuration, it is meant to be a direct alternative to the STDIO transport, which may be more convenient in some cases. DO NOT bind the server to other interfaces unless you understand the [security implications](#security-considerations) of doing so.\n\n\n[![PyPI](https://img.shields.io/pypi/v/markitdown-mcp.svg)](https://pypi.org/project/markitdown-mcp/)\n![PyPI - Downloads](https://img.shields.io/pypi/dd/markitdown-mcp)\n[![Built by AutoGen Team](https://img.shields.io/badge/Built%20by-AutoGen%20Team-blue)](https://github.com/microsoft/autogen)\n\nThe `markitdown-mcp` package provides a lightweight STDIO, Streamable HTTP, and SSE MCP server for calling MarkItDown.\n\nIt exposes one tool: `convert_to_markdown(uri)`, where uri can be any `http:`, `https:`, `file:`, or `data:` URI.\n\n## Installation\n\nTo install the package, use pip:\n\n```bash\npip install markitdown-mcp\n```\n\n## Usage\n\nTo run the MCP server, using STDIO (default), use the following command:\n\n\n```bash\nmarkitdown-mcp\n```\n\nTo run the MCP server, using Streamable HTTP and SSE, use the following command:\n\n```bash\nmarkitdown-mcp --http --host 127.0.0.1 --port 3001\n```\n\n## Running in Docker\n\nTo run `markitdown-mcp` in Docker, build the Docker image using the provided Dockerfile:\n```bash\ndocker build -t markitdown-mcp:latest .\n```\n\nAnd run it using:\n```bash\ndocker run -it --rm markitdown-mcp:latest\n```\nThis will be sufficient for remote URIs. To access local files, you need to mount the local directory into the container. For example, if you want to access files in `/home/user/data`, you can run:\n\n```bash\ndocker run -it --rm -v /home/user/data:/workdir markitdown-mcp:latest\n```\n\nOnce mounted, all files under data will be accessible under `/workdir` in the container. For example, if you have a file `example.txt` in `/home/user/data`, it will be accessible in the container at `/workdir/example.txt`.\n\n## Accessing from Claude Desktop\n\nIt is recommended to use the Docker image when running the MCP server for Claude Desktop.\n\nFollow [these instructions](https://modelcontextprotocol.io/quickstart/user#for-claude-desktop-users) to access Claude's `claude_desktop_config.json` file.\n\nEdit it to include the following JSON entry:\n\n```json\n{\n  \"mcpServers\": {\n    \"markitdown\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"markitdown-mcp:latest\"\n      ]\n    }\n  }\n}\n```\n\nIf you want to mount a directory, adjust it accordingly:\n\n```json\n{\n  \"mcpServers\": {\n    \"markitdown\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"-v\",\n        \"/home/user/data:/workdir\",\n        \"markitdown-mcp:latest\"\n      ]\n    }\n  }\n}\n```\n\n## Debugging\n\nTo debug the MCP server you can use the `MCP Inspector` tool.\n\n```bash\nnpx @modelcontextprotocol/inspector\n```\n\nYou can then connect to the inspector through the specified host and port (e.g., `http://localhost:5173/`).\n\nIf using STDIO:\n* select `STDIO` as the transport type,\n* input `markitdown-mcp` as the command, and\n* click `Connect`\n\nIf using Streamable HTTP:\n* select `Streamable HTTP` as the transport type,\n* input `http://127.0.0.1:3001/mcp` as the URL, and\n* click `Connect`\n\nIf using SSE:\n* select `SSE` as the transport type,\n* input `http://127.0.0.1:3001/sse` as the URL, and\n* click `Connect`\n\nFinally:\n* click the `Tools` tab,\n* click `List Tools`,\n* click `convert_to_markdown`, and\n* run the tool on any valid URI.\n\n## Security Considerations\n\nThe server does not support authentication, and runs with the privileges of the user running it. For this reason, when running in SSE or Streamable HTTP mode, the server binds by default to `localhost`. Even still, it is important to recognize that the server can be accessed by any process or users on the same local machine, and that the `convert_to_markdown` tool can be used to read any file that the server's user has access to, or any data from the network. If you require additional security, consider running the server in a sandboxed environment, such as a virtual machine or container, and ensure that the user permissions are properly configured to limit access to sensitive files and network segments. Above all, DO NOT bind the server to other interfaces (non-localhost) unless you understand the security implications of doing so.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n","packages/markitdown/tests/test_files/expected_outputs/test.md":"1\n\nIntroduction\n\nLarge language models (LLMs) are becoming a crucial building block in developing powerful agents\nthat utilize LLMs for reasoning, tool usage, and adapting to new observations (Yao et al., 2022; Xi\net al., 2023; Wang et al., 2023b) in many real-world tasks. Given the expanding tasks that could\nbenefit from LLMs and the growing task complexity, an intuitive approach to scale up the power of\nagents is to use multiple agents that cooperate. Prior work suggests that multiple agents can help\nencourage divergent thinking (Liang et al., 2023), improve factuality and reasoning (Du et al., 2023),\nand provide validation (Wu et al., 2023). In light of the intuition and early evidence of promise, it is\nintriguing to ask the following question: how can we facilitate the development of LLM applications\nthat could span a broad spectrum of domains and complexities based on the multi-agent approach?\n\nOur insight is to use multi-agent conversations to achieve it. There are at least three reasons con-\nfirming its general feasibility and utility thanks to recent advances in LLMs: First, because chat-\noptimized LLMs (e.g., GPT-4) show the ability to incorporate feedback, LLM agents can cooperate\nthrough conversations with each other or human(s), e.g., a dialog where agents provide and seek rea-\nsoning, observations, critiques, and validation. Second, because a single LLM can exhibit a broad\nrange of capabilities (especially when configured with the correct prompt and inference settings),\nconversations between differently configured agents can help combine these broad LLM capabilities\nin a modular and complementary manner. Third, LLMs have demonstrated ability to solve complex\ntasks when the tasks are broken into simpler subtasks. Multi-agent conversations can enable this\npartitioning and integration in an intuitive manner. How can we leverage the above insights and\nsupport different applications with the common requirement of coordinating multiple agents, poten-\ntially backed by LLMs, humans, or tools exhibiting different capacities? We desire a multi-agent\nconversation framework with generic abstraction and effective implementation that has the flexibil-\nity to satisfy different application needs. Achieving this requires addressing two critical questions:\n(1) How can we design individual agents that are capable, reusable, customizable, and effective in\nmulti-agent collaboration? (2) How can we develop a straightforward, unified interface that can\naccommodate a wide range of agent conversation patterns? In practice, applications of varying\ncomplexities may need distinct sets of agents with specific capabilities, and may require different\nconversation patterns, such as single- or multi-turn dialogs, different human involvement modes, and\nstatic vs. dynamic conversation. Moreover, developers may prefer the flexibility to program agent\ninteractions in natural language or code. Failing to adequately address these two questions would\nlimit the framework’s scope of applicability and generality.\nWhile there is contemporaneous exploration of multi-agent approaches,3 we present AutoGen, a\ngeneralized multi-agent conversation framework (Figure 1), based on the following new concepts.\n1 Customizable and conversable agents. AutoGen uses a generic design of agents that can lever-\nage LLMs, human inputs, tools, or a combination of them. The result is that developers can\neasily and quickly create agents with different roles (e.g., agents to write code, execute code,\nwire in human feedback, validate outputs, etc.) by selecting and configuring a subset of built-in\ncapabilities. The agent’s backend can also be readily extended to allow more custom behaviors.\nTo make these agents suitable for multi-agent conversation, every agent is made conversable –\nthey can receive, react, and respond to messages. When configured properly, an agent can hold\nmultiple turns of conversations with other agents autonomously or solicit human inputs at cer-\ntain rounds, enabling human agency and automation. The conversable agent design leverages the\nstrong capability of the most advanced LLMs in taking feedback and making progress via chat\nand also allows combining capabilities of LLMs in a modular fashion. (Section 2.1)\n\n2 Conversation programming. A fundamental insight of AutoGen is to simplify and unify com-\nplex LLM application workflows as multi-agent conversations. So AutoGen adopts a program-\nming paradigm centered around these inter-agent conversations. We refer to this paradigm as\nconversation programming, which streamlines the development of intricate applications via two\nprimary steps: (1) defining a set of conversable agents with specific capabilities and roles (as\ndescribed above); (2) programming the interaction behavior between agents via conversation-\ncentric computation and control. Both steps can be achieved via a fusion of natural and pro-\ngramming languages to build applications with a wide range of conversation patterns and agent\nbehaviors. AutoGen provides ready-to-use implementations and also allows easy extension and\nexperimentation for both steps. (Section 2.2)\n\n3We refer to Appendix A for a detailed discussion.\n\n2\n\n","packages/markitdown/tests/test_files/expected_outputs/REPAIR-2022-INV-001_multipage.md":"ZAVA AUTO REPAIR\nCertified Collision Repair\n123 Main Street, Redmond, WA 98052\nPhone: (425) 000-0000\nPreliminary Estimate (ID: EST-1008)\n| Customer Information |                     |     | Vehicle Information |                   |\n| -------------------- | ------------------- | --- | ------------------- | ----------------- |\n| Insured name         | Gabriel Diaz        |     | Year                | 2022              |\n| Claim #              | SF-1008             |     | Make                | Jeep              |\n| Policy #             | POL-2022-555        |     | Model               | Grand Cherokee    |\n| Phone                | (425) 111-1111      |     | Trim                | Limited           |\n| Email                | gabriel@contoso.com |     | VIN                 | 1C4RJFBG2NC123456 |\n|                      |                     |     | Color               | White             |\n|                      |                     |     | Odometer            | 9,800             |\n| Repair Order #       | RO-20221108         |     | Estimator           | Ellis Turner      |\nEstimate Totals\n|                  |     | Hours | Rate | Cost  |\n| ---------------- | --- | ----- | ---- | ----- |\n| Parts            |     |       |      | 2,100 |\n| Body Labor       |     | 2     | 150  | 300   |\n| Paint Labor      |     | 1.5   | 150  | 225   |\n| Mechanical Labor |     | -     | -    | -     |\nSupplies\n|               | Paint Supplies           |     |        | 60     |\n| ------------- | ------------------------ | --- | ------ | ------ |\n|               | Body Supplies            |     |        | 30     |\n| Other Charges |                          |     |        | 15     |\n| Subtotal      |                          |     |        | 2,730  |\n| Sales Tax     |                          |     | 10.20% | 278.46 |\n| GRAND TOTAL   |                          |     |        | 5,738  |\n| Note          | Minor rear bumper repair |     |        |        |\nThis is a preliminary estimate for the visible damage of the vehicle. Additional damage / repairs / parts may be found\nafter the vehicle has been disassembled and damaged parts have been removed. Suspension damages may be\npresent, but can not be determined until an alignment on the vehicle has been done. Parts Prices may vary due to\nmodels and vehicle maker price updates. Please be advised if vehicle owner elects to have vehicle sent to service for\nany mechanical concerns, ALL service departments charge a vehicle diagnostic charge. If the mechanical concern is\ndeemed not related to an insurance claim, vehicle owner will be reponsible for charges.\n\nZAVA AUTO REPAIR\nCertified Collision Repair\n123 Main Street, Redmond, WA 98052\nPhone: (425) 000-0000\nPreliminary Estimate (ID: EST-1008)\nCustomer Information Vehicle Information\n| Insured name   | Bruce Wayne                |     | Year      | 2025         |\n| -------------- | -------------------------- | --- | --------- | ------------ |\n| Claim #        |                            | 999 | Make      | Batman       |\n| Policy #       | IM-BATMAN                  |     | Model     | Batmobile    |\n| Phone          | (416) 555-1234             |     | Trim      | Limited      |\n| Email          | batman@wayneindustries.com |     | VIN       | XXX          |\n|                |                            |     | Color     | Black        |\n|                |                            |     | Odometer  | 1            |\n| Repair Order # | RO-20221108                |     | Estimator | Ellis Turner |\nEstimate Totals\n|                  |     | Hours | Rate | Cost   |\n| ---------------- | --- | ----- | ---- | ------ |\n| Parts            |     |       |      | 99,999 |\n| Body Labor       |     | 2     | 150  | 300    |\n| Paint Labor      |     | 1.5   | 150  | 225    |\n| Mechanical Labor |     | -     | -    | -      |\nSupplies\n|               | Paint Supplies           |     |        | 60        |\n| ------------- | ------------------------ | --- | ------ | --------- |\n|               | Body Supplies            |     |        | 30        |\n| Other Charges |                          |     |        | 15        |\n| Subtotal      |                          |     |        | 100,629   |\n| Sales Tax     |                          |     | 10.20% | 10264.158 |\n| GRAND TOTAL   |                          |     |        | 211,522   |\n| Note          | Minor rear bumper repair |     |        |           |\n\nThis is a preliminary estimate for the visible damage of the vehicle. Additional damage / repairs / parts may be found\nafter the vehicle has been disassembled and damaged parts have been removed. Suspension damages may be\npresent, but can not be determined until an alignment on the vehicle has been done. Parts Prices may vary due to\nmodels and vehicle maker price updates. Please be advised if vehicle owner elects to have vehicle sent to service for\nany mechanical concerns, ALL service departments charge a vehicle diagnostic charge. If the mechanical concern is\ndeemed not related to an insurance claim, vehicle owner will be reponsible for charges.","packages/markitdown/tests/test_files/expected_outputs/movie-theater-booking-2024.md":"BOOKING ORDER\nPrint Date 12/15/2024 14:30:22\nPage 1 of 1\nSTARLIGHT CINEMAS\nOrders\n| Order / Rev: | 2024-12-5678   |     |     | Cinema:          |     | Downtown Multiplex |\n| ------------ | -------------- | --- | --- | ---------------- | --- | ------------------ |\n| Alt Order #: | SC-WINTER-2024 |     |     | Primary Contact: |     | Sarah Johnson      |\nProduct Desc: Holiday Movie Marathon Package Location: NYC-01\n| Estimate:            | EST-456                 |     |     | Region: |     | NORTHEAST |\n| -------------------- | ----------------------- | --- | --- | ------- | --- | --------- |\n| Booking Dates:       | 12/20/2024 - 12/31/2024 |     |     |         |     |           |\n| Original Date / Rev: | 12/01/24 / 12/10/24     |     |     |         |     |           |\n| Order Type:          | Premium Package         |     |     |         |     |           |\nBooking Agency\n| Name:            | Premier Entertainment Group |     |     |                |     |           |\n| ---------------- | --------------------------- | --- | --- | -------------- | --- | --------- |\n|                  |                             |     |     | Billing Type:  |     | Net 30    |\n| Contact:         | Michael Chen                |     |     |                |     |           |\n|                  |                             |     |     | Payment Terms: |     | Corporate |\n| Billing Contact: | accounting@premierent.com   |     |     |                |     |           |\n|                  |                             |     |     | Commission:    |     | 10%       |\n555 Broadway Suite 1200\nNew York, NY 10012\nCustomer\n| Name:          | Universal Studios Distribution |     |     |     |     |     |\n| -------------- | ------------------------------ | --- | --- | --- | --- | --- |\n| Category:      | Film Distributor               |     |     |     |     |     |\n| Contact Email: | bookings@universalstudios.com  |     |     |     |     |     |\n| Customer ID:   | CUST-98765                     |     |     |     |     |     |\n| Revenue Code:  | FILM-PREMIUM                   |     |     |     |     |     |\nBooking Summary\n| Start Date | End Date | # Shows | Gross Amount | Net Amount |     |     |\n| ---------- | -------- | ------- | ------------ | ---------- | --- | --- |\n| 12/20/24   | 12/31/24 | 48      | $12,500.00   | $11,250.00 |     |     |\nTotals\n| Month         | # Shows | Gross Amount |     | Net Amount |     | Occupancy |\n| ------------- | ------- | ------------ | --- | ---------- | --- | --------- |\n| December 2024 | 48      | $12,500.00   |     | $11,250.00 |     | 85%       |\n| Totals        | 48      | $12,500.00   |     | $11,250.00 |     | 85%       |\nAccount Representatives\nRepresentative Territory Region Start Date / End Date Commission %\n| Sarah Johnson | NYC Metro | NORTHEAST | 12/20/24 - 12/31/24 |     | 100% |     |\n| ------------- | --------- | --------- | ------------------- | --- | ---- | --- |\nShow Schedule Details\nLn Screen Start End Movie Title Format Showtime Days Shows Rate Type Total\n1 SCR-1 12/20/24 12/25/24 Holiday Spectacular IMAX 3D 7:00 PM Daily 12 $250 PM $3,000\n(Runtime: 142 min); Holiday Season Premium\n2 SCR-2 12/20/24 12/31/24 Winter Wonderland Standard 4:30 PM Daily 24 $150 MT $3,600\n(Runtime: 98 min); Matinee Special\n3 SCR-1 12/26/24 12/31/24 New Year Mystery 4DX 9:30 PM Daily 12 $300 PM $3,600\n(Runtime: 116 min); Premium Experience\nShow Details\n| Show Screen | Date Range | Title | Showtime | Days Type | Rate | Revenue |\n| ----------- | ---------- | ----- | -------- | --------- | ---- | ------- |\n1 SCR-1 12/20-12/25 Holiday Spectacular 7:00 PM Daily PM $250 $3,000\nThis booking order is subject to cinema availability and standard terms.\n2 SCR-2 12/20-12/31 Winter Wonderland 4:30 PM Daily MT $150 $3,600\nAll showtimes are approximate and subject to change.\n3 SCR-1 12/26-12/31 New Year Mystery 9:30 PM Daily PM $300 $3,600\n| Total Revenue: |     |     |     |     |     | $12,500.00 |\n| -------------- | --- | --- | --- | --- | --- | ---------- |","packages/markitdown/tests/test_files/expected_outputs/RECEIPT-2024-TXN-98765_retail_purchase.md":"TECHMART ELECTRONICS\n4567 Innovation Blvd\nSan Francisco, CA 94103\n(415) 555-0199\n\n===================================\n\nStore #0342 - Downtown SF\n11/23/2024 14:32:18 PST\nTXN: TXN-98765-2024\nCashier: Emily Rodriguez\nRegister: POS-07\n\n-----------------------------------\n\nWireless Noise-Cancelling\nHeadphones - Premium Black\nAUDIO-5521 1 @ $349.99\nMember Discount $-50.00\n$299.99\nUSB-C Hub 7-in-1 Adapter\nwith HDMI & Ethernet\nACC-8834 2 @ $79.99\n$159.98\nPortable SSD 2TB\nThunderbolt 3 Compatible\nSTOR-2241 1 @ $289.00\nMember Discount $-29.00\n$260.00\nErgonomic Wireless Mouse\nRechargeable Battery\nACC-9012 1 @ $59.99\n$59.99\nScreen Cleaning Kit\nProfessional Grade\nCARE-1156 3 @ $12.99\n$38.97\nHDMI 2.1 Cable 6ft\n8K Resolution Support\nCABLE-7789 2 @ $24.99\nMember Discount $-5.00\n$44.98\n-----------------------------------\n\nSUBTOTAL $863.91\nMember Discount (15%)-$84.00\nSales Tax (8.5%) $66.23\nRewards Applied -$25.00\n===================================\nTOTAL $821.14\n===================================\n\nPAYMENT METHOD\nVisa Card ending in 4782\nAuth: 847392\nRef: REF-20241123-98765\n\n-----------------------------------\n\nREWARDS MEMBER\nSarah Mitchell\nID: TM-447821\nPoints Earned: 821\nTotal Points: 3,247\nNext Reward: $50 gift card\nat 5,000 pts (1,753 to go)\n\n-----------------------------------\n\nRETURN POLICY\nReturns within 30 days\nReceipt required\nElectronics must be unopened\n\n*TXN98765202411231432*\n\nThank you for shopping!\nwww.techmart.example.com\n\n===================================\n\n","packages/markitdown/tests/test_files/expected_outputs/SPARSE-2024-INV-1234_borderless_table.md":"INVENTORY RECONCILIATION REPORT\nReport ID: SPARSE-2024-INV-1234\nWarehouse: Distribution Center East\nReport Date: 2024-11-15\nPrepared By: Sarah Martinez\n| Product Code | Location | Expected | Actual | Variance | Status   |\n| ------------ | -------- | -------- | ------ | -------- | -------- |\n| SKU-8847     | A-12     | 450      |        |          |          |\n|              | B-07     |          | 289    | -23      |          |\n| SKU-9201     |          | 780      | 778    |          | OK       |\n|              | C-15     |          |        | +15      |          |\n| SKU-4563     | D-22     |          | 156    |          | CRITICAL |\n|              |          | 180      |        | -24      |          |\n| SKU-7728     | A-08     | 920      |        |          |          |\n|              |          |          | 935    | +15      | OK       |\nVariance Analysis:\nSummary Statistics:\nTotal Variance Cost: $4,287.50\nCritical Items: 1\nOverall Accuracy: 97.2%\nDetailed Analysis by Category:\nThe inventory reconciliation reveals several key findings. The primary variance driver is SKU-4563,\nwhich shows a -24 unit discrepancy requiring immediate investigation. Location B-07 handling of\nSKU-8847 also demonstrates significant variance. Cross-location verification protocols should be\n\nreviewed to prevent future discrepancies. The overall accuracy rate of 97.2% meets our target\nthreshold, but critical items require expedited resolution to maintain operational efficiency.\nExtended Inventory Review:\n| Product Code | Category    | Unit Cost | Total Value | Last Audit | Notes      |\n| ------------ | ----------- | --------- | ----------- | ---------- | ---------- |\n| SKU-8847     | Electronics | $45.00    | $13,005.00  | 2024-10-15 |            |\n| SKU-9201     | Hardware    | $32.50    | $25,285.00  | 2024-10-22 | Verified   |\n| SKU-4563     | Software    | $120.00   | $18,720.00  |            | Critical   |\n| SKU-7728     | Accessories | $15.75    | $14,726.25  | 2024-11-01 |            |\n| SKU-3345     | Electronics | $67.00    | $22,445.00  | 2024-10-18 |            |\n| SKU-5512     | Hardware    | $89.00    | $31,150.00  |            | Pending    |\n| SKU-6678     | Software    | $200.00   | $42,000.00  | 2024-10-25 | High Value |\n| SKU-7789     | Accessories | $8.50     | $5,950.00   | 2024-11-05 |            |\n| SKU-2234     | Electronics | $125.00   | $35,000.00  |            |            |\n| SKU-1123     | Hardware    | $55.00    | $27,500.00  | 2024-10-30 | Verified   |\nRecommendations:\n1. Immediate review of SKU-4563 handling procedures. 2. Implement additional verification for critical\nitems. 3. Schedule follow-up audit for high-value products (SKU-6678, SKU-2234).\nApproval:"},"files":{"packages/markitdown/ThirdPartyNotices.md":"# THIRD-PARTY SOFTWARE NOTICES AND INFORMATION\n\n**Do Not Translate or Localize**\n\nThis project incorporates components from the projects listed below. The original copyright notices and the licenses \nunder which MarkItDown received such components are set forth below. MarkItDown reserves all rights not expressly \ngranted herein, whether by implication, estoppel or otherwise.\n\n1.dwml (https://github.com/xiilei/dwml)\n\ndwml NOTICES AND INFORMATION BEGIN HERE\n\n-----------------------------------------\n\nNOTE 1: What follows is a verbatim copy of dwml's LICENSE file, as it appeared on March 28th, 2025 - including \nplaceholders for the copyright owner and year.\n\nNOTE 2: The Apache License, Version 2.0, requires that modifications to the dwml source code be documented.  \nThe following section summarizes these changes. The full details are available in the MarkItDown source code \nrepository under PR #1160 (https://github.com/microsoft/markitdown/pull/1160)\n\nThis project incorporates `dwml/latex_dict.py` and `dwml/omml.py` files without any additional logic modifications (which \nlives in `packages/markitdown/src/markitdown/converter_utils/docx/math` location). However, we have reformatted the code\naccording to `black` code formatter.  From `tests/docx.py` file, we have used `DOCXML_ROOT` XML namespaces and the rest of \nthe file is not used.\n\n-----------------------------------------\n\nApache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n-----------------------------------------\nEND OF dwml NOTICES AND INFORMATION","packages/markitdown-ocr/README.md":"# MarkItDown OCR Plugin\n\nLLM Vision plugin for MarkItDown that extracts text from images embedded in PDF, DOCX, PPTX, and XLSX files.\n\nUses the same `llm_client` / `llm_model` pattern that MarkItDown already supports for image descriptions — no new ML libraries or binary dependencies required.\n\n## Features\n\n- **Enhanced PDF Converter**: Extracts text from images within PDFs, with full-page OCR fallback for scanned documents\n- **Enhanced DOCX Converter**: OCR for images in Word documents\n- **Enhanced PPTX Converter**: OCR for images in PowerPoint presentations\n- **Enhanced XLSX Converter**: OCR for images in Excel spreadsheets\n- **Context Preservation**: Maintains document structure and flow when inserting extracted text\n\n## Installation\n\nRequires `markitdown>=0.1.8,<0.2.0`, which provides the Office image-rendering hooks used by this plugin. Installing the plugin automatically resolves a compatible core version.\n\n```bash\npip install markitdown-ocr\n```\n\nThe plugin uses whatever OpenAI-compatible client you already have. Install one if you don't have it yet:\n\n```bash\npip install openai\n```\n\n## Usage\n\n### Command Line\n\n```bash\nmarkitdown document.pdf --use-plugins --llm-client openai --llm-model gpt-4o\n```\n\n### Python API\n\nPass `llm_client` and `llm_model` to `MarkItDown()` exactly as you would for image descriptions:\n\n```python\nfrom markitdown import MarkItDown\nfrom openai import OpenAI\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),\n    llm_model=\"gpt-4o\",\n)\n\nresult = md.convert(\"document_with_images.pdf\")\nprint(result.text_content)\n```\n\nIf no `llm_client` is provided the plugin still loads, but OCR is silently skipped — falling back to the standard built-in converter.\n\n### Custom Prompt\n\nOverride the default extraction prompt for specialized documents:\n\n```python\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),\n    llm_model=\"gpt-4o\",\n    llm_prompt=\"Extract all text from this image, preserving table structure.\",\n)\n```\n\n### Any OpenAI-Compatible Client\n\nWorks with any client that follows the OpenAI API:\n\n```python\nfrom openai import AzureOpenAI\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=AzureOpenAI(\n        api_key=\"...\",\n        azure_endpoint=\"https://your-resource.openai.azure.com/\",\n        api_version=\"2024-02-01\",\n    ),\n    llm_model=\"gpt-4o\",\n)\n```\n\n## How It Works\n\nWhen `MarkItDown(enable_plugins=True, llm_client=..., llm_model=...)` is called:\n\n1. MarkItDown discovers the plugin via the `markitdown.plugin` entry point group\n2. It calls `register_converters()`, forwarding all kwargs including `llm_client` and `llm_model`\n3. The plugin creates an `LLMVisionOCRService` from those kwargs\n4. Four OCR-enhanced converters are registered at **priority -1.0** — before the built-in converters at priority 0.0\n\nWhen a file is converted:\n\n1. The OCR converter accepts the file\n2. It extracts embedded images from the document\n3. Each image is sent to the LLM with an extraction prompt\n4. The returned text is placed alongside document content (XLSX images follow their sheet's table)\n5. If the LLM call fails, conversion continues without that image's text\n\nThe DOCX, PPTX, and XLSX converters subclass their core counterparts and override the same semi-private `_image_to_html` method. Core handles native content, preprocessing, and placement; the plugin supplies escaped OCR HTML, which passes through the shared HTML-to-Markdown renderer. PDF uses its separate existing pipeline.\n\n## Supported File Formats\n\n### PDF\n\n- Embedded images are extracted by position (via `page.images` / page XObjects) and OCR'd inline, interleaved with the surrounding text in vertical reading order.\n- **Scanned PDFs** (pages with no extractable text) are detected automatically: each page is rendered at 300 DPI and sent to the LLM as a full-page image.\n- **Malformed PDFs** that pdfplumber/pdfminer cannot open (e.g. truncated EOF) are retried with PyMuPDF page rendering, so content is still recovered.\n\n### DOCX\n\n- Inherits core DOCX preprocessing, styles, math, and Mammoth conversion.\n- Mammoth provides each embedded image to `_image_to_html`. OCR fragments are inserted into the document's HTML before Markdown rendering, not substituted into finished Markdown.\n- Block fragments split enclosing paragraphs where necessary and remain inside their table cell or list item. Table-cell line breaks follow the shared HTML converter's existing limitations.\n\n### PPTX\n\n- Picture shapes, placeholder shapes with images, and images inside groups are all supported.\n- Inherits core shape ordering, native text, tables, charts, and speaker notes.\n- Slide content now uses the core converter's real line breaks rather than the old plugin's literal `\\n` text, and inherits its empty-title and empty-notes handling.\n- If an `llm_client` is configured, the LLM is asked for a description first; OCR is used as the fallback when no description is returned.\n\n### XLSX\n\n- Inherits core workbook repair and table rendering; images are read from the same repaired workbook.\n- Images are listed under a `### Images in this sheet:` section after the sheet's data table — they are not interleaved into the table rows.\n- Sheet heading spacing follows the core converter; no new cell-position labels are added.\n- Legacy `.xls` files remain handled by the existing core converter, without image OCR.\n\n### Output format\n\nEvery extracted OCR block is wrapped as:\n\n```text\n*[Image OCR]\n<extracted text>\n[End OCR]*\n```\n\nFor Office formats, recognized text is escaped as literal HTML text before Markdown rendering. Markdown escaping and line breaks therefore follow the shared HTML converter: for example, underscores may be backslash-escaped, and direct converter results use Markdown hard breaks. `MarkItDown` subsequently strips trailing whitespace from each output line. Empty recognition retains the native image representation (XLSX normally omits images).\n\nRepeated image bytes are recognized once per conversion, while the result is placed at every occurrence. The cache is not shared across documents or service overrides.\n\n## Troubleshooting\n\n### OCR text missing from output\n\nThe most likely cause is a missing `llm_client` or `llm_model`. Verify:\n\n```python\nfrom openai import OpenAI\nfrom markitdown import MarkItDown\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),   # required\n    llm_model=\"gpt-4o\",    # required\n)\n```\n\n### Plugin not loading\n\nConfirm the plugin is installed and discovered:\n\n```bash\nmarkitdown --list-plugins   # should show: ocr\n```\n\n### API errors\n\nThe plugin propagates LLM API errors as warnings and continues conversion. Check your API key, quota, and that the chosen model supports vision inputs.\n\nFor Office OCR, a service-reported error emits a warning and retains native image rendering. Exceptions raised by custom OCR services propagate from direct converter calls; `MarkItDown` can retry another applicable converter through its normal fallback behavior.\n\n## Development\n\n### Running Tests\n\n```bash\ncd packages/markitdown-ocr\npytest tests/ -v\n```\n\n### Building from Source\n\n```bash\ngit clone https://github.com/microsoft/markitdown.git\ncd markitdown\npip install -e 'packages/markitdown[docx,pptx,xlsx]' -e packages/markitdown-ocr\n```\n\n## Contributing\n\nContributions are welcome! See the [MarkItDown repository](https://github.com/microsoft/markitdown) for guidelines.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n## Changelog\n\n### 0.1.0 (Initial Release)\n\n- LLM Vision OCR for PDF, DOCX, PPTX, XLSX\n- Full-page OCR fallback for scanned PDFs\n- Context-aware inline text insertion\n- Priority-based converter replacement (no code changes required)\n","packages/markitdown/tests/test_files/test.json":"{\n    \"key1\": \"string_value\",\n    \"key2\": 1234,\n    \"key3\": [\n        \"list_value1\",\n        \"list_value2\"\n    ],\n    \"5b64c88c-b3c3-4510-bcb8-da0b200602d8\": \"uuid_key\",\n    \"uuid_value\": \"9700dc99-6685-40b4-9a3a-5e406dcb37f3\"\n}\n","packages/markitdown/README.md":"# MarkItDown\n\n> [!TIP]\n> MarkItDown is a Python package and command-line utility for converting various files to Markdown (e.g., for indexing, text analysis, etc).\n>\n> For more information, and full documentation, see the project [README.md](https://github.com/microsoft/markitdown) on GitHub.\n\n> [!IMPORTANT]\n> MarkItDown performs I/O with the privileges of the current process. Like open() or requests.get(), it will access resources that the process itself can access. Sanitize your inputs in untrusted environments, and call the narrowest `convert_*` function needed for your use case (e.g., `convert_stream()`, or `convert_local()`). See the [Security Considerations](https://github.com/microsoft/markitdown#security-considerations) section of the documentation for more information.\n\n## Installation\n\nFrom PyPI:\n\n```bash\npip install 'markitdown[all]'\n```\n\nFrom source:\n\n```bash\ngit clone git@github.com:microsoft/markitdown.git\ncd markitdown\npip install -e 'packages/markitdown[all]'\n```\n\n## Usage\n\n### Command-Line\n\n```bash\nmarkitdown path-to-file.pdf > document.md\n```\n\n### Python API\n\n```python\nfrom markitdown import MarkItDown\n\nmd = MarkItDown()\nresult = md.convert(\"test.xlsx\")\nprint(result.markdown)\n```\n\n### More Information\n\nFor more information, and full documentation, see the project [README.md](https://github.com/microsoft/markitdown) on GitHub.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n","packages/markitdown-sample-plugin/README.md":"# MarkItDown Sample Plugin\n\n[![PyPI](https://img.shields.io/pypi/v/markitdown-sample-plugin.svg)](https://pypi.org/project/markitdown-sample-plugin/)\n![PyPI - Downloads](https://img.shields.io/pypi/dd/markitdown-sample-plugin)\n[![Built by AutoGen Team](https://img.shields.io/badge/Built%20by-AutoGen%20Team-blue)](https://github.com/microsoft/autogen)\n\n\nThis project shows how to create a sample plugin for MarkItDown. The most important parts are as follows:\n\nFirst, implement your custom DocumentConverter:\n\n```python\nfrom typing import BinaryIO, Any\nfrom markitdown import MarkItDown, DocumentConverter, DocumentConverterResult, StreamInfo, PRIORITY_SPECIFIC_FILE_FORMAT\n\nclass RtfConverter(DocumentConverter):\n\n    def __init__(\n        self, priority: float = PRIORITY_SPECIFIC_FILE_FORMAT\n    ):\n        super().__init__(priority=priority)\n\n    def accepts(\n        self,\n        file_stream: BinaryIO,\n        stream_info: StreamInfo,\n        **kwargs: Any,\n    ) -> bool:\n\n        # Implement logic to check if the file stream is an RTF file\n        # ...\n        raise NotImplementedError()\n\n\n    def convert(\n        self,\n        file_stream: BinaryIO,\n        stream_info: StreamInfo,\n        **kwargs: Any,\n    ) -> DocumentConverterResult:\n\n        # Implement logic to convert the file stream to Markdown\n        # ...\n        raise NotImplementedError()\n```\n\nNext, make sure your package implements and exports the following:\n\n```python\n# The version of the plugin interface that this plugin uses.\n# The only supported version is 1 for now.\n__plugin_interface_version__ = 1\n\n# The main entrypoint for the plugin. This is called each time MarkItDown instances are created.\ndef register_converters(markitdown: MarkItDown, **kwargs):\n    \"\"\"\n    Called during construction of MarkItDown instances to register converters provided by plugins.\n    \"\"\"\n\n    # Simply create and attach an RtfConverter instance\n    markitdown.register_converter(RtfConverter())\n```\n\n\nFinally, create an entrypoint in the `pyproject.toml` file:\n\n```toml\n[project.entry-points.\"markitdown.plugin\"]\nsample_plugin = \"markitdown_sample_plugin\"\n```\n\nHere, the value of `sample_plugin` can be any key, but should ideally be the name of the plugin. The value is the fully qualified name of the package implementing the plugin.\n\n\n## Installation\n\nTo use the plugin with MarkItDown, it must be installed. To install the plugin from the current directory use:\n\n```bash\npip install -e .\n```\n\nOnce the plugin package is installed, verify that it is available to MarkItDown by running:\n\n```bash\nmarkitdown --list-plugins\n```\n\nTo use the plugin for a conversion use the `--use-plugins` flag. For example, to convert an RTF file:\n\n```bash\nmarkitdown --use-plugins path-to-file.rtf\n```\n\nIn Python, plugins can be enabled as follows:\n\n```python\nfrom markitdown import MarkItDown\n\nmd = MarkItDown(enable_plugins=True)\nresult = md.convert(\"path-to-file.rtf\")\nprint(result.text_content)\n```\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n","packages/markitdown-mcp/README.md":"# MarkItDown-MCP\n\n> [!IMPORTANT]\n> The MarkItDown-MCP package is meant for **local use**, with local trusted agents. In particular, when running the MCP server with Streamable HTTP or SSE, it binds to `localhost` by default, and is not exposed to other machines on the network or Internet. In this configuration, it is meant to be a direct alternative to the STDIO transport, which may be more convenient in some cases. DO NOT bind the server to other interfaces unless you understand the [security implications](#security-considerations) of doing so.\n\n\n[![PyPI](https://img.shields.io/pypi/v/markitdown-mcp.svg)](https://pypi.org/project/markitdown-mcp/)\n![PyPI - Downloads](https://img.shields.io/pypi/dd/markitdown-mcp)\n[![Built by AutoGen Team](https://img.shields.io/badge/Built%20by-AutoGen%20Team-blue)](https://github.com/microsoft/autogen)\n\nThe `markitdown-mcp` package provides a lightweight STDIO, Streamable HTTP, and SSE MCP server for calling MarkItDown.\n\nIt exposes one tool: `convert_to_markdown(uri)`, where uri can be any `http:`, `https:`, `file:`, or `data:` URI.\n\n## Installation\n\nTo install the package, use pip:\n\n```bash\npip install markitdown-mcp\n```\n\n## Usage\n\nTo run the MCP server, using STDIO (default), use the following command:\n\n\n```bash\nmarkitdown-mcp\n```\n\nTo run the MCP server, using Streamable HTTP and SSE, use the following command:\n\n```bash\nmarkitdown-mcp --http --host 127.0.0.1 --port 3001\n```\n\n## Running in Docker\n\nTo run `markitdown-mcp` in Docker, build the Docker image using the provided Dockerfile:\n```bash\ndocker build -t markitdown-mcp:latest .\n```\n\nAnd run it using:\n```bash\ndocker run -it --rm markitdown-mcp:latest\n```\nThis will be sufficient for remote URIs. To access local files, you need to mount the local directory into the container. For example, if you want to access files in `/home/user/data`, you can run:\n\n```bash\ndocker run -it --rm -v /home/user/data:/workdir markitdown-mcp:latest\n```\n\nOnce mounted, all files under data will be accessible under `/workdir` in the container. For example, if you have a file `example.txt` in `/home/user/data`, it will be accessible in the container at `/workdir/example.txt`.\n\n## Accessing from Claude Desktop\n\nIt is recommended to use the Docker image when running the MCP server for Claude Desktop.\n\nFollow [these instructions](https://modelcontextprotocol.io/quickstart/user#for-claude-desktop-users) to access Claude's `claude_desktop_config.json` file.\n\nEdit it to include the following JSON entry:\n\n```json\n{\n  \"mcpServers\": {\n    \"markitdown\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"markitdown-mcp:latest\"\n      ]\n    }\n  }\n}\n```\n\nIf you want to mount a directory, adjust it accordingly:\n\n```json\n{\n  \"mcpServers\": {\n    \"markitdown\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"-v\",\n        \"/home/user/data:/workdir\",\n        \"markitdown-mcp:latest\"\n      ]\n    }\n  }\n}\n```\n\n## Debugging\n\nTo debug the MCP server you can use the `MCP Inspector` tool.\n\n```bash\nnpx @modelcontextprotocol/inspector\n```\n\nYou can then connect to the inspector through the specified host and port (e.g., `http://localhost:5173/`).\n\nIf using STDIO:\n* select `STDIO` as the transport type,\n* input `markitdown-mcp` as the command, and\n* click `Connect`\n\nIf using Streamable HTTP:\n* select `Streamable HTTP` as the transport type,\n* input `http://127.0.0.1:3001/mcp` as the URL, and\n* click `Connect`\n\nIf using SSE:\n* select `SSE` as the transport type,\n* input `http://127.0.0.1:3001/sse` as the URL, and\n* click `Connect`\n\nFinally:\n* click the `Tools` tab,\n* click `List Tools`,\n* click `convert_to_markdown`, and\n* run the tool on any valid URI.\n\n## Security Considerations\n\nThe server does not support authentication, and runs with the privileges of the user running it. For this reason, when running in SSE or Streamable HTTP mode, the server binds by default to `localhost`. Even still, it is important to recognize that the server can be accessed by any process or users on the same local machine, and that the `convert_to_markdown` tool can be used to read any file that the server's user has access to, or any data from the network. If you require additional security, consider running the server in a sandboxed environment, such as a virtual machine or container, and ensure that the user permissions are properly configured to limit access to sensitive files and network segments. Above all, DO NOT bind the server to other interfaces (non-localhost) unless you understand the security implications of doing so.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n","packages/markitdown/tests/test_files/expected_outputs/test.md":"1\n\nIntroduction\n\nLarge language models (LLMs) are becoming a crucial building block in developing powerful agents\nthat utilize LLMs for reasoning, tool usage, and adapting to new observations (Yao et al., 2022; Xi\net al., 2023; Wang et al., 2023b) in many real-world tasks. Given the expanding tasks that could\nbenefit from LLMs and the growing task complexity, an intuitive approach to scale up the power of\nagents is to use multiple agents that cooperate. Prior work suggests that multiple agents can help\nencourage divergent thinking (Liang et al., 2023), improve factuality and reasoning (Du et al., 2023),\nand provide validation (Wu et al., 2023). In light of the intuition and early evidence of promise, it is\nintriguing to ask the following question: how can we facilitate the development of LLM applications\nthat could span a broad spectrum of domains and complexities based on the multi-agent approach?\n\nOur insight is to use multi-agent conversations to achieve it. There are at least three reasons con-\nfirming its general feasibility and utility thanks to recent advances in LLMs: First, because chat-\noptimized LLMs (e.g., GPT-4) show the ability to incorporate feedback, LLM agents can cooperate\nthrough conversations with each other or human(s), e.g., a dialog where agents provide and seek rea-\nsoning, observations, critiques, and validation. Second, because a single LLM can exhibit a broad\nrange of capabilities (especially when configured with the correct prompt and inference settings),\nconversations between differently configured agents can help combine these broad LLM capabilities\nin a modular and complementary manner. Third, LLMs have demonstrated ability to solve complex\ntasks when the tasks are broken into simpler subtasks. Multi-agent conversations can enable this\npartitioning and integration in an intuitive manner. How can we leverage the above insights and\nsupport different applications with the common requirement of coordinating multiple agents, poten-\ntially backed by LLMs, humans, or tools exhibiting different capacities? We desire a multi-agent\nconversation framework with generic abstraction and effective implementation that has the flexibil-\nity to satisfy different application needs. Achieving this requires addressing two critical questions:\n(1) How can we design individual agents that are capable, reusable, customizable, and effective in\nmulti-agent collaboration? (2) How can we develop a straightforward, unified interface that can\naccommodate a wide range of agent conversation patterns? In practice, applications of varying\ncomplexities may need distinct sets of agents with specific capabilities, and may require different\nconversation patterns, such as single- or multi-turn dialogs, different human involvement modes, and\nstatic vs. dynamic conversation. Moreover, developers may prefer the flexibility to program agent\ninteractions in natural language or code. Failing to adequately address these two questions would\nlimit the framework’s scope of applicability and generality.\nWhile there is contemporaneous exploration of multi-agent approaches,3 we present AutoGen, a\ngeneralized multi-agent conversation framework (Figure 1), based on the following new concepts.\n1 Customizable and conversable agents. AutoGen uses a generic design of agents that can lever-\nage LLMs, human inputs, tools, or a combination of them. The result is that developers can\neasily and quickly create agents with different roles (e.g., agents to write code, execute code,\nwire in human feedback, validate outputs, etc.) by selecting and configuring a subset of built-in\ncapabilities. The agent’s backend can also be readily extended to allow more custom behaviors.\nTo make these agents suitable for multi-agent conversation, every agent is made conversable –\nthey can receive, react, and respond to messages. When configured properly, an agent can hold\nmultiple turns of conversations with other agents autonomously or solicit human inputs at cer-\ntain rounds, enabling human agency and automation. The conversable agent design leverages the\nstrong capability of the most advanced LLMs in taking feedback and making progress via chat\nand also allows combining capabilities of LLMs in a modular fashion. (Section 2.1)\n\n2 Conversation programming. A fundamental insight of AutoGen is to simplify and unify com-\nplex LLM application workflows as multi-agent conversations. So AutoGen adopts a program-\nming paradigm centered around these inter-agent conversations. We refer to this paradigm as\nconversation programming, which streamlines the development of intricate applications via two\nprimary steps: (1) defining a set of conversable agents with specific capabilities and roles (as\ndescribed above); (2) programming the interaction behavior between agents via conversation-\ncentric computation and control. Both steps can be achieved via a fusion of natural and pro-\ngramming languages to build applications with a wide range of conversation patterns and agent\nbehaviors. AutoGen provides ready-to-use implementations and also allows easy extension and\nexperimentation for both steps. (Section 2.2)\n\n3We refer to Appendix A for a detailed discussion.\n\n2\n\n","packages/markitdown/tests/test_files/expected_outputs/REPAIR-2022-INV-001_multipage.md":"ZAVA AUTO REPAIR\nCertified Collision Repair\n123 Main Street, Redmond, WA 98052\nPhone: (425) 000-0000\nPreliminary Estimate (ID: EST-1008)\n| Customer Information |                     |     | Vehicle Information |                   |\n| -------------------- | ------------------- | --- | ------------------- | ----------------- |\n| Insured name         | Gabriel Diaz        |     | Year                | 2022              |\n| Claim #              | SF-1008             |     | Make                | Jeep              |\n| Policy #             | POL-2022-555        |     | Model               | Grand Cherokee    |\n| Phone                | (425) 111-1111      |     | Trim                | Limited           |\n| Email                | gabriel@contoso.com |     | VIN                 | 1C4RJFBG2NC123456 |\n|                      |                     |     | Color               | White             |\n|                      |                     |     | Odometer            | 9,800             |\n| Repair Order #       | RO-20221108         |     | Estimator           | Ellis Turner      |\nEstimate Totals\n|                  |     | Hours | Rate | Cost  |\n| ---------------- | --- | ----- | ---- | ----- |\n| Parts            |     |       |      | 2,100 |\n| Body Labor       |     | 2     | 150  | 300   |\n| Paint Labor      |     | 1.5   | 150  | 225   |\n| Mechanical Labor |     | -     | -    | -     |\nSupplies\n|               | Paint Supplies           |     |        | 60     |\n| ------------- | ------------------------ | --- | ------ | ------ |\n|               | Body Supplies            |     |        | 30     |\n| Other Charges |                          |     |        | 15     |\n| Subtotal      |                          |     |        | 2,730  |\n| Sales Tax     |                          |     | 10.20% | 278.46 |\n| GRAND TOTAL   |                          |     |        | 5,738  |\n| Note          | Minor rear bumper repair |     |        |        |\nThis is a preliminary estimate for the visible damage of the vehicle. Additional damage / repairs / parts may be found\nafter the vehicle has been disassembled and damaged parts have been removed. Suspension damages may be\npresent, but can not be determined until an alignment on the vehicle has been done. Parts Prices may vary due to\nmodels and vehicle maker price updates. Please be advised if vehicle owner elects to have vehicle sent to service for\nany mechanical concerns, ALL service departments charge a vehicle diagnostic charge. If the mechanical concern is\ndeemed not related to an insurance claim, vehicle owner will be reponsible for charges.\n\nZAVA AUTO REPAIR\nCertified Collision Repair\n123 Main Street, Redmond, WA 98052\nPhone: (425) 000-0000\nPreliminary Estimate (ID: EST-1008)\nCustomer Information Vehicle Information\n| Insured name   | Bruce Wayne                |     | Year      | 2025         |\n| -------------- | -------------------------- | --- | --------- | ------------ |\n| Claim #        |                            | 999 | Make      | Batman       |\n| Policy #       | IM-BATMAN                  |     | Model     | Batmobile    |\n| Phone          | (416) 555-1234             |     | Trim      | Limited      |\n| Email          | batman@wayneindustries.com |     | VIN       | XXX          |\n|                |                            |     | Color     | Black        |\n|                |                            |     | Odometer  | 1            |\n| Repair Order # | RO-20221108                |     | Estimator | Ellis Turner |\nEstimate Totals\n|                  |     | Hours | Rate | Cost   |\n| ---------------- | --- | ----- | ---- | ------ |\n| Parts            |     |       |      | 99,999 |\n| Body Labor       |     | 2     | 150  | 300    |\n| Paint Labor      |     | 1.5   | 150  | 225    |\n| Mechanical Labor |     | -     | -    | -      |\nSupplies\n|               | Paint Supplies           |     |        | 60        |\n| ------------- | ------------------------ | --- | ------ | --------- |\n|               | Body Supplies            |     |        | 30        |\n| Other Charges |                          |     |        | 15        |\n| Subtotal      |                          |     |        | 100,629   |\n| Sales Tax     |                          |     | 10.20% | 10264.158 |\n| GRAND TOTAL   |                          |     |        | 211,522   |\n| Note          | Minor rear bumper repair |     |        |           |\n\nThis is a preliminary estimate for the visible damage of the vehicle. Additional damage / repairs / parts may be found\nafter the vehicle has been disassembled and damaged parts have been removed. Suspension damages may be\npresent, but can not be determined until an alignment on the vehicle has been done. Parts Prices may vary due to\nmodels and vehicle maker price updates. Please be advised if vehicle owner elects to have vehicle sent to service for\nany mechanical concerns, ALL service departments charge a vehicle diagnostic charge. If the mechanical concern is\ndeemed not related to an insurance claim, vehicle owner will be reponsible for charges.","packages/markitdown/tests/test_files/expected_outputs/movie-theater-booking-2024.md":"BOOKING ORDER\nPrint Date 12/15/2024 14:30:22\nPage 1 of 1\nSTARLIGHT CINEMAS\nOrders\n| Order / Rev: | 2024-12-5678   |     |     | Cinema:          |     | Downtown Multiplex |\n| ------------ | -------------- | --- | --- | ---------------- | --- | ------------------ |\n| Alt Order #: | SC-WINTER-2024 |     |     | Primary Contact: |     | Sarah Johnson      |\nProduct Desc: Holiday Movie Marathon Package Location: NYC-01\n| Estimate:            | EST-456                 |     |     | Region: |     | NORTHEAST |\n| -------------------- | ----------------------- | --- | --- | ------- | --- | --------- |\n| Booking Dates:       | 12/20/2024 - 12/31/2024 |     |     |         |     |           |\n| Original Date / Rev: | 12/01/24 / 12/10/24     |     |     |         |     |           |\n| Order Type:          | Premium Package         |     |     |         |     |           |\nBooking Agency\n| Name:            | Premier Entertainment Group |     |     |                |     |           |\n| ---------------- | --------------------------- | --- | --- | -------------- | --- | --------- |\n|                  |                             |     |     | Billing Type:  |     | Net 30    |\n| Contact:         | Michael Chen                |     |     |                |     |           |\n|                  |                             |     |     | Payment Terms: |     | Corporate |\n| Billing Contact: | accounting@premierent.com   |     |     |                |     |           |\n|                  |                             |     |     | Commission:    |     | 10%       |\n555 Broadway Suite 1200\nNew York, NY 10012\nCustomer\n| Name:          | Universal Studios Distribution |     |     |     |     |     |\n| -------------- | ------------------------------ | --- | --- | --- | --- | --- |\n| Category:      | Film Distributor               |     |     |     |     |     |\n| Contact Email: | bookings@universalstudios.com  |     |     |     |     |     |\n| Customer ID:   | CUST-98765                     |     |     |     |     |     |\n| Revenue Code:  | FILM-PREMIUM                   |     |     |     |     |     |\nBooking Summary\n| Start Date | End Date | # Shows | Gross Amount | Net Amount |     |     |\n| ---------- | -------- | ------- | ------------ | ---------- | --- | --- |\n| 12/20/24   | 12/31/24 | 48      | $12,500.00   | $11,250.00 |     |     |\nTotals\n| Month         | # Shows | Gross Amount |     | Net Amount |     | Occupancy |\n| ------------- | ------- | ------------ | --- | ---------- | --- | --------- |\n| December 2024 | 48      | $12,500.00   |     | $11,250.00 |     | 85%       |\n| Totals        | 48      | $12,500.00   |     | $11,250.00 |     | 85%       |\nAccount Representatives\nRepresentative Territory Region Start Date / End Date Commission %\n| Sarah Johnson | NYC Metro | NORTHEAST | 12/20/24 - 12/31/24 |     | 100% |     |\n| ------------- | --------- | --------- | ------------------- | --- | ---- | --- |\nShow Schedule Details\nLn Screen Start End Movie Title Format Showtime Days Shows Rate Type Total\n1 SCR-1 12/20/24 12/25/24 Holiday Spectacular IMAX 3D 7:00 PM Daily 12 $250 PM $3,000\n(Runtime: 142 min); Holiday Season Premium\n2 SCR-2 12/20/24 12/31/24 Winter Wonderland Standard 4:30 PM Daily 24 $150 MT $3,600\n(Runtime: 98 min); Matinee Special\n3 SCR-1 12/26/24 12/31/24 New Year Mystery 4DX 9:30 PM Daily 12 $300 PM $3,600\n(Runtime: 116 min); Premium Experience\nShow Details\n| Show Screen | Date Range | Title | Showtime | Days Type | Rate | Revenue |\n| ----------- | ---------- | ----- | -------- | --------- | ---- | ------- |\n1 SCR-1 12/20-12/25 Holiday Spectacular 7:00 PM Daily PM $250 $3,000\nThis booking order is subject to cinema availability and standard terms.\n2 SCR-2 12/20-12/31 Winter Wonderland 4:30 PM Daily MT $150 $3,600\nAll showtimes are approximate and subject to change.\n3 SCR-1 12/26-12/31 New Year Mystery 9:30 PM Daily PM $300 $3,600\n| Total Revenue: |     |     |     |     |     | $12,500.00 |\n| -------------- | --- | --- | --- | --- | --- | ---------- |","packages/markitdown/tests/test_files/expected_outputs/RECEIPT-2024-TXN-98765_retail_purchase.md":"TECHMART ELECTRONICS\n4567 Innovation Blvd\nSan Francisco, CA 94103\n(415) 555-0199\n\n===================================\n\nStore #0342 - Downtown SF\n11/23/2024 14:32:18 PST\nTXN: TXN-98765-2024\nCashier: Emily Rodriguez\nRegister: POS-07\n\n-----------------------------------\n\nWireless Noise-Cancelling\nHeadphones - Premium Black\nAUDIO-5521 1 @ $349.99\nMember Discount $-50.00\n$299.99\nUSB-C Hub 7-in-1 Adapter\nwith HDMI & Ethernet\nACC-8834 2 @ $79.99\n$159.98\nPortable SSD 2TB\nThunderbolt 3 Compatible\nSTOR-2241 1 @ $289.00\nMember Discount $-29.00\n$260.00\nErgonomic Wireless Mouse\nRechargeable Battery\nACC-9012 1 @ $59.99\n$59.99\nScreen Cleaning Kit\nProfessional Grade\nCARE-1156 3 @ $12.99\n$38.97\nHDMI 2.1 Cable 6ft\n8K Resolution Support\nCABLE-7789 2 @ $24.99\nMember Discount $-5.00\n$44.98\n-----------------------------------\n\nSUBTOTAL $863.91\nMember Discount (15%)-$84.00\nSales Tax (8.5%) $66.23\nRewards Applied -$25.00\n===================================\nTOTAL $821.14\n===================================\n\nPAYMENT METHOD\nVisa Card ending in 4782\nAuth: 847392\nRef: REF-20241123-98765\n\n-----------------------------------\n\nREWARDS MEMBER\nSarah Mitchell\nID: TM-447821\nPoints Earned: 821\nTotal Points: 3,247\nNext Reward: $50 gift card\nat 5,000 pts (1,753 to go)\n\n-----------------------------------\n\nRETURN POLICY\nReturns within 30 days\nReceipt required\nElectronics must be unopened\n\n*TXN98765202411231432*\n\nThank you for shopping!\nwww.techmart.example.com\n\n===================================\n\n","packages/markitdown/tests/test_files/expected_outputs/SPARSE-2024-INV-1234_borderless_table.md":"INVENTORY RECONCILIATION REPORT\nReport ID: SPARSE-2024-INV-1234\nWarehouse: Distribution Center East\nReport Date: 2024-11-15\nPrepared By: Sarah Martinez\n| Product Code | Location | Expected | Actual | Variance | Status   |\n| ------------ | -------- | -------- | ------ | -------- | -------- |\n| SKU-8847     | A-12     | 450      |        |          |          |\n|              | B-07     |          | 289    | -23      |          |\n| SKU-9201     |          | 780      | 778    |          | OK       |\n|              | C-15     |          |        | +15      |          |\n| SKU-4563     | D-22     |          | 156    |          | CRITICAL |\n|              |          | 180      |        | -24      |          |\n| SKU-7728     | A-08     | 920      |        |          |          |\n|              |          |          | 935    | +15      | OK       |\nVariance Analysis:\nSummary Statistics:\nTotal Variance Cost: $4,287.50\nCritical Items: 1\nOverall Accuracy: 97.2%\nDetailed Analysis by Category:\nThe inventory reconciliation reveals several key findings. The primary variance driver is SKU-4563,\nwhich shows a -24 unit discrepancy requiring immediate investigation. Location B-07 handling of\nSKU-8847 also demonstrates significant variance. Cross-location verification protocols should be\n\nreviewed to prevent future discrepancies. The overall accuracy rate of 97.2% meets our target\nthreshold, but critical items require expedited resolution to maintain operational efficiency.\nExtended Inventory Review:\n| Product Code | Category    | Unit Cost | Total Value | Last Audit | Notes      |\n| ------------ | ----------- | --------- | ----------- | ---------- | ---------- |\n| SKU-8847     | Electronics | $45.00    | $13,005.00  | 2024-10-15 |            |\n| SKU-9201     | Hardware    | $32.50    | $25,285.00  | 2024-10-22 | Verified   |\n| SKU-4563     | Software    | $120.00   | $18,720.00  |            | Critical   |\n| SKU-7728     | Accessories | $15.75    | $14,726.25  | 2024-11-01 |            |\n| SKU-3345     | Electronics | $67.00    | $22,445.00  | 2024-10-18 |            |\n| SKU-5512     | Hardware    | $89.00    | $31,150.00  |            | Pending    |\n| SKU-6678     | Software    | $200.00   | $42,000.00  | 2024-10-25 | High Value |\n| SKU-7789     | Accessories | $8.50     | $5,950.00   | 2024-11-05 |            |\n| SKU-2234     | Electronics | $125.00   | $35,000.00  |            |            |\n| SKU-1123     | Hardware    | $55.00    | $27,500.00  | 2024-10-30 | Verified   |\nRecommendations:\n1. Immediate review of SKU-4563 handling procedures. 2. Implement additional verification for critical\nitems. 3. Schedule follow-up audit for high-value products (SKU-6678, SKU-2234).\nApproval:"},"items":[{"name":"movie-theater-booking-2024.md","path":"packages/markitdown/tests/test_files/expected_outputs/movie-theater-booking-2024.md","rawUrl":"https://raw.githubusercontent.com/microsoft/markitdown/HEAD/packages/markitdown/tests/test_files/expected_outputs/movie-theater-booking-2024.md","title":"Expected_outputs Skill","category":"anthropic-skill","format":"markdown","content":"BOOKING ORDER\nPrint Date 12/15/2024 14:30:22\nPage 1 of 1\nSTARLIGHT CINEMAS\nOrders\n| Order / Rev: | 2024-12-5678   |     |     | Cinema:          |     | Downtown Multiplex |\n| ------------ | -------------- | --- | --- | ---------------- | --- | ------------------ |\n| Alt Order #: | SC-WINTER-2024 |     |     | Primary Contact: |     | Sarah Johnson      |\nProduct Desc: Holiday Movie Marathon Package Location: NYC-01\n| Estimate:            | EST-456                 |     |     | Region: |     | NORTHEAST |\n| -------------------- | ----------------------- | --- | --- | ------- | --- | --------- |\n| Booking Dates:       | 12/20/2024 - 12/31/2024 |     |     |         |     |           |\n| Original Date / Rev: | 12/01/24 / 12/10/24     |     |     |         |     |           |\n| Order Type:          | Premium Package         |     |     |         |     |           |\nBooking Agency\n| Name:            | Premier Entertainment Group |     |     |                |     |           |\n| ---------------- | --------------------------- | --- | --- | -------------- | --- | --------- |\n|                  |                             |     |     | Billing Type:  |     | Net 30    |\n| Contact:         | Michael Chen                |     |     |                |     |           |\n|                  |                             |     |     | Payment Terms: |     | Corporate |\n| Billing Contact: | accounting@premierent.com   |     |     |                |     |           |\n|                  |                             |     |     | Commission:    |     | 10%       |\n555 Broadway Suite 1200\nNew York, NY 10012\nCustomer\n| Name:          | Universal Studios Distribution |     |     |     |     |     |\n| -------------- | ------------------------------ | --- | --- | --- | --- | --- |\n| Category:      | Film Distributor               |     |     |     |     |     |\n| Contact Email: | bookings@universalstudios.com  |     |     |     |     |     |\n| Customer ID:   | CUST-98765                     |     |     |     |     |     |\n| Revenue Code:  | FILM-PREMIUM                   |     |     |     |     |     |\nBooking Summary\n| Start Date | End Date | # Shows | Gross Amount | Net Amount |     |     |\n| ---------- | -------- | ------- | ------------ | ---------- | --- | --- |\n| 12/20/24   | 12/31/24 | 48      | $12,500.00   | $11,250.00 |     |     |\nTotals\n| Month         | # Shows | Gross Amount |     | Net Amount |     | Occupancy |\n| ------------- | ------- | ------------ | --- | ---------- | --- | --------- |\n| December 2024 | 48      | $12,500.00   |     | $11,250.00 |     | 85%       |\n| Totals        | 48      | $12,500.00   |     | $11,250.00 |     | 85%       |\nAccount Representatives\nRepresentative Territory Region Start Date / End Date Commission %\n| Sarah Johnson | NYC Metro | NORTHEAST | 12/20/24 - 12/31/24 |     | 100% |     |\n| ------------- | --------- | --------- | ------------------- | --- | ---- | --- |\nShow Schedule Details\nLn Screen Start End Movie Title Format Showtime Days Shows Rate Type Total\n1 SCR-1 12/20/24 12/25/24 Holiday Spectacular IMAX 3D 7:00 PM Daily 12 $250 PM $3,000\n(Runtime: 142 min); Holiday Season Premium\n2 SCR-2 12/20/24 12/31/24 Winter Wonderland Standard 4:30 PM Daily 24 $150 MT $3,600\n(Runtime: 98 min); Matinee Special\n3 SCR-1 12/26/24 12/31/24 New Year Mystery 4DX 9:30 PM Daily 12 $300 PM $3,600\n(Runtime: 116 min); Premium Experience\nShow Details\n| Show Screen | Date Range | Title | Showtime | Days Type | Rate | Revenue |\n| ----------- | ---------- | ----- | -------- | --------- | ---- | ------- |\n1 SCR-1 12/20-12/25 Holiday Spectacular 7:00 PM Daily PM $250 $3,000\nThis booking order is subject to cinema availability and standard terms.\n2 SCR-2 12/20-12/31 Winter Wonderland 4:30 PM Daily MT $150 $3,600\nAll showtimes are approximate and subject to change.\n3 SCR-1 12/26-12/31 New Year Mystery 9:30 PM Daily PM $300 $3,600\n| Total Revenue: |     |     |     |     |     | $12,500.00 |\n| -------------- | --- | --- | --- | --- | --- | ---------- |","isInternal":false,"tokens":1119,"sizeBytes":4030},{"name":"RECEIPT-2024-TXN-98765_retail_purchase.md","path":"packages/markitdown/tests/test_files/expected_outputs/RECEIPT-2024-TXN-98765_retail_purchase.md","rawUrl":"https://raw.githubusercontent.com/microsoft/markitdown/HEAD/packages/markitdown/tests/test_files/expected_outputs/RECEIPT-2024-TXN-98765_retail_purchase.md","title":"Expected_outputs Skill","category":"anthropic-skill","format":"markdown","content":"TECHMART ELECTRONICS\n4567 Innovation Blvd\nSan Francisco, CA 94103\n(415) 555-0199\n\n===================================\n\nStore #0342 - Downtown SF\n11/23/2024 14:32:18 PST\nTXN: TXN-98765-2024\nCashier: Emily Rodriguez\nRegister: POS-07\n\n-----------------------------------\n\nWireless Noise-Cancelling\nHeadphones - Premium Black\nAUDIO-5521 1 @ $349.99\nMember Discount $-50.00\n$299.99\nUSB-C Hub 7-in-1 Adapter\nwith HDMI & Ethernet\nACC-8834 2 @ $79.99\n$159.98\nPortable SSD 2TB\nThunderbolt 3 Compatible\nSTOR-2241 1 @ $289.00\nMember Discount $-29.00\n$260.00\nErgonomic Wireless Mouse\nRechargeable Battery\nACC-9012 1 @ $59.99\n$59.99\nScreen Cleaning Kit\nProfessional Grade\nCARE-1156 3 @ $12.99\n$38.97\nHDMI 2.1 Cable 6ft\n8K Resolution Support\nCABLE-7789 2 @ $24.99\nMember Discount $-5.00\n$44.98\n-----------------------------------\n\nSUBTOTAL $863.91\nMember Discount (15%)-$84.00\nSales Tax (8.5%) $66.23\nRewards Applied -$25.00\n===================================\nTOTAL $821.14\n===================================\n\nPAYMENT METHOD\nVisa Card ending in 4782\nAuth: 847392\nRef: REF-20241123-98765\n\n-----------------------------------\n\nREWARDS MEMBER\nSarah Mitchell\nID: TM-447821\nPoints Earned: 821\nTotal Points: 3,247\nNext Reward: $50 gift card\nat 5,000 pts (1,753 to go)\n\n-----------------------------------\n\nRETURN POLICY\nReturns within 30 days\nReceipt required\nElectronics must be unopened\n\n*TXN98765202411231432*\n\nThank you for shopping!\nwww.techmart.example.com\n\n===================================\n\n","isInternal":false,"tokens":463,"sizeBytes":1483},{"name":"REPAIR-2022-INV-001_multipage.md","path":"packages/markitdown/tests/test_files/expected_outputs/REPAIR-2022-INV-001_multipage.md","rawUrl":"https://raw.githubusercontent.com/microsoft/markitdown/HEAD/packages/markitdown/tests/test_files/expected_outputs/REPAIR-2022-INV-001_multipage.md","title":"Expected_outputs Skill","category":"anthropic-skill","format":"markdown","content":"ZAVA AUTO REPAIR\nCertified Collision Repair\n123 Main Street, Redmond, WA 98052\nPhone: (425) 000-0000\nPreliminary Estimate (ID: EST-1008)\n| Customer Information |                     |     | Vehicle Information |                   |\n| -------------------- | ------------------- | --- | ------------------- | ----------------- |\n| Insured name         | Gabriel Diaz        |     | Year                | 2022              |\n| Claim #              | SF-1008             |     | Make                | Jeep              |\n| Policy #             | POL-2022-555        |     | Model               | Grand Cherokee    |\n| Phone                | (425) 111-1111      |     | Trim                | Limited           |\n| Email                | gabriel@contoso.com |     | VIN                 | 1C4RJFBG2NC123456 |\n|                      |                     |     | Color               | White             |\n|                      |                     |     | Odometer            | 9,800             |\n| Repair Order #       | RO-20221108         |     | Estimator           | Ellis Turner      |\nEstimate Totals\n|                  |     | Hours | Rate | Cost  |\n| ---------------- | --- | ----- | ---- | ----- |\n| Parts            |     |       |      | 2,100 |\n| Body Labor       |     | 2     | 150  | 300   |\n| Paint Labor      |     | 1.5   | 150  | 225   |\n| Mechanical Labor |     | -     | -    | -     |\nSupplies\n|               | Paint Supplies           |     |        | 60     |\n| ------------- | ------------------------ | --- | ------ | ------ |\n|               | Body Supplies            |     |        | 30     |\n| Other Charges |                          |     |        | 15     |\n| Subtotal      |                          |     |        | 2,730  |\n| Sales Tax     |                          |     | 10.20% | 278.46 |\n| GRAND TOTAL   |                          |     |        | 5,738  |\n| Note          | Minor rear bumper repair |     |        |        |\nThis is a preliminary estimate for the visible damage of the vehicle. Additional damage / repairs / parts may be found\nafter the vehicle has been disassembled and damaged parts have been removed. Suspension damages may be\npresent, but can not be determined until an alignment on the vehicle has been done. Parts Prices may vary due to\nmodels and vehicle maker price updates. Please be advised if vehicle owner elects to have vehicle sent to service for\nany mechanical concerns, ALL service departments charge a vehicle diagnostic charge. If the mechanical concern is\ndeemed not related to an insurance claim, vehicle owner will be reponsible for charges.\n\nZAVA AUTO REPAIR\nCertified Collision Repair\n123 Main Street, Redmond, WA 98052\nPhone: (425) 000-0000\nPreliminary Estimate (ID: EST-1008)\nCustomer Information Vehicle Information\n| Insured name   | Bruce Wayne                |     | Year      | 2025         |\n| -------------- | -------------------------- | --- | --------- | ------------ |\n| Claim #        |                            | 999 | Make      | Batman       |\n| Policy #       | IM-BATMAN                  |     | Model     | Batmobile    |\n| Phone          | (416) 555-1234             |     | Trim      | Limited      |\n| Email          | batman@wayneindustries.com |     | VIN       | XXX          |\n|                |                            |     | Color     | Black        |\n|                |                            |     | Odometer  | 1            |\n| Repair Order # | RO-20221108                |     | Estimator | Ellis Turner |\nEstimate Totals\n|                  |     | Hours | Rate | Cost   |\n| ---------------- | --- | ----- | ---- | ------ |\n| Parts            |     |       |      | 99,999 |\n| Body Labor       |     | 2     | 150  | 300    |\n| Paint Labor      |     | 1.5   | 150  | 225    |\n| Mechanical Labor |     | -     | -    | -      |\nSupplies\n|               | Paint Supplies           |     |        | 60        |\n| ------------- | ------------------------ | --- | ------ | --------- |\n|               | Body Supplies            |     |        | 30        |\n| Other Charges |                          |     |        | 15        |\n| Subtotal      |                          |     |        | 100,629   |\n| Sales Tax     |                          |     | 10.20% | 10264.158 |\n| GRAND TOTAL   |                          |     |        | 211,522   |\n| Note          | Minor rear bumper repair |     |        |           |\n\nThis is a preliminary estimate for the visible damage of the vehicle. Additional damage / repairs / parts may be found\nafter the vehicle has been disassembled and damaged parts have been removed. Suspension damages may be\npresent, but can not be determined until an alignment on the vehicle has been done. Parts Prices may vary due to\nmodels and vehicle maker price updates. Please be advised if vehicle owner elects to have vehicle sent to service for\nany mechanical concerns, ALL service departments charge a vehicle diagnostic charge. If the mechanical concern is\ndeemed not related to an insurance claim, vehicle owner will be reponsible for charges.","isInternal":false,"tokens":1160,"sizeBytes":5089},{"name":"SPARSE-2024-INV-1234_borderless_table.md","path":"packages/markitdown/tests/test_files/expected_outputs/SPARSE-2024-INV-1234_borderless_table.md","rawUrl":"https://raw.githubusercontent.com/microsoft/markitdown/HEAD/packages/markitdown/tests/test_files/expected_outputs/SPARSE-2024-INV-1234_borderless_table.md","title":"Expected_outputs Skill","category":"anthropic-skill","format":"markdown","content":"INVENTORY RECONCILIATION REPORT\nReport ID: SPARSE-2024-INV-1234\nWarehouse: Distribution Center East\nReport Date: 2024-11-15\nPrepared By: Sarah Martinez\n| Product Code | Location | Expected | Actual | Variance | Status   |\n| ------------ | -------- | -------- | ------ | -------- | -------- |\n| SKU-8847     | A-12     | 450      |        |          |          |\n|              | B-07     |          | 289    | -23      |          |\n| SKU-9201     |          | 780      | 778    |          | OK       |\n|              | C-15     |          |        | +15      |          |\n| SKU-4563     | D-22     |          | 156    |          | CRITICAL |\n|              |          | 180      |        | -24      |          |\n| SKU-7728     | A-08     | 920      |        |          |          |\n|              |          |          | 935    | +15      | OK       |\nVariance Analysis:\nSummary Statistics:\nTotal Variance Cost: $4,287.50\nCritical Items: 1\nOverall Accuracy: 97.2%\nDetailed Analysis by Category:\nThe inventory reconciliation reveals several key findings. The primary variance driver is SKU-4563,\nwhich shows a -24 unit discrepancy requiring immediate investigation. Location B-07 handling of\nSKU-8847 also demonstrates significant variance. Cross-location verification protocols should be\n\nreviewed to prevent future discrepancies. The overall accuracy rate of 97.2% meets our target\nthreshold, but critical items require expedited resolution to maintain operational efficiency.\nExtended Inventory Review:\n| Product Code | Category    | Unit Cost | Total Value | Last Audit | Notes      |\n| ------------ | ----------- | --------- | ----------- | ---------- | ---------- |\n| SKU-8847     | Electronics | $45.00    | $13,005.00  | 2024-10-15 |            |\n| SKU-9201     | Hardware    | $32.50    | $25,285.00  | 2024-10-22 | Verified   |\n| SKU-4563     | Software    | $120.00   | $18,720.00  |            | Critical   |\n| SKU-7728     | Accessories | $15.75    | $14,726.25  | 2024-11-01 |            |\n| SKU-3345     | Electronics | $67.00    | $22,445.00  | 2024-10-18 |            |\n| SKU-5512     | Hardware    | $89.00    | $31,150.00  |            | Pending    |\n| SKU-6678     | Software    | $200.00   | $42,000.00  | 2024-10-25 | High Value |\n| SKU-7789     | Accessories | $8.50     | $5,950.00   | 2024-11-05 |            |\n| SKU-2234     | Electronics | $125.00   | $35,000.00  |            |            |\n| SKU-1123     | Hardware    | $55.00    | $27,500.00  | 2024-10-30 | Verified   |\nRecommendations:\n1. Immediate review of SKU-4563 handling procedures. 2. Implement additional verification for critical\nitems. 3. Schedule follow-up audit for high-value products (SKU-6678, SKU-2234).\nApproval:","isInternal":false,"tokens":771,"sizeBytes":2711},{"name":"test.md","path":"packages/markitdown/tests/test_files/expected_outputs/test.md","rawUrl":"https://raw.githubusercontent.com/microsoft/markitdown/HEAD/packages/markitdown/tests/test_files/expected_outputs/test.md","title":"Expected_outputs Skill","category":"anthropic-skill","format":"markdown","content":"1\n\nIntroduction\n\nLarge language models (LLMs) are becoming a crucial building block in developing powerful agents\nthat utilize LLMs for reasoning, tool usage, and adapting to new observations (Yao et al., 2022; Xi\net al., 2023; Wang et al., 2023b) in many real-world tasks. Given the expanding tasks that could\nbenefit from LLMs and the growing task complexity, an intuitive approach to scale up the power of\nagents is to use multiple agents that cooperate. Prior work suggests that multiple agents can help\nencourage divergent thinking (Liang et al., 2023), improve factuality and reasoning (Du et al., 2023),\nand provide validation (Wu et al., 2023). In light of the intuition and early evidence of promise, it is\nintriguing to ask the following question: how can we facilitate the development of LLM applications\nthat could span a broad spectrum of domains and complexities based on the multi-agent approach?\n\nOur insight is to use multi-agent conversations to achieve it. There are at least three reasons con-\nfirming its general feasibility and utility thanks to recent advances in LLMs: First, because chat-\noptimized LLMs (e.g., GPT-4) show the ability to incorporate feedback, LLM agents can cooperate\nthrough conversations with each other or human(s), e.g., a dialog where agents provide and seek rea-\nsoning, observations, critiques, and validation. Second, because a single LLM can exhibit a broad\nrange of capabilities (especially when configured with the correct prompt and inference settings),\nconversations between differently configured agents can help combine these broad LLM capabilities\nin a modular and complementary manner. Third, LLMs have demonstrated ability to solve complex\ntasks when the tasks are broken into simpler subtasks. Multi-agent conversations can enable this\npartitioning and integration in an intuitive manner. How can we leverage the above insights and\nsupport different applications with the common requirement of coordinating multiple agents, poten-\ntially backed by LLMs, humans, or tools exhibiting different capacities? We desire a multi-agent\nconversation framework with generic abstraction and effective implementation that has the flexibil-\nity to satisfy different application needs. Achieving this requires addressing two critical questions:\n(1) How can we design individual agents that are capable, reusable, customizable, and effective in\nmulti-agent collaboration? (2) How can we develop a straightforward, unified interface that can\naccommodate a wide range of agent conversation patterns? In practice, applications of varying\ncomplexities may need distinct sets of agents with specific capabilities, and may require different\nconversation patterns, such as single- or multi-turn dialogs, different human involvement modes, and\nstatic vs. dynamic conversation. Moreover, developers may prefer the flexibility to program agent\ninteractions in natural language or code. Failing to adequately address these two questions would\nlimit the framework’s scope of applicability and generality.\nWhile there is contemporaneous exploration of multi-agent approaches,3 we present AutoGen, a\ngeneralized multi-agent conversation framework (Figure 1), based on the following new concepts.\n1 Customizable and conversable agents. AutoGen uses a generic design of agents that can lever-\nage LLMs, human inputs, tools, or a combination of them. The result is that developers can\neasily and quickly create agents with different roles (e.g., agents to write code, execute code,\nwire in human feedback, validate outputs, etc.) by selecting and configuring a subset of built-in\ncapabilities. The agent’s backend can also be readily extended to allow more custom behaviors.\nTo make these agents suitable for multi-agent conversation, every agent is made conversable –\nthey can receive, react, and respond to messages. When configured properly, an agent can hold\nmultiple turns of conversations with other agents autonomously or solicit human inputs at cer-\ntain rounds, enabling human agency and automation. The conversable agent design leverages the\nstrong capability of the most advanced LLMs in taking feedback and making progress via chat\nand also allows combining capabilities of LLMs in a modular fashion. (Section 2.1)\n\n2 Conversation programming. A fundamental insight of AutoGen is to simplify and unify com-\nplex LLM application workflows as multi-agent conversations. So AutoGen adopts a program-\nming paradigm centered around these inter-agent conversations. We refer to this paradigm as\nconversation programming, which streamlines the development of intricate applications via two\nprimary steps: (1) defining a set of conversable agents with specific capabilities and roles (as\ndescribed above); (2) programming the interaction behavior between agents via conversation-\ncentric computation and control. Both steps can be achieved via a fusion of natural and pro-\ngramming languages to build applications with a wide range of conversation patterns and agent\nbehaviors. AutoGen provides ready-to-use implementations and also allows easy extension and\nexperimentation for both steps. (Section 2.2)\n\n3We refer to Appendix A for a detailed discussion.\n\n2\n\n","isInternal":false,"tokens":1044,"sizeBytes":5200},{"name":"test.json","path":"packages/markitdown/tests/test_files/test.json","rawUrl":"https://raw.githubusercontent.com/microsoft/markitdown/HEAD/packages/markitdown/tests/test_files/test.json","title":"Test_files Skill","category":"anthropic-skill","format":"json","content":"{\n    \"key1\": \"string_value\",\n    \"key2\": 1234,\n    \"key3\": [\n        \"list_value1\",\n        \"list_value2\"\n    ],\n    \"5b64c88c-b3c3-4510-bcb8-da0b200602d8\": \"uuid_key\",\n    \"uuid_value\": \"9700dc99-6685-40b4-9a3a-5e406dcb37f3\"\n}\n","frontmatter":{"key1":"string_value","key2":1234,"key3":["list_value1","list_value2"],"5b64c88c-b3c3-4510-bcb8-da0b200602d8":"uuid_key","uuid_value":"9700dc99-6685-40b4-9a3a-5e406dcb37f3"},"isInternal":false,"tokens":102,"sizeBytes":229},{"name":"ThirdPartyNotices.md","path":"packages/markitdown/ThirdPartyNotices.md","rawUrl":"https://raw.githubusercontent.com/microsoft/markitdown/HEAD/packages/markitdown/ThirdPartyNotices.md","title":"Markitdown Skill","category":"anthropic-skill","format":"markdown","content":"# THIRD-PARTY SOFTWARE NOTICES AND INFORMATION\n\n**Do Not Translate or Localize**\n\nThis project incorporates components from the projects listed below. The original copyright notices and the licenses \nunder which MarkItDown received such components are set forth below. MarkItDown reserves all rights not expressly \ngranted herein, whether by implication, estoppel or otherwise.\n\n1.dwml (https://github.com/xiilei/dwml)\n\ndwml NOTICES AND INFORMATION BEGIN HERE\n\n-----------------------------------------\n\nNOTE 1: What follows is a verbatim copy of dwml's LICENSE file, as it appeared on March 28th, 2025 - including \nplaceholders for the copyright owner and year.\n\nNOTE 2: The Apache License, Version 2.0, requires that modifications to the dwml source code be documented.  \nThe following section summarizes these changes. The full details are available in the MarkItDown source code \nrepository under PR #1160 (https://github.com/microsoft/markitdown/pull/1160)\n\nThis project incorporates `dwml/latex_dict.py` and `dwml/omml.py` files without any additional logic modifications (which \nlives in `packages/markitdown/src/markitdown/converter_utils/docx/math` location). However, we have reformatted the code\naccording to `black` code formatter.  From `tests/docx.py` file, we have used `DOCXML_ROOT` XML namespaces and the rest of \nthe file is not used.\n\n-----------------------------------------\n\nApache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n-----------------------------------------\nEND OF dwml NOTICES AND INFORMATION","isInternal":false,"tokens":2586,"sizeBytes":12799},{"name":"README.md","path":"packages/markitdown-mcp/README.md","rawUrl":"https://raw.githubusercontent.com/microsoft/markitdown/HEAD/packages/markitdown-mcp/README.md","title":"markitdown-mcp Documentation","category":"plugin-manifest","format":"markdown","content":"# MarkItDown-MCP\n\n> [!IMPORTANT]\n> The MarkItDown-MCP package is meant for **local use**, with local trusted agents. In particular, when running the MCP server with Streamable HTTP or SSE, it binds to `localhost` by default, and is not exposed to other machines on the network or Internet. In this configuration, it is meant to be a direct alternative to the STDIO transport, which may be more convenient in some cases. DO NOT bind the server to other interfaces unless you understand the [security implications](#security-considerations) of doing so.\n\n\n[![PyPI](https://img.shields.io/pypi/v/markitdown-mcp.svg)](https://pypi.org/project/markitdown-mcp/)\n![PyPI - Downloads](https://img.shields.io/pypi/dd/markitdown-mcp)\n[![Built by AutoGen Team](https://img.shields.io/badge/Built%20by-AutoGen%20Team-blue)](https://github.com/microsoft/autogen)\n\nThe `markitdown-mcp` package provides a lightweight STDIO, Streamable HTTP, and SSE MCP server for calling MarkItDown.\n\nIt exposes one tool: `convert_to_markdown(uri)`, where uri can be any `http:`, `https:`, `file:`, or `data:` URI.\n\n## Installation\n\nTo install the package, use pip:\n\n```bash\npip install markitdown-mcp\n```\n\n## Usage\n\nTo run the MCP server, using STDIO (default), use the following command:\n\n\n```bash\nmarkitdown-mcp\n```\n\nTo run the MCP server, using Streamable HTTP and SSE, use the following command:\n\n```bash\nmarkitdown-mcp --http --host 127.0.0.1 --port 3001\n```\n\n## Running in Docker\n\nTo run `markitdown-mcp` in Docker, build the Docker image using the provided Dockerfile:\n```bash\ndocker build -t markitdown-mcp:latest .\n```\n\nAnd run it using:\n```bash\ndocker run -it --rm markitdown-mcp:latest\n```\nThis will be sufficient for remote URIs. To access local files, you need to mount the local directory into the container. For example, if you want to access files in `/home/user/data`, you can run:\n\n```bash\ndocker run -it --rm -v /home/user/data:/workdir markitdown-mcp:latest\n```\n\nOnce mounted, all files under data will be accessible under `/workdir` in the container. For example, if you have a file `example.txt` in `/home/user/data`, it will be accessible in the container at `/workdir/example.txt`.\n\n## Accessing from Claude Desktop\n\nIt is recommended to use the Docker image when running the MCP server for Claude Desktop.\n\nFollow [these instructions](https://modelcontextprotocol.io/quickstart/user#for-claude-desktop-users) to access Claude's `claude_desktop_config.json` file.\n\nEdit it to include the following JSON entry:\n\n```json\n{\n  \"mcpServers\": {\n    \"markitdown\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"markitdown-mcp:latest\"\n      ]\n    }\n  }\n}\n```\n\nIf you want to mount a directory, adjust it accordingly:\n\n```json\n{\n  \"mcpServers\": {\n    \"markitdown\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"-v\",\n        \"/home/user/data:/workdir\",\n        \"markitdown-mcp:latest\"\n      ]\n    }\n  }\n}\n```\n\n## Debugging\n\nTo debug the MCP server you can use the `MCP Inspector` tool.\n\n```bash\nnpx @modelcontextprotocol/inspector\n```\n\nYou can then connect to the inspector through the specified host and port (e.g., `http://localhost:5173/`).\n\nIf using STDIO:\n* select `STDIO` as the transport type,\n* input `markitdown-mcp` as the command, and\n* click `Connect`\n\nIf using Streamable HTTP:\n* select `Streamable HTTP` as the transport type,\n* input `http://127.0.0.1:3001/mcp` as the URL, and\n* click `Connect`\n\nIf using SSE:\n* select `SSE` as the transport type,\n* input `http://127.0.0.1:3001/sse` as the URL, and\n* click `Connect`\n\nFinally:\n* click the `Tools` tab,\n* click `List Tools`,\n* click `convert_to_markdown`, and\n* run the tool on any valid URI.\n\n## Security Considerations\n\nThe server does not support authentication, and runs with the privileges of the user running it. For this reason, when running in SSE or Streamable HTTP mode, the server binds by default to `localhost`. Even still, it is important to recognize that the server can be accessed by any process or users on the same local machine, and that the `convert_to_markdown` tool can be used to read any file that the server's user has access to, or any data from the network. If you require additional security, consider running the server in a sandboxed environment, such as a virtual machine or container, and ensure that the user permissions are properly configured to limit access to sensitive files and network segments. Above all, DO NOT bind the server to other interfaces (non-localhost) unless you understand the security implications of doing so.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n","isInternal":false,"tokens":1288,"sizeBytes":5146},{"name":"README.md","path":"packages/markitdown-ocr/README.md","rawUrl":"https://raw.githubusercontent.com/microsoft/markitdown/HEAD/packages/markitdown-ocr/README.md","title":"markitdown-ocr Documentation","category":"plugin-manifest","format":"markdown","content":"# MarkItDown OCR Plugin\n\nLLM Vision plugin for MarkItDown that extracts text from images embedded in PDF, DOCX, PPTX, and XLSX files.\n\nUses the same `llm_client` / `llm_model` pattern that MarkItDown already supports for image descriptions — no new ML libraries or binary dependencies required.\n\n## Features\n\n- **Enhanced PDF Converter**: Extracts text from images within PDFs, with full-page OCR fallback for scanned documents\n- **Enhanced DOCX Converter**: OCR for images in Word documents\n- **Enhanced PPTX Converter**: OCR for images in PowerPoint presentations\n- **Enhanced XLSX Converter**: OCR for images in Excel spreadsheets\n- **Context Preservation**: Maintains document structure and flow when inserting extracted text\n\n## Installation\n\nRequires `markitdown>=0.1.8,<0.2.0`, which provides the Office image-rendering hooks used by this plugin. Installing the plugin automatically resolves a compatible core version.\n\n```bash\npip install markitdown-ocr\n```\n\nThe plugin uses whatever OpenAI-compatible client you already have. Install one if you don't have it yet:\n\n```bash\npip install openai\n```\n\n## Usage\n\n### Command Line\n\n```bash\nmarkitdown document.pdf --use-plugins --llm-client openai --llm-model gpt-4o\n```\n\n### Python API\n\nPass `llm_client` and `llm_model` to `MarkItDown()` exactly as you would for image descriptions:\n\n```python\nfrom markitdown import MarkItDown\nfrom openai import OpenAI\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),\n    llm_model=\"gpt-4o\",\n)\n\nresult = md.convert(\"document_with_images.pdf\")\nprint(result.text_content)\n```\n\nIf no `llm_client` is provided the plugin still loads, but OCR is silently skipped — falling back to the standard built-in converter.\n\n### Custom Prompt\n\nOverride the default extraction prompt for specialized documents:\n\n```python\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),\n    llm_model=\"gpt-4o\",\n    llm_prompt=\"Extract all text from this image, preserving table structure.\",\n)\n```\n\n### Any OpenAI-Compatible Client\n\nWorks with any client that follows the OpenAI API:\n\n```python\nfrom openai import AzureOpenAI\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=AzureOpenAI(\n        api_key=\"...\",\n        azure_endpoint=\"https://your-resource.openai.azure.com/\",\n        api_version=\"2024-02-01\",\n    ),\n    llm_model=\"gpt-4o\",\n)\n```\n\n## How It Works\n\nWhen `MarkItDown(enable_plugins=True, llm_client=..., llm_model=...)` is called:\n\n1. MarkItDown discovers the plugin via the `markitdown.plugin` entry point group\n2. It calls `register_converters()`, forwarding all kwargs including `llm_client` and `llm_model`\n3. The plugin creates an `LLMVisionOCRService` from those kwargs\n4. Four OCR-enhanced converters are registered at **priority -1.0** — before the built-in converters at priority 0.0\n\nWhen a file is converted:\n\n1. The OCR converter accepts the file\n2. It extracts embedded images from the document\n3. Each image is sent to the LLM with an extraction prompt\n4. The returned text is placed alongside document content (XLSX images follow their sheet's table)\n5. If the LLM call fails, conversion continues without that image's text\n\nThe DOCX, PPTX, and XLSX converters subclass their core counterparts and override the same semi-private `_image_to_html` method. Core handles native content, preprocessing, and placement; the plugin supplies escaped OCR HTML, which passes through the shared HTML-to-Markdown renderer. PDF uses its separate existing pipeline.\n\n## Supported File Formats\n\n### PDF\n\n- Embedded images are extracted by position (via `page.images` / page XObjects) and OCR'd inline, interleaved with the surrounding text in vertical reading order.\n- **Scanned PDFs** (pages with no extractable text) are detected automatically: each page is rendered at 300 DPI and sent to the LLM as a full-page image.\n- **Malformed PDFs** that pdfplumber/pdfminer cannot open (e.g. truncated EOF) are retried with PyMuPDF page rendering, so content is still recovered.\n\n### DOCX\n\n- Inherits core DOCX preprocessing, styles, math, and Mammoth conversion.\n- Mammoth provides each embedded image to `_image_to_html`. OCR fragments are inserted into the document's HTML before Markdown rendering, not substituted into finished Markdown.\n- Block fragments split enclosing paragraphs where necessary and remain inside their table cell or list item. Table-cell line breaks follow the shared HTML converter's existing limitations.\n\n### PPTX\n\n- Picture shapes, placeholder shapes with images, and images inside groups are all supported.\n- Inherits core shape ordering, native text, tables, charts, and speaker notes.\n- Slide content now uses the core converter's real line breaks rather than the old plugin's literal `\\n` text, and inherits its empty-title and empty-notes handling.\n- If an `llm_client` is configured, the LLM is asked for a description first; OCR is used as the fallback when no description is returned.\n\n### XLSX\n\n- Inherits core workbook repair and table rendering; images are read from the same repaired workbook.\n- Images are listed under a `### Images in this sheet:` section after the sheet's data table — they are not interleaved into the table rows.\n- Sheet heading spacing follows the core converter; no new cell-position labels are added.\n- Legacy `.xls` files remain handled by the existing core converter, without image OCR.\n\n### Output format\n\nEvery extracted OCR block is wrapped as:\n\n```text\n*[Image OCR]\n<extracted text>\n[End OCR]*\n```\n\nFor Office formats, recognized text is escaped as literal HTML text before Markdown rendering. Markdown escaping and line breaks therefore follow the shared HTML converter: for example, underscores may be backslash-escaped, and direct converter results use Markdown hard breaks. `MarkItDown` subsequently strips trailing whitespace from each output line. Empty recognition retains the native image representation (XLSX normally omits images).\n\nRepeated image bytes are recognized once per conversion, while the result is placed at every occurrence. The cache is not shared across documents or service overrides.\n\n## Troubleshooting\n\n### OCR text missing from output\n\nThe most likely cause is a missing `llm_client` or `llm_model`. Verify:\n\n```python\nfrom openai import OpenAI\nfrom markitdown import MarkItDown\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),   # required\n    llm_model=\"gpt-4o\",    # required\n)\n```\n\n### Plugin not loading\n\nConfirm the plugin is installed and discovered:\n\n```bash\nmarkitdown --list-plugins   # should show: ocr\n```\n\n### API errors\n\nThe plugin propagates LLM API errors as warnings and continues conversion. Check your API key, quota, and that the chosen model supports vision inputs.\n\nFor Office OCR, a service-reported error emits a warning and retains native image rendering. Exceptions raised by custom OCR services propagate from direct converter calls; `MarkItDown` can retry another applicable converter through its normal fallback behavior.\n\n## Development\n\n### Running Tests\n\n```bash\ncd packages/markitdown-ocr\npytest tests/ -v\n```\n\n### Building from Source\n\n```bash\ngit clone https://github.com/microsoft/markitdown.git\ncd markitdown\npip install -e 'packages/markitdown[docx,pptx,xlsx]' -e packages/markitdown-ocr\n```\n\n## Contributing\n\nContributions are welcome! See the [MarkItDown repository](https://github.com/microsoft/markitdown) for guidelines.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n## Changelog\n\n### 0.1.0 (Initial Release)\n\n- LLM Vision OCR for PDF, DOCX, PPTX, XLSX\n- Full-page OCR fallback for scanned PDFs\n- Context-aware inline text insertion\n- Priority-based converter replacement (no code changes required)\n","isInternal":false,"tokens":1759,"sizeBytes":7683},{"name":"README.md","path":"packages/markitdown-sample-plugin/README.md","rawUrl":"https://raw.githubusercontent.com/microsoft/markitdown/HEAD/packages/markitdown-sample-plugin/README.md","title":"markitdown-sample-plugin Documentation","category":"plugin-manifest","format":"markdown","content":"# MarkItDown Sample Plugin\n\n[![PyPI](https://img.shields.io/pypi/v/markitdown-sample-plugin.svg)](https://pypi.org/project/markitdown-sample-plugin/)\n![PyPI - Downloads](https://img.shields.io/pypi/dd/markitdown-sample-plugin)\n[![Built by AutoGen Team](https://img.shields.io/badge/Built%20by-AutoGen%20Team-blue)](https://github.com/microsoft/autogen)\n\n\nThis project shows how to create a sample plugin for MarkItDown. The most important parts are as follows:\n\nFirst, implement your custom DocumentConverter:\n\n```python\nfrom typing import BinaryIO, Any\nfrom markitdown import MarkItDown, DocumentConverter, DocumentConverterResult, StreamInfo, PRIORITY_SPECIFIC_FILE_FORMAT\n\nclass RtfConverter(DocumentConverter):\n\n    def __init__(\n        self, priority: float = PRIORITY_SPECIFIC_FILE_FORMAT\n    ):\n        super().__init__(priority=priority)\n\n    def accepts(\n        self,\n        file_stream: BinaryIO,\n        stream_info: StreamInfo,\n        **kwargs: Any,\n    ) -> bool:\n\n        # Implement logic to check if the file stream is an RTF file\n        # ...\n        raise NotImplementedError()\n\n\n    def convert(\n        self,\n        file_stream: BinaryIO,\n        stream_info: StreamInfo,\n        **kwargs: Any,\n    ) -> DocumentConverterResult:\n\n        # Implement logic to convert the file stream to Markdown\n        # ...\n        raise NotImplementedError()\n```\n\nNext, make sure your package implements and exports the following:\n\n```python\n# The version of the plugin interface that this plugin uses.\n# The only supported version is 1 for now.\n__plugin_interface_version__ = 1\n\n# The main entrypoint for the plugin. This is called each time MarkItDown instances are created.\ndef register_converters(markitdown: MarkItDown, **kwargs):\n    \"\"\"\n    Called during construction of MarkItDown instances to register converters provided by plugins.\n    \"\"\"\n\n    # Simply create and attach an RtfConverter instance\n    markitdown.register_converter(RtfConverter())\n```\n\n\nFinally, create an entrypoint in the `pyproject.toml` file:\n\n```toml\n[project.entry-points.\"markitdown.plugin\"]\nsample_plugin = \"markitdown_sample_plugin\"\n```\n\nHere, the value of `sample_plugin` can be any key, but should ideally be the name of the plugin. The value is the fully qualified name of the package implementing the plugin.\n\n\n## Installation\n\nTo use the plugin with MarkItDown, it must be installed. To install the plugin from the current directory use:\n\n```bash\npip install -e .\n```\n\nOnce the plugin package is installed, verify that it is available to MarkItDown by running:\n\n```bash\nmarkitdown --list-plugins\n```\n\nTo use the plugin for a conversion use the `--use-plugins` flag. For example, to convert an RTF file:\n\n```bash\nmarkitdown --use-plugins path-to-file.rtf\n```\n\nIn Python, plugins can be enabled as follows:\n\n```python\nfrom markitdown import MarkItDown\n\nmd = MarkItDown(enable_plugins=True)\nresult = md.convert(\"path-to-file.rtf\")\nprint(result.text_content)\n```\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n","isInternal":false,"tokens":784,"sizeBytes":3486},{"name":"README.md","path":"packages/markitdown/README.md","rawUrl":"https://raw.githubusercontent.com/microsoft/markitdown/HEAD/packages/markitdown/README.md","title":"markitdown Documentation","category":"plugin-manifest","format":"markdown","content":"# MarkItDown\n\n> [!TIP]\n> MarkItDown is a Python package and command-line utility for converting various files to Markdown (e.g., for indexing, text analysis, etc).\n>\n> For more information, and full documentation, see the project [README.md](https://github.com/microsoft/markitdown) on GitHub.\n\n> [!IMPORTANT]\n> MarkItDown performs I/O with the privileges of the current process. Like open() or requests.get(), it will access resources that the process itself can access. Sanitize your inputs in untrusted environments, and call the narrowest `convert_*` function needed for your use case (e.g., `convert_stream()`, or `convert_local()`). See the [Security Considerations](https://github.com/microsoft/markitdown#security-considerations) section of the documentation for more information.\n\n## Installation\n\nFrom PyPI:\n\n```bash\npip install 'markitdown[all]'\n```\n\nFrom source:\n\n```bash\ngit clone git@github.com:microsoft/markitdown.git\ncd markitdown\npip install -e 'packages/markitdown[all]'\n```\n\n## Usage\n\n### Command-Line\n\n```bash\nmarkitdown path-to-file.pdf > document.md\n```\n\n### Python API\n\n```python\nfrom markitdown import MarkItDown\n\nmd = MarkItDown()\nresult = md.convert(\"test.xlsx\")\nprint(result.markdown)\n```\n\n### More Information\n\nFor more information, and full documentation, see the project [README.md](https://github.com/microsoft/markitdown) on GitHub.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n","isInternal":false,"tokens":430,"sizeBytes":1890}],"systemPromptSnippet":"<yakaai_skills repo=\"microsoft/markitdown\">\n<!-- File: packages/markitdown/tests/test_files/expected_outputs/movie-theater-booking-2024.md (Tokens: ~1119 | Category: anthropic-skill) -->\nBOOKING ORDER\nPrint Date 12/15/2024 14:30:22\nPage 1 of 1\nSTARLIGHT CINEMAS\nOrders\n| Order / Rev: | 2024-12-5678   |     |     | Cinema:          |     | Downtown Multiplex |\n| ------------ | -------------- | --- | --- | ---------------- | --- | ------------------ |\n| Alt Order #: | SC-WINTER-2024 |     |     | Primary Contact: |     | Sarah Johnson      |\nProduct Desc: Holiday Movie Marathon Package Location: NYC-01\n| Estimate:            | EST-456                 |     |     | Region: |     | NORTHEAST |\n| -------------------- | ----------------------- | --- | --- | ------- | --- | --------- |\n| Booking Dates:       | 12/20/2024 - 12/31/2024 |     |     |         |     |           |\n| Original Date / Rev: | 12/01/24 / 12/10/24     |     |     |         |     |           |\n| Order Type:          | Premium Package         |     |     |         |     |           |\nBooking Agency\n| Name:            | Premier Entertainment Group |     |     |                |     |           |\n| ---------------- | --------------------------- | --- | --- | -------------- | --- | --------- |\n|                  |                             |     |     | Billing Type:  |     | Net 30    |\n| Contact:         | Michael Chen                |     |     |                |     |           |\n|                  |                             |     |     | Payment Terms: |     | Corporate |\n| Billing Contact: | accounting@premierent.com   |     |     |                |     |           |\n|                  |                             |     |     | Commission:    |     | 10%       |\n555 Broadway Suite 1200\nNew York, NY 10012\nCustomer\n| Name:          | Universal Studios Distribution |     |     |     |     |     |\n| -------------- | ------------------------------ | --- | --- | --- | --- | --- |\n| Category:      | Film Distributor               |     |     |     |     |     |\n| Contact Email: | bookings@universalstudios.com  |     |     |     |     |     |\n| Customer ID:   | CUST-98765                     |     |     |     |     |     |\n| Revenue Code:  | FILM-PREMIUM                   |     |     |     |     |     |\nBooking Summary\n| Start Date | End Date | # Shows | Gross Amount | Net Amount |     |     |\n| ---------- | -------- | ------- | ------------ | ---------- | --- | --- |\n| 12/20/24   | 12/31/24 | 48      | $12,500.00   | $11,250.00 |     |     |\nTotals\n| Month         | # Shows | Gross Amount |     | Net Amount |     | Occupancy |\n| ------------- | ------- | ------------ | --- | ---------- | --- | --------- |\n| December 2024 | 48      | $12,500.00   |     | $11,250.00 |     | 85%       |\n| Totals        | 48      | $12,500.00   |     | $11,250.00 |     | 85%       |\nAccount Representatives\nRepresentative Territory Region Start Date / End Date Commission %\n| Sarah Johnson | NYC Metro | NORTHEAST | 12/20/24 - 12/31/24 |     | 100% |     |\n| ------------- | --------- | --------- | ------------------- | --- | ---- | --- |\nShow Schedule Details\nLn Screen Start End Movie Title Format Showtime Days Shows Rate Type Total\n1 SCR-1 12/20/24 12/25/24 Holiday Spectacular IMAX 3D 7:00 PM Daily 12 $250 PM $3,000\n(Runtime: 142 min); Holiday Season Premium\n2 SCR-2 12/20/24 12/31/24 Winter Wonderland Standard 4:30 PM Daily 24 $150 MT $3,600\n(Runtime: 98 min); Matinee Special\n3 SCR-1 12/26/24 12/31/24 New Year Mystery 4DX 9:30 PM Daily 12 $300 PM $3,600\n(Runtime: 116 min); Premium Experience\nShow Details\n| Show Screen | Date Range | Title | Showtime | Days Type | Rate | Revenue |\n| ----------- | ---------- | ----- | -------- | --------- | ---- | ------- |\n1 SCR-1 12/20-12/25 Holiday Spectacular 7:00 PM Daily PM $250 $3,000\nThis booking order is subject to cinema availability and standard terms.\n2 SCR-2 12/20-12/31 Winter Wonderland 4:30 PM Daily MT $150 $3,600\nAll showtimes are approximate and subject to change.\n3 SCR-1 12/26-12/31 New Year Mystery 9:30 PM Daily PM $300 $3,600\n| Total Revenue: |     |     |     |     |     | $12,500.00 |\n| -------------- | --- | --- | --- | --- | --- | ---------- |\n\n<!-- File: packages/markitdown/tests/test_files/expected_outputs/RECEIPT-2024-TXN-98765_retail_purchase.md (Tokens: ~463 | Category: anthropic-skill) -->\nTECHMART ELECTRONICS\n4567 Innovation Blvd\nSan Francisco, CA 94103\n(415) 555-0199\n\n===================================\n\nStore #0342 - Downtown SF\n11/23/2024 14:32:18 PST\nTXN: TXN-98765-2024\nCashier: Emily Rodriguez\nRegister: POS-07\n\n-----------------------------------\n\nWireless Noise-Cancelling\nHeadphones - Premium Black\nAUDIO-5521 1 @ $349.99\nMember Discount $-50.00\n$299.99\nUSB-C Hub 7-in-1 Adapter\nwith HDMI & Ethernet\nACC-8834 2 @ $79.99\n$159.98\nPortable SSD 2TB\nThunderbolt 3 Compatible\nSTOR-2241 1 @ $289.00\nMember Discount $-29.00\n$260.00\nErgonomic Wireless Mouse\nRechargeable Battery\nACC-9012 1 @ $59.99\n$59.99\nScreen Cleaning Kit\nProfessional Grade\nCARE-1156 3 @ $12.99\n$38.97\nHDMI 2.1 Cable 6ft\n8K Resolution Support\nCABLE-7789 2 @ $24.99\nMember Discount $-5.00\n$44.98\n-----------------------------------\n\nSUBTOTAL $863.91\nMember Discount (15%)-$84.00\nSales Tax (8.5%) $66.23\nRewards Applied -$25.00\n===================================\nTOTAL $821.14\n===================================\n\nPAYMENT METHOD\nVisa Card ending in 4782\nAuth: 847392\nRef: REF-20241123-98765\n\n-----------------------------------\n\nREWARDS MEMBER\nSarah Mitchell\nID: TM-447821\nPoints Earned: 821\nTotal Points: 3,247\nNext Reward: $50 gift card\nat 5,000 pts (1,753 to go)\n\n-----------------------------------\n\nRETURN POLICY\nReturns within 30 days\nReceipt required\nElectronics must be unopened\n\n*TXN98765202411231432*\n\nThank you for shopping!\nwww.techmart.example.com\n\n===================================\n\n<!-- File: packages/markitdown/tests/test_files/expected_outputs/REPAIR-2022-INV-001_multipage.md (Tokens: ~1160 | Category: anthropic-skill) -->\nZAVA AUTO REPAIR\nCertified Collision Repair\n123 Main Street, Redmond, WA 98052\nPhone: (425) 000-0000\nPreliminary Estimate (ID: EST-1008)\n| Customer Information |                     |     | Vehicle Information |                   |\n| -------------------- | ------------------- | --- | ------------------- | ----------------- |\n| Insured name         | Gabriel Diaz        |     | Year                | 2022              |\n| Claim #              | SF-1008             |     | Make                | Jeep              |\n| Policy #             | POL-2022-555        |     | Model               | Grand Cherokee    |\n| Phone                | (425) 111-1111      |     | Trim                | Limited           |\n| Email                | gabriel@contoso.com |     | VIN                 | 1C4RJFBG2NC123456 |\n|                      |                     |     | Color               | White             |\n|                      |                     |     | Odometer            | 9,800             |\n| Repair Order #       | RO-20221108         |     | Estimator           | Ellis Turner      |\nEstimate Totals\n|                  |     | Hours | Rate | Cost  |\n| ---------------- | --- | ----- | ---- | ----- |\n| Parts            |     |       |      | 2,100 |\n| Body Labor       |     | 2     | 150  | 300   |\n| Paint Labor      |     | 1.5   | 150  | 225   |\n| Mechanical Labor |     | -     | -    | -     |\nSupplies\n|               | Paint Supplies           |     |        | 60     |\n| ------------- | ------------------------ | --- | ------ | ------ |\n|               | Body Supplies            |     |        | 30     |\n| Other Charges |                          |     |        | 15     |\n| Subtotal      |                          |     |        | 2,730  |\n| Sales Tax     |                          |     | 10.20% | 278.46 |\n| GRAND TOTAL   |                          |     |        | 5,738  |\n| Note          | Minor rear bumper repair |     |        |        |\nThis is a preliminary estimate for the visible damage of the vehicle. Additional damage / repairs / parts may be found\nafter the vehicle has been disassembled and damaged parts have been removed. Suspension damages may be\npresent, but can not be determined until an alignment on the vehicle has been done. Parts Prices may vary due to\nmodels and vehicle maker price updates. Please be advised if vehicle owner elects to have vehicle sent to service for\nany mechanical concerns, ALL service departments charge a vehicle diagnostic charge. If the mechanical concern is\ndeemed not related to an insurance claim, vehicle owner will be reponsible for charges.\n\nZAVA AUTO REPAIR\nCertified Collision Repair\n123 Main Street, Redmond, WA 98052\nPhone: (425) 000-0000\nPreliminary Estimate (ID: EST-1008)\nCustomer Information Vehicle Information\n| Insured name   | Bruce Wayne                |     | Year      | 2025         |\n| -------------- | -------------------------- | --- | --------- | ------------ |\n| Claim #        |                            | 999 | Make      | Batman       |\n| Policy #       | IM-BATMAN                  |     | Model     | Batmobile    |\n| Phone          | (416) 555-1234             |     | Trim      | Limited      |\n| Email          | batman@wayneindustries.com |     | VIN       | XXX          |\n|                |                            |     | Color     | Black        |\n|                |                            |     | Odometer  | 1            |\n| Repair Order # | RO-20221108                |     | Estimator | Ellis Turner |\nEstimate Totals\n|                  |     | Hours | Rate | Cost   |\n| ---------------- | --- | ----- | ---- | ------ |\n| Parts            |     |       |      | 99,999 |\n| Body Labor       |     | 2     | 150  | 300    |\n| Paint Labor      |     | 1.5   | 150  | 225    |\n| Mechanical Labor |     | -     | -    | -      |\nSupplies\n|               | Paint Supplies           |     |        | 60        |\n| ------------- | ------------------------ | --- | ------ | --------- |\n|               | Body Supplies            |     |        | 30        |\n| Other Charges |                          |     |        | 15        |\n| Subtotal      |                          |     |        | 100,629   |\n| Sales Tax     |                          |     | 10.20% | 10264.158 |\n| GRAND TOTAL   |                          |     |        | 211,522   |\n| Note          | Minor rear bumper repair |     |        |           |\n\nThis is a preliminary estimate for the visible damage of the vehicle. Additional damage / repairs / parts may be found\nafter the vehicle has been disassembled and damaged parts have been removed. Suspension damages may be\npresent, but can not be determined until an alignment on the vehicle has been done. Parts Prices may vary due to\nmodels and vehicle maker price updates. Please be advised if vehicle owner elects to have vehicle sent to service for\nany mechanical concerns, ALL service departments charge a vehicle diagnostic charge. If the mechanical concern is\ndeemed not related to an insurance claim, vehicle owner will be reponsible for charges.\n\n<!-- File: packages/markitdown/tests/test_files/expected_outputs/SPARSE-2024-INV-1234_borderless_table.md (Tokens: ~771 | Category: anthropic-skill) -->\nINVENTORY RECONCILIATION REPORT\nReport ID: SPARSE-2024-INV-1234\nWarehouse: Distribution Center East\nReport Date: 2024-11-15\nPrepared By: Sarah Martinez\n| Product Code | Location | Expected | Actual | Variance | Status   |\n| ------------ | -------- | -------- | ------ | -------- | -------- |\n| SKU-8847     | A-12     | 450      |        |          |          |\n|              | B-07     |          | 289    | -23      |          |\n| SKU-9201     |          | 780      | 778    |          | OK       |\n|              | C-15     |          |        | +15      |          |\n| SKU-4563     | D-22     |          | 156    |          | CRITICAL |\n|              |          | 180      |        | -24      |          |\n| SKU-7728     | A-08     | 920      |        |          |          |\n|              |          |          | 935    | +15      | OK       |\nVariance Analysis:\nSummary Statistics:\nTotal Variance Cost: $4,287.50\nCritical Items: 1\nOverall Accuracy: 97.2%\nDetailed Analysis by Category:\nThe inventory reconciliation reveals several key findings. The primary variance driver is SKU-4563,\nwhich shows a -24 unit discrepancy requiring immediate investigation. Location B-07 handling of\nSKU-8847 also demonstrates significant variance. Cross-location verification protocols should be\n\nreviewed to prevent future discrepancies. The overall accuracy rate of 97.2% meets our target\nthreshold, but critical items require expedited resolution to maintain operational efficiency.\nExtended Inventory Review:\n| Product Code | Category    | Unit Cost | Total Value | Last Audit | Notes      |\n| ------------ | ----------- | --------- | ----------- | ---------- | ---------- |\n| SKU-8847     | Electronics | $45.00    | $13,005.00  | 2024-10-15 |            |\n| SKU-9201     | Hardware    | $32.50    | $25,285.00  | 2024-10-22 | Verified   |\n| SKU-4563     | Software    | $120.00   | $18,720.00  |            | Critical   |\n| SKU-7728     | Accessories | $15.75    | $14,726.25  | 2024-11-01 |            |\n| SKU-3345     | Electronics | $67.00    | $22,445.00  | 2024-10-18 |            |\n| SKU-5512     | Hardware    | $89.00    | $31,150.00  |            | Pending    |\n| SKU-6678     | Software    | $200.00   | $42,000.00  | 2024-10-25 | High Value |\n| SKU-7789     | Accessories | $8.50     | $5,950.00   | 2024-11-05 |            |\n| SKU-2234     | Electronics | $125.00   | $35,000.00  |            |            |\n| SKU-1123     | Hardware    | $55.00    | $27,500.00  | 2024-10-30 | Verified   |\nRecommendations:\n1. Immediate review of SKU-4563 handling procedures. 2. Implement additional verification for critical\nitems. 3. Schedule follow-up audit for high-value products (SKU-6678, SKU-2234).\nApproval:\n\n<!-- File: packages/markitdown/tests/test_files/expected_outputs/test.md (Tokens: ~1044 | Category: anthropic-skill) -->\n1\n\nIntroduction\n\nLarge language models (LLMs) are becoming a crucial building block in developing powerful agents\nthat utilize LLMs for reasoning, tool usage, and adapting to new observations (Yao et al., 2022; Xi\net al., 2023; Wang et al., 2023b) in many real-world tasks. Given the expanding tasks that could\nbenefit from LLMs and the growing task complexity, an intuitive approach to scale up the power of\nagents is to use multiple agents that cooperate. Prior work suggests that multiple agents can help\nencourage divergent thinking (Liang et al., 2023), improve factuality and reasoning (Du et al., 2023),\nand provide validation (Wu et al., 2023). In light of the intuition and early evidence of promise, it is\nintriguing to ask the following question: how can we facilitate the development of LLM applications\nthat could span a broad spectrum of domains and complexities based on the multi-agent approach?\n\nOur insight is to use multi-agent conversations to achieve it. There are at least three reasons con-\nfirming its general feasibility and utility thanks to recent advances in LLMs: First, because chat-\noptimized LLMs (e.g., GPT-4) show the ability to incorporate feedback, LLM agents can cooperate\nthrough conversations with each other or human(s), e.g., a dialog where agents provide and seek rea-\nsoning, observations, critiques, and validation. Second, because a single LLM can exhibit a broad\nrange of capabilities (especially when configured with the correct prompt and inference settings),\nconversations between differently configured agents can help combine these broad LLM capabilities\nin a modular and complementary manner. Third, LLMs have demonstrated ability to solve complex\ntasks when the tasks are broken into simpler subtasks. Multi-agent conversations can enable this\npartitioning and integration in an intuitive manner. How can we leverage the above insights and\nsupport different applications with the common requirement of coordinating multiple agents, poten-\ntially backed by LLMs, humans, or tools exhibiting different capacities? We desire a multi-agent\nconversation framework with generic abstraction and effective implementation that has the flexibil-\nity to satisfy different application needs. Achieving this requires addressing two critical questions:\n(1) How can we design individual agents that are capable, reusable, customizable, and effective in\nmulti-agent collaboration? (2) How can we develop a straightforward, unified interface that can\naccommodate a wide range of agent conversation patterns? In practice, applications of varying\ncomplexities may need distinct sets of agents with specific capabilities, and may require different\nconversation patterns, such as single- or multi-turn dialogs, different human involvement modes, and\nstatic vs. dynamic conversation. Moreover, developers may prefer the flexibility to program agent\ninteractions in natural language or code. Failing to adequately address these two questions would\nlimit the framework’s scope of applicability and generality.\nWhile there is contemporaneous exploration of multi-agent approaches,3 we present AutoGen, a\ngeneralized multi-agent conversation framework (Figure 1), based on the following new concepts.\n1 Customizable and conversable agents. AutoGen uses a generic design of agents that can lever-\nage LLMs, human inputs, tools, or a combination of them. The result is that developers can\neasily and quickly create agents with different roles (e.g., agents to write code, execute code,\nwire in human feedback, validate outputs, etc.) by selecting and configuring a subset of built-in\ncapabilities. The agent’s backend can also be readily extended to allow more custom behaviors.\nTo make these agents suitable for multi-agent conversation, every agent is made conversable –\nthey can receive, react, and respond to messages. When configured properly, an agent can hold\nmultiple turns of conversations with other agents autonomously or solicit human inputs at cer-\ntain rounds, enabling human agency and automation. The conversable agent design leverages the\nstrong capability of the most advanced LLMs in taking feedback and making progress via chat\nand also allows combining capabilities of LLMs in a modular fashion. (Section 2.1)\n\n2 Conversation programming. A fundamental insight of AutoGen is to simplify and unify com-\nplex LLM application workflows as multi-agent conversations. So AutoGen adopts a program-\nming paradigm centered around these inter-agent conversations. We refer to this paradigm as\nconversation programming, which streamlines the development of intricate applications via two\nprimary steps: (1) defining a set of conversable agents with specific capabilities and roles (as\ndescribed above); (2) programming the interaction behavior between agents via conversation-\ncentric computation and control. Both steps can be achieved via a fusion of natural and pro-\ngramming languages to build applications with a wide range of conversation patterns and agent\nbehaviors. AutoGen provides ready-to-use implementations and also allows easy extension and\nexperimentation for both steps. (Section 2.2)\n\n3We refer to Appendix A for a detailed discussion.\n\n2\n\n<!-- File: packages/markitdown/tests/test_files/test.json (Tokens: ~102 | Category: anthropic-skill) -->\n{\n    \"key1\": \"string_value\",\n    \"key2\": 1234,\n    \"key3\": [\n        \"list_value1\",\n        \"list_value2\"\n    ],\n    \"5b64c88c-b3c3-4510-bcb8-da0b200602d8\": \"uuid_key\",\n    \"uuid_value\": \"9700dc99-6685-40b4-9a3a-5e406dcb37f3\"\n}\n\n<!-- File: packages/markitdown/ThirdPartyNotices.md (Tokens: ~2586 | Category: anthropic-skill) -->\n# THIRD-PARTY SOFTWARE NOTICES AND INFORMATION\n\n**Do Not Translate or Localize**\n\nThis project incorporates components from the projects listed below. The original copyright notices and the licenses \nunder which MarkItDown received such components are set forth below. MarkItDown reserves all rights not expressly \ngranted herein, whether by implication, estoppel or otherwise.\n\n1.dwml (https://github.com/xiilei/dwml)\n\ndwml NOTICES AND INFORMATION BEGIN HERE\n\n-----------------------------------------\n\nNOTE 1: What follows is a verbatim copy of dwml's LICENSE file, as it appeared on March 28th, 2025 - including \nplaceholders for the copyright owner and year.\n\nNOTE 2: The Apache License, Version 2.0, requires that modifications to the dwml source code be documented.  \nThe following section summarizes these changes. The full details are available in the MarkItDown source code \nrepository under PR #1160 (https://github.com/microsoft/markitdown/pull/1160)\n\nThis project incorporates `dwml/latex_dict.py` and `dwml/omml.py` files without any additional logic modifications (which \nlives in `packages/markitdown/src/markitdown/converter_utils/docx/math` location). However, we have reformatted the code\naccording to `black` code formatter.  From `tests/docx.py` file, we have used `DOCXML_ROOT` XML namespaces and the rest of \nthe file is not used.\n\n-----------------------------------------\n\nApache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n-----------------------------------------\nEND OF dwml NOTICES AND INFORMATION\n\n<!-- File: packages/markitdown-mcp/README.md (Tokens: ~1288 | Category: plugin-manifest) -->\n# MarkItDown-MCP\n\n> [!IMPORTANT]\n> The MarkItDown-MCP package is meant for **local use**, with local trusted agents. In particular, when running the MCP server with Streamable HTTP or SSE, it binds to `localhost` by default, and is not exposed to other machines on the network or Internet. In this configuration, it is meant to be a direct alternative to the STDIO transport, which may be more convenient in some cases. DO NOT bind the server to other interfaces unless you understand the [security implications](#security-considerations) of doing so.\n\n\n[![PyPI](https://img.shields.io/pypi/v/markitdown-mcp.svg)](https://pypi.org/project/markitdown-mcp/)\n![PyPI - Downloads](https://img.shields.io/pypi/dd/markitdown-mcp)\n[![Built by AutoGen Team](https://img.shields.io/badge/Built%20by-AutoGen%20Team-blue)](https://github.com/microsoft/autogen)\n\nThe `markitdown-mcp` package provides a lightweight STDIO, Streamable HTTP, and SSE MCP server for calling MarkItDown.\n\nIt exposes one tool: `convert_to_markdown(uri)`, where uri can be any `http:`, `https:`, `file:`, or `data:` URI.\n\n## Installation\n\nTo install the package, use pip:\n\n```bash\npip install markitdown-mcp\n```\n\n## Usage\n\nTo run the MCP server, using STDIO (default), use the following command:\n\n\n```bash\nmarkitdown-mcp\n```\n\nTo run the MCP server, using Streamable HTTP and SSE, use the following command:\n\n```bash\nmarkitdown-mcp --http --host 127.0.0.1 --port 3001\n```\n\n## Running in Docker\n\nTo run `markitdown-mcp` in Docker, build the Docker image using the provided Dockerfile:\n```bash\ndocker build -t markitdown-mcp:latest .\n```\n\nAnd run it using:\n```bash\ndocker run -it --rm markitdown-mcp:latest\n```\nThis will be sufficient for remote URIs. To access local files, you need to mount the local directory into the container. For example, if you want to access files in `/home/user/data`, you can run:\n\n```bash\ndocker run -it --rm -v /home/user/data:/workdir markitdown-mcp:latest\n```\n\nOnce mounted, all files under data will be accessible under `/workdir` in the container. For example, if you have a file `example.txt` in `/home/user/data`, it will be accessible in the container at `/workdir/example.txt`.\n\n## Accessing from Claude Desktop\n\nIt is recommended to use the Docker image when running the MCP server for Claude Desktop.\n\nFollow [these instructions](https://modelcontextprotocol.io/quickstart/user#for-claude-desktop-users) to access Claude's `claude_desktop_config.json` file.\n\nEdit it to include the following JSON entry:\n\n```json\n{\n  \"mcpServers\": {\n    \"markitdown\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"markitdown-mcp:latest\"\n      ]\n    }\n  }\n}\n```\n\nIf you want to mount a directory, adjust it accordingly:\n\n```json\n{\n  \"mcpServers\": {\n    \"markitdown\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\",\n        \"--rm\",\n        \"-i\",\n        \"-v\",\n        \"/home/user/data:/workdir\",\n        \"markitdown-mcp:latest\"\n      ]\n    }\n  }\n}\n```\n\n## Debugging\n\nTo debug the MCP server you can use the `MCP Inspector` tool.\n\n```bash\nnpx @modelcontextprotocol/inspector\n```\n\nYou can then connect to the inspector through the specified host and port (e.g., `http://localhost:5173/`).\n\nIf using STDIO:\n* select `STDIO` as the transport type,\n* input `markitdown-mcp` as the command, and\n* click `Connect`\n\nIf using Streamable HTTP:\n* select `Streamable HTTP` as the transport type,\n* input `http://127.0.0.1:3001/mcp` as the URL, and\n* click `Connect`\n\nIf using SSE:\n* select `SSE` as the transport type,\n* input `http://127.0.0.1:3001/sse` as the URL, and\n* click `Connect`\n\nFinally:\n* click the `Tools` tab,\n* click `List Tools`,\n* click `convert_to_markdown`, and\n* run the tool on any valid URI.\n\n## Security Considerations\n\nThe server does not support authentication, and runs with the privileges of the user running it. For this reason, when running in SSE or Streamable HTTP mode, the server binds by default to `localhost`. Even still, it is important to recognize that the server can be accessed by any process or users on the same local machine, and that the `convert_to_markdown` tool can be used to read any file that the server's user has access to, or any data from the network. If you require additional security, consider running the server in a sandboxed environment, such as a virtual machine or container, and ensure that the user permissions are properly configured to limit access to sensitive files and network segments. Above all, DO NOT bind the server to other interfaces (non-localhost) unless you understand the security implications of doing so.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n\n<!-- File: packages/markitdown-ocr/README.md (Tokens: ~1759 | Category: plugin-manifest) -->\n# MarkItDown OCR Plugin\n\nLLM Vision plugin for MarkItDown that extracts text from images embedded in PDF, DOCX, PPTX, and XLSX files.\n\nUses the same `llm_client` / `llm_model` pattern that MarkItDown already supports for image descriptions — no new ML libraries or binary dependencies required.\n\n## Features\n\n- **Enhanced PDF Converter**: Extracts text from images within PDFs, with full-page OCR fallback for scanned documents\n- **Enhanced DOCX Converter**: OCR for images in Word documents\n- **Enhanced PPTX Converter**: OCR for images in PowerPoint presentations\n- **Enhanced XLSX Converter**: OCR for images in Excel spreadsheets\n- **Context Preservation**: Maintains document structure and flow when inserting extracted text\n\n## Installation\n\nRequires `markitdown>=0.1.8,<0.2.0`, which provides the Office image-rendering hooks used by this plugin. Installing the plugin automatically resolves a compatible core version.\n\n```bash\npip install markitdown-ocr\n```\n\nThe plugin uses whatever OpenAI-compatible client you already have. Install one if you don't have it yet:\n\n```bash\npip install openai\n```\n\n## Usage\n\n### Command Line\n\n```bash\nmarkitdown document.pdf --use-plugins --llm-client openai --llm-model gpt-4o\n```\n\n### Python API\n\nPass `llm_client` and `llm_model` to `MarkItDown()` exactly as you would for image descriptions:\n\n```python\nfrom markitdown import MarkItDown\nfrom openai import OpenAI\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),\n    llm_model=\"gpt-4o\",\n)\n\nresult = md.convert(\"document_with_images.pdf\")\nprint(result.text_content)\n```\n\nIf no `llm_client` is provided the plugin still loads, but OCR is silently skipped — falling back to the standard built-in converter.\n\n### Custom Prompt\n\nOverride the default extraction prompt for specialized documents:\n\n```python\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),\n    llm_model=\"gpt-4o\",\n    llm_prompt=\"Extract all text from this image, preserving table structure.\",\n)\n```\n\n### Any OpenAI-Compatible Client\n\nWorks with any client that follows the OpenAI API:\n\n```python\nfrom openai import AzureOpenAI\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=AzureOpenAI(\n        api_key=\"...\",\n        azure_endpoint=\"https://your-resource.openai.azure.com/\",\n        api_version=\"2024-02-01\",\n    ),\n    llm_model=\"gpt-4o\",\n)\n```\n\n## How It Works\n\nWhen `MarkItDown(enable_plugins=True, llm_client=..., llm_model=...)` is called:\n\n1. MarkItDown discovers the plugin via the `markitdown.plugin` entry point group\n2. It calls `register_converters()`, forwarding all kwargs including `llm_client` and `llm_model`\n3. The plugin creates an `LLMVisionOCRService` from those kwargs\n4. Four OCR-enhanced converters are registered at **priority -1.0** — before the built-in converters at priority 0.0\n\nWhen a file is converted:\n\n1. The OCR converter accepts the file\n2. It extracts embedded images from the document\n3. Each image is sent to the LLM with an extraction prompt\n4. The returned text is placed alongside document content (XLSX images follow their sheet's table)\n5. If the LLM call fails, conversion continues without that image's text\n\nThe DOCX, PPTX, and XLSX converters subclass their core counterparts and override the same semi-private `_image_to_html` method. Core handles native content, preprocessing, and placement; the plugin supplies escaped OCR HTML, which passes through the shared HTML-to-Markdown renderer. PDF uses its separate existing pipeline.\n\n## Supported File Formats\n\n### PDF\n\n- Embedded images are extracted by position (via `page.images` / page XObjects) and OCR'd inline, interleaved with the surrounding text in vertical reading order.\n- **Scanned PDFs** (pages with no extractable text) are detected automatically: each page is rendered at 300 DPI and sent to the LLM as a full-page image.\n- **Malformed PDFs** that pdfplumber/pdfminer cannot open (e.g. truncated EOF) are retried with PyMuPDF page rendering, so content is still recovered.\n\n### DOCX\n\n- Inherits core DOCX preprocessing, styles, math, and Mammoth conversion.\n- Mammoth provides each embedded image to `_image_to_html`. OCR fragments are inserted into the document's HTML before Markdown rendering, not substituted into finished Markdown.\n- Block fragments split enclosing paragraphs where necessary and remain inside their table cell or list item. Table-cell line breaks follow the shared HTML converter's existing limitations.\n\n### PPTX\n\n- Picture shapes, placeholder shapes with images, and images inside groups are all supported.\n- Inherits core shape ordering, native text, tables, charts, and speaker notes.\n- Slide content now uses the core converter's real line breaks rather than the old plugin's literal `\\n` text, and inherits its empty-title and empty-notes handling.\n- If an `llm_client` is configured, the LLM is asked for a description first; OCR is used as the fallback when no description is returned.\n\n### XLSX\n\n- Inherits core workbook repair and table rendering; images are read from the same repaired workbook.\n- Images are listed under a `### Images in this sheet:` section after the sheet's data table — they are not interleaved into the table rows.\n- Sheet heading spacing follows the core converter; no new cell-position labels are added.\n- Legacy `.xls` files remain handled by the existing core converter, without image OCR.\n\n### Output format\n\nEvery extracted OCR block is wrapped as:\n\n```text\n*[Image OCR]\n<extracted text>\n[End OCR]*\n```\n\nFor Office formats, recognized text is escaped as literal HTML text before Markdown rendering. Markdown escaping and line breaks therefore follow the shared HTML converter: for example, underscores may be backslash-escaped, and direct converter results use Markdown hard breaks. `MarkItDown` subsequently strips trailing whitespace from each output line. Empty recognition retains the native image representation (XLSX normally omits images).\n\nRepeated image bytes are recognized once per conversion, while the result is placed at every occurrence. The cache is not shared across documents or service overrides.\n\n## Troubleshooting\n\n### OCR text missing from output\n\nThe most likely cause is a missing `llm_client` or `llm_model`. Verify:\n\n```python\nfrom openai import OpenAI\nfrom markitdown import MarkItDown\n\nmd = MarkItDown(\n    enable_plugins=True,\n    llm_client=OpenAI(),   # required\n    llm_model=\"gpt-4o\",    # required\n)\n```\n\n### Plugin not loading\n\nConfirm the plugin is installed and discovered:\n\n```bash\nmarkitdown --list-plugins   # should show: ocr\n```\n\n### API errors\n\nThe plugin propagates LLM API errors as warnings and continues conversion. Check your API key, quota, and that the chosen model supports vision inputs.\n\nFor Office OCR, a service-reported error emits a warning and retains native image rendering. Exceptions raised by custom OCR services propagate from direct converter calls; `MarkItDown` can retry another applicable converter through its normal fallback behavior.\n\n## Development\n\n### Running Tests\n\n```bash\ncd packages/markitdown-ocr\npytest tests/ -v\n```\n\n### Building from Source\n\n```bash\ngit clone https://github.com/microsoft/markitdown.git\ncd markitdown\npip install -e 'packages/markitdown[docx,pptx,xlsx]' -e packages/markitdown-ocr\n```\n\n## Contributing\n\nContributions are welcome! See the [MarkItDown repository](https://github.com/microsoft/markitdown) for guidelines.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n## Changelog\n\n### 0.1.0 (Initial Release)\n\n- LLM Vision OCR for PDF, DOCX, PPTX, XLSX\n- Full-page OCR fallback for scanned PDFs\n- Context-aware inline text insertion\n- Priority-based converter replacement (no code changes required)\n\n<!-- File: packages/markitdown-sample-plugin/README.md (Tokens: ~784 | Category: plugin-manifest) -->\n# MarkItDown Sample Plugin\n\n[![PyPI](https://img.shields.io/pypi/v/markitdown-sample-plugin.svg)](https://pypi.org/project/markitdown-sample-plugin/)\n![PyPI - Downloads](https://img.shields.io/pypi/dd/markitdown-sample-plugin)\n[![Built by AutoGen Team](https://img.shields.io/badge/Built%20by-AutoGen%20Team-blue)](https://github.com/microsoft/autogen)\n\n\nThis project shows how to create a sample plugin for MarkItDown. The most important parts are as follows:\n\nFirst, implement your custom DocumentConverter:\n\n```python\nfrom typing import BinaryIO, Any\nfrom markitdown import MarkItDown, DocumentConverter, DocumentConverterResult, StreamInfo, PRIORITY_SPECIFIC_FILE_FORMAT\n\nclass RtfConverter(DocumentConverter):\n\n    def __init__(\n        self, priority: float = PRIORITY_SPECIFIC_FILE_FORMAT\n    ):\n        super().__init__(priority=priority)\n\n    def accepts(\n        self,\n        file_stream: BinaryIO,\n        stream_info: StreamInfo,\n        **kwargs: Any,\n    ) -> bool:\n\n        # Implement logic to check if the file stream is an RTF file\n        # ...\n        raise NotImplementedError()\n\n\n    def convert(\n        self,\n        file_stream: BinaryIO,\n        stream_info: StreamInfo,\n        **kwargs: Any,\n    ) -> DocumentConverterResult:\n\n        # Implement logic to convert the file stream to Markdown\n        # ...\n        raise NotImplementedError()\n```\n\nNext, make sure your package implements and exports the following:\n\n```python\n# The version of the plugin interface that this plugin uses.\n# The only supported version is 1 for now.\n__plugin_interface_version__ = 1\n\n# The main entrypoint for the plugin. This is called each time MarkItDown instances are created.\ndef register_converters(markitdown: MarkItDown, **kwargs):\n    \"\"\"\n    Called during construction of MarkItDown instances to register converters provided by plugins.\n    \"\"\"\n\n    # Simply create and attach an RtfConverter instance\n    markitdown.register_converter(RtfConverter())\n```\n\n\nFinally, create an entrypoint in the `pyproject.toml` file:\n\n```toml\n[project.entry-points.\"markitdown.plugin\"]\nsample_plugin = \"markitdown_sample_plugin\"\n```\n\nHere, the value of `sample_plugin` can be any key, but should ideally be the name of the plugin. The value is the fully qualified name of the package implementing the plugin.\n\n\n## Installation\n\nTo use the plugin with MarkItDown, it must be installed. To install the plugin from the current directory use:\n\n```bash\npip install -e .\n```\n\nOnce the plugin package is installed, verify that it is available to MarkItDown by running:\n\n```bash\nmarkitdown --list-plugins\n```\n\nTo use the plugin for a conversion use the `--use-plugins` flag. For example, to convert an RTF file:\n\n```bash\nmarkitdown --use-plugins path-to-file.rtf\n```\n\nIn Python, plugins can be enabled as follows:\n\n```python\nfrom markitdown import MarkItDown\n\nmd = MarkItDown(enable_plugins=True)\nresult = md.convert(\"path-to-file.rtf\")\nprint(result.text_content)\n```\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n\n<!-- File: packages/markitdown/README.md (Tokens: ~430 | Category: plugin-manifest) -->\n# MarkItDown\n\n> [!TIP]\n> MarkItDown is a Python package and command-line utility for converting various files to Markdown (e.g., for indexing, text analysis, etc).\n>\n> For more information, and full documentation, see the project [README.md](https://github.com/microsoft/markitdown) on GitHub.\n\n> [!IMPORTANT]\n> MarkItDown performs I/O with the privileges of the current process. Like open() or requests.get(), it will access resources that the process itself can access. Sanitize your inputs in untrusted environments, and call the narrowest `convert_*` function needed for your use case (e.g., `convert_stream()`, or `convert_local()`). See the [Security Considerations](https://github.com/microsoft/markitdown#security-considerations) section of the documentation for more information.\n\n## Installation\n\nFrom PyPI:\n\n```bash\npip install 'markitdown[all]'\n```\n\nFrom source:\n\n```bash\ngit clone git@github.com:microsoft/markitdown.git\ncd markitdown\npip install -e 'packages/markitdown[all]'\n```\n\n## Usage\n\n### Command-Line\n\n```bash\nmarkitdown path-to-file.pdf > document.md\n```\n\n### Python API\n\n```python\nfrom markitdown import MarkItDown\n\nmd = MarkItDown()\nresult = md.convert(\"test.xlsx\")\nprint(result.markdown)\n```\n\n### More Information\n\nFor more information, and full documentation, see the project [README.md](https://github.com/microsoft/markitdown) on GitHub.\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft\ntrademarks or logos is subject to and must follow\n[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general).\nUse of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship.\nAny use of third-party trademarks or logos are subject to those third-party's policies.\n</yakaai_skills>"}