@d365portal/d365fo-context-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,52 @@
1
+ export interface ContextMcpConfig {
2
+ name: string;
3
+ version: string;
4
+ embeddingProvider: 'OpenAI' | 'VoyageAI' | 'Gemini' | 'Ollama';
5
+ embeddingModel: string;
6
+ openaiApiKey?: string;
7
+ openaiBaseUrl?: string;
8
+ voyageaiApiKey?: string;
9
+ geminiApiKey?: string;
10
+ geminiBaseUrl?: string;
11
+ ollamaModel?: string;
12
+ ollamaHost?: string;
13
+ milvusAddress?: string;
14
+ milvusToken?: string;
15
+ }
16
+ export interface CodebaseSnapshotV1 {
17
+ indexedCodebases: string[];
18
+ indexingCodebases: string[] | Record<string, number>;
19
+ lastUpdated: string;
20
+ }
21
+ interface CodebaseInfoBase {
22
+ lastUpdated: string;
23
+ }
24
+ export interface CodebaseInfoIndexing extends CodebaseInfoBase {
25
+ status: 'indexing';
26
+ indexingPercentage: number;
27
+ }
28
+ export interface CodebaseInfoIndexed extends CodebaseInfoBase {
29
+ status: 'indexed';
30
+ indexedFiles: number;
31
+ totalChunks: number;
32
+ indexStatus: 'completed' | 'limit_reached';
33
+ }
34
+ export interface CodebaseInfoIndexFailed extends CodebaseInfoBase {
35
+ status: 'indexfailed';
36
+ errorMessage: string;
37
+ lastAttemptedPercentage?: number;
38
+ }
39
+ export type CodebaseInfo = CodebaseInfoIndexing | CodebaseInfoIndexed | CodebaseInfoIndexFailed;
40
+ export interface CodebaseSnapshotV2 {
41
+ formatVersion: 'v2';
42
+ codebases: Record<string, CodebaseInfo>;
43
+ lastUpdated: string;
44
+ }
45
+ export type CodebaseSnapshot = CodebaseSnapshotV1 | CodebaseSnapshotV2;
46
+ export declare function getDefaultModelForProvider(provider: string): string;
47
+ export declare function getEmbeddingModelForProvider(provider: string): string;
48
+ export declare function createMcpConfig(): ContextMcpConfig;
49
+ export declare function logConfigurationSummary(config: ContextMcpConfig): void;
50
+ export declare function showHelpMessage(): void;
51
+ export {};
52
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAEhB,iBAAiB,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC/D,cAAc,EAAE,MAAM,CAAC;IAEvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAGD,MAAM,WAAW,kBAAkB;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;CACvB;AAKD,UAAU,gBAAgB;IACtB,WAAW,EAAE,MAAM,CAAC;CACvB;AAGD,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC1D,MAAM,EAAE,UAAU,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAGD,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IACzD,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,GAAG,eAAe,CAAC;CAC9C;AAGD,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC7D,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;CACpC;AAGD,MAAM,MAAM,YAAY,GAAG,oBAAoB,GAAG,mBAAmB,GAAG,uBAAuB,CAAC;AAEhG,MAAM,WAAW,kBAAkB;IAC/B,aAAa,EAAE,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACxC,WAAW,EAAE,MAAM,CAAC;CACvB;AAGD,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AAGvE,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAanE;AAGD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBrE;AAED,wBAAgB,eAAe,IAAI,gBAAgB,CAgClD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAiCtE;AAED,wBAAgB,eAAe,IAAI,IAAI,CAmDtC"}
package/dist/config.js ADDED
@@ -0,0 +1,150 @@
1
+ import { envManager } from "@d365portal/d365fo-context-core";
2
+ // Helper function to get default model for each provider
3
+ export function getDefaultModelForProvider(provider) {
4
+ switch (provider) {
5
+ case 'OpenAI':
6
+ return 'text-embedding-3-small';
7
+ case 'VoyageAI':
8
+ return 'voyage-code-3';
9
+ case 'Gemini':
10
+ return 'gemini-embedding-001';
11
+ case 'Ollama':
12
+ return 'nomic-embed-text';
13
+ default:
14
+ return 'text-embedding-3-small';
15
+ }
16
+ }
17
+ // Helper function to get embedding model with provider-specific environment variable priority
18
+ export function getEmbeddingModelForProvider(provider) {
19
+ switch (provider) {
20
+ case 'Ollama':
21
+ // For Ollama, prioritize OLLAMA_MODEL over EMBEDDING_MODEL for backward compatibility
22
+ const ollamaModel = envManager.get('OLLAMA_MODEL') || envManager.get('EMBEDDING_MODEL') || getDefaultModelForProvider(provider);
23
+ console.log(`[DEBUG] 🎯 Ollama model selection: OLLAMA_MODEL=${envManager.get('OLLAMA_MODEL') || 'NOT SET'}, EMBEDDING_MODEL=${envManager.get('EMBEDDING_MODEL') || 'NOT SET'}, selected=${ollamaModel}`);
24
+ return ollamaModel;
25
+ case 'OpenAI':
26
+ case 'VoyageAI':
27
+ case 'Gemini':
28
+ default:
29
+ // For all other providers, use EMBEDDING_MODEL or default
30
+ const selectedModel = envManager.get('EMBEDDING_MODEL') || getDefaultModelForProvider(provider);
31
+ console.log(`[DEBUG] 🎯 ${provider} model selection: EMBEDDING_MODEL=${envManager.get('EMBEDDING_MODEL') || 'NOT SET'}, selected=${selectedModel}`);
32
+ return selectedModel;
33
+ }
34
+ }
35
+ export function createMcpConfig() {
36
+ // Debug: Print all environment variables related to Context
37
+ console.log(`[DEBUG] 🔍 Environment Variables Debug:`);
38
+ console.log(`[DEBUG] EMBEDDING_PROVIDER: ${envManager.get('EMBEDDING_PROVIDER') || 'NOT SET'}`);
39
+ console.log(`[DEBUG] EMBEDDING_MODEL: ${envManager.get('EMBEDDING_MODEL') || 'NOT SET'}`);
40
+ console.log(`[DEBUG] OLLAMA_MODEL: ${envManager.get('OLLAMA_MODEL') || 'NOT SET'}`);
41
+ console.log(`[DEBUG] GEMINI_API_KEY: ${envManager.get('GEMINI_API_KEY') ? 'SET (length: ' + envManager.get('GEMINI_API_KEY').length + ')' : 'NOT SET'}`);
42
+ console.log(`[DEBUG] OPENAI_API_KEY: ${envManager.get('OPENAI_API_KEY') ? 'SET (length: ' + envManager.get('OPENAI_API_KEY').length + ')' : 'NOT SET'}`);
43
+ console.log(`[DEBUG] MILVUS_ADDRESS: ${envManager.get('MILVUS_ADDRESS') || 'NOT SET'}`);
44
+ console.log(`[DEBUG] NODE_ENV: ${envManager.get('NODE_ENV') || 'NOT SET'}`);
45
+ const config = {
46
+ name: envManager.get('MCP_SERVER_NAME') || "Context MCP Server",
47
+ version: envManager.get('MCP_SERVER_VERSION') || "1.0.0",
48
+ // Embedding provider configuration
49
+ embeddingProvider: envManager.get('EMBEDDING_PROVIDER') || 'OpenAI',
50
+ embeddingModel: getEmbeddingModelForProvider(envManager.get('EMBEDDING_PROVIDER') || 'OpenAI'),
51
+ // Provider-specific API keys
52
+ openaiApiKey: envManager.get('OPENAI_API_KEY'),
53
+ openaiBaseUrl: envManager.get('OPENAI_BASE_URL'),
54
+ voyageaiApiKey: envManager.get('VOYAGEAI_API_KEY'),
55
+ geminiApiKey: envManager.get('GEMINI_API_KEY'),
56
+ geminiBaseUrl: envManager.get('GEMINI_BASE_URL'),
57
+ // Ollama configuration
58
+ ollamaModel: envManager.get('OLLAMA_MODEL'),
59
+ ollamaHost: envManager.get('OLLAMA_HOST'),
60
+ // Vector database configuration - address can be auto-resolved from token
61
+ milvusAddress: envManager.get('MILVUS_ADDRESS'), // Optional, can be resolved from token
62
+ milvusToken: envManager.get('MILVUS_TOKEN')
63
+ };
64
+ return config;
65
+ }
66
+ export function logConfigurationSummary(config) {
67
+ // Log configuration summary before starting server
68
+ console.log(`[MCP] 🚀 Starting Context MCP Server`);
69
+ console.log(`[MCP] Configuration Summary:`);
70
+ console.log(`[MCP] Server: ${config.name} v${config.version}`);
71
+ console.log(`[MCP] Embedding Provider: ${config.embeddingProvider}`);
72
+ console.log(`[MCP] Embedding Model: ${config.embeddingModel}`);
73
+ console.log(`[MCP] Milvus Address: ${config.milvusAddress || (config.milvusToken ? '[Auto-resolve from token]' : '[Not configured]')}`);
74
+ // Log provider-specific configuration without exposing sensitive data
75
+ switch (config.embeddingProvider) {
76
+ case 'OpenAI':
77
+ console.log(`[MCP] OpenAI API Key: ${config.openaiApiKey ? '✅ Configured' : '❌ Missing'}`);
78
+ if (config.openaiBaseUrl) {
79
+ console.log(`[MCP] OpenAI Base URL: ${config.openaiBaseUrl}`);
80
+ }
81
+ break;
82
+ case 'VoyageAI':
83
+ console.log(`[MCP] VoyageAI API Key: ${config.voyageaiApiKey ? '✅ Configured' : '❌ Missing'}`);
84
+ break;
85
+ case 'Gemini':
86
+ console.log(`[MCP] Gemini API Key: ${config.geminiApiKey ? '✅ Configured' : '❌ Missing'}`);
87
+ if (config.geminiBaseUrl) {
88
+ console.log(`[MCP] Gemini Base URL: ${config.geminiBaseUrl}`);
89
+ }
90
+ break;
91
+ case 'Ollama':
92
+ console.log(`[MCP] Ollama Host: ${config.ollamaHost || 'http://127.0.0.1:11434'}`);
93
+ console.log(`[MCP] Ollama Model: ${config.embeddingModel}`);
94
+ break;
95
+ }
96
+ console.log(`[MCP] 🔧 Initializing server components...`);
97
+ }
98
+ export function showHelpMessage() {
99
+ console.log(`
100
+ Context MCP Server
101
+
102
+ Usage: npx @zilliz/claude-context-mcp@latest [options]
103
+
104
+ Options:
105
+ --help, -h Show this help message
106
+
107
+ Environment Variables:
108
+ MCP_SERVER_NAME Server name
109
+ MCP_SERVER_VERSION Server version
110
+
111
+ Embedding Provider Configuration:
112
+ EMBEDDING_PROVIDER Embedding provider: OpenAI, VoyageAI, Gemini, Ollama (default: OpenAI)
113
+ EMBEDDING_MODEL Embedding model name (works for all providers)
114
+
115
+ Provider-specific API Keys:
116
+ OPENAI_API_KEY OpenAI API key (required for OpenAI provider)
117
+ OPENAI_BASE_URL OpenAI API base URL (optional, for custom endpoints)
118
+ VOYAGEAI_API_KEY VoyageAI API key (required for VoyageAI provider)
119
+ GEMINI_API_KEY Google AI API key (required for Gemini provider)
120
+ GEMINI_BASE_URL Gemini API base URL (optional, for custom endpoints)
121
+
122
+ Ollama Configuration:
123
+ OLLAMA_HOST Ollama server host (default: http://127.0.0.1:11434)
124
+ OLLAMA_MODEL Ollama model name (alternative to EMBEDDING_MODEL for Ollama)
125
+
126
+ Vector Database Configuration:
127
+ MILVUS_ADDRESS Milvus address (optional, can be auto-resolved from token)
128
+ MILVUS_TOKEN Milvus token (optional, used for authentication and address resolution)
129
+
130
+ Examples:
131
+ # Start MCP server with OpenAI (default) and explicit Milvus address
132
+ OPENAI_API_KEY=sk-xxx MILVUS_ADDRESS=localhost:19530 npx @zilliz/claude-context-mcp@latest
133
+
134
+ # Start MCP server with OpenAI and specific model
135
+ OPENAI_API_KEY=sk-xxx EMBEDDING_MODEL=text-embedding-3-large MILVUS_TOKEN=your-token npx @zilliz/claude-context-mcp@latest
136
+
137
+ # Start MCP server with VoyageAI and specific model
138
+ EMBEDDING_PROVIDER=VoyageAI VOYAGEAI_API_KEY=pa-xxx EMBEDDING_MODEL=voyage-3-large MILVUS_TOKEN=your-token npx @zilliz/claude-context-mcp@latest
139
+
140
+ # Start MCP server with Gemini and specific model
141
+ EMBEDDING_PROVIDER=Gemini GEMINI_API_KEY=xxx EMBEDDING_MODEL=gemini-embedding-001 MILVUS_TOKEN=your-token npx @zilliz/claude-context-mcp@latest
142
+
143
+ # Start MCP server with Ollama and specific model (using OLLAMA_MODEL)
144
+ EMBEDDING_PROVIDER=Ollama OLLAMA_MODEL=mxbai-embed-large MILVUS_TOKEN=your-token npx @zilliz/claude-context-mcp@latest
145
+
146
+ # Start MCP server with Ollama and specific model (using EMBEDDING_MODEL)
147
+ EMBEDDING_PROVIDER=Ollama EMBEDDING_MODEL=nomic-embed-text MILVUS_TOKEN=your-token npx @zilliz/claude-context-mcp@latest
148
+ `);
149
+ }
150
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * D365 Finance & Operations Tool Handlers
3
+ *
4
+ * This module provides handlers for all D365FO-specific MCP tools.
5
+ * Handlers use semantic search with folder-based filtering to find relevant examples.
6
+ */
7
+ import { Context } from "@d365portal/d365fo-context-core";
8
+ import { SnapshotManager } from "./snapshot.js";
9
+ interface D365ContextArgs {
10
+ query: string;
11
+ topK?: number;
12
+ includePatterns?: boolean;
13
+ }
14
+ interface D365RelationshipArgs {
15
+ objectName: string;
16
+ objectType: string;
17
+ depth?: number;
18
+ }
19
+ /**
20
+ * D365 Tool Handlers Class
21
+ *
22
+ * Provides specialized handlers for D365FO object type context tools
23
+ * and relationship analysis.
24
+ */
25
+ export declare class D365ToolHandlers {
26
+ private context;
27
+ private snapshotManager;
28
+ private d365CodebasePath;
29
+ constructor(context: Context, snapshotManager: SnapshotManager);
30
+ /**
31
+ * Set the D365FO codebase path for all D365 tool operations
32
+ */
33
+ setD365CodebasePath(path: string): void;
34
+ /**
35
+ * Auto-detect D365FO codebase from indexed codebases
36
+ * Looks for codebases containing AxClass, AxTable folders
37
+ */
38
+ private detectD365Codebase;
39
+ /**
40
+ * Get the active D365FO codebase path
41
+ */
42
+ private getActiveCodebasePath;
43
+ /**
44
+ * Handle context tool calls for any D365 object type
45
+ */
46
+ handleObjectContext(toolName: string, args: D365ContextArgs): Promise<{
47
+ content: Array<{
48
+ type: string;
49
+ text: string;
50
+ }>;
51
+ isError?: boolean;
52
+ }>;
53
+ /**
54
+ * Core context search handler
55
+ */
56
+ private handleContextSearch;
57
+ /**
58
+ * Handle relationship analysis tool
59
+ */
60
+ handleRelationshipAnalysis(args: D365RelationshipArgs): Promise<{
61
+ content: Array<{
62
+ type: string;
63
+ text: string;
64
+ }>;
65
+ isError?: boolean;
66
+ }>;
67
+ /**
68
+ * Format context search response
69
+ */
70
+ private formatContextResponse;
71
+ /**
72
+ * Extract common patterns from search results
73
+ */
74
+ private extractPatterns;
75
+ /**
76
+ * Format relationship analysis response
77
+ */
78
+ private formatRelationshipResponse;
79
+ }
80
+ export {};
81
+ //# sourceMappingURL=d365-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d365-handlers.d.ts","sourceRoot":"","sources":["../src/d365-handlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAKhD,UAAU,eAAe;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,oBAAoB;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAaD;;;;;GAKG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe;IAK9D;;OAEG;IACI,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK9C;;;OAGG;YACW,kBAAkB;IAuBhC;;OAEG;YACW,qBAAqB;IASnC;;OAEG;IACU,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAgBzJ;;OAEG;YACW,mBAAmB;IAwDjC;;OAEG;IACU,0BAA0B,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAiDnJ;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAwD7B;;OAEG;IACH,OAAO,CAAC,eAAe;IA2DvB;;OAEG;IACH,OAAO,CAAC,0BAA0B;CAwErC"}
@@ -0,0 +1,319 @@
1
+ /**
2
+ * D365 Finance & Operations Tool Handlers
3
+ *
4
+ * This module provides handlers for all D365FO-specific MCP tools.
5
+ * Handlers use semantic search with folder-based filtering to find relevant examples.
6
+ */
7
+ import { findObjectTypeByToolName } from "./d365-tools.js";
8
+ import * as fs from "fs";
9
+ /**
10
+ * D365 Tool Handlers Class
11
+ *
12
+ * Provides specialized handlers for D365FO object type context tools
13
+ * and relationship analysis.
14
+ */
15
+ export class D365ToolHandlers {
16
+ constructor(context, snapshotManager) {
17
+ this.d365CodebasePath = null;
18
+ this.context = context;
19
+ this.snapshotManager = snapshotManager;
20
+ }
21
+ /**
22
+ * Set the D365FO codebase path for all D365 tool operations
23
+ */
24
+ setD365CodebasePath(path) {
25
+ this.d365CodebasePath = path;
26
+ console.log(`[D365-HANDLERS] Set D365FO codebase path: ${path}`);
27
+ }
28
+ /**
29
+ * Auto-detect D365FO codebase from indexed codebases
30
+ * Looks for codebases containing AxClass, AxTable folders
31
+ */
32
+ async detectD365Codebase() {
33
+ const indexedCodebases = this.snapshotManager.getIndexedCodebases();
34
+ for (const codebasePath of indexedCodebases) {
35
+ try {
36
+ // Check if this codebase contains D365FO structure
37
+ const axClassPath = `${codebasePath}/AxClass`;
38
+ const axTablePath = `${codebasePath}/AxTable`;
39
+ if (fs.existsSync(axClassPath) || fs.existsSync(axTablePath)) {
40
+ console.log(`[D365-HANDLERS] Auto-detected D365FO codebase: ${codebasePath}`);
41
+ this.d365CodebasePath = codebasePath;
42
+ return codebasePath;
43
+ }
44
+ }
45
+ catch (error) {
46
+ // Continue to next codebase
47
+ }
48
+ }
49
+ console.log(`[D365-HANDLERS] No D365FO codebase detected in indexed codebases`);
50
+ return null;
51
+ }
52
+ /**
53
+ * Get the active D365FO codebase path
54
+ */
55
+ async getActiveCodebasePath() {
56
+ if (this.d365CodebasePath) {
57
+ return this.d365CodebasePath;
58
+ }
59
+ // Try to auto-detect
60
+ return await this.detectD365Codebase();
61
+ }
62
+ /**
63
+ * Handle context tool calls for any D365 object type
64
+ */
65
+ async handleObjectContext(toolName, args) {
66
+ const typeConfig = findObjectTypeByToolName(toolName);
67
+ if (!typeConfig) {
68
+ return {
69
+ content: [{
70
+ type: "text",
71
+ text: `Error: Unknown D365 tool '${toolName}'. This tool is not registered.`
72
+ }],
73
+ isError: true
74
+ };
75
+ }
76
+ return await this.handleContextSearch(typeConfig, args);
77
+ }
78
+ /**
79
+ * Core context search handler
80
+ */
81
+ async handleContextSearch(typeConfig, args) {
82
+ const { query, topK = 5, includePatterns = true } = args;
83
+ try {
84
+ // Get active codebase path
85
+ const codebasePath = await this.getActiveCodebasePath();
86
+ if (!codebasePath) {
87
+ return {
88
+ content: [{
89
+ type: "text",
90
+ text: `Error: No D365FO codebase is indexed. Please index a Dynamics 365 Finance & Operations codebase first using the index_codebase tool.\n\n` +
91
+ `The D365FO codebase should contain folders like AxClass, AxTable, AxForm, etc.`
92
+ }],
93
+ isError: true
94
+ };
95
+ }
96
+ // Build filter expression to search only in the specific object type folder
97
+ // Note: Windows paths use backslash, so we need to escape it for the LIKE pattern
98
+ // The pattern matches both forward slash and backslash variants
99
+ const filterExpr = `relativePath like "${typeConfig.folder}\\\\%" or relativePath like "${typeConfig.folder}/%"`;
100
+ console.log(`[D365-HANDLERS] Searching ${typeConfig.folder} with query: "${query}"`);
101
+ console.log(`[D365-HANDLERS] Filter expression: ${filterExpr}`);
102
+ console.log(`[D365-HANDLERS] Codebase: ${codebasePath}`);
103
+ // Perform semantic search with folder filter
104
+ const results = await this.context.semanticSearch(codebasePath, query, Math.min(topK, 20), // Cap at 20
105
+ 0.3, // Threshold
106
+ filterExpr);
107
+ console.log(`[D365-HANDLERS] Found ${results.length} results for ${typeConfig.folder}`);
108
+ // Format response
109
+ return this.formatContextResponse(results, typeConfig, query, includePatterns);
110
+ }
111
+ catch (error) {
112
+ console.error(`[D365-HANDLERS] Error in handleContextSearch:`, error);
113
+ return {
114
+ content: [{
115
+ type: "text",
116
+ text: `Error searching ${typeConfig.desc}: ${error.message || error}`
117
+ }],
118
+ isError: true
119
+ };
120
+ }
121
+ }
122
+ /**
123
+ * Handle relationship analysis tool
124
+ */
125
+ async handleRelationshipAnalysis(args) {
126
+ const { objectName, objectType, depth = 2 } = args;
127
+ try {
128
+ const codebasePath = await this.getActiveCodebasePath();
129
+ if (!codebasePath) {
130
+ return {
131
+ content: [{
132
+ type: "text",
133
+ text: `Error: No D365FO codebase is indexed. Please index a Dynamics 365 Finance & Operations codebase first.`
134
+ }],
135
+ isError: true
136
+ };
137
+ }
138
+ console.log(`[D365-HANDLERS] Analyzing relationships for ${objectName} (${objectType})`);
139
+ // Search for references to this object across all object types
140
+ const query = `${objectName} reference usage implementation`;
141
+ const results = await this.context.semanticSearch(codebasePath, query, 50, // Get more results for relationship analysis
142
+ 0.25 // Lower threshold to catch more references
143
+ );
144
+ // Filter results to only those that actually reference the object
145
+ const relevantResults = results.filter(r => r.content.includes(objectName));
146
+ console.log(`[D365-HANDLERS] Found ${relevantResults.length} relevant references out of ${results.length} total`);
147
+ // Format relationship response
148
+ return this.formatRelationshipResponse(objectName, objectType, relevantResults, depth);
149
+ }
150
+ catch (error) {
151
+ console.error(`[D365-HANDLERS] Error in handleRelationshipAnalysis:`, error);
152
+ return {
153
+ content: [{
154
+ type: "text",
155
+ text: `Error analyzing relationships for ${objectName}: ${error.message || error}`
156
+ }],
157
+ isError: true
158
+ };
159
+ }
160
+ }
161
+ /**
162
+ * Format context search response
163
+ */
164
+ formatContextResponse(results, typeConfig, query, includePatterns) {
165
+ const capitalizedDesc = typeConfig.desc.charAt(0).toUpperCase() + typeConfig.desc.slice(1);
166
+ if (results.length === 0) {
167
+ return {
168
+ content: [{
169
+ type: "text",
170
+ text: `## No ${capitalizedDesc} Found\n\n` +
171
+ `No matching ${typeConfig.desc} found for query: "${query}"\n\n` +
172
+ `**Suggestions:**\n` +
173
+ `- Try a more general search term\n` +
174
+ `- Check if the ${typeConfig.folder} folder contains relevant files\n` +
175
+ `- Verify the codebase is fully indexed`
176
+ }]
177
+ };
178
+ }
179
+ let response = `## ${capitalizedDesc} Examples\n\n`;
180
+ response += `Found ${results.length} matching ${typeConfig.desc} for: "${query}"\n\n`;
181
+ // Add examples
182
+ results.forEach((result, index) => {
183
+ const fileName = result.relativePath.split('/').pop() || 'Unknown';
184
+ const score = result.score ? `(${(result.score * 100).toFixed(1)}% match)` : '';
185
+ response += `### ${index + 1}. ${fileName} ${score}\n`;
186
+ response += `**Path:** \`${result.relativePath}\`\n\n`;
187
+ // Truncate content if too long
188
+ const maxContentLength = 2000;
189
+ let content = result.content;
190
+ if (content.length > maxContentLength) {
191
+ content = content.substring(0, maxContentLength) + '\n... (truncated)';
192
+ }
193
+ response += '```xml\n' + content + '\n```\n\n';
194
+ });
195
+ // Add patterns section
196
+ if (includePatterns && results.length > 0) {
197
+ response += this.extractPatterns(results, typeConfig);
198
+ }
199
+ return {
200
+ content: [{
201
+ type: "text",
202
+ text: response
203
+ }]
204
+ };
205
+ }
206
+ /**
207
+ * Extract common patterns from search results
208
+ */
209
+ extractPatterns(results, typeConfig) {
210
+ let patterns = `## Common Patterns for ${typeConfig.folder}\n\n`;
211
+ // Analyze results to extract patterns
212
+ const methodNames = new Set();
213
+ const inheritancePatterns = new Set();
214
+ const commonElements = new Set();
215
+ results.forEach(result => {
216
+ const content = result.content;
217
+ // Extract method names (X++ pattern)
218
+ const methodMatches = content.match(/public\s+\w+\s+(\w+)\s*\(/g);
219
+ if (methodMatches) {
220
+ methodMatches.forEach(m => {
221
+ const name = m.match(/(\w+)\s*\(/)?.[1];
222
+ if (name)
223
+ methodNames.add(name);
224
+ });
225
+ }
226
+ // Extract extends clauses
227
+ const extendsMatch = content.match(/extends\s+(\w+)/);
228
+ if (extendsMatch) {
229
+ inheritancePatterns.add(extendsMatch[1]);
230
+ }
231
+ // Extract common XML elements
232
+ const elementMatches = content.match(/<(\w+)[\s>]/g);
233
+ if (elementMatches) {
234
+ elementMatches.slice(0, 20).forEach(m => {
235
+ const elem = m.match(/<(\w+)/)?.[1];
236
+ if (elem && elem.length > 2)
237
+ commonElements.add(elem);
238
+ });
239
+ }
240
+ });
241
+ // Build patterns section
242
+ if (methodNames.size > 0) {
243
+ patterns += `**Common Methods:**\n`;
244
+ patterns += Array.from(methodNames).slice(0, 10).map(m => `- \`${m}()\``).join('\n') + '\n\n';
245
+ }
246
+ if (inheritancePatterns.size > 0) {
247
+ patterns += `**Inheritance Patterns:**\n`;
248
+ patterns += Array.from(inheritancePatterns).slice(0, 5).map(p => `- extends \`${p}\``).join('\n') + '\n\n';
249
+ }
250
+ if (commonElements.size > 0) {
251
+ patterns += `**Common XML Elements:**\n`;
252
+ patterns += Array.from(commonElements).slice(0, 10).map(e => `- \`<${e}>\``).join('\n') + '\n\n';
253
+ }
254
+ if (methodNames.size === 0 && inheritancePatterns.size === 0 && commonElements.size === 0) {
255
+ patterns += `*Pattern analysis not available for these results.*\n\n`;
256
+ }
257
+ return patterns;
258
+ }
259
+ /**
260
+ * Format relationship analysis response
261
+ */
262
+ formatRelationshipResponse(objectName, objectType, results, depth) {
263
+ let response = `## Relationship Analysis: ${objectName} (${objectType})\n\n`;
264
+ if (results.length === 0) {
265
+ response += `No references found for ${objectName}.\n\n`;
266
+ response += `**Suggestions:**\n`;
267
+ response += `- Check if the object name is spelled correctly\n`;
268
+ response += `- The object may not be referenced by other objects\n`;
269
+ response += `- Try searching with the object type tool directly\n`;
270
+ return {
271
+ content: [{
272
+ type: "text",
273
+ text: response
274
+ }]
275
+ };
276
+ }
277
+ // Group results by object type folder
278
+ const groupedByType = {};
279
+ results.forEach(result => {
280
+ const folder = result.relativePath.split('/')[0] || 'Unknown';
281
+ if (!groupedByType[folder]) {
282
+ groupedByType[folder] = [];
283
+ }
284
+ groupedByType[folder].push(result);
285
+ });
286
+ response += `Found ${results.length} references across ${Object.keys(groupedByType).length} object types.\n\n`;
287
+ // Output grouped results
288
+ Object.entries(groupedByType)
289
+ .sort((a, b) => b[1].length - a[1].length) // Sort by count descending
290
+ .forEach(([folder, items]) => {
291
+ response += `### ${folder} (${items.length} references)\n\n`;
292
+ items.slice(0, 5).forEach(item => {
293
+ const fileName = item.relativePath.split('/').pop() || 'Unknown';
294
+ response += `- **${fileName}**\n`;
295
+ response += ` Path: \`${item.relativePath}\`\n`;
296
+ });
297
+ if (items.length > 5) {
298
+ response += ` *(${items.length - 5} more references...)*\n`;
299
+ }
300
+ response += '\n';
301
+ });
302
+ // Add summary
303
+ response += `## Summary\n\n`;
304
+ response += `| Object Type | Reference Count |\n`;
305
+ response += `|-------------|----------------|\n`;
306
+ Object.entries(groupedByType)
307
+ .sort((a, b) => b[1].length - a[1].length)
308
+ .forEach(([folder, items]) => {
309
+ response += `| ${folder} | ${items.length} |\n`;
310
+ });
311
+ return {
312
+ content: [{
313
+ type: "text",
314
+ text: response
315
+ }]
316
+ };
317
+ }
318
+ }
319
+ //# sourceMappingURL=d365-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d365-handlers.js","sourceRoot":"","sources":["../src/d365-handlers.ts"],"names":[],"mappings":"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"}