返回市场
mcp-saas服务器

mcp-saas服务器

作者:SEOLinkMap2 星标更新:2025-09-17

项目介绍

使用PHP构建网站服务端

PHP版本 许可证 PSR-15 PSR-7 Composer

WaaSuP (使用PHP的网站作为服务器) - 一个面向SaaS的生产就绪型Model Context Protocol (MCP) 服务器实现。内置企业级功能包括OAuth 2.1认证、实时Server-Sent Events (SSE) 和全面的工具管理。

🚀 在线试用

想看看WaaSuP的实际效果吗?连接到我们的在线演示MCP服务器,使用您喜欢的LLM或代理工具!

💬 与仓库聊天

立即获得帮助:

  • 安装指导 - 环境设置步骤
  • ⚙️ 配置支持 - 数据库设置、OAuth、框架集成
  • 🛠️ 自定义工具开发 - 根据您的需求构建工具
  • 🐛 故障排除 - 访问完整代码库进行调试
  • 📚 代码探索 - 了解功能背后的实现

MCP服务器可以访问我们整个仓库、文档和示例。您可以向它提问!

📡 在线MCP服务器

https://seolinkmap.com/mcp-repo

这个公共MCP端点展示了服务器的能力,实现了完整的“网站作为服务器”(无需身份验证)。

🔗 需要帮助连接?

新接触MCP服务器? 学习如何连接:如何连接到MCP服务器

一旦连接,您可以通过聊天探索我们的整个仓库,并获得WaaSuP安装和配置的实时帮助。

SEOLinkMap构建 - 这是我们生产的“聊天和代理性Web服务器”,为AI提供了对我们整个SEO智能平台的访问。

✨ 特性

  • 🔐 OAuth 2.1认证 - 完整的OAuth流程,支持RFC 8707资源指示符(适用于MCP 2025-06-18)
  • 多传输支持 - 实时消息传递的Server-Sent Events (SSE) 和可流式传输的HTTP
  • 🛠️ 灵活的工具系统 - 通过类和可调用方法轻松注册工具
  • 🏢 多租户架构 - 为SaaS应用程序提供机构/用户上下文隔离
  • 📊 生产就绪 - 全面的日志记录、错误处理和会话管理
  • 🔌 框架无关 - 符合PSR标准,包含Slim框架和Laravel集成
  • 💾 数据库及内存存储 - 多种存储后端以适应不同的部署场景
  • 🌐 CORS支持 - 完整的跨源资源共享配置
  • 🎵 音频内容支持 - 工具和提示中的音频内容处理(适用于MCP 2025-03-26+)
  • 📝 结构化用户输入 - 收集结构化数据的支持(适用于MCP 2025-06-18)
  • 🔄 进度通知 - 带有版本感知的消息的实时进度更新
  • 🏷️ 工具注释 - 丰富的工具元数据,便于LLM理解(适用于MCP 2025-03-26+)
  • 📦 JSON-RPC批处理 - 高效的批量请求处理(适用于MCP 2025-03-26)

要求

  • PHP 8.1 或更高版本
  • Composer
  • 数据库(推荐生产环境使用MySQL/PostgreSQL)

MCP协议合规性

WaaSuP实现了多个协议版本的完整MCP规范,并自动进行特性门控:

特性矩阵总结

特性2024-11-052025-03-262025-06-18
工具
提示
资源
抽样
根目录
心跳
进度通知
工具注释
音频内容
补全
JSON-RPC批处理
OAuth 2.1
引发
结构化输出
资源链接
资源指示符(RFC 8707)✅ (必需)

安装

composer require seolinkmap/waasup

# 用于PSR-3日志支持
composer require monolog/monolog

# 用于Slim框架集成
composer require slim/slim slim/psr7

数据库设置

  1. 导入数据库模式:
1. 打开 `examples/database/database-schema.sql`
2. 使用MySQL部分或PostgreSQL部分(不要同时使用两者)
3. 根据需要自定义表名/前缀
4. 只创建您需要的表(如果您有自己的表映射)
  1. 创建第一个机构:
INSERT INTO mcp_agencies (uuid, name, active)
VALUES ('550e8400-e29b-41d4-a716-446655440000', '我的公司', 1);
  1. 创建一个OAuth令牌:
INSERT INTO mcp_oauth_tokens (
    access_token, scope, expires_at, agency_id
) VALUES (
    'your-secret-token-here',
    'mcp:read mcp:write',
    DATE_ADD(NOW(), INTERVAL 1 YEAR),
    1
);

快速开始

基本服务器设置

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

use Slim\Factory\AppFactory;
use Slim\Psr7\Factory\{ResponseFactory, StreamFactory};
use Seolinkmap\Waasup\Storage\DatabaseStorage;
use Seolinkmap\Waasup\Tools\Registry\ToolRegistry;
use Seolinkmap\Waasup\Prompts\Registry\PromptRegistry;
use Seolinkmap\Waasup\Resources\Registry\ResourceRegistry;
use Seolinkmap\Waasup\Integration\Slim\SlimMCPProvider;

// 数据库连接
$pdo = new PDO('mysql:host=localhost;dbname=mcp_server', $user, $pass, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);

// 初始化组件
$storage = new DatabaseStorage($pdo, ['table_prefix' => 'mcp_']);
$toolRegistry = new ToolRegistry();
$promptRegistry = new PromptRegistry();
$resourceRegistry = new ResourceRegistry();
$responseFactory = new ResponseFactory();
$streamFactory = new StreamFactory();

// 配置
$config = [
    'server_info' => [
        'name' => '我的MCP服务器',
        'version' => '0.0.7'
    ],
    'auth' => [
        'context_types' => ['agency'],
        'base_url' => 'https://your-domain.com'
    ]
];

// 创建MCP提供者
$mcpProvider = new SlimMCPProvider(
    $storage, $toolRegistry, $promptRegistry, $resourceRegistry,
    $responseFactory, $streamFactory, $config
);

// 设置Slim应用
$app = AppFactory::create();
$app->addErrorMiddleware(true, true, true);

// OAuth发现端点
$app->get('/.well-known/oauth-authorization-server',
    [$mcpProvider, 'handleAuthDiscovery']);

// 主MCP端点
$app->map(['GET', 'POST', 'OPTIONS'], '/mcp/{agencyUuid}[/{sessID}]',
    [$mcpProvider, 'handleMCP'])
    ->add($mcpProvider->getAuthMiddleware());

$app->run();

添加工具

简单的可调用工具

$toolRegistry->register('get_weather', function($params, $context) {
    $location = $params['location'] ?? '未知';
    return [
        'location' => $location,
        'temperature' => '22°C',
        'condition' => '晴朗'
    ];
}, [
    'description' => '获取某个地点的天气信息',
    'inputSchema' => [
        'type' => 'object',
        'properties' => [
            'location' => ['type' => 'string', 'description' => '地点名称']
        ],
        'required' => ['location']
    ]
]);

内置工具

use Seolinkmap\Waasup\Tools\Built\{PingTool, ServerInfoTool};

$toolRegistry->registerTool(new PingTool());
$toolRegistry->registerTool(new ServerInfoTool($config));

添加提示和资源

// 注册提示
$promptRegistry->register('greeting', function($arguments, $context) {
    $name = $arguments['name'] ?? '那里';
    return [
        'description' => '友好的问候提示',
        'messages' => [[
            'role' => 'user',
            'content' => [['type' => 'text', 'text' => "请问候{$name}。"]]
        ]]
    ];
});

// 注册资源
$resourceRegistry->register('server://status', function($uri, $context) {
    return [
        'contents' => [[
            'uri' => $uri,
            'mimeType' => 'application/json',
            'text' => json_encode(['status' => '健康', '时间戳' => date('c')])
        ]]
    ];
});

框架集成

Laravel集成

在您的Laravel应用中添加服务提供者:

// config/app.php
'providers' => [
    Seolinkmap\Waasup\Integration\Laravel\LaravelServiceProvider::class,
],

注册路由并使用提供的控制器模式。请参阅/examples目录中的完整Laravel集成示例。

单独使用(PSR-7)

use Seolinkmap\Waasup\MCPSaaSServer;

$server = new MCPSaaSServer($storage, $toolRegistry, $promptRegistry, $resourceRegistry, $config, $logger);
$response = $server->handle($request, $response);

配置

服务器配置

$config = [
    'supported_versions' => ['2025-06-18', '2025-03-26', '2024-11-05'],
    'server_info' => [
        'name' => '您的MCP服务器',
        'version' => '0.0.7'
    ],
    'auth' => [
        'context_types' => ['agency', 'user'],
        'validate_scope' => true,
        'required_scopes' => ['mcp:read'],
        'base_url' => 'https://your-domain.com'
    ],
    'sse' => [
        'keepalive_interval' => 1,
        'max_connection_time' => 1800,
        'switch_interval_after' => 60
    ]
];

存储选项

数据库存储(生产环境)

$storage = new DatabaseStorage($pdo, [
    'table_prefix' => 'mcp_',
    'cleanup_interval' => 3600
]);

内存存储(开发/测试)

$storage = new MemoryStorage();
// 添加测试数据
$storage->addContext('550e8400-e29b-41d4-a716-446655440000', 'agency', [
    'id' => 1, 'name' => '测试机构', 'active' => true
]);

OAuth 2.1 & 认证

WaaSuP实现了完整的OAuth 2.1,包括RFC 8707资源指示符(适用于MCP 2025-06-18):

  • 授权码流程,带有PKCE(必需)
  • 资源指示符,用于将令牌绑定到特定的MCP端点
  • 社交认证,通过Google、LinkedIn和GitHub
  • 令牌验证,带有受众声明和范围检查
  • 发现端点,用于客户端配置

社交认证可以针对每个提供商进行配置:

$config['google'] = [
    'client_id' => 'your-google-client-id',
    'client_secret' => 'your-google-client-secret',
    'redirect_uri' => 'https://your-domain.com/oauth/google/callback'
];

高级功能

音频内容处理(MCP 2025-03-26+)

use Seolinkmap\Waasup\Content\AudioContentHandler;

// 在您的工具中
return [
    'content' => [
        ['type' => 'text', 'text' => '这是音频文件:'],
        AudioContentHandler::createFromFile('/path/to/audio.mp3', 'example.mp3')
    ]
];

结构化用户输入(MCP 2025-06-18)

// 请求结构化的用户输入
$requestId = $server->requestElicitation(
    $sessionId,
    '请提供您的联系信息',
    [
        'type' => 'object',
        'properties' => [
            'name' => ['type' => 'string'],
            'email' => ['type' => 'string', 'format' => 'email']
        ]
    ]
);

进度通知

// 在长时间运行的操作期间发送进度更新
$server->sendProgressNotification($sessionId, 50, '正在处理数据...');

API参考

MCP方法

方法描述支持的版本
initialize初始化MCP会话所有
ping健康检查所有
tools/list列出可用工具所有
tools/call执行工具所有
prompts/list列出可用提示所有
prompts/get获取提示所有
resources/list列出可用资源所有
resources/read读取资源所有
completion/complete获取参数的补全所有
sampling/createMessage请求LLM抽样所有
roots/list列出可用根目录所有
elicitation/create请求用户输入2025-06-18

错误代码

代码描述
-32000需要认证
-32001需要会话
-32600请求无效
-32601方法未找到
-32602参数无效
-32603内部错误
-32700解析错误

测试

# 运行测试
composer test

# 静态分析
composer analyse

# 代码格式化
composer format

安全

  • 令牌验证:所有请求都需要有效的OAuth令牌,并进行适当的受众验证
  • 范围检查:可配置的范围验证,实现细粒度的访问控制
  • SQL注入保护:所有数据库查询都使用预编译语句
  • 会话安全:加密安全的会话ID生成
  • CORS配置:可配置的CORS策略,用于跨域请求
  • DNS重新绑定保护:本地端点的来源头验证

部署

Docker

FROM php:8.1-fpm-alpine
RUN docker-php-ext-install pdo pdo_mysql
COPY . /var/www/html
WORKDIR /var/www/html
RUN composer install --no-dev --optimize-autoloader
EXPOSE 9000
CMD ["php-fpm"]

Nginx配置

server {
    listen 80;
    server_name your-mcp-server.com;
    root /var/www/html/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # SSE连接超时
    location /mcp/ {
        proxy_read_timeout 1800s;
        proxy_send_timeout 1800s;
    }
}

贡献

我们欢迎贡献!此服务器在**[SEOLinkMap](https