diff --git a/.changeset/lemon-windows-fetch.md b/.changeset/lemon-windows-fetch.md
new file mode 100644
index 0000000000000000000000000000000000000000..72d27fc61d547b0adbe7160236957555a96fe57f
--- /dev/null
+++ b/.changeset/lemon-windows-fetch.md
@@ -0,0 +1,5 @@
+---
+"llamaindex": patch
+---
+
+feat: add tool factory
diff --git a/packages/core/src/tools/ToolFactory.ts b/packages/core/src/tools/ToolFactory.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d40b0d9500b3f802d39208f58e95737c23cdd0c0
--- /dev/null
+++ b/packages/core/src/tools/ToolFactory.ts
@@ -0,0 +1,33 @@
+import type { BaseTool } from "../types.js";
+import { WikipediaTool } from "./WikipediaTool.js";
+
+enum Tools {
+  Wikipedia = "wikipedia.WikipediaToolSpec",
+}
+
+type ToolConfig = { [key in Tools]: Record<string, any> };
+
+export class ToolFactory {
+  private static async createTool(
+    key: Tools,
+    options: Record<string, any>,
+  ): Promise<BaseTool> {
+    if (key === Tools.Wikipedia) {
+      const tool = new WikipediaTool();
+      return tool;
+    }
+
+    throw new Error(
+      `Sorry! Tool ${key} is not supported yet. Options: ${options}`,
+    );
+  }
+
+  public static async createTools(config: ToolConfig): Promise<BaseTool[]> {
+    const tools: BaseTool[] = [];
+    for (const [key, value] of Object.entries(config as ToolConfig)) {
+      const tool = await ToolFactory.createTool(key as Tools, value);
+      tools.push(tool);
+    }
+    return tools;
+  }
+}
diff --git a/packages/core/src/tools/index.ts b/packages/core/src/tools/index.ts
index 2b52c32edf8fbc07dd31882a66ace92095400d61..c9d38eef9943bb3bdfe0fc45d2b977492ce2a8a4 100644
--- a/packages/core/src/tools/index.ts
+++ b/packages/core/src/tools/index.ts
@@ -1,4 +1,5 @@
 export * from "./QueryEngineTool.js";
+export * from "./ToolFactory.js";
 export * from "./WikipediaTool.js";
 export * from "./functionTool.js";
 export * from "./types.js";