airbyte_ops_mcp.mcp.devin_reminders
MCP tools for scheduling and cancelling Devin agent reminders.
This module exposes reminder scheduling and cancellation as MCP tools for AI agents. It is a thin wrapper around the core dispatch functions in the devin_reminders module.
MCP reference
MCP primitives registered by the devin_reminders module of the airbyte-internal-ops server: 2 tool(s), 0 prompt(s), 0 resource(s).
Tools (2)
cancel_devin_reminder
Hints: open-world
Cancel pending Devin reminders by session URL and specific GUIDs.
Removes matching reminders so they will not fire. Use this when instructed to stop reminders, or when a reminder is no longer needed.
Both agent_session_url and cancel_guids are required. Only reminders matching the session URL AND present in the GUID list are cancelled.
Parameters:
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
agent_session_url |
string |
yes | — | Your Devin session URL. Use the session URL from your system prompt. Required together with cancel_guids. |
cancel_guids |
array<string> |
yes | — | List of reminder GUIDs to cancel. You can get GUIDs from the reminder creation response or from the reminders list. |
Show input JSON schema
{
"additionalProperties": false,
"properties": {
"agent_session_url": {
"description": "Your Devin session URL. Use the session URL from your system prompt. Required together with cancel_guids.",
"type": "string"
},
"cancel_guids": {
"description": "List of reminder GUIDs to cancel. You can get GUIDs from the reminder creation response or from the reminders list.",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"agent_session_url",
"cancel_guids"
],
"type": "object"
}
Show output JSON schema
{
"description": "Response from the cancel_devin_reminder tool.",
"properties": {
"success": {
"description": "Whether the cancel workflow was triggered successfully",
"type": "boolean"
},
"message": {
"description": "Human-readable status message",
"type": "string"
},
"workflow_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "URL to view the GitHub Actions workflow file"
},
"run_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "GitHub Actions workflow run ID"
},
"run_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Direct URL to the GitHub Actions workflow run"
}
},
"required": [
"success",
"message"
],
"type": "object"
}
set_devin_reminder
Hints: open-world
Schedule a reminder that fires at a specified time or after a delay.
Creates a reminder that will be delivered back to your Devin session and posted to the #devin-reminders Slack channel when the time arrives. Reminders are checked every 30 minutes via a cron schedule.
Exactly one of delay_minutes or remind_at_local_time must be provided.
Prefer remind_at_local_time (Pacific local time) over delay_minutes
to avoid timezone-conversion mistakes — unless the user explicitly
asks for a reminder in N minutes.
The reminder is stored as a GitHub Actions artifact and processed by the devin-reminders-action. When the reminder is due, it injects a message into the originating Devin session and sends a Slack notification.
Use this tool when you need to schedule a follow-up action, check on a long-running process, or remind yourself about a task.
Parameters:
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
reminder_message |
string |
yes | — | The reminder message to deliver. Should clearly describe what you need to be reminded about. |
agent_session_url |
string |
yes | — | Your Devin session URL so the reminder can be injected back into your session. Use the session URL from your system prompt. |
delay_minutes |
integer | null |
no | null |
Number of minutes until the reminder fires. Must be a positive multiple of 30, up to 10080 (7 days). Examples: 30, 60, 120, 1440. Mutually exclusive with remind_at_local_time. |
remind_at_local_time |
string | null |
no | null |
Date-time in local time when the reminder should fire. At Airbyte, local time is always Pacific (America/Los_Angeles). Accepts '2026-04-02 09:00' (24-hour), '2026-04-02 9:00 AM' (12-hour), or ISO-like 'YYYY-MM-DDTHH:MM'. Must be in the future and within 7 days. Mutually exclusive with delay_minutes. PREFERRED — use this instead of delay_minutes to avoid timezone-conversion errors. |
slack_users_cc |
string | null |
no | null |
Optional comma-delimited list of Slack user tags to CC on the reminder notification. Example: '<@U12345>, <@U67890>'. |
Show input JSON schema
{
"additionalProperties": false,
"properties": {
"reminder_message": {
"description": "The reminder message to deliver. Should clearly describe what you need to be reminded about.",
"type": "string"
},
"agent_session_url": {
"description": "Your Devin session URL so the reminder can be injected back into your session. Use the session URL from your system prompt.",
"type": "string"
},
"delay_minutes": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Number of minutes until the reminder fires. Must be a positive multiple of 30, up to 10080 (7 days). Examples: 30, 60, 120, 1440. Mutually exclusive with remind_at_local_time."
},
"remind_at_local_time": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Date-time in local time when the reminder should fire. At Airbyte, local time is always Pacific (America/Los_Angeles). Accepts '2026-04-02 09:00' (24-hour), '2026-04-02 9:00 AM' (12-hour), or ISO-like 'YYYY-MM-DDTHH:MM'. Must be in the future and within 7 days. Mutually exclusive with delay_minutes. PREFERRED \u2014 use this instead of delay_minutes to avoid timezone-conversion errors."
},
"slack_users_cc": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional comma-delimited list of Slack user tags to CC on the reminder notification. Example: '<@U12345>, <@U67890>'."
}
},
"required": [
"reminder_message",
"agent_session_url"
],
"type": "object"
}
Show output JSON schema
{
"description": "Response from the set_devin_reminder tool.",
"properties": {
"success": {
"description": "Whether the workflow was triggered successfully",
"type": "boolean"
},
"message": {
"description": "Human-readable status message",
"type": "string"
},
"workflow_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "URL to view the GitHub Actions workflow file"
},
"run_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "GitHub Actions workflow run ID"
},
"run_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Direct URL to the GitHub Actions workflow run"
}
},
"required": [
"success",
"message"
],
"type": "object"
}
1# Copyright (c) 2025 Airbyte, Inc., all rights reserved. 2"""MCP tools for scheduling and cancelling Devin agent reminders. 3 4This module exposes reminder scheduling and cancellation as MCP tools for AI agents. 5It is a thin wrapper around the core dispatch functions in the devin_reminders module. 6 7## MCP reference 8 9.. include:: ../../../docs/mcp-generated/devin_reminders.md 10 :start-line: 2 11""" 12 13from __future__ import annotations 14 15__all__: list[str] = [] 16 17from typing import Annotated 18 19from fastmcp import FastMCP 20from fastmcp_extensions import mcp_tool, register_mcp_tools 21from pydantic import BaseModel, Field 22 23from airbyte_ops_mcp.devin_reminders import dispatch_cancel_reminder, dispatch_reminder 24 25 26class SetDevinReminderResponse(BaseModel): 27 """Response from the set_devin_reminder tool.""" 28 29 success: bool = Field(description="Whether the workflow was triggered successfully") 30 message: str = Field(description="Human-readable status message") 31 workflow_url: str | None = Field( 32 default=None, 33 description="URL to view the GitHub Actions workflow file", 34 ) 35 run_id: int | None = Field( 36 default=None, 37 description="GitHub Actions workflow run ID", 38 ) 39 run_url: str | None = Field( 40 default=None, 41 description="Direct URL to the GitHub Actions workflow run", 42 ) 43 44 45@mcp_tool( 46 read_only=False, 47 idempotent=False, 48 open_world=True, 49) 50def set_devin_reminder( 51 reminder_message: Annotated[ 52 str, 53 "The reminder message to deliver. Should clearly describe what " 54 "you need to be reminded about.", 55 ], 56 agent_session_url: Annotated[ 57 str, 58 "Your Devin session URL so the reminder can be injected back into " 59 "your session. Use the session URL from your system prompt.", 60 ], 61 delay_minutes: Annotated[ 62 int | None, 63 "Number of minutes until the reminder fires. Must be a positive " 64 "multiple of 30, up to 10080 (7 days). Examples: 30, 60, 120, 1440. " 65 "Mutually exclusive with remind_at_local_time.", 66 ] = None, 67 remind_at_local_time: Annotated[ 68 str | None, 69 "Date-time in local time when the reminder should fire. " 70 "At Airbyte, local time is always Pacific (America/Los_Angeles). " 71 "Accepts '2026-04-02 09:00' (24-hour), " 72 "'2026-04-02 9:00 AM' (12-hour), or ISO-like 'YYYY-MM-DDTHH:MM'. " 73 "Must be in the future and within 7 days. " 74 "Mutually exclusive with delay_minutes. " 75 "PREFERRED — use this instead of delay_minutes to avoid " 76 "timezone-conversion errors.", 77 ] = None, 78 slack_users_cc: Annotated[ 79 str | None, 80 "Optional comma-delimited list of Slack user tags to CC on the " 81 "reminder notification. Example: '<@U12345>, <@U67890>'.", 82 ] = None, 83) -> SetDevinReminderResponse: 84 """Schedule a reminder that fires at a specified time or after a delay. 85 86 Creates a reminder that will be delivered back to your Devin session 87 and posted to the #devin-reminders Slack channel when the time arrives. 88 Reminders are checked every 30 minutes via a cron schedule. 89 90 Exactly one of `delay_minutes` or `remind_at_local_time` must be provided. 91 Prefer `remind_at_local_time` (Pacific local time) over `delay_minutes` 92 to avoid timezone-conversion mistakes — unless the user explicitly 93 asks for a reminder in N minutes. 94 95 The reminder is stored as a GitHub Actions artifact and processed by 96 the devin-reminders-action. When the reminder is due, it injects a 97 message into the originating Devin session and sends a Slack notification. 98 99 Use this tool when you need to schedule a follow-up action, check on 100 a long-running process, or remind yourself about a task. 101 """ 102 try: 103 result = dispatch_reminder( 104 delay_minutes=delay_minutes, 105 remind_at_local_time=remind_at_local_time, 106 reminder_message=reminder_message, 107 agent_session_url=agent_session_url, 108 slack_users_cc=slack_users_cc, 109 ) 110 except ValueError as e: 111 return SetDevinReminderResponse( 112 success=False, 113 message=f"Invalid input: {e}", 114 ) 115 116 if remind_at_local_time: 117 time_desc = f"at {remind_at_local_time} Pacific" 118 else: 119 time_desc = f"in {delay_minutes} minutes" 120 121 view_url = result.run_url or result.workflow_url 122 return SetDevinReminderResponse( 123 success=True, 124 message=( 125 f"Reminder scheduled to fire {time_desc}. " 126 f"View progress at: {view_url}\n\n" 127 f"To cancel pending reminders for this session, use the " 128 f"`cancel_devin_reminder` tool." 129 ), 130 workflow_url=result.workflow_url, 131 run_id=result.run_id, 132 run_url=result.run_url, 133 ) 134 135 136class CancelDevinReminderResponse(BaseModel): 137 """Response from the cancel_devin_reminder tool.""" 138 139 success: bool = Field( 140 description="Whether the cancel workflow was triggered successfully" 141 ) 142 message: str = Field(description="Human-readable status message") 143 workflow_url: str | None = Field( 144 default=None, 145 description="URL to view the GitHub Actions workflow file", 146 ) 147 run_id: int | None = Field( 148 default=None, 149 description="GitHub Actions workflow run ID", 150 ) 151 run_url: str | None = Field( 152 default=None, 153 description="Direct URL to the GitHub Actions workflow run", 154 ) 155 156 157@mcp_tool( 158 read_only=False, 159 idempotent=False, 160 open_world=True, 161) 162def cancel_devin_reminder( 163 agent_session_url: Annotated[ 164 str, 165 "Your Devin session URL. Use the session URL from your system prompt. " 166 "Required together with cancel_guids.", 167 ], 168 cancel_guids: Annotated[ 169 list[str], 170 "List of reminder GUIDs to cancel. You can get GUIDs from " 171 "the reminder creation response or from the reminders list.", 172 ], 173) -> CancelDevinReminderResponse: 174 """Cancel pending Devin reminders by session URL and specific GUIDs. 175 176 Removes matching reminders so they will not fire. Use this when instructed 177 to stop reminders, or when a reminder is no longer needed. 178 179 Both agent_session_url and cancel_guids are required. Only reminders 180 matching the session URL AND present in the GUID list are cancelled. 181 """ 182 try: 183 result = dispatch_cancel_reminder( 184 agent_session_url=agent_session_url, 185 cancel_guids=cancel_guids, 186 ) 187 except ValueError as e: 188 return CancelDevinReminderResponse( 189 success=False, 190 message=f"Invalid input: {e}", 191 ) 192 193 view_url = result.run_url or result.workflow_url 194 guid_list = ", ".join(cancel_guids) 195 return CancelDevinReminderResponse( 196 success=True, 197 message=( 198 f"Cancel workflow triggered for GUIDs [{guid_list}] " 199 f"in session {agent_session_url}. View progress at: {view_url}" 200 ), 201 workflow_url=result.workflow_url, 202 run_id=result.run_id, 203 run_url=result.run_url, 204 ) 205 206 207def register_devin_reminder_tools(app: FastMCP) -> None: 208 """Register Devin reminder tools with the FastMCP app.""" 209 register_mcp_tools(app, mcp_module=__name__)