server

GitHub
828 61 简单 1 次阅读 6天前MIT开发框架Agent
AI 解读 由 AI 自动生成,仅供参考

server 是一个专为 PHP 开发者打造的开源工具包,用于快速构建符合模型上下文协议(MCP)标准的服务端应用。它的核心作用是让现有的 PHP 后端功能能够被主流 AI 助手(如 Claude、Cursor、ChatGPT 等)直接识别和调用,从而打破传统后端与人工智能之间的交互壁垒。

通过 server,开发者无需编写繁琐的适配代码,只需在 PHP 方法上添加简单的属性标记(如 #[McpTool]),即可将业务逻辑自动暴露为 AI 可理解的“工具”、“资源”或“提示词”。这不仅解决了 AI 难以直接操作私有后端数据的痛点,还实现了从代码定义到 AI 交互的零配置对接。

该工具特别适合熟悉 PHP 生态的后端工程师使用,尤其是那些希望将现有系统智能化,或正在探索 AI Agent 落地场景的开发团队。其技术亮点在于充分利用了 PHP 8.1+ 的现代特性,支持基于属性的自动化注册、智能 JSON 模式生成以及多种通信传输方式(包括标准的输入输出流、HTTP SSE 及可恢复的流式 HTTP)。此外,它还内置了事件驱动架构以支持高并发处理,并提供完善的会话管理与依赖注入支持,帮助开发者轻松构建生产级、高可用的 AI 集成服务。

使用场景

某电商团队的 PHP 后端工程师需要将订单查询、库存校验等核心业务逻辑暴露给内部部署的 Claude 代码助手,以便开发人员能通过自然语言直接操作生产数据。

没有 server 时

  • 开发效率低下:每次新增功能都需手动编写繁琐的 JSON-RPC 解析代码和 Schema 定义,重复劳动多且易出错。
  • 架构耦合严重:为了适配 AI 调用,不得不修改现有业务类结构,破坏了原本清晰的领域模型设计。
  • 并发性能瓶颈:传统同步脚本难以处理多个 AI 助手的并发请求,容易导致阻塞,影响开发体验。
  • 维护成本高昂:缺乏统一的会话管理和缓存机制,调试复杂,且无法利用 PHP 8 的新特性简化代码。

使用 server 后

  • 零配置快速接入:仅需在方法上添加 #[McpTool] 属性,server 即可自动注册工具并生成标准 JSON Schema,无需手写协议代码。
  • 非侵入式集成:完全兼容现有类结构,支持闭包、静态方法及可调用类,业务逻辑与 AI 接口层彻底解耦。
  • 高并发异步处理:基于 ReactPHP 构建的事件驱动架构,轻松支撑多个 IDE 插件同时发起的流式 HTTP 或 Stdio 请求。
  • 企业级特性完备:内置智能缓存、会话管理及参数自动补全功能,结合 PSR-11 依赖注入,让生产级 MCP 服务开箱即用。

server 将复杂的 MCP 协议实现简化为简单的 PHP 属性标记,让后端团队能以最小代价赋予 AI 助手安全、高效地调用核心业务的能力。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU

不需要 GPU

内存

未说明

依赖
notes这是一个 PHP SDK,不是 Python 工具。运行需要 PHP 8.1 及以上版本和 Composer。若使用 HTTP 传输模式,建议在 CLI(命令行)事件驱动环境下运行。Laravel 用户可参考专用的 php-mcp/laravel 包以获得更好的集成体验。
python不适用
PHP >= 8.1
Composer
ext-json
ext-mbstring
ext-pcre
server hero image

快速开始

PHP MCP 服务器 SDK

Packagist 最新版本 总下载量 测试 许可证

用于构建【模型上下文协议(MCP)】服务器的全面 PHP SDK。通过现代架构、丰富的测试以及灵活的传输选项,用 PHP 快速创建可投入生产的 MCP 服务器。

此 SDK 可让您将 PHP 应用程序的功能作为标准化的 MCP 工具资源提示公开,从而让 AI 助手(如 Anthropic 的 Claude、Cursor IDE、OpenAI 的 ChatGPT 等)能够以 MCP 标准与您的后端进行交互。

🚀 主要特性

  • 🏗️ 现代架构:采用 PHP 8.1+ 特性、PSR 标准和模块化设计
  • 📡 多种传输方式:支持 stdiohttp+sse 以及全新的可流式 HTTP,具备断点续传功能
  • 🎯 基于属性的定义:使用 PHP 8 属性(#[McpTool]#[McpResource] 等)实现零配置元素注册
  • 🔧 灵活的处理器:支持闭包、类方法、静态方法和可调用类
  • 📝 智能模式生成:根据方法签名自动生成 JSON 模式,可选使用 #[Schema] 属性增强功能
  • ⚡ 会话管理:支持多种存储后端的高级会话处理
  • 🔄 事件驱动:基于 ReactPHP,实现高并发和非阻塞操作
  • 📊 批处理支持:全面支持 JSON-RPC 批量请求
  • 💾 智能缓存:对发现的元素进行智能缓存,手动覆盖优先
  • 🧪 补全提供者:内置工具和提示的参数补全支持
  • 🔌 依赖注入:完全支持 PSR-11 容器,并具备自动装配功能
  • 📋 全面测试:丰富的测试套件,包含所有传输方式的集成测试

本包支持【2025-03-26】版本的模型上下文协议,同时具备向后兼容性。

📋 要求

  • PHP >= 8.1
  • Composer
  • 对于 HTTP 传输:事件驱动的 PHP 环境(推荐使用 CLI)
  • 扩展jsonmbstringpcre(通常默认启用)

📦 安装

composer require php-mcp/server

💡 Laravel 用户:建议使用 php-mcp/laravel,以获得更佳的框架集成、配置管理和 Artisan 命令支持。

⚡ 快速入门:带发现功能的 Stdio 服务器

本示例展示了最常见的使用模式——基于属性发现的 stdio 服务器。

1. 定义您的 MCP 元素

创建 src/CalculatorElements.php

<?php

namespace App;

use PhpMcp\Server\Attributes\McpTool;
use PhpMcp\Server\Attributes\Schema;

class CalculatorElements
{
    /**
     * 将两个数字相加。
     * 
     * @param int $a 第一个数字
     * @param int $b 第二个数字  
     * @return int 两个数字之和
     */
    #[McpTool(name: 'add_numbers')]
    public function add(int $a, int $b): int
    {
        return $a + $b;
    }

    /**
     * 计算幂并进行验证。
     */
    #[McpTool(name: 'calculate_power')]
    public function power(
        #[Schema(type: 'number', minimum: 0, maximum: 1000)]
        float $base,
        
        #[Schema(type: 'integer', minimum: 0, maximum: 10)]
        int $exponent
    ): float {
        return pow($base, $exponent);
    }
}

2. 创建服务器脚本

创建 mcp-server.php

#!/usr/bin/env php
<?php

declare(strict_types=1);

require_once __DIR__ . '/vendor/autoload.php';

use PhpMcp\Server\Server;
use PhpMcp\Server\Transports\StdioServerTransport;

try {
    // 构建服务器配置
    $server = Server::make()
        ->withServerInfo('PHP 计算器服务器', '1.0.0') 
        ->build();

    // 通过属性发现 MCP 元素
    $server->discover(
        basePath: __DIR__,
        scanDirs: ['src']
    );

    // 通过 stdio 传输开始监听
    $transport = new StdioServerTransport();
    $server->listen($transport);

} catch (\Throwable $e) {
    fwrite(STDERR, "[严重错误] " . $e->getMessage() . "\n");
    exit(1);
}

3. 配置您的 MCP 客户端

添加到您的客户端配置(例如 .cursor/mcp.json):

{
    "mcpServers": {
        "php-calculator": {
            "command": "php",
            "args": ["/绝对路径/到/您的/mcp-server.php"]
        }
    }
}

4. 测试服务器

您的 AI 助手现在可以调用:

  • add_numbers —— 两个整数相加
  • calculate_power —— 计算幂并施加验证约束

🏗️ 架构概览

PHP MCP 服务器采用现代化的解耦架构:

┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   MCP 客户端    │◄──►│   传输方式      │◄──►│   协议          │
│  (Claude 等)    │    │ (Stdio/HTTP/SSE) │    │   (JSON-RPC)    │
└─────────────────┘    └──────────────────┘    └─────────────────┘
                                                         │
                       ┌─────────────────┐               │
                       │ 会话管理器     │◄──────────────┤
                       │ (多后端)        │               │
                       └─────────────────┘               │
                                                         │
┌─────────────────┐    ┌──────────────────┐              │
│   分发器        │◄───│   服务器核心     │◄─────────────┤
│ (方法路由)      │    │   配置           │              │
└─────────────────┘    └──────────────────┘              │
         │                                               │
         ▼                                               │
┌─────────────────┐    ┌──────────────────┐              │
│    注册表       │    │   元素           │◄─────────────┘
│  (元素存储)     │◄──►│ (工具/资源/提示等)│
└─────────────────┘    └──────────────────┘

核心组件

  • ServerBuilder:流畅的配置接口(Server::make()->...->build()
  • Server:中央协调器,包含所有已配置的组件
  • Protocol:JSON-RPC 2.0 处理器,连接传输方式与核心逻辑
  • SessionManager:多后端会话存储(数组、缓存、自定义)
  • Dispatcher:方法路由与请求处理
  • Registry:元素存储,具备智能缓存与优先级规则
  • Elements:已注册的 MCP 组件(工具、资源、提示、模板)

传输选项

  1. StdioServerTransport:用于直接启动客户端的标准 I/O
  2. HttpServerTransport:用于 Web 集成的 HTTP + 服务器发送事件
  3. StreamableHttpServerTransport:增强型 HTTP,支持断点续传和事件溯源

⚙️ 服务器配置

基本配置

use PhpMcp\Server\Server;
use PhpMcp\Schema\ServerCapabilities;

$server = Server::make()
    ->withServerInfo('我的应用服务器', '2.1.0')
    ->withCapabilities(ServerCapabilities::make(
        resources: true,
        resourcesSubscribe: true,
        prompts: true,
        tools: true
    ))
    ->withPaginationLimit(100)
    ->build();

带依赖项的高级配置

use Psr\Log\Logger;
use Psr\SimpleCache\CacheInterface;
use Psr\Container\ContainerInterface;

$server = Server::make()
    ->withServerInfo('生产环境服务器', '1.0.0')
    ->withLogger($myPsrLogger)                    // PSR-3 日志记录器
    ->withCache($myPsrCache)                      // PSR-16 缓存  
    ->withContainer($myPsrContainer)              // PSR-11 容器
    ->withSession('cache', 7200)                  // 基于缓存的会话,TTL 2小时
    ->withPaginationLimit(50)                     // 限制列表响应
    ->build();

会话管理选项

// 内存中会话(默认,非持久化)
->withSession('array', 3600)

// 基于缓存的会话(重启后仍有效)  
->withSession('cache', 7200)

// 自定义会话处理器(实现 SessionHandlerInterface)
->withSessionHandler(new MyCustomSessionHandler(), 1800)

🎯 定义 MCP 元素

服务器提供了两种强大的方式来定义 MCP 元素:基于属性的发现(推荐)和手动注册。两者可以结合使用,且手动注册优先。

元素类型

  • 🔧 工具:可执行的函数/操作(例如 calculatesend_emailquery_database
  • 📄 资源:静态内容/数据(例如 config://settingsfile://readme.txt
  • 📋 资源模板:带有 URI 模式的动态资源(例如 user://{id}/profile
  • 💬 提示:对话开场白/模板(例如 summarizetranslate

1. 🏷️ 基于属性的发现(推荐)

使用 PHP 8 属性将方法或可调用类标记为 MCP 元素。服务器将通过文件系统扫描来发现它们。

use PhpMcp\Server\Attributes\{McpTool, McpResource, McpResourceTemplate, McpPrompt};

class UserManager
{
    /**
     * 创建新用户账户。
     */
    #[McpTool(name: 'create_user')]
    public function createUser(string $email, string $password, string $role = 'user'): array
    {
        // 创建用户逻辑
        return ['id' => 123, 'email' => $email, 'role' => $role];
    }

    /**
     * 获取用户配置。
     */
    #[McpResource(
        uri: 'config://user/settings',
        mimeType: 'application/json'
    )]
    public function getUserConfig(): array
    {
        return ['theme' => 'dark', 'notifications' => true];
    }

    /**
     * 根据 ID 获取用户个人资料。
     */
    #[McpResourceTemplate(
        uriTemplate: 'user://{userId}/profile',
        mimeType: 'application/json'
    )]
    public function getUserProfile(string $userId): array
    {
        return ['id' => $userId, 'name' => 'John Doe'];
    }

    /**
     * 生成欢迎消息提示。
     */
    #[McpPrompt(name: 'welcome_user')]
    public function welcomeUserPrompt(string $username, string $role): array
    {
        return [
            ['role' => 'user', 'content' => "为 {$username} 创建一条欢迎信息,角色为 {$role}"]
        ];
    }
}

发现过程:

// 先构建服务器
$server = Server::make()
    ->withServerInfo('我的应用服务器', '1.0.0')
    ->build();

// 然后发现元素
$server->discover(
    basePath: __DIR__,
    scanDirs: ['src/Handlers', 'src/Services'],  // 需要扫描的目录
    excludeDirs: ['src/Tests'],                  // 需要跳过的目录
    saveToCache: true                            // 缓存结果(默认为 true)
);

可用属性:

  • #[McpTool]:可执行的操作
  • #[McpResource]:可通过 URI 访问的静态内容
  • #[McpResourceTemplate]:带有 URI 模板的动态资源
  • #[McpPrompt]:对话模板和提示生成器

2. 🔧 手动注册

在调用 build() 之前,使用 ServerBuilder 以编程方式注册元素。这在动态注册、闭包或您希望获得明确控制时非常有用。

use App\Handlers\{EmailHandler, ConfigHandler, UserHandler, PromptHandler};
use PhpMcp\Schema\{ToolAnnotations, Annotations};

$server = Server::make()
    ->withServerInfo('手动注册服务器', '1.0.0')
    
    // 注册带有处理方法的工具
    ->withTool(
        [EmailHandler::class, 'sendEmail'],     // 处理方法:[类, 方法]
        name: 'send_email',                     // 工具名称(可选)
        description: '向用户发送电子邮件',     // 描述(可选)
        annotations: ToolAnnotations::make(     // 注解(可选)
            title: '发送电子邮件工具'
        )
    )
    
    // 将可调用类注册为工具
    ->withTool(UserHandler::class)             // 处理方法:可调用类
    
    // 将闭包注册为工具
    ->withTool(
        function(int $a, int $b): int {         // 处理方法:闭包
            return $a + $b;
        },
        name: 'add_numbers',
        description: '将两个数字相加'
    )
    
    // 注册带有闭包的资源
    ->withResource(
        function(): array {                     // 处理方法:闭包
            return ['timestamp' => time(), 'server' => 'php-mcp'];
        },
        uri: 'config://runtime/status',         // URI(必填)
        mimeType: 'application/json'           // MIME 类型(可选)
    )
    
    // 注册资源模板
    ->withResourceTemplate(
        [UserHandler::class, 'getUserProfile'],
        uriTemplate: 'user://{userId}/profile'  // URI 模板(必填)
    )
    
    // 注册带有闭包的提示
    ->withPrompt(
        function(string $topic, string $tone = 'professional'): array {
            return [
                ['role' => 'user', 'content' => "写一篇关于 {$topic} 的文章,语气为 {$tone}"]
            ];
        },
        name: 'writing_prompt'                  // 提示名称(可选)
    )
    
    ->build();

该服务器支持三种灵活的处理程序格式:[ClassName::class, 'methodName'] 用于类方法处理程序,InvokableClass::class 用于可调用类处理程序(具有 __invoke 方法的类),以及任何 PHP 可调用对象,包括闭包、静态方法如 [SomeClass::class, 'staticMethod'] 或函数名。基于类的处理程序通过配置的 PSR-11 容器进行解析,以实现依赖注入。手动注册的元素不会被缓存,并且优先于具有相同标识符的已发现元素。

[!重要] 当使用闭包作为处理程序时,服务器仅根据 PHP 类型提示生成最小化的 JSON 模式,因为没有文档块或类上下文可用。若要获取包含验证约束、描述和格式的更详细模式,您可以选择以下两种方式:

  • 使用 #[Schema] 属性以增强模式生成
  • 在使用 ->withTool() 注册工具时,提供自定义的 $inputSchema 参数

🏆 元素优先级与发现

优先级规则:

  • 手动注册的元素始终覆盖具有相同标识符的已发现/已缓存元素
  • 已发现的元素会被缓存以提高性能(可配置)
  • 缓存会在每次重新发现时自动失效

发现流程:

$server->discover(
    basePath: __DIR__,
    scanDirs: ['src/Handlers', 'src/Services'],  // 扫描这些目录
    excludeDirs: ['tests', 'vendor'],            // 跳过这些目录
    force: false,                                // 强制重新扫描(默认:false)
    saveToCache: true                            // 保存到缓存(默认:true)
);

缓存行为:

  • 只有已发现的元素会被缓存(绝不会缓存手动注册的元素)
  • 缓存在 build() 期间自动加载(如果可用)
  • 新的 discover() 调用会清除并重建缓存
  • 使用 force: true 可绕过已运行发现检查

🚀 运行服务器(传输方式)

服务器核心与传输方式无关。根据您的部署需求选择合适的传输方式:

1. 📟 Stdio 传输

最适合:直接客户端执行、命令行工具、简单部署

use PhpMcp\Server\Transports\StdioServerTransport;

$server = Server::make()
    ->withServerInfo('Stdio 服务器', '1.0.0')
    ->build();

$server->discover(__DIR__, ['src']);

// 创建 stdio 传输(默认使用 STDIN/STDOUT)
$transport = new StdioServerTransport();

// 开始监听(阻塞调用)
$server->listen($transport);

客户端配置:

{
    "mcpServers": {
        "my-php-server": {
            "command": "php",
            "args": ["/absolute/path/to/server.php"]
        }
    }
}

⚠️ 重要提示:使用 stdio 传输时,切勿在处理程序中向 STDOUT 写入内容(调试时请使用 STDERR)。STDOUT 保留用于 JSON-RPC 通信。

2. 🌐 HTTP + 服务器发送事件传输(已弃用)

⚠️ 注意:此传输方式已在最新 MCP 协议版本中弃用,但仍保留以兼容旧版本。对于新项目,请使用 StreamableHttpServerTransport,它提供了增强功能和更好的协议合规性。

最适合:需要向后兼容的旧应用

use PhpMcp\Server\Transports\HttpServerTransport;

$server = Server::make()
    ->withServerInfo('HTTP 服务器', '1.0.0')
    ->withLogger($logger)  // 推荐用于 HTTP
    ->build();

$server->discover(__DIR__, ['src']);

// 创建 HTTP 传输
$transport = new HttpServerTransport(
    host: '127.0.0.1',      // MCP 协议禁止使用 0.0.0.0
    port: 8080,             // 端口号
    mcpPathPrefix: 'mcp'    // URL 前缀 (/mcp/sse, /mcp/message)
);

$server->listen($transport);

客户端配置:

{
    "mcpServers": {
        "my-http-server": {
            "url": "http://localhost:8080/mcp/sse"
        }
    }
}

端点:

  • SSE 连接GET /mcp/sse
  • 消息发送POST /mcp/message?clientId={clientId}

3. 🔄 可流式 HTTP 传输(推荐)

适用场景:生产部署、远程 MCP 服务器、多客户端、可恢复连接

use PhpMcp\Server\Transports\StreamableHttpServerTransport;

$server = Server::make()
    ->withServerInfo('Streamable Server', '1.0.0')
    ->withLogger($logger)
    ->withCache($cache)     // 恢复功能所需
    ->build();

$server->discover(__DIR__, ['src']);

// 创建支持恢复功能的可流式传输
$transport = new StreamableHttpServerTransport(
    host: '127.0.0.1',      // MCP 协议禁止使用 0.0.0.0
    port: 8080,
    mcpPathPrefix: 'mcp',
    enableJsonResponse: false,  // 使用 SSE 流式传输(默认)
    stateless: false            // 启用无状态模式,适用于无会话客户端
);

$server->listen($transport);

JSON 响应模式:

enableJsonResponse 选项控制响应的交付方式:

  • false(默认):使用服务器发送事件(SSE)流式传输响应。适合处理时间较长的工具。
  • true:立即返回 JSON 响应,不开启 SSE 流。适用于执行速度快、无需流式传输的工具。
// 对于执行快速的工具,启用 JSON 模式
$transport = new StreamableHttpServerTransport(
    host: '127.0.0.1',
    port: 8080,
    enableJsonResponse: true  // 立即返回 JSON 响应
);

无状态模式:

对于会话管理存在问题的客户端,可启用无状态模式:

$transport = new StreamableHttpServerTransport(
    host: '127.0.0.1',
    port: 8080,
    stateless: true  // 每个请求独立处理
);

在无状态模式下,会话 ID 在内部生成但不会暴露给客户端,每个请求都被视为独立请求,不会保留持久化会话状态。

特性:

  • 可恢复连接:客户端可重新连接并重播遗漏的事件
  • 事件溯源:所有事件均存储以供重播
  • JSON 模式:可选仅返回 JSON 响应,适合快速工具
  • 增强会话管理:持久化会话状态
  • 多客户端支持:专为并发客户端设计
  • 无状态模式:适用于简单客户端的无会话操作

📋 模式生成与验证

服务器会自动为工具参数生成 JSON 模式,采用一种复杂的优先级系统,结合 PHP 类型提示、文档块信息以及可选的 #[Schema] 属性。这些生成的模式既用于输入验证,也用于向 MCP 客户端提供模式信息。

模式生成优先级

服务器在生成模式时遵循以下优先级顺序:

  1. 带有 definition#[Schema] 属性:完全覆盖模式(最高优先级)
  2. 参数级别的 #[Schema] 属性:针对特定参数的模式增强
  3. 方法级别的 #[Schema] 属性:方法范围内的模式配置
  4. PHP 类型提示 + 文档块:从代码中自动推断(最低优先级)

Schema 属性中提供了 definition 时,所有自动推断将被忽略,直接使用完整的定义。

参数级别的模式属性

use PhpMcp\Server\Attributes\{McpTool, Schema};

#[McpTool(name: 'validate_user')]
public function validateUser(
    #[Schema(format: 'email')]              // PHP 已知是字符串
    string $email,
    
    #[Schema(
        pattern: '^[A-Z][a-z]+$',
        description: '首字母大写的名称'
    )]
    string $name,
    
    #[Schema(minimum: 18, maximum: 120)]    // PHP 已知是整数
    int $age
): bool {
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

方法级别的模式

/**
 * 处理用户数据并进行嵌套验证。
 */
#[McpTool(name: 'create_user')]
#[Schema(
    properties: [
        'profile' => [
            'type' => 'object',
            'properties' => [
                'name' => ['type' => 'string', 'minLength' => 2],
                'age' => ['type' => 'integer', 'minimum' => 18],
                'email' => ['type' => 'string', 'format' => 'email']
            ],
            'required' => ['name', 'email']
        ]
    ],
    required: ['profile']
)]
public function createUser(array $userData): array
{
    // PHP 类型提示提供基础的 'array' 类型
    // 方法级别的 Schema 添加对象结构验证
    return ['id' => 123, 'status' => 'created'];
}

完全模式覆盖(仅限方法级别)

#[McpTool(name: 'process_api_request')]
#[Schema(definition: [
    'type' => 'object',
    'properties' => [
        'endpoint' => ['type' => 'string', 'format' => 'uri'],
        'method' => ['type' => 'string', 'enum' => ['GET', 'POST', 'PUT', 'DELETE']],
        'headers' => [
            'type' => 'object',
            'patternProperties' => [
                '^[A-Za-z0-9-]+$' => ['type' => 'string']
            ]
        ]
    ],
    'required' => ['endpoint', 'method']
])]
public function processApiRequest(string $endpoint, string $method, array $headers): array
{
    // 当提供 definition 时,PHP 类型提示完全被忽略
    // 上述模式定义具有最高优先级
    return ['status' => 'processed', 'endpoint' => $endpoint];
}

⚠️ 重要提示:完全模式覆盖应尽量少用。它会绕过所有自动模式推断,要求您手动定义整个 JSON 模式。只有在您对 JSON 模式规范非常熟悉且有复杂验证需求、无法通过优先级系统实现时,才使用此方式。大多数情况下,参数级别和方法级别的 #[Schema] 属性已能提供足够的灵活性。

🎨 返回值格式化

服务器会自动将您的处理器返回值格式化为合适的 MCP 内容类型:

自动格式化

// 简单值会自动包装为 TextContent
public function getString(): string { return "Hello World"; }           // → TextContent
public function getNumber(): int { return 42; }                        // → TextContent  
public function getBool(): bool { return true; }                       // → TextContent
public function getArray(): array { return ['key' => 'value']; }       // → TextContent (JSON)

// 空值处理
public function getNull(): ?string { return null; }                    // → TextContent("(null)")
public function returnVoid(): void { /* 无返回 */ }                 // → 空内容

高级内容类型

use PhpMcp\Schema\Content\{TextContent, ImageContent, AudioContent, ResourceContent};

public function getFormattedCode(): TextContent
{
    return TextContent::code('<?php echo "Hello";', 'php');
}

public function getMarkdown(): TextContent  
{
    return TextContent::make('# 标题\n\n内容这里');
}

public function getImage(): ImageContent
{
    return ImageContent::make(
        data: base64_encode(file_get_contents('image.png')),
        mimeType: 'image/png'
    );
}

public function getAudio(): AudioContent
{
    return AudioContent::make(
        data: base64_encode(file_get_contents('audio.mp3')),
        mimeType: 'audio/mpeg'
    );
}

文件与流处理

// 文件对象会自动读取并格式化
public function getFileContent(): \SplFileInfo
{
    return new \SplFileInfo('/path/to/file.txt');  // 自动检测 MIME 类型
}

// 流资源会被完整读取
public function getStreamContent()
{
    $stream = fopen('/path/to/data.json', 'r');
    return $stream;  // 将自动读取并关闭
}

// 结构化资源响应
public function getStructuredResource(): array
{
    return [
        'text' => '文件内容这里',
        'mimeType' => 'text/plain'
    ];
    
    // 或者用于二进制数据:
    // return [
    //     'blob' => base64_encode($binaryData),
    //     'mimeType' => 'application/octet-stream'
    // ];
}

🔄 批量处理

服务器会自动处理 JSON-RPC 批量请求:

// 客户端可在一次 HTTP 调用中发送多个请求:
[
    {"jsonrpc": "2.0", "id": "1", "method": "tools/call", "params": {...}},
    {"jsonrpc": "2.0", "method": "notifications/ping"},              // 通知
    {"jsonrpc": "2.0", "id": "2", "method": "tools/call", "params": {...}}
]

// 服务器返回批量响应(不包括通知):
[
    {"jsonrpc": "2.0", "id": "1", "result": {...}},
    {"jsonrpc": "2.0", "id": "2", "result": {...}}
]

🔧 高级功能

补全提供程序

补全提供程序使 MCP 客户端能够在用户界面中提供自动补全建议。它们专为资源模板提示设计,以帮助用户发现模板变量或提示参数等动态部分的可用选项。

注意:工具和资源可通过标准 MCP 命令(tools/listresources/list)进行查找,因此无需使用补全提供程序。补全提供程序仅用于资源模板(URI 变量)和提示参数。

#[CompletionProvider] 属性支持三种类型的补全源:

1. 自定义提供程序类

对于复杂的补全逻辑,实现 CompletionProviderInterface

use PhpMcp\Server\Contracts\CompletionProviderInterface;
use PhpMcp\Server\Contracts\SessionInterface;
use PhpMcp\Server\Attributes\{McpResourceTemplate, CompletionProvider};

class UserIdCompletionProvider implements CompletionProviderInterface
{
    public function __construct(private DatabaseService $db) {}

    public function getCompletions(string $currentValue, SessionInterface $session): array
    {
        // 从数据库获取动态补全
        return $this->db->searchUsers($currentValue);
    }
}

class UserService
{
    #[McpResourceTemplate(uriTemplate: 'user://{userId}/profile')]
    public function getUserProfile(
        #[CompletionProvider(provider: UserIdCompletionProvider::class)]  // 类字符串 - 由容器解析
        string $userId
    ): array {
        return ['id' => $userId, 'name' => 'John Doe'];
    }
}

您也可以传递预配置的提供程序实例:

class DocumentService  
{
    #[McpPrompt(name: 'document_prompt')]
    public function generatePrompt(
        #[CompletionProvider(provider: new UserIdCompletionProvider($database))]  // 预配置实例
        string $userId,
        
        #[CompletionProvider(provider: $this->categoryProvider)]  // 属性中的实例
        string $category
    ): array {
        return [['role' => 'user', 'content' => "为用户 {$userId} 生成 {$category} 文档"]];
    }
}

2. 简单列表补全

对于静态补全列表,使用 values 参数:

use PhpMcp\Server\Attributes\{McpPrompt, CompletionProvider};

class ContentService
{
    #[McpPrompt(name: 'content_generator')]
    public function generateContent(
        #[CompletionProvider(values: ['blog', 'article', 'tutorial', 'guide', 'documentation'])]
        string $contentType,
        
        #[CompletionProvider(values: ['beginner', 'intermediate', 'advanced', 'expert'])]
        string $difficulty
    ): array {
        return [['role' => 'user', 'content' => "创建一个 {$difficulty} 级别的 {$contentType}"]];
    }
}

3. 枚举类型补全

对于枚举类,使用 enum 参数:

enum Priority: string
{
    case LOW = 'low';
    case MEDIUM = 'medium';
    case HIGH = 'high';
    case CRITICAL = 'critical';
}

enum Status  // 单位枚举(无后备值)
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
}

class TaskService
{
    #[McpTool(name: 'create_task')]
    public function createTask(
        string $title,
        
        #[CompletionProvider(enum: Priority::class)]  // 字符串支持的枚举使用 values
        string $priority,
        
        #[CompletionProvider(enum: Status::class)]    // 单位枚举使用 case 名称
        string $status
    ): array {
        return ['id' => 123, 'title' => $title, 'priority' => $priority, 'status' => $status];
    }
}

手动注册补全提供程序

$server = Server::make()
    ->withServerInfo('补全演示', '1.0.0')
    
    // 使用提供程序类(由容器解析)
    ->withPrompt(
        [DocumentHandler::class, 'generateReport'],
        name: 'document_report'
        // 补全提供程序会自动从方法属性中发现
    )
    
    // 使用闭包并内联补全提供程序
    ->withPrompt(
        function(
            #[CompletionProvider(values: ['json', 'xml', 'csv', 'yaml'])]
            string $format,
            
            #[CompletionProvider(enum: Priority::class)]
            string $priority
        ): array {
            return [['role' => 'user', 'content' => "以 {$format} 格式导出数据,优先级为 {$priority}"]];
        },
        name: 'export_data'
    )
    
    ->build();

补全提供程序解析

服务器会自动处理提供程序解析:

  • 类字符串 (MyProvider::class) → 通过 PSR-11 容器解析,并进行依赖注入
  • 实例 (new MyProvider()) → 直接原样使用
  • 值数组 (['a', 'b', 'c']) → 自动包装为 ListCompletionProvider
  • 枚举类 (MyEnum::class) → 自动包装为 EnumCompletionProvider

重要提示:补全提供程序仅在 MCP 客户端界面中为用户提供建议。用户仍可输入任意值,因此无论补全提供程序有何限制,您都应在处理器中始终对参数进行验证。

自定义依赖注入

您的 MCP 元素处理器可以使用构造函数依赖注入来访问数据库、API 或其他业务逻辑服务。当处理器具有构造函数依赖时,您必须提供一个预配置的 PSR-11 容器,其中包含这些依赖。

默认情况下,服务器使用 BasicContainer —— 一种简单的实现,尝试通过实例化无参构造函数的类来自动注入依赖。对于需要配置的依赖(如数据库连接),您可以手动将其添加到 BasicContainer,或者使用更高级的 PSR-11 容器,例如 PHP-DI 或 Laravel 的容器。

use Psr\Container\ContainerInterface;

class DatabaseService
{
    public function __construct(private \PDO $pdo) {}
    
    #[McpTool(name: 'query_users')]
    public function queryUsers(): array
    {
        $stmt = $this->pdo->query('SELECT * FROM users');
        return $stmt->fetchAll();
    }
}

// 选项 1:使用基本容器并手动添加依赖
$basicContainer = new \PhpMcp\Server\Defaults\BasicContainer();
$basicContainer->set(\PDO::class, new \PDO('sqlite::memory:'));

// 选项 2:使用任何兼容 PSR-11 的容器(PHP-DI、Laravel 等)
$container = new \DI\Container();
$container->set(\PDO::class, new \PDO('mysql:host=localhost;dbname=app', $user, $pass));

$server = Server::make()
    ->withContainer($basicContainer)  // 处理器会自动注入依赖
    ->build();

资源订阅

use PhpMcp\Schema\ServerCapabilities;

$server = Server::make()
    ->withCapabilities(ServerCapabilities::make(
        resourcesSubscribe: true,  // 启用资源订阅
        prompts: true,
        tools: true
    ))
    ->build();

// 在您的资源处理器中,您可以通知客户端发生的变化:
#[McpResource(uri: 'file://config.json')]
public function getConfig(): array
{
    // 当配置发生变化时,通知订阅者
    $this->notifyResourceChange('file://config.json');
    return ['setting' => 'value'];
}

可恢复性和事件存储

对于使用 StreamableHttpServerTransport 的生产部署,您可以通过提供自定义事件存储来实现可恢复性与事件溯源:

use PhpMcp\Server\Contracts\EventStoreInterface;
use PhpMcp\Server\Defaults\InMemoryEventStore;
use PhpMcp\Server\Transports\StreamableHttpServerTransport;

// 使用内置的内存事件存储(用于开发和测试)
$eventStore = new InMemoryEventStore();

// 或者实现您自己的持久化事件存储
class DatabaseEventStore implements EventStoreInterface
{
    public function storeEvent(string $streamId, string $message): string
    {
        // 将事件存储到数据库并返回唯一事件ID
        return $this->database->insert('events', [
            'stream_id' => $streamId,
            'message' => $message,
            'created_at' => now()
        ]);
    }

    public function replayEventsAfter(string $lastEventId, callable $sendCallback): void
    {
        // 重放事件以实现可恢复性
        $events = $this->database->getEventsAfter($lastEventId);
        foreach ($events as $event) {
            $sendCallback($event['id'], $event['message']);
        }
    }
}

// 配置传输层并指定事件存储
$transport = new StreamableHttpServerTransport(
    host: '127.0.0.1',
    port: 8080,
    eventStore: new DatabaseEventStore()  // 启用可恢复性
);

自定义会话处理器

通过创建实现 SessionHandlerInterface 的类,您可以实现自定义会话存储:

use PhpMcp\Server\Contracts\SessionHandlerInterface;

class DatabaseSessionHandler implements SessionHandlerInterface
{
    public function __construct(private \PDO $db) {}

    public function read(string $id): string|false
    {
        $stmt = $this->db->prepare('SELECT data FROM sessions WHERE id = ?');
        $stmt->execute([$id]);
        $session = $stmt->fetch(\PDO::FETCH_ASSOC);
        return $session ? $session['data'] : false;
    }

    public function write(string $id, string $data): bool
    {
        $stmt = $this->db->prepare(
            'INSERT OR REPLACE INTO sessions (id, data, updated_at) VALUES (?, ?, ?)'
        );
        return $stmt->execute([$id, $data, time()]);
    }

    public function destroy(string $id): bool
    {
        $stmt = $this->db->prepare('DELETE FROM sessions WHERE id = ?');
        return $stmt->execute([$id]);
    }

    public function gc(int $maxLifetime): array
    {
        $cutoff = time() - $maxLifetime;
        $stmt = $this->db->prepare('DELETE FROM sessions WHERE updated_at < ?');
        $stmt->execute([$cutoff]);
        return []; // 如果需要,返回已清理的会话ID数组
    }
}

// 使用自定义会话处理器
$server = Server::make()
    ->withSessionHandler(new DatabaseSessionHandler(), 3600)
    ->build();

中间件支持

HttpServerTransportStreamableHttpServerTransport 均支持符合 PSR-7 标准的中间件,用于拦截和修改 HTTP 请求与响应。中间件允许您将认证、日志记录、CORS 处理和请求验证等通用功能提取为可复用组件。

中间件必须是一个有效的 PHP 可调用对象,它接受一个 PSR-7 的 ServerRequestInterface 作为第一个参数,以及一个 callable 作为第二个参数。

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use React\Promise\PromiseInterface;

class AuthMiddleware
{
    public function __invoke(ServerRequestInterface $request, callable $next)
    {
        $apiKey = $request->getHeaderLine('Authorization');
        if (empty($apiKey)) {
            return new Response(401, [], 'Authorization required');
        }
        
        $request = $request->withAttribute('user_id', $this->validateApiKey($apiKey));
        $result = $next($request);
        
        return match (true) {
            $result instanceof PromiseInterface => $result->then(fn($response) => $this->handle($response)),
            $result instanceof ResponseInterface => $this->handle($response),
            default => $result
        };
    }
    
    private function handle($response)
    {
        return $response instanceof ResponseInterface
            ? $response->withHeader('X-Auth-Provider', 'mcp-server')
            : $response;
    }
}

$middlewares = [
    new AuthMiddleware(),
    new LoggingMiddleware(),
    function(ServerRequestInterface $request, callable $next) {
        $result = $next($request);
        return match (true) {
            $result instanceof PromiseInterface => $result->then(function($response) {
                return $response instanceof ResponseInterface 
                    ? $response->withHeader('Access-Control-Allow-Origin', '*')
                    : $response;
            }),
            $result instanceof ResponseInterface => $result->withHeader('Access-Control-Allow-Origin', '*'),
            default => $result
        };
    }
];

$transport = new StreamableHttpServerTransport(
    host: '127.0.0.1',
    port: 8080,
    middlewares: $middlewares
);

重要注意事项:

  • 响应处理:中间件必须同时处理 $next($request) 返回的同步 ResponseInterface 和异步 PromiseInterface,因为 ReactPHP 是异步运行的。
  • 可调用模式:推荐使用可调用类,并单独定义 handle() 方法来处理响应,这样可以复用异步逻辑。
  • 执行顺序:中间件按照提供的顺序执行,最后一个中间件最接近您的 MCP 处理器。

SSL 上下文配置

对于 StreamableHttpServerTransport 的 HTTPS 部署,您可以配置 SSL 上下文选项:

$sslContext = [
    'ssl' => [
        'local_cert' => '/path/to/certificate.pem',
        'local_pk' => '/path/to/private-key.pem',
        'verify_peer' => false,
        'allow_self_signed' => true,
    ]
];

$transport = new StreamableHttpServerTransport(
    host: '0.0.0.0',
    port: 8443,
    sslContext: $sslContext
);

SSL 上下文参考:有关完整的 SSL 上下文选项,请参阅 PHP SSL 上下文选项文档

🔍 错误处理与调试

服务器提供了全面的错误处理与调试功能:

异常处理

工具处理器在出现错误时可以抛出任意 PHP 异常。服务器会自动将这些异常转换为适合 MCP 客户端的 JSON-RPC 错误响应。

#[McpTool(name: 'divide_numbers')]
public function divideNumbers(float $dividend, float $divisor): float
{
    if ($divisor === 0.0) {
        // 包含描述性信息的任何异常都会发送给客户端
        throw new \InvalidArgumentException('除数不能为零');
    }
    
    return $dividend / $divisor;
}

#[McpTool(name: 'calculate_factorial')]
public function calculateFactorial(int $number): int
{
    if ($number < 0) {
        throw new \InvalidArgumentException('负数没有阶乘定义');
    }
    
    if ($number > 20) {
        throw new \OverflowException('数字过大,阶乘会导致溢出');
    }
    
    // 实现继续...
    return $this->factorial($number);
}

服务器会将这些异常转换为 MCP 客户端能够理解并显示给用户的适当 JSON-RPC 错误响应。

日志记录与调试

use Psr\Log\LoggerInterface;

class DebugAwareHandler
{
    public function __construct(private LoggerInterface $logger) {}
    
    #[McpTool(name: 'debug_tool')]
    public function debugTool(string $data): array
    {
        $this->logger->info('正在处理调试工具', ['input' => $data]);
        
        // 对于标准输入输出传输,使用 STDERR 输出调试信息
        fwrite(STDERR, "调试:处理数据长度: " . strlen($data) . "\n");
        
        return ['processed' => true];
    }
}

🚀 生产环境部署

由于 $server->listen() 运行的是一个持久进程,您可以根据自己的基础设施需求采用任何合适的策略进行部署。该服务器可以部署在 VPS、云实例、容器或任何支持长时间运行进程的环境中。

以下是两种常见的部署方案供您参考:

方案一:使用 Supervisor + Nginx 的 VPS(推荐)

适用场景:大多数生产环境部署,性价比高,完全可控

# 1. 在 VPS 上安装您的应用
git clone https://github.com/yourorg/your-mcp-server.git /var/www/mcp-server
cd /var/www/mcp-server
composer install --no-dev --optimize-autoloader

# 2. 安装 Supervisor
sudo apt-get install supervisor

# 3. 创建 Supervisor 配置文件
sudo nano /etc/supervisor/conf.d/mcp-server.conf

Supervisor 配置文件:

[program:mcp-server]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/mcp-server/server.php --transport=http --host=127.0.0.1 --port=8080
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/mcp-server.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=3

Nginx 配置(带 SSL):

# /etc/nginx/sites-available/mcp-server
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name mcp.yourdomain.com;

    # SSL 配置
    ssl_certificate /etc/letsencrypt/live/mcp.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mcp.yourdomain.com/privkey.pem;
    
    # 安全头设置
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;

    # MCP 服务器代理
    location / {
        proxy_http_version 1.1;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 对 SSE 连接很重要
        proxy_buffering off;
        proxy_cache off;
        
        proxy_pass http://127.0.0.1:8080/;
    }
}

# 将 HTTP 重定向到 HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name mcp.yourdomain.com;
    return 301 https://$server_name$request_uri;
}

启动服务:

# 启用并启动 Supervisor
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start mcp-server:*

# 启用并启动 Nginx
sudo systemctl enable nginx
sudo systemctl restart nginx

# 检查状态
sudo supervisorctl status

客户端配置:

{
  "mcpServers": {
    "my-server": {
      "url": "https://mcp.yourdomain.com/mcp"
    }
  }
}

方案二:Docker 部署

适用场景:容器化环境、Kubernetes、云平台

生产 Dockerfile:

FROM php:8.3-fpm-alpine

# 安装系统依赖
RUN apk --no-cache add \
    nginx \
    supervisor \
    && docker-php-ext-enable opcache

# 安装 PHP 扩展以支持 MCP
RUN docker-php-ext-install pdo_mysql pdo_sqlite opcache

# 创建应用目录
WORKDIR /var/www/mcp

# 复制应用代码
COPY . /var/www/mcp
COPY docker/nginx.conf /etc/nginx/nginx.conf
COPY docker/supervisord.conf /etc/supervisord.conf
COPY docker/php.ini /usr/local/etc/php/conf.d/production.ini

# 安装 Composer 依赖
RUN composer install --no-dev --optimize-autoloader --no-interaction

# 设置权限
RUN chown -R www-data:www-data /var/www/mcp

# 暴露端口
EXPOSE 80

# 启动 Supervisor
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]

docker-compose.yml:

services:
  mcp-server:
    build: .
    ports:
      - "8080:80"
    environment:
      - MCP_ENV=production
      - MCP_LOG_LEVEL=info
    volumes:
      - ./storage:/var/www/mcp/storage
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  # 可选:如果需要数据库,可添加
  database:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secure_password
      MYSQL_DATABASE: mcp_server
    volumes:
      - mysql_data:/var/lib/mysql
    restart: unless-stopped

volumes:
  mysql_data:

安全最佳实践

  1. 防火墙配置:
# 只开放必要的端口
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw deny 8080  # MCP 端口不应对外公开
sudo ufw enable
  1. SSL/TLS 设置:
# 安装 Certbot 以获取 Let's Encrypt 证书
sudo apt install certbot python3-certbot-nginx

# 生成 SSL 证书
sudo certbot --nginx -d mcp.yourdomain.com

📚 示例与使用场景

请查看 examples/ 目录中的完整示例:

可用示例

  • 01-discovery-stdio-calculator/ - 带属性发现的基本标准输入计算器
  • 02-discovery-http-userprofile/ - 带用户个人资料管理的HTTP服务器
  • 03-manual-registration-stdio/ - 手动元素注册模式
  • 04-combined-registration-http/ - 手动与发现元素的组合
  • 05-stdio-env-variables/ - 环境变量处理
  • 06-custom-dependencies-stdio/ - 带任务管理的依赖注入
  • 07-complex-tool-schema-http/ - 高级模式验证示例
  • 08-schema-showcase-streamable/ - 全面模式功能展示

运行示例

# 切换到某个示例目录
cd examples/01-discovery-stdio-calculator/

# 使服务器可执行
chmod +x server.php

# 运行服务器(或在您的MCP客户端中进行配置)
./server.php

🚧 从v2.x迁移

如果要从版本2.x迁移,请注意以下关键变化:

模式更新

  • 使用php-mcp/schema包来处理DTO,不再使用内部类
  • 内容类型已移至PhpMcp\Schema\Content\*命名空间
  • 更新了方法签名,以提供更好的类型安全性

会话管理

  • 新增多后端会话管理机制
  • 使用->withSession()->withSessionHandler()进行配置
  • 会话现在可在重新连接时保持持久化(配合缓存后端)

传输变更

  • 新增StreamableHttpServerTransport,支持断点续传
  • 增强了错误处理和事件溯源功能
  • 改进了批量请求处理能力

🧪 测试

# 安装开发依赖
composer install --dev

# 运行测试套件
composer test

# 带覆盖率运行测试(需安装Xdebug)
composer test:coverage

# 运行代码风格检查
composer lint

🤝 贡献

我们欢迎贡献!请参阅CONTRIBUTING.md了解相关指南。

📄 许可证

MIT许可证(MIT)。详情请参阅LICENSE

🙏 致谢

版本历史

3.3.02025/07/12
3.2.22025/07/09
3.2.12025/06/30
3.2.02025/06/30
3.1.12025/06/26
3.1.02025/06/25
3.0.22025/06/25
3.0.12025/06/24
3.0.02025/06/21
2.3.12025/06/13
2.3.02025/06/12
2.2.12025/06/07
2.2.02025/06/03
2.1.02025/05/17
2.0.12025/05/11
2.0.02025/05/11
1.1.02025/05/01
1.0.02025/04/28

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

139k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|今天
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架