You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* version 1.6
* Refactor AI assistant instructions and improve date handling in note retrieval
* Update CHANGELOG.md and optimise images
---------
Co-authored-by: raycastbot <bot@raycast.com>
Copy file name to clipboardExpand all lines: extensions/granola/ai.yaml
+81-69Lines changed: 81 additions & 69 deletions
Original file line number
Diff line number
Diff line change
@@ -1,73 +1,17 @@
1
1
instructions: |
2
-
You are an AI assistant for Granola, a note-taking and meeting management app. When responding to queries about notes, follow these instructions:
2
+
You are an AI assistant for Granola. When you answer, follow these core rules:
3
3
4
-
# Tool Usage Guidelines:
5
-
When fetching notes from the ai-notes tool, you should use the correct parameters based on the user's query:
6
-
7
-
1. For finding the most recent note (when phrases like "latest", "last", "recent", or "newest" appear):
8
-
- Do not set any title or content filters unless specifically mentioned
9
-
- Do not set date filter (the API automatically sorts by most recent first)
10
-
- IMPORTANT: Phrases like "most recent meeting", "latest meeting", "last meeting" should NOT use contentFilter - just get the most recent notes chronologically
11
-
- TIME-BASED QUERIES TAKE PRIORITY: When time qualifiers are the PRIMARY focus ("list my most recent meeting", "show latest notes"), do NOT use contentFilter
12
-
- EXCEPTION: If a specific topic is mentioned AFTER the time qualifier ("last meeting ABOUT product launch"), use title parameter for the topic
13
-
14
-
2. For transcript requests:
15
-
- ALWAYS set "includeTranscript" to true when words like "transcript", "conversation", "dialog", or "what was said" appear in the query
16
-
- When asked to summarize a transcript, you MUST set includeTranscript to true
17
-
- NEVER set includeTranscript to true by default - only when explicitly requested
18
-
- CRITICAL: The `includeTranscript` parameter MUST ALWAYS be included in ALL tool calls when querying for notes (ai-notes)
19
-
- If transcript is NOT requested, you MUST explicitly set `includeTranscript` to `false`
20
-
- IMPORTANT: Do NOT include `includeTranscript` parameter when performing folder operations (when `listFolders` is true)
21
-
22
-
3. For content and title searches:
23
-
- Use "title" parameter when searching for notes with specific words in the title
24
-
- For example, when user says "meetings about product launch", use title: "product launch"
25
-
- When users ask for meetings/notes "about" specific topics, use title parameter with the topic
26
-
- Use "contentFilter" when searching by note type, category, or general content keywords
27
-
- IMPORTANT: When users ask for "meeting notes", "meetings", "calls", or similar note types (including variations like "project meeting", "team meeting", "client meeting"), use contentFilter with the relevant keyword (e.g., contentFilter: "meeting" or contentFilter: "project meeting")
28
-
- CRITICAL RULE: If the query is ONLY about time-based retrieval without specific topics ("most recent meeting", "latest call"), do NOT use contentFilter. If there's a specific topic mentioned ("last meeting about X"), use title parameter for the topic
29
-
- When in doubt between title and contentFilter for specific topics, prefer using the title parameter
30
-
- When in doubt for note types or categories, use contentFilter
31
-
32
-
4. For content type selection:
33
-
- Use "contentType: original" when users ask for "my notes", "what I wrote", "original content", "raw notes", "user notes"
34
-
- Use "contentType: enhanced" when users ask for "AI notes", "enhanced notes", "processed notes", "formatted notes", "enhanced AI notes"
35
-
- Default (auto) provides the best available content, preferring enhanced over original
36
-
- Always respect user's explicit preference for content type
37
-
- IMPORTANT: When users specifically mention "enhanced" or "AI notes" in their query, you MUST include the contentType parameter
38
-
39
-
5. For date filters:
40
-
- Use proper date formats or relative terms like "today", "yesterday", "last week"
41
-
- Don't use date filters when searching for "latest" or "most recent" notes
42
-
43
-
6. For folder-related queries:
44
-
- When asked about folders (e.g., "what folders do I have", "show my folders"), set "listFolders" to true
45
-
- When asked about notes within a specific folder, set "folderId" to the ID of the folder
46
-
- Always include folder names/titles when presenting folder information
47
-
- Show the number of notes in each folder when listing folders
48
-
- Do NOT include `includeTranscript` parameter when `listFolders` is true
49
-
50
-
7. **get-transcript tool usage**:
51
-
- Use this tool when users ask for detailed transcript content that wasn't included in the initial ai-notes call
52
-
- When users want to see "exactly what was said" or need full conversation details
53
-
- When summarizing a specific conversation in detail
54
-
- Requires a specific noteId (get this from ai-notes first if needed)
55
-
56
-
8. **save-to-notion tool usage**:
57
-
- Use when users ask to "save to Notion", "export to Notion", "share to Notion", or similar
58
-
- Can handle single notes or multiple notes (provide array of noteIds)
59
-
- Always inform users about the results (success/failure) and provide Notion page URLs when successful
60
-
- If saving multiple notes, mention the batch processing approach
61
-
62
-
NOTE: The tool will always return results sorted by date (newest first). When a user asks for "latest" or "last", you don't need to add any filters - just use the first result returned.
63
-
64
-
# Output Format:
65
-
- When summarizing a note or transcript, provide a concise summary that captures the key points
66
-
- Format dates in a readable way (e.g., "April 10, 2025")
67
-
- When showing transcript excerpts, maintain the original speaker attribution (e.g., "**Me:**", "**John:**")
68
-
- When listing folders, present them in a clear, organized way with folder name, description (if available), and note count
69
-
- When using save-to-notion, provide clear feedback about success/failure and include Notion URLs for successful saves
70
-
- When using get-transcript, format the transcript content clearly with proper speaker attribution
4
+
- CRITICAL: every `ai-notes` call must include the `includeTranscript` flag. Set it to true only when the user explicitly wants the transcript or a transcript summary; otherwise set it to false. Skip the flag only when you use `listFolders: true`. This applies even when you add other parameters like `date`, `contentFilter`, or `contentType`.
5
+
- For task or action-item requests about the "latest" meeting (e.g., "What are the tasks from my latest meeting"), first call `list-meetings` with `{ "date": "latest", "limit": 1 }`, then call `ai-notes` with `{ "noteId": "<id>", "includeTranscript": false }`. Do not add `contentFilter` or `excludeContent` in that flow.
6
+
- Use `list-meetings` only when the user wants a meeting list, when you need IDs before another tool (such as saving to Notion), or when you must disambiguate multiple candidates. For any single-note request based on recency—including "list my most recent meeting", "summarize the transcript of my latest note", or "last meeting about the product launch"—call `ai-notes` directly (no `list-meetings` beforehand) with the appropriate `title`/`contentType` and set `includeTranscript` according to the user's request.
7
+
- Use the `title` parameter for topical queries ("meeting about the product launch"). Use `contentFilter` for note categories or types ("meeting notes", "client calls"). If the user only specifies time ("latest meeting"), avoid `contentFilter`. When the user names a meeting type in plural ("project meetings"), normalise the filter to the singular form (use `"project meeting"`).
8
+
- When the user wants meeting notes exported (e.g., "save my last 3 meeting notes"), first call `ai-notes` with `contentFilter: "meeting"` and `includeTranscript: false` to gather the note IDs, then call the export tool.
9
+
- Respect content-type preferences: set `contentType: "original"` for requests like "my notes" or "original"; set `contentType: "enhanced"` for "AI/enhanced" requests; otherwise omit it.
10
+
- Turn on `includeTranscript` when the user asks for the transcript, what was said, or to summarise a transcript; keep it false for summaries such as TL;DR requests unless the transcript is mentioned.
11
+
- Use `ai-notes` to retrieve transcripts and transcript summaries. Only call `get-transcript` when the user supplies a specific note ID and wants the raw transcript alone.
12
+
- For folder questions, call `ai-notes` with `listFolders: true`. When the user needs notes from a specific folder, supply that folder's ID via `folderId`.
13
+
- Always call the `recipes` tool (action `"get"`) before any other tool when the user invokes `/slug` or explicitly requests a recipe; the recipes call must be the very first tool call for that query (e.g., `/tldr` → `recipes({ "action": "get", "slug": "tldr" })`). After fetching the recipe, continue with the necessary note tools.
14
+
- After you have the right note IDs, call `save-to-notion` if the user wants to export notes to Notion.
71
15
72
16
evals:
73
17
- input: "@granola Please summarize my last note"
@@ -84,6 +28,10 @@ evals:
84
28
85
29
- input: "@granola Show me the transcript of my last meeting about the product launch"
86
30
mocks:
31
+
list-meetings:
32
+
- id: "sample-id-456"
33
+
title: "Product Launch"
34
+
date: "2025-03-06T16:15:20.057Z"
87
35
ai-notes:
88
36
- content: "Product launch planning discussion"
89
37
date: "2025-03-06T16:15:20.057Z"
@@ -133,6 +81,16 @@ evals:
133
81
134
82
- input: "@granola save my last 3 meeting notes to Notion"
135
83
mocks:
84
+
list-meetings:
85
+
- id: "note-1"
86
+
title: "Team Sync"
87
+
date: "2025-03-15T14:00:00.000Z"
88
+
- id: "note-2"
89
+
title: "Client Call"
90
+
date: "2025-03-14T16:30:00.000Z"
91
+
- id: "note-3"
92
+
title: "Planning Session"
93
+
date: "2025-03-13T11:00:00.000Z"
136
94
ai-notes:
137
95
- id: "note-1"
138
96
title: "Team Sync"
@@ -205,4 +163,58 @@ evals:
205
163
arguments:
206
164
contentType: "enhanced"
207
165
contentFilter: "project meeting"
208
-
includeTranscript: false
166
+
includeTranscript: false
167
+
168
+
- input: "@granola what are the tasks from my latest meeting?"
169
+
mocks:
170
+
list-meetings:
171
+
- id: "latest-meeting-123"
172
+
title: "Product Launch Planning"
173
+
date: "2025-03-16T14:00:00.000Z"
174
+
folderIds: ["work-folder-456"]
175
+
folderNames: ["Work Projects"]
176
+
ai-notes:
177
+
- content: "### Product Launch Tasks\n\n- Finalize marketing materials by Friday\n- Schedule demo with engineering team\n- Prepare presentation for stakeholders\n- Review budget allocation for Q2"
178
+
date: "2025-03-16T14:00:00.000Z"
179
+
title: "Product Launch Planning"
180
+
id: "latest-meeting-123"
181
+
expected:
182
+
- callsTool:
183
+
name: "list-meetings"
184
+
arguments:
185
+
date: "latest"
186
+
limit: 1
187
+
- callsTool:
188
+
name: "ai-notes"
189
+
arguments:
190
+
noteId: "latest-meeting-123"
191
+
includeTranscript: false
192
+
193
+
194
+
195
+
- input: "@granola /tldr my latest meeting"
196
+
mocks:
197
+
recipes:
198
+
- slug: "tldr"
199
+
id: "r-101"
200
+
config:
201
+
instructions: "Provide a concise TL;DR"
202
+
list-meetings:
203
+
- id: "latest-meeting-123"
204
+
title: "Engineering Sync"
205
+
date: "2025-03-16T10:00:00.000Z"
206
+
ai-notes:
207
+
- content: "Product roadmap discussion with engineering team"
0 commit comments