diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml
new file mode 100644
index 0000000..47d2917
--- /dev/null
+++ b/.github/workflows/changelog.yml
@@ -0,0 +1,31 @@
+name: "Update Changelog"
+
+on:
+  release:
+    types: [released]
+
+permissions:
+  contents: write
+
+jobs:
+  update:
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v4
+        with:
+          ref: main
+
+      - name: Update Changelog
+        uses: stefanzweifel/changelog-updater-action@v1
+        with:
+          latest-version: ${{ github.event.release.name }}
+          release-notes: ${{ github.event.release.body }}
+
+      - name: Commit updated CHANGELOG
+        uses: stefanzweifel/git-auto-commit-action@v5
+        with:
+          branch: main
+          commit_message: Update CHANGELOG
+          file_pattern: CHANGELOG.md
\ No newline at end of file
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
new file mode 100644
index 0000000..950f8c5
--- /dev/null
+++ b/.github/workflows/tests.yml
@@ -0,0 +1,38 @@
+name: Tests
+
+on: ['push', 'pull_request']
+
+jobs:
+  ci:
+    runs-on: ubuntu-latest
+
+    strategy:
+      fail-fast: false
+      matrix:
+        php: [8.1, 8.2, 8.3, 8.4]
+      max-parallel: 4
+
+    name: Tests PHP${{ matrix.php }}
+
+    steps:
+
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - name: Cache dependencies
+        uses: actions/cache@v4
+        with:
+          path: ~/.composer/cache/files
+          key: dependencies-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }}
+
+      - name: Setup PHP
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: ${{ matrix.php }}
+          coverage: none
+
+      - name: Install Composer dependencies
+        run: composer update --no-interaction --prefer-dist
+
+      - name: Run Tests
+        run: composer run test
diff --git a/.gitignore b/.gitignore
index 6d108d7..0e52713 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,6 @@
 /composer.lock
 
 # PHPUnit
-/phpunit.xml
 .phpunit.result.cache
 
 # PHP CS Fixer
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..ec7d523
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,81 @@
+# Changelog
+
+All notable changes to `php-mcp/laravel` will be documented in this file.
+
+## v1.1.1 - 2025-05-12
+
+### What's Changed
+* McpServiceProvider File And loadElements function are not found by @tsztodd in https://github.com/php-mcp/laravel/pull/2
+
+### New Contributors
+* @tsztodd made their first contribution in https://github.com/php-mcp/laravel/pull/2
+
+**Full Changelog**: https://github.com/php-mcp/laravel/compare/1.1.0...1.1.1
+
+## v1.1.0 - 2025-05-01
+
+This release updates the package for compatibility with `php-mcp/server` v1.1.0.
+
+### What Changed
+
+*   Updated dependency requirement to `php-mcp/server: ^1.1.0`.
+*   Modified `McpServiceProvider` to correctly provide `ConfigurationRepositoryInterface`, `LoggerInterface`, and `CacheInterface` bindings to the underlying `Server` instance when resolved from the Laravel container.
+*   Updated `ServeCommand` and `McpController` to inject the `Server` instance and instantiate `TransportHandler` classes according to `php-mcp/server` v1.1.0 constructor changes.
+
+### Fixed
+
+*   Ensures compatibility with the refactored dependency injection and transport handler instantiation logic in `php-mcp/server` v1.1.0.
+
+**Full Changelog**: https://github.com/php-mcp/laravel/compare/1.0.0...1.1.0
+
+# Release v1.0.0 - Initial Release
+
+**Initial Release**
+
+Welcome to the first release of `php-mcp/laravel`! This package provides seamless integration of the core [`php-mcp/server`](https://github.com/php-mcp/server) package with your Laravel application, allowing you to expose application functionality as Model Context Protocol (MCP) tools, resources, and prompts using simple PHP attributes.
+
+## Key Features
+
+*   **Effortless Integration:** Automatically wires up Laravel's Cache, Logger, and Service Container for use by the MCP server.
+*   **Attribute-Based Definition:** Define MCP tools, resources, and prompts using PHP attributes (`#[McpTool]`, `#[McpResource]`, etc.) within your Laravel application structure. Leverage Laravel's Dependency Injection within your MCP element classes.
+*   **Configuration:** Provides a publishable configuration file (`config/mcp.php`) for fine-grained control over discovery, transports, caching, and capabilities.
+*   **Artisan Commands:** Includes commands for element discovery (`mcp:discover`), listing discovered elements (`mcp:list`), and running the server via stdio (`mcp:serve`).
+*   **HTTP+SSE Transport:** Sets up routes (`/mcp/message`, `/mcp/sse` by default) and a controller for handling MCP communication over HTTP, enabling browser-based clients and other HTTP consumers.
+*   **Automatic Discovery (Dev):** Automatically discovers MCP elements in development environments on first use, improving developer experience (no need to manually run `mcp:discover` after changes).
+*   **Manual Discovery (Prod):** Requires manual discovery (`mcp:discover`) for production environments, ensuring optimal performance via caching (integrates well with deployment workflows).
+*   **Event Integration:** Dispatches Laravel events (`ToolsListChanged`, `ResourcesListChanged`, `PromptsListChanged`) when element lists change, allowing for custom integrations or notifications.
+
+## Installation
+
+Installation is straightforward using Composer. See the [README Installation Guide](https://github.com/php-mcp/laravel/blob/main/README.md#installation) for full details.
+
+```bash
+# 1. Require the package
+composer require php-mcp/laravel
+
+# 2. Publish the configuration file (optional but recommended)
+php artisan vendor:publish --provider="PhpMcp\Laravel\Server\McpServiceProvider" --tag="mcp-config"
+```
+
+## Getting Started
+
+1.  **Define Elements:** Create PHP classes with methods annotated with `#[McpTool]`, `#[McpResource]`, etc., within directories specified in `config/mcp.php` (e.g., `app/Mcp`). Inject dependencies as needed. See [Defining MCP Elements](https://github.com/php-mcp/laravel/blob/main/README.md#defining-mcp-elements).
+2.  **Discovery:**
+    *   In development, discovery runs automatically when needed.
+    *   In production, run `php artisan mcp:discover` during your deployment process. See [Automatic Discovery vs. Manual Discovery](https://github.com/php-mcp/laravel/blob/main/README.md#automatic-discovery-development-vs-manual-discovery-production).
+3.  **Run the Server:**
+    *   For **Stdio Transport:** Use `php artisan mcp:serve` and configure your client to execute this command (using the full path to `artisan`).
+    *   For **HTTP+SSE Transport:** Ensure `transports.http.enabled` is true, run your Laravel app on a suitable web server (Nginx+FPM, Octane, etc. - **not** `php artisan serve`), exclude the MCP route from CSRF protection, and configure your client with the SSE URL (e.g., `http://your-app.test/mcp/sse`). See [Running the Server](https://github.com/php-mcp/laravel/blob/main/README.md#running-the-server) for critical details.
+
+## Important Notes
+
+*   **HTTP Transport Server Requirement:** The standard `php artisan serve` development server is **not suitable** for the HTTP+SSE transport due to its single-process nature. Use a proper web server setup like Nginx/Apache + PHP-FPM or Laravel Octane.
+*   **CSRF Exclusion:** If using the default `web` middleware group for the HTTP transport, you **must** exclude the MCP message route (default: `mcp` or `mcp/*`) from CSRF protection in your application to avoid `419` errors.
+*   **Dependencies:** Requires PHP >= 8.1 and Laravel >= 10.0.
+
+## Links
+
+*   **GitHub Repository:** https://github.com/php-mcp/laravel
+*   **Packagist:** https://packagist.org/packages/php-mcp/laravel
+
+Please report any issues or provide feedback on the GitHub repository.
\ No newline at end of file
diff --git a/README.md b/README.md
index d278225..a9ec83d 100644
--- a/README.md
+++ b/README.md
@@ -4,249 +4,333 @@
 [](https://packagist.org/packages/php-mcp/laravel)
 [](LICENSE)
 
-Integrates the core [`php-mcp/server`](https://github.com/php-mcp/server) package seamlessly into your Laravel application, allowing you to expose parts of your application as **Model Context Protocol (MCP)** tools, resources, and prompts using simple PHP attributes.
+**Seamlessly integrate the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction) into your Laravel applications.**
 
-This package handles:
+This package is the official Laravel wrapper for the powerful [`php-mcp/server`](https://github.com/php-mcp/server) library. It allows you to effortlessly expose parts of your Laravel application as MCP **Tools**, **Resources**, and **Prompts**, enabling standardized communication with AI assistants like Anthropic's Claude, Cursor IDE, and others.
 
-*   Automatically wiring Laravel's Cache, Logger, and Container for use by the MCP server.
-*   Providing configuration options via `config/mcp.php`.
-*   Registering Artisan commands (`mcp:serve`, `mcp:discover`, `mcp:list`).
-*   Setting up HTTP+SSE transport routes and controllers.
-*   Integrating with Laravel's event system for dynamic updates.
+**Key Features:**
+
+*   **Effortless Integration:** Designed from the ground up for Laravel, leveraging its service container, configuration, caching, logging, and Artisan console.
+*   **Fluent Element Definition:** Define MCP elements programmatically with a clean, Laravely API using the `Mcp` Facade (e.g., `Mcp::tool(...)->description(...)`).
+*   **Attribute-Based Discovery:** Alternatively, use PHP 8 attributes (`#[McpTool]`, etc.) on your classes and methods, then run a simple Artisan command to discover and cache them.
+*   **Flexible Transports:**
+    *   **Integrated HTTP+SSE:** Serve MCP requests directly through your Laravel application's routes, ideal for many setups.
+    *   **Dedicated HTTP+SSE Server:** Launch a high-performance, standalone ReactPHP-based HTTP server via an Artisan command for demanding scenarios.
+    *   **STDIO:** Run an MCP server over standard input/output, perfect for CLI-driven clients.
+*   **Robust Configuration:** Manage all aspects of your MCP server via the `config/mcp.php` file.
+*   **Artisan Commands:** Includes commands for serving, discovering elements, and listing registered components.
+*   **Event-Driven Updates:** Integrates with Laravel's event system to notify clients of dynamic changes to your MCP elements.
+
+This package utilizes `php-mcp/server` v2.1.0+ which supports the `2024-11-05` version of the Model Context Protocol.
 
 ## Requirements
 
 *   PHP >= 8.1
-*   Laravel >= 10.0 (May work with older versions, but tested with 10+)
-*   [`php-mcp/server`](https://github.com/php-mcp/server) (Installed as a dependency)
+*   Laravel >= 10.0
+*   [`php-mcp/server`](https://github.com/php-mcp/server) ^2.1.0 (automatically installed)
 
 ## Installation
 
-1.  Require the package via Composer:
+1.  **Require the Package:**
     ```bash
     composer require php-mcp/laravel
     ```
-2.  The `McpServiceProvider` will be automatically discovered and registered by Laravel.
-3.  Publish the configuration file:
+
+2.  **Publish Configuration:**
     ```bash
     php artisan vendor:publish --provider="PhpMcp\Laravel\Server\McpServiceProvider" --tag="mcp-config"
     ```
-    This will create a `config/mcp.php` file where you can customize the server's behavior.
 
 ## Configuration
 
-The primary way to configure the MCP server in Laravel is through the `config/mcp.php` file.
-
-*   **`server`**: Basic server information (name, version).
-*   **`discovery`**: 
-    *   `base_path`: The root path for discovery (defaults to `base_path()`).
-    *   `directories`: An array of paths *relative* to `base_path` to scan for MCP attributes (defaults to `['app/Mcp']`). Add the directories where you define your MCP element classes here.
-*   **`cache`**:
-    *   `store`: The Laravel cache store to use (e.g., `file`, `redis`). Uses the default store if `null`.
-    *   `prefix`: The cache prefix to use for caching internally.
-    *   `ttl`: Default cache TTL in seconds for discovered elements and transport state.
-*   **`transports`**:
-    *   **`http`**: Configures the built-in HTTP+SSE transport.
-        *   `enabled`: Set to `false` to disable the HTTP routes.
-        *   `prefix`: URL prefix for the MCP routes (defaults to `mcp`, resulting in `/mcp` and `/mcp/sse`).
-        *   `middleware`: Array of middleware groups to apply. Defaults to `['web']`. **Important:** The `web` middleware group (or another group that enables sessions) is generally required for the HTTP transport to correctly identify clients using session IDs.
-        *   `domain`: Optional route domain.
-    *   **`stdio`**: Configures the stdio transport.
-        *   `enabled`: Set to `false` to disable the `mcp:serve` command.
-*   **`protocol_versions`**: Array of supported MCP protocol versions (only `'2024-11-05'` currently).
-*   **`pagination_limit`**: Default number of items returned by list methods.
-*   **`capabilities`**: Enable/disable specific MCP features (tools, resources, prompts, logging) and list change notifications.
-*   **`logging`**:
-    *   `channel`: Specific Laravel log channel to use. Defaults to the application's default channel.
-    *   `level`: Default log level if not provided by the core server.
-
-## Usage
-
-### Defining MCP Elements
-
-Define your MCP Tools, Resources, and Prompts by decorating methods **or invokable classes** with attributes from the `php-mcp/server` package (`#[McpTool]`, `#[McpResource]`, `#[McpPrompt]`, `#[McpResourceTemplate]`).
-
-Place these classes in a directory included in the `discovery.directories` config array (e.g., `app/Mcp/MyTools.php`).
-
-**Example (`app/Mcp/MyTools.php`):**
+All MCP server settings are managed in `config/mcp.php`. Here are the key sections:
+
+### Server Information
+*   **`server`**: Basic server identity settings
+    *   `name`: Your MCP server's name (default: 'Laravel MCP')
+    *   `version`: Server version number
+    *   `instructions`: Optional initialization instructions for clients
+
+### Discovery Settings
+*   **`discovery`**: Controls how MCP elements are discovered
+    *   `base_path`: Root directory for scanning (defaults to `base_path()`)
+    *   `directories`: Paths to scan for MCP attributes (default: `['app/Mcp']`)
+    *   `exclude_dirs`: Directories to skip during scans (e.g., 'vendor', 'tests', etc.)
+    *   `definitions_file`: Path to manual element definitions (default: `routes/mcp.php`)
+    *   `auto_discover`: Enable automatic discovery in development (default: `true`)
+    *   `save_to_cache`: Cache discovery results (default: `true`)
+
+### Transport Configuration
+*   **`transports`**: Available communication methods
+    *   **`stdio`**: CLI-based transport
+        *   `enabled`: Enable the `mcp:serve` command with `stdio` option.
+    *   **`http_dedicated`**: Standalone HTTP server
+        *   `enabled`: Enable the `mcp:serve` command with `http` option.
+        *   `host`, `port`, `path_prefix` settings
+    *   **`http_integrated`**: Laravel route-based server
+        *   `enabled`: Serve through Laravel routes
+        *   `route_prefix`: URL prefix (default: 'mcp')
+        *   `middleware`: Applied middleware (default: 'web')
+
+### Cache & Performance
+*   **`cache`**: Caching configuration
+    *   `store`: Laravel cache store to use
+    *   `ttl`: Cache lifetime in seconds
+*   **`pagination_limit`**: Maximum items returned in list operations
+
+### Feature Control
+*   **`capabilities`**: Toggle MCP features
+    *   Enable/disable tools, resources, prompts
+    *   Control subscriptions and change notifications
+*   **`logging`**: Server logging configuration
+    *   `channel`: Laravel log channel
+    *   `level`: Default log level
+
+Review the published `config/mcp.php` file for detailed documentation of all available options and their descriptions.
+
+## Defining MCP Elements
+
+PHP MCP Laravel provides two approaches to define your MCP elements: manual registration using a fluent API or attribute-based discovery.
+
+### Manual Registration
+
+The recommended approach is using the fluent `Mcp` facade to manually register your elements in `routes/mcp.php` (this path can be changed in config/mcp.php via the discovery.definitions_file key).
+
 ```php
- ['user']]).
+
+#### Resource Template (`Mcp::resourceTemplate()`)
+
+Defines a handler for resource URIs that contain variable parts, allowing dynamic resource instance generation. Register a resource template by providing:
+- `$uriTemplate` (`required`): The URI template string (`RFC 6570`), e.g., `user://{userId}/profile`.
+- `$handler`: The handler method. Its parameters must match the variables in the `$uriTemplate`.
+
+Available configuration methods:
+- `name(string $name): self`: Sets a human-readable name for the template type.
+- `description(string $description): self`: Sets a description for the template.
+- `mimeType(string $mimeType): self`: Sets a default MIME type for resources resolved by this template.
+- `annotations(array $annotations): self`: Adds MCP-standard annotations.
+
+#### Prompts (`Mcp::prompt()`)
+
+Defines a generator for MCP prompt messages, often used to construct conversations for an LLM. Register a prompt by providing just the handler, or the name and handler.
+- `$name` (`optional`): The MCP prompt name. Inferred if omitted.
+- `$handler`: The handler method. Its parameters become the prompt's input arguments.
 
+
+The package automatically resolves handlers through Laravel's service container, allowing you to inject dependencies through constructor injection. Each registration method accepts either an invokable class or a `[class, method]` array.
+
+The fluent methods like `description()`, `name()`, and `mimeType()` are optional. When omitted, the package intelligently infers these values from your handler's method signatures, return types, and DocBlocks. Use these methods only when you need to override the automatically generated metadata.
+
+Manually registered elements are always available regardless of cache status and take precedence over discovered elements with the same identifier.
+
+### Attribute-Based Discovery
+
+As an alternative, you can use PHP 8 attributes to mark your methods or invokable classes as MCP elements. That way, you don't have to manually register them in the definitions file:
+
+```php
 namespace App\Mcp;
 
-use Illuminate\Support\Facades\Config;
-use PhpMcp\Server\Attributes\McpResource;
 use PhpMcp\Server\Attributes\McpTool;
-use Psr\Log\LoggerInterface;
+use PhpMcp\Server\Attributes\McpResource;
 
-class MyTools
+class DiscoveredElements
 {
-    public function __construct(private LoggerInterface $logger) {}
-
-    #[McpResource(uri: 'laravel://config/app.name', mimeType: 'text/plain')]
-    public function getAppName(): string
+    #[McpTool(name: 'echo_discovered')]
+    public function echoMessage(string $message): string
     {
-        return Config::get('app.name', 'Laravel');
+        return "Discovered echo: {$message}";
     }
-
-    #[McpTool]
-    public function add(int $a, int $b): int
+    
+    #[McpResource(uri: 'status://server/health', mimeType: 'application/json')]
+    public function getServerHealth(): array
     {
-        $this->logger->info('Adding numbers via MCP');
-        return $a + $b;
+        return ['status' => 'healthy', 'uptime' => 123];
     }
 }
 ```
 
-*   **Dependency Injection:** Your classes' constructors (or invokable classes) will be resolved using Laravel's service container, so you can inject any application dependencies (like the `LoggerInterface` above).
-*   **Attribute Usage:** Refer to the [`php-mcp/server` README](https://github.com/php-mcp/server/blob/main/README.md#attributes-for-discovery) for detailed information on defining elements (both on methods and invokable classes) and formatting return values.
+When `auto_discover` enabled in your config, these elements are automatically discovered when needed. For production or to manually trigger discovery, run:
 
-### Automatic Discovery (Development) vs. Manual Discovery (Production)
+```bash
+php artisan mcp:discover
+```
 
-The server needs to discover your annotated elements before clients can use them.
+This command scans the configured directories, registers the discovered elements, and caches the results for improved performance. Use the `--no-cache` flag to skip caching or `--force` to perform a fresh scan regardless of cache status.
 
-*   **Development:** In non-production environments (e.g., `APP_ENV=local`), the server will **automatically discover** elements the first time the MCP server is needed (like on the first relevant HTTP request or Artisan command). You generally **do not** need to run the command manually during development after adding or changing elements.
+See the [`php-mcp/server` documentation](https://github.com/php-mcp/server?tab=readme-ov-file#attribute-details--return-formatting) for detailed information on attribute parameters and return value formatting.
 
-*   **Production:** For performance reasons, automatic discovery is **disabled** in production environments (`APP_ENV=production`). You **must run the discovery command manually** as part of your deployment process:
+## Running the MCP Server
 
-    ```bash
-    php artisan mcp:discover
-    ```
+PHP MCP Laravel offers three transport options to serve your MCP elements.
 
-    This command scans the configured directories and caches the found elements using the configured Laravel cache store. Running it during deployment ensures your production environment uses the pre-discovered, cached elements for optimal performance.
+### Integrated HTTP+SSE via Laravel Routes
 
-    *(You can still run `mcp:discover` manually in development if you wish, for example, to pre-populate the cache.)*
+The most convenient option for getting started is serving MCP directly through your Laravel application's routes:
 
-### Running the Server
+```php
+// Client connects to: http://your-app.test/mcp/sse
+// No additional processes needed
+```
 
-You can expose your MCP server using either the stdio or HTTP+SSE transport.
+**Configuration**:
+- Ensure `mcp.transports.http_integrated.enabled` is `true` in your config
+- The package registers routes at `/mcp/sse` (GET) and `/mcp/message` (POST) by default
+- You can customize the prefix, middleware, and domain in `config/mcp.php`
 
-**Stdio Transport:**
+**CSRF Protection**: You must exclude the MCP message endpoint from CSRF verification:
 
-*   Configure your MCP client (Cursor, Claude Desktop) to connect via command. **Important:** Ensure you provide the **full path** to your project's `artisan` file.
+For Laravel 11+:
+```php
+// bootstrap/app.php
+->withMiddleware(function (Middleware $middleware) {
+    $middleware->validateCsrfTokens(except: [
+        config('mcp.transports.http_integrated.route_prefix') . '/message',
+    ]);
+})
+```
 
-    *Example Client Config (e.g., `.cursor/mcp.json`):*
-    ```json
-    {
-        "mcpServers": {
-            "my-laravel-mcp": {
-                "command": "php",
-                "args": [
-                    "/full/path/to/your/laravel/project/artisan", 
-                    "mcp:serve"
-                ],
-            }
-        }
-    }
-    ```
-    *(Replace `/full/path/to/...` with the correct absolute paths)*
-
-**HTTP+SSE Transport:**
-
-*   **Enable:** Ensure `transports.http.enabled` is `true` in `config/mcp.php`.
-*   **Routes:** The package automatically registers two routes (by default `/mcp/sse` [GET] and `/mcp/message` [POST]) using the configured prefix and middleware (`web` by default).
-*   
-*   **Web Server Environment (CRITICAL):** 
-    *   The built-in `php artisan serve` development server **cannot reliably handle** the concurrent nature of SSE (long-running GET request) and subsequent POST requests from the MCP client. This is because it runs as a single PHP process. You will likely encounter hangs or requests not being processed.
-    *   For the HTTP+SSE transport to function correctly, you **must** run your Laravel application using a web server setup capable of handling concurrent requests properly:
-        *   **Nginx + PHP-FPM** or **Apache + PHP-FPM** (Recommended for typical deployments): Ensure FPM is configured to handle multiple worker processes.
-        *   **Laravel Octane** (with Swoole or RoadRunner): Optimized for high concurrency and suitable for this use case.
-        *   Other async runtimes capable of handling concurrent I/O.
-    *   You also need to ensure your web server (Nginx/Apache) and PHP-FPM configurations allow for long-running requests (`set_time_limit(0)` is handled by the controller, but server/FPM timeouts might interfere) and do *not* buffer the `text/event-stream` response (e.g., `X-Accel-Buffering: no` for Nginx).
-*   
-*   **Middleware:** Make sure the middleware applied (usually `web` in `config/mcp.php`) correctly handles sessions or provides another way to consistently identify the client across requests if you modify the default `McpController` behaviour.
-*   
-*   **CSRF Protection Exclusion (Important!):** The default `web` middleware group includes CSRF protection. Since MCP clients do not send CSRF tokens, you **must** exclude the MCP POST route from CSRF verification to prevent `419` errors. 
-    *   The specific URI to exclude depends on the `prefix` configured in `config/mcp.php`. By default, the prefix is `mcp`, so you should exclude `mcp` or `mcp/*`.
-    *   **Laravel 10 and below:** Add the pattern to the `$except` array in `app/Http/Middleware/VerifyCsrfToken.php`:
-        ```php
-        // app/Http/Middleware/VerifyCsrfToken.php
-        protected $except = [
-            // ... other routes
-            'mcp', // Or config('mcp.transports.http.prefix', 'mcp').'/*'
-        ];
-        ```
-    *   **Laravel 11+:** Add the pattern within the `bootstrap/app.php` file's `withMiddleware` call:
-        ```php
-        // bootstrap/app.php
-        ->withMiddleware(function (Middleware $middleware) {
-            $mcpPrefix = config('mcp.transports.http.prefix', 'mcp');
-            $middleware->validateCsrfTokens(except: [
-                $mcpPrefix, // Or $mcpPrefix.'/*'
-                // ... other routes
-            ]);
-        })
-        ```
-*   **Client Configuration:** Configure your MCP client to connect via URL, using the **SSE endpoint URL**.
-
-    *Example Client Config:*
-    ```json
-    {
-        "mcpServers": {
-            "my-laravel-mcp-http": {
-                "url": "http://your-laravel-app.test/mcp/sse" // Adjust URL as needed
-            }
+For Laravel 10 and below:
+```php
+// app/Http/Middleware/VerifyCsrfToken.php
+protected $except = [
+    'mcp/message', // Adjust if you changed the route prefix
+];
+```
+
+**Server Environment Considerations**:
+Standard synchronous servers like PHP's built-in server or basic PHP-FPM setups can struggle with SSE connections. For eg, a single PHP-FPM worker will be tied up for each active SSE connection. For production, consider using Laravel Octane with Swoole/RoadRunner or properly configured Nginx with sufficient PHP-FPM workers.
+
+### Dedicated HTTP+SSE Server (Recommended)
+
+For production environments or high-traffic applications, the dedicated HTTP server provides better performance and isolation:
+
+```bash
+php artisan mcp:serve --transport=http
+```
+
+This launches a standalone ReactPHP-based HTTP server specifically for MCP traffic:
+
+**Configuration**:
+- Ensure `mcp.transports.http_dedicated.enabled` is `true` in your config
+- Default server listens on `127.0.0.1:8090` with path prefix `/mcp`
+- Configure through any of these methods:
+  - Environment variables: `MCP_HTTP_DEDICATED_HOST`, `MCP_HTTP_DEDICATED_PORT`, `MCP_HTTP_DEDICATED_PATH_PREFIX`
+  - Edit values directly in `config/mcp.php`
+  - Override at runtime: `--host=0.0.0.0 --port=8091 --path-prefix=custom_mcp`
+
+This is a blocking, long-running process that should be managed with Supervisor, systemd, or Docker in production environments.
+
+### STDIO Transport for Direct Client Integration
+
+Ideal for Cursor IDE and other MCP clients that directly launch server processes:
+
+```bash
+php artisan mcp:serve
+# or explicitly:
+php artisan mcp:serve --transport=stdio
+```
+
+**Client Configuration**:
+Configure your MCP client to execute this command directly. For example, in Cursor:
+
+```json
+// .cursor/mcp.json
+{
+    "mcpServers": {
+        "my-laravel-stdio": {
+            "command": "php",
+            "args": [
+                "/full/path/to/your/laravel/project/artisan",
+                "mcp:serve"
+            ]
         }
     }
-    ```
-    The server will automatically inform the client about the correct POST endpoint URL (including a unique `?clientId=...` query parameter) via the initial `endpoint` event sent over the SSE connection.
+}
+```
 
-### Other Commands
+**Important**: When using STDIO transport, your handler code must not write to STDOUT using echo, print, or similar functions. Use Laravel's logger or STDERR for any debugging output.
 
-*   **List Elements:** View the discovered MCP elements.
-    ```bash
-    php artisan mcp:list
-    # Or list specific types:
-    php artisan mcp:list tools
-    php artisan mcp:list resources
-    php artisan mcp:list prompts
-    php artisan mcp:list templates
-    # Output as JSON:
-    php artisan mcp:list --json 
-    ```
+## Listing Registered Elements
+
+To see which MCP elements your server has registered (both manual and discovered/cached):
+
+```bash
+php artisan mcp:list
+# Specific types:
+php artisan mcp:list tools
+php artisan mcp:list resources
+# JSON output:
+php artisan mcp:list --json
+```
 
-### Dynamic Updates (Notifications)
+## Dynamic Updates (Events)
 
-If the list of available tools, resources, or prompts changes while the server is running, or if a specific resource's content is updated, you can notify connected clients (primarily useful for HTTP+SSE).
+If your available MCP elements or resource content change while the server is running, you can notify connected clients (most relevant for HTTP transports).
 
-*   **List Changes:** Dispatch the corresponding event from anywhere in your Laravel application:
+*   **List Changes (Tools, Resources, Prompts):**
+    Dispatch the corresponding Laravel event. The package includes listeners to send the appropriate MCP notification.
     ```php
     use PhpMcp\Laravel\Server\Events\ToolsListChanged;
     use PhpMcp\Laravel\Server\Events\ResourcesListChanged;
     use PhpMcp\Laravel\Server\Events\PromptsListChanged;
 
-    // When tools have changed:
     ToolsListChanged::dispatch();
-
-    // When resources have changed:
-    ResourcesListChanged::dispatch();
-
-    // When prompts have changed:
-    PromptsListChanged::dispatch();
+    // ResourcesListChanged::dispatch();
+    // PromptsListChanged::dispatch();
     ```
-    The service provider includes listeners that automatically send the appropriate `*ListChanged` notifications to clients.
 
-*   **Specific Resource Content Change:** Inject or resolve the `PhpMcp\Server\Registry` and call `notifyResourceChanged`:
+*   **Specific Resource Content Update:**
+    Dispatch the `PhpMcp\Laravel\Server\Events\ResourceUpdated` event with the URI of the changed resource.
     ```php
-    use PhpMcp\Server\Registry;
+    use PhpMcp\Laravel\Server\Events\ResourceUpdated;
 
-    public function updateMyResource(Registry $registry, string $resourceUri)
-    {
-        // ... update the resource data ...
-
-        $registry->notifyResourceChanged($resourceUri);
-    }
+    $resourceUri = 'file:///path/to/updated_file.txt';
+    // ... your logic that updates the resource ...
+    ResourceUpdated::dispatch($resourceUri);
     ```
-    This will trigger a `resources/didChange` notification for clients subscribed to that specific URI.
+    The `McpNotificationListener` will handle sending the `notifications/resource/updated` MCP notification to clients subscribed to that URI.
 
-## Contributing
+## Testing
 
-Please see CONTRIBUTING.md for details.
+For your application tests, you can mock the `Mcp` facade or specific MCP handlers as needed. When testing MCP functionality itself, consider integration tests that make HTTP requests to your integrated MCP endpoints (if used) or command tests for Artisan commands.
 
-## License
+## Contributing
 
-The MIT License (MIT). Please see [License File](LICENSE) for more information.
+Please see [CONTRIBUTING.md](CONTRIBUTING.md) in the main [`php-mcp/server`](https://github.com/php-mcp/server) repository for general contribution guidelines. For issues or PRs specific to this Laravel package, please use this repository's issue tracker.
 
-## Support & Feedback
+## License
 
-Please open an issue on the [GitHub repository](https://github.com/php-mcp/laravel) for bugs, questions, or feedback. 
+The MIT License (MIT). See [LICENSE](LICENSE).
\ No newline at end of file
diff --git a/composer.json b/composer.json
index ac10bfb..5d56a64 100644
--- a/composer.json
+++ b/composer.json
@@ -13,33 +13,34 @@
     "license": "MIT",
     "authors": [
         {
-            "name": "Kyrian",
-            "email": "okeowoaderukyrian@gmail.com",
+            "name": "Kyrian Obikwelu",
+            "email": "koshnawaza@gmail.com",
             "role": "Developer"
         }
     ],
     "require": {
         "php": "^8.1",
         "laravel/framework": "^9.46 || ^10.34 || ^11.29 || ^12.0",
-        "php-mcp/server": "^1.1.0"
+        "php-mcp/server": "^2.2"
     },
     "require-dev": {
         "laravel/pint": "^1.13",
+        "mockery/mockery": "^1.6",
+        "orchestra/pest-plugin-testbench": "^2.1",
         "orchestra/testbench": "^8.0 || ^9.0",
         "pestphp/pest": "^2.0",
         "pestphp/pest-plugin-laravel": "^2.0",
-        "mockery/mockery": "^1.6",
         "phpunit/phpunit": "^10.0 || ^11.0",
         "react/http": "^1.11"
     },
     "autoload": {
         "psr-4": {
-            "PhpMcp\\Laravel\\Server\\": "src/"
+            "PhpMcp\\Laravel\\": "src/"
         }
     },
     "autoload-dev": {
         "psr-4": {
-            "PhpMcp\\Laravel\\Server\\Tests\\": "tests/"
+            "PhpMcp\\Laravel\\Tests\\": "tests/"
         }
     },
     "scripts": {
@@ -56,7 +57,7 @@
     "extra": {
         "laravel": {
             "providers": [
-                "PhpMcp\\Laravel\\Server\\McpServiceProvider"
+                "PhpMcp\\Laravel\\McpServiceProvider"
             ]
         }
     },
diff --git a/config/mcp.php b/config/mcp.php
index f02a278..d8952c5 100644
--- a/config/mcp.php
+++ b/config/mcp.php
@@ -5,42 +5,61 @@
     |--------------------------------------------------------------------------
     | MCP Server Information
     |--------------------------------------------------------------------------
+    |
+    | This section defines basic information about your MCP server instance,
+    | including its name, version, and any initialization instructions that
+    | should be provided to clients during the initial handshake.
+    |
     */
     'server' => [
         'name' => env('MCP_SERVER_NAME', 'Laravel MCP'),
         'version' => env('MCP_SERVER_VERSION', '1.0.0'),
+        'instructions' => env('MCP_SERVER_INSTRUCTIONS'),
     ],
 
     /*
     |--------------------------------------------------------------------------
     | MCP Discovery Configuration
     |--------------------------------------------------------------------------
+    |
+    | These options control how the MCP server discovers and registers tools,
+    | resources and prompts in your application. You can configure which
+    | directories to scan, what to exclude, and how discovery behaves.
+    |
     */
     'discovery' => [
         'base_path' => base_path(),
-
-        // Relative paths from project root (base_path()) to scan for MCP elements.
-        'directories' => [
-            env('MCP_DISCOVERY_PATH', 'app/Mcp'),
-            // Add more paths if needed
+        'directories' => array_filter(explode(',', env('MCP_DISCOVERY_DIRECTORIES', 'app/Mcp'))),
+        'exclude_dirs' => [
+            'vendor',
+            'tests',
+            'storage',
+            'public',
+            'resources',
+            'bootstrap',
+            'config',
+            'database',
+            'routes',
+            'node_modules',
+            '.git',
         ],
+        'definitions_file' => base_path('routes/mcp.php'),
+        'auto_discover' => (bool) env('MCP_AUTO_DISCOVER', true),
+        'save_to_cache' => (bool) env('MCP_DISCOVERY_SAVE_TO_CACHE', true),
     ],
 
     /*
     |--------------------------------------------------------------------------
     | MCP Cache Configuration
     |--------------------------------------------------------------------------
-    | Configures caching for both discovered elements (via Registry) and
-    | transport state (via TransportState). Uses Laravel's cache system.
+    |
+    | Configure how the MCP server caches discovered elements and transport
+    | state using Laravel's cache system. You can specify which store to use
+    | and how long items should be cached.
+    |
     */
     'cache' => [
-        // The Laravel cache store to use (e.g., 'file', 'redis', 'database').
         'store' => env('MCP_CACHE_STORE', config('cache.default')),
-
-        // The prefix for the cache keys.
-        'prefix' => env('MCP_CACHE_PREFIX', 'mcp_'),
-
-        // Default TTL in seconds for cached items (null = forever).
         'ttl' => env('MCP_CACHE_TTL', 3600),
     ],
 
@@ -48,56 +67,75 @@
     |--------------------------------------------------------------------------
     | MCP Transport Configuration
     |--------------------------------------------------------------------------
+    |
+    | Configure the available transports for MCP communication. Three types are
+    | supported: stdio for CLI clients, http_dedicated for a standalone server,
+    | and http_integrated for serving through Laravel's routing system.
+    |
     */
     'transports' => [
+        'stdio' => [
+            'enabled' => (bool) env('MCP_STDIO_ENABLED', true),
+        ],
 
-        'http' => [
-            'enabled' => env('MCP_HTTP_ENABLED', true),
-
-            // URL path prefix for the HTTP endpoints (e.g., /mcp and /mcp/sse).
-            'prefix' => env('MCP_HTTP_PREFIX', 'mcp'),
-
-            // Middleware group(s) to apply to the HTTP routes.
-            'middleware' => ['web'],
-
-            // Optional domain for the HTTP routes.
-            'domain' => env('MCP_HTTP_DOMAIN'),
+        'http_dedicated' => [
+            'enabled' => (bool) env('MCP_HTTP_DEDICATED_ENABLED', true),
+            'host' => env('MCP_HTTP_DEDICATED_HOST', '127.0.0.1'),
+            'port' => (int) env('MCP_HTTP_DEDICATED_PORT', 8090),
+            'path_prefix' => env('MCP_HTTP_DEDICATED_PATH_PREFIX', 'mcp'),
+            'ssl_context_options' => [],
         ],
 
-        'stdio' => [
-            'enabled' => env('MCP_STDIO_ENABLED', true),
+        'http_integrated' => [
+            'enabled' => (bool) env('MCP_HTTP_INTEGRATED_ENABLED', true),
+            'route_prefix' => env('MCP_HTTP_INTEGRATED_ROUTE_PREFIX', 'mcp'),
+            'middleware' => explode(',', env('MCP_HTTP_INTEGRATED_MIDDLEWARE', 'web')),
+            'domain' => env('MCP_HTTP_INTEGRATED_DOMAIN'),
+            'sse_poll_interval' => (int) env('MCP_HTTP_INTEGRATED_SSE_POLL_SECONDS', 1),
         ],
     ],
 
     /*
     |--------------------------------------------------------------------------
-    | MCP Protocol & Capabilities
+    | Pagination Limit
     |--------------------------------------------------------------------------
+    |
+    | This value determines the maximum number of items that will be returned
+    | by list methods in the MCP server.
+    |
     */
-
-    // Max items for list methods.
     'pagination_limit' => env('MCP_PAGINATION_LIMIT', 50),
 
+    /*
+    |--------------------------------------------------------------------------
+    | MCP Capabilities Configuration
+    |--------------------------------------------------------------------------
+    |
+    | Define which MCP features are enabled in your server instance. This includes
+    | support for tools, resources, prompts, and their related functionality like
+    | subscriptions and change notifications.
+    |
+    */
     'capabilities' => [
         'tools' => [
-            'enabled' => env('MCP_CAP_TOOLS_ENABLED', true),
-            'listChanged' => env('MCP_CAP_TOOLS_LIST_CHANGED', true),
+            'enabled' => (bool) env('MCP_CAP_TOOLS_ENABLED', true),
+            'listChanged' => (bool) env('MCP_CAP_TOOLS_LIST_CHANGED', true),
         ],
 
         'resources' => [
-            'enabled' => env('MCP_CAP_RESOURCES_ENABLED', true),
-            'subscribe' => env('MCP_CAP_RESOURCES_SUBSCRIBE', true), // Enable resource subscriptions
-            'listChanged' => env('MCP_CAP_RESOURCES_LIST_CHANGED', true),
+            'enabled' => (bool) env('MCP_CAP_RESOURCES_ENABLED', true),
+            'subscribe' => (bool) env('MCP_CAP_RESOURCES_SUBSCRIBE', true),
+            'listChanged' => (bool) env('MCP_CAP_RESOURCES_LIST_CHANGED', true),
         ],
 
         'prompts' => [
-            'enabled' => env('MCP_CAP_PROMPTS_ENABLED', true),
-            'listChanged' => env('MCP_CAP_PROMPTS_LIST_CHANGED', true),
+            'enabled' => (bool) env('MCP_CAP_PROMPTS_ENABLED', true),
+            'listChanged' => (bool) env('MCP_CAP_PROMPTS_LIST_CHANGED', true),
         ],
 
         'logging' => [
-            'enabled' => env('MCP_CAP_LOGGING_ENABLED', true),
-            'setLevel' => env('MCP_CAP_LOGGING_SET_LEVEL', false),
+            'enabled' => (bool) env('MCP_CAP_LOGGING_ENABLED', true),
+            'setLevel' => (bool) env('MCP_CAP_LOGGING_SET_LEVEL', false),
         ],
     ],
 
@@ -105,12 +143,13 @@
     |--------------------------------------------------------------------------
     | Logging Configuration
     |--------------------------------------------------------------------------
+    |
+    | Configure how the MCP server handles logging. You can specify which Laravel
+    | log channel to use and set the default log level.
+    |
     */
     'logging' => [
-        // Log channel to use for MCP logs. Uses default channel if null.
         'channel' => env('MCP_LOG_CHANNEL', config('logging.default')),
-
-        // Default log level for the MCP logger (used by Server if not overridden).
         'level' => env('MCP_LOG_LEVEL', 'info'),
     ],
 ];
diff --git a/phpunit.xml b/phpunit.xml
new file mode 100644
index 0000000..49fc3c2
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,36 @@
+
+
+    
+        
+            ./tests/Feature
+        
+    
+    
+        
+            ./app
+            ./src
+        
+    
+    
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+    
+
diff --git a/routes/mcp.php b/routes/mcp_http_integrated.php
similarity index 92%
rename from routes/mcp.php
rename to routes/mcp_http_integrated.php
index bbbdc12..15a9811 100644
--- a/routes/mcp.php
+++ b/routes/mcp_http_integrated.php
@@ -3,7 +3,7 @@
 declare(strict_types=1);
 
 use Illuminate\Support\Facades\Route;
-use PhpMcp\Laravel\Server\Http\Controllers\McpController;
+use PhpMcp\Laravel\Http\Controllers\McpController;
 
 /*
 |--------------------------------------------------------------------------
diff --git a/samples/basic/app/Mcp/GenerateSeoKeywordsPrompt.php b/samples/basic/app/Mcp/GenerateSeoKeywordsPrompt.php
new file mode 100644
index 0000000..046ce33
--- /dev/null
+++ b/samples/basic/app/Mcp/GenerateSeoKeywordsPrompt.php
@@ -0,0 +1,26 @@
+ 'user',
+                'content' => "Please generate 5 SEO-friendly keywords for the following topic: {$topic}.",
+            ],
+            [
+                'role' => 'assistant',
+                'content' => "Okay, I will generate 5 SEO-friendly keywords for '{$topic}'. Here they are:"
+            ]
+        ];
+    }
+}
diff --git a/samples/basic/app/Mcp/GenerateWelcomeMessage.php b/samples/basic/app/Mcp/GenerateWelcomeMessage.php
new file mode 100644
index 0000000..2874d39
--- /dev/null
+++ b/samples/basic/app/Mcp/GenerateWelcomeMessage.php
@@ -0,0 +1,17 @@
+ $articleId,
+            'title' => 'Manually Registered Article Example',
+            'content' => "This is sample content for article {$articleId} provided by a manually registered ResourceTemplate.",
+            'author' => 'MCP Assistant',
+            'published_at' => now()->toIso8601String(),
+        ];
+    }
+}
diff --git a/samples/basic/app/Mcp/MyLaravelTools.php b/samples/basic/app/Mcp/MyLaravelTools.php
index 8eb5386..ac67d2e 100644
--- a/samples/basic/app/Mcp/MyLaravelTools.php
+++ b/samples/basic/app/Mcp/MyLaravelTools.php
@@ -3,14 +3,12 @@
 namespace App\Mcp;
 
 use Illuminate\Support\Facades\Cache;
-use Illuminate\Support\Facades\Config;
 use PhpMcp\Server\Attributes\McpResource;
 use PhpMcp\Server\Attributes\McpTool;
-use Psr\Log\LoggerInterface; // Example dependency injection
+use Psr\Log\LoggerInterface;
 
 class MyLaravelTools
 {
-    // Example: Injecting a dependency via constructor
     public function __construct(private LoggerInterface $logger)
     {
         $this->logger->info('MyLaravelTools instance created via container.');
@@ -24,7 +22,7 @@ public function __construct(private LoggerInterface $logger)
     #[McpResource(uri: 'config://app/name', name: 'laravel_app_name', mimeType: 'text/plain')]
     public function getAppName(): string
     {
-        $appName = Config::get('app.name', 'Laravel'); // Access Laravel config
+        $appName = config('app.name', 'Laravel');
         $this->logger->debug('MCP Resource Read', ['uri' => 'config://app/name', 'value' => $appName]);
 
         return $appName;
@@ -43,7 +41,6 @@ public function add(int $a, int $b): int
         $sum = $a + $b;
         $this->logger->info('MCP Tool Called', ['tool' => 'laravel_adder', 'result' => $sum]);
 
-        // Example: Interact with Laravel Cache
         Cache::put('last_mcp_sum', $sum, now()->addMinutes(5));
 
         return $sum;
diff --git a/samples/basic/composer.json b/samples/basic/composer.json
index 29003f9..8b9368d 100644
--- a/samples/basic/composer.json
+++ b/samples/basic/composer.json
@@ -12,7 +12,7 @@
         "php": "^8.2",
         "laravel/framework": "^12.0",
         "laravel/tinker": "^2.10.1",
-        "php-mcp/laravel": "@dev"
+        "php-mcp/laravel": "*"
     },
     "require-dev": {
         "fakerphp/faker": "^1.23",
@@ -83,4 +83,4 @@
             "url": "../../" 
         }
     ]
-}
\ No newline at end of file
+}
diff --git a/samples/basic/composer.lock b/samples/basic/composer.lock
index fd3d429..87bfb12 100644
--- a/samples/basic/composer.lock
+++ b/samples/basic/composer.lock
@@ -4,20 +4,20 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "7f990c460c70eb62ad8feba0827b55df",
+    "content-hash": "0657b476192ef74ed23544ff24c8dac5",
     "packages": [
         {
             "name": "brick/math",
-            "version": "0.12.3",
+            "version": "0.13.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/brick/math.git",
-                "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba"
+                "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba",
-                "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba",
+                "url": "https://api.github.com/repos/brick/math/zipball/fc7ed316430118cc7836bf45faff18d5dfc8de04",
+                "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04",
                 "shasum": ""
             },
             "require": {
@@ -56,7 +56,7 @@
             ],
             "support": {
                 "issues": "https://github.com/brick/math/issues",
-                "source": "https://github.com/brick/math/tree/0.12.3"
+                "source": "https://github.com/brick/math/tree/0.13.1"
             },
             "funding": [
                 {
@@ -64,7 +64,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2025-02-28T13:11:00+00:00"
+            "time": "2025-03-29T13:50:30+00:00"
         },
         {
             "name": "carbonphp/carbon-doctrine-types",
@@ -605,6 +605,62 @@
             },
             "time": "2023-08-08T05:53:35+00:00"
         },
+        {
+            "name": "fig/http-message-util",
+            "version": "1.1.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message-util.git",
+                "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765",
+                "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3 || ^7.0 || ^8.0"
+            },
+            "suggest": {
+                "psr/http-message": "The package containing the PSR-7 interfaces"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Fig\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Utility classes and constants for use with PSR-7 (psr/http-message)",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/http-message-util/issues",
+                "source": "https://github.com/php-fig/http-message-util/tree/1.1.5"
+            },
+            "time": "2020-11-24T22:02:12+00:00"
+        },
         {
             "name": "fruitcake/php-cors",
             "version": "v1.3.0",
@@ -1151,20 +1207,20 @@
         },
         {
             "name": "laravel/framework",
-            "version": "v12.12.0",
+            "version": "v12.17.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/framework.git",
-                "reference": "8f6cd73696068c28f30f5964556ec9d14e5d90d7"
+                "reference": "8729d084510480fdeec9b6ad198180147d4a7f06"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/framework/zipball/8f6cd73696068c28f30f5964556ec9d14e5d90d7",
-                "reference": "8f6cd73696068c28f30f5964556ec9d14e5d90d7",
+                "url": "https://api.github.com/repos/laravel/framework/zipball/8729d084510480fdeec9b6ad198180147d4a7f06",
+                "reference": "8729d084510480fdeec9b6ad198180147d4a7f06",
                 "shasum": ""
             },
             "require": {
-                "brick/math": "^0.11|^0.12",
+                "brick/math": "^0.11|^0.12|^0.13",
                 "composer-runtime-api": "^2.2",
                 "doctrine/inflector": "^2.0.5",
                 "dragonmantank/cron-expression": "^3.4",
@@ -1181,7 +1237,7 @@
                 "guzzlehttp/uri-template": "^1.0",
                 "laravel/prompts": "^0.3.0",
                 "laravel/serializable-closure": "^1.3|^2.0",
-                "league/commonmark": "^2.6",
+                "league/commonmark": "^2.7",
                 "league/flysystem": "^3.25.1",
                 "league/flysystem-local": "^3.25.1",
                 "league/uri": "^7.5.1",
@@ -1273,7 +1329,7 @@
                 "php-http/discovery": "^1.15",
                 "phpstan/phpstan": "^2.0",
                 "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1",
-                "predis/predis": "^2.3",
+                "predis/predis": "^2.3|^3.0",
                 "resend/resend-php": "^0.10.0",
                 "symfony/cache": "^7.2.0",
                 "symfony/http-client": "^7.2.0",
@@ -1305,7 +1361,7 @@
                 "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).",
                 "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).",
                 "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).",
-                "predis/predis": "Required to use the predis connector (^2.3).",
+                "predis/predis": "Required to use the predis connector (^2.3|^3.0).",
                 "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
                 "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).",
                 "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).",
@@ -1362,7 +1418,7 @@
                 "issues": "https://github.com/laravel/framework/issues",
                 "source": "https://github.com/laravel/framework"
             },
-            "time": "2025-05-01T16:13:12+00:00"
+            "time": "2025-06-03T14:04:18+00:00"
         },
         {
             "name": "laravel/prompts",
@@ -1552,16 +1608,16 @@
         },
         {
             "name": "league/commonmark",
-            "version": "2.6.2",
+            "version": "2.7.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/commonmark.git",
-                "reference": "06c3b0bf2540338094575612f4a1778d0d2d5e94"
+                "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/06c3b0bf2540338094575612f4a1778d0d2d5e94",
-                "reference": "06c3b0bf2540338094575612f4a1778d0d2d5e94",
+                "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/6fbb36d44824ed4091adbcf4c7d4a3923cdb3405",
+                "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405",
                 "shasum": ""
             },
             "require": {
@@ -1598,7 +1654,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "2.7-dev"
+                    "dev-main": "2.8-dev"
                 }
             },
             "autoload": {
@@ -1655,7 +1711,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-04-18T21:09:27+00:00"
+            "time": "2025-05-05T12:20:28+00:00"
         },
         {
             "name": "league/config",
@@ -2206,16 +2262,16 @@
         },
         {
             "name": "nesbot/carbon",
-            "version": "3.9.0",
+            "version": "3.9.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/CarbonPHP/carbon.git",
-                "reference": "6d16a8a015166fe54e22c042e0805c5363aef50d"
+                "reference": "ced71f79398ece168e24f7f7710462f462310d4d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6d16a8a015166fe54e22c042e0805c5363aef50d",
-                "reference": "6d16a8a015166fe54e22c042e0805c5363aef50d",
+                "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ced71f79398ece168e24f7f7710462f462310d4d",
+                "reference": "ced71f79398ece168e24f7f7710462f462310d4d",
                 "shasum": ""
             },
             "require": {
@@ -2308,7 +2364,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-03-27T12:57:33+00:00"
+            "time": "2025-05-01T19:51:51+00:00"
         },
         {
             "name": "nette/schema",
@@ -2374,16 +2430,16 @@
         },
         {
             "name": "nette/utils",
-            "version": "v4.0.6",
+            "version": "v4.0.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nette/utils.git",
-                "reference": "ce708655043c7050eb050df361c5e313cf708309"
+                "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nette/utils/zipball/ce708655043c7050eb050df361c5e313cf708309",
-                "reference": "ce708655043c7050eb050df361c5e313cf708309",
+                "url": "https://api.github.com/repos/nette/utils/zipball/e67c4061eb40b9c113b218214e42cb5a0dda28f2",
+                "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2",
                 "shasum": ""
             },
             "require": {
@@ -2454,22 +2510,22 @@
             ],
             "support": {
                 "issues": "https://github.com/nette/utils/issues",
-                "source": "https://github.com/nette/utils/tree/v4.0.6"
+                "source": "https://github.com/nette/utils/tree/v4.0.7"
             },
-            "time": "2025-03-30T21:06:30+00:00"
+            "time": "2025-06-03T04:55:08+00:00"
         },
         {
             "name": "nikic/php-parser",
-            "version": "v5.4.0",
+            "version": "v5.5.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nikic/PHP-Parser.git",
-                "reference": "447a020a1f875a434d62f2a401f53b82a396e494"
+                "reference": "ae59794362fe85e051a58ad36b289443f57be7a9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494",
-                "reference": "447a020a1f875a434d62f2a401f53b82a396e494",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9",
+                "reference": "ae59794362fe85e051a58ad36b289443f57be7a9",
                 "shasum": ""
             },
             "require": {
@@ -2512,37 +2568,37 @@
             ],
             "support": {
                 "issues": "https://github.com/nikic/PHP-Parser/issues",
-                "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0"
+                "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0"
             },
-            "time": "2024-12-30T11:07:19+00:00"
+            "time": "2025-05-31T08:24:38+00:00"
         },
         {
             "name": "nunomaduro/termwind",
-            "version": "v2.3.0",
+            "version": "v2.3.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/nunomaduro/termwind.git",
-                "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda"
+                "reference": "dfa08f390e509967a15c22493dc0bac5733d9123"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda",
-                "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda",
+                "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dfa08f390e509967a15c22493dc0bac5733d9123",
+                "reference": "dfa08f390e509967a15c22493dc0bac5733d9123",
                 "shasum": ""
             },
             "require": {
                 "ext-mbstring": "*",
                 "php": "^8.2",
-                "symfony/console": "^7.1.8"
+                "symfony/console": "^7.2.6"
             },
             "require-dev": {
-                "illuminate/console": "^11.33.2",
-                "laravel/pint": "^1.18.2",
+                "illuminate/console": "^11.44.7",
+                "laravel/pint": "^1.22.0",
                 "mockery/mockery": "^1.6.12",
-                "pestphp/pest": "^2.36.0",
-                "phpstan/phpstan": "^1.12.11",
-                "phpstan/phpstan-strict-rules": "^1.6.1",
-                "symfony/var-dumper": "^7.1.8",
+                "pestphp/pest": "^2.36.0 || ^3.8.2",
+                "phpstan/phpstan": "^1.12.25",
+                "phpstan/phpstan-strict-rules": "^1.6.2",
+                "symfony/var-dumper": "^7.2.6",
                 "thecodingmachine/phpstan-strict-rules": "^1.0.0"
             },
             "type": "library",
@@ -2585,7 +2641,7 @@
             ],
             "support": {
                 "issues": "https://github.com/nunomaduro/termwind/issues",
-                "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0"
+                "source": "https://github.com/nunomaduro/termwind/tree/v2.3.1"
             },
             "funding": [
                 {
@@ -2601,7 +2657,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2024-11-21T10:39:51+00:00"
+            "time": "2025-05-08T08:14:37+00:00"
         },
         {
             "name": "opis/json-schema",
@@ -2799,18 +2855,20 @@
             "dist": {
                 "type": "path",
                 "url": "../..",
-                "reference": "dbc9787595cef6a6160242b5cd2a7684b60bed1c"
+                "reference": "44b8217a32cb8031bf2ed8c9000e007a24c33cba"
             },
             "require": {
                 "laravel/framework": "^9.46 || ^10.34 || ^11.29 || ^12.0",
                 "php": "^8.1",
-                "php-mcp/server": "^1.1.0"
+                "php-mcp/server": "^2.2"
             },
             "require-dev": {
                 "laravel/pint": "^1.13",
                 "mockery/mockery": "^1.6",
+                "orchestra/pest-plugin-testbench": "^2.1",
                 "orchestra/testbench": "^8.0 || ^9.0",
                 "pestphp/pest": "^2.0",
+                "pestphp/pest-plugin-drift": "^2.6",
                 "pestphp/pest-plugin-laravel": "^2.0",
                 "phpunit/phpunit": "^10.0 || ^11.0",
                 "react/http": "^1.11"
@@ -2819,18 +2877,18 @@
             "extra": {
                 "laravel": {
                     "providers": [
-                        "PhpMcp\\Laravel\\Server\\McpServiceProvider"
+                        "PhpMcp\\Laravel\\McpServiceProvider"
                     ]
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "PhpMcp\\Laravel\\Server\\": "src/"
+                    "PhpMcp\\Laravel\\": "src/"
                 }
             },
             "autoload-dev": {
                 "psr-4": {
-                    "PhpMcp\\Laravel\\Server\\Tests\\": "tests/"
+                    "PhpMcp\\Laravel\\Tests\\": "tests/"
                 }
             },
             "scripts": {
@@ -2849,8 +2907,8 @@
             ],
             "authors": [
                 {
-                    "name": "Kyrian",
-                    "email": "okeowoaderukyrian@gmail.com",
+                    "name": "Kyrian Obikwelu",
+                    "email": "koshnawaza@gmail.com",
                     "role": "Developer"
                 }
             ],
@@ -2870,16 +2928,16 @@
         },
         {
             "name": "php-mcp/server",
-            "version": "1.1.0",
+            "version": "2.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-mcp/server.git",
-                "reference": "2ff0f7dde2178741fbcf7a64c767f5f3e272b392"
+                "reference": "9892dd32793a6dff324c5024d812645d10cdf786"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-mcp/server/zipball/2ff0f7dde2178741fbcf7a64c767f5f3e272b392",
-                "reference": "2ff0f7dde2178741fbcf7a64c767f5f3e272b392",
+                "url": "https://api.github.com/repos/php-mcp/server/zipball/9892dd32793a6dff324c5024d812645d10cdf786",
+                "reference": "9892dd32793a6dff324c5024d812645d10cdf786",
                 "shasum": ""
             },
             "require": {
@@ -2891,6 +2949,7 @@
                 "psr/log": "^1.0 || ^2.0 || ^3.0",
                 "psr/simple-cache": "^1.0 || ^2.0 || ^3.0",
                 "react/event-loop": "^1.5",
+                "react/http": "^1.11",
                 "react/stream": "^1.4",
                 "symfony/finder": "^6.4 || ^7.2"
             },
@@ -2898,7 +2957,7 @@
                 "friendsofphp/php-cs-fixer": "^3.75",
                 "mockery/mockery": "^1.6",
                 "pestphp/pest": "^2.36.0|^3.5.0",
-                "react/http": "^1.11",
+                "react/async": "^4.0",
                 "symfony/var-dumper": "^6.4.11|^7.1.5"
             },
             "suggest": {
@@ -2931,9 +2990,9 @@
             ],
             "support": {
                 "issues": "https://github.com/php-mcp/server/issues",
-                "source": "https://github.com/php-mcp/server/tree/1.1.0"
+                "source": "https://github.com/php-mcp/server/tree/2.2.0"
             },
-            "time": "2025-05-01T16:56:46+00:00"
+            "time": "2025-06-03T23:05:08+00:00"
         },
         {
             "name": "phpdocumentor/reflection-common",
@@ -3492,16 +3551,16 @@
         },
         {
             "name": "psr/http-message",
-            "version": "2.0",
+            "version": "1.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/http-message.git",
-                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+                "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
-                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+                "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
                 "shasum": ""
             },
             "require": {
@@ -3510,7 +3569,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.0.x-dev"
+                    "dev-master": "1.1.x-dev"
                 }
             },
             "autoload": {
@@ -3525,7 +3584,7 @@
             "authors": [
                 {
                     "name": "PHP-FIG",
-                    "homepage": "https://www.php-fig.org/"
+                    "homepage": "http://www.php-fig.org/"
                 }
             ],
             "description": "Common interface for HTTP messages",
@@ -3539,9 +3598,9 @@
                 "response"
             ],
             "support": {
-                "source": "https://github.com/php-fig/http-message/tree/2.0"
+                "source": "https://github.com/php-fig/http-message/tree/1.1"
             },
-            "time": "2023-04-04T09:54:51+00:00"
+            "time": "2023-04-04T09:50:52+00:00"
         },
         {
             "name": "psr/log",
@@ -3845,20 +3904,20 @@
         },
         {
             "name": "ramsey/uuid",
-            "version": "4.7.6",
+            "version": "4.8.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/ramsey/uuid.git",
-                "reference": "91039bc1faa45ba123c4328958e620d382ec7088"
+                "reference": "fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088",
-                "reference": "91039bc1faa45ba123c4328958e620d382ec7088",
+                "url": "https://api.github.com/repos/ramsey/uuid/zipball/fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28",
+                "reference": "fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28",
                 "shasum": ""
             },
             "require": {
-                "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12",
+                "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13",
                 "ext-json": "*",
                 "php": "^8.0",
                 "ramsey/collection": "^1.2 || ^2.0"
@@ -3867,26 +3926,23 @@
                 "rhumsaa/uuid": "self.version"
             },
             "require-dev": {
-                "captainhook/captainhook": "^5.10",
+                "captainhook/captainhook": "^5.25",
                 "captainhook/plugin-composer": "^5.3",
-                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
-                "doctrine/annotations": "^1.8",
-                "ergebnis/composer-normalize": "^2.15",
-                "mockery/mockery": "^1.3",
+                "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
+                "ergebnis/composer-normalize": "^2.47",
+                "mockery/mockery": "^1.6",
                 "paragonie/random-lib": "^2",
-                "php-mock/php-mock": "^2.2",
-                "php-mock/php-mock-mockery": "^1.3",
-                "php-parallel-lint/php-parallel-lint": "^1.1",
-                "phpbench/phpbench": "^1.0",
-                "phpstan/extension-installer": "^1.1",
-                "phpstan/phpstan": "^1.8",
-                "phpstan/phpstan-mockery": "^1.1",
-                "phpstan/phpstan-phpunit": "^1.1",
-                "phpunit/phpunit": "^8.5 || ^9",
-                "ramsey/composer-repl": "^1.4",
-                "slevomat/coding-standard": "^8.4",
-                "squizlabs/php_codesniffer": "^3.5",
-                "vimeo/psalm": "^4.9"
+                "php-mock/php-mock": "^2.6",
+                "php-mock/php-mock-mockery": "^1.5",
+                "php-parallel-lint/php-parallel-lint": "^1.4.0",
+                "phpbench/phpbench": "^1.2.14",
+                "phpstan/extension-installer": "^1.4",
+                "phpstan/phpstan": "^2.1",
+                "phpstan/phpstan-mockery": "^2.0",
+                "phpstan/phpstan-phpunit": "^2.0",
+                "phpunit/phpunit": "^9.6",
+                "slevomat/coding-standard": "^8.18",
+                "squizlabs/php_codesniffer": "^3.13"
             },
             "suggest": {
                 "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
@@ -3921,19 +3977,157 @@
             ],
             "support": {
                 "issues": "https://github.com/ramsey/uuid/issues",
-                "source": "https://github.com/ramsey/uuid/tree/4.7.6"
+                "source": "https://github.com/ramsey/uuid/tree/4.8.1"
+            },
+            "time": "2025-06-01T06:28:46+00:00"
+        },
+        {
+            "name": "react/cache",
+            "version": "v1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/cache.git",
+                "reference": "d47c472b64aa5608225f47965a484b75c7817d5b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b",
+                "reference": "d47c472b64aa5608225f47965a484b75c7817d5b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "react/promise": "^3.0 || ^2.0 || ^1.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Async, Promise-based cache interface for ReactPHP",
+            "keywords": [
+                "cache",
+                "caching",
+                "promise",
+                "reactphp"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/cache/issues",
+                "source": "https://github.com/reactphp/cache/tree/v1.2.0"
             },
             "funding": [
                 {
-                    "url": "https://github.com/ramsey",
-                    "type": "github"
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2022-11-30T15:59:55+00:00"
+        },
+        {
+            "name": "react/dns",
+            "version": "v1.13.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/dns.git",
+                "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
+                "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "react/cache": "^1.0 || ^0.6 || ^0.5",
+                "react/event-loop": "^1.2",
+                "react/promise": "^3.2 || ^2.7 || ^1.2.1"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+                "react/async": "^4.3 || ^3 || ^2",
+                "react/promise-timer": "^1.11"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Dns\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
                 },
                 {
-                    "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid",
-                    "type": "tidelift"
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Async DNS resolver for ReactPHP",
+            "keywords": [
+                "async",
+                "dns",
+                "dns-resolver",
+                "reactphp"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/dns/issues",
+                "source": "https://github.com/reactphp/dns/tree/v1.13.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
                 }
             ],
-            "time": "2024-04-27T21:32:50+00:00"
+            "time": "2024-06-13T14:18:03+00:00"
         },
         {
             "name": "react/event-loop",
@@ -4007,6 +4201,250 @@
             ],
             "time": "2023-11-13T13:48:05+00:00"
         },
+        {
+            "name": "react/http",
+            "version": "v1.11.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/http.git",
+                "reference": "8db02de41dcca82037367f67a2d4be365b1c4db9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/http/zipball/8db02de41dcca82037367f67a2d4be365b1c4db9",
+                "reference": "8db02de41dcca82037367f67a2d4be365b1c4db9",
+                "shasum": ""
+            },
+            "require": {
+                "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+                "fig/http-message-util": "^1.1",
+                "php": ">=5.3.0",
+                "psr/http-message": "^1.0",
+                "react/event-loop": "^1.2",
+                "react/promise": "^3.2 || ^2.3 || ^1.2.1",
+                "react/socket": "^1.16",
+                "react/stream": "^1.4"
+            },
+            "require-dev": {
+                "clue/http-proxy-react": "^1.8",
+                "clue/reactphp-ssh-proxy": "^1.4",
+                "clue/socks-react": "^1.4",
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+                "react/async": "^4.2 || ^3 || ^2",
+                "react/promise-stream": "^1.4",
+                "react/promise-timer": "^1.11"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Http\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Event-driven, streaming HTTP client and server implementation for ReactPHP",
+            "keywords": [
+                "async",
+                "client",
+                "event-driven",
+                "http",
+                "http client",
+                "http server",
+                "https",
+                "psr-7",
+                "reactphp",
+                "server",
+                "streaming"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/http/issues",
+                "source": "https://github.com/reactphp/http/tree/v1.11.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-11-20T15:24:08+00:00"
+        },
+        {
+            "name": "react/promise",
+            "version": "v3.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/promise.git",
+                "reference": "8a164643313c71354582dc850b42b33fa12a4b63"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63",
+                "reference": "8a164643313c71354582dc850b42b33fa12a4b63",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1.0"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "1.10.39 || 1.4.10",
+                "phpunit/phpunit": "^9.6 || ^7.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "React\\Promise\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+            "keywords": [
+                "promise",
+                "promises"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/promise/issues",
+                "source": "https://github.com/reactphp/promise/tree/v3.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-05-24T10:39:05+00:00"
+        },
+        {
+            "name": "react/socket",
+            "version": "v1.16.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/reactphp/socket.git",
+                "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1",
+                "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1",
+                "shasum": ""
+            },
+            "require": {
+                "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+                "php": ">=5.3.0",
+                "react/dns": "^1.13",
+                "react/event-loop": "^1.2",
+                "react/promise": "^3.2 || ^2.6 || ^1.2.1",
+                "react/stream": "^1.4"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+                "react/async": "^4.3 || ^3.3 || ^2",
+                "react/promise-stream": "^1.4",
+                "react/promise-timer": "^1.11"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "React\\Socket\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering",
+                    "homepage": "https://clue.engineering/"
+                },
+                {
+                    "name": "Cees-Jan Kiewiet",
+                    "email": "reactphp@ceesjankiewiet.nl",
+                    "homepage": "https://wyrihaximus.net/"
+                },
+                {
+                    "name": "Jan Sorgalla",
+                    "email": "jsorgalla@gmail.com",
+                    "homepage": "https://sorgalla.com/"
+                },
+                {
+                    "name": "Chris Boden",
+                    "email": "cboden@gmail.com",
+                    "homepage": "https://cboden.dev/"
+                }
+            ],
+            "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP",
+            "keywords": [
+                "Connection",
+                "Socket",
+                "async",
+                "reactphp",
+                "stream"
+            ],
+            "support": {
+                "issues": "https://github.com/reactphp/socket/issues",
+                "source": "https://github.com/reactphp/socket/tree/v1.16.0"
+            },
+            "funding": [
+                {
+                    "url": "https://opencollective.com/reactphp",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2024-07-26T10:38:09+00:00"
+        },
         {
             "name": "react/stream",
             "version": "v1.4.0",
@@ -4087,7 +4525,7 @@
         },
         {
             "name": "symfony/clock",
-            "version": "v7.2.0",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/clock.git",
@@ -4141,7 +4579,7 @@
                 "time"
             ],
             "support": {
-                "source": "https://github.com/symfony/clock/tree/v7.2.0"
+                "source": "https://github.com/symfony/clock/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -4161,23 +4599,24 @@
         },
         {
             "name": "symfony/console",
-            "version": "v7.2.5",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "e51498ea18570c062e7df29d05a7003585b19b88"
+                "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/e51498ea18570c062e7df29d05a7003585b19b88",
-                "reference": "e51498ea18570c062e7df29d05a7003585b19b88",
+                "url": "https://api.github.com/repos/symfony/console/zipball/66c1440edf6f339fd82ed6c7caa76cb006211b44",
+                "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.2",
+                "symfony/deprecation-contracts": "^2.5|^3",
                 "symfony/polyfill-mbstring": "~1.0",
                 "symfony/service-contracts": "^2.5|^3",
-                "symfony/string": "^6.4|^7.0"
+                "symfony/string": "^7.2"
             },
             "conflict": {
                 "symfony/dependency-injection": "<6.4",
@@ -4234,7 +4673,7 @@
                 "terminal"
             ],
             "support": {
-                "source": "https://github.com/symfony/console/tree/v7.2.5"
+                "source": "https://github.com/symfony/console/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -4250,11 +4689,11 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-03-12T08:11:12+00:00"
+            "time": "2025-05-24T10:34:04+00:00"
         },
         {
             "name": "symfony/css-selector",
-            "version": "v7.2.0",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/css-selector.git",
@@ -4299,7 +4738,7 @@
             "description": "Converts CSS selectors to XPath expressions",
             "homepage": "https://symfony.com/",
             "support": {
-                "source": "https://github.com/symfony/css-selector/tree/v7.2.0"
+                "source": "https://github.com/symfony/css-selector/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -4319,16 +4758,16 @@
         },
         {
             "name": "symfony/deprecation-contracts",
-            "version": "v3.5.1",
+            "version": "v3.6.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/deprecation-contracts.git",
-                "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6"
+                "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
-                "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
+                "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
                 "shasum": ""
             },
             "require": {
@@ -4341,7 +4780,7 @@
                     "name": "symfony/contracts"
                 },
                 "branch-alias": {
-                    "dev-main": "3.5-dev"
+                    "dev-main": "3.6-dev"
                 }
             },
             "autoload": {
@@ -4366,7 +4805,7 @@
             "description": "A generic function and convention to trigger deprecation notices",
             "homepage": "https://symfony.com/",
             "support": {
-                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1"
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
             },
             "funding": [
                 {
@@ -4382,20 +4821,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-25T14:20:29+00:00"
+            "time": "2024-09-25T14:21:43+00:00"
         },
         {
             "name": "symfony/error-handler",
-            "version": "v7.2.5",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/error-handler.git",
-                "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b"
+                "reference": "cf68d225bc43629de4ff54778029aee6dc191b83"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/error-handler/zipball/102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b",
-                "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b",
+                "url": "https://api.github.com/repos/symfony/error-handler/zipball/cf68d225bc43629de4ff54778029aee6dc191b83",
+                "reference": "cf68d225bc43629de4ff54778029aee6dc191b83",
                 "shasum": ""
             },
             "require": {
@@ -4408,9 +4847,11 @@
                 "symfony/http-kernel": "<6.4"
             },
             "require-dev": {
+                "symfony/console": "^6.4|^7.0",
                 "symfony/deprecation-contracts": "^2.5|^3",
                 "symfony/http-kernel": "^6.4|^7.0",
-                "symfony/serializer": "^6.4|^7.0"
+                "symfony/serializer": "^6.4|^7.0",
+                "symfony/webpack-encore-bundle": "^1.0|^2.0"
             },
             "bin": [
                 "Resources/bin/patch-type-declarations"
@@ -4441,7 +4882,7 @@
             "description": "Provides tools to manage errors and ease debugging PHP code",
             "homepage": "https://symfony.com/",
             "support": {
-                "source": "https://github.com/symfony/error-handler/tree/v7.2.5"
+                "source": "https://github.com/symfony/error-handler/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -4457,20 +4898,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-03-03T07:12:39+00:00"
+            "time": "2025-05-29T07:19:49+00:00"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v7.2.0",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1"
+                "reference": "497f73ac996a598c92409b44ac43b6690c4f666d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1",
-                "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d",
+                "reference": "497f73ac996a598c92409b44ac43b6690c4f666d",
                 "shasum": ""
             },
             "require": {
@@ -4521,7 +4962,7 @@
             "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
             "homepage": "https://symfony.com/",
             "support": {
-                "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0"
+                "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -4537,20 +4978,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-25T14:21:43+00:00"
+            "time": "2025-04-22T09:11:45+00:00"
         },
         {
             "name": "symfony/event-dispatcher-contracts",
-            "version": "v3.5.1",
+            "version": "v3.6.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher-contracts.git",
-                "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f"
+                "reference": "59eb412e93815df44f05f342958efa9f46b1e586"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f",
-                "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586",
+                "reference": "59eb412e93815df44f05f342958efa9f46b1e586",
                 "shasum": ""
             },
             "require": {
@@ -4564,7 +5005,7 @@
                     "name": "symfony/contracts"
                 },
                 "branch-alias": {
-                    "dev-main": "3.5-dev"
+                    "dev-main": "3.6-dev"
                 }
             },
             "autoload": {
@@ -4597,7 +5038,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1"
+                "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0"
             },
             "funding": [
                 {
@@ -4613,20 +5054,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-25T14:20:29+00:00"
+            "time": "2024-09-25T14:21:43+00:00"
         },
         {
             "name": "symfony/finder",
-            "version": "v7.2.2",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "87a71856f2f56e4100373e92529eed3171695cfb"
+                "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb",
-                "reference": "87a71856f2f56e4100373e92529eed3171695cfb",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d",
+                "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d",
                 "shasum": ""
             },
             "require": {
@@ -4661,7 +5102,7 @@
             "description": "Finds files and directories via an intuitive fluent interface",
             "homepage": "https://symfony.com/",
             "support": {
-                "source": "https://github.com/symfony/finder/tree/v7.2.2"
+                "source": "https://github.com/symfony/finder/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -4677,20 +5118,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-12-30T19:00:17+00:00"
+            "time": "2024-12-30T19:00:26+00:00"
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v7.2.5",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "371272aeb6286f8135e028ca535f8e4d6f114126"
+                "reference": "4236baf01609667d53b20371486228231eb135fd"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/371272aeb6286f8135e028ca535f8e4d6f114126",
-                "reference": "371272aeb6286f8135e028ca535f8e4d6f114126",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4236baf01609667d53b20371486228231eb135fd",
+                "reference": "4236baf01609667d53b20371486228231eb135fd",
                 "shasum": ""
             },
             "require": {
@@ -4707,6 +5148,7 @@
                 "doctrine/dbal": "^3.6|^4",
                 "predis/predis": "^1.1|^2.0",
                 "symfony/cache": "^6.4.12|^7.1.5",
+                "symfony/clock": "^6.4|^7.0",
                 "symfony/dependency-injection": "^6.4|^7.0",
                 "symfony/expression-language": "^6.4|^7.0",
                 "symfony/http-kernel": "^6.4|^7.0",
@@ -4739,7 +5181,7 @@
             "description": "Defines an object-oriented layer for the HTTP specification",
             "homepage": "https://symfony.com/",
             "support": {
-                "source": "https://github.com/symfony/http-foundation/tree/v7.2.5"
+                "source": "https://github.com/symfony/http-foundation/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -4755,20 +5197,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-03-25T15:54:33+00:00"
+            "time": "2025-05-12T14:48:23+00:00"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v7.2.5",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54"
+                "reference": "ac7b8e163e8c83dce3abcc055a502d4486051a9f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b1fe91bc1fa454a806d3f98db4ba826eb9941a54",
-                "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ac7b8e163e8c83dce3abcc055a502d4486051a9f",
+                "reference": "ac7b8e163e8c83dce3abcc055a502d4486051a9f",
                 "shasum": ""
             },
             "require": {
@@ -4776,8 +5218,8 @@
                 "psr/log": "^1|^2|^3",
                 "symfony/deprecation-contracts": "^2.5|^3",
                 "symfony/error-handler": "^6.4|^7.0",
-                "symfony/event-dispatcher": "^6.4|^7.0",
-                "symfony/http-foundation": "^6.4|^7.0",
+                "symfony/event-dispatcher": "^7.3",
+                "symfony/http-foundation": "^7.3",
                 "symfony/polyfill-ctype": "^1.8"
             },
             "conflict": {
@@ -4853,7 +5295,7 @@
             "description": "Provides a structured process for converting a Request into a Response",
             "homepage": "https://symfony.com/",
             "support": {
-                "source": "https://github.com/symfony/http-kernel/tree/v7.2.5"
+                "source": "https://github.com/symfony/http-kernel/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -4869,20 +5311,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-03-28T13:32:50+00:00"
+            "time": "2025-05-29T07:47:32+00:00"
         },
         {
             "name": "symfony/mailer",
-            "version": "v7.2.3",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mailer.git",
-                "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3"
+                "reference": "0f375bbbde96ae8c78e4aa3e63aabd486e33364c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mailer/zipball/f3871b182c44997cf039f3b462af4a48fb85f9d3",
-                "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3",
+                "url": "https://api.github.com/repos/symfony/mailer/zipball/0f375bbbde96ae8c78e4aa3e63aabd486e33364c",
+                "reference": "0f375bbbde96ae8c78e4aa3e63aabd486e33364c",
                 "shasum": ""
             },
             "require": {
@@ -4933,7 +5375,7 @@
             "description": "Helps sending emails",
             "homepage": "https://symfony.com/",
             "support": {
-                "source": "https://github.com/symfony/mailer/tree/v7.2.3"
+                "source": "https://github.com/symfony/mailer/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -4949,20 +5391,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-01-27T11:08:17+00:00"
+            "time": "2025-04-04T09:51:09+00:00"
         },
         {
             "name": "symfony/mime",
-            "version": "v7.2.4",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mime.git",
-                "reference": "87ca22046b78c3feaff04b337f33b38510fd686b"
+                "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mime/zipball/87ca22046b78c3feaff04b337f33b38510fd686b",
-                "reference": "87ca22046b78c3feaff04b337f33b38510fd686b",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9",
+                "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9",
                 "shasum": ""
             },
             "require": {
@@ -5017,7 +5459,7 @@
                 "mime-type"
             ],
             "support": {
-                "source": "https://github.com/symfony/mime/tree/v7.2.4"
+                "source": "https://github.com/symfony/mime/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -5033,11 +5475,11 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-02-19T08:51:20+00:00"
+            "time": "2025-02-19T08:51:26+00:00"
         },
         {
             "name": "symfony/polyfill-ctype",
-            "version": "v1.31.0",
+            "version": "v1.32.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-ctype.git",
@@ -5096,7 +5538,7 @@
                 "portable"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0"
             },
             "funding": [
                 {
@@ -5116,7 +5558,7 @@
         },
         {
             "name": "symfony/polyfill-intl-grapheme",
-            "version": "v1.31.0",
+            "version": "v1.32.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
@@ -5174,7 +5616,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0"
+                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
             },
             "funding": [
                 {
@@ -5194,16 +5636,16 @@
         },
         {
             "name": "symfony/polyfill-intl-idn",
-            "version": "v1.31.0",
+            "version": "v1.32.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-intl-idn.git",
-                "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
+                "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
-                "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3",
+                "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3",
                 "shasum": ""
             },
             "require": {
@@ -5257,7 +5699,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
+                "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0"
             },
             "funding": [
                 {
@@ -5273,11 +5715,11 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-09T11:45:10+00:00"
+            "time": "2024-09-10T14:38:51+00:00"
         },
         {
             "name": "symfony/polyfill-intl-normalizer",
-            "version": "v1.31.0",
+            "version": "v1.32.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
@@ -5338,7 +5780,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
+                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
             },
             "funding": [
                 {
@@ -5358,19 +5800,20 @@
         },
         {
             "name": "symfony/polyfill-mbstring",
-            "version": "v1.31.0",
+            "version": "v1.32.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
+                "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
-                "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
+                "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
                 "shasum": ""
             },
             "require": {
+                "ext-iconv": "*",
                 "php": ">=7.2"
             },
             "provide": {
@@ -5418,7 +5861,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
             },
             "funding": [
                 {
@@ -5434,20 +5877,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-09T11:45:10+00:00"
+            "time": "2024-12-23T08:48:59+00:00"
         },
         {
             "name": "symfony/polyfill-php80",
-            "version": "v1.31.0",
+            "version": "v1.32.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-php80.git",
-                "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
+                "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
-                "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+                "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
                 "shasum": ""
             },
             "require": {
@@ -5498,7 +5941,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0"
             },
             "funding": [
                 {
@@ -5514,11 +5957,11 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-09T11:45:10+00:00"
+            "time": "2025-01-02T08:10:11+00:00"
         },
         {
             "name": "symfony/polyfill-php83",
-            "version": "v1.31.0",
+            "version": "v1.32.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-php83.git",
@@ -5574,7 +6017,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0"
+                "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0"
             },
             "funding": [
                 {
@@ -5594,7 +6037,7 @@
         },
         {
             "name": "symfony/polyfill-uuid",
-            "version": "v1.31.0",
+            "version": "v1.32.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-uuid.git",
@@ -5653,7 +6096,7 @@
                 "uuid"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0"
+                "source": "https://github.com/symfony/polyfill-uuid/tree/v1.32.0"
             },
             "funding": [
                 {
@@ -5673,16 +6116,16 @@
         },
         {
             "name": "symfony/process",
-            "version": "v7.2.5",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "87b7c93e57df9d8e39a093d32587702380ff045d"
+                "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d",
-                "reference": "87b7c93e57df9d8e39a093d32587702380ff045d",
+                "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af",
+                "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af",
                 "shasum": ""
             },
             "require": {
@@ -5714,7 +6157,7 @@
             "description": "Executes commands in sub-processes",
             "homepage": "https://symfony.com/",
             "support": {
-                "source": "https://github.com/symfony/process/tree/v7.2.5"
+                "source": "https://github.com/symfony/process/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -5730,20 +6173,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-03-13T12:21:46+00:00"
+            "time": "2025-04-17T09:11:12+00:00"
         },
         {
             "name": "symfony/routing",
-            "version": "v7.2.3",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996"
+                "reference": "8e213820c5fea844ecea29203d2a308019007c15"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/ee9a67edc6baa33e5fae662f94f91fd262930996",
-                "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/8e213820c5fea844ecea29203d2a308019007c15",
+                "reference": "8e213820c5fea844ecea29203d2a308019007c15",
                 "shasum": ""
             },
             "require": {
@@ -5795,7 +6238,7 @@
                 "url"
             ],
             "support": {
-                "source": "https://github.com/symfony/routing/tree/v7.2.3"
+                "source": "https://github.com/symfony/routing/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -5811,20 +6254,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-01-17T10:56:55+00:00"
+            "time": "2025-05-24T20:43:28+00:00"
         },
         {
             "name": "symfony/service-contracts",
-            "version": "v3.5.1",
+            "version": "v3.6.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/service-contracts.git",
-                "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0"
+                "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
-                "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
+                "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
                 "shasum": ""
             },
             "require": {
@@ -5842,7 +6285,7 @@
                     "name": "symfony/contracts"
                 },
                 "branch-alias": {
-                    "dev-main": "3.5-dev"
+                    "dev-main": "3.6-dev"
                 }
             },
             "autoload": {
@@ -5878,7 +6321,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/service-contracts/tree/v3.5.1"
+                "source": "https://github.com/symfony/service-contracts/tree/v3.6.0"
             },
             "funding": [
                 {
@@ -5894,20 +6337,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-25T14:20:29+00:00"
+            "time": "2025-04-25T09:37:31+00:00"
         },
         {
             "name": "symfony/string",
-            "version": "v7.2.0",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/string.git",
-                "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82"
+                "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82",
-                "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82",
+                "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125",
+                "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125",
                 "shasum": ""
             },
             "require": {
@@ -5965,7 +6408,7 @@
                 "utf8"
             ],
             "support": {
-                "source": "https://github.com/symfony/string/tree/v7.2.0"
+                "source": "https://github.com/symfony/string/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -5981,20 +6424,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-11-13T13:31:26+00:00"
+            "time": "2025-04-20T20:19:01+00:00"
         },
         {
             "name": "symfony/translation",
-            "version": "v7.2.4",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation.git",
-                "reference": "283856e6981286cc0d800b53bd5703e8e363f05a"
+                "reference": "4aba29076a29a3aa667e09b791e5f868973a8667"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation/zipball/283856e6981286cc0d800b53bd5703e8e363f05a",
-                "reference": "283856e6981286cc0d800b53bd5703e8e363f05a",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/4aba29076a29a3aa667e09b791e5f868973a8667",
+                "reference": "4aba29076a29a3aa667e09b791e5f868973a8667",
                 "shasum": ""
             },
             "require": {
@@ -6004,6 +6447,7 @@
                 "symfony/translation-contracts": "^2.5|^3.0"
             },
             "conflict": {
+                "nikic/php-parser": "<5.0",
                 "symfony/config": "<6.4",
                 "symfony/console": "<6.4",
                 "symfony/dependency-injection": "<6.4",
@@ -6017,7 +6461,7 @@
                 "symfony/translation-implementation": "2.3|3.0"
             },
             "require-dev": {
-                "nikic/php-parser": "^4.18|^5.0",
+                "nikic/php-parser": "^5.0",
                 "psr/log": "^1|^2|^3",
                 "symfony/config": "^6.4|^7.0",
                 "symfony/console": "^6.4|^7.0",
@@ -6060,7 +6504,7 @@
             "description": "Provides tools to internationalize your application",
             "homepage": "https://symfony.com/",
             "support": {
-                "source": "https://github.com/symfony/translation/tree/v7.2.4"
+                "source": "https://github.com/symfony/translation/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -6076,20 +6520,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-02-13T10:27:23+00:00"
+            "time": "2025-05-29T07:19:49+00:00"
         },
         {
             "name": "symfony/translation-contracts",
-            "version": "v3.5.1",
+            "version": "v3.6.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation-contracts.git",
-                "reference": "4667ff3bd513750603a09c8dedbea942487fb07c"
+                "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c",
-                "reference": "4667ff3bd513750603a09c8dedbea942487fb07c",
+                "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
+                "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
                 "shasum": ""
             },
             "require": {
@@ -6102,7 +6546,7 @@
                     "name": "symfony/contracts"
                 },
                 "branch-alias": {
-                    "dev-main": "3.5-dev"
+                    "dev-main": "3.6-dev"
                 }
             },
             "autoload": {
@@ -6138,7 +6582,7 @@
                 "standards"
             ],
             "support": {
-                "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1"
+                "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0"
             },
             "funding": [
                 {
@@ -6154,20 +6598,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-25T14:20:29+00:00"
+            "time": "2024-09-27T08:32:26+00:00"
         },
         {
             "name": "symfony/uid",
-            "version": "v7.2.0",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/uid.git",
-                "reference": "2d294d0c48df244c71c105a169d0190bfb080426"
+                "reference": "7beeb2b885cd584cd01e126c5777206ae4c3c6a3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426",
-                "reference": "2d294d0c48df244c71c105a169d0190bfb080426",
+                "url": "https://api.github.com/repos/symfony/uid/zipball/7beeb2b885cd584cd01e126c5777206ae4c3c6a3",
+                "reference": "7beeb2b885cd584cd01e126c5777206ae4c3c6a3",
                 "shasum": ""
             },
             "require": {
@@ -6212,7 +6656,7 @@
                 "uuid"
             ],
             "support": {
-                "source": "https://github.com/symfony/uid/tree/v7.2.0"
+                "source": "https://github.com/symfony/uid/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -6228,24 +6672,25 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2024-09-25T14:21:43+00:00"
+            "time": "2025-05-24T14:28:13+00:00"
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v7.2.3",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "82b478c69745d8878eb60f9a049a4d584996f73a"
+                "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a",
-                "reference": "82b478c69745d8878eb60f9a049a4d584996f73a",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/548f6760c54197b1084e1e5c71f6d9d523f2f78e",
+                "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.2",
+                "symfony/deprecation-contracts": "^2.5|^3",
                 "symfony/polyfill-mbstring": "~1.0"
             },
             "conflict": {
@@ -6295,7 +6740,7 @@
                 "dump"
             ],
             "support": {
-                "source": "https://github.com/symfony/var-dumper/tree/v7.2.3"
+                "source": "https://github.com/symfony/var-dumper/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -6311,7 +6756,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-01-17T11:39:41+00:00"
+            "time": "2025-04-27T18:39:23+00:00"
         },
         {
             "name": "tijsverkoyen/css-to-inline-styles",
@@ -6805,16 +7250,16 @@
         },
         {
             "name": "filp/whoops",
-            "version": "2.18.0",
+            "version": "2.18.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/filp/whoops.git",
-                "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e"
+                "reference": "8fcc6a862f2e7b94eb4221fd0819ddba3d30ab26"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/filp/whoops/zipball/a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e",
-                "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e",
+                "url": "https://api.github.com/repos/filp/whoops/zipball/8fcc6a862f2e7b94eb4221fd0819ddba3d30ab26",
+                "reference": "8fcc6a862f2e7b94eb4221fd0819ddba3d30ab26",
                 "shasum": ""
             },
             "require": {
@@ -6864,7 +7309,7 @@
             ],
             "support": {
                 "issues": "https://github.com/filp/whoops/issues",
-                "source": "https://github.com/filp/whoops/tree/2.18.0"
+                "source": "https://github.com/filp/whoops/tree/2.18.1"
             },
             "funding": [
                 {
@@ -6872,7 +7317,7 @@
                     "type": "github"
                 }
             ],
-            "time": "2025-03-15T12:00:00+00:00"
+            "time": "2025-06-03T18:56:14+00:00"
         },
         {
             "name": "hamcrest/hamcrest-php",
@@ -7065,16 +7510,16 @@
         },
         {
             "name": "laravel/pint",
-            "version": "v1.22.0",
+            "version": "v1.22.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/pint.git",
-                "reference": "7ddfaa6523a675fae5c4123ee38fc6bfb8ee4f36"
+                "reference": "941d1927c5ca420c22710e98420287169c7bcaf7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/pint/zipball/7ddfaa6523a675fae5c4123ee38fc6bfb8ee4f36",
-                "reference": "7ddfaa6523a675fae5c4123ee38fc6bfb8ee4f36",
+                "url": "https://api.github.com/repos/laravel/pint/zipball/941d1927c5ca420c22710e98420287169c7bcaf7",
+                "reference": "941d1927c5ca420c22710e98420287169c7bcaf7",
                 "shasum": ""
             },
             "require": {
@@ -7086,11 +7531,11 @@
             },
             "require-dev": {
                 "friendsofphp/php-cs-fixer": "^3.75.0",
-                "illuminate/view": "^11.44.2",
-                "larastan/larastan": "^3.3.1",
+                "illuminate/view": "^11.44.7",
+                "larastan/larastan": "^3.4.0",
                 "laravel-zero/framework": "^11.36.1",
                 "mockery/mockery": "^1.6.12",
-                "nunomaduro/termwind": "^2.3",
+                "nunomaduro/termwind": "^2.3.1",
                 "pestphp/pest": "^2.36.0"
             },
             "bin": [
@@ -7127,20 +7572,20 @@
                 "issues": "https://github.com/laravel/pint/issues",
                 "source": "https://github.com/laravel/pint"
             },
-            "time": "2025-04-08T22:11:45+00:00"
+            "time": "2025-05-08T08:38:12+00:00"
         },
         {
             "name": "laravel/sail",
-            "version": "v1.42.0",
+            "version": "v1.43.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/sail.git",
-                "reference": "2edaaf77f3c07a4099965bb3d7dfee16e801c0f6"
+                "reference": "3e7d899232a8c5e3ea4fc6dee7525ad583887e72"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/sail/zipball/2edaaf77f3c07a4099965bb3d7dfee16e801c0f6",
-                "reference": "2edaaf77f3c07a4099965bb3d7dfee16e801c0f6",
+                "url": "https://api.github.com/repos/laravel/sail/zipball/3e7d899232a8c5e3ea4fc6dee7525ad583887e72",
+                "reference": "3e7d899232a8c5e3ea4fc6dee7525ad583887e72",
                 "shasum": ""
             },
             "require": {
@@ -7190,7 +7635,7 @@
                 "issues": "https://github.com/laravel/sail/issues",
                 "source": "https://github.com/laravel/sail"
             },
-            "time": "2025-04-29T14:26:46+00:00"
+            "time": "2025-05-19T13:19:21+00:00"
         },
         {
             "name": "mockery/mockery",
@@ -8751,23 +9196,23 @@
         },
         {
             "name": "sebastian/environment",
-            "version": "7.2.0",
+            "version": "7.2.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/environment.git",
-                "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5"
+                "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5",
-                "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4",
+                "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4",
                 "shasum": ""
             },
             "require": {
                 "php": ">=8.2"
             },
             "require-dev": {
-                "phpunit/phpunit": "^11.0"
+                "phpunit/phpunit": "^11.3"
             },
             "suggest": {
                 "ext-posix": "*"
@@ -8803,15 +9248,27 @@
             "support": {
                 "issues": "https://github.com/sebastianbergmann/environment/issues",
                 "security": "https://github.com/sebastianbergmann/environment/security/policy",
-                "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0"
+                "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1"
             },
             "funding": [
                 {
                     "url": "https://github.com/sebastianbergmann",
                     "type": "github"
+                },
+                {
+                    "url": "https://liberapay.com/sebastianbergmann",
+                    "type": "liberapay"
+                },
+                {
+                    "url": "https://thanks.dev/u/gh/sebastianbergmann",
+                    "type": "thanks_dev"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/sebastian/environment",
+                    "type": "tidelift"
                 }
             ],
-            "time": "2024-07-03T04:54:44+00:00"
+            "time": "2025-05-21T11:55:47+00:00"
         },
         {
             "name": "sebastian/exporter",
@@ -9354,16 +9811,16 @@
         },
         {
             "name": "symfony/yaml",
-            "version": "v7.2.5",
+            "version": "v7.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/yaml.git",
-                "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912"
+                "reference": "cea40a48279d58dc3efee8112634cb90141156c2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912",
-                "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/cea40a48279d58dc3efee8112634cb90141156c2",
+                "reference": "cea40a48279d58dc3efee8112634cb90141156c2",
                 "shasum": ""
             },
             "require": {
@@ -9406,7 +9863,7 @@
             "description": "Loads and dumps YAML files",
             "homepage": "https://symfony.com/",
             "support": {
-                "source": "https://github.com/symfony/yaml/tree/v7.2.5"
+                "source": "https://github.com/symfony/yaml/tree/v7.3.0"
             },
             "funding": [
                 {
@@ -9422,7 +9879,7 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2025-03-03T07:12:39+00:00"
+            "time": "2025-04-04T10:10:33+00:00"
         },
         {
             "name": "ta-tikoma/phpunit-architecture-test",
@@ -9536,9 +9993,7 @@
     ],
     "aliases": [],
     "minimum-stability": "dev",
-    "stability-flags": {
-        "php-mcp/laravel": 20
-    },
+    "stability-flags": {},
     "prefer-stable": true,
     "prefer-lowest": false,
     "platform": {
diff --git a/samples/basic/config/mcp.php b/samples/basic/config/mcp.php
index f614f83..768e914 100644
--- a/samples/basic/config/mcp.php
+++ b/samples/basic/config/mcp.php
@@ -5,35 +5,63 @@
     |--------------------------------------------------------------------------
     | MCP Server Information
     |--------------------------------------------------------------------------
+    |
+    | This section defines basic information about your MCP server instance,
+    | including its name, version, and any initialization instructions that
+    | should be provided to clients during the initial handshake.
+    |
     */
     'server' => [
-        'name' => env('MCP_SERVER_NAME', 'Laravel MCP Sample'),
+        'name' => env('MCP_SERVER_NAME', 'Laravel MCP'),
         'version' => env('MCP_SERVER_VERSION', '1.0.0'),
+        'instructions' => env('MCP_SERVER_INSTRUCTIONS'),
     ],
 
     /*
     |--------------------------------------------------------------------------
     | MCP Discovery Configuration
     |--------------------------------------------------------------------------
+    |
+    | These options control how the MCP server discovers and registers tools,
+    | resources and prompts in your application. You can configure which
+    | directories to scan, what to exclude, and how discovery behaves.
+    |
     */
     'discovery' => [
-        // Relative paths from project root (base_path()) to scan for MCP elements.
+        'base_path' => base_path(),
         'directories' => [
             env('MCP_DISCOVERY_PATH', 'app/Mcp'),
         ],
-        // If true, discovery cache will be cleared when DiscoverCommand runs.
-        'clear_cache_on_discover' => true,
+        'exclude_dirs' => [
+            'vendor',
+            'tests',
+            'storage',
+            'public',
+            'resources',
+            'bootstrap',
+            'config',
+            'database',
+            'routes',
+            'node_modules',
+            '.git',
+        ],
+        'definitions_file' => base_path('routes/mcp.php'),
+        'auto_discover' => env('MCP_AUTO_DISCOVER', true),
+        'save_to_cache' => env('MCP_DISCOVERY_SAVE_TO_CACHE', true),
     ],
 
     /*
     |--------------------------------------------------------------------------
     | MCP Cache Configuration
     |--------------------------------------------------------------------------
+    |
+    | Configure how the MCP server caches discovered elements and transport
+    | state using Laravel's cache system. You can specify which store to use
+    | and how long items should be cached.
+    |
     */
     'cache' => [
-        'store' => env('MCP_CACHE_STORE', null),
-        'elements_key' => env('MCP_CACHE_ELEMENTS_KEY', 'mcp:elements'),
-        'state_prefix' => env('MCP_CACHE_STATE_PREFIX', 'mcp:state:'),
+        'store' => env('MCP_CACHE_STORE', config('cache.default')),
         'ttl' => env('MCP_CACHE_TTL', 3600),
     ],
 
@@ -41,44 +69,75 @@
     |--------------------------------------------------------------------------
     | MCP Transport Configuration
     |--------------------------------------------------------------------------
+    |
+    | Configure the available transports for MCP communication. Three types are
+    | supported: stdio for CLI clients, http_dedicated for a standalone server,
+    | and http_integrated for serving through Laravel's routing system.
+    |
     */
     'transports' => [
-        'http' => [
-            'enabled' => env('MCP_HTTP_ENABLED', true),
-            'path' => env('MCP_HTTP_PATH', 'mcp'),
-            'middleware' => ['web'],
-            'domain' => env('MCP_HTTP_DOMAIN'),
-        ],
         'stdio' => [
             'enabled' => env('MCP_STDIO_ENABLED', true),
         ],
+
+        'http_dedicated' => [
+            'enabled' => env('MCP_HTTP_DEDICATED_ENABLED', true),
+            'host' => env('MCP_HTTP_DEDICATED_HOST', '127.0.0.1'),
+            'port' => (int) env('MCP_HTTP_DEDICATED_PORT', 8090),
+            'path_prefix' => env('MCP_HTTP_DEDICATED_PATH_PREFIX', 'mcp'),
+            'ssl_context_options' => [],
+        ],
+
+        'http_integrated' => [
+            'enabled' => env('MCP_HTTP_INTEGRATED_ENABLED', true),
+            'route_prefix' => env('MCP_HTTP_INTEGRATED_ROUTE_PREFIX', 'mcp'),
+            'middleware' => explode(',', env('MCP_HTTP_INTEGRATED_MIDDLEWARE', 'web')),
+            'domain' => env('MCP_HTTP_INTEGRATED_DOMAIN'),
+            'sse_poll_interval' => (int) env('MCP_HTTP_INTEGRATED_SSE_POLL_SECONDS', 1),
+        ],
     ],
 
     /*
     |--------------------------------------------------------------------------
-    | MCP Protocol & Capabilities
+    | Pagination Limit
     |--------------------------------------------------------------------------
+    |
+    | This value determines the maximum number of items that will be returned
+    | by list methods in the MCP server.
+    |
     */
-    'protocol_versions' => [
-        '2024-11-05',
-    ],
     'pagination_limit' => env('MCP_PAGINATION_LIMIT', 50),
+
+    /*
+    |--------------------------------------------------------------------------
+    | MCP Capabilities Configuration
+    |--------------------------------------------------------------------------
+    |
+    | Define which MCP features are enabled in your server instance. This includes
+    | support for tools, resources, prompts, and their related functionality like
+    | subscriptions and change notifications.
+    |
+    */
     'capabilities' => [
         'tools' => [
             'enabled' => env('MCP_CAP_TOOLS_ENABLED', true),
             'listChanged' => env('MCP_CAP_TOOLS_LIST_CHANGED', true),
         ],
+
         'resources' => [
             'enabled' => env('MCP_CAP_RESOURCES_ENABLED', true),
             'subscribe' => env('MCP_CAP_RESOURCES_SUBSCRIBE', true),
             'listChanged' => env('MCP_CAP_RESOURCES_LIST_CHANGED', true),
         ],
+
         'prompts' => [
             'enabled' => env('MCP_CAP_PROMPTS_ENABLED', true),
             'listChanged' => env('MCP_CAP_PROMPTS_LIST_CHANGED', true),
         ],
+
         'logging' => [
             'enabled' => env('MCP_CAP_LOGGING_ENABLED', true),
+            'setLevel' => env('MCP_CAP_LOGGING_SET_LEVEL', false),
         ],
     ],
 
@@ -86,9 +145,13 @@
     |--------------------------------------------------------------------------
     | Logging Configuration
     |--------------------------------------------------------------------------
+    |
+    | Configure how the MCP server handles logging. You can specify which Laravel
+    | log channel to use and set the default log level.
+    |
     */
     'logging' => [
-        'channel' => env('MCP_LOG_CHANNEL'),
+        'channel' => env('MCP_LOG_CHANNEL', config('logging.default')),
         'level' => env('MCP_LOG_LEVEL', 'info'),
     ],
 ];
diff --git a/samples/basic/routes/mcp.php b/samples/basic/routes/mcp.php
new file mode 100644
index 0000000..3d8d775
--- /dev/null
+++ b/samples/basic/routes/mcp.php
@@ -0,0 +1,19 @@
+name('laravel_app_version')
+    ->mimeType('text/plain');
+
+Mcp::resourceTemplate('content://articles/{articleId}', GetArticleContent::class)
+    ->name('article_content')
+    ->mimeType('application/json');
+
+Mcp::prompt('seo_keywords_generator', GenerateSeoKeywordsPrompt::class);
diff --git a/src/Adapters/ConfigAdapter.php b/src/Adapters/ConfigAdapter.php
deleted file mode 100644
index a6194ac..0000000
--- a/src/Adapters/ConfigAdapter.php
+++ /dev/null
@@ -1,43 +0,0 @@
-config->get($key, $default);
-    }
-
-    /**
-     * {@inheritdoc}
-     * Note: Persisting config changes depends on Laravel's setup
-     * (e.g., packages like `config-writer` might be needed for `set` to persist).
-     * This adapter mainly reads config and supports runtime changes.
-     */
-    public function set(string $key, mixed $value): void
-    {
-        $this->config->set($key, $value);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function has(string $key): bool
-    {
-        return $this->config->has($key);
-    }
-}
diff --git a/src/Blueprints/PromptBlueprint.php b/src/Blueprints/PromptBlueprint.php
new file mode 100644
index 0000000..d097a09
--- /dev/null
+++ b/src/Blueprints/PromptBlueprint.php
@@ -0,0 +1,29 @@
+name = $name;
+
+        return $this;
+    }
+
+    public function description(string $description): static
+    {
+        $this->description = $description;
+
+        return $this;
+    }
+}
diff --git a/src/Blueprints/ResourceBlueprint.php b/src/Blueprints/ResourceBlueprint.php
new file mode 100644
index 0000000..bb8e203
--- /dev/null
+++ b/src/Blueprints/ResourceBlueprint.php
@@ -0,0 +1,58 @@
+name = $name;
+
+        return $this;
+    }
+
+    public function description(string $description): static
+    {
+        $this->description = $description;
+
+        return $this;
+    }
+
+    public function mimeType(string $mimeType): static
+    {
+        $this->mimeType = $mimeType;
+
+        return $this;
+    }
+
+    public function size(int $size): static
+    {
+        $this->size = $size;
+
+        return $this;
+    }
+
+    public function annotations(array $annotations): static
+    {
+        $this->annotations = $annotations;
+
+        return $this;
+    }
+}
diff --git a/src/Blueprints/ResourceTemplateBlueprint.php b/src/Blueprints/ResourceTemplateBlueprint.php
new file mode 100644
index 0000000..6f71ebd
--- /dev/null
+++ b/src/Blueprints/ResourceTemplateBlueprint.php
@@ -0,0 +1,49 @@
+name = $name;
+
+        return $this;
+    }
+
+    public function description(string $description): static
+    {
+        $this->description = $description;
+
+        return $this;
+    }
+
+    public function mimeType(string $mimeType): static
+    {
+        $this->mimeType = $mimeType;
+
+        return $this;
+    }
+
+    public function annotations(array $annotations): static
+    {
+        $this->annotations = $annotations;
+
+        return $this;
+    }
+}
diff --git a/src/Blueprints/ToolBlueprint.php b/src/Blueprints/ToolBlueprint.php
new file mode 100644
index 0000000..c51c4aa
--- /dev/null
+++ b/src/Blueprints/ToolBlueprint.php
@@ -0,0 +1,30 @@
+name = $name;
+
+        return $this;
+    }
+
+    public function description(string $description): static
+    {
+        $this->description = $description;
+
+        return $this;
+    }
+}
diff --git a/src/Commands/DiscoverCommand.php b/src/Commands/DiscoverCommand.php
index 4eb106f..1da5112 100644
--- a/src/Commands/DiscoverCommand.php
+++ b/src/Commands/DiscoverCommand.php
@@ -2,13 +2,10 @@
 
 declare(strict_types=1);
 
-namespace PhpMcp\Laravel\Server\Commands;
+namespace PhpMcp\Laravel\Commands;
 
 use Illuminate\Console\Command;
-use PhpMcp\Server\Registry;
 use PhpMcp\Server\Server;
-use Psr\Log\LoggerInterface;
-use Throwable;
 
 class DiscoverCommand extends Command
 {
@@ -17,7 +14,9 @@ class DiscoverCommand extends Command
      *
      * @var string
      */
-    protected $signature = 'mcp:discover {--no-cache : Perform discovery but do not update the cache}';
+    protected $signature = 'mcp:discover 
+                            {--no-cache : Perform discovery but do not update the cache}
+                            {--force : Force discovery even if already run or cache seems fresh (in dev)}';
 
     /**
      * The console command description.
@@ -29,48 +28,52 @@ class DiscoverCommand extends Command
     /**
      * Execute the console command.
      */
-    public function handle(Server $server, Registry $registry, LoggerInterface $logger): int
+    public function handle(Server $server): int
     {
         $noCache = $this->option('no-cache');
+        $forceDiscovery = $this->option('force') ?? true;
 
         $this->info('Starting MCP element discovery...');
 
         if ($noCache) {
-            $this->warn('Performing discovery without updating the cache.');
+            $this->warn('Discovery results will NOT be saved to cache.');
         }
 
         try {
-            $server->discover(true);
-
-            $toolsCount = $registry->allTools()->count();
-            $resourcesCount = $registry->allResources()->count();
-            $templatesCount = $registry->allResourceTemplates()->count();
-            $promptsCount = $registry->allPrompts()->count();
-
-            $this->info('Discovery complete.');
-            $this->table(
-                ['Element Type', 'Count'],
-                [
-                    ['Tools', $toolsCount],
-                    ['Resources', $resourcesCount],
-                    ['Resource Templates', $templatesCount],
-                    ['Prompts', $promptsCount],
-                ]
+            $server->discover(
+                basePath: config('mcp.discovery.base_path', base_path()),
+                scanDirs: config('mcp.discovery.directories', ['app/Mcp']),
+                excludeDirs: config('mcp.discovery.exclude_dirs', []),
+                force: $forceDiscovery,
+                saveToCache: ! $noCache
             );
+        } catch (\Exception $e) {
+            $this->error('Discovery failed: ' . $e->getMessage());
+            return Command::FAILURE;
+        }
 
-            if (! $noCache) {
-                $this->info('Element cache updated.');
-            }
+        $registry = $server->getRegistry();
 
-            return Command::SUCCESS;
-        } catch (Throwable $e) {
-            $logger->error('MCP Discovery failed', ['exception' => $e]);
-            $this->error('Discovery failed: '.$e->getMessage());
-            if ($this->getOutput()->isVeryVerbose()) {
-                $this->line($e->getTraceAsString());
-            }
+        $toolsCount = $registry->allTools()->count();
+        $resourcesCount = $registry->allResources()->count();
+        $templatesCount = $registry->allResourceTemplates()->count();
+        $promptsCount = $registry->allPrompts()->count();
 
-            return Command::FAILURE;
+        $this->info('Discovery complete.');
+        $this->table(
+            ['Element Type', 'Count'],
+            [
+                ['Tools', $toolsCount],
+                ['Resources', $resourcesCount],
+                ['Resource Templates', $templatesCount],
+                ['Prompts', $promptsCount],
+            ]
+        );
+
+        if (! $noCache && $registry->discoveryRanOrCached()) {
+            $this->info('MCP element definitions updated and cached.');
         }
+
+        return Command::SUCCESS;
     }
 }
diff --git a/src/Commands/ListCommand.php b/src/Commands/ListCommand.php
index 45b7daf..00dbd85 100644
--- a/src/Commands/ListCommand.php
+++ b/src/Commands/ListCommand.php
@@ -2,15 +2,16 @@
 
 declare(strict_types=1);
 
-namespace PhpMcp\Laravel\Server\Commands;
+namespace PhpMcp\Laravel\Commands;
 
 use Illuminate\Console\Command;
 use Illuminate\Support\Collection;
+use Illuminate\Support\Str;
 use PhpMcp\Server\Definitions\PromptDefinition;
 use PhpMcp\Server\Definitions\ResourceDefinition;
 use PhpMcp\Server\Definitions\ResourceTemplateDefinition;
 use PhpMcp\Server\Definitions\ToolDefinition;
-use PhpMcp\Server\Registry;
+use PhpMcp\Server\Server;
 
 class ListCommand extends Command
 {
@@ -19,7 +20,9 @@ class ListCommand extends Command
      *
      * @var string
      */
-    protected $signature = 'mcp:list {type? : The type of element to list (tools, resources, prompts, templates)} {--json : Output the list as JSON}';
+    protected $signature = 'mcp:list 
+                            {type? : The type of element to list (tools, resources, prompts, templates)} 
+                            {--json : Output the list as JSON}';
 
     /**
      * The console command description.
@@ -31,9 +34,16 @@ class ListCommand extends Command
     /**
      * Execute the console command.
      */
-    public function handle(Registry $registry): int
+    public function handle(Server $server): int
     {
-        $registry->loadElementsFromCache(); // Ensure elements are loaded
+        $registry = $server->getRegistry();
+
+        if (! $registry->hasElements() && ! $registry->discoveryRanOrCached()) {
+            $this->comment('No MCP elements are manually registered, and discovery has not run (or cache is empty).');
+            $this->comment('Run `php artisan mcp:discover` or ensure auto-discovery is enabled in dev.');
+        } elseif (! $registry->hasElements() && $registry->discoveryRanOrCached()) {
+            $this->comment('Discovery/cache load ran, but no MCP elements were found.');
+        }
 
         $type = $this->argument('type');
         $outputJson = $this->option('json');
@@ -41,7 +51,7 @@ public function handle(Registry $registry): int
         $validTypes = ['tools', 'resources', 'prompts', 'templates'];
 
         if ($type && ! in_array($type, $validTypes)) {
-            $this->error("Invalid element type '{$type}'. Valid types are: ".implode(', ', $validTypes));
+            $this->error("Invalid element type '{$type}'. Valid types are: " . implode(', ', $validTypes));
 
             return Command::INVALID;
         }
@@ -82,44 +92,35 @@ public function handle(Registry $registry): int
     private function displayTable(string $type, Collection $collection): void
     {
         if ($collection->isEmpty()) {
-            $this->info(ucfirst($type).': None found.');
+            $this->info(ucfirst($type) . ': None found.');
 
             return;
         }
 
-        $this->info(ucfirst($type).':');
+        $this->info(ucfirst($type) . ':');
 
         $data = match ($type) {
-            'tools' => $collection->map(fn (ToolDefinition $def) => [
-                'name' => $def->getName(),
-                'description' => $def->getDescription(),
-                'class' => $def->getClassName(),
-                'method' => $def->getMethodName(),
-                // 'inputSchema' => json_encode($def->getInputSchema(), JSON_UNESCAPED_SLASHES),
+            'tools' => $collection->map(fn(ToolDefinition $def) => [
+                'Name' => $def->getName(),
+                'Description' => Str::limit($def->getDescription() ?? '-', 60),
+                'Handler' => $def->getClassName() . '::' . $def->getMethodName(),
             ])->all(),
-            'resources' => $collection->map(fn (ResourceDefinition $def) => [
-                'uri' => $def->getUri(),
-                'name' => $def->getName(),
-                'description' => $def->getDescription(),
-                'mimeType' => $def->getMimeType(),
-                'class' => $def->getClassName(),
-                'method' => $def->getMethodName(),
+            'resources' => $collection->map(fn(ResourceDefinition $def) => [
+                'URI' => $def->getUri(),
+                'Name' => $def->getName(),
+                'MIME' => $def->getMimeType() ?? '-',
+                'Handler' => $def->getClassName() . '::' . $def->getMethodName(),
             ])->all(),
-            'prompts' => $collection->map(fn (PromptDefinition $def) => [
-                'name' => $def->getName(),
-                'description' => $def->getDescription(),
-                'class' => $def->getClassName(),
-                'method' => $def->getMethodName(),
-                // 'inputSchema' => json_encode($def->getInputSchema(), JSON_UNESCAPED_SLASHES),
+            'prompts' => $collection->map(fn(PromptDefinition $def) => [
+                'Name' => $def->getName(),
+                'Description' => Str::limit($def->getDescription() ?? '-', 60),
+                'Handler' => $def->getClassName() . '::' . $def->getMethodName(),
             ])->all(),
-            'templates' => $collection->map(fn (ResourceTemplateDefinition $def) => [
-                'uriTemplate' => $def->getUriTemplate(),
-                'name' => $def->getName(),
-                'description' => $def->getDescription(),
-                'mimeType' => $def->getMimeType(),
-                'class' => $def->getClassName(),
-                'method' => $def->getMethodName(),
-                // 'inputSchema' => json_encode($def->getInputSchema(), JSON_UNESCAPED_SLASHES),
+            'templates' => $collection->map(fn(ResourceTemplateDefinition $def) => [
+                'URI Template' => $def->getUriTemplate(),
+                'Name' => $def->getName(),
+                'MIME' => $def->getMimeType() ?? '-',
+                'Handler' => $def->getClassName() . '::' . $def->getMethodName(),
             ])->all(),
             default => [],
         };
@@ -135,7 +136,6 @@ private function displayTable(string $type, Collection $collection): void
 
     private function formatCollectionForJson(Collection $collection): array
     {
-        // Convert definitions to arrays for JSON output
-        return $collection->map(fn ($item) => $item instanceof \JsonSerializable ? $item->jsonSerialize() : (array) $item)->values()->all();
+        return $collection->map(fn($item) => $item instanceof \JsonSerializable ? $item->jsonSerialize() : (array) $item)->values()->all();
     }
 }
diff --git a/src/Commands/ServeCommand.php b/src/Commands/ServeCommand.php
index 5e493c2..12729e5 100644
--- a/src/Commands/ServeCommand.php
+++ b/src/Commands/ServeCommand.php
@@ -2,12 +2,14 @@
 
 declare(strict_types=1);
 
-namespace PhpMcp\Laravel\Server\Commands;
+namespace PhpMcp\Laravel\Commands;
 
 use Illuminate\Console\Command;
 use PhpMcp\Server\Server;
-use PhpMcp\Server\Transports\StdioTransportHandler;
-use Psr\Log\LoggerInterface;
+use PhpMcp\Server\Transports\HttpServerTransport;
+use PhpMcp\Server\Transports\StdioServerTransport;
+
+use function Laravel\Prompts\select;
 
 class ServeCommand extends Command
 {
@@ -16,14 +18,18 @@ class ServeCommand extends Command
      *
      * @var string
      */
-    protected $signature = 'mcp:serve';
+    protected $signature = 'mcp:serve 
+                            {--transport= : The transport to use (stdio or http)}
+                            {--H|host= : Host for the HTTP transport (overrides config)}
+                            {--P|port= : Port for the HTTP transport (overrides config)}
+                            {--path-prefix= : URL path prefix for the HTTP transport (overrides config)}';
 
     /**
      * The console command description.
      *
      * @var string
      */
-    protected $description = 'Starts the MCP server using the configured STDIO transport.';
+    protected $description = 'Starts the MCP server using the specified transport (stdio or http).';
 
     /**
      * Execute the console command.
@@ -33,23 +39,99 @@ class ServeCommand extends Command
      */
     public function handle(Server $server): int
     {
-        if (! config('mcp.transports.stdio.enabled', false)) {
-            $this->error('MCP STDIO transport is disabled. Cannot run mcp:serve.');
+        $transportOption = $this->getTransportOption();
+
+        return match ($transportOption) {
+            'stdio' => $this->handleStdioTransport($server),
+            'http' => $this->handleHttpTransport($server),
+            default => $this->handleInvalidTransport($transportOption),
+        };
+    }
+
+    private function getTransportOption(): string
+    {
+        $transportOption = $this->option('transport');
+
+        if ($transportOption === null) {
+            if ($this->input->isInteractive()) {
+                $transportOption = select(
+                    label: 'Choose transport protocol for MCP server communication',
+                    options: [
+                        'stdio' => 'STDIO',
+                        'http' => 'HTTP',
+                    ],
+                    default: 'stdio',
+                );
+            } else {
+                $transportOption = 'stdio';
+            }
+        }
+
+        return $transportOption;
+    }
+
+    private function handleStdioTransport(Server $server): int
+    {
+        if (! config('mcp.transports.stdio.enabled', true)) {
+            $this->error('MCP STDIO transport is disabled in config/mcp.php.');
 
             return Command::FAILURE;
         }
 
-        $handler = new StdioTransportHandler($server);
-        $logger = app(LoggerInterface::class);
+        $this->info('Starting MCP server with STDIO transport...');
+
+        try {
+            $transport = new StdioServerTransport;
+            $server->listen($transport);
+        } catch (\Exception $e) {
+            $this->error("Failed to start MCP server with STDIO transport: {$e->getMessage()}");
 
-        $logger->info('Starting MCP server via mcp:serve (STDIO)...');
-        $this->info('MCP server starting via STDIO. Listening for requests...');
+            return Command::FAILURE;
+        }
 
-        $exitCode = $handler->start();
+        $this->info("MCP Server (STDIO) stopped.");
+
+        return Command::SUCCESS;
+    }
 
-        $logger->info('MCP server (mcp:serve) stopped.', ['exitCode' => $exitCode]);
-        $this->info('MCP server stopped.');
+    private function handleHttpTransport(Server $server): int
+    {
+        if (! config('mcp.transports.http_dedicated.enabled', true)) {
+            $this->error('Dedicated MCP HTTP transport is disabled in config/mcp.php.');
+
+            return Command::FAILURE;
+        }
+
+        $host = $this->option('host') ?? config('mcp.transports.http_dedicated.host', '127.0.0.1');
+        $port = (int) ($this->option('port') ?? config('mcp.transports.http_dedicated.port', 8090));
+        $pathPrefix = $this->option('path-prefix') ?? config('mcp.transports.http_dedicated.path_prefix', 'mcp_server');
+        $sslContextOptions = config('mcp.transports.http_dedicated.ssl_context_options'); // For HTTPS
+
+        $this->info("Starting MCP server with dedicated HTTP transport on http://{$host}:{$port} (prefix: /{$pathPrefix})...");
+        $transport = new HttpServerTransport(
+            host: $host,
+            port: $port,
+            mcpPathPrefix: $pathPrefix,
+            sslContext: $sslContextOptions
+        );
+
+        try {
+            $server->listen($transport);
+        } catch (\Exception $e) {
+            $this->error("Failed to start MCP server with dedicated HTTP transport: {$e->getMessage()}");
+
+            return Command::FAILURE;
+        }
+
+        $this->info("MCP Server (HTTP) stopped.");
+
+        return Command::SUCCESS;
+    }
+
+    private function handleInvalidTransport(string $transportOption): int
+    {
+        $this->error("Invalid transport specified: {$transportOption}. Use 'stdio' or 'http'.");
 
-        return $exitCode;
+        return Command::INVALID;
     }
 }
diff --git a/src/Events/McpNotificationEvent.php b/src/Events/McpNotificationEvent.php
index cb2e1c4..d443488 100644
--- a/src/Events/McpNotificationEvent.php
+++ b/src/Events/McpNotificationEvent.php
@@ -1,6 +1,6 @@
 handler = new HttpTransportHandler($server);
-        $this->logger = app(LoggerInterface::class);
+        $this->clientStateManager = $server->getClientStateManager();
+
+        $server->listen($this->transport, false);
     }
 
     /**
@@ -34,9 +34,8 @@ public function __construct(Server $server)
      */
     public function handleMessage(Request $request): Response
     {
-        // Confirm request is JSON
         if (! $request->isJson()) {
-            $this->logger->warning('MCP POST request with invalid Content-Type');
+            Log::warning('MCP POST request with invalid Content-Type');
 
             return response()->json([
                 'jsonrpc' => '2.0',
@@ -47,35 +46,35 @@ public function handleMessage(Request $request): Response
             ], 400);
         }
 
-        // Confirm request body is not empty
-        $content = $request->getContent();
-        if ($content === false || empty($content)) {
-            $this->logger->warning('MCP POST request with empty body');
+        $clientId = $request->query('clientId');
+
+        if (! $clientId || ! is_string($clientId)) {
+            Log::error('MCP: Missing or invalid clientId');
 
             return response()->json([
                 'jsonrpc' => '2.0',
                 'error' => [
                     'code' => -32600,
-                    'message' => 'Invalid Request: Empty body',
+                    'message' => 'Invalid Request: Missing or invalid clientId query parameter',
                 ],
             ], 400);
         }
 
-        $clientId = $request->query('client_id');
-
-        if (! $clientId || ! is_string($clientId)) {
-            $this->logger->error('MCP: Missing or invalid clientId');
+        // Confirm request body is not empty
+        $content = $request->getContent();
+        if ($content === false || empty($content)) {
+            Log::warning('MCP POST request with empty body');
 
             return response()->json([
                 'jsonrpc' => '2.0',
                 'error' => [
                     'code' => -32600,
-                    'message' => 'Invalid Request: Missing or invalid clientId query parameter',
+                    'message' => 'Invalid Request: Empty body',
                 ],
             ], 400);
         }
 
-        $this->handler->handleInput($content, $clientId);
+        $this->transport->emit('message', [$content, $clientId]);
 
         return response()->json([
             'jsonrpc' => '2.0',
@@ -91,38 +90,81 @@ public function handleSse(Request $request): Response
     {
         $clientId = $request->hasSession() ? $request->session()->getId() : Str::uuid()->toString();
 
-        if (! $clientId) {
-            $this->logger->error('MCP: SSE connection failed - Could not determine Client ID.');
+        $this->transport->emit('client_connected', [$clientId]);
 
-            return response()->json([
-                'jsonrpc' => '2.0',
-                'error' => [
-                    'code' => -32600,
-                    'message' => 'Could not determine Client ID',
-                ],
-            ], 400);
+        $pollInterval = (int) config('mcp.transports.http_integrated.sse_poll_interval', 1);
+        if ($pollInterval < 1) {
+            $pollInterval = 1;
         }
 
-        $this->logger->info('MCP: SSE connection opening', ['client_id' => $clientId]);
+        return response()->stream(function () use ($clientId, $pollInterval) {
+            @set_time_limit(0);
 
-        set_time_limit(0);
-
-        return response()->stream(function () use ($clientId) {
             try {
-                $postEndpointUri = route('mcp.message', ['client_id' => $clientId], false);
+                $postEndpointUri = route('mcp.message', ['clientId' => $clientId], false);
 
-                $this->handler->handleSseConnection($clientId, $postEndpointUri);
+                $this->sendSseEvent('endpoint', $postEndpointUri, "mcp-endpoint-{$clientId}");
             } catch (Throwable $e) {
-                $this->logger->error('MCP: SSE stream loop terminated', ['client_id' => $clientId, 'reason' => $e->getMessage()]);
-            } finally {
-                $this->handler->cleanupClient($clientId);
-                $this->logger->info('MCP: SSE connection closed and client cleaned up', ['client_id' => $clientId]);
+                Log::error('MCP: SSE stream loop terminated', ['client_id' => $clientId, 'reason' => $e->getMessage()]);
+
+                return;
             }
+
+            while (true) {
+                if (connection_aborted()) {
+                    break;
+                }
+
+                $messages = $this->clientStateManager->getQueuedMessages($clientId);
+                foreach ($messages as $message) {
+                    $this->sendSseEvent('message', rtrim($message, "\n"));
+                }
+
+                static $keepAliveCounter = 0;
+                $keepAliveInterval = (int) round(15 / $pollInterval);
+                if (($keepAliveCounter++ % $keepAliveInterval) == 0) {
+                    echo ": keep-alive\n\n";
+                    $this->flushOutput();
+                }
+
+                usleep($pollInterval * 1000000);
+            }
+
+            $this->transport->emit('client_disconnected', [$clientId, 'Laravel SSE stream shutdown']);
+            $this->server->endListen($this->transport);
         }, headers: [
             'Content-Type' => 'text/event-stream',
             'Cache-Control' => 'no-cache',
             'Connection' => 'keep-alive',
-            'X-Accel-Buffering' => 'no', // Prevent buffering by proxies like nginx
+            'X-Accel-Buffering' => 'no',
+            'Access-Control-Allow-Origin' => '*', // TODO: Make this configurable
         ]);
     }
+
+    private function sendSseEvent(string $event, string $data, ?string $id = null): void
+    {
+        if (connection_aborted()) {
+            return;
+        }
+
+        echo "event: {$event}\n";
+        if ($id !== null) {
+            echo "id: {$id}\n";
+        }
+
+        foreach (explode("\n", $data) as $line) {
+            echo "data: {$line}\n";
+        }
+
+        echo "\n";
+        $this->flushOutput();
+    }
+
+    private function flushOutput(): void
+    {
+        if (function_exists('ob_flush')) {
+            @ob_flush();
+        }
+        @flush();
+    }
 }
diff --git a/src/Listeners/McpNotificationListener.php b/src/Listeners/McpNotificationListener.php
index 51bf6a5..d3a9630 100644
--- a/src/Listeners/McpNotificationListener.php
+++ b/src/Listeners/McpNotificationListener.php
@@ -1,22 +1,26 @@
 clientStateManager = $server->getClientStateManager();
+    }
 
     /**
      * Handle the event.
@@ -37,10 +41,11 @@ public function handle(McpNotificationEvent $event): void
      */
     private function handleResourceUpdated(ResourceUpdated $event): void
     {
-        $subscribers = $this->transportState->getResourceSubscribers($event->uri);
+        $subscribers = $this->clientStateManager->getResourceSubscribers($event->uri);
 
+        $message = json_encode($event->toNotification()->toArray());
         foreach ($subscribers as $clientId) {
-            $this->transportState->queueMessage($clientId, $event->toNotification());
+            $this->clientStateManager->queueMessage($clientId, $message);
         }
     }
 
@@ -49,10 +54,11 @@ private function handleResourceUpdated(ResourceUpdated $event): void
      */
     private function handleListChanged(McpNotificationEvent $event): void
     {
-        $activeClients = $this->transportState->getActiveClients();
+        $activeClients = $this->clientStateManager->getActiveClients();
 
+        $message = json_encode($event->toNotification()->toArray());
         foreach ($activeClients as $clientId) {
-            $this->transportState->queueMessage($clientId, $event->toNotification());
+            $this->clientStateManager->queueMessage($clientId, $message);
         }
     }
 }
diff --git a/src/McpRegistrar.php b/src/McpRegistrar.php
new file mode 100644
index 0000000..812eabc
--- /dev/null
+++ b/src/McpRegistrar.php
@@ -0,0 +1,139 @@
+pendingTools[] = $pendingTool;
+
+        return $pendingTool;
+    }
+
+    /**
+     * Register a new resource.
+     */
+    public function resource(string $uri, array|string $handler): ResourceBlueprint
+    {
+        $pendingResource = new ResourceBlueprint($uri, $handler);
+        $this->pendingResources[] = $pendingResource;
+
+        return $pendingResource;
+    }
+
+    /**
+     * Register a new resource template.
+     */
+    public function resourceTemplate(string $uriTemplate, array|string $handler): ResourceTemplateBlueprint
+    {
+        $pendingResourceTemplate = new ResourceTemplateBlueprint($uriTemplate, $handler);
+        $this->pendingResourceTemplates[] = $pendingResourceTemplate;
+
+        return $pendingResourceTemplate;
+    }
+
+    /**
+     * Register a new prompt.
+     *
+     * Usage:
+     * Mcp::prompt('prompt_name', $handler)
+     * Mcp::prompt($handler) // Name will be inferred
+     */
+    public function prompt(string|array ...$args): PromptBlueprint
+    {
+        $name = null;
+        $handler = null;
+
+        if (count($args) === 1 && (is_array($args[0]) || (is_string($args[0]) && (class_exists($args[0]) || is_callable($args[0]))))) {
+            $handler = $args[0];
+        } elseif (count($args) === 2 && is_string($args[0]) && (is_array($args[1]) || (is_string($args[1]) && (class_exists($args[1]) || is_callable($args[1]))))) {
+            $name = $args[0];
+            $handler = $args[1];
+        } else {
+            throw new InvalidArgumentException('Invalid arguments for Mcp::prompt(). Expected (handler) or (name, handler).');
+        }
+
+        $pendingPrompt = new PromptBlueprint($handler, $name);
+        $this->pendingPrompts[] = $pendingPrompt;
+
+        return $pendingPrompt;
+    }
+
+    public function applyBlueprints(ServerBuilder $builder): void
+    {
+        foreach ($this->pendingTools as $pendingTool) {
+            $builder->withTool($pendingTool->handler, $pendingTool->name, $pendingTool->description);
+        }
+
+        foreach ($this->pendingResources as $pendingResource) {
+            $builder->withResource(
+                $pendingResource->handler,
+                $pendingResource->uri,
+                $pendingResource->name,
+                $pendingResource->description,
+                $pendingResource->mimeType,
+                $pendingResource->size,
+                $pendingResource->annotations
+            );
+        }
+
+        foreach ($this->pendingResourceTemplates as $pendingTemplate) {
+            $builder->withResourceTemplate(
+                $pendingTemplate->handler,
+                $pendingTemplate->uriTemplate,
+                $pendingTemplate->name,
+                $pendingTemplate->description,
+                $pendingTemplate->mimeType,
+                $pendingTemplate->annotations
+            );
+        }
+
+        foreach ($this->pendingPrompts as $pendingPrompt) {
+            $builder->withPrompt($pendingPrompt->handler, $pendingPrompt->name, $pendingPrompt->description);
+        }
+    }
+}
diff --git a/src/McpServiceProvider.php b/src/McpServiceProvider.php
index 39ae703..ef3f2bd 100644
--- a/src/McpServiceProvider.php
+++ b/src/McpServiceProvider.php
@@ -2,99 +2,145 @@
 
 declare(strict_types=1);
 
-namespace PhpMcp\Laravel\Server;
+namespace PhpMcp\Laravel;
 
 use Illuminate\Contracts\Foundation\Application;
+use Illuminate\Contracts\Support\DeferrableProvider;
+use Illuminate\Support\Facades\Event;
 use Illuminate\Support\Facades\Route;
 use Illuminate\Support\ServiceProvider;
-use PhpMcp\Laravel\Server\Adapters\ConfigAdapter;
-use PhpMcp\Laravel\Server\Commands\DiscoverCommand;
-use PhpMcp\Laravel\Server\Commands\ListCommand;
-use PhpMcp\Laravel\Server\Commands\ServeCommand;
-use PhpMcp\Laravel\Server\Events\PromptsListChanged;
-use PhpMcp\Laravel\Server\Events\ResourcesListChanged;
-use PhpMcp\Laravel\Server\Events\ToolsListChanged;
-use PhpMcp\Laravel\Server\Listeners\McpNotificationListener;
-use PhpMcp\Server\Contracts\ConfigurationRepositoryInterface;
+use PhpMcp\Laravel\Commands\DiscoverCommand;
+use PhpMcp\Laravel\Commands\ListCommand;
+use PhpMcp\Laravel\Commands\ServeCommand;
+use PhpMcp\Laravel\Events\PromptsListChanged;
+use PhpMcp\Laravel\Events\ResourcesListChanged;
+use PhpMcp\Laravel\Events\ToolsListChanged;
+use PhpMcp\Laravel\Listeners\McpNotificationListener;
+use PhpMcp\Laravel\Transports\LaravelHttpTransport;
+use PhpMcp\Server\Model\Capabilities;
+use PhpMcp\Server\Registry;
 use PhpMcp\Server\Server;
-use Psr\Log\LoggerInterface;
-use Psr\SimpleCache\CacheInterface;
 
-class McpServiceProvider extends ServiceProvider
+class McpServiceProvider extends ServiceProvider implements DeferrableProvider
 {
+    public function register(): void
+    {
+        $this->mergeConfigFrom(__DIR__ . '/../config/mcp.php', 'mcp');
+
+        $this->app->singleton(McpRegistrar::class, fn() => new McpRegistrar());
+
+        $this->app->alias(McpRegistrar::class, 'mcp.registrar');
+    }
+
     /**
-     * The event listener mappings for the application.
+     * Get the services provided by the provider.
      *
-     * @var array>
+     * @return array
      */
-    protected $listen = [
-        ToolsListChanged::class => [
-            McpNotificationListener::class,
-        ],
-        ResourcesListChanged::class => [
-            McpNotificationListener::class,
-        ],
-        PromptsListChanged::class => [
-            McpNotificationListener::class,
-        ],
-    ];
+    public function provides(): array
+    {
+        return [
+            McpRegistrar::class,
+            Server::class,
+            Registry::class,
+            LaravelHttpTransport::class,
+        ];
+    }
 
-    public function register(): void
+    public function boot(): void
+    {
+        $this->loadMcpDefinitions();
+        $this->buildServer();
+        $this->bootConfig();
+        $this->bootRoutes();
+        $this->bootEvents();
+        $this->bootCommands();
+        $this->bootEventListeners();
+    }
+
+    protected function loadMcpDefinitions(): void
     {
-        $this->mergeConfigFrom(__DIR__.'/../config/mcp.php', 'mcp');
+        $definitionsPath = config('mcp.discovery.definitions_file', base_path('routes/mcp.php'));
+        if ($definitionsPath && file_exists($definitionsPath)) {
+            require $definitionsPath;
+        }
+    }
 
+    protected function buildServer(): void
+    {
         $this->app->singleton(Server::class, function (Application $app) {
-            $server = Server::make()
+            $serverName = config('mcp.server.name', config('app.name', 'Laravel') . ' MCP Server');
+            $serverVersion = config('mcp.server.version', '1.0.0');
+            $logger = $app['log']->channel(config('mcp.logging.channel'));
+            $cache = $app['cache']->store($app['config']->get('mcp.cache.store'));
+            $capabilities = Capabilities::forServer(
+                toolsEnabled: config('mcp.capabilities.tools.enabled', true),
+                toolsListChanged: config('mcp.capabilities.tools.listChanged', true),
+                resourcesEnabled: config('mcp.capabilities.resources.enabled', true),
+                resourcesSubscribe: config('mcp.capabilities.resources.subscribe', true),
+                resourcesListChanged: config('mcp.capabilities.resources.listChanged', true),
+                promptsEnabled: config('mcp.capabilities.prompts.enabled', true),
+                promptsListChanged: config('mcp.capabilities.prompts.listChanged', true),
+                loggingEnabled: config('mcp.capabilities.logging.enabled', true),
+                instructions: config('mcp.server.instructions')
+            );
+
+            $builder = Server::make()
+                ->withServerInfo($serverName, $serverVersion)
+                ->withLogger($logger)
                 ->withContainer($app)
-                ->withBasePath(base_path())
-                ->withScanDirectories($app['config']->get('mcp.discovery.directories', ['app/Mcp']));
+                ->withCache($cache, (int) config('mcp.cache.ttl', 3600))
+                ->withCapabilities($capabilities);
 
-            if (! $this->app->environment('production')) {
-                $server->discover();
-            }
+            $registrar = $app->make(McpRegistrar::class);
+            $registrar->applyBlueprints($builder);
 
-            $registry = $server->getRegistry();
+            $server = $builder->build();
 
-            $registry->setToolsChangedNotifier(fn () => ToolsListChanged::dispatch());
-            $registry->setResourcesChangedNotifier(fn () => ResourcesListChanged::dispatch());
-            $registry->setPromptsChangedNotifier(fn () => PromptsListChanged::dispatch());
+            if (config('mcp.discovery.auto_discover', true)) {
+                $server->discover(
+                    basePath: config('mcp.discovery.base_path', base_path()),
+                    scanDirs: config('mcp.discovery.directories', ['app/Mcp']),
+                    excludeDirs: config('mcp.discovery.exclude_dirs', []),
+                    saveToCache: config('mcp.discovery.save_to_cache', true)
+                );
+            }
 
             return $server;
         });
 
-        $this->app->bind(ConfigurationRepositoryInterface::class, fn (Application $app) => new ConfigAdapter($app['config']));
-        $this->app->bind(LoggerInterface::class, fn (Application $app) => $app['log']->channel($app['config']->get('mcp.logging.channel')));
-        $this->app->bind(CacheInterface::class, fn (Application $app) => $app['cache']->store($app['config']->get('mcp.cache.store')));
-    }
+        $this->app->singleton(Registry::class, fn($app) => $app->make(Server::class)->getRegistry());
 
-    public function boot(): void
-    {
-        $this->bootConfig();
-        $this->bootRoutes();
-        $this->bootCommands();
+        $this->app->alias(Server::class, 'mcp.server');
+        $this->app->alias(Registry::class, 'mcp.registry');
+
+        $this->app->singleton(LaravelHttpTransport::class, function (Application $app) {
+            $server = $app->make(Server::class);
+
+            return new LaravelHttpTransport($server->getClientStateManager());
+        });
     }
 
     protected function bootConfig(): void
     {
         if ($this->app->runningInConsole()) {
-            $this->publishes([__DIR__.'/../config/mcp.php' => config_path('mcp.php')], 'mcp-config');
+            $this->publishes([__DIR__ . '/../config/mcp.php' => config_path('mcp.php')], 'mcp-config');
         }
     }
 
     protected function bootRoutes(): void
     {
-        $config = $this->app['config'];
-        if ($config->get('mcp.transports.http.enabled', true)) {
-            $prefix = $config->get('mcp.transports.http.prefix', 'mcp');
-            $middleware = $config->get('mcp.transports.http.middleware', ['web']);
-            $domain = $config->get('mcp.transports.http.domain');
+        if (config('mcp.transports.http_integrated.enabled', true)) {
+            $routePrefix = config('mcp.transports.http_integrated.route_prefix', 'mcp');
+            $middleware = config('mcp.transports.http_integrated.middleware', ['web']);
+            $domain = config('mcp.transports.http_integrated.domain');
 
             Route::group([
                 'domain' => $domain,
-                'prefix' => $prefix,
+                'prefix' => $routePrefix,
                 'middleware' => $middleware,
             ], function () {
-                $this->loadRoutesFrom(__DIR__.'/../routes/mcp.php');
+                $this->loadRoutesFrom(__DIR__ . '/../routes/mcp_http_integrated.php');
             });
         }
     }
@@ -109,4 +155,22 @@ protected function bootCommands(): void
             ]);
         }
     }
+
+    protected function bootEvents(): void
+    {
+        Event::listen(
+            [ToolsListChanged::class, ResourcesListChanged::class, PromptsListChanged::class],
+            McpNotificationListener::class,
+        );
+    }
+
+    protected function bootEventListeners(): void
+    {
+        $server = $this->app->make(Server::class);
+        $registry = $server->getRegistry();
+
+        $registry->setToolsChangedNotifier(ToolsListChanged::dispatch(...));
+        $registry->setResourcesChangedNotifier(ResourcesListChanged::dispatch(...));
+        $registry->setPromptsChangedNotifier(PromptsListChanged::dispatch(...));
+    }
 }
diff --git a/src/Transports/LaravelHttpTransport.php b/src/Transports/LaravelHttpTransport.php
new file mode 100644
index 0000000..0fe7043
--- /dev/null
+++ b/src/Transports/LaravelHttpTransport.php
@@ -0,0 +1,102 @@
+ Tracks active client IDs managed by this transport */
+    private array $activeClients = [];
+
+    public function __construct(ClientStateManager $clientStateManager)
+    {
+        $this->clientStateManager = $clientStateManager;
+        $this->logger = new NullLogger;
+
+        $this->on('client_connected', function (string $clientId) {
+            $this->activeClients[$clientId] = true;
+            $this->clientStateManager->updateClientActivity($clientId);
+        });
+
+        $this->on('client_disconnected', function (string $clientId, string $reason) {
+            unset($this->activeClients[$clientId]);
+        });
+
+        $this->on('message', function (string $message, string $clientId) {
+            $this->clientStateManager->updateClientActivity($clientId);
+        });
+    }
+
+    public function setLogger(LoggerInterface $logger): void
+    {
+        $this->logger = $logger;
+    }
+
+    /**
+     * For this integrated transport, 'listen' doesn't start a network listener.
+     * It signifies the transport is ready to be used by the Protocol handler.
+     * The actual listening is done by Laravel's HTTP kernel.
+     */
+    public function listen(): void
+    {
+        $this->emit('ready');
+    }
+
+    /**
+     * Queues a message to be sent to the client via the ClientStateManager.
+     * The McpController's SSE loop will pick this up.
+     * The $rawFramedMessage is expected to be a complete JSON-RPC string (usually ending with \n, but we'll trim).
+     */
+    public function sendToClientAsync(string $clientId, string $rawFramedMessage): PromiseInterface
+    {
+        if (! isset($this->activeClients[$clientId])) {
+            $this->logger->warning('Attempted to send message to inactive or unknown client.', ['clientId' => $clientId]);
+
+            return reject(new TransportException("Client '{$clientId}' is not actively managed by this transport."));
+        }
+
+        $messagePayload = rtrim($rawFramedMessage, "\n");
+
+        if (empty($messagePayload)) {
+            return resolve(null);
+        }
+
+        $this->clientStateManager->queueMessage($clientId, $messagePayload);
+
+        return resolve(null);
+    }
+
+    /**
+     * 'Closes' the transport.
+     */
+    public function close(): void
+    {
+        $activeClientIds = array_keys($this->activeClients);
+
+        foreach ($activeClientIds as $clientId) {
+            $this->emit('client_disconnected', [$clientId, 'Transport globally closed']);
+            $this->emit('close', ['Transport closed.']);
+        }
+
+        $this->removeAllListeners();
+    }
+}
diff --git a/tests/Feature/Commands/DiscoverCommandTest.php b/tests/Feature/Commands/DiscoverCommandTest.php
new file mode 100644
index 0000000..1bad728
--- /dev/null
+++ b/tests/Feature/Commands/DiscoverCommandTest.php
@@ -0,0 +1,52 @@
+shouldReceive('allTools->count')->andReturn(2);
+        $registryMock->shouldReceive('allResources->count')->andReturn(1);
+        $registryMock->shouldReceive('allResourceTemplates->count')->andReturn(0);
+        $registryMock->shouldReceive('allPrompts->count')->andReturn(3);
+        $registryMock->shouldReceive('discoveryRanOrCached')->andReturn(true);
+
+        $serverMock = $this->mock(Server::class, function ($mock) use ($registryMock) {
+            $mock->shouldReceive('discover')->once();
+            $mock->shouldReceive('getRegistry')->andReturn($registryMock);
+        });
+        $this->app->instance(Server::class, $serverMock);
+        $this->app->instance(Registry::class, $registryMock);
+
+
+        $this->artisan('mcp:discover')
+            ->expectsTable(['Element Type', 'Count'], [
+                ['Tools', 2],
+                ['Resources', 1],
+                ['Resource Templates', 0],
+                ['Prompts', 3],
+            ])
+            ->assertSuccessful();
+    }
+
+    public function test_discover_command_handles_discovery_exception_gracefully()
+    {
+        $serverMock = $this->mock(Server::class, function ($mock) {
+            $mock->shouldReceive('discover')->andThrow(new \RuntimeException("Simulated discovery failure!"));
+            $mock->shouldAllowMockingProtectedMethods()->shouldIgnoreMissing();
+        });
+        $this->app->instance(Server::class, $serverMock);
+
+
+        $this->artisan('mcp:discover')
+            ->expectsOutputToContain('Discovery failed: Simulated discovery failure!')
+            ->assertFailed();
+    }
+}
diff --git a/tests/Feature/Commands/ListCommandTest.php b/tests/Feature/Commands/ListCommandTest.php
new file mode 100644
index 0000000..666655a
--- /dev/null
+++ b/tests/Feature/Commands/ListCommandTest.php
@@ -0,0 +1,134 @@
+set('mcp.discovery.auto_discover', false);
+        $app['config']->set('mcp.discovery.definitions_file', null);
+    }
+
+    private function populateRegistry(Registry $registry)
+    {
+        $logger = new NullLogger;
+        $docBlockParser = new DocBlockParser($logger);
+        $schemaGenerator = new SchemaGenerator($docBlockParser);
+
+        $tool1 = ToolDefinition::fromReflection(
+            new \ReflectionMethod(ManualTestHandler::class, 'handleTool'),
+            'list_tool_1',
+            'Desc 1',
+            $docBlockParser,
+            $schemaGenerator
+        );
+        $resource1 = ResourceDefinition::fromReflection(
+            new \ReflectionMethod(ManualTestHandler::class, 'handleResource'),
+            'list_res_1',
+            'Desc Res 1',
+            'res://list/1',
+            'text/plain',
+            null,
+            [],
+            $docBlockParser
+        );
+        $registry->registerTool($tool1, true);
+        $registry->registerResource($resource1, true);
+    }
+
+    public function test_list_command_shows_all_types_by_default()
+    {
+        $server = $this->app->make(Server::class);
+        $this->populateRegistry($server->getRegistry());
+
+        $this->artisan('mcp:list')
+            ->expectsOutputToContain('Tools:')
+            ->expectsOutputToContain('list_tool_1')
+            ->expectsOutputToContain('Resources:')
+            ->expectsOutputToContain('res://list/1')
+            ->expectsOutputToContain('Prompts: None found.')
+            ->expectsOutputToContain('Templates: None found.')
+            ->assertSuccessful();
+    }
+
+    public function test_list_command_shows_specific_type_tools()
+    {
+        $server = $this->app->make(Server::class);
+        $this->populateRegistry($server->getRegistry());
+
+        $this->artisan('mcp:list tools')
+            ->expectsOutputToContain('Tools:')
+            ->expectsOutputToContain('list_tool_1')
+            ->doesntExpectOutputToContain('Resources:')
+            ->assertSuccessful();
+    }
+
+    public function test_list_command_json_output_is_correct()
+    {
+        $server = $this->app->make(Server::class);
+        $this->populateRegistry($server->getRegistry());
+
+        Artisan::call('mcp:list --json');
+
+        $output = Artisan::output();
+        $jsonData = json_decode($output, true);
+
+        $this->assertIsArray($jsonData);
+        $this->assertArrayHasKey('tools', $jsonData);
+        $this->assertArrayHasKey('resources', $jsonData);
+        $this->assertCount(1, $jsonData['tools']);
+        $this->assertEquals('list_tool_1', $jsonData['tools'][0]['toolName']);
+        $this->assertEquals('res://list/1', $jsonData['resources'][0]['uri']);
+    }
+
+    public function test_list_command_handles_empty_registry_for_type()
+    {
+        $server = $this->app->make(Server::class);
+        $this->populateRegistry($server->getRegistry());
+
+        $this->artisan('mcp:list prompts')
+            ->expectsOutputToContain('Prompts: None found.')
+            ->assertSuccessful();
+    }
+
+    public function test_list_command_warns_if_discovery_not_run_and_no_manual_elements()
+    {
+        $this->artisan('mcp:list')
+            ->expectsOutputToContain('No MCP elements are manually registered, and discovery has not run')
+            ->assertSuccessful();
+    }
+
+    public function test_list_command_warns_if_discovery_ran_but_no_elements_found()
+    {
+        $registryMock = $this->mock(Registry::class);
+        $registryMock->shouldReceive('hasElements')->andReturn(false);
+        $registryMock->shouldReceive('discoveryRanOrCached')->andReturn(true); // Key difference
+        $registryMock->shouldReceive('allTools')->andReturn(new ArrayObject());
+        $registryMock->shouldReceive('allResources')->andReturn(new ArrayObject());
+        $registryMock->shouldReceive('allPrompts')->andReturn(new ArrayObject());
+        $registryMock->shouldReceive('allResourceTemplates')->andReturn(new ArrayObject());
+
+
+        $serverMock = $this->mock(Server::class, function ($mock) use ($registryMock) {
+            $mock->shouldReceive('getRegistry')->andReturn($registryMock);
+        });
+        $this->app->instance(Server::class, $serverMock);
+
+        $this->artisan('mcp:list')
+            ->expectsOutputToContain('Discovery/cache load ran, but no MCP elements were found.')
+            ->assertSuccessful();
+    }
+}
diff --git a/tests/Feature/Commands/ServeCommandTest.php b/tests/Feature/Commands/ServeCommandTest.php
new file mode 100644
index 0000000..c572bf7
--- /dev/null
+++ b/tests/Feature/Commands/ServeCommandTest.php
@@ -0,0 +1,129 @@
+set('mcp.discovery.auto_discover', false);
+    }
+
+    protected function setHttpDedicatedTransportConfig($app)
+    {
+        $app['config']->set('mcp.transports.http_dedicated.enabled', true);
+        $app['config']->set('mcp.transports.http_dedicated.host', '0.0.0.0');
+        $app['config']->set('mcp.transports.http_dedicated.port', 8888);
+        $app['config']->set('mcp.transports.http_dedicated.path_prefix', 'configured_prefix');
+    }
+
+    protected function disableStdioTransport($app)
+    {
+        $app['config']->set('mcp.transports.stdio.enabled', false);
+    }
+
+    protected function disableHttpDedicatedTransport($app)
+    {
+        $app['config']->set('mcp.transports.http_dedicated.enabled', false);
+    }
+
+    public function test_serve_command_defaults_to_stdio_and_calls_server_listen()
+    {
+        $serverMock = $this->spy(Server::class);
+        $this->app->instance(Server::class, $serverMock);
+
+        $serverMock->shouldReceive('listen')->once()->with(
+            Mockery::type(StdioServerTransport::class)
+        );
+
+        $this->artisan('mcp:serve --transport=stdio')
+            ->expectsOutputToContain('Starting MCP server with STDIO transport...')
+            ->assertSuccessful();
+    }
+
+    public function test_serve_command_uses_http_transport_when_specified()
+    {
+        $serverMock = $this->spy(Server::class);
+        $this->app->instance(Server::class, $serverMock);
+
+        $serverMock->shouldReceive('listen')->once()->with(
+            Mockery::type(HttpServerTransport::class),
+        );
+
+        $this->artisan('mcp:serve --transport=http --host=localhost --port=9091 --path-prefix=mcp_test_http')
+            ->expectsOutputToContain('Starting MCP server with dedicated HTTP transport on http://localhost:9091 (prefix: /mcp_test_http)...')
+            ->assertSuccessful();
+    }
+
+    #[DefineEnvironment('setHttpDedicatedTransportConfig')]
+    public function test_serve_command_uses_http_transport_config_fallbacks()
+    {
+        $serverMock = $this->spy(Server::class);
+        $this->app->instance(Server::class, $serverMock);
+
+        $serverMock->shouldReceive('listen')->once()->with(
+            Mockery::on(function ($transport) {
+                $reflection = new \ReflectionClass($transport);
+                $hostProp = $reflection->getProperty('host');
+                $hostProp->setAccessible(true);
+                $portProp = $reflection->getProperty('port');
+                $portProp->setAccessible(true);
+                $prefixProp = $reflection->getProperty('mcpPathPrefix');
+                $prefixProp->setAccessible(true);
+
+                return $transport instanceof HttpServerTransport &&
+                    $hostProp->getValue($transport) === '0.0.0.0' &&
+                    $portProp->getValue($transport) === 8888 &&
+                    $prefixProp->getValue($transport) === 'configured_prefix';
+            }),
+        );
+
+        $this->artisan('mcp:serve --transport=http') // No CLI overrides
+            ->expectsOutputToContain('Starting MCP server with dedicated HTTP transport on http://0.0.0.0:8888 (prefix: /configured_prefix)...')
+            ->assertSuccessful();
+    }
+
+    #[DefineEnvironment('disableStdioTransport')]
+    public function test_serve_command_fails_if_stdio_disabled_in_config()
+    {
+        $this->artisan('mcp:serve --transport=stdio')
+            ->expectsOutputToContain('MCP STDIO transport is disabled in config/mcp.php.')
+            ->assertFailed();
+    }
+
+    #[DefineEnvironment('disableHttpDedicatedTransport')]
+    public function test_serve_command_fails_if_http_dedicated_disabled_in_config()
+    {
+        $this->artisan('mcp:serve --transport=http')
+            ->expectsOutputToContain('Dedicated MCP HTTP transport is disabled in config/mcp.php.')
+            ->assertFailed();
+    }
+
+    public function test_serve_command_fails_for_invalid_transport_option()
+    {
+        $this->artisan('mcp:serve --transport=websocket')
+            ->expectsOutputToContain("Invalid transport specified: websocket. Use 'stdio' or 'http'.")
+            ->assertFailed();
+    }
+
+    public function test_serve_command_handles_server_listen_exception()
+    {
+        $serverMock = $this->mock(Server::class, function ($mock) {
+            $mock->shouldReceive('listen')->andThrow(new \RuntimeException("Simulated listen failure!"));
+            $mock->shouldIgnoreMissing();
+        });
+        $this->app->instance(Server::class, $serverMock);
+
+
+        $this->artisan('mcp:serve --transport=stdio')
+            ->expectsOutputToContain('Simulated listen failure!')
+            ->assertFailed();
+    }
+}
diff --git a/tests/Feature/ManualRegistrationTest.php b/tests/Feature/ManualRegistrationTest.php
new file mode 100644
index 0000000..c253f85
--- /dev/null
+++ b/tests/Feature/ManualRegistrationTest.php
@@ -0,0 +1,136 @@
+description('A manually registered test tool.');
+        PHP;
+        $this->setMcpDefinitions($definitionsContent);
+
+        $registry = $this->app->make('mcp.registry');
+
+        $tool = $registry->findTool('manual_test_tool');
+
+        $this->assertInstanceOf(ToolDefinition::class, $tool);
+        $this->assertEquals('manual_test_tool', $tool->getName());
+        $this->assertEquals('A manually registered test tool.', $tool->getDescription());
+        $this->assertEquals(ManualTestHandler::class, $tool->getClassName());
+        $this->assertEquals('handleTool', $tool->getMethodName());
+        $this->assertArrayHasKey('input', $tool->getInputSchema()['properties']);
+        $this->assertEquals('string', $tool->getInputSchema()['properties']['input']['type']);
+    }
+
+    public function test_can_manually_register_tool_using_handler_only()
+    {
+        $definitionsContent = <<<'PHP'
+        setMcpDefinitions($definitionsContent);
+
+        $registry = $this->app->make('mcp.registry');
+        $tool = $registry->findTool('handleTool');
+
+        $this->assertNotNull($tool);
+        $this->assertEquals(ManualTestHandler::class, $tool->getClassName());
+        $this->assertEquals('handleTool', $tool->getMethodName());
+        $this->assertEquals('A sample tool handler.', $tool->getDescription());
+    }
+
+    public function test_can_manually_register_a_resource()
+    {
+        $definitionsContent = <<<'PHP'
+        name('manual_app_setting')
+            ->mimeType('application/json')
+            ->size(1024)
+            ->annotations(['category' => 'config']);
+        PHP;
+        $this->setMcpDefinitions($definitionsContent);
+
+        $registry = $this->app->make('mcp.registry');
+        $resource = $registry->findResourceByUri('manual://config/app-setting');
+
+        $this->assertInstanceOf(ResourceDefinition::class, $resource);
+        $this->assertEquals('manual_app_setting', $resource->getName());
+        $this->assertEquals('A sample resource handler.', $resource->getDescription());
+        $this->assertEquals('application/json', $resource->getMimeType());
+        $this->assertEquals(1024, $resource->getSize());
+        $this->assertEquals(['category' => 'config'], $resource->getAnnotations());
+        $this->assertEquals(ManualTestHandler::class, $resource->getClassName());
+        $this->assertEquals('handleResource', $resource->getMethodName());
+    }
+
+    public function test_can_manually_register_a_prompt_with_invokable_class_handler()
+    {
+        $definitionsContent = <<<'PHP'
+        description('A prompt handled by an invokable class.');
+        PHP;
+        $this->setMcpDefinitions($definitionsContent);
+
+        $registry = $this->app->make('mcp.registry');
+        $prompt = $registry->findPrompt('manual_invokable_prompt');
+
+        $this->assertInstanceOf(PromptDefinition::class, $prompt);
+        $this->assertEquals('manual_invokable_prompt', $prompt->getName());
+        $this->assertEquals('A prompt handled by an invokable class.', $prompt->getDescription());
+        $this->assertEquals(ManualTestInvokableHandler::class, $prompt->getClassName());
+        $this->assertEquals('__invoke', $prompt->getMethodName());
+    }
+
+    public function test_can_manually_register_a_resource_template_via_facade()
+    {
+        $definitionsContent = <<<'PHP'
+        name('manual_item_details_template')
+            ->mimeType('application/vnd.api+json');
+        PHP;
+        $this->setMcpDefinitions($definitionsContent);
+
+        $registry = $this->app->make('mcp.registry');
+        $templateMatch = $registry->findResourceTemplateByUri('manual://item/123/details');
+
+        $this->assertNotNull($templateMatch);
+        $template = $templateMatch['definition'];
+        $this->assertInstanceOf(ResourceTemplateDefinition::class, $template);
+        $this->assertEquals('manual://item/{itemId}/details', $template->getUriTemplate());
+        $this->assertEquals('manual_item_details_template', $template->getName());
+        $this->assertEquals('A sample resource template handler.', $template->getDescription());
+        $this->assertEquals('application/vnd.api+json', $template->getMimeType());
+        $this->assertEquals(ManualTestHandler::class, $template->getClassName());
+        $this->assertEquals('handleTemplate', $template->getMethodName());
+    }
+}
diff --git a/tests/Feature/McpServiceProviderTest.php b/tests/Feature/McpServiceProviderTest.php
new file mode 100644
index 0000000..2ef8d77
--- /dev/null
+++ b/tests/Feature/McpServiceProviderTest.php
@@ -0,0 +1,128 @@
+set('mcp.server.name', 'My Awesome MCP Test Server');
+        $app['config']->set('mcp.server.version', 'v2.test');
+        $app['config']->set('mcp.server.instructions', 'Test instructions from config.');
+        $app['config']->set('mcp.cache.ttl', 7200);
+    }
+
+    protected function disableAutoDiscovery($app)
+    {
+        $app['config']->set('mcp.discovery.auto_discover', false);
+    }
+
+    protected function disableHttpIntegratedRoutes($app)
+    {
+        $app['config']->set('mcp.transports.http_integrated.enabled', false);
+    }
+
+    public function test_provider_is_registered_and_boots_core_server_and_components()
+    {
+        $providers = $this->app->getLoadedProviders();
+        $this->assertArrayHasKey(McpServiceProvider::class, $providers);
+        $this->assertTrue($providers[McpServiceProvider::class]);
+
+        $server1 = $this->app->make('mcp.server');
+        $this->assertInstanceOf(Server::class, $server1);
+
+        $server2 = $this->app->make(Server::class);
+        $this->assertSame($server1, $server2, "Server should be a singleton.");
+
+        $this->assertInstanceOf(Registry::class, $server1->getRegistry());
+        $this->assertInstanceOf(Protocol::class, $server1->getProtocol());
+        $this->assertInstanceOf(ClientStateManager::class, $server1->getClientStateManager());
+        $this->assertInstanceOf(McpRegistrar::class, $this->app->make('mcp.registrar'));
+        $this->assertInstanceOf(LaravelHttpTransport::class, $this->app->make(LaravelHttpTransport::class));
+
+        $configVO = $server1->getConfiguration();
+        $this->assertInstanceOf(LoggerInterface::class, $configVO->logger);
+        $this->assertInstanceOf(LoopInterface::class, $configVO->loop);
+        $this->assertInstanceOf(CacheInterface::class, $configVO->cache);
+        $this->assertInstanceOf(Container::class, $configVO->container);
+    }
+
+    #[DefineEnvironment('useTestServerConfig')]
+    public function test_configuration_values_are_correctly_applied_to_server()
+    {
+        $server = $this->app->make('mcp.server');
+        $configVO = $server->getConfiguration();
+
+        $this->assertEquals('My Awesome MCP Test Server', $configVO->serverName);
+        $this->assertEquals('v2.test', $configVO->serverVersion);
+        $this->assertEquals('Test instructions from config.', $configVO->capabilities->instructions);
+        $this->assertEquals(7200, $configVO->definitionCacheTtl);
+        $this->assertTrue($configVO->capabilities->promptsEnabled);
+    }
+
+    public function test_auto_discovery_is_triggered_when_enabled()
+    {
+        $server = $this->app->make('mcp.server');
+        $registry = $server->getRegistry();
+        $this->assertNotNull($registry->findTool('stub_tool_one'), "Discovered tool 'stub_tool_one' not found in registry.");
+    }
+
+    #[DefineEnvironment('disableAutoDiscovery')]
+    public function test_auto_discovery_is_skipped_if_disabled()
+    {
+        $server = $this->app->make('mcp.server');
+        $registry = $server->getRegistry();
+
+        $this->assertNull($registry->findTool('stub_tool_one'), "Tool 'stub_tool_one' should not be found if auto-discovery is off.");
+    }
+
+    public function test_event_notifiers_are_set_on_core_registry_and_dispatch_laravel_events()
+    {
+        Event::fake();
+
+        $server = $this->app->make('mcp.server');
+        $registry = $server->getRegistry();
+
+        $newToolName = 'dynamic_tool_for_event_test';
+        $this->assertNull($registry->findTool($newToolName));
+
+        $registry->registerTool(
+            new ToolDefinition(ManualTestHandler::class, 'handleTool', $newToolName, 'd', [])
+        );
+
+        Event::assertDispatched(ToolsListChanged::class);
+    }
+
+    public function test_http_integrated_routes_are_registered_if_enabled()
+    {
+        $this->assertTrue(Route::has('mcp.sse'));
+        $this->assertTrue(Route::has('mcp.message'));
+        $this->assertStringContainsString('/mcp/sse', route('mcp.sse'));
+    }
+
+    #[DefineEnvironment('disableHttpIntegratedRoutes')]
+    public function test_http_integrated_routes_are_not_registered_if_disabled()
+    {
+        $this->assertFalse(Route::has('mcp.sse'));
+        $this->assertFalse(Route::has('mcp.message'));
+    }
+}
diff --git a/tests/Pest.php b/tests/Pest.php
new file mode 100644
index 0000000..c0cde01
--- /dev/null
+++ b/tests/Pest.php
@@ -0,0 +1,5 @@
+in('Feature', 'Unit');
diff --git a/tests/Stubs/App/Mcp/DiscoverableTool.php b/tests/Stubs/App/Mcp/DiscoverableTool.php
new file mode 100644
index 0000000..fac4183
--- /dev/null
+++ b/tests/Stubs/App/Mcp/DiscoverableTool.php
@@ -0,0 +1,14 @@
+ 'manual resource content', 'timestamp' => time()];
+    }
+
+    /**
+     * A sample prompt handler.
+     * @param string $topic The topic for the prompt.
+     * @return array Prompt messages.
+     */
+    public function handlePrompt(string $topic, int $count = 1): array
+    {
+        return [
+            ['role' => 'user', 'content' => "Generate {$count} idea(s) about {$topic}."]
+        ];
+    }
+
+    /**
+     * A sample resource template handler.
+     * @param string $itemId The ID from the URI.
+     * @return array Item details.
+     */
+    public function handleTemplate(string $itemId): array
+    {
+        return ['id' => $itemId, 'name' => "Item {$itemId}", 'source' => 'manual_template'];
+    }
+
+    public function anotherTool(): void {} // For testing name override
+}
diff --git a/tests/Stubs/App/Mcp/ManualTestInvokableHandler.php b/tests/Stubs/App/Mcp/ManualTestInvokableHandler.php
new file mode 100644
index 0000000..9a6a99c
--- /dev/null
+++ b/tests/Stubs/App/Mcp/ManualTestInvokableHandler.php
@@ -0,0 +1,18 @@
+ 'user', 'content' => "Invokable prompt responding to: {$query}"]
+        ];
+    }
+}
diff --git a/tests/Stubs/routes/mcp-definitions.php b/tests/Stubs/routes/mcp-definitions.php
new file mode 100644
index 0000000..b97e20c
--- /dev/null
+++ b/tests/Stubs/routes/mcp-definitions.php
@@ -0,0 +1 @@
+definitionsFilePath = __DIR__ . '/Stubs/routes/mcp-definitions.php';
+
+        $app['config']->set('mcp.discovery.definitions_file', $this->definitionsFilePath);
+        $app['config']->set('mcp.discovery.directories', ['App/Mcp']);
+        $app['config']->set('mcp.discovery.base_path', __DIR__ . '/Stubs');
+    }
+
+    /**
+     * Overwrites the content of the test MCP definitions file and refreshes the application.
+     */
+    protected function setMcpDefinitions(string $content): void
+    {
+        file_put_contents($this->definitionsFilePath, $content);
+        $this->refreshApplication();
+    }
+
+    /**
+     * Creates a temporary MCP handler class file within the Stubs/App/Mcp directory.
+     */
+    protected function createStubMcpHandlerFile(string $className, string $content, string $subDir = 'App/Mcp'): string
+    {
+        $basePath = __DIR__ . '/Stubs/' . $subDir;
+        if (!is_dir($basePath)) {
+            mkdir($basePath, 0777, true);
+        }
+        $filePath = $basePath . '/' . $className . '.php';
+        file_put_contents($filePath, $content);
+        return $filePath;
+    }
+
+    protected function tearDown(): void
+    {
+        file_put_contents($this->definitionsFilePath, '