-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Expand file tree
/
Copy pathmcp.php
More file actions
68 lines (61 loc) · 2.11 KB
/
Copy pathmcp.php
File metadata and controls
68 lines (61 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
/**
* ShowDoc MCP 独立入口
*
* MCP(Model Context Protocol)服务入口,用于 AI 编辑器集成。
* 支持 Cursor、Windsurf、Cline、Claude Desktop 等 AI 编辑器。
*
* 访问地址:https://your-showdoc.com/mcp.php
*
* MCP 使用 JSON-RPC 2.0 协议,参数通过 HTTP POST 请求体传递:
* {
* "jsonrpc": "2.0",
* "id": 1,
* "method": "tools/call",
* "params": {
* "name": "get_page",
* "arguments": { "page_id": 123 }
* }
* }
*
* 认证方式:Authorization: Bearer user_abc123...
*
* @package ShowDoc
* @author ShowDoc Team
* @since 2026-03-18
*/
// CGI/FastCGI 环境下 Authorization 头可能被剥离,从 apache_request_headers 兜底恢复
if (empty($_SERVER['HTTP_AUTHORIZATION']) && function_exists('apache_request_headers')) {
foreach (apache_request_headers() as $k => $v) {
if (strcasecmp($k, 'Authorization') === 0) {
$_SERVER['HTTP_AUTHORIZATION'] = $v;
$_SERVER['REDIRECT_HTTP_AUTHORIZATION'] = $v;
break;
}
}
}
if (empty($_SERVER['HTTP_AUTHORIZATION']) && !empty($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {
$_SERVER['HTTP_AUTHORIZATION'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
}
// MCP 独立入口,主版和开源版统一使用
// 将请求路由到 MCP 控制器
$_SERVER['REQUEST_URI'] = '/server/Api/Mcp/index';
// 安全加固:MCP 是固定入口,忽略请求 query string。
// 否则客户端可用 ?s=Api/xxx/xxx 覆盖上面的 REQUEST_URI,
// 使 server/index.php 的通用路由把请求分发给任意控制器/方法,绕过 MCP 鉴权。
$_SERVER['QUERY_STRING'] = '';
unset($_GET['s']);
// --- 兼容 GET:客户端 SSE 连接握手 ---
$method = $_SERVER['REQUEST_METHOD'];
if ($method === 'GET') {
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
echo ": connected\n\n";
ob_flush();
flush();
exit;
}
// 注意:不覆盖 REQUEST_METHOD,保持客户端原始方法(POST)
// 注意:不覆盖 POST body,MCP 参数在请求体中传递
// 加载主入口文件
require __DIR__ . '/server/index.php';