{"id":"abc2907d-07a1-4420-8fbd-fa2298361ddb","shortId":"Mh2aNp","kind":"skill","title":"Php Mcp Server Generator","tagline":"Awesome Copilot skill by Github","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"],"capabilities":["skill","source-github","category-awesome-copilot"],"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":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under github/awesome-copilot","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:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T11:40:19.741Z","embedding":null,"createdAt":"2026-04-18T20:26:03.100Z","updatedAt":"2026-04-22T11:40:19.741Z","lastSeenAt":"2026-04-22T11:40:19.741Z","tsv":"'-12':763 '-16':810 '-4':143,150 '/absolute/path/to/server.php':207,953 '/cache':168,272 '/usr/bin/env':228 '/vendor':167 '/vendor/autoload.php':238 '0':393,711 '0.1':133 '1':42,234,312,414,456,510,624,737,757 '1.0.0':283,442 '10':687,710 '10.0':138 '2':50,688,748 '3':59,673,729,761 '3600':270 '4':66,771 '5':77,672,728,780 '5.0':692 '6':84,789 '6.4':140 '7':797 '8':805 '8.0':677 '8.2':87,131,180 'activ':861,862 'adapt':251 'add':372,382,674 'alway':807 'app':144,314,416,432,458,512,632 'app/settings':430 'applic':426 'application/json':435,481,890 'arg':206,952 'arithmet':358 'array':439,489,558,604,874,894,909 'ask':38 'assertsam':660,676,691 'assist':561 'attribut':319,324,421,463,517,522,740,776 'autoload':141,147,156 'autoload-dev':146 'awesom':5 'b':369,384,387,390,392,395 'base':959 'basepath':285 'bash':185,192,209,221,923 'best':571 'block':801 'bool':844 'build':273,295 'builder':279 'cach':250,256,259,262,292,293,294,448,806,811 'calcul':359,362 'capabl':318,323,420,462,516,521 'case':860,863 'categori':470,475,486,494,495,502 'category-awesome-copilot' 'class':326,423,465,524,635,701,720 'claud':197,942 'clean':746 'clear':787 'code':528,533,548,567,581,590,600,616,747,764 'command':204,950 'complet':23,957 'completionprovid':109,523,538,549 'compon':249,255 'compos':183,186,926 'composer.json':94,115 'composer.lock':169 'config':153,433 'configresourc':424 'configur':195,427,944 'content':562,577,608 'copilot':6 'creat':21 'data':468,478,491,498,500 'dataprovid':466 'declar':231,309,411,453,507,621,750,754 'default':402 'depend':925 'descript':52,124,126,177,215 'desktop':198,943 'detail':603 'dev':136,148 'develop':216 'dir':237,271,286 'directori':76 'discoveri':261,269,276,813 'dist':161 'divid':375,391,689,712 'divis':399,704 'document':593,611,798 'dynam':898 'e.g':45,53,70 'email':841,843,848,851 'enum':855,857 'environ':443 'error':781 'exampl':490 'exampletool':327,634,640,649 'except':785 'excludedir':289 'expectexcept':699,718 'expectexceptionmessag':703,722 'expert':566 'extend':637 'fals':852 'featur':445 'fig':769 'file':55,71,73,113,760 'filesystemadapt':252,266 'filter':846,849 'float':366,368,378 'focus':556,583,585 'follow':766 'format':840 'found':919 'framework':629 'function':349,364,437,483,536,597,643,651,665,680,695,714,823,837,868,892,905 'general':554,557 'generat':4,13,20,526,592,609,955 'generatedoc':598 'getconfigur':438 'getdata':484 'getset':893 'getus':906 'github':9 'gitignor':95,166 'go':543 'greet':330,341,345,350,657 'guidelin':736 'handl':782 'hello':355,661 'higher':182 'http':63 'id':472,476,488,496,497,503,871,876,877,903,908,913 'implement':735 'inact':864,865 'includ':69,80 'input':826,830 'inspector':220,937 'instal':160,184,187,924,927 'invalid':406,723 'invalidargumentexcept':398,405,700,719 'javascript':541 'json':116,199,945 'key':896 'languag':546,580,588 'leverag':741 'list':75 'log':446 'manag':56 'markdown':173 'match':380 'mcp':2,11,18,28,48,57,219,240,243,268,317,322,419,461,515,520 'mcp-discoveri':267 'mcp/sdk':132 'mcpprompt':518,531,595,744 'mcpresourc':422,428,743,886 'mcpresourcetempl':464,473,901 'mcpserver':200,946 'mcptool':320,347,360,742,821,835,866 'messag':346,788 'method':804 'mimetyp':434,480,889 'modelcontextprotocol/inspector':223,939 'modulo':730 'multipli':374,388 'my-mcp-serv':46 'n':586,587,589,591,613,614,615,617 'name':44,93,117,123,175,203,213,282,334,337,339,352,356,361,431,477,532,949 'namespac':313,415,457,511,625 'new':263,265,301,397,404,648,915 'npx':222,938 'offici':33 'oper':377,381,407,724 'optim':155,574 'optimize-autoload':154 'org':120 'packag':164 'param':335 'paramet':778 'pattern':371,817,882 'perform':328,357,551 'performcalcul':365,671,686,709,727 'php':1,10,17,27,34,85,101,104,107,110,130,179,193,205,224,227,229,230,307,308,409,410,451,452,505,506,540,619,620,739,768,820,834,856,885,900,933,940,951 'php-fig':767 'phpdoc':800 'phpstan.neon':171 'phpunit':628,792 'phpunit.cache':170 'phpunit.xml.dist':731 'phpunit/phpunit':137 'practic':572 'prefer':159 'preferred-instal':158 'privat':639 'process':829 'product':25,444,815 'production-readi':24 'project':30,36,43,89,92,122,128,174,202,281,948,958 'project-nam':91,121,201,947 'prompt':83,105,513,530,594 'promptclass':106 'promptgener':525 'protect':642 'provid':108,333,425,467 'psr':142,149,762,809 'psr16cache':257,264 'public':348,363,436,482,535,596,650,664,679,694,713,822,836,867,891,904 'python':542 'read':72 'readi':26 'readme.md':96,172 'requir':37,88,129,135,178,235,962 'require-dev':134 'resourc':81,102,417,459,479,881,884,899 'resourceclass':103 'result':654,663,668,678,683,693 'retriev':492 'return':342,354,379,440,493,559,605,828,845,875,895,910 'review':529,534,568,578 'reviewcod':537 'role':560,575,606 'run':296,304,920,928 'runtimeexcept':916 'rust':544 'sampl':499 'scandir':287 'schema':325,370,772,775,839 'sdk':35 'secur':552 'server':3,12,19,29,49,51,58,125,176,190,241,244,274,277,278,303,922,932 'server.php':97,194,225,226,934,941 'set':888 'setdiscoveri':284 'setserverinfo':280 'setstatus':869 'setup':258,644 'simpl':818 'simpleact':824 'skill':7 'sort':163 'sort-packag':162 'source-github' 'special':569 'specif':784 'src':98,145,288,734 'src/prompts/promptgenerator.php':504 'src/resources/configresource.php':408 'src/resources/dataprovider.php':450 'src/tools/exampletool.php':306 'standard':765,770 'start':189,931 'static':883 'status':858,872,873,878,879 'stdio':62,191,298 'stdiotransport':246,302 'strict':232,310,412,454,508,622,752,755 'string':336,343,351,353,376,485,487,545,547,555,599,601,825,827,842,859,870,907 'structur':90 'style':553,602,610 'subtract':373,385 'symfoni':248,254 'symfony/cache':139 'templat':114 'test':111,151,152,208,217,291,626,733,790,793,929,935 'testcalculateadd':666 'testcalculatedivid':681 'testcalculatedividebyzero':696 'testcalculateinvalidoper':715 'testcas':630,638 'testgreet':652 'tests/toolstest.php':618 'throw':396,403,783,914 'tool':67,99,211,212,214,315,633,641,647,656,670,685,708,726,796,816,819,831,853 'toolclass':100 'toolstest':636 'toolstest.php':112 'transport':60,245,299,300,305 'true':157,165,447,449 'type':61,127,233,311,413,455,509,623,749,753,756 'uri':429,887 'uritempl':474,902 'usag':188 'use':31,239,242,247,253,316,321,418,460,514,519,627,631,738,751,774,799,808 'user':40,576,607,912,917,961 'valid':773,779,833,850 'validateemail':838 'valu':539,550,880,897 'var':847 'vendor':290 'vendor/bin/phpunit':210,930 'version':86,441 'void':645,653,667,682,697,716 'whether':78 'world':658,662 'write':74,791 'xml':732 'your-org':118 'zero':401,706","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-04-22T06:52:27.212Z"},{"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-04-22T11:40:19.741Z"}],"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","source":"skills_sh","category":"awesome-copilot","skills_sh_url":"https://skills.sh/github/awesome-copilot/php-mcp-server-generator"},"updatedAt":"2026-04-22T11:40:19.741Z"}}