TM

tomatophp/mcp

Developer tools
0 stars 0 forks Quality 73 Trend 8MIT

Web MCP server for the TomatoPHP Filament plugin docs and versions

Overview

A public, read-only Model Context Protocol server for the TomatoPHP Filament plugins, running at . It lets AI assistants (Claude, Cursor, VS Code Copilot and any other MCP client) read the README of every tomatophp/* plugin, search across them, and pick the release that matches your Filament and Laravel versions, with the exact composer require line and the panel registration snippet. No account and no API key. The index is rebuilt every hour from GitHub and Packagist, and a GitHub webhook re-syncs a plugin as soon as it is pushed or released. Endpoint: https://mcp.tomatophp.com/mcp (Streamable HTTP). In Claude Desktop you can also add it under Settings, Connectors, Add custom connector. - Which version of tomatophp/filament-users works with Filament 4 and Laravel 12? - Install filament-accounts in this project and register it on the admin panel. - Search the TomatoPHP docs for user impersonation. All tools are read-only and idempotent.

README

TomatoPHP MCP

A public, read-only Model Context Protocol server for the TomatoPHP Filament plugins, running at https://mcp.tomatophp.com/mcp.

It lets AI assistants (Claude, Cursor, VS Code Copilot and any other MCP client) read the README of every tomatophp/* plugin, search across them, and pick the release that matches your Filament and Laravel versions, with the exact composer require line and the panel registration snippet. No account and no API key.

The index is rebuilt every hour from GitHub and Packagist, and a GitHub webhook re-syncs a plugin as soon as it is pushed or released.

Connect

Endpoint: https://mcp.tomatophp.com/mcp (Streamable HTTP).

Claude Code

claude mcp add --transport http tomatophp https://mcp.tomatophp.com/mcp

Claude Code (.mcp.json), Claude Desktop (claude_desktop_config.json) and Cursor (~/.cursor/mcp.json)

{
    "mcpServers": {
        "tomatophp": {
            "type": "http",
            "url": "https://mcp.tomatophp.com/mcp"
        }
    }
}

In Claude Desktop you can also add it under Settings, Connectors, Add custom connector.

VS Code (.vscode/mcp.json)

{
    "servers": {
        "tomatophp": {
            "type": "http",
            "url": "https://mcp.tomatophp.com/mcp"
        }
    }
}

Then ask things like:

  • Which version of tomatophp/filament-users works with Filament 4 and Laravel 12?
  • Install filament-accounts in this project and register it on the admin panel.
  • Search the TomatoPHP docs for user impersonation.

Tools

All tools are read-only and idempotent. Package names can be given as tomatophp/filament-users or just filament-users.

Tool Arguments Returns
list-plugins query?, filament? Every plugin with its latest version, the Filament, Laravel and PHP versions it supports and a one-line description. With filament, only plugins that have a release for that Filament major, plus the install line.
get-plugin package Latest version and requirements, every major version line, the composer command, artisan install commands and the ->plugin(...) registration snippet parsed from the README, and links (GitHub, Packagist, demo).
get-plugin-docs package, section? The README markdown, or only the section under that heading (with its sub-sections).
search-docs query, limit? The best matching README sections across all plugins, with package, heading, link and snippet.
get-compatible-version package, filament, laravel? The newest release that supports that Filament (and Laravel) major and the composer require line.
get-changelog package, limit? Recent GitHub releases with notes, the latest CHANGELOG.md entries and the recent Packagist versions.

Resources

  • tomatophp://ecosystem/overview: every plugin with its latest version and Filament, Laravel and PHP support, as a markdown table.
  • tomatophp://plugins/{package}/readme: the README of one plugin, e.g. tomatophp://plugins/filament-users/readme.

Prompt

  • install-plugin (package, filament?): step-by-step install and panel registration for a plugin, using the release that matches your Filament version.

How versions are worked out

For every version on Packagist the sync reads the require block:

  • Filament: filament/filament (or another filament/* core package). A plugin that ships 4.x for ^4.0 and 5.x for ^5.0 is matched per Filament major.
  • Laravel: laravel/framework or illuminate/* when the plugin requires it. Most plugins only require Filament, so their Laravel support is inherited from the Filament versions they allow, read from filament/support on Packagist.
  • PHP: the php constraint.

get-compatible-version returns the newest stable release that matches. When a newer release of the same major line dropped support, the constraint is capped below it (for example >=2.1.0 <2.2.0) instead of ^2.1, so Composer cannot pick the incompatible one.

What gets indexed

Every repository of the tomatophp organisation that is public, not a fork, not archived, and whose composer.json is named tomatophp/* with type library (Laravel applications are skipped). For each one the sync stores the description, topics, stars, default branch, README.md, CHANGELOG.md, the latest GitHub releases, and every Packagist version with its requirements and release date.

Local development

Requires PHP 8.3+ with the sqlite extension.

git clone https://github.com/tomatophp/mcp.git tomatophp-mcp
cd tomatophp-mcp
composer setup

Fill the index. Without a token GitHub allows 60 API requests an hour, which is not enough for the whole organisation, so set GITHUB_TOKEN in .env (a fine-grained token with public read-only access is enough):

php artisan tomatophp:sync                                    # everything
php artisan tomatophp:sync --package=tomatophp/filament-users # one plugin

Serve it and point a client or the MCP inspector at it:

php artisan serve
php artisan mcp:inspector mcp

The home page is plain Blade and CSS, no build step.

Webhook

POST /webhooks/github re-syncs one repository on push (default branch or tags) and release events. It verifies the X-Hub-Signature-256 HMAC with GITHUB_WEBHOOK_SECRET and rejects everything while no secret is set.

Add it once on the organisation (Settings, Webhooks):

  • Payload URL: https://mcp.tomatophp.com/webhooks/github
  • Content type: application/json
  • Secret: the value of GITHUB_WEBHOOK_SECRET
  • Events: pushes and releases

Configuration

Variable Default
GITHUB_TOKEN empty GitHub API token for the sync.
GITHUB_WEBHOOK_SECRET empty Secret of the organisation webhook.
MCP_PUBLIC_URL https://mcp.tomatophp.com/mcp Endpoint shown on the home page.
MCP_RATE_LIMIT 120 Requests per minute per client on /mcp (keyed by CF-Connecting-IP behind Cloudflare).

Deploy

deploy/deploy.sh updates the app in /var/www/mcp (git reset to origin/master, composer install --no-dev, migrate, sync, optimize, reload php8.4-fpm) and installs the scheduler cron entry on first run. deploy/nginx.conf is the vhost for mcp.tomatophp.com.

Testing

vendor/bin/pest
vendor/bin/pint --test

The tests fake GitHub and Packagist with the fixtures in tests/Fixtures.

License

The MIT License (MIT). See LICENSE.

View the full README on GitHub

Install

This server does not publish a one-line install command.

Open the repository installation guide New to MCP? Start with the mcpskill.org guide →

Configuration

{ "mcpServers": { "tomatophp": { "type": "http", "url": "https://mcp.tomatophp.com/mcp" } } }