diff --git a/pages/toolkits/productivity/todoist.mdx b/pages/toolkits/productivity/todoist.mdx
new file mode 100644
index 00000000..9364baed
--- /dev/null
+++ b/pages/toolkits/productivity/todoist.mdx
@@ -0,0 +1,211 @@
+# Todoist
+
+import ToolInfo from "@/components/ToolInfo";
+import Badges from "@/components/Badges";
+import TabbedCodeBlock from "@/components/TabbedCodeBlock";
+import TableOfContents from "@/components/TableOfContents";
+import ToolFooter from "@/components/ToolFooter";
+
+
+
+
+
+The Todoist toolkit provides a comprehensive set of tools for managing tasks and projects within the Todoist application. Users can easily perform the following actions:
+
+- Retrieve all tasks or filter tasks by specific projects or queries.
+- Create new tasks and assign them to projects.
+- Mark tasks as completed or delete them as needed.
+- Access and list all projects to organize tasks effectively.
+
+This toolkit streamlines task management, making it simple to keep track of work and projects.
+
+## Available Tools
+
+
+
+
+ If you need to perform an action that's not listed here, you can [get in touch
+ with us](mailto:contact@arcade.dev) to request a new tool, or [create your
+ own tools](/home/build-tools/create-a-toolkit).
+
+
+## Todoist.GetAllTasks
+
+
+
+
+Get all tasks from the Todoist API with pagination support. Use this when the user wants
+
+**Parameters**
+
+- **limit** (`integer`, optional) Number of tasks to return (min: 1, default: 50, max: 200). Default is 50 which should be sufficient for most use cases.
+- **next_page_token** (`string`, optional) Token for pagination. Use None for the first page, or the token returned from a previous call to get the next page of results.
+
+
+## Todoist.GetTasksByProject
+
+
+
+
+Get tasks from a specific project by project ID or name with pagination support.
+
+**Parameters**
+
+- **project** (`string`, required) The ID or name of the project to get tasks from.
+- **limit** (`integer`, optional) Number of tasks to return (min: 1, default: 50, max: 200). Default is 50 which should be sufficient for most use cases.
+- **next_page_token** (`string`, optional) Token for pagination. Use None for the first page, or the token returned from a previous call to get the next page of results.
+
+
+## Todoist.CreateTask
+
+
+
+
+Create a new task for the user. Use this whenever the user wants to create, add, or make a task.
+
+**Parameters**
+
+- **description** (`string`, required) The title of the task to be created.
+- **project** (`string`, optional) The ID or name of the project to add the task to. Use the project ID or name if user mentions a specific project. Leave as None to add to inbox.
+
+
+## Todoist.CloseTask
+
+
+
+
+Close a task by its exact ID. Use this whenever the user wants to
+
+**Parameters**
+
+- **task_id** (`string`, required) The exact ID of the task to be closed.
+
+
+## Todoist.DeleteTask
+
+
+
+
+Delete a task by its exact ID. Use this whenever the user wants to
+
+**Parameters**
+
+- **task_id** (`string`, required) The exact ID of the task to be deleted.
+
+
+## Todoist.GetTasksByFilter
+
+
+
+
+Get tasks by filter query with pagination support.
+
+**Parameters**
+
+- **filter_query** (`string`, required) The filter query to search tasks.
+- **limit** (`integer`, optional) Number of tasks to return (min: 1, default: 50, max: 200). Default is 50 which should be sufficient for most use cases.
+- **next_page_token** (`string`, optional) Token for pagination. Use None for the first page, or the token returned from a previous call to get the next page of results.
+
+
+## Todoist.GetProjects
+
+
+
+
+Get all projects from the Todoist API. Use this when the user wants to see, list, or browse
+
+**Parameters**
+
+This tool does not take any parameters.
+
+
+
+
diff --git a/public/examples/integrations/toolkits/todoist/close_task_example_call_tool.js b/public/examples/integrations/toolkits/todoist/close_task_example_call_tool.js
new file mode 100644
index 00000000..605ba321
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/close_task_example_call_tool.js
@@ -0,0 +1,28 @@
+import { Arcade } from "@arcadeai/arcadejs";
+
+const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable
+
+const USER_ID = "{arcade_user_id}";
+const TOOL_NAME = "Todoist.CloseTask";
+
+// Start the authorization process
+const authResponse = await client.tools.authorize({tool_name: TOOL_NAME});
+
+if (authResponse.status !== "completed") {
+ console.log(`Click this link to authorize: ${authResponse.url}`);
+}
+
+// Wait for the authorization to complete
+await client.auth.waitForCompletion(authResponse);
+
+const toolInput = {
+ "task_id": "12345"
+};
+
+const response = await client.tools.execute({
+ tool_name: TOOL_NAME,
+ input: toolInput,
+ user_id: USER_ID,
+});
+
+console.log(JSON.stringify(response.output.value, null, 2));
diff --git a/public/examples/integrations/toolkits/todoist/close_task_example_call_tool.py b/public/examples/integrations/toolkits/todoist/close_task_example_call_tool.py
new file mode 100644
index 00000000..dbc35a39
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/close_task_example_call_tool.py
@@ -0,0 +1,26 @@
+import json
+from arcadepy import Arcade
+
+client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable
+
+USER_ID = "{arcade_user_id}"
+TOOL_NAME = "Todoist.CloseTask"
+
+auth_response = client.tools.authorize(tool_name=TOOL_NAME)
+
+if auth_response.status != "completed":
+ print(f"Click this link to authorize: {auth_response.url}")
+
+# Wait for the authorization to complete
+client.auth.wait_for_completion(auth_response)
+
+tool_input = {
+ 'task_id': '12345'
+}
+
+response = client.tools.execute(
+ tool_name=TOOL_NAME,
+ input=tool_input,
+ user_id=USER_ID,
+)
+print(json.dumps(response.output.value, indent=2))
diff --git a/public/examples/integrations/toolkits/todoist/create_task_example_call_tool.js b/public/examples/integrations/toolkits/todoist/create_task_example_call_tool.js
new file mode 100644
index 00000000..61eebf5f
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/create_task_example_call_tool.js
@@ -0,0 +1,29 @@
+import { Arcade } from "@arcadeai/arcadejs";
+
+const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable
+
+const USER_ID = "{arcade_user_id}";
+const TOOL_NAME = "Todoist.CreateTask";
+
+// Start the authorization process
+const authResponse = await client.tools.authorize({tool_name: TOOL_NAME});
+
+if (authResponse.status !== "completed") {
+ console.log(`Click this link to authorize: ${authResponse.url}`);
+}
+
+// Wait for the authorization to complete
+await client.auth.waitForCompletion(authResponse);
+
+const toolInput = {
+ "description": "Implement user authentication",
+ "project": "ProjectX"
+};
+
+const response = await client.tools.execute({
+ tool_name: TOOL_NAME,
+ input: toolInput,
+ user_id: USER_ID,
+});
+
+console.log(JSON.stringify(response.output.value, null, 2));
diff --git a/public/examples/integrations/toolkits/todoist/create_task_example_call_tool.py b/public/examples/integrations/toolkits/todoist/create_task_example_call_tool.py
new file mode 100644
index 00000000..5a0fd66e
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/create_task_example_call_tool.py
@@ -0,0 +1,26 @@
+import json
+from arcadepy import Arcade
+
+client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable
+
+USER_ID = "{arcade_user_id}"
+TOOL_NAME = "Todoist.CreateTask"
+
+auth_response = client.tools.authorize(tool_name=TOOL_NAME)
+
+if auth_response.status != "completed":
+ print(f"Click this link to authorize: {auth_response.url}")
+
+# Wait for the authorization to complete
+client.auth.wait_for_completion(auth_response)
+
+tool_input = {
+ 'description': 'Implement user authentication', 'project': 'ProjectX'
+}
+
+response = client.tools.execute(
+ tool_name=TOOL_NAME,
+ input=tool_input,
+ user_id=USER_ID,
+)
+print(json.dumps(response.output.value, indent=2))
diff --git a/public/examples/integrations/toolkits/todoist/delete_task_example_call_tool.js b/public/examples/integrations/toolkits/todoist/delete_task_example_call_tool.js
new file mode 100644
index 00000000..aee130c8
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/delete_task_example_call_tool.js
@@ -0,0 +1,28 @@
+import { Arcade } from "@arcadeai/arcadejs";
+
+const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable
+
+const USER_ID = "{arcade_user_id}";
+const TOOL_NAME = "Todoist.DeleteTask";
+
+// Start the authorization process
+const authResponse = await client.tools.authorize({tool_name: TOOL_NAME});
+
+if (authResponse.status !== "completed") {
+ console.log(`Click this link to authorize: ${authResponse.url}`);
+}
+
+// Wait for the authorization to complete
+await client.auth.waitForCompletion(authResponse);
+
+const toolInput = {
+ "task_id": "12345"
+};
+
+const response = await client.tools.execute({
+ tool_name: TOOL_NAME,
+ input: toolInput,
+ user_id: USER_ID,
+});
+
+console.log(JSON.stringify(response.output.value, null, 2));
diff --git a/public/examples/integrations/toolkits/todoist/delete_task_example_call_tool.py b/public/examples/integrations/toolkits/todoist/delete_task_example_call_tool.py
new file mode 100644
index 00000000..c490c095
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/delete_task_example_call_tool.py
@@ -0,0 +1,26 @@
+import json
+from arcadepy import Arcade
+
+client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable
+
+USER_ID = "{arcade_user_id}"
+TOOL_NAME = "Todoist.DeleteTask"
+
+auth_response = client.tools.authorize(tool_name=TOOL_NAME)
+
+if auth_response.status != "completed":
+ print(f"Click this link to authorize: {auth_response.url}")
+
+# Wait for the authorization to complete
+client.auth.wait_for_completion(auth_response)
+
+tool_input = {
+ 'task_id': '12345'
+}
+
+response = client.tools.execute(
+ tool_name=TOOL_NAME,
+ input=tool_input,
+ user_id=USER_ID,
+)
+print(json.dumps(response.output.value, indent=2))
diff --git a/public/examples/integrations/toolkits/todoist/get_all_tasks_example_call_tool.js b/public/examples/integrations/toolkits/todoist/get_all_tasks_example_call_tool.js
new file mode 100644
index 00000000..8e127022
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/get_all_tasks_example_call_tool.js
@@ -0,0 +1,29 @@
+import { Arcade } from "@arcadeai/arcadejs";
+
+const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable
+
+const USER_ID = "{arcade_user_id}";
+const TOOL_NAME = "Todoist.GetAllTasks";
+
+// Start the authorization process
+const authResponse = await client.tools.authorize({tool_name: TOOL_NAME});
+
+if (authResponse.status !== "completed") {
+ console.log(`Click this link to authorize: ${authResponse.url}`);
+}
+
+// Wait for the authorization to complete
+await client.auth.waitForCompletion(authResponse);
+
+const toolInput = {
+ "limit": 50,
+ "next_page_token": null
+};
+
+const response = await client.tools.execute({
+ tool_name: TOOL_NAME,
+ input: toolInput,
+ user_id: USER_ID,
+});
+
+console.log(JSON.stringify(response.output.value, null, 2));
diff --git a/public/examples/integrations/toolkits/todoist/get_all_tasks_example_call_tool.py b/public/examples/integrations/toolkits/todoist/get_all_tasks_example_call_tool.py
new file mode 100644
index 00000000..b47aa054
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/get_all_tasks_example_call_tool.py
@@ -0,0 +1,26 @@
+import json
+from arcadepy import Arcade
+
+client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable
+
+USER_ID = "{arcade_user_id}"
+TOOL_NAME = "Todoist.GetAllTasks"
+
+auth_response = client.tools.authorize(tool_name=TOOL_NAME)
+
+if auth_response.status != "completed":
+ print(f"Click this link to authorize: {auth_response.url}")
+
+# Wait for the authorization to complete
+client.auth.wait_for_completion(auth_response)
+
+tool_input = {
+ 'limit': 50, 'next_page_token': None
+}
+
+response = client.tools.execute(
+ tool_name=TOOL_NAME,
+ input=tool_input,
+ user_id=USER_ID,
+)
+print(json.dumps(response.output.value, indent=2))
diff --git a/public/examples/integrations/toolkits/todoist/get_projects_example_call_tool.js b/public/examples/integrations/toolkits/todoist/get_projects_example_call_tool.js
new file mode 100644
index 00000000..ca8f0644
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/get_projects_example_call_tool.js
@@ -0,0 +1,26 @@
+import { Arcade } from "@arcadeai/arcadejs";
+
+const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable
+
+const USER_ID = "{arcade_user_id}";
+const TOOL_NAME = "Todoist.GetProjects";
+
+// Start the authorization process
+const authResponse = await client.tools.authorize({tool_name: TOOL_NAME});
+
+if (authResponse.status !== "completed") {
+ console.log(`Click this link to authorize: ${authResponse.url}`);
+}
+
+// Wait for the authorization to complete
+await client.auth.waitForCompletion(authResponse);
+
+const toolInput = {};
+
+const response = await client.tools.execute({
+ tool_name: TOOL_NAME,
+ input: toolInput,
+ user_id: USER_ID,
+});
+
+console.log(JSON.stringify(response.output.value, null, 2));
diff --git a/public/examples/integrations/toolkits/todoist/get_projects_example_call_tool.py b/public/examples/integrations/toolkits/todoist/get_projects_example_call_tool.py
new file mode 100644
index 00000000..17c0ceb0
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/get_projects_example_call_tool.py
@@ -0,0 +1,26 @@
+import json
+from arcadepy import Arcade
+
+client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable
+
+USER_ID = "{arcade_user_id}"
+TOOL_NAME = "Todoist.GetProjects"
+
+auth_response = client.tools.authorize(tool_name=TOOL_NAME)
+
+if auth_response.status != "completed":
+ print(f"Click this link to authorize: {auth_response.url}")
+
+# Wait for the authorization to complete
+client.auth.wait_for_completion(auth_response)
+
+tool_input = {
+
+}
+
+response = client.tools.execute(
+ tool_name=TOOL_NAME,
+ input=tool_input,
+ user_id=USER_ID,
+)
+print(json.dumps(response.output.value, indent=2))
diff --git a/public/examples/integrations/toolkits/todoist/get_tasks_by_filter_example_call_tool.js b/public/examples/integrations/toolkits/todoist/get_tasks_by_filter_example_call_tool.js
new file mode 100644
index 00000000..96e97395
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/get_tasks_by_filter_example_call_tool.js
@@ -0,0 +1,29 @@
+import { Arcade } from "@arcadeai/arcadejs";
+
+const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable
+
+const USER_ID = "{arcade_user_id}";
+const TOOL_NAME = "Todoist.GetTasksByFilter";
+
+// Start the authorization process
+const authResponse = await client.tools.authorize({tool_name: TOOL_NAME});
+
+if (authResponse.status !== "completed") {
+ console.log(`Click this link to authorize: ${authResponse.url}`);
+}
+
+// Wait for the authorization to complete
+await client.auth.waitForCompletion(authResponse);
+
+const toolInput = {
+ "filter_query": "status:open",
+ "limit": 20
+};
+
+const response = await client.tools.execute({
+ tool_name: TOOL_NAME,
+ input: toolInput,
+ user_id: USER_ID,
+});
+
+console.log(JSON.stringify(response.output.value, null, 2));
diff --git a/public/examples/integrations/toolkits/todoist/get_tasks_by_filter_example_call_tool.py b/public/examples/integrations/toolkits/todoist/get_tasks_by_filter_example_call_tool.py
new file mode 100644
index 00000000..fdb160e3
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/get_tasks_by_filter_example_call_tool.py
@@ -0,0 +1,26 @@
+import json
+from arcadepy import Arcade
+
+client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable
+
+USER_ID = "{arcade_user_id}"
+TOOL_NAME = "Todoist.GetTasksByFilter"
+
+auth_response = client.tools.authorize(tool_name=TOOL_NAME)
+
+if auth_response.status != "completed":
+ print(f"Click this link to authorize: {auth_response.url}")
+
+# Wait for the authorization to complete
+client.auth.wait_for_completion(auth_response)
+
+tool_input = {
+ 'filter_query': 'status:open', 'limit': 20
+}
+
+response = client.tools.execute(
+ tool_name=TOOL_NAME,
+ input=tool_input,
+ user_id=USER_ID,
+)
+print(json.dumps(response.output.value, indent=2))
diff --git a/public/examples/integrations/toolkits/todoist/get_tasks_by_project_example_call_tool.js b/public/examples/integrations/toolkits/todoist/get_tasks_by_project_example_call_tool.js
new file mode 100644
index 00000000..f415f23d
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/get_tasks_by_project_example_call_tool.js
@@ -0,0 +1,29 @@
+import { Arcade } from "@arcadeai/arcadejs";
+
+const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable
+
+const USER_ID = "{arcade_user_id}";
+const TOOL_NAME = "Todoist.GetTasksByProject";
+
+// Start the authorization process
+const authResponse = await client.tools.authorize({tool_name: TOOL_NAME});
+
+if (authResponse.status !== "completed") {
+ console.log(`Click this link to authorize: ${authResponse.url}`);
+}
+
+// Wait for the authorization to complete
+await client.auth.waitForCompletion(authResponse);
+
+const toolInput = {
+ "project": "Project Alpha",
+ "limit": 50
+};
+
+const response = await client.tools.execute({
+ tool_name: TOOL_NAME,
+ input: toolInput,
+ user_id: USER_ID,
+});
+
+console.log(JSON.stringify(response.output.value, null, 2));
diff --git a/public/examples/integrations/toolkits/todoist/get_tasks_by_project_example_call_tool.py b/public/examples/integrations/toolkits/todoist/get_tasks_by_project_example_call_tool.py
new file mode 100644
index 00000000..f9fe411e
--- /dev/null
+++ b/public/examples/integrations/toolkits/todoist/get_tasks_by_project_example_call_tool.py
@@ -0,0 +1,26 @@
+import json
+from arcadepy import Arcade
+
+client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable
+
+USER_ID = "{arcade_user_id}"
+TOOL_NAME = "Todoist.GetTasksByProject"
+
+auth_response = client.tools.authorize(tool_name=TOOL_NAME)
+
+if auth_response.status != "completed":
+ print(f"Click this link to authorize: {auth_response.url}")
+
+# Wait for the authorization to complete
+client.auth.wait_for_completion(auth_response)
+
+tool_input = {
+ 'project': 'Project Alpha', 'limit': 50
+}
+
+response = client.tools.execute(
+ tool_name=TOOL_NAME,
+ input=tool_input,
+ user_id=USER_ID,
+)
+print(json.dumps(response.output.value, indent=2))