Skip to content

Commit b614b91

Browse files
committed
feat(settings): 新增 MCP 端点开关
1 parent 860574f commit b614b91

3 files changed

Lines changed: 41 additions & 2 deletions

File tree

lib/src/i18n/translations.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,12 @@ class S {
879879
'HTTP API for querying and controlling tasks, for MCP servers and automation scripts (authentication required)',
880880
);
881881

882+
String get apiServiceMcp => _t('MCP 端点', 'MCP Endpoint');
883+
String get apiServiceMcpDesc => _t(
884+
'暴露 Model Context Protocol 端点,供 Claude Desktop、Cursor、Cline 等 AI 客户端接入(与管理 API 共用令牌,强制鉴权)',
885+
'Exposes a Model Context Protocol endpoint for AI clients like Claude Desktop, Cursor, and Cline (shares the Management API token, authentication required)',
886+
);
887+
882888
String get apiServiceAddress => _t('地址', 'Address');
883889

884890
List<String> get searchKeywordsApiService => _t(

lib/src/models/settings_provider.dart

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ class SettingsProvider extends ChangeNotifier {
108108
bool _localServerTakeoverEnabled = true;
109109
bool _localServerJsonrpcEnabled = true;
110110
bool _localServerApiEnabled = false;
111+
bool _localServerMcpEnabled = false;
111112

112113
// UA 设置
113114
String _globalUserAgent = ''; // 空字符串 = 使用内置 Chrome UA
@@ -292,6 +293,7 @@ class SettingsProvider extends ChangeNotifier {
292293
bool get localServerTakeoverEnabled => _localServerTakeoverEnabled;
293294
bool get localServerJsonrpcEnabled => _localServerJsonrpcEnabled;
294295
bool get localServerApiEnabled => _localServerApiEnabled;
296+
bool get localServerMcpEnabled => _localServerMcpEnabled;
295297

296298
// UA 设置 Getter
297299
String get globalUserAgent => _globalUserAgent;
@@ -816,16 +818,24 @@ class SettingsProvider extends ChangeNotifier {
816818
_saveToRust('local_server_token', value);
817819
}
818820

819-
/// 清空访问令牌。若管理 API 正依赖此令牌(已启用),则一并关闭管理 API
821+
/// 清空访问令牌。若管理 API / MCP 正依赖此令牌(已启用),则一并关闭它们
820822
/// 避免出现「已启用但无 token」的非法状态。
821823
void clearLocalServerToken() {
822-
if (_localServerToken.isEmpty && !_localServerApiEnabled) return;
824+
if (_localServerToken.isEmpty &&
825+
!_localServerApiEnabled &&
826+
!_localServerMcpEnabled) {
827+
return;
828+
}
823829
_localServerToken = '';
824830
_saveToRust('local_server_token', '');
825831
if (_localServerApiEnabled) {
826832
_localServerApiEnabled = false;
827833
_saveToRust('local_server_api_enabled', 'false');
828834
}
835+
if (_localServerMcpEnabled) {
836+
_localServerMcpEnabled = false;
837+
_saveToRust('local_server_mcp_enabled', 'false');
838+
}
829839
notifyListeners();
830840
}
831841

@@ -855,6 +865,18 @@ class SettingsProvider extends ChangeNotifier {
855865
_saveToRust('local_server_api_enabled', value.toString());
856866
}
857867

868+
/// MCP 端点强制鉴权(与管理 API 共用 token):从关到开且当前 token 为空时,自动生成并保存
869+
void setLocalServerMcpEnabled(bool value) {
870+
if (_localServerMcpEnabled == value) return;
871+
_localServerMcpEnabled = value;
872+
if (value && _localServerToken.isEmpty) {
873+
_localServerToken = _generateHexToken();
874+
_saveToRust('local_server_token', _localServerToken);
875+
}
876+
notifyListeners();
877+
_saveToRust('local_server_mcp_enabled', value.toString());
878+
}
879+
858880
/// 生成 32 位随机 hex token(管理 API 自动鉴权 / UI 手动重新生成共用)
859881
static String _generateHexToken() {
860882
final r = Random.secure();
@@ -1150,6 +1172,8 @@ class SettingsProvider extends ChangeNotifier {
11501172
_localServerJsonrpcEnabled = entry.value == 'true';
11511173
case 'local_server_api_enabled':
11521174
_localServerApiEnabled = entry.value == 'true';
1175+
case 'local_server_mcp_enabled':
1176+
_localServerMcpEnabled = entry.value == 'true';
11531177
case 'global_user_agent':
11541178
_globalUserAgent = entry.value;
11551179
case 'default_queue_id':

lib/src/pages/settings_page.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4096,6 +4096,15 @@ class _ApiServiceContentState extends State<_ApiServiceContent> {
40964096
onChanged: (v) => sp.setLocalServerApiEnabled(v),
40974097
address: 'http://127.0.0.1:$livePort/api/v1',
40984098
),
4099+
const SizedBox(height: 10),
4100+
_ApiSubFeatureCard(
4101+
masterEnabled: enabled,
4102+
label: s.apiServiceMcp,
4103+
description: s.apiServiceMcpDesc,
4104+
value: sp.localServerMcpEnabled,
4105+
onChanged: (v) => sp.setLocalServerMcpEnabled(v),
4106+
address: 'http://127.0.0.1:$livePort/mcp',
4107+
),
40994108
],
41004109
);
41014110
},

0 commit comments

Comments
 (0)