---
canonical_url: "https://docs.composio.dev/toolkits/fellow_ai_mcp"
markdown_url: "https://docs.composio.dev/toolkits/fellow_ai_mcp.md"
product: "platform"
version: null
last_updated: null
---

# Fellow.ai MCP

Fellow.ai MCP lets agents access authorized meeting notes, transcripts, calendar events, channels, action items, and agenda workflows.

- **Category:** model context protocol
- **Auth:** DCR_OAUTH
- **Composio-managed OAuth available?** No
- **Tools:** 19
- **Triggers:** 0
- **Slug:** `FELLOW_AI_MCP`
- **Version:** 20260910_00

## Tools

### Apply agenda template

**Slug:** `FELLOW_AI_MCP_APPLY_AGENDA_TEMPLATE`

Put a saved agenda template's content into one meeting's agenda. This replaces that agenda's current contents and affects only that one note — it does not change the template, and it does not change what future meetings in the series look like (use set_default_agenda_template for that). Identify the agenda by note_id or meeting_id, and the template by template_id from search_agenda_templates.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `note_id` | string | No | ID of the agenda to apply the template to. Provide this or meeting_id. |
| `meeting_id` | string | No | Calendar event guid whose agenda the template should be applied to. |
| `template_id` | integer | Yes | ID of the agenda template to apply. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Create agenda template

**Slug:** `FELLOW_AI_MCP_CREATE_AGENDA_TEMPLATE`

Create a new saved agenda template from Fellow Markdown. Agenda templates are the named templates in the Fellow template library that a user picks from when starting a meeting note; this does not create an AI note/recap template, and it does not change any existing agenda. Creates a personal template unless the user explicitly asks for a workspace-wide one. Read fellow://docs/fellow-markdown-syntax before composing the markdown content.

How to write a good agenda template. A template is the reusable skeleton
of a meeting, not a filled-in agenda. Anything that is only true of one occurrence of the meeting
belongs in that meeting's agenda instead, so keep it out of the template.

 - Sections are headings, and the heading carries the guidance. Give the section a short name (one to
   three words) and put the question it answers on the same heading block after `<br>`, for example
   `# Blockers<br>What is in the way right now?`. Most sections in Fellow's built-in templates carry
   that second line and about half phrase it as a question; it is what tells whoever runs the meeting
   what to put there.
 - Leave the placeholders empty. Under each section put ONE empty talking point (`- ( )`) and nothing
   else, so there is a spot to type into. Do not pre-write talking points about a particular project,
   person, week, or number.
 - Do not write out action items. When a meeting always ends with next steps, the convention is a
   closing `# Action Items` section holding one empty `- [ ]`. The tasks themselves get captured live
   in the agenda while the meeting happens.
 - No assignees, due dates, mentions, or calendar dates anywhere in a template. The same template is
   reused every time the meeting runs, so nothing in it can point at one person or one occurrence.
 - Keep it short. Four to six sections is normal and a finished template runs about a dozen blocks. A
   template that reads like a completed agenda has too much in it.
 - The one exception is a standing question list: questions asked word for word every time the
   template is used, such as an onboarding interview or a recurring checklist. Those can be written
   out as talking points, because the wording does not change between occurrences.

A typical template looks like this in full:

```
# Wins<br>What went well since we last met?

- ( )

# Blockers<br>What is in the way right now?

- ( )

# Action Items<br>What came out of this meeting?

- [ ]
```

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `tags` | string | No | Labels for the template. The tags Meetings, 1-on-1s, Private, Priorities also decide which kinds of note it is offered for; defaults to Meetings when omitted. |
| `title` | string | Yes | Title of the new agenda template. |
| `content` | string | Yes | The template body, as Fellow Markdown. |
| `summary` | string | No | Short description of what the template is for. |
| `visibility` | string | No | USER (default) creates a personal template. Use WORKSPACE only when the user explicitly asks to share it with the whole workspace. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Delete agenda template

**Slug:** `FELLOW_AI_MCP_DELETE_AGENDA_TEMPLATE`

Permanently delete a saved agenda template. This cannot be undone: the template is removed from the library, and every series that used it as their default template is left with none, so new notes there start blank until another template is set. Confirm with the user before calling this, and say how many series will be affected if you know. Agendas the template was already applied to keep their content. Only the template's own owner (or a workspace admin, for a workspace template) can delete it, and Fellow's built-in templates cannot be deleted. Takes a template_id from search_agenda_templates, never a note or meeting: deleting 'the template this meeting uses' would remove a template other series may also point at.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `template_id` | integer | Yes | ID of the agenda template to delete. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Edit agenda

**Slug:** `FELLOW_AI_MCP_EDIT_AGENDA`

Apply one targeted edit to an existing Fellow agenda using its markdown
representation, without rewriting the whole agenda. Modes:
 - append: Add content at the end of the agenda.
 - prepend: Add content at the beginning of the agenda. Append and prepend add whole blocks:
   the content starts its own block, so do not add a leading or trailing newline to separate it
   from the neighbouring block. A leading or trailing blank line renders as an empty paragraph,
   so include one only when you deliberately want an empty paragraph there.
 - replace_lines: Replace lines start_line..end_line (inclusive) from the base_version returned by
   read_agenda with content. Content is split into lines: a final newline ends the last line rather
   than adding a blank one, and empty content ("") means zero lines, deleting the selected lines
   outright. Write only the replacement text with no leading blank lines: a leading blank line
   renders as an empty paragraph in the agenda, so include one only when you deliberately want an
   empty paragraph there. When deleting a block that has a blank line between it and its neighbor,
   include one of those blank lines in the range so the agenda is not left with a doubled blank
   gap, which renders as an empty paragraph.
 - find_replace: Replace the sole occurrence of `find` with content.

Use find_replace when exact unique text anchors the change. Use replace_lines for positional or
structural edits and pass the base_version from read_agenda. Call read_agenda first, then count the
1-indexed lines of the agenda body yourself (read_agenda returns raw markdown without line numbers).
Read fellow://docs/fellow-markdown-syntax before writing new Fellow Markdown content.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `find` | string | No | find_replace only: the existing text to search for (its first occurrence is replaced). |
| `mode` | string ("append" | "prepend" | "replace_lines" | "find_replace") | Yes | The kind of edit to apply: 'append' adds content at the end of the agenda; 'prepend' adds content at the beginning of the agenda; 'replace_lines' replaces lines start_line..end_line (inclusive) from base_version with content; 'find_replace' replaces the sole occurrence of `find` with content. Use it when exact unique text anchors the change; use replace_lines for positional or structural edits. |
| `content` | string | No | Markdown content. The text to add for append/prepend, the replacement for the targeted lines in replace_lines (an empty string deletes those lines), or the replacement for `find` in find_replace. |
| `note_id` | string | No | ID of the agenda to edit. Provide this or meeting_id. |
| `end_line` | string | No | replace_lines only: last line to replace (1-indexed, inclusive). |
| `meeting_id` | string | No | Calendar event guid whose agenda should be edited. Provide this or note_id. |
| `start_line` | string | No | replace_lines only: first line to replace (1-indexed, inclusive), counting from the first line of the agenda body returned by read_agenda. |
| `base_version` | string | No | Version returned by read_agenda. Required for replace_lines; optional for find_replace when the find text came from read_agenda. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Edit agenda template

**Slug:** `FELLOW_AI_MCP_EDIT_AGENDA_TEMPLATE`

Update a saved agenda template. `content` replaces the whole template body, so call get_agenda_template first and send back the full text with your changes applied; title, summary, tags and visibility are changed only when supplied. Editing a template does not change any agenda it was previously applied to. Fellow's built-in (GLOBAL) templates cannot be edited. When you add a section to an existing template, match the shape of the sections already in it rather than imposing a new one. Read fellow://docs/fellow-markdown-syntax before composing the markdown content.

How to write a good agenda template. A template is the reusable skeleton
of a meeting, not a filled-in agenda. Anything that is only true of one occurrence of the meeting
belongs in that meeting's agenda instead, so keep it out of the template.

 - Sections are headings, and the heading carries the guidance. Give the section a short name (one to
   three words) and put the question it answers on the same heading block after `<br>`, for example
   `# Blockers<br>What is in the way right now?`. Most sections in Fellow's built-in templates carry
   that second line and about half phrase it as a question; it is what tells whoever runs the meeting
   what to put there.
 - Leave the placeholders empty. Under each section put ONE empty talking point (`- ( )`) and nothing
   else, so there is a spot to type into. Do not pre-write talking points about a particular project,
   person, week, or number.
 - Do not write out action items. When a meeting always ends with next steps, the convention is a
   closing `# Action Items` section holding one empty `- [ ]`. The tasks themselves get captured live
   in the agenda while the meeting happens.
 - No assignees, due dates, mentions, or calendar dates anywhere in a template. The same template is
   reused every time the meeting runs, so nothing in it can point at one person or one occurrence.
 - Keep it short. Four to six sections is normal and a finished template runs about a dozen blocks. A
   template that reads like a completed agenda has too much in it.
 - The one exception is a standing question list: questions asked word for word every time the
   template is used, such as an onboarding interview or a recurring checklist. Those can be written
   out as talking points, because the wording does not change between occurrences.

A typical template looks like this in full:

```
# Wins<br>What went well since we last met?

- ( )

# Blockers<br>What is in the way right now?

- ( )

# Action Items<br>What came out of this meeting?

- [ ]
```

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `tags` | string | No | Replacement tag list. Omit to keep the current tags. The tags Meetings, 1-on-1s, Private, Priorities also decide which kinds of note the template is offered for. |
| `title` | string | No | New title. Omit to keep the current one. |
| `content` | string | No | Replacement body as Fellow Markdown. Replaces the whole body. Omit to leave it untouched. |
| `summary` | string | No | New summary. Omit to keep the current one. |
| `visibility` | string | No | New visibility. Omit to keep the current one; only change it when the user asks. |
| `template_id` | integer | Yes | ID of the agenda template to edit. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Get action items

**Slug:** `FELLOW_AI_MCP_GET_ACTION_ITEMS`

Get action items. By default returns only action items assigned to the requesting user. When meeting_ids are provided, defaults to returning ALL action items from those meetings (not just the ones assigned to the user) — pass only_mine=true to override this. Can also filter by date range, status, topic, or assignee scope. AI-suggested items that nobody has accepted yet are not included here; those are returned by get_meeting_summary as suggested_action_items.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `topic` | string | No | The topic of the action items to get. Optional |
| `note_id` | string | No | The ID of the note to filter action items by. Optional |
| `to_date` | string | No | The end date of the range to get the action items from. Must be a valid ISO 8601 date string. Optional Field, if not provided, it will be ignored. |
| `from_date` | string | No | The start date of the range to get the action items from. Must be a valid ISO 8601 date string. Optional Field, if not provided, it will be ignored. |
| `only_mine` | string | No | Controls whose action items are returned. When true, returns only action items assigned to the requesting user. When false (and meeting_ids are provided), returns all action items from those meetings regardless of who they are assigned to. Defaults to false when meeting_ids are provided, true otherwise. Explicitly set to true to get only your own items even when filtering by meeting. Optional. |
| `is_overdue` | string | No | Set this value to true if user wants only overdue action items. Optional |
| `meeting_ids` | string | No | List of meeting IDs to filter action items by. Must be provided as an array/list, for example: ['meeting_id_1', 'meeting_id_2']. When provided, only_mine defaults to false so ALL action items from those meetings are returned, not just the ones assigned to the requesting user. Optional. |
| `notestream_id` | string | No | The ID of the notestream to filter action items by. Optional |
| `only_ongoing_action_items` | string | No | Set this value to true, if user only wants to get ongoing action items. Optional |
| `check_for_team_action_items` | string | No | Set this value to true if user wants to check for action items assigned to the user's team. Only works if user is a manager. Optional |
| `only_completed_action_items` | string | No | Set this value to true if user wants only completed/done action items. Optional |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Get agenda template

**Slug:** `FELLOW_AI_MCP_GET_AGENDA_TEMPLATE`

Read one saved agenda template: its title, visibility, tags, summary, and its body as Fellow Markdown. Agenda templates are the named, reusable templates in the Fellow template library, not AI note/recap templates. Address the template by template_id (from search_agenda_templates) or, to read the template a series starts each of its notes from, by note_id, meeting_id, or stream_id. That template is an ordinary saved template the series points at, and other series may point at the same one. For syntax details about the returned markdown, read fellow://docs/fellow-markdown-syntax.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `note_id` | string | No | ID of a note in the series whose template to read. Use instead of template_id. |
| `stream_id` | string | No | ID of the series (channel/stream) whose template to read. |
| `meeting_id` | string | No | Calendar event guid of a meeting in the series whose template to read. |
| `template_id` | string | No | ID of the agenda template to read, from search_agenda_templates. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Get channel details

**Slug:** `FELLOW_AI_MCP_GET_CHANNEL_DETAILS`

Get detailed information about a specific channel.

Returns channel information including:
- Channel name, description, and type (public/private)
- Member list (up to 20 members)
- Member count
- Creator information
- Latest post/activity

Use list_channels first to find the channel_id if you don't know it.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `channel_id` | integer | Yes | The ID of the channel to get details for. Use list_channels to find channel IDs. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Get meeting participants

**Slug:** `FELLOW_AI_MCP_GET_MEETING_PARTICIPANTS`

Get all participants of a specific meeting, including both calendar event attendees and note users.

This will help identify who is both an attendee and a note user, as well as who is only one or the other. No other tool will return the participants or attendees of a meeting.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `note_id` | string | No | The ID of the note to get the participants for. Optional |
| `meeting_id` | string | No | The ID of the meeting to get the participants for. Optional |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Get meeting summary

**Slug:** `FELLOW_AI_MCP_GET_MEETING_SUMMARY`

Get summaries of specific meetings.

Use this when summaries including key points, action items, decisions, etc. of specific meetings are needed to answer the user's query.

Action items come back as suggested_action_items: the AI-detected items for that meeting, matching what the meeting's recap page shows. Each one carries an "accepted" flag. Accepted items have been confirmed by a user and are real action items; unaccepted ones are still AI suggestions. Use get_action_items instead when you need a user's action items across meetings, due dates, or per-assignee completion status.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `note_id` | string | No | The ID of the note to get the summary for. Optional |
| `meeting_ids` | string | No | List of meeting IDs to get summaries for. Must be provided as an array/list, for example: ['meeting_id_1', 'meeting_id_2']. Optional. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Get meeting transcript

**Slug:** `FELLOW_AI_MCP_GET_MEETING_TRANSCRIPT`

Get the transcript of a specific meeting.

For meetings >= 15 minutes, consider specify start_time and end_time to retrieve only the relevant portion + some padding to be safe. Don't request the entire transcript unless:
- The meeting is sufficiently short, OR
- The user explicitly asks for the full transcript, OR
- You need to search the entire meeting for a specific topic

If specifying start/end times, make sure to grab enough context to answer the user's question in full with no gaps.
MINIMUM TIME RANGE: 300s (5 minutes)
MAXIMUM TIME RANGE: 3600s (60 minutes)

Multi-part meetings: Some meetings have multiple recording parts (e.g., bot rejoined). Each part has its own timestamps starting at 0:00. Use recording_id from get_meeting_summary to target a specific part. Without recording_id, all parts are returned.

Examples:
- User asks "what did John say about the budget?" → Request transcript around the timestamp where budget was likely discussed based on summary/context (e.g. 4 min before, 6 min after).
- User asks "summarize the meeting" → While you _can_ request the full 60-minute transcript at once, it is recommended to request transcript in 15-30 minute chunks, summarize each, and combine.

Parameters:
- meeting_id or note_id: Identifies the meeting
- recording_id: Target a specific recording part (optional, use for multi-part meetings)
- start_time: Start time in seconds from beginning of recording (optional but recommended)
- end_time: End time in seconds from beginning of recording (optional but recommended)

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `note_id` | string | No | The ID of the note to get the transcript for. Optional |
| `end_time` | string | No | End time from beginning of recording (seconds, MM:SS, or HH:MM:SS format). If specified, minimum time range of 300s (5 minutes) is required. |
| `meeting_id` | string | No | The ID of the meeting to get the transcript for. Optional |
| `start_time` | string | No | Start time from beginning of recording (seconds, MM:SS, or HH:MM:SS format). If specified, minimum time range of 300s (5 minutes) is required. |
| `recording_id` | string | No | The ID of a specific recording/part to get. Optional. Use this for multi-part meetings when you need a specific part's transcript. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### List channels

**Slug:** `FELLOW_AI_MCP_LIST_CHANNELS`

List available channels in the workspace.

Use this tool to discover channels that can be used with the search_meetings tool's channel_id parameter.
You can filter channels by name (partial match) or type (public/private).

When you need to filter meeting searches by a specific channel, use this tool to find the channel_id,
which can then be passed to search_meetings.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `name` | string | No | Optional filter: channel name (case-insensitive partial match) |
| `type` | string | No | Optional filter: channel type (public or private) |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Read agenda

**Slug:** `FELLOW_AI_MCP_READ_AGENDA`

Read an agenda as Fellow Markdown, with its base version. For syntax details about the returned markdown, read fellow://docs/fellow-markdown-syntax.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `note_id` | string | No | ID of the agenda to read. Provide this or meeting_id. |
| `meeting_id` | string | No | Calendar event guid whose agenda should be read. Provide this or note_id. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Read resource

**Slug:** `FELLOW_AI_MCP_READ_RESOURCE`

Fetch the contents of a Fellow MCP resource by its fellow:// URI. Other Fellow tool descriptions may reference resources by URI. If you have a built-in tool or mechanism for reading MCP resources, use that instead of this tool. Only use this tool if you have no other way to fetch an MCP resource.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `uri` | string | Yes | URI of the Fellow resource to read. Must start with fellow://. |

### Rename agenda

**Slug:** `FELLOW_AI_MCP_RENAME_AGENDA`

Rename a Fellow agenda by setting a new title. This only changes the title; it does not modify the agenda body. Identify the agenda by note_id or by meeting_id (its calendar event).

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `title` | string | Yes | The new title for the agenda. |
| `note_id` | string | No | ID of the agenda to rename. Provide this or meeting_id. |
| `meeting_id` | string | No | Calendar event guid whose agenda should be renamed. Provide this or note_id. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Search agenda templates

**Slug:** `FELLOW_AI_MCP_SEARCH_AGENDA_TEMPLATES`

Find saved agenda templates by title. These are the named, reusable templates in the Fellow template library that a user picks from when starting a meeting note, not AI note/recap templates. Matching is a plain case-insensitive title substring, not a semantic search. Covers the caller's own templates, their workspace's, and Fellow's built-ins. Returns id, title, visibility, tags and summary. To read the template a particular series uses, call get_agenda_template with that meeting's note_id / meeting_id instead.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `limit` | integer | No | Maximum number of templates to return (max 50). |
| `query` | string | No | Case-insensitive substring matched against template titles. Omit to list recent templates. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Search meetings

**Slug:** `FELLOW_AI_MCP_SEARCH_MEETINGS`

Search for meetings.

This tool searches across multiple data sources and combines the results:
1. Meeting Transcripts: Searches in the actual meeting recordings and their transcripts
2. Meeting Notes: Searches in the notes associated with meetings
3. Calendar Events: Searches in the calendar event titles and metadata
4. Database Events: Falls back to direct database queries when no specific search terms are provided

For the from_date and to_date fields, unless the query requires specific values, in general you should default to a recent time range of a two month or so. If nothing is found, you can try again with a wider range.

If the search result includes quotes with a start timestamp, whenever possible use that timestamp.

1. Meeting Transcripts:
- title: Used for title matching. Optional.
- transcript: Used for semantic search in transcript content. Optional.
        Meaning that you cannot search for transcripts without a query. For example, you can't  search for quote from a speaker without a query.
- transcript_speaker: Used to filter by speaker. Optional.
- participant_emails: Used to filter by specific participants. Optional.
- participant_email_domains: Used to filter by participant domains. Optional.
- participant_full_names: Used to filter by specific participants. Optional.
- has_external_participants: Used to filter external participants. Optional.
- from_date: Used to filter by start date. Optional.
- to_date: Used to filter by end date. Optional.

2. Past meeting summaries:
- note_summary: Used for semantic search in meeting note summaries. Much more effective         than using 'note' for finding relevant content in past meetings with summaries. Always  use the user's full question/query for best results. Optional.
- participant_emails: Used to filter by specific participants. Optional.
- participant_email_domains: Used to filter by participant domains. Optional.
- participant_full_names: Used to filter by specific participants. Optional.
- has_external_participants: Used to filter external participants. Optional.
- from_date: Used to filter by start date. Optional.
- to_date: Used to filter by end date. Optional.

3. Meeting Notes:
- title + note: Combined for full-text search. Optional.
- participant_emails: Used to filter by specific participants. Optional.
- participant_email_domains: Used to filter by participant domains. Optional.
- participant_full_names: Used to filter by specific participants. Optional.
- has_external_participants: Used to filter external participants. Optional.
- from_date: Used to filter by start date. Optional.
- to_date: Used to filter by end date. Optional.
- has_summary: Used to filter notes that have a summary or not. Optional.
- user_has_calendar_event: Used to filter notes corresponding or not to an event in user's calendar. Optional.

4. Calendar Events:
- title: Used for title matching. Required.
- from_date: Used to filter by start date. Optional.
- to_date: Used to filter by end date. Optional.

5. Database Events:
- Only used when no specific search terms are provided
- Returns events within the date range without additional filtering
- from_date: Used to filter by start date. Required.
- to_date: Used to filter by end date. Required.

If the note_id is provided, the search will be performed on the note with the given ID.
This means that using all other parameters except 'transcript' and 'transcript_speaker' irrelevant. There is no point in filtering by meeting title for example if a note_id is provided.

If the notestream_id or channel_id are provided this limits meetings a subset of all possible meetings the user has access to, but in this case using other parameters does make sense.

The information you require to answer the user's query might be found in any of these sources.
The results from all sources are combined and returned in descending order of relevance.

You should strongly prefer to use the parameters 'note_summary', 'note', and 'transcript' all at once when searching for meetings, as this will give you more comprehensive results. They are used to retrieve data from different sources and combining them will give you a more complete picture of the meetings.
They are NOT used to find meetings that meet all filters at the same time. Only use a single parameter if you have a specific reason to limit your search to one particular data source (e.g., when looking for a specific speaker's comments in transcripts).

If you can't find relevant results after searching in using 'note_summary', 'note', and 'transcript', expand the time range to include more meetings.

As a last resort, if 'has_summary' was set to True and didn't return relevant results, before replying to the user mentioning no results do perform another search with 'has_summary' set to False.

It's very important for you to know that this will not return more than 32 results, even if more than 32 meetings match the query. Meaning that if the user asks for all upcoming meetings and you get 32 results, it doesn't mean that there are only 32 upcoming meetings, there could be more. Be proactive about explaining this to the user if you reach the limit of 32 results.

Each result includes the meeting's ID, ID of the previous meeting in the series if applicable, title, start time, end time, note, meeting link, and summary.
Summaries may include generated action items and these are not the same as real action items that could be retrieved using the get_action_items tool. 

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `note` | string | No | A search query to match against meeting notes content. Used to search in meeting notes content. Optional but recommended. |
| `title` | string | No | A simple keyword based search query to match against meeting titles. Used to search in meeting titles across all sources. Optional. |
| `note_id` | string | No | The ID of the note to filter the meetings by. Optional. |
| `to_date` | string | No | The end date of the range to get meetings from (inclusive). ISO 8601 date string format. Used to filter meetings by end date. If it's obvious that the thing we are looking for is in the past, do set this field to the current date. Optional but its use it's highly recommended. |
| `from_date` | string | No | The start date of the range to get meetings from (inclusive). ISO 8601 date string format. Used to filter meetings by start date. Optional but its use it's highly recommended. |
| `channel_id` | string | No | The ID of the channel to filter the meetings by. This is used to limit the search to a subset of all possible meetings the user has access to. Optional. |
| `transcript` | string | No | A search query to match against meeting transcripts. Used to perform semantic search in meeting transcripts quotes. This does not include the speaker. Optional. |
| `has_summary` | string | No | Whether to filter meetings that have a summary or not. If you are trying to answer a question that depends on meeting content, most of the time you will want to use this since most meetings without summary are not useful. If you don't get the results you expect, you can try again without this parameter but using 'note'. Optional. |
| `note_summary` | string | No | A semantic search query to search within meeting note summaries. This should be used specifically for searching past meetings with generated summaries. For best results, include the core of the user's question or prompt here rather than just keywords, as the semantic search works better with full context. If the question include things covered by other parameter like attendees, meeting title, etc, rephrase the question to NOT include those. Ideally this should be used in conjunction with the keyword based search of 'note' since some notes may have the relevant information but have no summaries. If no results are found with 'note_summary' or 'has_external_participants', use 'note'. Optional but recommended. |
| `notestream_id` | string | No | The ID of the note stream to filter the meetings by. Optional. |
| `participant_emails` | string | No | List of email addresses to filter meetings by participants (AND match). Must be provided as an array/list, for example: ['user1@company.com', 'user2@company.com']. Optional. |
| `transcript_speaker` | string | No | The speaker to filter the transcripts by. It could be someone who is mentioning somebody or something. Use this parameter to filter transcripts by a specific speaker's name. This is particularly useful when searching for statements or mentions made by a particular person. Optional. |
| `participant_full_names` | string | No | List of full names to filter meetings by participants (AND match). Must be provided as an array/list, for example: ['John Smith', 'Jane Doe']. Optional. |
| `user_has_calendar_event` | string | No | IMPORTANT: Set this to True when the user asks about their OWN meetings. This includes phrases like: 'my meetings', 'meetings I had', 'meetings I attended', 'meetings on my calendar', 'my calls', 'meetings I was in', or any query that implies the user wants meetings they personally participated in (not just meetings they have access to). When True, results are filtered to only include meetings where the user was an invited attendee. |
| `has_external_participants` | string | No | Whether to filter meetings that have external participants. Optional. |
| `participant_email_domains` | string | No | List of email domains to filter meetings by participant domains (AND match). Must be provided as an array/list, for example: ['company.com', 'partner.com']. Optional. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Set default agenda template

**Slug:** `FELLOW_AI_MCP_SET_DEFAULT_AGENDA_TEMPLATE`

Make a saved agenda template the default for a whole series, so every future note in that series starts from it. Existing agendas are left untouched. This has a wider blast radius than apply_agenda_template, which sets up one meeting only — prefer that one unless the user asks for the change to apply going forward. Identify the series by note_id, meeting_id, or stream_id.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `note_id` | string | No | ID of a note in the series. Provide this, meeting_id, or stream_id. |
| `stream_id` | string | No | ID of the series (channel/stream) to set the default template on. |
| `meeting_id` | string | No | Calendar event guid of a meeting in the series. |
| `template_id` | integer | Yes | ID of the agenda template to make the series default. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |

### Write agenda

**Slug:** `FELLOW_AI_MCP_WRITE_AGENDA`

Write a Fellow agenda from markdown: overwrite an existing agenda's contents, or create the agenda for a calendar event if it does not exist yet. Preferred note format: when creating a note or writing into an empty agenda, structure it with top-level H1/H2 headings for sections, talking points (`- ( )`) for the discussion points under each section, and nested bullets (`- `) for the supporting detail beneath each talking point. This default applies ONLY to an empty agenda. If the agenda already has material content, do NOT impose it: mirror the note's existing structure, reusing the same heading style (or absence of headings), the same bullet/talking-point markers, and the same section pattern already present. Read fellow://docs/fellow-markdown-syntax before composing the markdown content.

#### Input Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `content` | string | Yes | The full agenda contents to write, as markdown. |
| `note_id` | string | No | ID of the agenda to overwrite. Omit to target an agenda by meeting_id. |
| `meeting_id` | string | No | Calendar event guid whose agenda should be written, created if it does not exist yet. |

#### Output

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `result` | string | Yes |  |
