@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
TypeScript
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;
}