{"id":147690,"name":"mdapi","description":"Minimal Data API I/O: a content transformation layer primitive for AI systems. Transforms files and webpages into AI-ready Markdown and structured data, optimized for LLM efficiency and token usage.","card_url":"https://mdapi.io/.well-known/agent-card.json","endpoint":"https://mdapi.io/a2a","protocol_version":"1.0.0","first_seen":"2026-10-16T06:07:05.767699+00:00","last_verified":"2026-10-16T06:07:05.767699+00:00","card":{"name":"mdapi","x402":{"asset":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","token":"USDC","scheme":"exact","version":"2.0","networks":["solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"],"minPayment":10000,"pricePerUnit":10000,"price_per_use_usd":0.01,"payment_window_seconds":86400},"skills":[{"id":"document_conversion","name":"Document Conversion","tags":["document","conversion","markdown"],"description":"Convert documents and office files (DOCX, DOC, DOT, WIZ, ODT, RTF, PDF, XLSX, XLS, XLT, ODS, XLSM, XLSB, ET, Numbers, DTA, RDS, RDA, RData, PPTX, PPT, POT, PPS, PWZ, ODP, EPUB, ZIP, TAR, TGZ, 7Z, GZ, XZ, LZMA, BZ2, TBZ2, TBZ, ZST, TZST) to clean Markdown. Pass a URL, data URI, or text via the input parameter."},{"id":"image_conversion","name":"Image to Markdown","tags":["image","conversion","markdown"],"description":"Convert images (JPEG, JPG, PNG, WebP, SVG, GIF, BMP) to Markdown with OCR-like text extraction."},{"id":"webpage_conversion","name":"Webpage Conversion","tags":["webpage","conversion","markdown"],"description":"Convert any publicly accessible webpage to structured Markdown."},{"id":"text_conversion","name":"Text Conversion","tags":["text","conversion","markdown"],"description":"Convert text formats (HTML, XML, JSON, CSV, TSV, TXT, MD, YAML, TOML, JS, PY, PL, RB, GO, RS, C, CPP, CS, JAVA, PHP, CSS, SCSS, SASS, LESS, SQL, SH, PS1, BAT, ASM, TEX, RST, GRAPHQL, JSON5, HCL, LOG, CONF, INI, VTT, VCF, ICS, EML) to Markdown."},{"id":"llm_processing","name":"LLM Processing","tags":["llm","processing","ai"],"description":"Process content with custom prompts for summarization, entity extraction, QA, and more. Use prompt parameter with result=prompt or result=both."},{"id":"streaming","name":"SSE Streaming","tags":["streaming","sse","real-time"],"description":"Real-time streaming responses using Server-Sent Events (SSE). Use the boolean `stream: true` parameter to receive chunks as they are generated. For A2A SendStreamingMessage, the first `result.task` frame carries the TASK_STATE_WORKING task, content streams as `result.artifactUpdate` frames (`append`, `lastChunk`), and `result.statusUpdate` closes with TASK_STATE_COMPLETED."},{"id":"rag_optimization","name":"RAG Optimization","tags":["rag","embedding","vector"],"description":"Generate embedding-ready content with result=prompt for RAG pipelines."},{"id":"part_selection","name":"Reading a Document in Parts","tags":["parts","pagination","large-documents","context-window"],"description":"Serve one part of a large document instead of the whole answer, so a question about page 400 of a 500-page report sends one page to the model and returns one page. Use `part` with a number, a range (`N-M`) or a comma-separated list; the unit is the document's natural boundary - page (PDF), slide (presentations), sheet (spreadsheets), chapter (EPUB and archives, an expanded `.tar.zst` included) - or one A4 sheet of text (2500 characters) for formats without one. Each part carries the document's front matter, so it reads on its own. To find where something sits without reading the document first, `find` answers with the ADDRESSES of its matches - the part and the offset inside it, never the text - so one request locates it and `part=N` brings back that piece; whitespace separates terms, and a hit is then a part carrying every one of them. Call `result=meta` first: it describes the resource (part range, what a part is, per-part titles and sizes, metadata) without converting the content, and every response self-describes its range in `parts` and the `X-MDAPI-Parts` / `X-MDAPI-Part-Unit` headers. A document larger than the input gate is readable only if its format can be addressed by parts (office packages, EPUB and PDF by their extension; ZIP, TAR and 7z with `part` or `result=meta`) - not the sequential compression family, legacy binary DOC/XLS/PPT, or file mode."}],"version":"1.0.0","provider":{"url":"https://mdapi.io","organization":"mdapi.io"},"security":[{"bearerAuth":[]}],"description":"Minimal Data API I/O: a content transformation layer primitive for AI systems. Transforms files and webpages into AI-ready Markdown and structured data, optimized for LLM efficiency and token usage.","capabilities":{"streaming":true,"pushNotifications":false,"stateTransitionHistory":false},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"documentationUrl":"https://mdapi.io","defaultInputModes":["text/plain","application/json"],"defaultOutputModes":["text/markdown","application/json"],"supportedInterfaces":[{"url":"https://mdapi.io/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0.0"}]},"signature_status":"unsigned","signature_detail":"No card signature supplied","signature_key_url":null,"signature_checked_at":"2026-10-16T06:07:05.767699+00:00","domain_claimed_at":null,"domain_proof_checked_at":null,"source_name":"GitHub repository README","source_url":"https://github.com/mdapiio/mdapi.io","last_check":{"checked_at":"2026-10-16T06:07:05.767699+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},"also_published_at":[],"history_urls":["https://mdapi.io/.well-known/agent-card.json"],"also_observed_in":[],"skills":[{"skill_id":"document_conversion","name":"Document Conversion","description":"Convert documents and office files (DOCX, DOC, DOT, WIZ, ODT, RTF, PDF, XLSX, XLS, XLT, ODS, XLSM, XLSB, ET, Numbers, DTA, RDS, RDA, RData, PPTX, PPT, POT, PPS, PWZ, ODP, EPUB, ZIP, TAR, TGZ, 7Z, GZ, XZ, LZMA, BZ2, TBZ2, TBZ, ZST, TZST) to clean Markdown. Pass a URL, data URI, or text via the input parameter.","tags":["document","conversion","markdown"],"quality_warning":false},{"skill_id":"image_conversion","name":"Image to Markdown","description":"Convert images (JPEG, JPG, PNG, WebP, SVG, GIF, BMP) to Markdown with OCR-like text extraction.","tags":["image","conversion","markdown"],"quality_warning":false},{"skill_id":"llm_processing","name":"LLM Processing","description":"Process content with custom prompts for summarization, entity extraction, QA, and more. Use prompt parameter with result=prompt or result=both.","tags":["llm","processing","ai"],"quality_warning":false},{"skill_id":"rag_optimization","name":"RAG Optimization","description":"Generate embedding-ready content with result=prompt for RAG pipelines.","tags":["rag","embedding","vector"],"quality_warning":false},{"skill_id":"part_selection","name":"Reading a Document in Parts","description":"Serve one part of a large document instead of the whole answer, so a question about page 400 of a 500-page report sends one page to the model and returns one page. Use `part` with a number, a range (`N-M`) or a comma-separated list; the unit is the document's natural boundary - page (PDF), slide (presentations), sheet (spreadsheets), chapter (EPUB and archives, an expanded `.tar.zst` included) - or one A4 sheet of text (2500 characters) for formats without one. Each part carries the document's front matter, so it reads on its own. To find where something sits without reading the document first, `find` answers with the ADDRESSES of its matches - the part and the offset inside it, never the text - so one request locates it and `part=N` brings back that piece; whitespace separates terms, and a hit is then a part carrying every one of them. Call `result=meta` first: it describes the resource (part range, what a part is, per-part titles and sizes, metadata) without converting the content, and every response self-describes its range in `parts` and the `X-MDAPI-Parts` / `X-MDAPI-Part-Unit` headers. A document larger than the input gate is readable only if its format can be addressed by parts (office packages, EPUB and PDF by their extension; ZIP, TAR and 7z with `part` or `result=meta`) - not the sequential compression family, legacy binary DOC/XLS/PPT, or file mode.","tags":["parts","pagination","large-documents","context-window"],"quality_warning":false},{"skill_id":"streaming","name":"SSE Streaming","description":"Real-time streaming responses using Server-Sent Events (SSE). Use the boolean `stream: true` parameter to receive chunks as they are generated. For A2A SendStreamingMessage, the first `result.task` frame carries the TASK_STATE_WORKING task, content streams as `result.artifactUpdate` frames (`append`, `lastChunk`), and `result.statusUpdate` closes with TASK_STATE_COMPLETED.","tags":["streaming","sse","real-time"],"quality_warning":false},{"skill_id":"text_conversion","name":"Text Conversion","description":"Convert text formats (HTML, XML, JSON, CSV, TSV, TXT, MD, YAML, TOML, JS, PY, PL, RB, GO, RS, C, CPP, CS, JAVA, PHP, CSS, SCSS, SASS, LESS, SQL, SH, PS1, BAT, ASM, TEX, RST, GRAPHQL, JSON5, HCL, LOG, CONF, INI, VTT, VCF, ICS, EML) to Markdown.","tags":["text","conversion","markdown"],"quality_warning":false},{"skill_id":"webpage_conversion","name":"Webpage Conversion","description":"Convert any publicly accessible webpage to structured Markdown.","tags":["webpage","conversion","markdown"],"quality_warning":false}],"quality_flags":[],"check_history":{"checks":1,"passed":1},"recent_checks":[{"card_url":"https://mdapi.io/.well-known/agent-card.json","checked_at":"2026-10-16T06:07:05.767699+00:00","success":true,"http_status":200,"detail":"Agent Card validated"}],"endpoint_tls_check":null,"protocol_check":{"checked_at":"2026-10-16T06:07:05.767699+00:00","state":"a2a_response","http_status":404,"detail":"A2A task-not-found response to a read-only task lookup"},"x402_price_check":null,"events":[],"relationships":[],"verification":{"agent_card_url":"https://mdapi.io/.well-known/agent-card.json","last_successful_card_check":"2026-10-16T06:07:05.767699+00:00","latest_card_check":{"checked_at":"2026-10-16T06:07:05.767699+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},"signature_status":"unsigned","signature_checked_at":"2026-10-16T06:07:05.767699+00:00","task_endpoint_tested":true,"task_execution_tested":false,"endpoint_tls_checked_at":null,"endpoint_tls_reachable":null,"protocol_check_state":"a2a_response","protocol_checked_at":"2026-10-16T06:07:05.767699+00:00","provider_identity_verified":false,"domain_claimed_at":null,"domain_proof_checked_at":null}}