import type { OAuthClientInformationMixed, OAuthClientMetadata, OAuthClientProvider, OAuthTokens } from '@modelcontextprotocol/client';
import { Client } from '@modelcontextprotocol/client';
import type { JsonObject } from '../../types.ts';
import { ApiError } from '../api/errors.ts';
import type { NotionConfig } from './config.ts';
export interface NotionTransport {
    callTool(name: string, args: Record<string, unknown>): Promise<Record<string, unknown>>;
}
export declare class NotionMCPError extends Error {
    readonly code: string | null;
    readonly raw: unknown;
    constructor(message: string, opts?: {
        code?: string | null;
        raw?: unknown;
    });
}
export interface MCPNotionTransportOptions {
    authProvider: OAuthClientProvider;
    serverUrl?: string;
}
export declare class MCPNotionTransport implements NotionTransport {
    protected client: Client | null;
    private connectPromise;
    private readonly authProvider;
    private readonly serverUrl;
    constructor(opts: MCPNotionTransportOptions);
    private ensureConnected;
    callTool(name: string, args: Record<string, unknown>): Promise<Record<string, unknown>>;
}
export interface MemoryOAuthClientProviderOptions {
    clientMetadata: OAuthClientMetadata;
    redirect: (url: URL) => void | Promise<void>;
    redirectUrl?: string | URL;
}
/**
 * An `OAuthClientProvider` that holds the client registration, tokens and
 * PKCE verifier in memory, for an `MCPNotionTransport` whose session ends
 * with the page.
 */
export declare class MemoryOAuthClientProvider implements OAuthClientProvider {
    private readonly opts;
    private _clientInformation;
    private _tokens;
    private _codeVerifier;
    constructor(opts: MemoryOAuthClientProviderOptions);
    get redirectUrl(): string | URL | undefined;
    get clientMetadata(): OAuthClientMetadata;
    clientInformation(): OAuthClientInformationMixed | undefined;
    saveClientInformation(info: OAuthClientInformationMixed): void;
    tokens(): OAuthTokens | undefined;
    saveTokens(tokens: OAuthTokens): void;
    redirectToAuthorization(authorizationUrl: URL): void | Promise<void>;
    saveCodeVerifier(codeVerifier: string): void;
    codeVerifier(): string;
    clearTokens(): void;
}
export declare class NotionAPIError extends ApiError {
    readonly code: string | null;
    constructor(message: string, status?: number | null, code?: string | null);
}
/** Refuse a list response Notion marked incomplete. */
export declare function completePage(page: JsonObject): JsonObject;
export interface RestCall {
    method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';
    path: string;
    query?: Record<string, unknown>;
    /**
     * Any JSON value, not only an object: `ntn api` sends whatever `--data`
     * or the pipe carried, verbatim, with no client-side object check.
     */
    body?: unknown;
    /**
     * Per-request headers, which `ntn api` collects from its `Header:Value`
     * inputs. Applied last so a caller can override a default, which is what the
     * real CLI does (probed on the wire against ntn 0.21.9).
     */
    headers?: Record<string, string>;
}
export declare class HttpNotionTransport implements NotionTransport {
    protected readonly fetch: typeof fetch;
    private readonly apiKey;
    private readonly baseUrl;
    private readonly apiVersion;
    private readonly timeout;
    constructor(opts: NotionConfig);
    request(call: RestCall): Promise<Record<string, unknown>>;
    callTool(name: string, args: Record<string, unknown>): Promise<Record<string, unknown>>;
}
//# sourceMappingURL=client.d.ts.map