diff --git a/docs/configuration/mcp-settings.mdx b/docs/configuration/mcp-settings.mdx index eec8850..9682981 100644 --- a/docs/configuration/mcp-settings.mdx +++ b/docs/configuration/mcp-settings.mdx @@ -76,6 +76,42 @@ MCPHub uses several configuration files: | Field | Type | Default | Description | | -------------- | ------- | --------------- | --------------------------- | | `env` | object | `{}` | Environment variables | +| `perSession` | boolean | `false` | Create separate server instance per user session (for stateful servers like playwright) | +| `enabled` | boolean | `true` | Enable/disable the server | +| `timeout` | number | `60000` | Request timeout in milliseconds | +| `keepAliveInterval` | number | `60000` | Keep-alive ping interval for SSE servers (ms) | + +## Per-Session Server Instances + +Some MCP servers maintain state that should be isolated between different users. For example, the Playwright server maintains browser sessions that could leak form data or other state between concurrent users. + +To prevent this, you can set `perSession: true` in the server configuration. This creates a separate server instance for each user session instead of sharing a single instance across all users. + +### When to Use Per-Session Servers + +Use `perSession: true` for servers that: +- Maintain browser state (like Playwright) +- Store user-specific data in memory +- Have file handles or database connections that shouldn't be shared +- Could cause race conditions when multiple users access simultaneously + +### Example Configuration + +```json +{ + "playwright": { + "command": "npx", + "args": ["@playwright/mcp@latest", "--headless", "--isolated"], + "perSession": true + } +} +``` + +**Important Notes:** +- Each per-session server instance consumes additional resources (memory, CPU) +- Per-session servers are automatically cleaned up when the user session ends +- For Playwright, also use the `--isolated` flag to ensure browser contexts are isolated +- Not recommended for stateless servers that can safely be shared ## Common MCP Server Examples diff --git a/docs/zh/configuration/mcp-settings.mdx b/docs/zh/configuration/mcp-settings.mdx index 9519691..229ff81 100644 --- a/docs/zh/configuration/mcp-settings.mdx +++ b/docs/zh/configuration/mcp-settings.mdx @@ -80,13 +80,48 @@ MCPHub 使用几个配置文件: | 字段 | 类型 | 默认值 | 描述 | | -------------- | ------- | --------------- | ------------------ | | `env` | object | `{}` | 环境变量 | +| `perSession` | boolean | `false` | 为每个用户会话创建独立的服务器实例(用于有状态的服务器,如 playwright) | +| `enabled` | boolean | `true` | 启用/禁用服务器 | +| `timeout` | number | `60000` | 请求超时(毫秒) | +| `keepAliveInterval` | number | `60000` | SSE 服务器的保活 ping 间隔(毫秒) | | `cwd` | string | `process.cwd()` | 工作目录 | -| `timeout` | number | `30000` | 启动超时(毫秒) | | `restart` | boolean | `true` | 失败时自动重启 | | `maxRestarts` | number | `5` | 最大重启次数 | | `restartDelay` | number | `5000` | 重启间延迟(毫秒) | | `stdio` | string | `pipe` | stdio 配置 | +## 会话隔离的服务器实例 + +某些 MCP 服务器会维护应该在不同用户之间隔离的状态。例如,Playwright 服务器维护可能在并发用户之间泄漏表单数据或其他状态的浏览器会话。 + +为了防止这种情况,您可以在服务器配置中设置 `perSession: true`。这将为每个用户会话创建一个单独的服务器实例,而不是在所有用户之间共享单个实例。 + +### 何时使用会话隔离的服务器 + +对于以下服务器使用 `perSession: true`: +- 维护浏览器状态(如 Playwright) +- 在内存中存储用户特定数据 +- 具有不应共享的文件句柄或数据库连接 +- 当多个用户同时访问时可能导致竞争条件 + +### 示例配置 + +```json +{ + "playwright": { + "command": "npx", + "args": ["@playwright/mcp@latest", "--headless", "--isolated"], + "perSession": true + } +} +``` + +**重要提示:** +- 每个会话隔离的服务器实例都会消耗额外的资源(内存、CPU) +- 会话隔离的服务器在用户会话结束时会自动清理 +- 对于 Playwright,还要使用 `--isolated` 标志以确保浏览器上下文被隔离 +- 不建议用于可以安全共享的无状态服务器 + ## 常见 MCP 服务器示例 ### Web 和 API 服务器 diff --git a/tests/services/perSessionServers.test.ts b/tests/services/perSessionServers.test.ts index c1fd532..6eb1f4a 100644 --- a/tests/services/perSessionServers.test.ts +++ b/tests/services/perSessionServers.test.ts @@ -1,7 +1,6 @@ import { getOrCreatePerSessionServer, cleanupPerSessionServers, - handleCallToolRequest, } from '../../src/services/mcpService'; import { ServerConfig } from '../../src/types';