@forestadmin/mcp-server 1.8.0 → 1.8.1

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.
@@ -20,8 +20,8 @@ type ToolResult = {
20
20
  * This wrapper logs validation errors with detailed field information,
21
21
  * which helps debug tool calls when clients send invalid arguments.
22
22
  *
23
- * Note: Execution errors are logged by the SSE response interceptor in server.ts,
24
- * so we don't duplicate that logging here.
23
+ * Note: Execution errors are caught and converted to { isError: true } tool results.
24
+ * The SSE response interceptor in server.ts additionally logs these errors from the stream.
25
25
  *
26
26
  * @example
27
27
  * registerToolWithLogging(
@@ -32,8 +32,8 @@ function logValidationErrorsIfAny(args, schema, toolName, logger) {
32
32
  * This wrapper logs validation errors with detailed field information,
33
33
  * which helps debug tool calls when clients send invalid arguments.
34
34
  *
35
- * Note: Execution errors are logged by the SSE response interceptor in server.ts,
36
- * so we don't duplicate that logging here.
35
+ * Note: Execution errors are caught and converted to { isError: true } tool results.
36
+ * The SSE response interceptor in server.ts additionally logs these errors from the stream.
37
37
  *
38
38
  * @example
39
39
  * registerToolWithLogging(
@@ -59,9 +59,28 @@ handler, logger) {
59
59
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
60
  (async (args, extra) => {
61
61
  logValidationErrorsIfAny(args, schema, toolName, logger);
62
- return handler(args, extra);
62
+ // Return errors as tool results (isError: true) instead of throwing.
63
+ // Per MCP spec, tool errors should be reported within the result object,
64
+ // not as protocol-level errors, so the LLM can see and handle them.
65
+ // See: https://modelcontextprotocol.io/docs/concepts/tools
66
+ try {
67
+ return await handler(args, extra);
68
+ }
69
+ catch (error) {
70
+ let message;
71
+ try {
72
+ message = error instanceof Error ? error.message : JSON.stringify(error) ?? String(error);
73
+ }
74
+ catch {
75
+ message = String(error);
76
+ }
77
+ return {
78
+ content: [{ type: 'text', text: message }],
79
+ isError: true,
80
+ };
81
+ }
63
82
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
83
  }));
65
84
  return toolName;
66
85
  }
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC13aXRoLWxvZ2dpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdG9vbC13aXRoLWxvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpRkEsMENBMEJDO0FBeEdELDZCQUF3QjtBQW1CeEIsZ0ZBQWdGO0FBQ2hGLHFCQUFxQjtBQUNyQixnRkFBZ0Y7QUFFaEY7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBaUI7SUFDdkMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHdCQUF3QixDQUMvQixJQUFhLEVBQ2IsTUFBbUIsRUFDbkIsUUFBZ0IsRUFDaEIsTUFBYztJQUVkLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxRQUFRLHVCQUF1QixZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7QUFDSCxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLG9CQUFvQjtBQUNwQixnRkFBZ0Y7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILFNBQXdCLHVCQUF1QixDQUk3QyxTQUFvQixFQUNwQixRQUFnQixFQUNoQixNQUEyQjtBQUMzQiw4REFBOEQ7QUFDOUQsT0FBeUQsRUFDekQsTUFBYztJQUVkLE1BQU0sTUFBTSxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTVDLFNBQVMsQ0FBQyxZQUFZLENBQ3BCLFFBQVEsRUFDUixNQUFNO0lBQ04sOERBQThEO0lBQzlELENBQUMsS0FBSyxFQUFFLElBQVMsRUFBRSxLQUFVLEVBQUUsRUFBRTtRQUMvQix3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6RCxPQUFPLE9BQU8sQ0FBQyxJQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsOERBQThEO0lBQ2hFLENBQUMsQ0FBUSxDQUNWLENBQUM7SUFFRixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIn0=
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC13aXRoLWxvZ2dpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdG9vbC13aXRoLWxvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFpRkEsMENBNkNDO0FBM0hELDZCQUF3QjtBQW1CeEIsZ0ZBQWdGO0FBQ2hGLHFCQUFxQjtBQUNyQixnRkFBZ0Y7QUFFaEY7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBaUI7SUFDdkMsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLHdCQUF3QixDQUMvQixJQUFhLEVBQ2IsTUFBbUIsRUFDbkIsUUFBZ0IsRUFDaEIsTUFBYztJQUVkLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxRQUFRLHVCQUF1QixZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7QUFDSCxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLG9CQUFvQjtBQUNwQixnRkFBZ0Y7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILFNBQXdCLHVCQUF1QixDQUk3QyxTQUFvQixFQUNwQixRQUFnQixFQUNoQixNQUEyQjtBQUMzQiw4REFBOEQ7QUFDOUQsT0FBeUQsRUFDekQsTUFBYztJQUVkLE1BQU0sTUFBTSxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTVDLFNBQVMsQ0FBQyxZQUFZLENBQ3BCLFFBQVEsRUFDUixNQUFNO0lBQ04sOERBQThEO0lBQzlELENBQUMsS0FBSyxFQUFFLElBQVMsRUFBRSxLQUFVLEVBQUUsRUFBRTtRQUMvQix3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6RCxxRUFBcUU7UUFDckUseUVBQXlFO1FBQ3pFLG9FQUFvRTtRQUNwRSwyREFBMkQ7UUFDM0QsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLE9BQU8sQ0FBQyxJQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLE9BQWUsQ0FBQztZQUVwQixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVGLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBRUQsT0FBTztnQkFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUMxQyxPQUFPLEVBQUUsSUFBSTthQUNkLENBQUM7UUFDSixDQUFDO1FBQ0QsOERBQThEO0lBQ2hFLENBQUMsQ0FBUSxDQUNWLENBQUM7SUFFRixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/mcp-server",
3
- "version": "1.8.0",
3
+ "version": "1.8.1",
4
4
  "description": "Model Context Protocol server for Forest Admin with OAuth authentication",
5
5
  "main": "dist/index.js",
6
6
  "bin": {