{"record":{"id":"0a6a4f827f49496a","repo":"mastra-ai/mastra","slug":"method-not-implemented","errorCode":null,"errorMessage":"Method not implemented.","messagePattern":"Method not implemented\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/core/src/integration/integration.ts","lineNumber":41,"sourceCode":"  public listWorkflows({ serialized }: { serialized?: boolean }): Record<string, Workflow> {\n    if (serialized) {\n      return Object.entries(this.workflows).reduce((acc, [k, v]) => {\n        return {\n          ...acc,\n          [k]: {\n            name: v.name,\n          },\n        };\n      }, {});\n    }\n    return this.workflows;\n  }\n\n  /**\n   * TOOLS\n   */\n  listStaticTools(_params?: ToolsParams): Record<string, ToolAction<any, any, any>> {\n    throw new Error('Method not implemented.');\n  }\n\n  async listTools(_params?: ToolsParams): Promise<Record<string, ToolAction<any, any, any>>> {\n    throw new Error('Method not implemented.');\n  }\n\n  async getApiClient(): Promise<ApiClient> {\n    throw new Error('Method not implemented');\n  }\n}\n","sourceCodeStart":23,"sourceCodeEnd":52,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/integration/integration.ts#L23-L52","documentation":"listStaticTools is a base-class stub on MastraIntegration. The abstract base intentionally provides no default implementation: each concrete integration (OpenAPI toolset, etc.) must override it. Calling it on the base class or on an integration that has not implemented it throws 'Method not implemented.'","triggerScenarios":"Calling integration.listStaticTools() on an integration subclass that does not override listStaticTools — most commonly the base MastraIntegration class itself, or a custom integration that only implemented listTools/getApiClient.","commonSituations":"Building a custom integration and forgetting to override listStaticTools; generic tool-enumeration code iterating all integrations and calling listStaticTools unconditionally; calling the method on a base-typed reference.","solutions":["Implement listStaticTools in your integration subclass, returning the static tool map","Check hasOwnProperty/listStaticTools availability (e.g. this.listStaticTools !== MastraIntegration.prototype.listStaticTools) before calling","Use listTools() instead if dynamic tools are what you need and the integration supports it","Wrap calls in try/catch when iterating heterogeneous integrations"],"exampleFix":"// before\nclass MyIntegration extends MastraIntegration {}\n// after\nclass MyIntegration extends MastraIntegration {\n  listStaticTools(_params?: ToolsParams) {\n    return { myTool };\n  }\n}","handlingStrategy":"type-guard","validationCode":"if (integration.listStaticTools === MastraIntegration.prototype.listStaticTools) {\n  throw new Error(`${integration.name} does not implement listStaticTools`);\n}","typeGuard":"function implementsListStaticTools(integration) {\n  return typeof integration.listStaticTools === 'function' &&\n    integration.listStaticTools !== MastraIntegration.prototype.listStaticTools;\n}","tryCatchPattern":"try {\n  const tools = integration.listStaticTools(params);\n} catch (e) {\n  if (e.message === 'Method not implemented.') {\n    const tools = {}; // integration exposes no static tools\n  } else {\n    throw e;\n  }\n}","preventionTips":["Override listStaticTools in every custom integration subclass","Feature-detect the override before calling in generic loops","Prefer listTools() when dynamic enumeration is acceptable","Add a shared abstract-base lint/test asserting required overrides"],"tags":["abstract-method","integration","tools","not-implemented"],"backgroundTag":"method-not-implemented","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}