CONNECT APP
Build with Todoist
Productivity
- OAuth
MCP
Give your agent Todoist tools
Every Todoist action is exposed as an MCP tool on Pipedream's remote server. Point a client at it with your end user's ID and Connect resolves that user's Todoist account for each tool call — you store no tokens.
// accessToken: mint a short-lived token with the Connect SDK — see the MCP guide
const transport = new StreamableHTTPClientTransport(
new URL("https://remote.mcp.pipedream.net/v3"),
{
requestInit: {
headers: {
Authorization: `Bearer ${accessToken}`,
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
"x-pd-app-slug": "todoist",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// e.g. run Create Filter:
const result = await mcp.callTool({
name: "todoist-create-filter",
arguments: {
name: "Name",
query: "Query",
},
})# access_token: mint a short-lived token with the Connect SDK — see the MCP guide
headers = {
"Authorization": f"Bearer {access_token}",
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", # any stable ID for this user in your system
"x-pd-app-slug": "todoist",
}
async with streamablehttp_client("https://remote.mcp.pipedream.net/v3", headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
# e.g. run Create Filter:
result = await session.call_tool("todoist-create-filter", {
"name": "Name",
"query": "Query",
})API PROXY
Call the Todoist API directly
For an endpoint with no pre-built tool, the Connect proxy forwards your request to the Todoist API with the connected user's credentials attached. You store no tokens and write no refresh logic.
const resp = await pd.proxy.get({
externalUserId: "{external_user_id}", // any stable ID for this user in your system
accountId: "apn_xxxxxxx",
url: "https://api.todoist.com/rest/v2/projects",
})
// Any allowed Todoist endpoint works here. Pipedream attaches the
// connected account's credentials to the outgoing request.# The path segment is the target URL, URL-safe base64 encoded:
# https://api.todoist.com/rest/v2/projects
curl "https://api.pipedream.com/v1/connect/{project_id}/proxy/aHR0cHM6Ly9hcGkudG9kb2lzdC5jb20vcmVzdC92Mi9wcm9qZWN0cw?external_user_id={external_user_id}&account_id=apn_xxxxxxx" \
-H "Authorization: Bearer {access_token}" \
-H "x-pd-environment: production"SDK
Run Todoist actions from your backend
Connect a user's Todoist account once, then run Create Filter on their behalf from your own code — TypeScript, Python, or plain HTTP.
import { PipedreamClient } from "@pipedream/sdk"
const pd = new PipedreamClient({
projectId: process.env.PIPEDREAM_PROJECT_ID!,
clientId: process.env.PIPEDREAM_CLIENT_ID!,
clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
projectEnvironment: "production",
})
const result = await pd.actions.run({
id: "todoist-create-filter",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
todoist: { authProvisionId: "apn_xxxxxxx" },
name: "Name",
query: "Query",
},
})from pipedream import Pipedream
pd = Pipedream(
client_id="{oauth_client_id}",
client_secret="{oauth_client_secret}",
project_id="{project_id}",
project_environment="production",
)
result = pd.actions.run(
id="todoist-create-filter",
external_user_id="{external_user_id}", # any stable ID for this user in your system
configured_props={
"todoist": {"authProvisionId": "apn_xxxxxxx"},
"name": "Name",
"query": "Query",
},
)curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
-H "Content-Type: application/json" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}" \
-d '{
"external_user_id": "{external_user_id}",
"id": "todoist-create-filter",
"configured_props": {
"todoist": { "authProvisionId": "apn_xxxxxxx" },
"name": "Name",
"query": "Query"
}
}'TOOLS
Todoist actions
On-demand operations your product or agent can configure and run on behalf of a connected user.
-
Create Filter
actionCreates a filter. See the documentationWritev0.0.10 -
Create Label
actionCreates a label. See the documentationWritev0.0.10 -
Create Project
actionCreates a project. See the documentationWritev0.0.10 -
Create Project Comment
actionAdds a comment to a project. See the documentationWritev0.0.10 -
Create Section
actionCreates a section. See the documentationWritev0.0.10 -
Create Task
actionCreates a task. See the documentationWritev0.0.12 -
Create Task Comment
actionAdds a comment to a task. See the documentationWritev0.0.10 -
Delete Comment
actionDeletes a comment. See the documentationWritev0.0.10 -
Delete Filter
actionDeletes a filter. See the documentationWritev0.0.10 -
Delete Label
actionDeletes a label. See the documentationWritev0.0.10 -
Delete Project
actionDeletes a project. See the documentationWritev0.0.10 -
Delete Section
actionDeletes a section. See the documentationWritev0.0.10 -
Delete Task
actionDeletes a task. See the documentationWritev0.0.10 -
Export Tasks
actionExport project task names as comma separated file. Returns path to new file. See the documentationRead-onlyv0.1.8 -
Find Project
actionFinds a project (by name/title). See the documentation Optionally, create one if none are found. See the documentationRead-onlyv0.0.10 -
Find Task
actionFinds a task by name. See the documentation Optionally, create one if none are found. See the documentationRead-onlyv0.0.10 -
Find User
actionSearches by email for a user who is connected/shared with your account. See the documentationRead-onlyv0.0.10 -
Get Label
actionReturns info about a label. See the documentationRead-onlyv0.0.10 -
Get Project
actionReturns info about a project. See the documentationRead-onlyv0.0.10 -
Get Project Comment
actionReturns info about a project comment. See the documentationWritev0.0.10 -
Get Section
actionReturns info about a section. See the documentationRead-onlyv0.0.10 -
Get Task
actionReturns info about a task. See the documentationRead-onlyv0.0.10 -
Get Task Comment
actionReturns info about a task comment. See the documentationWritev0.0.10 -
Import Tasks
actionImport tasks into a selected project. See the documentationWritev0.1.8 -
Invite User To Project
actionSends email to a person, inviting them to use one of your projects. See the documentationWritev0.0.10 -
List Filters
actionReturns a list of all filters. See the documentationRead-onlyv0.0.10 -
List Labels
actionReturns a list of all labels. See the documentationRead-onlyv0.0.10 -
List Labels Options
actionRetrieves available options for the Labels field.Read-onlyv0.0.2 -
List Project Comments
actionReturns a list of comments for a project. See the documentationRead-onlyv0.0.10 -
List Projects
actionReturns a list of all projects. See the documentationRead-onlyv0.0.10 -
List Resource Types Options
actionRetrieves available options for the Resource Types field.Read-onlyv0.0.2 -
List Sections
actionReturns a list of all sections. See the documentationRead-onlyv0.0.10 -
List Select Projects Options
actionRetrieves available options for the Select Projects field.Read-onlyv0.0.2 -
List Task Comments
actionReturns a list of comments for a task. See the documentationRead-onlyv0.0.10 -
List Uncompleted Tasks
actionReturns a list of uncompleted tasks by project, section, and/or label. See the documentationRead-onlyv0.1.0 -
Mark Task as Completed
actionMarks a task as being completed. See the documentationWritev0.0.10 -
Move Task To Section
actionMove a Task to a different section within the same project. See the documentationWritev0.0.10 -
Search Tasks
actionSearch tasks by name, label, project and/or section. See the documentationRead-onlyv0.0.9 -
Uncomplete Task
actionUncompletes a task. See the documentationWritev0.0.10 -
Update Comment
actionUpdates a comment. See the documentationWritev0.0.10 -
Update Filter
actionUpdates a filter. See the documentationWritev0.0.10 -
Update Label
actionUpdates a label. See the documentationWritev0.0.10 -
Update Project
actionUpdates a project. See the documentationWritev0.0.10 -
Update Section
actionUpdates a section. See the documentationWritev0.0.10 -
Update Task
actionUpdates a task. See the documentationWritev0.0.10
EVENTS
Todoist triggers
Event sources your backend can deploy for users and receive through a webhook.
-
New or Modified Task
triggerEmit new event for each new or modified task. See the documentationv0.0.12 -
New Completed Task
triggerEmit new event for each completed Todoist task, including recurring task completions. Non-recurring completions are polled viaGET /tasks/completed/by_completion_date. Recurring completions don't appear there - Todoist reschedules a recurring task instead of marking it completed there - so they're additionally polled via the v1 Activity Log (GET /api/v1/activities), detected as anitem:completedevent withextra_data.is_recurringset totrue. Accessing recurring task completions older than 7 days requires a Todoist premium/business plan. Respects the Projects filter. See the documentation.v2.0.0 -
New Incomplete Task
triggerEmit new event for each new incomplete task. See the documentationv0.1.6 -
New or Modified Project
triggerEmit new event for each new or modified project. See the documentationv0.0.12 -
New Project
triggerEmit new event for each new project. See the documentationv0.0.12 -
New Section
triggerEmit new event for each new section added. See the documentationv0.0.12 -
New Sync Resources
triggerEmit new updates for your selected resources. See the documentationv0.0.12 -
New Task
triggerEmit new event for each new task. See the documentationv0.0.12
MULTI-APP
Use Todoist with other popular apps
Most products don't stop at one integration. Pair Todoist with the other apps your users rely on, and ship use cases that span both.
- App slug
- todoist
- Authentication
- OAuth
- Categories
- Productivity
- Actions
- 45
- Triggers
- 8
- API proxy
- Available
OAuth scopes
These are the scopes Pipedream's managed Todoist OAuth client requests when one of your users connects an account. Supply your own OAuth client to request a different set.
- task:add
- data:read_write
- data:delete
- project:delete
- data:read