{"id":"abc2907d-07a1-4420-8fbd-fa2298361ddb","shortId":"Mh2aNp","kind":"skill","title":"php-mcp-server-generator","tagline":"Generate a complete PHP Model Context Protocol server project with tools, resources, prompts, and tests using the official PHP SDK","description":"# PHP MCP Server Generator\n\nYou are a PHP MCP server generator. Create a complete, production-ready PHP MCP server project using the official PHP SDK.\n\n## Project Requirements\n\nAsk the user for:\n1. **Project name** (e.g., \"my-mcp-server\")\n2. **Server description** (e.g., \"A file management MCP server\")\n3. **Transport type** (stdio, http, or both)\n4. **Tools to include** (e.g., \"file read\", \"file write\", \"list directory\")\n5. **Whether to include resources and prompts**\n6. **PHP version** (8.2+ required)\n\n## Project Structure\n\n```\n{project-name}/\n├── composer.json\n├── .gitignore\n├── README.md\n├── server.php\n├── src/\n│   ├── Tools/\n│   │   └── {ToolClass}.php\n│   ├── Resources/\n│   │   └── {ResourceClass}.php\n│   ├── Prompts/\n│   │   └── {PromptClass}.php\n│   └── Providers/\n│       └── {CompletionProvider}.php\n└── tests/\n    └── ToolsTest.php\n```\n\n## File Templates\n\n### composer.json\n\n```json\n{\n    \"name\": \"your-org/{project-name}\",\n    \"description\": \"{Server description}\",\n    \"type\": \"project\",\n    \"require\": {\n        \"php\": \"^8.2\",\n        \"mcp/sdk\": \"^0.1\"\n    },\n    \"require-dev\": {\n        \"phpunit/phpunit\": \"^10.0\",\n        \"symfony/cache\": \"^6.4\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"App\\\\\\\\\": \"src/\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"Tests\\\\\\\\\": \"tests/\"\n        }\n    },\n    \"config\": {\n        \"optimize-autoloader\": true,\n        \"preferred-install\": \"dist\",\n        \"sort-packages\": true\n    }\n}\n```\n\n### .gitignore\n\n```\n/vendor\n/cache\ncomposer.lock\n.phpunit.cache\nphpstan.neon\n```\n\n### README.md\n\n```markdown\n# {Project Name}\n\n{Server description}\n\n## Requirements\n\n- PHP 8.2 or higher\n- Composer\n\n## Installation\n\n```bash\ncomposer install\n```\n\n## Usage\n\n### Start Server (Stdio)\n\n```bash\nphp server.php\n```\n\n### Configure in Claude Desktop\n\n```json\n{\n  \"mcpServers\": {\n    \"{project-name}\": {\n      \"command\": \"php\",\n      \"args\": [\"/absolute/path/to/server.php\"]\n    }\n  }\n}\n```\n\n## Testing\n\n```bash\nvendor/bin/phpunit\n```\n\n## Tools\n\n- **{tool_name}**: {Tool description}\n\n## Development\n\nTest with MCP Inspector:\n\n```bash\nnpx @modelcontextprotocol/inspector php server.php\n```\n```\n\n### server.php\n\n```php\n#!/usr/bin/env php\n<?php\n\ndeclare(strict_types=1);\n\nrequire_once __DIR__ . '/vendor/autoload.php';\n\nuse Mcp\\Server;\nuse Mcp\\Server\\Transport\\StdioTransport;\nuse Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter;\nuse Symfony\\Component\\Cache\\Psr16Cache;\n\n// Setup cache for discovery\n$cache = new Psr16Cache(new FilesystemAdapter('mcp-discovery', 3600, __DIR__ . '/cache'));\n\n// Build server with discovery\n$server = Server::builder()\n    ->setServerInfo('{Project Name}', '1.0.0')\n    ->setDiscovery(\n        basePath: __DIR__,\n        scanDirs: ['src'],\n        excludeDirs: ['vendor', 'tests', 'cache'],\n        cache: $cache\n    )\n    ->build();\n\n// Run with stdio transport\n$transport = new StdioTransport();\n\n$server->run($transport);\n```\n\n### src/Tools/ExampleTool.php\n\n```php\n<?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Tools;\n\nuse Mcp\\Capability\\Attribute\\McpTool;\nuse Mcp\\Capability\\Attribute\\Schema;\n\nclass ExampleTool\n{\n    /**\n     * Performs a greeting with the provided name.\n     * \n     * @param string $name The name to greet\n     * @return string A greeting message\n     */\n    #[McpTool]\n    public function greet(string $name): string\n    {\n        return \"Hello, {$name}!\";\n    }\n    \n    /**\n     * Performs arithmetic calculations.\n     */\n    #[McpTool(name: 'calculate')]\n    public function performCalculation(\n        float $a,\n        float $b,\n        #[Schema(pattern: '^(add|subtract|multiply|divide)$')]\n        string $operation\n    ): float {\n        return match($operation) {\n            'add' => $a + $b,\n            'subtract' => $a - $b,\n            'multiply' => $a * $b,\n            'divide' => $b != 0 ? $a / $b : \n                throw new \\InvalidArgumentException('Division by zero'),\n            default => throw new \\InvalidArgumentException('Invalid operation')\n        };\n    }\n}\n```\n\n### src/Resources/ConfigResource.php\n\n```php\n<?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Resources;\n\nuse Mcp\\Capability\\Attribute\\McpResource;\n\nclass ConfigResource\n{\n    /**\n     * Provides application configuration.\n     */\n    #[McpResource(\n        uri: 'config://app/settings',\n        name: 'app_config',\n        mimeType: 'application/json'\n    )]\n    public function getConfiguration(): array\n    {\n        return [\n            'version' => '1.0.0',\n            'environment' => 'production',\n            'features' => [\n                'logging' => true,\n                'caching' => true\n            ]\n        ];\n    }\n}\n```\n\n### src/Resources/DataProvider.php\n\n```php\n<?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Resources;\n\nuse Mcp\\Capability\\Attribute\\McpResourceTemplate;\n\nclass DataProvider\n{\n    /**\n     * Provides data by category and ID.\n     */\n    #[McpResourceTemplate(\n        uriTemplate: 'data://{category}/{id}',\n        name: 'data_resource',\n        mimeType: 'application/json'\n    )]\n    public function getData(string $category, string $id): array\n    {\n        // Example data retrieval\n        return [\n            'category' => $category,\n            'id' => $id,\n            'data' => \"Sample data for {$category}/{$id}\"\n        ];\n    }\n}\n```\n\n### src/Prompts/PromptGenerator.php\n\n```php\n<?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Prompts;\n\nuse Mcp\\Capability\\Attribute\\McpPrompt;\nuse Mcp\\Capability\\Attribute\\CompletionProvider;\n\nclass PromptGenerator\n{\n    /**\n     * Generates a code review prompt.\n     */\n    #[McpPrompt(name: 'code_review')]\n    public function reviewCode(\n        #[CompletionProvider(values: ['php', 'javascript', 'python', 'go', 'rust'])]\n        string $language,\n        string $code,\n        #[CompletionProvider(values: ['performance', 'security', 'style', 'general'])]\n        string $focus = 'general'\n    ): array {\n        return [\n            [\n                'role' => 'assistant',\n                'content' => 'You are an expert code reviewer specializing in best practices and optimization.'\n            ],\n            [\n                'role' => 'user',\n                'content' => \"Review this {$language} code with focus on {$focus}:\\n\\n```{$language}\\n{$code}\\n```\"\n            ]\n        ];\n    }\n    \n    /**\n     * Generates documentation prompt.\n     */\n    #[McpPrompt]\n    public function generateDocs(string $code, string $style = 'detailed'): array\n    {\n        return [\n            [\n                'role' => 'user',\n                'content' => \"Generate {$style} documentation for:\\n\\n```\\n{$code}\\n```\"\n            ]\n        ];\n    }\n}\n```\n\n### tests/ToolsTest.php\n\n```php\n<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests;\n\nuse PHPUnit\\Framework\\TestCase;\nuse App\\Tools\\ExampleTool;\n\nclass ToolsTest extends TestCase\n{\n    private ExampleTool $tool;\n    \n    protected function setUp(): void\n    {\n        $this->tool = new ExampleTool();\n    }\n    \n    public function testGreet(): void\n    {\n        $result = $this->tool->greet('World');\n        $this->assertSame('Hello, World!', $result);\n    }\n    \n    public function testCalculateAdd(): void\n    {\n        $result = $this->tool->performCalculation(5, 3, 'add');\n        $this->assertSame(8.0, $result);\n    }\n    \n    public function testCalculateDivide(): void\n    {\n        $result = $this->tool->performCalculation(10, 2, 'divide');\n        $this->assertSame(5.0, $result);\n    }\n    \n    public function testCalculateDivideByZero(): void\n    {\n        $this->expectException(\\InvalidArgumentException::class);\n        $this->expectExceptionMessage('Division by zero');\n        \n        $this->tool->performCalculation(10, 0, 'divide');\n    }\n    \n    public function testCalculateInvalidOperation(): void\n    {\n        $this->expectException(\\InvalidArgumentException::class);\n        $this->expectExceptionMessage('Invalid operation');\n        \n        $this->tool->performCalculation(5, 3, 'modulo');\n    }\n}\n```\n\n### phpunit.xml.dist\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:noNamespaceSchemaLocation=\"vendor/phpunit/phpunit/phpunit.xsd\"\n         bootstrap=\"vendor/autoload.php\"\n         colors=\"true\">\n    <testsuites>\n        <testsuite name=\"Test Suite\">\n            <directory>tests</directory>\n        </testsuite>\n    </testsuites>\n    <coverage>\n        <include>\n            <directory suffix=\".php\">src</directory>\n        </include>\n    </coverage>\n</phpunit>\n```\n\n## Implementation Guidelines\n\n1. **Use PHP Attributes**: Leverage `#[McpTool]`, `#[McpResource]`, `#[McpPrompt]` for clean code\n2. **Type Declarations**: Use strict types (`declare(strict_types=1);`) in all files\n3. **PSR-12 Coding Standard**: Follow PHP-FIG standards\n4. **Schema Validation**: Use `#[Schema]` attributes for parameter validation\n5. **Error Handling**: Throw specific exceptions with clear messages\n6. **Testing**: Write PHPUnit tests for all tools\n7. **Documentation**: Use PHPDoc blocks for all methods\n8. **Caching**: Always use PSR-16 cache for discovery in production\n\n## Tool Patterns\n\n### Simple Tool\n```php\n#[McpTool]\npublic function simpleAction(string $input): string\n{\n    return \"Processed: {$input}\";\n}\n```\n\n### Tool with Validation\n```php\n#[McpTool]\npublic function validateEmail(\n    #[Schema(format: 'email')]\n    string $email\n): bool {\n    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;\n}\n```\n\n### Tool with Enum\n```php\nenum Status: string {\n    case ACTIVE = 'active';\n    case INACTIVE = 'inactive';\n}\n\n#[McpTool]\npublic function setStatus(string $id, Status $status): array\n{\n    return ['id' => $id, 'status' => $status->value];\n}\n```\n\n## Resource Patterns\n\n### Static Resource\n```php\n#[McpResource(uri: 'config://settings', mimeType: 'application/json')]\npublic function getSettings(): array\n{\n    return ['key' => 'value'];\n}\n```\n\n### Dynamic Resource\n```php\n#[McpResourceTemplate(uriTemplate: 'user://{id}')]\npublic function getUser(string $id): array\n{\n    return $this->users[$id] ?? throw new \\RuntimeException('User not found');\n}\n```\n\n## Running the Server\n\n```bash\n# Install dependencies\ncomposer install\n\n# Run tests\nvendor/bin/phpunit\n\n# Start server\nphp server.php\n\n# Test with inspector\nnpx @modelcontextprotocol/inspector php server.php\n```\n\n## Claude Desktop Configuration\n\n```json\n{\n  \"mcpServers\": {\n    \"{project-name}\": {\n      \"command\": \"php\",\n      \"args\": [\"/absolute/path/to/server.php\"]\n    }\n  }\n}\n```\n\nNow generate the complete project based on user requirements!","tags":["php","mcp","server","generator","awesome","copilot","github","agent-skills","agents","custom-agents","github-copilot","hacktoberfest"],"capabilities":["skill","source-github","skill-php-mcp-server-generator","topic-agent-skills","topic-agents","topic-awesome","topic-custom-agents","topic-github-copilot","topic-hacktoberfest","topic-prompt-engineering"],"categories":["awesome-copilot"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/github/awesome-copilot/php-mcp-server-generator","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add github/awesome-copilot","source_repo":"https://github.com/github/awesome-copilot","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 33270 github stars · SKILL.md body (10,598 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:52:19.570Z","embedding":null,"createdAt":"2026-04-18T20:26:03.100Z","updatedAt":"2026-05-18T18:52:19.570Z","lastSeenAt":"2026-05-18T18:52:19.570Z","tsv":"'-12':779 '-16':826 '-4':159,166 '/absolute/path/to/server.php':223,969 '/cache':184,288 '/usr/bin/env':244 '/vendor':183 '/vendor/autoload.php':254 '0':409,727 '0.1':149 '1':58,250,328,430,472,526,640,753,773 '1.0.0':299,458 '10':703,726 '10.0':154 '2':66,704,764 '3':75,689,745,777 '3600':286 '4':82,787 '5':93,688,744,796 '5.0':708 '6':100,805 '6.4':156 '7':813 '8':821 '8.0':693 '8.2':103,147,196 'activ':877,878 'adapt':267 'add':388,398,690 'alway':823 'app':160,330,432,448,474,528,648 'app/settings':446 'applic':442 'application/json':451,497,906 'arg':222,968 'arithmet':374 'array':455,505,574,620,890,910,925 'ask':54 'assertsam':676,692,707 'assist':577 'attribut':335,340,437,479,533,538,756,792 'autoload':157,163,172 'autoload-dev':162 'b':385,400,403,406,408,411 'base':975 'basepath':301 'bash':201,208,225,237,939 'best':587 'block':817 'bool':860 'build':289,311 'builder':295 'cach':266,272,275,278,308,309,310,464,822,827 'calcul':375,378 'capabl':334,339,436,478,532,537 'case':876,879 'categori':486,491,502,510,511,518 'class':342,439,481,540,651,717,736 'claud':213,958 'clean':762 'clear':803 'code':544,549,564,583,597,606,616,632,763,780 'command':220,966 'complet':8,39,973 'completionprovid':125,539,554,565 'compon':265,271 'compos':199,202,942 'composer.json':110,131 'composer.lock':185 'config':169,449 'configresourc':440 'configur':211,443,960 'content':578,593,624 'context':11 'creat':37 'data':484,494,507,514,516 'dataprovid':482 'declar':247,325,427,469,523,637,766,770 'default':418 'depend':941 'descript':68,140,142,193,231 'desktop':214,959 'detail':619 'dev':152,164 'develop':232 'dir':253,287,302 'directori':92 'discoveri':277,285,292,829 'dist':177 'divid':391,407,705,728 'divis':415,720 'document':609,627,814 'dynam':914 'e.g':61,69,86 'email':857,859,864,867 'enum':871,873 'environ':459 'error':797 'exampl':506 'exampletool':343,650,656,665 'except':801 'excludedir':305 'expectexcept':715,734 'expectexceptionmessag':719,738 'expert':582 'extend':653 'fals':868 'featur':461 'fig':785 'file':71,87,89,129,776 'filesystemadapt':268,282 'filter':862,865 'float':382,384,394 'focus':572,599,601 'follow':782 'format':856 'found':935 'framework':645 'function':365,380,453,499,552,613,659,667,681,696,711,730,839,853,884,908,921 'general':570,573 'generat':5,6,29,36,542,608,625,971 'generatedoc':614 'getconfigur':454 'getdata':500 'getset':909 'getus':922 'gitignor':111,182 'go':559 'greet':346,357,361,366,673 'guidelin':752 'handl':798 'hello':371,677 'higher':198 'http':79 'id':488,492,504,512,513,519,887,892,893,919,924,929 'implement':751 'inact':880,881 'includ':85,96 'input':842,846 'inspector':236,953 'instal':176,200,203,940,943 'invalid':422,739 'invalidargumentexcept':414,421,716,735 'javascript':557 'json':132,215,961 'key':912 'languag':562,596,604 'leverag':757 'list':91 'log':462 'manag':72 'markdown':189 'match':396 'mcp':3,27,34,44,64,73,235,256,259,284,333,338,435,477,531,536 'mcp-discoveri':283 'mcp/sdk':148 'mcpprompt':534,547,611,760 'mcpresourc':438,444,759,902 'mcpresourcetempl':480,489,917 'mcpserver':216,962 'mcptool':336,363,376,758,837,851,882 'messag':362,804 'method':820 'mimetyp':450,496,905 'model':10 'modelcontextprotocol/inspector':239,955 'modulo':746 'multipli':390,404 'my-mcp-serv':62 'n':602,603,605,607,629,630,631,633 'name':60,109,133,139,191,219,229,298,350,353,355,368,372,377,447,493,548,965 'namespac':329,431,473,527,641 'new':279,281,317,413,420,664,931 'npx':238,954 'offici':23,49 'oper':393,397,423,740 'optim':171,590 'optimize-autoload':170 'org':136 'packag':180 'param':351 'paramet':794 'pattern':387,833,898 'perform':344,373,567 'performcalcul':381,687,702,725,743 'php':2,9,24,26,33,43,50,101,117,120,123,126,146,195,209,221,240,243,245,246,323,324,425,426,467,468,521,522,556,635,636,755,784,836,850,872,901,916,949,956,967 'php-fig':783 'php-mcp-server-gener':1 'phpdoc':816 'phpstan.neon':187 'phpunit':644,808 'phpunit.cache':186 'phpunit.xml.dist':747 'phpunit/phpunit':153 'practic':588 'prefer':175 'preferred-instal':174 'privat':655 'process':845 'product':41,460,831 'production-readi':40 'project':14,46,52,59,105,108,138,144,190,218,297,964,974 'project-nam':107,137,217,963 'prompt':18,99,121,529,546,610 'promptclass':122 'promptgener':541 'protect':658 'protocol':12 'provid':124,349,441,483 'psr':158,165,778,825 'psr16cache':273,280 'public':364,379,452,498,551,612,666,680,695,710,729,838,852,883,907,920 'python':558 'read':88 'readi':42 'readme.md':112,188 'requir':53,104,145,151,194,251,978 'require-dev':150 'resourc':17,97,118,433,475,495,897,900,915 'resourceclass':119 'result':670,679,684,694,699,709 'retriev':508 'return':358,370,395,456,509,575,621,844,861,891,911,926 'review':545,550,584,594 'reviewcod':553 'role':576,591,622 'run':312,320,936,944 'runtimeexcept':932 'rust':560 'sampl':515 'scandir':303 'schema':341,386,788,791,855 'sdk':25,51 'secur':568 'server':4,13,28,35,45,65,67,74,141,192,206,257,260,290,293,294,319,938,948 'server.php':113,210,241,242,950,957 'set':904 'setdiscoveri':300 'setserverinfo':296 'setstatus':885 'setup':274,660 'simpl':834 'simpleact':840 'skill' 'skill-php-mcp-server-generator' 'sort':179 'sort-packag':178 'source-github' 'special':585 'specif':800 'src':114,161,304,750 'src/prompts/promptgenerator.php':520 'src/resources/configresource.php':424 'src/resources/dataprovider.php':466 'src/tools/exampletool.php':322 'standard':781,786 'start':205,947 'static':899 'status':874,888,889,894,895 'stdio':78,207,314 'stdiotransport':262,318 'strict':248,326,428,470,524,638,768,771 'string':352,359,367,369,392,501,503,561,563,571,615,617,841,843,858,875,886,923 'structur':106 'style':569,618,626 'subtract':389,401 'symfoni':264,270 'symfony/cache':155 'templat':130 'test':20,127,167,168,224,233,307,642,749,806,809,945,951 'testcalculateadd':682 'testcalculatedivid':697 'testcalculatedividebyzero':712 'testcalculateinvalidoper':731 'testcas':646,654 'testgreet':668 'tests/toolstest.php':634 'throw':412,419,799,930 'tool':16,83,115,227,228,230,331,649,657,663,672,686,701,724,742,812,832,835,847,869 'toolclass':116 'toolstest':652 'toolstest.php':128 'topic-agent-skills' 'topic-agents' 'topic-awesome' 'topic-custom-agents' 'topic-github-copilot' 'topic-hacktoberfest' 'topic-prompt-engineering' 'transport':76,261,315,316,321 'true':173,181,463,465 'type':77,143,249,327,429,471,525,639,765,769,772 'uri':445,903 'uritempl':490,918 'usag':204 'use':21,47,255,258,263,269,332,337,434,476,530,535,643,647,754,767,790,815,824 'user':56,592,623,928,933,977 'valid':789,795,849,866 'validateemail':854 'valu':555,566,896,913 'var':863 'vendor':306 'vendor/bin/phpunit':226,946 'version':102,457 'void':661,669,683,698,713,732 'whether':94 'world':674,678 'write':90,807 'xml':748 'your-org':134 'zero':417,722","prices":[{"id":"514b6d25-1abe-48b4-b5ae-875eca0e0b37","listingId":"abc2907d-07a1-4420-8fbd-fa2298361ddb","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"github","category":"awesome-copilot","install_from":"skills.sh"},"createdAt":"2026-04-18T20:26:03.100Z"}],"sources":[{"listingId":"abc2907d-07a1-4420-8fbd-fa2298361ddb","source":"github","sourceId":"github/awesome-copilot/php-mcp-server-generator","sourceUrl":"https://github.com/github/awesome-copilot/tree/main/skills/php-mcp-server-generator","isPrimary":false,"firstSeenAt":"2026-04-18T21:50:28.461Z","lastSeenAt":"2026-05-18T18:52:19.570Z"},{"listingId":"abc2907d-07a1-4420-8fbd-fa2298361ddb","source":"skills_sh","sourceId":"github/awesome-copilot/php-mcp-server-generator","sourceUrl":"https://skills.sh/github/awesome-copilot/php-mcp-server-generator","isPrimary":true,"firstSeenAt":"2026-04-18T20:26:03.100Z","lastSeenAt":"2026-05-07T22:40:18.533Z"}],"details":{"listingId":"abc2907d-07a1-4420-8fbd-fa2298361ddb","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"github","slug":"php-mcp-server-generator","github":{"repo":"github/awesome-copilot","stars":33270,"topics":["agent-skills","agents","ai","awesome","custom-agents","github-copilot","hacktoberfest","prompt-engineering"],"license":"mit","html_url":"https://github.com/github/awesome-copilot","pushed_at":"2026-05-18T01:26:59Z","description":"Community-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.","skill_md_sha":"a2dd1e5041b0ea68d1369a37a5c2c2af3b5f1cbc","skill_md_path":"skills/php-mcp-server-generator/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/github/awesome-copilot/tree/main/skills/php-mcp-server-generator"},"layout":"multi","source":"github","category":"awesome-copilot","frontmatter":{"name":"php-mcp-server-generator","description":"Generate a complete PHP Model Context Protocol server project with tools, resources, prompts, and tests using the official PHP SDK"},"skills_sh_url":"https://skills.sh/github/awesome-copilot/php-mcp-server-generator"},"updatedAt":"2026-05-18T18:52:19.570Z"}}