UNPKG

@ankimcp/anki-mcp-server

Version:

Model Context Protocol server for Anki - enables AI assistants to interact with your Anki flashcards

65 lines (64 loc) • 2.14 kB
import { EventEmitter } from "events"; import { CredentialsService, TunnelCredentials } from "./credentials.service"; import { DeviceFlowService } from "./device-flow.service"; export interface McpRequestHandler { handle(request: { method: string; path: string; headers: Record<string, string>; body: string; }): Promise<{ status: number; headers?: Record<string, string>; body: string; }>; } export declare class TunnelClientError extends Error { readonly code: string; readonly originalError?: unknown | undefined; constructor(message: string, code: string, originalError?: unknown | undefined); } export declare class TunnelClient extends EventEmitter { private readonly mcpHandler; private readonly credentialsService; private readonly deviceFlowService; private readonly tunnelUrl; private readonly logger; private ws; private reconnectAttempts; private reconnectTimer; private isConnecting; private isManualDisconnect; private isReconnecting; private currentTunnelUrl; private credentials; private connectionTimeout; private lastServerPingTime; private healthCheckInterval; private pongTimeout; constructor(mcpHandler: McpRequestHandler, credentialsService: CredentialsService, deviceFlowService: DeviceFlowService, tunnelUrl: string); connect(initialCredentials?: TunnelCredentials): Promise<string>; disconnect(): void; isConnected(): boolean; getTunnelUrl(): string | null; private establishConnection; private establishWithAuthRetry; private isAuthFailure; private handleMessage; private handleRequest; private mapHandlerError; private handlePing; private handleError; private sendResponse; private sendPong; private isPermanentCloseCode; private handleReconnection; private startHealthCheck; private stopHealthCheck; private checkConnectionHealth; private handlePong; private refreshTokenAndSave; private clearReconnectTimer; private clearConnectionTimeout; private wrapError; }