Skip to main content
Glama

Keyboard Shortcuts MCP Server

by jenova-marie
handlers.test.ts•5.93 kB
import { describe, it, expect, vi } from 'vitest'; import { handleGetShortcuts } from './handlers.js'; import type { GetShortcutsParams, DataStore, ShortcutData } from './types.js'; import type { OpusClient } from './opus-client.js'; describe('handleGetShortcuts', () => { it('should return shortcuts when data is found', async () => { const mockShortcuts: ShortcutData[] = [ { os: 'ubuntu', desktop: null, application: 'tmux', file: 'tmux', categories: [ { name: 'Pane Management', shortcuts: [{ keys: 'Prefix + %', description: 'Split pane vertically' }], }, ], }, ]; const mockDataStore: DataStore = { shortcuts: mockShortcuts, getByFilters: vi.fn().mockReturnValue(mockShortcuts), }; const mockOpusClient = { queryShortcuts: vi.fn().mockResolvedValue('Use Prefix + % to split vertically'), } as unknown as OpusClient; const params: GetShortcutsParams = { os: 'ubuntu', application: 'tmux', query: 'how to split pane vertically?', }; const result = await handleGetShortcuts(params, mockDataStore, mockOpusClient); expect(mockDataStore.getByFilters).toHaveBeenCalledWith({ os: 'ubuntu', desktop: undefined, application: 'tmux', }); expect(mockOpusClient.queryShortcuts).toHaveBeenCalledWith( 'how to split pane vertically?', mockShortcuts ); expect(result).toEqual({ content: [ { type: 'text', text: 'Use Prefix + % to split vertically', }, ], }); }); it('should return error message when no data is found', async () => { const mockDataStore: DataStore = { shortcuts: [], getByFilters: vi.fn().mockReturnValue([]), }; const mockOpusClient = { queryShortcuts: vi.fn(), } as unknown as OpusClient; const params: GetShortcutsParams = { os: 'windows', query: 'test query', }; const result = await handleGetShortcuts(params, mockDataStore, mockOpusClient); expect(mockDataStore.getByFilters).toHaveBeenCalledWith({ os: 'windows', desktop: undefined, application: undefined, }); expect(mockOpusClient.queryShortcuts).not.toHaveBeenCalled(); expect(result).toEqual({ content: [ { type: 'text', text: 'No shortcut data found for: OS=windows', }, ], }); }); it('should include desktop and application in error message when provided', async () => { const mockDataStore: DataStore = { shortcuts: [], getByFilters: vi.fn().mockReturnValue([]), }; const mockOpusClient = { queryShortcuts: vi.fn(), } as unknown as OpusClient; const params: GetShortcutsParams = { os: 'ubuntu', desktop: 'gnome', application: 'firefox', query: 'test query', }; const result = await handleGetShortcuts(params, mockDataStore, mockOpusClient); expect(result.content[0].text).toBe( 'No shortcut data found for: OS=ubuntu, Desktop=gnome, App=firefox' ); }); it('should filter by os, desktop, and application', async () => { const mockShortcuts: ShortcutData[] = [ { os: 'ubuntu', desktop: 'gnome', application: 'firefox', file: 'firefox', categories: [], }, ]; const mockDataStore: DataStore = { shortcuts: mockShortcuts, getByFilters: vi.fn().mockReturnValue(mockShortcuts), }; const mockOpusClient = { queryShortcuts: vi.fn().mockResolvedValue('Firefox shortcuts'), } as unknown as OpusClient; const params: GetShortcutsParams = { os: 'ubuntu', desktop: 'gnome', application: 'firefox', query: 'new tab', }; await handleGetShortcuts(params, mockDataStore, mockOpusClient); expect(mockDataStore.getByFilters).toHaveBeenCalledWith({ os: 'ubuntu', desktop: 'gnome', application: 'firefox', }); }); it('should handle optional desktop parameter', async () => { const mockShortcuts: ShortcutData[] = [ { os: 'ubuntu', desktop: null, application: 'vim', file: 'vim', categories: [], }, ]; const mockDataStore: DataStore = { shortcuts: mockShortcuts, getByFilters: vi.fn().mockReturnValue(mockShortcuts), }; const mockOpusClient = { queryShortcuts: vi.fn().mockResolvedValue('Vim shortcuts'), } as unknown as OpusClient; const params: GetShortcutsParams = { os: 'ubuntu', application: 'vim', query: 'save file', }; await handleGetShortcuts(params, mockDataStore, mockOpusClient); expect(mockDataStore.getByFilters).toHaveBeenCalledWith({ os: 'ubuntu', desktop: undefined, application: 'vim', }); }); it('should pass filtered data to opus client', async () => { const mockShortcuts: ShortcutData[] = [ { os: 'ubuntu', desktop: 'gnome', application: null, file: 'window-management', categories: [ { name: 'Window Tiling', shortcuts: [{ keys: 'Super + Left', description: 'Tile left' }], }, ], }, ]; const mockDataStore: DataStore = { shortcuts: mockShortcuts, getByFilters: vi.fn().mockReturnValue(mockShortcuts), }; const mockOpusClient = { queryShortcuts: vi.fn().mockResolvedValue('Use Super + Left'), } as unknown as OpusClient; const params: GetShortcutsParams = { os: 'ubuntu', desktop: 'gnome', query: 'tile window left', }; await handleGetShortcuts(params, mockDataStore, mockOpusClient); expect(mockOpusClient.queryShortcuts).toHaveBeenCalledWith( 'tile window left', mockShortcuts ); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jenova-marie/keyboard-shortcuts-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server