c998a53566
* feat(mcp): add tools visibility management ## Features - Tools visibility modal with 3 modes: All, Include, Exclude - 'Manage Tools' button on McpServerCard (enabled only when connected) - 'Fetch Tools List' button to refresh available tools (raw mode) - Responsive design for mobile (480px), tablet (768px), desktop (1280px) - i18n translations for 9 languages (zh/en/zh-TW/ja/ko/de/es/fr/pt) ## Technical Details - Add raw parameter to fetchMcpTools API for unfiltered tools - Pass raw parameter through controller → bridgeMcpAction → client - Backend _mcp_tools_list supports raw_mode to skip include/exclude filter - 28 MCP unit tests pass (23 controller + 5 bridge action) ## Files Changed - McpManagerView.vue: Tools visibility modal with mode selector - McpServerCard.vue: Add manage tools button - mcp.ts (client): Add raw parameter to fetchMcpTools - mcp.ts (controller): Pass raw parameter to bridge - mcp.ts (services): Pass raw parameter to client.mcpTools - client.ts: Add raw parameter to mcpTools - hermes_bridge.py: Support raw_mode in _mcp_tools_list - 9 locale files: Add 14 translation keys each - mcp-controller.test.ts: Add 3 new test cases - bridge-mcp-action.test.ts: New test file for parameter passing * Delete projects directory chore: remove accidentally committed projects/ directory * fix MCP tools visibility edge cases * remove MCP docs screenshots --------- Co-authored-by: Crafter-feng <succeed_happu@163.com> Co-authored-by: Crafter-feng <37255449+Crafter-feng@users.noreply.github.com>
57 lines
2.7 KiB
TypeScript
57 lines
2.7 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
|
|
// ── Mocks ──────────────────────────────────────────────────
|
|
const mcpToolsMock = vi.fn()
|
|
|
|
vi.mock('../../packages/server/src/services/hermes/agent-bridge/client', () => ({
|
|
AgentBridgeClient: vi.fn().mockImplementation(() => ({
|
|
mcpTools: mcpToolsMock,
|
|
})),
|
|
}))
|
|
|
|
vi.mock('../../packages/server/src/services/logger', () => ({
|
|
logger: { warn: vi.fn(), error: vi.fn(), info: vi.fn() },
|
|
}))
|
|
|
|
// ── Tests ──────────────────────────────────────────────────
|
|
describe('bridgeMcpAction - mcp_tools_list', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
})
|
|
|
|
it('passes server and profile to client.mcpTools', async () => {
|
|
mcpToolsMock.mockResolvedValue({ ok: true, results: [] })
|
|
const { bridgeMcpAction } = await import('../../packages/server/src/services/hermes/mcp')
|
|
await bridgeMcpAction('mcp_tools_list', { server: 'github' }, 'test-profile')
|
|
expect(mcpToolsMock).toHaveBeenCalledWith('github', 'test-profile', undefined)
|
|
})
|
|
|
|
it('passes raw=true to client.mcpTools', async () => {
|
|
mcpToolsMock.mockResolvedValue({ ok: true, results: [] })
|
|
const { bridgeMcpAction } = await import('../../packages/server/src/services/hermes/mcp')
|
|
await bridgeMcpAction('mcp_tools_list', { server: 'github', raw: true }, 'test-profile')
|
|
expect(mcpToolsMock).toHaveBeenCalledWith('github', 'test-profile', true)
|
|
})
|
|
|
|
it('passes raw=false to client.mcpTools', async () => {
|
|
mcpToolsMock.mockResolvedValue({ ok: true, results: [] })
|
|
const { bridgeMcpAction } = await import('../../packages/server/src/services/hermes/mcp')
|
|
await bridgeMcpAction('mcp_tools_list', { server: 'github', raw: false }, 'test-profile')
|
|
expect(mcpToolsMock).toHaveBeenCalledWith('github', 'test-profile', false)
|
|
})
|
|
|
|
it('passes undefined server when not provided', async () => {
|
|
mcpToolsMock.mockResolvedValue({ ok: true, results: [] })
|
|
const { bridgeMcpAction } = await import('../../packages/server/src/services/hermes/mcp')
|
|
await bridgeMcpAction('mcp_tools_list', {}, 'test-profile')
|
|
expect(mcpToolsMock).toHaveBeenCalledWith(undefined, 'test-profile', undefined)
|
|
})
|
|
|
|
it('passes undefined profile when not provided', async () => {
|
|
mcpToolsMock.mockResolvedValue({ ok: true, results: [] })
|
|
const { bridgeMcpAction } = await import('../../packages/server/src/services/hermes/mcp')
|
|
await bridgeMcpAction('mcp_tools_list', { server: 'github' })
|
|
expect(mcpToolsMock).toHaveBeenCalledWith('github', undefined, undefined)
|
|
})
|
|
})
|