npx skills add https://github.com/github/awesome-copilot --skill php-mcp-server-generatorHow Php Mcp Server Generator fits into a Paperclip company.
Php Mcp Server Generator drops into any Paperclip agent that handles this kind of work. Assign it to a specialist inside a pre-configured PaperclipOrg company and the skill becomes available on every heartbeat — no prompt engineering, no tool wiring.
Pre-configured AI company — 18 agents, 18 skills, one-time purchase.
SKILL.md522 linesExpandCollapse
---name: php-mcp-server-generatordescription: 'Generate a complete PHP Model Context Protocol server project with tools, resources, prompts, and tests using the official PHP SDK'--- # PHP MCP Server Generator You are a PHP MCP server generator. Create a complete, production-ready PHP MCP server project using the official PHP SDK. ## Project Requirements Ask the user for:1. **Project name** (e.g., "my-mcp-server")2. **Server description** (e.g., "A file management MCP server")3. **Transport type** (stdio, http, or both)4. **Tools to include** (e.g., "file read", "file write", "list directory")5. **Whether to include resources and prompts**6. **PHP version** (8.2+ required) ## Project Structure ```{project-name}/├── composer.json├── .gitignore├── README.md├── server.php├── src/│ ├── Tools/│ │ └── {ToolClass}.php│ ├── Resources/│ │ └── {ResourceClass}.php│ ├── Prompts/│ │ └── {PromptClass}.php│ └── Providers/│ └── {CompletionProvider}.php└── tests/ └── ToolsTest.php``` ## File Templates ### composer.json ```json{ "name": "your-org/{project-name}", "description": "{Server description}", "type": "project", "require": { "php": "^8.2", "mcp/sdk": "^0.1" }, "require-dev": { "phpunit/phpunit": "^10.0", "symfony/cache": "^6.4" }, "autoload": { "psr-4": { "App\\\\": "src/" } }, "autoload-dev": { "psr-4": { "Tests\\\\": "tests/" } }, "config": { "optimize-autoloader": true, "preferred-install": "dist", "sort-packages": true }}``` ### .gitignore ```/vendor/cachecomposer.lock.phpunit.cachephpstan.neon``` ### README.md ```markdown# {Project Name} {Server description} ## Requirements - PHP 8.2 or higher- Composer ## Installation ```bashcomposer install``` ## Usage ### Start Server (Stdio) ```bashphp server.php``` ### Configure in Claude Desktop ```json{ "mcpServers": { "{project-name}": { "command": "php", "args": ["/absolute/path/to/server.php"] } }}``` ## Testing ```bashvendor/bin/phpunit``` ## Tools - **{tool_name}**: {Tool description} ## Development Test with MCP Inspector: ```bashnpx @modelcontextprotocol/inspector php server.php`````` ### server.php ```php#!/usr/bin/env php<?php declare(strict_types=1); require_once __DIR__ . '/vendor/autoload.php'; use Mcp\Server;use Mcp\Server\Transport\StdioTransport;use Symfony\Component\Cache\Adapter\FilesystemAdapter;use Symfony\Component\Cache\Psr16Cache; // Setup cache for discovery$cache = new Psr16Cache(new FilesystemAdapter('mcp-discovery', 3600, __DIR__ . '/cache')); // Build server with discovery$server = Server::builder() ->setServerInfo('{Project Name}', '1.0.0') ->setDiscovery( basePath: __DIR__, scanDirs: ['src'], excludeDirs: ['vendor', 'tests', 'cache'], cache: $cache ) ->build(); // Run with stdio transport$transport = new StdioTransport(); $server->run($transport);``` ### src/Tools/ExampleTool.php ```php<?php declare(strict_types=1); namespace App\Tools; use Mcp\Capability\Attribute\McpTool;use Mcp\Capability\Attribute\Schema; class ExampleTool{ /** * Performs a greeting with the provided name. * * @param string $name The name to greet * @return string A greeting message */ #[McpTool] public function greet(string $name): string { return "Hello, {$name}!"; } /** * Performs arithmetic calculations. */ #[McpTool(name: 'calculate')] public function performCalculation( float $a, float $b, #[Schema(pattern: '^(add|subtract|multiply|divide)$')] string $operation ): float { return match($operation) { 'add' => $a + $b, 'subtract' => $a - $b, 'multiply' => $a * $b, 'divide' => $b != 0 ? $a / $b : throw new \InvalidArgumentException('Division by zero'), default => throw new \InvalidArgumentException('Invalid operation') }; }}``` ### src/Resources/ConfigResource.php ```php<?php declare(strict_types=1); namespace App\Resources; use Mcp\Capability\Attribute\McpResource; class ConfigResource{ /** * Provides application configuration. */ #[McpResource( uri: 'config://app/settings', name: 'app_config', mimeType: 'application/json' )] public function getConfiguration(): array { return [ 'version' => '1.0.0', 'environment' => 'production', 'features' => [ 'logging' => true, 'caching' => true ] ]; }}``` ### src/Resources/DataProvider.php ```php<?php declare(strict_types=1); namespace App\Resources; use Mcp\Capability\Attribute\McpResourceTemplate; class DataProvider{ /** * Provides data by category and ID. */ #[McpResourceTemplate( uriTemplate: 'data://{category}/{id}', name: 'data_resource', mimeType: 'application/json' )] public function getData(string $category, string $id): array { // Example data retrieval return [ 'category' => $category, 'id' => $id, 'data' => "Sample data for {$category}/{$id}" ]; }}``` ### src/Prompts/PromptGenerator.php ```php<?php declare(strict_types=1); namespace App\Prompts; use Mcp\Capability\Attribute\McpPrompt;use Mcp\Capability\Attribute\CompletionProvider; class PromptGenerator{ /** * Generates a code review prompt. */ #[McpPrompt(name: 'code_review')] public function reviewCode( #[CompletionProvider(values: ['php', 'javascript', 'python', 'go', 'rust'])] string $language, string $code, #[CompletionProvider(values: ['performance', 'security', 'style', 'general'])] string $focus = 'general' ): array { return [ [ 'role' => 'assistant', 'content' => 'You are an expert code reviewer specializing in best practices and optimization.' ], [ 'role' => 'user', 'content' => "Review this {$language} code with focus on {$focus}:\n\n```{$language}\n{$code}\n```" ] ]; } /** * Generates documentation prompt. */ #[McpPrompt] public function generateDocs(string $code, string $style = 'detailed'): array { return [ [ 'role' => 'user', 'content' => "Generate {$style} documentation for:\n\n```\n{$code}\n```" ] ]; }}``` ### tests/ToolsTest.php ```php<?php declare(strict_types=1); namespace Tests; use PHPUnit\Framework\TestCase;use App\Tools\ExampleTool; class ToolsTest extends TestCase{ private ExampleTool $tool; protected function setUp(): void { $this->tool = new ExampleTool(); } public function testGreet(): void { $result = $this->tool->greet('World'); $this->assertSame('Hello, World!', $result); } public function testCalculateAdd(): void { $result = $this->tool->performCalculation(5, 3, 'add'); $this->assertSame(8.0, $result); } public function testCalculateDivide(): void { $result = $this->tool->performCalculation(10, 2, 'divide'); $this->assertSame(5.0, $result); } public function testCalculateDivideByZero(): void { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Division by zero'); $this->tool->performCalculation(10, 0, 'divide'); } public function testCalculateInvalidOperation(): void { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Invalid operation'); $this->tool->performCalculation(5, 3, 'modulo'); }}``` ### phpunit.xml.dist ```xml<?xml version="1.0" encoding="UTF-8"?><phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true"> <testsuites> <testsuite name="Test Suite"> <directory>tests</directory> </testsuite> </testsuites> <coverage> <include> <directory suffix=".php">src</directory> </include> </coverage></phpunit>``` ## Implementation Guidelines 1. **Use PHP Attributes**: Leverage `#[McpTool]`, `#[McpResource]`, `#[McpPrompt]` for clean code2. **Type Declarations**: Use strict types (`declare(strict_types=1);`) in all files3. **PSR-12 Coding Standard**: Follow PHP-FIG standards4. **Schema Validation**: Use `#[Schema]` attributes for parameter validation5. **Error Handling**: Throw specific exceptions with clear messages6. **Testing**: Write PHPUnit tests for all tools7. **Documentation**: Use PHPDoc blocks for all methods8. **Caching**: Always use PSR-16 cache for discovery in production ## Tool Patterns ### Simple Tool```php#[McpTool]public function simpleAction(string $input): string{ return "Processed: {$input}";}``` ### Tool with Validation```php#[McpTool]public function validateEmail( #[Schema(format: 'email')] string $email): bool { return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;}``` ### Tool with Enum```phpenum Status: string { case ACTIVE = 'active'; case INACTIVE = 'inactive';} #[McpTool]public function setStatus(string $id, Status $status): array{ return ['id' => $id, 'status' => $status->value];}``` ## Resource Patterns ### Static Resource```php#[McpResource(uri: 'config://settings', mimeType: 'application/json')]public function getSettings(): array{ return ['key' => 'value'];}``` ### Dynamic Resource```php#[McpResourceTemplate(uriTemplate: 'user://{id}')]public function getUser(string $id): array{ return $this->users[$id] ?? throw new \RuntimeException('User not found');}``` ## Running the Server ```bash# Install dependenciescomposer install # Run testsvendor/bin/phpunit # Start serverphp server.php # Test with inspectornpx @modelcontextprotocol/inspector php server.php``` ## Claude Desktop Configuration ```json{ "mcpServers": { "{project-name}": { "command": "php", "args": ["/absolute/path/to/server.php"] } }}``` Now generate the complete project based on user requirements!Add Educational Comments
Takes any code file and transforms it into a teaching resource by adding educational comments that explain syntax, design choices, and language concepts. Automa
Agent Governance
When your AI agents start calling APIs, touching databases, or executing shell commands, you need guardrails before something goes sideways. This gives you comp
Agentic Eval
Implements self-critique loops where Claude generates output, evaluates it against your criteria, then refines based on its own feedback. Includes evaluator-opt