mcp-use 0.1.11 → 0.1.12
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.
package/dist/index.d.ts
CHANGED
@@ -12,6 +12,7 @@ export * from './src/agents/utils/index.js';
|
|
12
12
|
export { ServerManager } from './src/managers/server_manager.js';
|
13
13
|
export * from './src/managers/tools/index.js';
|
14
14
|
export { setTelemetrySource, Telemetry } from './src/telemetry/index.js';
|
15
|
+
export { AIMessage, BaseMessage, HumanMessage, SystemMessage, ToolMessage } from '@langchain/core/messages';
|
15
16
|
export type { StreamEvent } from '@langchain/core/tracers/log_stream';
|
16
17
|
export { BaseConnector, HttpConnector, loadConfigFile, Logger, logger, MCPAgent, MCPClient, MCPSession, StdioConnector, WebSocketConnector };
|
17
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAEvE,cAAc,6BAA6B,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAEhE,cAAc,+BAA+B,CAAA;AAG7C,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAGxE,YAAY,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAErE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAA"}
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAEvE,cAAc,6BAA6B,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAEhE,cAAc,+BAA+B,CAAA;AAG7C,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAGxE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAG3G,YAAY,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAErE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAA"}
|
package/dist/index.js
CHANGED
@@ -14,4 +14,6 @@ export { ServerManager } from './src/managers/server_manager.js';
|
|
14
14
|
export * from './src/managers/tools/index.js';
|
15
15
|
// Export telemetry utilities
|
16
16
|
export { setTelemetrySource, Telemetry } from './src/telemetry/index.js';
|
17
|
+
// Re-export message classes to ensure a single constructor instance is shared by consumers
|
18
|
+
export { AIMessage, BaseMessage, HumanMessage, SystemMessage, ToolMessage } from '@langchain/core/messages';
|
17
19
|
export { BaseConnector, HttpConnector, loadConfigFile, Logger, logger, MCPAgent, MCPClient, MCPSession, StdioConnector, WebSocketConnector };
|
@@ -3,7 +3,7 @@ import type { BaseMessage } from '@langchain/core/messages';
|
|
3
3
|
import type { StructuredToolInterface } from '@langchain/core/tools';
|
4
4
|
import type { StreamEvent } from '@langchain/core/tracers/log_stream';
|
5
5
|
import type { AgentStep } from 'langchain/agents';
|
6
|
-
import type {
|
6
|
+
import type { ZodSchema } from 'zod';
|
7
7
|
import type { MCPClient } from '../client.js';
|
8
8
|
import type { BaseConnector } from '../connectors/base.js';
|
9
9
|
import { SystemMessage } from '@langchain/core/messages';
|
@@ -69,12 +69,12 @@ export declare class MCPAgent {
|
|
69
69
|
/**
|
70
70
|
* Runs the agent with structured output and returns a promise for the typed result.
|
71
71
|
*/
|
72
|
-
run<T>(query: string, maxSteps?: number, manageConnector?: boolean, externalHistory?: BaseMessage[], outputSchema?:
|
72
|
+
run<T>(query: string, maxSteps?: number, manageConnector?: boolean, externalHistory?: BaseMessage[], outputSchema?: ZodSchema<T>): Promise<T>;
|
73
73
|
/**
|
74
74
|
* Runs the agent and yields intermediate steps as an async generator.
|
75
75
|
* If outputSchema is provided, returns structured output of type T.
|
76
76
|
*/
|
77
|
-
stream<T = string>(query: string, maxSteps?: number, manageConnector?: boolean, externalHistory?: BaseMessage[], outputSchema?:
|
77
|
+
stream<T = string>(query: string, maxSteps?: number, manageConnector?: boolean, externalHistory?: BaseMessage[], outputSchema?: ZodSchema<T>): AsyncGenerator<AgentStep, string | T, void>;
|
78
78
|
close(): Promise<void>;
|
79
79
|
/**
|
80
80
|
* Yields LangChain StreamEvent objects from the underlying streamEvents() method.
|
@@ -82,9 +82,13 @@ export declare class MCPAgent {
|
|
82
82
|
*/
|
83
83
|
streamEvents(query: string, maxSteps?: number, manageConnector?: boolean, externalHistory?: BaseMessage[]): AsyncGenerator<StreamEvent, void, void>;
|
84
84
|
/**
|
85
|
-
* Attempt to create structured output from raw result with validation.
|
85
|
+
* Attempt to create structured output from raw result with validation and retry logic.
|
86
86
|
*/
|
87
87
|
private _attemptStructuredOutput;
|
88
|
+
/**
|
89
|
+
* Validate the structured result against the schema with detailed error reporting
|
90
|
+
*/
|
91
|
+
private _validateStructuredResult;
|
88
92
|
/**
|
89
93
|
* Enhance the query with schema information to make the agent aware of required fields.
|
90
94
|
*/
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mcp_agent.d.ts","sourceRoot":"","sources":["../../../src/agents/mcp_agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAqB,MAAM,sCAAsC,CAAA;AACzG,OAAO,KAAK,EACV,WAAW,EACZ,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,uBAAuB,EAAiB,MAAM,uBAAuB,CAAA;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AACrE,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,kBAAkB,CAAA;
|
1
|
+
{"version":3,"file":"mcp_agent.d.ts","sourceRoot":"","sources":["../../../src/agents/mcp_agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAqB,MAAM,sCAAsC,CAAA;AACzG,OAAO,KAAK,EACV,WAAW,EACZ,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,EAAE,uBAAuB,EAAiB,MAAM,uBAAuB,CAAA;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AACrE,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,EAGL,aAAa,EAEd,MAAM,0BAA0B,CAAA;AAWjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAK7D,qBAAa,QAAQ;IACnB,OAAO,CAAC,GAAG,CAA4B;IACvC,OAAO,CAAC,MAAM,CAAC,CAAW;IAC1B,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,4BAA4B,CAAC,CAAe;IACpD,OAAO,CAAC,sBAAsB,CAAC,CAAe;IAE9C,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,mBAAmB,CAAoB;IAC/C,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,SAAS,CAAQ;gBAEb,OAAO,EAAE;QACnB,GAAG,EAAE,0BAA0B,CAAA;QAC/B,MAAM,CAAC,EAAE,SAAS,CAAA;QAClB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAA;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,aAAa,CAAC,EAAE,OAAO,CAAA;QACvB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC5B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACpC,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACtC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;QAC1B,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAA;QAC3C,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,OAAO,CAAC,EAAE,gBAAgB,CAAA;QAC1B,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,aAAa,CAAA;KAC5D;IAsDY,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAiE1B,4BAA4B;IAuB1C,OAAO,CAAC,WAAW;IAyBZ,sBAAsB,IAAI,WAAW,EAAE;IAIvC,wBAAwB,IAAI,IAAI;IAIvC,OAAO,CAAC,YAAY;IAKb,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAIxC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAavC,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI;IAQnD,kBAAkB,IAAI,MAAM,EAAE;YAIvB,iBAAiB;IAc/B;;OAEG;IACU,GAAG,CACd,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,OAAO,EACzB,eAAe,CAAC,EAAE,WAAW,EAAE,GAC9B,OAAO,CAAC,MAAM,CAAC;IAElB;;OAEG;IACU,GAAG,CAAC,CAAC,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,OAAO,EACzB,eAAe,CAAC,EAAE,WAAW,EAAE,EAC/B,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC;IAmBb;;;OAGG;IACW,MAAM,CAAC,CAAC,GAAG,MAAM,EAC7B,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,eAAe,UAAO,EACtB,eAAe,CAAC,EAAE,WAAW,EAAE,EAC/B,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAC1B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC;IA2QjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BnC;;;OAGG;IACW,YAAY,CACxB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,eAAe,UAAO,EACtB,eAAe,CAAC,EAAE,WAAW,EAAE,GAC9B,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC;IAgJ1C;;OAEG;YACW,wBAAwB;IAqEtC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAgCjC;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAuBhC"}
|
@@ -1,7 +1,8 @@
|
|
1
|
-
import { AIMessage, HumanMessage, SystemMessage, } from '@langchain/core/messages';
|
1
|
+
import { AIMessage, HumanMessage, SystemMessage, ToolMessage, } from '@langchain/core/messages';
|
2
2
|
import { OutputParserException } from '@langchain/core/output_parsers';
|
3
3
|
import { ChatPromptTemplate, MessagesPlaceholder, } from '@langchain/core/prompts';
|
4
4
|
import { AgentExecutor, createToolCallingAgent, } from 'langchain/agents';
|
5
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
5
6
|
import { LangChainAdapter } from '../adapters/langchain_adapter.js';
|
6
7
|
import { logger } from '../logging.js';
|
7
8
|
import { ServerManager } from '../managers/server_manager.js';
|
@@ -231,6 +232,7 @@ export class MCPAgent {
|
|
231
232
|
let schemaDescription = '';
|
232
233
|
if (outputSchema) {
|
233
234
|
query = this._enhanceQueryWithSchema(query, outputSchema);
|
235
|
+
logger.debug(`🔄 Structured output requested, schema: ${JSON.stringify(zodToJsonSchema(outputSchema), null, 2)}`);
|
234
236
|
// Check if withStructuredOutput method exists
|
235
237
|
if ('withStructuredOutput' in this.llm && typeof this.llm.withStructuredOutput === 'function') {
|
236
238
|
structuredLlm = this.llm.withStructuredOutput(outputSchema);
|
@@ -239,25 +241,7 @@ export class MCPAgent {
|
|
239
241
|
// Fallback: use the same LLM but we'll handle structure in our helper method
|
240
242
|
structuredLlm = this.llm;
|
241
243
|
}
|
242
|
-
|
243
|
-
try {
|
244
|
-
const schemaType = outputSchema;
|
245
|
-
if (schemaType._def && schemaType._def.shape) {
|
246
|
-
const fields = [];
|
247
|
-
for (const [key, fieldSchema] of Object.entries(schemaType._def.shape)) {
|
248
|
-
const field = fieldSchema;
|
249
|
-
const isOptional = field.isOptional?.() ?? field._def?.typeName === 'ZodOptional';
|
250
|
-
const isNullable = field.isNullable?.() ?? field._def?.typeName === 'ZodNullable';
|
251
|
-
const description = field._def?.description || field.description || key;
|
252
|
-
fields.push(`- ${key}: ${description} ${(isOptional || isNullable) ? '(optional)' : '(required)'}`);
|
253
|
-
}
|
254
|
-
schemaDescription = fields.join('\n');
|
255
|
-
}
|
256
|
-
}
|
257
|
-
catch (e) {
|
258
|
-
logger.warn(`Could not extract schema details: ${e}`);
|
259
|
-
schemaDescription = `Schema: ${outputSchema.constructor.name}`;
|
260
|
-
}
|
244
|
+
schemaDescription = JSON.stringify(zodToJsonSchema(outputSchema), null, 2);
|
261
245
|
}
|
262
246
|
try {
|
263
247
|
if (manageConnector && !this._initialized) {
|
@@ -312,6 +296,7 @@ export class MCPAgent {
|
|
312
296
|
try {
|
313
297
|
logger.debug('Starting agent step execution');
|
314
298
|
const nextStepOutput = await this._agentExecutor._takeNextStep(nameToToolMap, inputs, intermediateSteps);
|
299
|
+
// Agent finish handling
|
315
300
|
if (nextStepOutput.returnValues) {
|
316
301
|
logger.info(`✅ Agent finished at step ${stepNum + 1}`);
|
317
302
|
result = nextStepOutput.returnValues?.output ?? 'No output generated';
|
@@ -320,6 +305,7 @@ export class MCPAgent {
|
|
320
305
|
try {
|
321
306
|
logger.info('🔧 Attempting structured output...');
|
322
307
|
const structuredResult = await this._attemptStructuredOutput(result, structuredLlm, outputSchema, schemaDescription);
|
308
|
+
logger.debug(`🔄 Structured result: ${JSON.stringify(structuredResult)}`);
|
323
309
|
// Add the final response to conversation history if memory is enabled
|
324
310
|
if (this.memoryEnabled) {
|
325
311
|
this.addToHistory(new AIMessage(`Structured result: ${JSON.stringify(structuredResult)}`));
|
@@ -331,21 +317,21 @@ export class MCPAgent {
|
|
331
317
|
catch (e) {
|
332
318
|
logger.warn(`⚠️ Structured output failed: ${e}`);
|
333
319
|
// Continue execution to gather missing information
|
334
|
-
const
|
320
|
+
const failedStructuredOutputPrompt = `
|
335
321
|
The current result cannot be formatted into the required structure.
|
336
322
|
Error: ${String(e)}
|
337
323
|
|
338
324
|
Current information: ${result}
|
339
325
|
|
340
|
-
|
326
|
+
If information is missing, please continue working to gather the missing information needed for:
|
341
327
|
${schemaDescription}
|
342
|
-
|
343
|
-
|
328
|
+
|
329
|
+
If the information is complete, please return the result in the required structure.
|
344
330
|
`;
|
345
331
|
// Add this as feedback and continue the loop
|
346
|
-
inputs.input =
|
332
|
+
inputs.input = failedStructuredOutputPrompt;
|
347
333
|
if (this.memoryEnabled) {
|
348
|
-
this.addToHistory(new HumanMessage(
|
334
|
+
this.addToHistory(new HumanMessage(failedStructuredOutputPrompt));
|
349
335
|
}
|
350
336
|
logger.info('🔄 Continuing execution to gather missing information...');
|
351
337
|
continue;
|
@@ -403,28 +389,6 @@ export class MCPAgent {
|
|
403
389
|
logger.warn(`⚠️ Agent stopped after reaching max iterations (${steps})`);
|
404
390
|
result = `Agent stopped after reaching the maximum number of steps (${steps}).`;
|
405
391
|
}
|
406
|
-
// If structured output was requested but not achieved, attempt one final time
|
407
|
-
if (outputSchema && structuredLlm && !success) {
|
408
|
-
try {
|
409
|
-
logger.info('🔧 Final attempt at structured output...');
|
410
|
-
const structuredResult = await this._attemptStructuredOutput(result, structuredLlm, outputSchema, schemaDescription);
|
411
|
-
// Add the final response to conversation history if memory is enabled
|
412
|
-
if (this.memoryEnabled) {
|
413
|
-
this.addToHistory(new AIMessage(`Structured result: ${JSON.stringify(structuredResult)}`));
|
414
|
-
}
|
415
|
-
logger.info('✅ Final structured output successful');
|
416
|
-
success = true;
|
417
|
-
return structuredResult;
|
418
|
-
}
|
419
|
-
catch (e) {
|
420
|
-
logger.error(`❌ Final structured output attempt failed: ${e}`);
|
421
|
-
throw new Error(`Failed to generate structured output after ${steps} steps: ${e}`);
|
422
|
-
}
|
423
|
-
}
|
424
|
-
// Add the final response to conversation history if memory is enabled (regular case)
|
425
|
-
if (this.memoryEnabled && !outputSchema) {
|
426
|
-
this.addToHistory(new AIMessage(result));
|
427
|
-
}
|
428
392
|
logger.info('🎉 Agent execution complete');
|
429
393
|
success = true;
|
430
394
|
// Return regular result
|
@@ -543,9 +507,12 @@ export class MCPAgent {
|
|
543
507
|
const historyToUse = externalHistory ?? this.conversationHistory;
|
544
508
|
const langchainHistory = [];
|
545
509
|
for (const msg of historyToUse) {
|
546
|
-
if (msg instanceof HumanMessage || msg instanceof AIMessage) {
|
510
|
+
if (msg instanceof HumanMessage || msg instanceof AIMessage || msg instanceof ToolMessage) {
|
547
511
|
langchainHistory.push(msg);
|
548
512
|
}
|
513
|
+
else {
|
514
|
+
logger.info(`⚠️ Skipped message of type: ${msg.constructor.name}`);
|
515
|
+
}
|
549
516
|
}
|
550
517
|
// Prepare inputs
|
551
518
|
const inputs = { input: query, chat_history: langchainHistory };
|
@@ -626,24 +593,68 @@ export class MCPAgent {
|
|
626
593
|
}
|
627
594
|
}
|
628
595
|
/**
|
629
|
-
* Attempt to create structured output from raw result with validation.
|
596
|
+
* Attempt to create structured output from raw result with validation and retry logic.
|
630
597
|
*/
|
631
598
|
async _attemptStructuredOutput(rawResult, structuredLlm, outputSchema, schemaDescription) {
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
599
|
+
logger.debug(`🔄 Attempting structured output with schema: ${outputSchema}`);
|
600
|
+
logger.debug(`🔄 Schema description: ${schemaDescription}`);
|
601
|
+
logger.debug(`🔄 Raw result: ${JSON.stringify(rawResult, null, 2)}`);
|
602
|
+
// Get detailed schema information for better prompting
|
603
|
+
const maxRetries = 3;
|
604
|
+
let lastError = '';
|
605
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
606
|
+
logger.info(`🔄 Structured output attempt ${attempt}/${maxRetries}`);
|
607
|
+
let formatPrompt = `
|
608
|
+
Please format the following information according to the EXACT schema specified below.
|
609
|
+
You must use the exact field names and types as shown in the schema.
|
610
|
+
|
611
|
+
Required schema format:
|
612
|
+
${schemaDescription}
|
613
|
+
|
614
|
+
Content to format:
|
615
|
+
${rawResult}
|
616
|
+
|
617
|
+
IMPORTANT:
|
618
|
+
- Use ONLY the field names specified in the schema
|
619
|
+
- Match the data types exactly (string, number, boolean, array, etc.)
|
620
|
+
- Include ALL required fields
|
621
|
+
- Return valid JSON that matches the schema structure exactly
|
622
|
+
`;
|
623
|
+
// Add specific error feedback for retry attempts
|
624
|
+
if (attempt > 1) {
|
625
|
+
formatPrompt += `
|
626
|
+
|
627
|
+
PREVIOUS ATTEMPT FAILED with error: ${lastError}
|
628
|
+
Please fix the issues mentioned above and ensure the output matches the schema exactly.
|
629
|
+
`;
|
630
|
+
}
|
631
|
+
try {
|
632
|
+
const structuredResult = await structuredLlm.invoke(formatPrompt);
|
633
|
+
logger.info(`🔄 Structured result attempt ${attempt}: ${JSON.stringify(structuredResult, null, 2)}`);
|
634
|
+
// Validate the structured result
|
635
|
+
const validatedResult = this._validateStructuredResult(structuredResult, outputSchema);
|
636
|
+
logger.info(`✅ Structured output successful on attempt ${attempt}`);
|
637
|
+
return validatedResult;
|
638
|
+
}
|
639
|
+
catch (e) {
|
640
|
+
lastError = e instanceof Error ? e.message : String(e);
|
641
|
+
logger.warn(`⚠️ Structured output attempt ${attempt} failed: ${lastError}`);
|
642
|
+
if (attempt === maxRetries) {
|
643
|
+
logger.error(`❌ All ${maxRetries} structured output attempts failed`);
|
644
|
+
throw new Error(`Failed to generate valid structured output after ${maxRetries} attempts. Last error: ${lastError}`);
|
645
|
+
}
|
646
|
+
// Continue to next attempt
|
647
|
+
continue;
|
648
|
+
}
|
649
|
+
}
|
650
|
+
// This should never be reached, but TypeScript requires it
|
651
|
+
throw new Error('Unexpected error in structured output generation');
|
652
|
+
}
|
653
|
+
/**
|
654
|
+
* Validate the structured result against the schema with detailed error reporting
|
655
|
+
*/
|
656
|
+
_validateStructuredResult(structuredResult, outputSchema) {
|
657
|
+
// Use Zod to validate the structured result
|
647
658
|
try {
|
648
659
|
// Use Zod to validate the structured result
|
649
660
|
const validatedResult = outputSchema.parse(structuredResult);
|
@@ -675,20 +686,8 @@ export class MCPAgent {
|
|
675
686
|
* Enhance the query with schema information to make the agent aware of required fields.
|
676
687
|
*/
|
677
688
|
_enhanceQueryWithSchema(query, outputSchema) {
|
678
|
-
const schemaFields = [];
|
679
689
|
try {
|
680
|
-
|
681
|
-
const schemaType = outputSchema;
|
682
|
-
if (schemaType._def && schemaType._def.shape) {
|
683
|
-
for (const [fieldName, fieldSchema] of Object.entries(schemaType._def.shape)) {
|
684
|
-
const field = fieldSchema;
|
685
|
-
const description = field._def?.description || field.description || fieldName;
|
686
|
-
const isOptional = field.isOptional?.() ?? field._def?.typeName === 'ZodOptional';
|
687
|
-
const isNullable = field.isNullable?.() ?? field._def?.typeName === 'ZodNullable';
|
688
|
-
schemaFields.push(`- ${fieldName}: ${description} ${(isOptional || isNullable) ? '(optional)' : '(required)'}`);
|
689
|
-
}
|
690
|
-
}
|
691
|
-
const schemaDescription = schemaFields.join('\n');
|
690
|
+
const schemaDescription = JSON.stringify(zodToJsonSchema(outputSchema), null, 2);
|
692
691
|
// Enhance the query with schema awareness
|
693
692
|
const enhancedQuery = `
|
694
693
|
${query}
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "mcp-use",
|
3
3
|
"type": "module",
|
4
|
-
"version": "0.1.
|
4
|
+
"version": "0.1.12",
|
5
5
|
"packageManager": "pnpm@10.6.1",
|
6
6
|
"description": "A utility library for integrating Model Context Protocol (MCP) with LangChain, Zod, and related tools. Provides helpers for schema conversion, event streaming, and SDK usage.",
|
7
7
|
"author": "Zane",
|
@@ -94,7 +94,7 @@
|
|
94
94
|
"winston": "^3.17.0",
|
95
95
|
"ws": "^8.18.2",
|
96
96
|
"zod": "^3.25.48",
|
97
|
-
"zod-to-json-schema": "^3.24.
|
97
|
+
"zod-to-json-schema": "^3.24.6"
|
98
98
|
},
|
99
99
|
"devDependencies": {
|
100
100
|
"@antfu/eslint-config": "^4.13.2",
|