From 4b455822cb4196dff0bf28b621313342316a664b Mon Sep 17 00:00:00 2001 From: Jordan SkyLF Date: Wed, 13 May 2026 14:57:28 -0700 Subject: [PATCH 1/2] Fix MCP tools list overflow --- CHANGELOG.md | 2 + static/i18n.js | 140 ++++++++++++++++++++++++++ static/index.html | 4 +- static/panels.js | 88 ++++++++++++++-- static/style.css | 11 ++ tests/test_mcp_tools_list_overflow.py | 90 +++++++++++++++++ 6 files changed, 325 insertions(+), 10 deletions(-) create mode 100644 tests/test_mcp_tools_list_overflow.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 48e58a6e..38af17bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,8 @@ ### Fixed +- MCP Tools in Settings → System now uses a bounded scroll region with 5-item default pages, a per-page selector up to 40 tools, and a visible result summary, so large MCP tool inventories no longer make the settings panel balloon indefinitely. + - **PR #2201** by @MrFant — Multi-turn conversations with thinking-mode providers (MiMo/Xiaomi, DeepSeek, Kimi/Moonshot) no longer 400 with `Param Incorrect: reasoning_content must be passed back`. WebUI's `_sanitize_messages_for_api()` strips fields not in `_API_SAFE_MSG_KEYS` before sending conversation history to the LLM; `reasoning_content` was missing from the whitelist, so when history was replayed on the second turn, the assistant message with `tool_calls` arrived without `reasoning_content` and providers enforcing thinking-mode echo-back rejected it. One-line fix: adds `'reasoning_content'` to `_API_SAFE_MSG_KEYS`. CLI was unaffected because `run_agent.py` has its own `_copy_reasoning_content_for_api()` that doesn't go through this filter. - **PR #2198** by @Michaelyklam — Fork-from-here keep-count was off-by-one (or larger) for truncated sessions where the visible-message index didn't match the absolute transcript index. JS now sends `_oldestIdx + msgIdx` (the absolute message index in the full transcript) as `keep_count` instead of the visible-window-relative index — captured *before* `_ensureAllMessagesLoaded()` resets `_oldestIdx`, so the index remains stable. Backend `source_messages[:keep_count]` then forks from the correct point even when the user has only loaded a tail window. When the full transcript is loaded (`_oldestIdx==0`), behavior is unchanged. 186-line regression suite in `tests/test_issue2184_fork_from_here_absolute_index.py` explicitly pins `keep_count: absoluteKeepCount` (and forbids the old `keep_count: msgIdx` form). diff --git a/static/i18n.js b/static/i18n.js index b0a28ade..4e9fe34d 100644 --- a/static/i18n.js +++ b/static/i18n.js @@ -92,6 +92,20 @@ const LOCALES = { mcp_tools_load_failed: 'Failed to load MCP tools.', mcp_tools_schema_empty: 'No schema parameters.', mcp_tools_runtime_note: 'Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.', + mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`, + mcp_tools_summary_none: 'No MCP tools to show.', + mcp_tools_summary_matching: (query) => ` matching “${query}”`, + mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`, + mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`, + mcp_tools_page_size_prefix: 'Show', + mcp_tools_page_size_suffix: 'per page', + mcp_tools_per_page_aria: 'MCP tools per page', + mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`, + mcp_tools_pagination_label: 'MCP tools pagination', + mcp_tools_previous_page: '‹ Prev', + mcp_tools_previous_page_aria: 'Previous MCP tools page', + mcp_tools_next_page: 'Next ›', + mcp_tools_next_page_aria: 'Next MCP tools page', // PDF preview (#480) pdf_loading: 'Loading PDF {0}…', pdf_too_large: 'PDF too large for inline preview', @@ -1217,6 +1231,20 @@ const LOCALES = { mcp_tools_load_failed: 'Caricamento strumenti MCP fallito.', mcp_tools_schema_empty: 'Nessun parametro schema.', mcp_tools_runtime_note: "L'inventario strumenti usa solo dati runtime MCP già noti; la WebUI non avvia né interroga i server.", + mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`, + mcp_tools_summary_none: 'No MCP tools to show.', + mcp_tools_summary_matching: (query) => ` matching “${query}”`, + mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`, + mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`, + mcp_tools_page_size_prefix: 'Show', + mcp_tools_page_size_suffix: 'per page', + mcp_tools_per_page_aria: 'MCP tools per page', + mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`, + mcp_tools_pagination_label: 'MCP tools pagination', + mcp_tools_previous_page: '‹ Prev', + mcp_tools_previous_page_aria: 'Previous MCP tools page', + mcp_tools_next_page: 'Next ›', + mcp_tools_next_page_aria: 'Next MCP tools page', // PDF preview (#480) pdf_loading: 'Caricamento PDF {0}…', pdf_too_large: "PDF troppo grande per l'anteprima inline", @@ -2334,6 +2362,20 @@ const LOCALES = { mcp_tools_load_failed: 'MCP ツールの読み込みに失敗しました。', mcp_tools_schema_empty: 'スキーマパラメータはありません。', mcp_tools_runtime_note: 'ツール一覧は既知の MCP ランタイム情報のみを使用します。WebUI はサーバーの起動や探索を行いません。', + mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`, + mcp_tools_summary_none: 'No MCP tools to show.', + mcp_tools_summary_matching: (query) => ` matching “${query}”`, + mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`, + mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`, + mcp_tools_page_size_prefix: 'Show', + mcp_tools_page_size_suffix: 'per page', + mcp_tools_per_page_aria: 'MCP tools per page', + mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`, + mcp_tools_pagination_label: 'MCP tools pagination', + mcp_tools_previous_page: '‹ Prev', + mcp_tools_previous_page_aria: 'Previous MCP tools page', + mcp_tools_next_page: 'Next ›', + mcp_tools_next_page_aria: 'Next MCP tools page', // PDF preview (#480) pdf_loading: 'PDF {0} を読み込み中…', pdf_too_large: 'PDF が大きすぎてインラインプレビューできません', @@ -3453,6 +3495,20 @@ const LOCALES = { mcp_tools_load_failed: 'Failed to load MCP tools.', mcp_tools_schema_empty: 'No schema parameters.', mcp_tools_runtime_note: 'Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.', + mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`, + mcp_tools_summary_none: 'No MCP tools to show.', + mcp_tools_summary_matching: (query) => ` matching “${query}”`, + mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`, + mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`, + mcp_tools_page_size_prefix: 'Show', + mcp_tools_page_size_suffix: 'per page', + mcp_tools_per_page_aria: 'MCP tools per page', + mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`, + mcp_tools_pagination_label: 'MCP tools pagination', + mcp_tools_previous_page: '‹ Prev', + mcp_tools_previous_page_aria: 'Previous MCP tools page', + mcp_tools_next_page: 'Next ›', + mcp_tools_next_page_aria: 'Next MCP tools page', thinking: 'Думаю', expand_all: 'Развернуть всё', collapse_all: 'Свернуть всё', @@ -4504,6 +4560,20 @@ const LOCALES = { mcp_tools_load_failed: 'Failed to load MCP tools.', mcp_tools_schema_empty: 'No schema parameters.', mcp_tools_runtime_note: 'Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.', + mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`, + mcp_tools_summary_none: 'No MCP tools to show.', + mcp_tools_summary_matching: (query) => ` matching “${query}”`, + mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`, + mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`, + mcp_tools_page_size_prefix: 'Show', + mcp_tools_page_size_suffix: 'per page', + mcp_tools_per_page_aria: 'MCP tools per page', + mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`, + mcp_tools_pagination_label: 'MCP tools pagination', + mcp_tools_previous_page: '‹ Prev', + mcp_tools_previous_page_aria: 'Previous MCP tools page', + mcp_tools_next_page: 'Next ›', + mcp_tools_next_page_aria: 'Next MCP tools page', thinking: 'Pensando', expand_all: 'Expandir todo', collapse_all: 'Contraer todo', @@ -5558,6 +5628,20 @@ const LOCALES = { mcp_tools_load_failed: 'Failed to load MCP tools.', mcp_tools_schema_empty: 'No schema parameters.', mcp_tools_runtime_note: 'Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.', + mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`, + mcp_tools_summary_none: 'No MCP tools to show.', + mcp_tools_summary_matching: (query) => ` matching “${query}”`, + mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`, + mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`, + mcp_tools_page_size_prefix: 'Show', + mcp_tools_page_size_suffix: 'per page', + mcp_tools_per_page_aria: 'MCP tools per page', + mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`, + mcp_tools_pagination_label: 'MCP tools pagination', + mcp_tools_previous_page: '‹ Prev', + mcp_tools_previous_page_aria: 'Previous MCP tools page', + mcp_tools_next_page: 'Next ›', + mcp_tools_next_page_aria: 'Next MCP tools page', thinking: 'Nachdenken', expand_all: 'Alle ausklappen', collapse_all: 'Alle einklappen', @@ -6616,6 +6700,20 @@ const LOCALES = { mcp_tools_load_failed: '加载 MCP 工具失败。', mcp_tools_schema_empty: '无参数。', mcp_tools_runtime_note: '工具清单仅使用已知的活跃 MCP 运行时数据;WebUI 不会启动或探测服务器。', + mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`, + mcp_tools_summary_none: 'No MCP tools to show.', + mcp_tools_summary_matching: (query) => ` matching “${query}”`, + mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`, + mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`, + mcp_tools_page_size_prefix: 'Show', + mcp_tools_page_size_suffix: 'per page', + mcp_tools_per_page_aria: 'MCP tools per page', + mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`, + mcp_tools_pagination_label: 'MCP tools pagination', + mcp_tools_previous_page: '‹ Prev', + mcp_tools_previous_page_aria: 'Previous MCP tools page', + mcp_tools_next_page: 'Next ›', + mcp_tools_next_page_aria: 'Next MCP tools page', thinking: '思考过程', expand_all: '全部展开', collapse_all: '全部折叠', @@ -7662,6 +7760,20 @@ const LOCALES = { mcp_tools_load_failed: 'Failed to load MCP tools.', mcp_tools_schema_empty: 'No schema parameters.', mcp_tools_runtime_note: 'Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.', + mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`, + mcp_tools_summary_none: 'No MCP tools to show.', + mcp_tools_summary_matching: (query) => ` matching “${query}”`, + mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`, + mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`, + mcp_tools_page_size_prefix: 'Show', + mcp_tools_page_size_suffix: 'per page', + mcp_tools_per_page_aria: 'MCP tools per page', + mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`, + mcp_tools_pagination_label: 'MCP tools pagination', + mcp_tools_previous_page: '‹ Prev', + mcp_tools_previous_page_aria: 'Previous MCP tools page', + mcp_tools_next_page: 'Next ›', + mcp_tools_next_page_aria: 'Next MCP tools page', thinking: '\u601d\u8003\u904e\u7a0b', expand_all: '\u5168\u90e8\u5c55\u958b', collapse_all: '\u5168\u90e8\u6298\u758a', @@ -9764,6 +9876,20 @@ const LOCALES = { mcp_tools_load_failed: 'Failed to load MCP tools.', mcp_tools_schema_empty: 'No schema parameters.', mcp_tools_runtime_note: 'Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.', + mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`, + mcp_tools_summary_none: 'No MCP tools to show.', + mcp_tools_summary_matching: (query) => ` matching “${query}”`, + mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`, + mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`, + mcp_tools_page_size_prefix: 'Show', + mcp_tools_page_size_suffix: 'per page', + mcp_tools_per_page_aria: 'MCP tools per page', + mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`, + mcp_tools_pagination_label: 'MCP tools pagination', + mcp_tools_previous_page: '‹ Prev', + mcp_tools_previous_page_aria: 'Previous MCP tools page', + mcp_tools_next_page: 'Next ›', + mcp_tools_next_page_aria: 'Next MCP tools page', thinking: '생각 중', expand_all: '모두 펼치기', collapse_all: '모두 접기', @@ -10878,6 +11004,20 @@ const LOCALES = { mcp_tools_load_failed: 'Échec du chargement des outils MCP.', mcp_tools_schema_empty: 'Aucun paramètre de schéma.', mcp_tools_runtime_note: 'L\'inventaire des outils utilise uniquement les données d\'exécution MCP actives déjà connues ; le WebUI ne démarre pas et ne sonde pas les serveurs.', + mcp_tools_summary_no_matches: (query,total) => `No MCP tools matching “${query}” (${total} total MCP tools).`, + mcp_tools_summary_none: 'No MCP tools to show.', + mcp_tools_summary_matching: (query) => ` matching “${query}”`, + mcp_tools_summary_total_note: (total) => ` (${total} total MCP tools)`, + mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Showing ${start}-${end} of ${filtered} MCP tools${searchNote}${totalNote}. Page ${page} of ${pages}.`, + mcp_tools_page_size_prefix: 'Show', + mcp_tools_page_size_suffix: 'per page', + mcp_tools_per_page_aria: 'MCP tools per page', + mcp_tools_inactive_configured_servers: (servers) => `Configured but inactive in this WebUI runtime: ${servers}.`, + mcp_tools_pagination_label: 'MCP tools pagination', + mcp_tools_previous_page: '‹ Prev', + mcp_tools_previous_page_aria: 'Previous MCP tools page', + mcp_tools_next_page: 'Next ›', + mcp_tools_next_page_aria: 'Next MCP tools page', pdf_loading: 'Chargement du PDF {0}…', pdf_too_large: 'PDF trop volumineux pour un aperçu en ligne', pdf_no_pages: 'Le PDF n\'a pas de pages', diff --git a/static/index.html b/static/index.html index 8a530d16..f7c3f07d 100644 --- a/static/index.html +++ b/static/index.html @@ -1138,7 +1138,9 @@
Search known tools across active MCP servers.
-
+
+
+
Tool inventory only uses already-known active MCP runtime data; the WebUI does not start or probe servers.
diff --git a/static/panels.js b/static/panels.js index d942fac0..c3c6bfe3 100644 --- a/static/panels.js +++ b/static/panels.js @@ -6285,6 +6285,10 @@ function loadMcpServers(){ }).catch(()=>{list.innerHTML=`
${esc(t('mcp_load_failed'))}
`}); } let _mcpToolsCache=[]; +let _mcpToolsMeta={}; +let _mcpToolsPage=1; +let _mcpToolsPageSize=5; +const MCP_TOOLS_PAGE_SIZE_OPTIONS=[5,10,20,40]; function _filterMcpToolsForSearch(tools, query){ const q=(query||'').trim().toLowerCase(); if(!q) return Array.isArray(tools)?tools:[]; @@ -6301,16 +6305,56 @@ function _mcpToolSchemaText(schemaSummary){ return `${p.name}${req}: ${p.type||'unknown'}${desc}`; }).join('\n'); } -function _renderMcpTools(tools, query){ - const list=$('mcpToolList'); - if(!list) return; - const filtered=_filterMcpToolsForSearch(tools, query); - if(!filtered.length){ - const key=query?'mcp_tools_no_matches':'mcp_tools_no_tools'; - list.innerHTML=`
${esc(t(key))}
`; +function _mcpToolsSummary(total, filtered, page, pages, query){ + const trimmedQuery=(query||'').trim(); + if(!filtered){ + if(trimmedQuery) return t('mcp_tools_summary_no_matches',trimmedQuery,total); + return total?t('mcp_tools_summary_none'):''; + } + const pageSize=_mcpToolsPageSize||5; + const start=(page-1)*pageSize+1; + const end=Math.min(filtered,page*pageSize); + const searchNote=trimmedQuery?t('mcp_tools_summary_matching',trimmedQuery):''; + const totalNote=filtered===total?'':t('mcp_tools_summary_total_note',total); + return t('mcp_tools_summary_showing',start,end,filtered,searchNote,totalNote,page,pages); +} +function _mcpToolPageSizeControl(){ + const options=MCP_TOOLS_PAGE_SIZE_OPTIONS.map(size=>``).join(''); + return ``; +} +function _mcpToolsEmptyMessage(query){ + const base=esc(t(query?'mcp_tools_no_matches':'mcp_tools_no_tools')); + const unavailable=Array.isArray(_mcpToolsMeta.unavailable_servers)?_mcpToolsMeta.unavailable_servers:[]; + if(query||!unavailable.length) return base; + return `${base}
${esc(t('mcp_tools_inactive_configured_servers',unavailable.join(', ')))}`; +} +function _renderMcpToolPager(filteredCount, page, pages){ + const pager=$('mcpToolPager'); + if(!pager) return; + if(pages<=1){ + pager.innerHTML=''; return; } - list.innerHTML=filtered.map(tool=>{ + pager.innerHTML=` + ${page} / ${pages} + `; +} +function _renderMcpTools(tools, query){ + const list=$('mcpToolList'); + const toolbar=$('mcpToolToolbar'); + if(!list) return; + const filtered=_filterMcpToolsForSearch(tools, query); + const total=Array.isArray(tools)?tools.length:0; + const pages=Math.max(1,Math.ceil(filtered.length/_mcpToolsPageSize)); + _mcpToolsPage=Math.min(Math.max(1,_mcpToolsPage||1),pages); + if(toolbar) toolbar.innerHTML=`${esc(_mcpToolsSummary(total,filtered.length,_mcpToolsPage,pages,query))}${_mcpToolPageSizeControl()}`; + _renderMcpToolPager(filtered.length,_mcpToolsPage,pages); + if(!filtered.length){ + list.innerHTML=`
${_mcpToolsEmptyMessage(query)}
`; + return; + } + const visible=filtered.slice((_mcpToolsPage-1)*_mcpToolsPageSize,_mcpToolsPage*_mcpToolsPageSize); + list.innerHTML=visible.map(tool=>{ const status=tool.status||'unknown'; const statusBadge=`${esc(_mcpStatusLabel(status))}`; const schemaText=_mcpToolSchemaText(tool.schema_summary); @@ -6325,16 +6369,42 @@ function _renderMcpTools(tools, query){ `; }).join(''); } -function filterMcpTools(){ +function setMcpToolsPage(page){ + _mcpToolsPage=page; const input=$('mcpToolSearch'); _renderMcpTools(_mcpToolsCache,input?input.value:''); + const list=$('mcpToolList'); + if(list) list.scrollTop=0; +} +function setMcpToolsPageSize(size){ + const next=Number(size); + if(!MCP_TOOLS_PAGE_SIZE_OPTIONS.includes(next)) return; + _mcpToolsPageSize=next; + _mcpToolsPage=1; + const input=$('mcpToolSearch'); + _renderMcpTools(_mcpToolsCache,input?input.value:''); + const list=$('mcpToolList'); + if(list) list.scrollTop=0; +} +function filterMcpTools(){ + _mcpToolsPage=1; + const input=$('mcpToolSearch'); + _renderMcpTools(_mcpToolsCache,input?input.value:''); + const list=$('mcpToolList'); + if(list) list.scrollTop=0; } function loadMcpTools(){ const list=$('mcpToolList'); + const toolbar=$('mcpToolToolbar'); + const pager=$('mcpToolPager'); if(!list) return; + if(toolbar) toolbar.textContent=''; + if(pager) pager.innerHTML=''; list.innerHTML=`
${esc(t('loading'))}
`; api('/api/mcp/tools').then(r=>{ _mcpToolsCache=(r&&Array.isArray(r.tools))?r.tools:[]; + _mcpToolsMeta=r||{}; + _mcpToolsPage=1; filterMcpTools(); }).catch(()=>{list.innerHTML=`
${esc(t('mcp_tools_load_failed'))}
`}); } diff --git a/static/style.css b/static/style.css index 67b9b6f5..4c10f894 100644 --- a/static/style.css +++ b/static/style.css @@ -2493,10 +2493,21 @@ main.main.showing-logs > #mainLogs{display:flex;} .mcp-readonly-note,.mcp-restart-hint{margin-top:8px;color:var(--muted);font-size:11px;line-height:1.45;background:var(--code-bg);border:1px solid var(--border2);border-radius:6px;padding:8px 10px;} .mcp-tool-search{width:100%;margin:0 0 8px 0;padding:8px 10px;background:var(--code-bg);color:var(--text);border:1px solid var(--border2);border-radius:8px;font-size:12px;outline:none;} .mcp-tool-search:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-bg-soft);} +.mcp-tool-toolbar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 0 8px;color:var(--muted);font-size:11px;line-height:1.35;flex-wrap:wrap;} +.mcp-tool-summary{min-width:0;} +.mcp-tool-page-size{display:inline-flex;align-items:center;gap:5px;white-space:nowrap;color:var(--muted);font-size:11px;} +.mcp-tool-page-size select{appearance:none;border:1px solid var(--border2);background:var(--code-bg);color:var(--text);border-radius:7px;padding:4px 22px 4px 8px;font-size:11px;font-weight:600;line-height:1.2;cursor:pointer;} +.mcp-tool-empty-detail{display:inline-block;margin-top:4px;color:var(--muted);font-size:11px;line-height:1.35;} +.mcp-tool-list{max-height:min(52vh,560px);overflow:auto;padding-right:3px;scrollbar-gutter:stable;} .mcp-tool-row{display:flex;flex-direction:column;gap:5px;padding:9px 10px;border:1px solid var(--border);border-radius:8px;margin-bottom:6px;font-size:12px;background:var(--surface);} .mcp-tool-name{font-weight:600;color:var(--text);overflow-wrap:anywhere;} .mcp-tool-server{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);background:var(--code-bg);border:1px solid var(--border2);border-radius:999px;padding:2px 6px;} .mcp-tool-schema{margin:2px 0 0 0;padding:7px 8px;white-space:pre-wrap;max-height:140px;overflow:auto;background:var(--code-bg);border:1px solid var(--border2);border-radius:6px;color:var(--muted);font-size:11px;line-height:1.45;} +.mcp-tool-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:8px;} +.mcp-tool-page-label{color:var(--muted);font-size:11px;min-width:44px;text-align:center;} +.mcp-tool-page-btn{border:1px solid var(--border2);background:var(--code-bg);color:var(--text);border-radius:7px;padding:5px 9px;font-size:11px;font-weight:600;cursor:pointer;} +.mcp-tool-page-btn:hover:not(:disabled){border-color:var(--accent-bg-strong);color:var(--accent-text);} +.mcp-tool-page-btn:disabled{opacity:.45;cursor:not-allowed;} /* Picker grids (theme / skin / font-size): make the card chrome use tokens so all skins flip correctly. */ diff --git a/tests/test_mcp_tools_list_overflow.py b/tests/test_mcp_tools_list_overflow.py new file mode 100644 index 00000000..9e418cd9 --- /dev/null +++ b/tests/test_mcp_tools_list_overflow.py @@ -0,0 +1,90 @@ +"""Regression coverage for large MCP tool inventories in Settings → System.""" + +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +INDEX_HTML = (ROOT / "static" / "index.html").read_text(encoding="utf-8") +PANELS_JS = (ROOT / "static" / "panels.js").read_text(encoding="utf-8") +STYLE_CSS = (ROOT / "static" / "style.css").read_text(encoding="utf-8") +CHANGELOG = (ROOT / "CHANGELOG.md").read_text(encoding="utf-8") +I18N_JS = (ROOT / "static" / "i18n.js").read_text(encoding="utf-8") + + +def test_mcp_tool_list_has_summary_list_and_pager_mounts(): + assert 'id="mcpToolToolbar"' in INDEX_HTML + assert 'aria-live="polite"' in INDEX_HTML + assert 'id="mcpToolList" class="mcp-tool-list"' in INDEX_HTML + assert 'id="mcpToolPager"' in INDEX_HTML + assert 'aria-label="MCP tools pagination"' in INDEX_HTML + assert 'data-i18n-aria-label="mcp_tools_pagination_label"' in INDEX_HTML + + +def test_mcp_tool_rendering_is_paginated_not_full_list_rendered(): + assert "let _mcpToolsPageSize=5" in PANELS_JS + assert "const MCP_TOOLS_PAGE_SIZE_OPTIONS=[5,10,20,40]" in PANELS_JS + assert "filtered.slice((_mcpToolsPage-1)*_mcpToolsPageSize,_mcpToolsPage*_mcpToolsPageSize)" in PANELS_JS + assert "list.innerHTML=visible.map(tool=>" in PANELS_JS + assert "list.innerHTML=filtered.map(tool=>" not in PANELS_JS + + +def test_mcp_tool_page_size_selector_resets_to_first_page(): + assert "function setMcpToolsPageSize(size){" in PANELS_JS + assert "if(!MCP_TOOLS_PAGE_SIZE_OPTIONS.includes(next)) return;" in PANELS_JS + assert "_mcpToolsPageSize=next;\n _mcpToolsPage=1;" in PANELS_JS + assert "mcp_tools_per_page_aria" in PANELS_JS + + +def test_mcp_tool_search_respects_selected_page_size(): + assert "const filtered=_filterMcpToolsForSearch(tools, query);" in PANELS_JS + assert "const pages=Math.max(1,Math.ceil(filtered.length/_mcpToolsPageSize));" in PANELS_JS + assert "mcp_tools_summary_showing" in PANELS_JS + assert "t('mcp_tools_summary_showing',start,end,filtered,searchNote,totalNote,page,pages)" in PANELS_JS + assert "mcp_tools_summary_no_matches" in PANELS_JS + + +def test_mcp_tool_search_resets_to_first_page_and_page_changes_scroll_top(): + assert "function setMcpToolsPage(page){" in PANELS_JS + assert "function filterMcpTools(){\n _mcpToolsPage=1;" in PANELS_JS + search_block = PANELS_JS.split("function filterMcpTools(){", 1)[1].split("function loadMcpTools(){", 1)[0] + assert "if(list) list.scrollTop=0;" in search_block + + +def test_mcp_tool_empty_state_mentions_inactive_configured_servers(): + assert "let _mcpToolsMeta={}" in PANELS_JS + assert "mcp_tools_inactive_configured_servers" in PANELS_JS + assert "_mcpToolsMeta=r||{};" in PANELS_JS + + +def test_mcp_tool_list_is_bounded_scroll_region_with_pager_chrome(): + assert ".mcp-tool-list{max-height:min(52vh,560px);overflow:auto" in STYLE_CSS + assert "scrollbar-gutter:stable" in STYLE_CSS + assert ".mcp-tool-pager{display:flex" in STYLE_CSS + assert ".mcp-tool-page-btn" in STYLE_CSS + assert ".mcp-tool-page-size" in STYLE_CSS + + +def test_mcp_tool_pagination_strings_are_i18n_backed(): + for key in [ + "mcp_tools_summary_no_matches", + "mcp_tools_summary_none", + "mcp_tools_summary_matching", + "mcp_tools_summary_total_note", + "mcp_tools_summary_showing", + "mcp_tools_page_size_prefix", + "mcp_tools_page_size_suffix", + "mcp_tools_per_page_aria", + "mcp_tools_inactive_configured_servers", + "mcp_tools_pagination_label", + "mcp_tools_previous_page", + "mcp_tools_previous_page_aria", + "mcp_tools_next_page", + "mcp_tools_next_page_aria", + ]: + assert f"{key}:" in I18N_JS + + +def test_changelog_mentions_large_mcp_tool_inventory_fix(): + assert "large MCP tool inventories" in CHANGELOG + assert "5-item default pages" in CHANGELOG + assert "per-page selector up to 40 tools" in CHANGELOG From 9b2c402253c3fa7aec88663247010e4c89f6ca8f Mon Sep 17 00:00:00 2001 From: Jordan SkyLF Date: Wed, 13 May 2026 15:50:48 -0700 Subject: [PATCH 2/2] Add MCP tools overflow PR screenshots --- .../pr-media/2210/after-mcp-tools-paginated.png | Bin 0 -> 39511 bytes .../2210/before-mcp-tools-unbounded.png | Bin 0 -> 39657 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/pr-media/2210/after-mcp-tools-paginated.png create mode 100644 docs/pr-media/2210/before-mcp-tools-unbounded.png diff --git a/docs/pr-media/2210/after-mcp-tools-paginated.png b/docs/pr-media/2210/after-mcp-tools-paginated.png new file mode 100644 index 0000000000000000000000000000000000000000..e27935105a5d03b8b44fb9659ee279fb7dd17aae GIT binary patch literal 39511 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 literal 0 HcmV?d00001 diff --git a/docs/pr-media/2210/before-mcp-tools-unbounded.png b/docs/pr-media/2210/before-mcp-tools-unbounded.png new file mode 100644 index 0000000000000000000000000000000000000000..9123a563cff69e16822ac508370662db6a07e7ea GIT binary patch literal 39657 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 literal 0 HcmV?d00001