
php-mcp-server-generator
✓ Official★ 36,200by github · part of github/awesome-copilot
Scaffold production-ready PHP MCP server projects with tools, resources, prompts, and tests. Generates complete project structure with composer.json, server.php, and PSR-4 autoloading configured for the official PHP SDK Supports three transport types (stdio, HTTP, or both) and includes attribute-based tool, resource, and prompt definitions with schema validation Provides templated examples for simple tools, validated parameters, enum-based operations, static resources, and dynamic resource...
Scaffold production-ready PHP MCP server projects with tools, resources, prompts, and tests. Generates complete project structure with composer.json, server.php, and PSR-4 autoloading configured for the official PHP SDK Supports three transport types (stdio, HTTP, or both) and includes attribute-based tool, resource, and prompt definitions with schema validation Provides templated examples for simple tools, validated parameters, enum-based operations, static resources, and dynamic resource...
Inspect the full instructions your agent will receiveExpandCollapse
This is the exact playbook injected into your agent when the skill activates — shown here so you can audit it before installing. You don't need to read it to use the skill.
by github
Scaffold production-ready PHP MCP server projects with tools, resources, prompts, and tests. Generates complete project structure with composer.json, server.php, and PSR-4 autoloading configured for the official PHP SDK Supports three transport types (stdio, HTTP, or both) and includes attribute-based tool, resource, and prompt definitions with schema validation Provides templated examples for simple tools, validated parameters, enum-based operations, static resources, and dynamic resource...
npx skills add https://github.com/github/awesome-copilot --skill php-mcp-server-generator
Download ZIPGitHub36.2k
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 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}
{Server description}
## Testing
vendor/bin/phpunit
## Tools
- **{tool_name}**: {Tool description}
## Development
Test with MCP Inspector:
npx @modelcontextprotocol/inspector php server.php
server.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
tests
src
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');
}
npx @modelcontextprotocol/inspector php server.phpRun this in your project — your agent picks the skill up automatically.
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)
Requirements
- PHP 8.2 or higher
- Composer
Installation
composer install
Usage
Start Server (Stdio)
php server.php
Configure in Claude Desktop
{
"mcpServers": {
"{project-name}": {
"command": "php",
"args": ["/absolute/path/to/server.php"]
}
}
}
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!
No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.