> ## Documentation Index
> Fetch the complete documentation index at: https://docs.modulex.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Grain Integration for AI Agents & Workflows

> Access Grain meeting recordings, transcripts, highlights, and AI-generated summaries. List and retrieve recordings with flexible filters, fetch full transcripts, browse teams, meeting types, and views, and manage webhook subscriptions for recording events.

{/* Self-hosted logo — build-time vendored from modulex.json / Iconify (see scripts/lib/logo.js). */}

<img src="https://mintcdn.com/modulexaillc/df8MOr-hXotYLTh5/logos/placeholder.svg?fit=max&auto=format&n=df8MOr-hXotYLTh5&q=85&s=a4046f9cd6d738c81259050e9833913c" alt="Grain logo" width="72" height="72" data-path="logos/placeholder.svg" />

## Overview

Add **Grain** to any ModuleX agent or workflow. Access Grain meeting recordings, transcripts, highlights, and AI-generated summaries through the Grain public REST API (`api.grain.com/_/public-api`). List and retrieve recordings, fetch full transcripts, browse teams, meeting types, and views, and manage webhook subscriptions for recording events.

<Info>
  **Categories**: Productivity & Collaboration · Meeting · Note Taking · **Auth**: API Key · **Actions**: 9
</Info>

## Authentication

### API Key Authentication

Authenticate using your Grain personal access token

<Steps>
  <Step title="Step 1">
    Log in to your Grain account at [https://grain.com](https://grain.com)
  </Step>

  <Step title="Step 2">
    Open Settings and navigate to the API / Integrations section
  </Step>

  <Step title="Step 3">
    Create a Personal Access Token (developer access may require approval)
  </Step>

  <Step title="Step 4">
    Paste the access token below
  </Step>
</Steps>

#### Required Credentials

| Field         | Description                      | Required | Format |
| ------------- | -------------------------------- | -------- | ------ |
| Grain API Key | Your Grain personal access token | Yes      | `-`    |

## Available Actions

<AccordionGroup>
  <Accordion title="list_recordings — List recordings from Grain with optional filters and pagination">
    ### Parameters

    <ResponseField name="cursor" type="string">
      Pagination cursor for next page (returned from previous response)
    </ResponseField>

    <ResponseField name="before_datetime" type="string">
      Only recordings before this ISO8601 timestamp (e.g., "2024-01-15T00:00:00Z")
    </ResponseField>

    <ResponseField name="after_datetime" type="string">
      Only recordings after this ISO8601 timestamp (e.g., "2024-01-01T00:00:00Z")
    </ResponseField>

    <ResponseField name="participant_scope" type="string">
      Filter: "internal" or "external"
    </ResponseField>

    <ResponseField name="title_search" type="string">
      Search term to filter by recording title (e.g., "weekly standup")
    </ResponseField>

    <ResponseField name="team_id" type="string">
      Filter by team UUID
    </ResponseField>

    <ResponseField name="meeting_type_id" type="string">
      Filter by meeting type UUID
    </ResponseField>

    <ResponseField name="include_highlights" type="boolean">
      Include highlights/clips in response (Default: `false`)
    </ResponseField>

    <ResponseField name="include_participants" type="boolean">
      Include participant list in response (Default: `false`)
    </ResponseField>

    <ResponseField name="include_ai_summary" type="boolean">
      Include AI-generated summary (Default: `false`)
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "Recording": {
          "additionalProperties": false,
          "description": "A meeting recording object.\n\nExtra include-blocks (highlights, participants, ai_summary,\ncalendar_event, hubspot, etc.) are returned verbatim as\nJSON-serializable values.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Title"
            },
            "start_datetime": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Start Datetime"
            },
            "end_datetime": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "End Datetime"
            },
            "duration_ms": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Duration Ms"
            },
            "media_type": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Media Type"
            },
            "source": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Source"
            },
            "url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Url"
            },
            "thumbnail_url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Thumbnail Url"
            },
            "tags": {
              "items": {
                "type": "string"
              },
              "title": "Tags",
              "type": "array"
            },
            "teams": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Teams",
              "type": "array"
            },
            "meeting_type": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Meeting Type"
            },
            "highlights": {
              "anyOf": [
                {
                  "items": {
                    "additionalProperties": true,
                    "type": "object"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Highlights"
            },
            "participants": {
              "anyOf": [
                {
                  "items": {
                    "additionalProperties": true,
                    "type": "object"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Participants"
            },
            "ai_summary": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Ai Summary"
            },
            "calendar_event": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Calendar Event"
            },
            "hubspot": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Hubspot"
            },
            "private_notes": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Private Notes"
            },
            "ai_template_sections": {
              "anyOf": [
                {
                  "items": {
                    "additionalProperties": true,
                    "type": "object"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Ai Template Sections"
            }
          },
          "title": "Recording",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "recordings": {
          "items": {
            "$ref": "#/$defs/Recording"
          },
          "title": "Recordings",
          "type": "array"
        },
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Cursor"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListRecordingsOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="get_recording — Get details of a single recording by ID">
    ### Parameters

    <ResponseField name="recording_id" type="string" required>
      The recording UUID
    </ResponseField>

    <ResponseField name="include_highlights" type="boolean">
      Include highlights/clips (Default: `false`)
    </ResponseField>

    <ResponseField name="include_participants" type="boolean">
      Include participant list (Default: `false`)
    </ResponseField>

    <ResponseField name="include_ai_summary" type="boolean">
      Include AI summary (Default: `false`)
    </ResponseField>

    <ResponseField name="include_calendar_event" type="boolean">
      Include calendar event data (Default: `false`)
    </ResponseField>

    <ResponseField name="include_hubspot" type="boolean">
      Include HubSpot associations (Default: `false`)
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "Recording": {
          "additionalProperties": false,
          "description": "A meeting recording object.\n\nExtra include-blocks (highlights, participants, ai_summary,\ncalendar_event, hubspot, etc.) are returned verbatim as\nJSON-serializable values.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "title": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Title"
            },
            "start_datetime": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Start Datetime"
            },
            "end_datetime": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "End Datetime"
            },
            "duration_ms": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Duration Ms"
            },
            "media_type": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Media Type"
            },
            "source": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Source"
            },
            "url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Url"
            },
            "thumbnail_url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Thumbnail Url"
            },
            "tags": {
              "items": {
                "type": "string"
              },
              "title": "Tags",
              "type": "array"
            },
            "teams": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Teams",
              "type": "array"
            },
            "meeting_type": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Meeting Type"
            },
            "highlights": {
              "anyOf": [
                {
                  "items": {
                    "additionalProperties": true,
                    "type": "object"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Highlights"
            },
            "participants": {
              "anyOf": [
                {
                  "items": {
                    "additionalProperties": true,
                    "type": "object"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Participants"
            },
            "ai_summary": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Ai Summary"
            },
            "calendar_event": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Calendar Event"
            },
            "hubspot": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Hubspot"
            },
            "private_notes": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Private Notes"
            },
            "ai_template_sections": {
              "anyOf": [
                {
                  "items": {
                    "additionalProperties": true,
                    "type": "object"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Ai Template Sections"
            }
          },
          "title": "Recording",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "recording": {
          "anyOf": [
            {
              "$ref": "#/$defs/Recording"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "GetRecordingOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="get_transcript — Get the full transcript of a recording">
    ### Parameters

    <ResponseField name="recording_id" type="string" required>
      The recording UUID
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "TranscriptSection": {
          "additionalProperties": false,
          "description": "A single transcript section (speaker turn).",
          "properties": {
            "participant_id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Participant Id"
            },
            "speaker": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Speaker"
            },
            "start": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Start"
            },
            "end": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "End"
            },
            "text": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Text"
            }
          },
          "title": "TranscriptSection",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "transcript": {
          "items": {
            "$ref": "#/$defs/TranscriptSection"
          },
          "title": "Transcript",
          "type": "array"
        }
      },
      "required": [
        "success"
      ],
      "title": "GetTranscriptOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="list_views — List available Grain views for webhook subscriptions">
    ### Parameters

    <ResponseField name="type_filter" type="string">
      Optional view type filter: recordings, highlights, or stories
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "View": {
          "additionalProperties": false,
          "description": "A Grain view object.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Name"
            },
            "type": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Type"
            }
          },
          "title": "View",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "views": {
          "items": {
            "$ref": "#/$defs/View"
          },
          "title": "Views",
          "type": "array"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListViewsOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="list_teams — List all teams in the workspace">
    ### Response

    ```json theme={null}
    {
      "$defs": {
        "Team": {
          "additionalProperties": false,
          "description": "A team object.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Name"
            }
          },
          "title": "Team",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "teams": {
          "items": {
            "$ref": "#/$defs/Team"
          },
          "title": "Teams",
          "type": "array"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListTeamsOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="list_meeting_types — List all meeting types in the workspace">
    ### Response

    ```json theme={null}
    {
      "$defs": {
        "MeetingType": {
          "additionalProperties": false,
          "description": "A meeting type object.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Name"
            },
            "scope": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Scope"
            }
          },
          "title": "MeetingType",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "meeting_types": {
          "items": {
            "$ref": "#/$defs/MeetingType"
          },
          "title": "Meeting Types",
          "type": "array"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListMeetingTypesOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="create_hook — Create a webhook to receive recording events">
    ### Parameters

    <ResponseField name="hook_url" type="string" required>
      Webhook endpoint URL (e.g., "[https://example.com/webhooks/grain](https://example.com/webhooks/grain)")
    </ResponseField>

    <ResponseField name="view_id" type="string" required>
      Grain view ID for the webhook subscription
    </ResponseField>

    <ResponseField name="actions" type="array">
      Optional list of actions to subscribe to: added, updated, removed
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "$defs": {
        "Hook": {
          "additionalProperties": false,
          "description": "A webhook subscription object.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "enabled": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Enabled"
            },
            "version": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Version"
            },
            "hook_url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Hook Url"
            },
            "view_id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "View Id"
            },
            "actions": {
              "items": {
                "type": "string"
              },
              "title": "Actions",
              "type": "array"
            },
            "inserted_at": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Inserted At"
            }
          },
          "title": "Hook",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "hook": {
          "anyOf": [
            {
              "$ref": "#/$defs/Hook"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "success"
      ],
      "title": "CreateHookOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="list_hooks — List all webhooks for the account">
    ### Response

    ```json theme={null}
    {
      "$defs": {
        "Hook": {
          "additionalProperties": false,
          "description": "A webhook subscription object.",
          "properties": {
            "id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Id"
            },
            "enabled": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Enabled"
            },
            "version": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Version"
            },
            "hook_url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Hook Url"
            },
            "view_id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "View Id"
            },
            "actions": {
              "items": {
                "type": "string"
              },
              "title": "Actions",
              "type": "array"
            },
            "inserted_at": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Inserted At"
            }
          },
          "title": "Hook",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        },
        "hooks": {
          "items": {
            "$ref": "#/$defs/Hook"
          },
          "title": "Hooks",
          "type": "array"
        }
      },
      "required": [
        "success"
      ],
      "title": "ListHooksOutput",
      "type": "object"
    }
    ```
  </Accordion>

  <Accordion title="delete_hook — Delete a webhook by ID">
    ### Parameters

    <ResponseField name="hook_id" type="string" required>
      The hook UUID to delete
    </ResponseField>

    ### Response

    ```json theme={null}
    {
      "additionalProperties": false,
      "properties": {
        "success": {
          "title": "Success",
          "type": "boolean"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Error"
        }
      },
      "required": [
        "success"
      ],
      "title": "DeleteHookOutput",
      "type": "object"
    }
    ```
  </Accordion>
</AccordionGroup>

## Limits & Quotas

* The Grain public API requires the `Public-Api-Version` header
  (currently `2025-10-31`) on the recording, transcript, team, and
  meeting-type endpoints.
* Developer access to the public API is in beta and may be limited to
  approved partners.
* **Error model**: non-2xx responses and timeouts are caught and
  returned as `success=False` + `error` rather than raising. Plan for
  retries on the agent side based on the error string.

## Related integrations

<CardGroup cols={3}>
  <Card title="Granola" href="/integrations/tools/granola" />

  <Card title="Obsidian" href="/integrations/tools/obsidian" />

  <Card title="Reflect" href="/integrations/tools/reflect" />
</CardGroup>

## Links

* [Grain](https://grain.com)
