PHPackages                             moneo/markdown-for-agents - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. moneo/markdown-for-agents

ActiveLibrary[Parsing &amp; Serialization](/categories/parsing)

moneo/markdown-for-agents
=========================

Laravel package for Cloudflare's Markdown conversion services.

v1.0.0(2mo ago)162MITPHPPHP ^8.2CI passing

Since Feb 18Pushed 2mo agoCompare

[ Source](https://github.com/moneo/laravel-markdown-for-agents)[ Packagist](https://packagist.org/packages/moneo/markdown-for-agents)[ RSS](/packages/moneo-markdown-for-agents/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (9)Versions (2)Used By (0)

Laravel Markdown for Agents
===========================

[](#laravel-markdown-for-agents)

[![Tests](https://github.com/moneo/laravel-markdown-for-agents/actions/workflows/tests.yml/badge.svg)](https://github.com/moneo/laravel-markdown-for-agents/actions/workflows/tests.yml)[![codecov](https://camo.githubusercontent.com/8ffed39058f963af11aa9252595faeae7e8da32d3048d6ff388c165c23f7da54/68747470733a2f2f636f6465636f762e696f2f67682f6d6f6e656f2f6c61726176656c2d6d61726b646f776e2d666f722d6167656e74732f67726170682f62616467652e737667)](https://codecov.io/gh/moneo/laravel-markdown-for-agents)[![Latest Version on Packagist](https://camo.githubusercontent.com/bb623d1860ac3fecff2bcd6c310c4cf0f2d32364a89faffc1d55b36c3c6b0caf/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d6f6e656f2f6d61726b646f776e2d666f722d6167656e74732e737667)](https://packagist.org/packages/moneo/markdown-for-agents)[![PHP Version](https://camo.githubusercontent.com/aaddbef5604f1561e9000d01d3c1afd0bcc1de8bc366a41b3eb0559823eb2033/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f6d6f6e656f2f6d61726b646f776e2d666f722d6167656e74732e737667)](https://packagist.org/packages/moneo/markdown-for-agents)[![Laravel Version](https://camo.githubusercontent.com/3c742828c5db02bfe4af055a8e6b8120d8352bdf375953828504c561f4d7684e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c61726176656c2d31312e7825323025374325323031322e782d4646324432302e737667)](https://laravel.com)[![PHPStan Level](https://camo.githubusercontent.com/7df949c3e70b05211ff7a2a7b2db11cbdf68785ef497eb5a4cf5955bd9665139/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068707374616e2d6c6576656c253230382d3446433932312e737667)](https://phpstan.org)[![Code Style](https://camo.githubusercontent.com/483dac26e6222a417b04a0c70ada79ead2e81cb0616e186dca7583d54418da17/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f64652532307374796c652d4c61726176656c25323050696e742d4633364532312e737667)](https://laravel.com/docs/pint)[![License](https://camo.githubusercontent.com/0488d147525150ddf1dd608e52a973bfbc6879552112369aaf1008a0e3c6f8a8/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f6d6f6e656f2f6d61726b646f776e2d666f722d6167656e74732e737667)](https://packagist.org/packages/moneo/markdown-for-agents)

A Laravel package that unifies Cloudflare's three Markdown conversion services under one elegant API.

Services
--------

[](#services)

ServiceDriver KeyDescription**Markdown for Agents**`agents`Content negotiation via `Accept: text/markdown` on any Cloudflare-enabled URL. Free, no auth.**Workers AI toMarkdown**`workers_ai`Converts files (PDF, DOCX, images, etc.) to Markdown via REST API. Auth required.**Browser Rendering**`browser`Headless browser renders JS-heavy pages then converts to Markdown. Auth required.Requirements
------------

[](#requirements)

- PHP 8.2+
- Laravel 11.x or 12.x

Installation
------------

[](#installation)

```
composer require moneo/markdown-for-agents
```

Publish the config file:

```
php artisan vendor:publish --tag=markdown-for-agents-config
```

Configuration
-------------

[](#configuration)

Add your Cloudflare credentials to `.env`:

```
# Required for workers_ai and browser drivers
CF_ACCOUNT_ID=your-account-id
CF_API_TOKEN=your-api-token

# Optional overrides
MFA_DRIVER=agents
MFA_CACHE=true
MFA_CACHE_STORE=redis
MFA_CACHE_TTL=3600
```

The `agents` driver does not require credentials.

Usage
-----

[](#usage)

### Convert a URL

[](#convert-a-url)

```
use Moneo\MarkdownForAgents\Facades\MarkdownForAgents;

$result = MarkdownForAgents::url('https://example.com')->convert();

$result->markdown;       // string — the converted content
$result->tokens;         // int — estimated token count
$result->contentSignals; // ?array — ['ai-train' => 'yes', ...]
$result->driver;         // string — which driver was used
$result->fromCache;      // bool — served from cache?

```

### Convert a file

[](#convert-a-file)

```
// Single file
$result = MarkdownForAgents::file('/path/to/document.pdf')->convert();

// Laravel UploadedFile
$result = MarkdownForAgents::file($request->file('document'))->convert();

// Batch conversion
$results = MarkdownForAgents::files([$pdf, $image, $spreadsheet])->convert();

foreach ($results as $result) {
    echo "{$result->name}: {$result->tokens} tokens\n";
}
```

### Convert raw HTML

[](#convert-raw-html)

```
$result = MarkdownForAgents::driver('browser')
    ->html('HelloWorld')
    ->convert();
```

### Choose a driver

[](#choose-a-driver)

```
// Use the browser driver for JS-heavy pages
$result = MarkdownForAgents::driver('browser')
    ->url('https://spa-app.com')
    ->waitUntil('networkidle0')
    ->convert();
```

### Fallback

[](#fallback)

If the primary driver fails, automatically retry with another:

```
$result = MarkdownForAgents::url('https://example.com')
    ->withFallback('browser')
    ->convert();
```

### Browser options

[](#browser-options)

```
$result = MarkdownForAgents::driver('browser')
    ->url('https://example.com')
    ->waitUntil('networkidle0')
    ->userAgent('MyBot/1.0')
    ->rejectPatterns(['/^.*\.(css|font)/'])
    ->cookies([['name' => 'session', 'value' => 'abc', 'domain' => '.example.com']])
    ->authenticate('user', 'pass')
    ->convert();
```

### Cache control

[](#cache-control)

Caching is enabled by default for URL and HTML conversions:

```
// Skip cache for this request
$result = MarkdownForAgents::url($url)->noCache()->convert();

// Custom TTL (seconds)
$result = MarkdownForAgents::url($url)->cache(7200)->convert();

// Clear cache
MarkdownForAgents::clearCache('https://example.com');
MarkdownForAgents::flushCache();
```

### Conditional fluent API

[](#conditional-fluent-api)

`PendingConversion` uses Laravel's `Conditionable` and `Tappable` traits:

```
$result = MarkdownForAgents::url($url)
    ->when($useBrowser, fn ($c) => $c->waitUntil('networkidle0'))
    ->unless($isAdmin, fn ($c) => $c->noCache())
    ->convert();
```

### Supported formats

[](#supported-formats)

```
$formats = MarkdownForAgents::supportedFormats();
// Returns SupportedFormat[] — delegates to Workers AI
```

Driver Comparison
-----------------

[](#driver-comparison)

ScenarioRecommended DriverCloudflare-enabled site`agents` (fastest, free)PDF, DOCX, XLSX, images`workers_ai` (only option)SPA / JS-heavy page`browser` (full render)Non-Cloudflare site`browser`Raw HTML string`browser`Make your app agent-readyMiddleware (local, no API)Middleware
----------

[](#middleware)

Add the middleware to routes to make your Laravel app respond with Markdown when AI agents request it:

```
Route::get('/blog/{slug}', [BlogController::class, 'show'])
    ->middleware('markdown-for-agents');
```

When a request includes `Accept: text/markdown`, the middleware converts HTML responses to Markdown locally using `league/html-to-markdown`. No Cloudflare API calls are made.

Response headers added:

- `Content-Type: text/markdown; charset=utf-8`
- `Vary: accept`
- `x-markdown-tokens: {count}`
- `Content-Signal: ai-train=yes, search=yes, ai-input=yes`

Artisan Commands
----------------

[](#artisan-commands)

```
# Convert a URL
php artisan markdown:convert https://example.com
php artisan markdown:convert https://example.com --driver=browser
php artisan markdown:convert https://example.com --save=output.md

# Convert a file
php artisan markdown:convert /path/to/document.pdf

# List supported formats
php artisan markdown:formats

# Clear cache
php artisan markdown:cache:clear
php artisan markdown:cache:clear --url=https://example.com
```

Events
------

[](#events)

Two events are dispatched during conversions:

- `MarkdownConverted` — on success (includes result, source, duration)
- `ConversionFailed` — on failure (includes source, driver, exception)

```
use Moneo\MarkdownForAgents\Events\MarkdownConverted;

Event::listen(MarkdownConverted::class, function (MarkdownConverted $event) {
    Log::info("Converted {$event->source} in {$event->duration}s");
});
```

Custom Drivers
--------------

[](#custom-drivers)

Register custom drivers that implement `MarkdownConverterInterface`:

```
use Moneo\MarkdownForAgents\Facades\MarkdownForAgents;

MarkdownForAgents::extend('custom', function ($app) {
    return new MyCustomDriver($app['config']);
});

$result = MarkdownForAgents::driver('custom')->url($url)->convert();
```

Testing
-------

[](#testing)

The package uses `orchestra/testbench`. All tests mock HTTP responses -- no real API calls.

```
composer test
```

When testing your own app's code that uses this package, mock the facade:

```
use Moneo\MarkdownForAgents\Facades\MarkdownForAgents;
use Moneo\MarkdownForAgents\DTOs\ConversionResult;

MarkdownForAgents::shouldReceive('url->convert')
    ->andReturn(new ConversionResult(...));
```

License
-------

[](#license)

MIT

###  Health Score

38

—

LowBetter than 85% of packages

Maintenance82

Actively maintained with recent releases

Popularity10

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity46

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

89d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/1097170?v=4)[Emir Karşıyakalı](/maintainers/emir)[@emir](https://github.com/emir)

---

Top Contributors

[![emir](https://avatars.githubusercontent.com/u/1097170?v=4)](https://github.com/emir "emir (3 commits)")

---

Tags

cloudflarecloudflare-apigeolaravellaravel-packagemarkdownphplaravelaiconversionmarkdowncloudflareagents

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/moneo-markdown-for-agents/health.svg)

```
[![Health](https://phpackages.com/badges/moneo-markdown-for-agents/health.svg)](https://phpackages.com/packages/moneo-markdown-for-agents)
```

###  Alternatives

[laravel/socialite

Laravel wrapper around OAuth 1 &amp; OAuth 2 libraries.

5.7k96.9M674](/packages/laravel-socialite)[laravel/boost

Laravel Boost accelerates AI-assisted development by providing the essential context and structure that AI needs to generate high-quality, Laravel-specific code.

3.5k10.6M274](/packages/laravel-boost)[laravel/cashier-paddle

Cashier Paddle provides an expressive, fluent interface to Paddle's subscription billing services.

264778.4k3](/packages/laravel-cashier-paddle)[spatie/laravel-markdown-response

Serve markdown versions of your HTML pages to AI agents and bots

6512.6k](/packages/spatie-laravel-markdown-response)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

245.2k](/packages/aedart-athenaeum)[truckersmp/steam-socialite

Laravel Socialite provider for Steam OpenID.

1516.7k](/packages/truckersmp-steam-socialite)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
