search_meetings
Search meetings using natural language queries on titles, content, or participants. Retrieve meeting transcripts, notes, and summaries with speaker identification to quickly locate relevant discussions.
Instructions
Search meetings by title, content, or participants
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query for meetings | |
| limit | No | Maximum number of results |
Implementation Reference
- granola_mcp_server/server.py:465-510 (handler)The main handler function _search_meetings that executes the search logic: iterates meetings, scores them by matching query against title, participants, and transcript content, then returns formatted results.
async def _search_meetings(self, query: str, limit: int = 10) -> List[TextContent]: """Search meetings by query.""" if not self.cache_data: return [TextContent(type="text", text="No meeting data available")] query_lower = query.lower() results = [] for meeting_id, meeting in self.cache_data.meetings.items(): score = 0 # Search in title if query_lower in meeting.title.lower(): score += 2 # Search in participants for participant in meeting.participants: if query_lower in participant.lower(): score += 1 # Search in transcript content if available if meeting_id in self.cache_data.transcripts: transcript = self.cache_data.transcripts[meeting_id] if query_lower in transcript.content.lower(): score += 1 if score > 0: results.append((score, meeting)) # Sort by relevance and limit results results.sort(key=lambda x: x[0], reverse=True) results = results[:limit] if not results: return [TextContent(type="text", text=f"No meetings found matching '{query}'")] output_lines = [f"Found {len(results)} meeting(s) matching '{query}':\n"] for score, meeting in results: output_lines.append(f"• **{meeting.title}** ({meeting.id})") output_lines.append(f" Date: {self._format_local_time(meeting.date)}") if meeting.participants: output_lines.append(f" Participants: {', '.join(meeting.participants)}") output_lines.append("") return [TextContent(type="text", text="\n".join(output_lines))] - granola_mcp_server/server.py:109-126 (schema)The tool registration with input schema defining parameters: query (required string) and limit (optional integer, default 10).
name="search_meetings", description="Search meetings by title, content, or participants", inputSchema={ "type": "object", "properties": { "query": { "type": "string", "description": "Search query for meetings" }, "limit": { "type": "integer", "description": "Maximum number of results", "default": 10 } }, "required": ["query"] } ), - granola_mcp_server/server.py:199-203 (registration)The call_tool dispatcher that routes 'search_meetings' tool calls to the _search_meetings handler method.
if name == "search_meetings": return await self._search_meetings( query=arguments["query"], limit=arguments.get("limit", 10) )