Skip to main content
Glama

1MCP Server

MockFactories.ts6 kB
import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js'; import { InboundConnection, OutboundConnection, OutboundConnections, ServerStatus, } from '@src/../src/core/types/index.js'; import { ClientSessionData } from '@src/auth/sessionTypes.js'; import { vi } from 'vitest'; /** * Factory for creating mock logger instances */ export const createMockLogger = () => ({ info: vi.fn(), error: vi.fn(), warn: vi.fn(), debug: vi.fn(), child: vi.fn().mockReturnThis(), }); /** * Factory for creating mock MCP transport instances */ export const createMockTransport = (overrides?: Partial<Transport>): Transport => ({ name: 'test-transport', start: vi.fn().mockResolvedValue(undefined), send: vi.fn().mockResolvedValue(undefined), close: vi.fn().mockResolvedValue(undefined), ...overrides, }) as Transport; /** * Factory for creating mock MCP client instances */ export const createMockClient = (overrides?: Partial<Client>): Partial<Client> => ({ connect: vi.fn().mockResolvedValue(undefined), close: vi.fn().mockResolvedValue(undefined), request: vi.fn().mockResolvedValue({}), notification: vi.fn().mockResolvedValue(undefined), setRequestHandler: vi.fn(), setNotificationHandler: vi.fn(), ...overrides, }); /** * Factory for creating mock MCP server instances */ export const createMockServer = (overrides?: Partial<Server>): Partial<Server> => ({ connect: vi.fn().mockResolvedValue(undefined), close: vi.fn().mockResolvedValue(undefined), request: vi.fn().mockResolvedValue({}), notification: vi.fn().mockResolvedValue(undefined), setRequestHandler: vi.fn(), setNotificationHandler: vi.fn(), ...overrides, }); /** * Factory for creating mock client status objects */ export const createMockClientStatus = ( overrides?: Partial<{ status: string; lastSeen: Date; errorCount: number }>, ): { status: string; lastSeen: Date; errorCount: number } => ({ status: 'connected', lastSeen: new Date(), errorCount: 0, ...overrides, }); /** * Factory for creating mock outbound connections */ export const createMockOutboundConnections = ( connections?: Record<string, OutboundConnection>, ): OutboundConnections => { const map = new Map<string, OutboundConnection>(); if (connections) { Object.entries(connections).forEach(([key, value]) => { map.set(key, value); }); } return map; }; /** * Factory for creating mock inbound connections */ export const createMockInboundConnection = (overrides?: Partial<InboundConnection>): InboundConnection => ({ server: createMockServer() as Server, status: ServerStatus.Connected, tags: ['test'], enablePagination: false, ...overrides, }); /** * Factory for creating mock client session data */ export const createMockClientSessionData = (overrides?: Partial<ClientSessionData>): ClientSessionData => ({ serverName: 'test-server', clientInfo: JSON.stringify({ client_id: 'test-client-123', client_secret: 'secret-value', redirect_uris: ['https://app.com/callback'], }), tokens: JSON.stringify({ access_token: 'access-token-123', refresh_token: 'refresh-token-456', token_type: 'Bearer', expires_in: 3600, }), createdAt: Date.now(), expires: Date.now() + 3600000, ...overrides, }); /** * Factory for creating mock Express request objects */ export const createMockExpressRequest = (overrides?: any) => ({ params: {}, query: {}, body: {}, headers: {}, method: 'GET', url: '/', ...overrides, }); /** * Factory for creating mock Express response objects */ export const createMockExpressResponse = () => { const res = { status: vi.fn().mockReturnThis(), json: vi.fn().mockReturnThis(), send: vi.fn().mockReturnThis(), redirect: vi.fn().mockReturnThis(), cookie: vi.fn().mockReturnThis(), clearCookie: vi.fn().mockReturnThis(), setHeader: vi.fn().mockReturnThis(), end: vi.fn().mockReturnThis(), }; return res; }; /** * Factory for creating mock file system operations */ export const createMockFileSystem = () => ({ existsSync: vi.fn().mockReturnValue(true), readFileSync: vi.fn().mockReturnValue('{}'), writeFileSync: vi.fn(), mkdirSync: vi.fn(), rmSync: vi.fn(), readdirSync: vi.fn().mockReturnValue([]), statSync: vi.fn().mockReturnValue({ isDirectory: () => false }), }); /** * Factory for creating mock process objects */ export const createMockProcess = (overrides?: any) => ({ pid: 12345, stdout: { on: vi.fn(), pipe: vi.fn(), }, stderr: { on: vi.fn(), pipe: vi.fn(), }, stdin: { write: vi.fn(), end: vi.fn(), }, on: vi.fn(), kill: vi.fn(), ...overrides, }); /** * Factory for creating mock configuration objects */ export const createMockConfig = (overrides?: any) => ({ servers: [ { name: 'test-server', command: 'node', args: ['test-server.js'], cwd: '/tmp', env: {}, }, ], transports: { stdio: { enabled: true }, http: { enabled: false }, sse: { enabled: false }, }, auth: { enabled: false, providers: {}, }, ...overrides, }); /** * Collection of commonly used mock modules */ export const MOCK_MODULES = { logger: () => vi.mock('../../src/logger/logger.js', () => ({ default: createMockLogger(), })), client: () => vi.mock('@modelcontextprotocol/sdk/client/index.js', () => ({ Client: vi.fn().mockImplementation(() => createMockClient()), })), server: () => vi.mock('@modelcontextprotocol/sdk/server/index.js', () => ({ Server: vi.fn().mockImplementation(() => createMockServer()), })), fs: () => vi.mock('fs', () => createMockFileSystem()), childProcess: () => vi.mock('child_process', () => ({ spawn: vi.fn().mockReturnValue(createMockProcess()), })), };

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/1mcp-app/agent'

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