msexchange-mcp
Version:
MCP server for Microsoft Exchange/Outlook email operations via Microsoft Graph API
186 lines • 6.33 kB
TypeScript
import { z } from 'zod';
import { MailService } from './mail.js';
import { EmailMessage } from '../types/email.js';
export interface SearchQuery {
text: string;
from?: string[];
to?: string[];
subject?: string;
hasAttachments?: boolean;
dateRange?: {
start?: Date;
end?: Date;
};
folders?: string[];
categories?: string[];
isRead?: boolean;
importance?: 'low' | 'normal' | 'high';
limit?: number;
requireAllTerms?: boolean;
includeAliases?: boolean;
semanticSearch?: boolean;
}
export interface SearchOptions {
accountId?: string;
limit?: number;
offset?: number;
orderBy?: 'receivedDateTime' | 'subject' | 'from' | 'importance' | 'relevance';
orderDirection?: 'asc' | 'desc';
includeBody?: boolean;
includeSentItems?: boolean;
exactMatch?: boolean;
enableSemanticExpansion?: boolean;
}
export interface SearchResult {
emails: EmailMessage[];
totalCount: number;
hasMore: boolean;
suggestions?: string[];
expandedQuery?: string;
searchStrategy?: string;
}
interface ParsedQuery {
terms: string[];
filters: {
from: string[];
to: string[];
subject: string[];
hasAttachments?: boolean;
dateRange?: {
start?: Date | string;
end?: Date | string;
};
};
originalQuery: string;
hasOrOperator?: boolean;
orParts?: string[];
}
export declare class UnifiedSearchService {
private mailService;
private aliasManager;
constructor(mailService: MailService);
/**
* Parse natural language query into structured search parameters
*/
parseQuery(query: string): ParsedQuery;
/**
* Expand names to known email addresses using AliasManager
*/
expandAliases(names: string[]): string[];
/**
* Expand search terms with semantic concepts
*/
expandConcepts(terms: string[], enableSemanticExpansion?: boolean): string[];
/**
* Build Microsoft Graph filter string
*/
buildGraphFilter(query: ParsedQuery, options: SearchOptions): string;
/**
* Build Microsoft Graph search query
*/
buildSearchQuery(terms: string[], requireAll?: boolean, enableSemanticExpansion?: boolean): string;
/**
* Perform unified email search with intelligent fallbacks
*/
search(query: string | SearchQuery, options?: SearchOptions): Promise<SearchResult>;
/**
* Execute OR search by combining results from multiple searches
*/
private executeOrSearch;
/**
* Execute search with automatic chunking to prevent token limit issues
*/
private executeChunkedSearch;
/**
* Generate helpful search suggestions
*/
private generateSearchSuggestions;
}
export declare const searchQuerySchema: z.ZodObject<{
text: z.ZodString;
from: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
to: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
subject: z.ZodOptional<z.ZodString>;
hasAttachments: z.ZodOptional<z.ZodBoolean>;
dateRange: z.ZodOptional<z.ZodObject<{
start: z.ZodEffects<z.ZodOptional<z.ZodString>, Date | undefined, string | undefined>;
end: z.ZodEffects<z.ZodOptional<z.ZodString>, Date | undefined, string | undefined>;
}, "strip", z.ZodTypeAny, {
start?: Date | undefined;
end?: Date | undefined;
}, {
start?: string | undefined;
end?: string | undefined;
}>>;
folders: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
categories: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
isRead: z.ZodOptional<z.ZodBoolean>;
importance: z.ZodOptional<z.ZodEnum<["low", "normal", "high"]>>;
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
requireAllTerms: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
includeAliases: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
semanticSearch: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
}, "strip", z.ZodTypeAny, {
text: string;
limit: number;
requireAllTerms: boolean;
includeAliases: boolean;
semanticSearch: boolean;
subject?: string | undefined;
from?: string[] | undefined;
isRead?: boolean | undefined;
hasAttachments?: boolean | undefined;
importance?: "low" | "normal" | "high" | undefined;
categories?: string[] | undefined;
to?: string[] | undefined;
dateRange?: {
start?: Date | undefined;
end?: Date | undefined;
} | undefined;
folders?: string[] | undefined;
}, {
text: string;
subject?: string | undefined;
from?: string[] | undefined;
isRead?: boolean | undefined;
hasAttachments?: boolean | undefined;
importance?: "low" | "normal" | "high" | undefined;
categories?: string[] | undefined;
to?: string[] | undefined;
limit?: number | undefined;
dateRange?: {
start?: string | undefined;
end?: string | undefined;
} | undefined;
folders?: string[] | undefined;
requireAllTerms?: boolean | undefined;
includeAliases?: boolean | undefined;
semanticSearch?: boolean | undefined;
}>;
export declare const searchOptionsSchema: z.ZodObject<{
accountId: z.ZodDefault<z.ZodOptional<z.ZodString>>;
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
offset: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
orderBy: z.ZodDefault<z.ZodOptional<z.ZodEnum<["receivedDateTime", "subject", "from", "importance", "relevance"]>>>;
orderDirection: z.ZodDefault<z.ZodOptional<z.ZodEnum<["asc", "desc"]>>>;
includeBody: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
includeSentItems: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
}, "strip", z.ZodTypeAny, {
limit: number;
accountId: string;
offset: number;
orderBy: "subject" | "from" | "receivedDateTime" | "importance" | "relevance";
orderDirection: "asc" | "desc";
includeBody: boolean;
includeSentItems: boolean;
}, {
limit?: number | undefined;
accountId?: string | undefined;
offset?: number | undefined;
orderBy?: "subject" | "from" | "receivedDateTime" | "importance" | "relevance" | undefined;
orderDirection?: "asc" | "desc" | undefined;
includeBody?: boolean | undefined;
includeSentItems?: boolean | undefined;
}>;
export {};
//# sourceMappingURL=unifiedSearch.d.ts.map