MCP PHP Boilerplate
PHP Boilerplate Powered by MCP PHP SDK
](https://github.com/AnvilM/mcp-php-boilerplate/)  
   ](https://github.com/anvilm/mcp-php-boilerplate/blob/master/LICENSE)
项目概述
该模板旨在利用 MCP(模型上下文 协议) 标准 和那个 MCP-PHP-SDK. 该项目整合了用于构建可扩展PHP应用程序的工具,这些应用程序能够公开工具、资源和提示 基于LLM的代理。
核心组件
入门指南
安装
通过作曲家
使用Composer创建新项目:
composer create-project anvilm/mcp-php-boilerplate my-project通过GitHub
克隆存储库并安装依赖项:
git clone https://github.com/anvilm/mcp-php-boilerplate.git my-project
cd my-project
composer install运行应用程序
HTTP模式(例如,内置php服务器)
php -S 127.0.0.1:8080 entrypoint/http.php标准模式(通过标准输入/标准输出直接通信)
php entrypoint/stdio.php目录结构
.
├── app/ # Core application logic and infrastructure
│ ├── Bootloaders/ # Classes for initializing application components
│ ├── Config/ # Configuration files
│ ├── Tools/ # MCP Tools definitions
│ ├── Resources/ # MCP resources definitions
│ ├── Prompts/ # MCP prompts definitions
│ ├── Providers/ # Dependency injection container providers
│ │ ├── ApplicationProviders/ # Providers for application functionality
│ │ └── Providers/ # Custom providers
│ └── Kernel.php # Application entry point and bootstrap management
├── entrypoint/
│ ├── http.php # HTTP entry point
│ └── stdio.php # Stdio (stdin/stdout) entry point
├── src/ # Source code for custom logic
└── tests/ # Pest tests目录组织
样板的结构是将基础架构逻辑与用户定义的代码分开:
- 目录
app/:包含应用程序的核心基础设施,
包括 配置, 提供商, 工具, 资源, 提示 和 引导装载机。此目录用于基础应用程序设置和操作。
- 目录
src/:指定用于用户定义的源代码,开发人员可以在其中实现主要业务
应用程序的逻辑。
配置
应用程序配置组织在 app/Config/ 目录,并通过以下方式提供对设置的类型安全访问 带有静态方法的类。有关更多详细信息,请参阅 配置 部分。
环境变量
环境变量从 .env 引导过程中项目根目录中的文件(特别是 InfrastructureBootloader).
加载后,所有变量都可以通过全局 $_ENV 超全局阵列。
预定义环境变量:
- 应用程序环境:定义应用环境(例如。,
production,development),影响测井水平。 - APP_DEBUG:启用或禁用调试模式,影响详细错误信息的显示。
- APP_NAME:应用程序的名称。
- APP_DESCRIPTION:应用程序的简短描述。
可以根据需要添加其他自定义变量。
应用配置
这 ApplicationConfig 类提供以下参数:
- 基础目录:项目的根目录。
- appEnv:应用程序环境,由
APP_ENV变量。可用环境列在
这 ApplicationEnvironmentEnum 枚举。要添加新环境,请更新此枚举和 ApplicationConfig 类。
- app调试:调试模式,由
APP_DEBUG变量。 - 应用名称:应用程序名称,由
APP_NAME变量。 - 应用程序描述:应用程序描述,由
APP_DESCRIPTION变量。
日志记录配置
这 LoggerConfig 类使用Monolog配置日志参数。它包括日志文件的路径(在 logs/ 目录)和日志记录级别,这取决于 appEnv 价值。
建筑概念
配置
配置存储在 app/Config/ 目录。每个配置都作为一个类实现,该类具有静态 方法,确保对设置的类型安全访问。
例子:
namespace Application\Config\ApplicationConfig;
use function Env\env;
final readonly class ApplicationConfig
{
public static function baseDir(): string
{
return dirname(__DIR__, 3);
}
}工具
工具定义见 app/Tools/ 目录。
创建工具的示例:
namespace Application\Tools;
use Mcp\Capability\Attribute\McpTool;
class ExampleTool
{
#[McpTool("example_tool", "Example tool description")]
public function handle(string $name): string
{
return "Hello $name";
}
}资源
资源定义见 app/Resources/ 目录。
创建资源的示例:
namespace Application\Resources;
use Mcp\Capability\Attribute\McpResource;
final class ExampleResource
{
#[McpResource("example://example", "example_resource", "Example resource description", "text/plain")]
public function handle(): string
{
return "example resource";
}
}提示
提示定义见 app/Prompts/ 目录。
创建提示的示例:
namespace Application\Prompts;
use ...
final class ExamplePrompt
{
#[McpPrompt("example_prompt")]
public function handle(): PromptMessage
{
return new PromptMessage(
Role::User,
new TextContent("example prompt message"),
);
}
}提供商
服务提供商,位于 app/Providers/ 目录,负责在PHP-DI中注册依赖关系 容器,使应用程序可以访问它们。供应商分类如下:
ApplicationProviders/:对应用程序功能至关重要的提供商。 它们首先被装载。Providers/:特定逻辑的自定义提供程序。
每个提供者都必须实现 ProviderInterface 并在 app/Providers/Registry.php 文件。
应用程序提供商必须在 $appProviders 数组中的其他提供者 $providers 阵列。
创建提供者的示例:
namespace App\Providers;
final readonly class DBALProvider implements ProviderInterface
{
public static function register(): array
{
return [DatabaseManager::class => new DatabaseManager(
new CycleDatabaseConfig(
DatabaseConfig::config()
)
)];
}
}注册示例 app/Providers/Registry.php 文件:
private static array $appProviders = [
\App\Providers\LoggerProvider::class,
\App\Providers\DBALProvider::class,
];
private static array $providers = [
// Other providers
];Bootloader
应用程序引导过程分为不同的阶段,以确保组件的可扩展、有序和可预测的初始化。每个阶段都由一个专用的引导加载程序管理,允许按顺序加载组件,而不是在单个单片位置加载。
所有引导加载程序都位于 app/Bootloaders/ 目录,并且必须实现 BootloaderInterfaceThe Kernel 类通过以严格定义的顺序执行引导加载程序来编排整个引导过程。
目录结构
app/Bootloaders/
├── Application/
│ ├── ApplicationBootloader.php
│ └── Server.php
├── Infrastructure/
│ ├── Container.php
│ ├── Providers.php
│ └── InfrastructureBootloader.php
├── Environment/
│ └── EnvironmentBootloader.php
├── BootloaderInterface.php
└── Context.php引导顺序
引导加载程序按以下顺序执行:
- 环境引导加载程序\
从加载环境变量 .env 项目根目录中的文件。
- 基础设施下载器\
配置核心基础架构组件,包括PHP-DI容器和服务提供商。
- 应用程序引导加载程序\
初始化MCP服务器和其他应用程序级组件。
随着应用程序的发展,可以在序列中的适当位置插入额外的引导加载程序。
扩展启动过程
要添加新的引导加载程序,请执行以下操作:
- 在下创建新目录和类
app/Bootloaders/例如:\
app/Bootloaders/OneMoreBootloader/OneMoreBootloader.php
- 实施
BootloaderInterface在新班级。引导程序应该是静态的,收到Context对象,执行配置,并返回a(可能已更新)Context:
*/
class OneMoreBootloader implements BootloaderInterface
{
/**
* @param Context $context
* @return Context
*/
public static function boot(Context $context): Context
{
$context->get('container')->get(LoggerInterface::class)->debug("OneMoreBootloader: booted");
return new Context(['container' => $context->get('container')]);
}
}- 在中注册新的引导加载程序
Kernel::createServer()方法是将其链接到正确的位置:
namespace App;
use App\Bootloaders\Context;
final readonly class Kernel
{
public static function createServer(): McpServer
{
/** @var Context $environmentContext */
$environmentContext = EnvironmentBootloader::boot(new Context());
/** @var Context $infrastructureContext */
$infrastructureContext = InfrastructureBootloader::boot($environmentContext);
/** @var Context $oneMoreContext */
$oneMoreContext = OneMoreBootloader::boot($infrastructureContext);
/** @var Context $applicationContext */
$applicationContext = ApplicationBootloader::boot($oneMoreContext);
return $applicationContext->get('server');
}
}这种链式的显式方法确保了对初始化顺序的完全控制,并使阶段之间的依赖关系透明。
许可证
该项目在MIT许可证下分发。有关详细信息,请参阅 许可证 文件。
