mirror of
https://github.com/simstudioai/sim.git
synced 2026-04-06 03:00:16 -04:00
* feat(box): add Box and Box Sign integrations Add complete Box integration with file management (upload, download, get info, list folders, create/delete folders, copy, search, update metadata) and Box Sign e-signature support (create/get/list/cancel/resend sign requests). Includes OAuth provider setup, internal upload API route following the Dropbox pattern, block configurations, icon, and generated docs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(box): address PR review comments - Fix docsLink for Box Sign: use underscore (box_sign) to match docs URL - Move normalizeFileInput from tool() to params() in Box block config to match Dropbox pattern - Throw error on invalid additionalSigners JSON instead of silently dropping signers Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(box): remove unsupported reason param from cancel sign request The Box Sign cancel endpoint (POST /sign_requests/{id}/cancel) does not accept a request body per the API specification. Remove the misleading reason parameter from the tool, types, block config, and docs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(box): use canonical param ID for file normalization in params() The params function must reference canonical IDs (params.file), not raw subBlock IDs (uploadFile/fileRef) which are deleted after canonical transformation. Matches the Dropbox block pattern. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(box): use generic output descriptions for shared file properties Rename "Uploaded file ID/name" to "File ID/name" in UPLOAD_FILE_OUTPUT_PROPERTIES since the constant is shared by both upload and copy operations. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(box): rename items output to entries for list_folder_items Rename the output field from "items" to "entries" to match Box API naming and avoid collision with JSON schema "items" keyword that prevented the docs generator from rendering the nested array structure. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(box): filter empty file IDs from sourceFileIds input Add .filter(Boolean) after splitting sourceFileIds to prevent empty strings from trailing/double commas being sent as invalid file IDs to the Box Sign API. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor(box): merge Box Sign into single Box block Combine Box and Box Sign into one unified block with all 15 operations accessible via a single dropdown, removing the separate box_sign block. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(box): filter empty strings from tags array in update_file Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(docs): apply lint formatting to icon-mapping and meta.json Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(box): format chained method calls per linter rules Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(box,docusign): set block bgColor to white and regenerate docs Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * style(docs): apply lint formatting Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(box): populate OAuth scopes for Box since token response omits them Box's OAuth2 token endpoint does not return a scope field in the response, so Better Auth stores nothing in the DB. This causes the credential selector to always show "Additional permissions required". Fix by populating the scope from the requested scopes in the account.create.before hook. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(box): add sign_requests.readwrite scope for Box Sign operations Box Sign API requires the sign_requests.readwrite scope in addition to root_readwrite. Without it, sign requests fail with "The request requires higher privileges than provided by the access token." Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * update docs --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
263 lines
9.9 KiB
Plaintext
263 lines
9.9 KiB
Plaintext
---
|
||
title: Grain
|
||
description: Access meeting recordings, transcripts, and AI summaries
|
||
---
|
||
|
||
import { BlockInfoCard } from "@/components/ui/block-info-card"
|
||
|
||
<BlockInfoCard
|
||
type="grain"
|
||
color="#F6FAF9"
|
||
/>
|
||
|
||
{/* MANUAL-CONTENT-START:intro */}
|
||
[Grain](https://grain.com/) is a modern platform for capturing, storing, and sharing meeting recordings, transcripts, highlights, and AI-powered summaries. Grain enables teams to turn conversations into actionable insights and keep everyone aligned on key moments from meetings.
|
||
|
||
With Grain, you can:
|
||
|
||
- **Access searchable recordings and transcripts**: Find and review every meeting by keyword, participant, or topic.
|
||
- **Share highlights and clips**: Capture important moments and share short video/audio highlights across your team or workflows.
|
||
- **Get AI-generated summaries**: Automatically produce meeting summaries, action items, and key insights using Grain’s advanced AI.
|
||
- **Organize meetings by team or type**: Tag and categorize recordings for easy access and reporting.
|
||
|
||
The Sim Grain integration empowers your agents to:
|
||
|
||
- List, search, and retrieve meeting recordings and details by flexible filters (datetime, participant, team, etc).
|
||
- Access AI summaries, participants, highlights, and other metadata for meetings to power automations or analysis.
|
||
- Trigger workflows whenever new meetings are processed, summaries are generated, or highlights are created via Grain webhooks.
|
||
- Easily bridge Grain data into other tools or notify teammates the moment something important happens in a meeting.
|
||
|
||
Whether you want to automate follow-up actions, keep records of important conversations, or surface insights across your organization, Grain and Sim make it easy to connect meeting intelligence to your workflows.
|
||
{/* MANUAL-CONTENT-END */}
|
||
|
||
|
||
## Usage Instructions
|
||
|
||
Integrate Grain into your workflow. Access meeting recordings, transcripts, highlights, and AI-generated summaries. Can also trigger workflows based on Grain webhook events.
|
||
|
||
|
||
|
||
## Tools
|
||
|
||
### `grain_list_recordings`
|
||
|
||
List recordings from Grain with optional filters and pagination
|
||
|
||
#### Input
|
||
|
||
| Parameter | Type | Required | Description |
|
||
| --------- | ---- | -------- | ----------- |
|
||
| `apiKey` | string | Yes | Grain API key \(Personal Access Token\) |
|
||
| `cursor` | string | No | Pagination cursor for next page \(returned from previous response\) |
|
||
| `beforeDatetime` | string | No | Only recordings before this ISO8601 timestamp \(e.g., "2024-01-15T00:00:00Z"\) |
|
||
| `afterDatetime` | string | No | Only recordings after this ISO8601 timestamp \(e.g., "2024-01-01T00:00:00Z"\) |
|
||
| `participantScope` | string | No | Filter: "internal" or "external" |
|
||
| `titleSearch` | string | No | Search term to filter by recording title \(e.g., "weekly standup"\) |
|
||
| `teamId` | string | No | Filter by team UUID \(e.g., "a1b2c3d4-e5f6-7890-abcd-ef1234567890"\) |
|
||
| `meetingTypeId` | string | No | Filter by meeting type UUID \(e.g., "a1b2c3d4-e5f6-7890-abcd-ef1234567890"\) |
|
||
| `includeHighlights` | boolean | No | Include highlights/clips in response |
|
||
| `includeParticipants` | boolean | No | Include participant list in response |
|
||
| `includeAiSummary` | boolean | No | Include AI-generated summary |
|
||
|
||
#### Output
|
||
|
||
| Parameter | Type | Description |
|
||
| --------- | ---- | ----------- |
|
||
| `recordings` | array | Array of recording objects |
|
||
| ↳ `id` | string | Recording UUID |
|
||
| ↳ `title` | string | Recording title |
|
||
| ↳ `start_datetime` | string | ISO8601 start timestamp |
|
||
| ↳ `end_datetime` | string | ISO8601 end timestamp |
|
||
| ↳ `duration_ms` | number | Duration in milliseconds |
|
||
| ↳ `media_type` | string | audio, transcript, or video |
|
||
| ↳ `source` | string | Recording source |
|
||
| ↳ `url` | string | URL to view in Grain |
|
||
| ↳ `thumbnail_url` | string | Thumbnail URL |
|
||
| ↳ `tags` | array | Array of tags |
|
||
| ↳ `teams` | array | Teams the recording belongs to |
|
||
| ↳ `meeting_type` | object | Meeting type info |
|
||
| `cursor` | string | Cursor for next page \(null if no more\) |
|
||
|
||
### `grain_get_recording`
|
||
|
||
Get details of a single recording by ID
|
||
|
||
#### Input
|
||
|
||
| Parameter | Type | Required | Description |
|
||
| --------- | ---- | -------- | ----------- |
|
||
| `apiKey` | string | Yes | Grain API key \(Personal Access Token\) |
|
||
| `recordingId` | string | Yes | The recording UUID \(e.g., "a1b2c3d4-e5f6-7890-abcd-ef1234567890"\) |
|
||
| `includeHighlights` | boolean | No | Include highlights/clips |
|
||
| `includeParticipants` | boolean | No | Include participant list |
|
||
| `includeAiSummary` | boolean | No | Include AI summary |
|
||
| `includeCalendarEvent` | boolean | No | Include calendar event data |
|
||
| `includeHubspot` | boolean | No | Include HubSpot associations |
|
||
|
||
#### Output
|
||
|
||
| Parameter | Type | Description |
|
||
| --------- | ---- | ----------- |
|
||
| `id` | string | Recording UUID |
|
||
| `title` | string | Recording title |
|
||
| `start_datetime` | string | ISO8601 start timestamp |
|
||
| `end_datetime` | string | ISO8601 end timestamp |
|
||
| `duration_ms` | number | Duration in milliseconds |
|
||
| `media_type` | string | audio, transcript, or video |
|
||
| `source` | string | Recording source \(zoom, meet, teams, etc.\) |
|
||
| `url` | string | URL to view in Grain |
|
||
| `thumbnail_url` | string | Thumbnail image URL |
|
||
| `tags` | array | Array of tag strings |
|
||
| `teams` | array | Teams the recording belongs to |
|
||
| `meeting_type` | object | Meeting type info \(id, name, scope\) |
|
||
| `highlights` | array | Highlights \(if included\) |
|
||
| `participants` | array | Participants \(if included\) |
|
||
| `ai_summary` | object | AI summary text \(if included\) |
|
||
| `calendar_event` | object | Calendar event data \(if included\) |
|
||
| `hubspot` | object | HubSpot associations \(if included\) |
|
||
|
||
### `grain_get_transcript`
|
||
|
||
Get the full transcript of a recording
|
||
|
||
#### Input
|
||
|
||
| Parameter | Type | Required | Description |
|
||
| --------- | ---- | -------- | ----------- |
|
||
| `apiKey` | string | Yes | Grain API key \(Personal Access Token\) |
|
||
| `recordingId` | string | Yes | The recording UUID \(e.g., "a1b2c3d4-e5f6-7890-abcd-ef1234567890"\) |
|
||
|
||
#### Output
|
||
|
||
| Parameter | Type | Description |
|
||
| --------- | ---- | ----------- |
|
||
| `transcript` | array | Array of transcript sections |
|
||
| ↳ `participant_id` | string | Participant UUID \(nullable\) |
|
||
| ↳ `speaker` | string | Speaker name |
|
||
| ↳ `start` | number | Start timestamp in ms |
|
||
| ↳ `end` | number | End timestamp in ms |
|
||
| ↳ `text` | string | Transcript text |
|
||
|
||
### `grain_list_views`
|
||
|
||
List available Grain views for webhook subscriptions
|
||
|
||
#### Input
|
||
|
||
| Parameter | Type | Required | Description |
|
||
| --------- | ---- | -------- | ----------- |
|
||
| `apiKey` | string | Yes | Grain API key \(Personal Access Token\) |
|
||
| `typeFilter` | string | No | Optional view type filter: recordings, highlights, or stories |
|
||
|
||
#### Output
|
||
|
||
| Parameter | Type | Description |
|
||
| --------- | ---- | ----------- |
|
||
| `views` | array | Array of Grain views |
|
||
| ↳ `id` | string | View UUID |
|
||
| ↳ `name` | string | View name |
|
||
| ↳ `type` | string | View type: recordings, highlights, or stories |
|
||
|
||
### `grain_list_teams`
|
||
|
||
List all teams in the workspace
|
||
|
||
#### Input
|
||
|
||
| Parameter | Type | Required | Description |
|
||
| --------- | ---- | -------- | ----------- |
|
||
| `apiKey` | string | Yes | Grain API key \(Personal Access Token\) |
|
||
|
||
#### Output
|
||
|
||
| Parameter | Type | Description |
|
||
| --------- | ---- | ----------- |
|
||
| `teams` | array | Array of team objects |
|
||
| ↳ `id` | string | Team UUID |
|
||
| ↳ `name` | string | Team name |
|
||
|
||
### `grain_list_meeting_types`
|
||
|
||
List all meeting types in the workspace
|
||
|
||
#### Input
|
||
|
||
| Parameter | Type | Required | Description |
|
||
| --------- | ---- | -------- | ----------- |
|
||
| `apiKey` | string | Yes | Grain API key \(Personal Access Token\) |
|
||
|
||
#### Output
|
||
|
||
| Parameter | Type | Description |
|
||
| --------- | ---- | ----------- |
|
||
| `meeting_types` | array | Array of meeting type objects |
|
||
| ↳ `id` | string | Meeting type UUID |
|
||
| ↳ `name` | string | Meeting type name |
|
||
| ↳ `scope` | string | internal or external |
|
||
|
||
### `grain_create_hook`
|
||
|
||
Create a webhook to receive recording events
|
||
|
||
#### Input
|
||
|
||
| Parameter | Type | Required | Description |
|
||
| --------- | ---- | -------- | ----------- |
|
||
| `apiKey` | string | Yes | Grain API key \(Personal Access Token\) |
|
||
| `hookUrl` | string | Yes | Webhook endpoint URL \(e.g., "https://example.com/webhooks/grain"\) |
|
||
| `viewId` | string | Yes | Grain view ID from GET /_/public-api/views |
|
||
| `actions` | array | No | Optional list of actions to subscribe to: added, updated, removed |
|
||
| `items` | string | No | No description |
|
||
|
||
#### Output
|
||
|
||
| Parameter | Type | Description |
|
||
| --------- | ---- | ----------- |
|
||
| `id` | string | Hook UUID |
|
||
| `enabled` | boolean | Whether hook is active |
|
||
| `hook_url` | string | The webhook URL |
|
||
| `view_id` | string | Grain view ID for the webhook |
|
||
| `actions` | array | Configured actions for the webhook |
|
||
| `inserted_at` | string | ISO8601 creation timestamp |
|
||
|
||
### `grain_list_hooks`
|
||
|
||
List all webhooks for the account
|
||
|
||
#### Input
|
||
|
||
| Parameter | Type | Required | Description |
|
||
| --------- | ---- | -------- | ----------- |
|
||
| `apiKey` | string | Yes | Grain API key \(Personal Access Token\) |
|
||
|
||
#### Output
|
||
|
||
| Parameter | Type | Description |
|
||
| --------- | ---- | ----------- |
|
||
| `hooks` | array | Array of hook objects |
|
||
| ↳ `id` | string | Hook UUID |
|
||
| ↳ `enabled` | boolean | Whether hook is active |
|
||
| ↳ `hook_url` | string | Webhook URL |
|
||
| ↳ `view_id` | string | Grain view ID |
|
||
| ↳ `actions` | array | Configured actions |
|
||
| ↳ `inserted_at` | string | Creation timestamp |
|
||
|
||
### `grain_delete_hook`
|
||
|
||
Delete a webhook by ID
|
||
|
||
#### Input
|
||
|
||
| Parameter | Type | Required | Description |
|
||
| --------- | ---- | -------- | ----------- |
|
||
| `apiKey` | string | Yes | Grain API key \(Personal Access Token\) |
|
||
| `hookId` | string | Yes | The hook UUID to delete \(e.g., "a1b2c3d4-e5f6-7890-abcd-ef1234567890"\) |
|
||
|
||
#### Output
|
||
|
||
| Parameter | Type | Description |
|
||
| --------- | ---- | ----------- |
|
||
| `success` | boolean | True when webhook was successfully deleted |
|
||
|
||
|