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: Project name (e.g., "my-mcp-server") Server description (e.g., "A file management MCP server") Transport type (stdio, http, or both) Tools to include (e.g., "file read", "file write", "list directory") Whether to include resources and prompts 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 { "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 /cache composer.lock .phpunit.cache phpstan.neon README.md
{Project Name}
Requirements
PHP 8.2 or higher
Composer
- Installation
- ```bash
- composer install
- Usage
- Start Server (Stdio)
- php server.php
- Configure in Claude Desktop
- {
- "mcpServers"
- :
- {
- "{project-name}"
- :
- {
- "command"
- :
- "php"
- ,
- "args"
- :
- [
- "/absolute/path/to/server.php"
- ]
- }
- }
- }
- Testing
- vendor/bin/phpunit
- Tools
- {tool_name}
- {Tool description} Development Test with MCP Inspector: npx @modelcontextprotocol/inspector php server.php
server.php
```php
!/usr/bin/env php
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 $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 '1.0.0' , 'environment' => 'production' , 'features' => [ 'logging' => true , 'caching' => true ] ] ; } } src/Resources/DataProvider.php $category , 'id' => $id , 'data' => "Sample data for { $category } / { $id } " ] ; } } src/Prompts/PromptGenerator.php '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 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- <
- 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
- Use PHP Attributes
- Leverage
[McpTool]
,
[McpResource]
,
[McpPrompt]
- for clean code
- Type Declarations
-
- Use strict types (
- declare(strict_types=1);
- ) in all files
- PSR-12 Coding Standard
-
- Follow PHP-FIG standards
- Schema Validation
- Use
[Schema]
- attributes for parameter validation
- Error Handling
-
- Throw specific exceptions with clear messages
- Testing
-
- Write PHPUnit tests for all tools
- Documentation
-
- Use PHPDoc blocks for all methods
- Caching
- Always use PSR-16 cache for discovery in production Tool Patterns Simple Tool
[
McpTool ] public function simpleAction ( string $input ) : string { return "Processed: { $input } " ; } Tool with Validation
[
McpTool ] public function validateEmail (
[
Schema ( format : 'email' ) ] string $email ) : bool { return filter_var ( $email , FILTER_VALIDATE_EMAIL ) !== false ; } Tool with Enum enum 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
[
McpResource ( uri : 'config://settings' , mimeType : 'application/json' ) ] public function getSettings ( ) : array { return [ 'key' => 'value' ] ; } Dynamic Resource
[
McpResourceTemplate ( uriTemplate : 'user://{id}' ) ] public function getUser ( string $id ) : array { return $this -> users [ $id ] ?? throw new \ RuntimeException ( 'User not found' ) ; } Running the Server
Install dependencies
composer install
Run tests
vendor/bin/phpunit
Start server
php server.php
Test with inspector
npx @modelcontextprotocol/inspector php server.php Claude Desktop Configuration { "mcpServers" : { "{project-name}" : { "command" : "php" , "args" : [ "/absolute/path/to/server.php" ] } } } Now generate the complete project based on user requirements!