PHP code example of seolinkmap / waasup

1. Go to this page and download the library: Download seolinkmap/waasup library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

seolinkmap / waasup example snippets



Slim\Factory\AppFactory;
use Slim\Psr7\Factory\{ResponseFactory, StreamFactory};
use Seolinkmap\Waasup\Storage\DatabaseStorage;
use Seolinkmap\Waasup\Tools\Registry\ToolRegistry;
use Seolinkmap\Waasup\Prompts\Registry\PromptRegistry;
use Seolinkmap\Waasup\Resources\Registry\ResourceRegistry;
use Seolinkmap\Waasup\Integration\Slim\SlimMCPProvider;

// Database connection
$pdo = new PDO('mysql:host=localhost;dbname=mcp_server', $user, $pass, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);

// Initialize components
$storage = new DatabaseStorage($pdo, ['table_prefix' => 'mcp_']);
$toolRegistry = new ToolRegistry();
$promptRegistry = new PromptRegistry();
$resourceRegistry = new ResourceRegistry();
$responseFactory = new ResponseFactory();
$streamFactory = new StreamFactory();

// Configuration
$config = [
    'server_info' => [
        'name' => 'My MCP Server',
        'version' => '1.0.0'
    ],
    'auth' => [
        'context_types' => ['agency'],
        'base_url' => 'https://your-domain.com'
    ]
];

// Create MCP provider
$mcpProvider = new SlimMCPProvider(
    $storage,
    $toolRegistry,
    $promptRegistry,
    $resourceRegistry,
    $responseFactory,
    $streamFactory,
    $config
);

// Setup Slim app
$app = AppFactory::create();
$app->addErrorMiddleware(true, true, true);

// OAuth discovery endpoints
$app->get('/.well-known/oauth-authorization-server',
    [$mcpProvider, 'handleAuthDiscovery']);

// Main MCP endpoint
$app->map(['GET', 'POST', 'OPTIONS'], '/mcp/{agencyUuid}[/{sessID}]',
    [$mcpProvider, 'handleMCP'])
    ->add($mcpProvider->getAuthMiddleware());

$app->run();

use Seolinkmap\Waasup\Tools\Built\{PingTool, ServerInfoTool};

// Register built-in tools
$toolRegistry->registerTool(new PingTool());
$toolRegistry->registerTool(new ServerInfoTool($config));

$toolRegistry->register('get_weather', function($params, $context) {
    $location = $params['location'] ?? 'Unknown';

    // Your weather API logic here
    return [
        'location' => $location,
        'temperature' => '22°C',
        'condition' => 'Sunny',
        'timestamp' => date('c')
    ];
}, [
    'description' => 'Get weather information for a location',
    'inputSchema' => [
        'type' => 'object',
        'properties' => [
            'location' => [
                'type' => 'string',
                'description' => 'Location to get weather for'
            ]
        ],
        '

use Seolinkmap\Waasup\Tools\AbstractTool;

class DatabaseQueryTool extends AbstractTool
{
    private PDO $pdo;

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
        parent::__construct(
            'db_query',
            'Execute safe database queries',
            [
                'properties' => [
                    'query' => ['type' => 'string'],
                    'params' => ['type' => 'array']
                ],
                '

$promptRegistry->register('greeting', function($arguments, $context) {
    $name = $arguments['name'] ?? 'there';
    return [
        'description' => 'A friendly greeting prompt',
        'messages' => [
            [
                'role' => 'user',
                'content' => [
                    'type' => 'text',
                    'text' => "Please greet {$name} in a friendly way."
                ]
            ]
        ]
    ];
}, [
    'description' => 'Generate a friendly greeting prompt',
    'inputSchema' => [
        'type' => 'object',
        'properties' => [
            'name' => [
                'type' => 'string',
                'description' => 'Name of the person to greet'
            ]
        ]
    ]
]);

$resourceRegistry->register('server://status', function($uri, $context) {
    return [
        'contents' => [
            [
                'uri' => $uri,
                'mimeType' => 'application/json',
                'text' => json_encode([
                    'status' => 'healthy',
                    'timestamp' => date('c'),
                    'uptime' => time() - $_SERVER['REQUEST_TIME']
                ])
            ]
        ]
    ];
}, [
    'name' => 'Server Status',
    'description' => 'Current server status and health information',
    'mimeType' => 'application/json'
]);

$config = [
    'supported_versions' => ['2025-03-18', '2024-11-05'],
    'server_info' => [
        'name' => 'Your MCP Server',
        'version' => '1.0.0'
    ],
    'auth' => [
        'context_types' => ['agency', 'user'],
        'validate_scope' => true,
        '

$storage = new DatabaseStorage($pdo, [
    'table_prefix' => 'mcp_',
    'cleanup_interval' => 3600 // Clean expired data every hour
]);

use Seolinkmap\Waasup\Storage\MemoryStorage;

$storage = new MemoryStorage();

// Add test data
$storage->addContext('550e8400-e29b-41d4-a716-446655440000', 'agency', [
    'id' => 1,
    'name' => 'Test Agency',
    'active' => true
]);

$storage->addToken('test-token', [
    'agency_id' => 1,
    'scope' => 'mcp:read mcp:write',
    'expires_at' => time() + 3600,
    'revoked' => false
]);

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$logger = new Logger('mcp-server');
$logger->pushHandler(new StreamHandler('/var/log/mcp-server.log', Logger::INFO));

$mcpProvider = new SlimMCPProvider(
    $storage,
    $toolRegistry,
    $promptRegistry,
    $resourceRegistry,
    $responseFactory,
    $streamFactory,
    $config,
    $logger // Pass logger here
);

class CustomLogger implements Psr\Log\LoggerInterface
{
    public function info($message, array $context = []): void
    {
        // Your custom logging logic
        file_put_contents('/tmp/mcp.log',
            date('Y-m-d H:i:s') . " [INFO] $message " . json_encode($context) . "\n",
            FILE_APPEND
        );
    }

    // Implement other LoggerInterface methods...
}

// Add to config/app.php providers array
'providers' => [
    // ...
    Seolinkmap\Waasup\Integration\Laravel\LaravelServiceProvider::class,
],



namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Seolinkmap\Waasup\MCPSaaSServer;
use Seolinkmap\Waasup\Storage\DatabaseStorage;
use Seolinkmap\Waasup\Tools\Registry\ToolRegistry;
use Seolinkmap\Waasup\Prompts\Registry\PromptRegistry;
use Seolinkmap\Waasup\Resources\Registry\ResourceRegistry;
use Seolinkmap\Waasup\Integration\Laravel\LaravelMCPProvider;

class MCPController extends Controller
{
    public function handleMCP(Request $request, string $agencyUuid, ?string $sessID = null): Response
    {
        // Initialize storage with Laravel's database connection
        $storage = new DatabaseStorage(DB::connection()->getPdo(), ['table_prefix' => 'mcp_']);

        // Initialize registries
        $toolRegistry = new ToolRegistry();
        $promptRegistry = new PromptRegistry();
        $resourceRegistry = new ResourceRegistry();

        // Register your tools
        $toolRegistry->register('get_user_count', function($params, $context) {
            return ['user_count' => \App\Models\User::count()];
        }, [
            'description' => 'Get total user count',
            'inputSchema' => ['type' => 'object']
        ]);

        // Configuration
        $config = [
            'server_info' => [
                'name' => config('app.name') . ' MCP Server',
                'version' => '1.0.0'
            ],
            'auth' => [
                'context_types' => ['agency'],
                'base_url' => config('app.url')
            ]
        ];

        // Create and use the Laravel MCP provider
        $mcpProvider = app(LaravelMCPProvider::class);

        return $mcpProvider->handleMCP($request);
    }

    public function handleAuthDiscovery(Request $request): Response
    {
        $mcpProvider = app(LaravelMCPProvider::class);
        return $mcpProvider->handleAuthDiscovery($request);
    }
}

// In routes/web.php or routes/api.php
use App\Http\Controllers\MCPController;

// OAuth discovery endpoints
Route::get('/.well-known/oauth-authorization-server', [MCPController::class, 'handleAuthDiscovery']);

// MCP endpoints with authentication middleware
Route::group(['middleware' => ['mcp.auth']], function () {
    Route::match(['GET', 'POST'], '/mcp/{agencyUuid}/{sessID?}', [MCPController::class, 'handleMCP']);
});

// Create a dedicated MCP service


namespace App\Services;

use Seolinkmap\Waasup\MCPSaaSServer;
use Seolinkmap\Waasup\Storage\DatabaseStorage;
use Seolinkmap\Waasup\Tools\Registry\ToolRegistry;

class MCPService
{
    private MCPSaaSServer $server;

    public function __construct()
    {
        $storage = new DatabaseStorage(\DB::connection()->getPdo());
        $toolRegistry = new ToolRegistry();

        // Register Laravel-specific tools
        $this->registerLaravelTools($toolRegistry);

        $config = [
            'server_info' => [
                'name' => config('app.name') . ' MCP API',
                'version' => config('app.version', '1.0.0')
            ],
            'auth' => [
                'base_url' => config('app.url')
            ]
        ];

        $this->server = new MCPSaaSServer($storage, $toolRegistry, /*...*/, $config);
    }

    private function registerLaravelTools(ToolRegistry $registry): void
    {
        // Register tools that use Laravel features
        $registry->register('get_models', function($params, $context) {
            return [
                'users' => \App\Models\User::count(),
                'posts' => \App\Models\Post::count(),
            ];
        });

        $registry->register('send_notification', function($params, $context) {
            // Use Laravel's notification system
            \Notification::send($user, new \App\Notifications\MCPNotification($params));
            return ['status' => 'sent'];
        });
    }

    public function getServer(): MCPSaaSServer
    {
        return $this->server;
    }
}

use Seolinkmap\Waasup\MCPSaaSServer;

$server = new MCPSaaSServer($storage, $toolRegistry, $promptRegistry, $resourceRegistry, $config, $logger);

// Handle PSR-7 request
$response = $server->handle($request, $response);

class CustomAuthMiddleware extends AuthMiddleware
{
    protected function extractContextId(Request $request): ?string
    {
        // Custom logic to extract context from request
        $customHeader = $request->getHeaderLine('X-Custom-Context');
        return $customHeader ?: parent::extractContextId($request);
    }
}

$toolRegistry->register('dangerous_operation', $handler, [
    'description' => 'Performs a dangerous operation',
    'annotations' => [
        'readOnlyHint' => false,
        'destructiveHint' => true,
        'idempotentHint' => false
    ]
]);

// Custom session handling
$server->addTool('get_session', function($params, $context) {
    $sessionData = $context['session_data'] ?? [];
    return ['session' => $sessionData];
});

use Seolinkmap\Waasup\Tools\Built\PingTool;

// Register the ping tool
$toolRegistry->registerTool(new PingTool());
// Tests connectivity and returns server timestamp

use Seolinkmap\Waasup\Tools\Built\ServerInfoTool;

// Register the server info tool
$toolRegistry->registerTool(new ServerInfoTool($config));
// Returns server configuration and capabilities

use PHPUnit\Framework\TestCase;
use Seolinkmap\Waasup\Storage\MemoryStorage;

class MCPServerTest extends TestCase
{
    public function testToolExecution()
    {
        $storage = new MemoryStorage();
        $toolRegistry = new ToolRegistry();

        $toolRegistry->register('test_tool', function($params) {
            return ['result' => 'success'];
        });

        $result = $toolRegistry->execute('test_tool', []);
        $this->assertEquals(['result' => 'success'], $result);
    }
}
http
GET /oauth/authorize?response_type=code&client_id=YOUR_CLIENT&redirect_uri=YOUR_CALLBACK
http
POST /oauth/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=AUTH_CODE&client_id=YOUR_CLIENT
dockerfile
FROM php:8.1-fpm-alpine

RUN docker-php-ext-install pdo pdo_mysql

COPY . /var/www/html
WORKDIR /var/www/html

RUN composer install --no-dev --optimize-autoloader

EXPOSE 9000
CMD ["php-fpm"]
nginx
server {
    listen 80;
    server_name your-mcp-server.com;
    root /var/www/html/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;