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

# Meeting tools

> Tools that read your meetings, their notes, outcomes, insights, thank-you drafts and transcripts, and write one meeting's notes and its recorded outcome.

These tools read your meetings, their notes, outcomes, insights, thank-you drafts and transcripts, and write one meeting's notes and its recorded outcome. They need the permissions `mail:read`, `meetings:read`, `meetings:transcript:read` and `meetings:write`, which you grant on the Authorize access page when you connect.

This page is generated from the connector's tool catalogue. It describes 9 tools. Every tool reads or writes only your own account.

## Permissions this page needs

* `mail:read`: Read your outreach templates, thank-you drafts, email delivery jobs, and your outreach settings
* `meetings:read`: Read your meetings and meeting details
* `meetings:transcript:read`: Read meeting transcripts when participant consent allows it
* `meetings:write`: Update your meeting notes and meeting outcome

The [permissions reference](/mcp/scopes.md) lists every permission you can grant.

## `meetings.list`

Your agent host shows this tool as "List meetings".

List the authenticated student's non-practice meeting records with measured pagination.

Permissions: This tool needs `meetings:read`, which the Authorize access page describes as "Read your meetings and meeting details".

Risk: `read`. This tool only reads your own data. It never changes anything and it never asks for your approval.

### Input

| Property | Type | Required | Bounds |
| - | - | - | - |
| `cursor` | string | no | 1 to 512 characters; pattern `^[A-Za-z0-9_-]+$` |
| `limit` | integer | no | from 1 to 20 |
| `status` | string | no | one of `SCHEDULED`, `IN_PROGRESS`, `COMPLETED`, `CANCELED`, `NO_SHOW` |

### Example call

```json meetings.list input theme={"system"}
{
  "limit": 10,
  "status": "COMPLETED"
}
```

### Result

A result is never larger than 16,384 bytes.
If the stored value does not fit, the tool returns a measured fragment and a cursor for the next one.

This tool's result takes one of these 2 forms, and one call returns exactly one of them. The field named beside each form below says which one you are looking at. Open a form to read its top-level fields.

> **Shape 1**
>
> ```json Top-level fields theme={"system"}
> [
>   "meetings",
>   "nextCursor"
> ]
> ```

> **Shape 2**
>
> ```json Top-level fields theme={"system"}
> [
>   "fragment",
>   "meetings",
>   "nextCursor"
> ]
> ```

### Errors

A failed call returns one protocol error with no error code, and its text is `Tool call failed.` every time. This tool looks up no record by id, so it never sends a text that names a record. The [error codes](/mcp/errors.md) page gives every text a read failure can carry.

## `meetings.get`

Your agent host shows this tool as "Get meeting".

Read one authenticated student meeting record without guest credentials or transcript content.

Permissions: This tool needs `meetings:read`, which the Authorize access page describes as "Read your meetings and meeting details".

Risk: `read`. This tool only reads your own data. It never changes anything and it never asks for your approval.

### Input

| Property | Type | Required | Bounds |
| - | - | - | - |
| `cursor` | string | no | 1 to 512 characters; pattern `^[A-Za-z0-9_-]+$` |
| `id` | string | yes | pattern `^[a-f0-9]{24}$` |

### Example call

```json meetings.get input theme={"system"}
{
  "id": "c0ffeec0ffeec0ffee000002"
}
```

### Result

A result is never larger than 16,384 bytes.
If the stored value does not fit, the tool returns a measured fragment and a cursor for the next one.

This tool's result takes one of these 2 forms, and one call returns exactly one of them. The field named beside each form below says which one you are looking at. Open a form to read its top-level fields.

> **Shape 1**
>
> ```json Top-level fields theme={"system"}
> [
>   "meeting"
> ]
> ```

> **Shape 2**
>
> ```json Top-level fields theme={"system"}
> [
>   "fragment",
>   "meeting",
>   "nextCursor"
> ]
> ```

### Errors

A failed call returns one protocol error with no error code. Its text is `Tool call failed.` in every case but one: a call that finds no meeting of yours says so and tells the agent to call the matching list tool. The [error codes](/mcp/errors.md) page quotes that text in full and lists the eight kinds of record it can name.

## `meetings.notes.get`

Your agent host shows this tool as "Get meeting notes".

Read one authenticated student meeting note in measured Unicode-safe fragments.

Permissions: This tool needs `meetings:read`, which the Authorize access page describes as "Read your meetings and meeting details".

Risk: `read`. This tool only reads your own data. It never changes anything and it never asks for your approval.

### Input

| Property | Type | Required | Bounds |
| - | - | - | - |
| `cursor` | string | no | 1 to 512 characters; pattern `^[A-Za-z0-9_-]+$` |
| `id` | string | yes | pattern `^[a-f0-9]{24}$` |

### Example call

```json meetings.notes.get input theme={"system"}
{
  "id": "c0ffeec0ffeec0ffee000002"
}
```

### Result

A result is never larger than 16,384 bytes.
If the stored value does not fit, the tool returns a measured fragment and a cursor for the next one.

A result carries these top-level fields:

```json Top-level fields theme={"system"}
[
  "fragment",
  "nextCursor"
]
```

### Errors

A failed call returns one protocol error with no error code. Its text is `Tool call failed.` in every case but one: a call that finds no meeting of yours says so and tells the agent to call the matching list tool. The [error codes](/mcp/errors.md) page quotes that text in full and lists the eight kinds of record it can name.

## `meetings.outcome.get`

Your agent host shows this tool as "Get meeting outcome".

Read bounded meeting outcome metadata, with explicit measured views for owner-authored notes or takeaways.

Permissions: This tool needs `meetings:read`, which the Authorize access page describes as "Read your meetings and meeting details".

Risk: `read`. This tool only reads your own data. It never changes anything and it never asks for your approval.

### Input

| Property | Type | Required | Bounds |
| - | - | - | - |
| `cursor` | string | no | 1 to 512 characters; pattern `^[A-Za-z0-9_-]+$` |
| `id` | string | yes | pattern `^[a-f0-9]{24}$` |
| `include` | string | no | one of `key_takeaways`, `user_notes` |

### Example call

```json meetings.outcome.get input theme={"system"}
{
  "id": "c0ffeec0ffeec0ffee000002",
  "include": "key_takeaways"
}
```

### Result

A result is never larger than 16,384 bytes.
If the stored value does not fit, the tool returns a measured fragment and a cursor for the next one.

This tool's result takes one of these 2 forms, and one call returns exactly one of them. The field named beside each form below says which one you are looking at. Open a form to read its top-level fields.

> **Shape 1**
>
> ```json Top-level fields theme={"system"}
> [
>   "outcome"
> ]
> ```

> **Shape 2**
>
> ```json Top-level fields theme={"system"}
> [
>   "fragment",
>   "nextCursor",
>   "outcome"
> ]
> ```

### Errors

A failed call returns one protocol error with no error code. Its text is `Tool call failed.` in every case but one: a call that finds no meeting of yours says so and tells the agent to call the matching list tool. The [error codes](/mcp/errors.md) page quotes that text in full and lists the eight kinds of record it can name.

## `meetings.insights.get`

Your agent host shows this tool as "Get meeting insights".

Read bounded safe meeting insights without transcript-derived quotes, rationale, or narrative evidence.

Permissions: This tool needs `meetings:read`, which the Authorize access page describes as "Read your meetings and meeting details".

Risk: `read`. This tool only reads your own data. It never changes anything and it never asks for your approval.

### Input

| Property | Type | Required | Bounds |
| - | - | - | - |
| `cursor` | string | no | 1 to 512 characters; pattern `^[A-Za-z0-9_-]+$` |
| `id` | string | yes | pattern `^[a-f0-9]{24}$` |

### Example call

```json meetings.insights.get input theme={"system"}
{
  "id": "c0ffeec0ffeec0ffee000002"
}
```

### Result

A result is never larger than 16,384 bytes.
If the stored value does not fit, the tool returns a measured fragment and a cursor for the next one.

This tool's result takes one of these 2 forms, and one call returns exactly one of them. The field named beside each form below says which one you are looking at. Open a form to read its top-level fields.

> **Shape 1**
>
> ```json Top-level fields theme={"system"}
> [
>   "insights"
> ]
> ```

> **Shape 2**
>
> ```json Top-level fields theme={"system"}
> [
>   "fragment",
>   "insights",
>   "nextCursor"
> ]
> ```

### Errors

A failed call returns one protocol error with no error code. Its text is `Tool call failed.` in every case but one: a call that finds no meeting of yours says so and tells the agent to call the matching list tool. The [error codes](/mcp/errors.md) page quotes that text in full and lists the eight kinds of record it can name.

## `meetings.thank_you.get`

Your agent host shows this tool as "Get thank-you draft".

Read the authenticated student's thank-you draft without provider identifiers or attachment file ids. The subject and body are templates: double-brace tokens (the contact's name, the sender's LinkedIn or scheduling link, an attachment marker) are filled in only at send, and meeting\_thank\_you\_send shows the final text.

Permissions: This tool needs `mail:read`, which the Authorize access page describes as "Read your outreach templates, thank-you drafts, email delivery jobs, and your outreach settings", and `meetings:read`, which the Authorize access page describes as "Read your meetings and meeting details".

Risk: `read`. This tool only reads your own data. It never changes anything and it never asks for your approval.

### Input

| Property | Type | Required | Bounds |
| - | - | - | - |
| `cursor` | string | no | 1 to 512 characters; pattern `^[A-Za-z0-9_-]+$` |
| `id` | string | yes | pattern `^[a-f0-9]{24}$` |

### Example call

```json meetings.thank_you.get input theme={"system"}
{
  "id": "c0ffeec0ffeec0ffee000002"
}
```

### Result

A result is never larger than 16,384 bytes.
If the stored value does not fit, the tool returns a measured fragment and a cursor for the next one.

This tool's result takes one of these 2 forms, and one call returns exactly one of them. The field named beside each form below says which one you are looking at. Open a form to read its top-level fields.

> **Shape 1**
>
> ```json Top-level fields theme={"system"}
> [
>   "thankYou"
> ]
> ```

> **Shape 2**
>
> ```json Top-level fields theme={"system"}
> [
>   "fragment",
>   "nextCursor",
>   "thankYou"
> ]
> ```

### Errors

A failed call returns one protocol error with no error code. Its text is `Tool call failed.` in every case but one: a call that finds no meeting of yours says so and tells the agent to call the matching list tool. The [error codes](/mcp/errors.md) page quotes that text in full and lists the eight kinds of record it can name.

## `meetings.transcript.list`

Your agent host shows this tool as "Get meeting transcript".

Read a consented, retained meeting transcript without speaker or provider identifiers.

Permissions: This tool needs `meetings:transcript:read`, which the Authorize access page describes as "Read meeting transcripts when participant consent allows it".

Risk: `read`. This tool only reads your own data. It never changes anything and it never asks for your approval.

### Input

| Property | Type | Required | Bounds |
| - | - | - | - |
| `cursor` | string | no | 1 to 512 characters; pattern `^[A-Za-z0-9_-]+$` |
| `id` | string | yes | pattern `^[a-f0-9]{24}$` |

### Example call

```json meetings.transcript.list input theme={"system"}
{
  "id": "c0ffeec0ffeec0ffee000002"
}
```

### Result

A result is never larger than 16,384 bytes.
If the stored value does not fit, the tool returns a measured fragment and a cursor for the next one.

This tool's result takes one of these 2 forms, and one call returns exactly one of them. The field named beside each form below says which one you are looking at. Open a form to read its top-level fields.

> **Shape 1**
>
> ```json Top-level fields theme={"system"}
> [
>   "nextCursor",
>   "segments"
> ]
> ```

> **Shape 2**
>
> ```json Top-level fields theme={"system"}
> [
>   "fragment",
>   "nextCursor",
>   "segments"
> ]
> ```

### Errors

A failed call returns one protocol error with no error code, and this tool sends one of three texts. A call for a meeting your account does not have says so and tells the agent to call the matching list tool.

A meeting whose transcript Coffee Chats does not hold answers with a text of its own:

```text A transcript Coffee Chats does not hold theme={"system"}
No transcript is available for this meeting. A transcript is kept only when the participants consented to recording and it has not been deleted.
```

Every other failure of this tool says `Tool call failed.`. The [error codes](/mcp/errors.md) page quotes all three texts.

## `meetings.notes.update`

Your agent host shows this tool as "Update meeting notes".

What this changes: Replace the private preparation notes on one of the authenticated student's own meetings, with durable idempotency.

This writes the meeting's own notes field and not the note the outcome form captures, at most 10000 characters, and the write fails without changing anything if anybody edited those notes first. A practice session is not writable.

Permissions: This tool needs `meetings:write`, which the Authorize access page describes as "Update your meeting notes and meeting outcome".

Risk: `safe_write`. This tool changes one of your own settings as soon as the agent calls it. It does not ask you to approve first, because the change affects only your own account and you can set it back yourself.

### Input

| Property | Type | Required | Bounds |
| - | - | - | - |
| `idempotencyKey` | string | yes | 16 to 128 characters |
| `meetingId` | string | yes | pattern `^[a-f0-9]{24}$` |
| `notes` | string | yes | at most 10,000 code points |

### Example call

```json meetings.notes.update input theme={"system"}
{
  "idempotencyKey": "example-idempotency-key-0008",
  "meetingId": "c0ffeec0ffeec0ffee000002",
  "notes": "Ask about the summer internship pipeline and how referrals are submitted."
}
```

### Result

A result is never larger than 4,096 bytes.

This tool's result takes one of these 4 forms, and one call returns exactly one of them. The field named beside each form below says which one you are looking at. Open a form to read its top-level fields.

> **Shape 1, where tag is completed**
>
> ```json Top-level fields theme={"system"}
> [
>   "operationId",
>   "operationStatus",
>   "result",
>   "scenario",
>   "tag"
> ]
> ```

> **Shape 2, where tag is accepted**
>
> ```json Top-level fields theme={"system"}
> [
>   "operationId",
>   "operationStatus",
>   "scenario",
>   "tag"
> ]
> ```

> **Shape 3, where status is failed**
>
> ```json Top-level fields theme={"system"}
> [
>   "error",
>   "operationId",
>   "scenario",
>   "status"
> ]
> ```

> **Shape 4, where status is uncertain**
>
> ```json Top-level fields theme={"system"}
> [
>   "error",
>   "operationId",
>   "scenario",
>   "status"
> ]
> ```

### The result may carry a retry hint

A call can be accepted and still ask the agent to come back later. When that happens the result is an accepted result and not a failure, and it carries a hint beside it holding one of these codes and a delay in milliseconds. Nothing has gone wrong and nothing has been written yet.

| Code | What it means |
| - | - |
| `PERMIT_BACKPRESSURE` | Too much work is already running on this connection. The agent should wait for the stated delay and call the tool again. |
| `PERMIT_CONTENTION` | Another call was holding the same slot. The agent should wait for the stated delay and call the tool again. |

### Errors

A call that does not succeed carries one of these codes.

| Code | What it means |
| - | - |
| `ACTION_DENIED` | Coffee Chats would not let this connection make the change, so nothing was written. The connection may have been revoked, or it may no longer hold the permission this tool needs. |
| `ACTION_EXPIRED` | Coffee Chats did not finish the change inside the short window it allows itself, and stopped rather than write late. Nothing was written. Ask the agent to make the change again. |
| `NOT_APPLIED` | Coffee Chats stopped before writing anything. Your data is exactly as it was. |
| `OUTCOME_UNKNOWN` | Coffee Chats cannot prove whether the change was written and will not guess. Open your Coffee Chats page and look before you decide what to do. Do not ask the agent to retry with a new key, because that could apply the change twice. |
| `SERVICE_UNAVAILABLE` | Coffee Chats could not do the work just now and wrote nothing. Try again later. |
| `VERSION_CONFLICT` | Your stored preference changed after the agent read it, so nothing was written. Ask the agent to read it again and make the change from what is there now. |

## `meetings.outcome.update`

Your agent host shows this tool as "Record meeting outcome".

What this changes: Record the outcome of one of the authenticated student's own meetings: the star rating from 0.5 to 5 in steps of 0.5, or null to clear it, the referral outcome, up to 10 key takeaways and the outcome notes, together, with durable idempotency.

It does not mark a thank-you as sent, it does not schedule a follow-up and it does not move the linked contact, all of which the student does in the app. The write fails without changing anything if anybody recorded any part of that outcome first.

Permissions: This tool needs `meetings:write`, which the Authorize access page describes as "Update your meeting notes and meeting outcome".

Risk: `safe_write`. This tool changes one of your own settings as soon as the agent calls it. It does not ask you to approve first, because the change affects only your own account and you can set it back yourself.

### Input

| Property | Type | Required | Bounds |
| - | - | - | - |
| `idempotencyKey` | string | yes | 16 to 128 characters |
| `keyTakeaways` | array | yes | at most 10 items; each item at most 500 code points |
| `meetingId` | string | yes | pattern `^[a-f0-9]{24}$` |
| `outcomeNotes` | string | yes | at most 10,000 code points |
| `rating` | null or number | yes | from 0.5 to 5; in steps of 0.5 |
| `referralOutcome` | null or string | yes | one of `GOT_REFERRAL`, `MAYBE_LATER`, `NO_REFERRAL`, `NOT_DISCUSSED` |

### Example call

```json meetings.outcome.update input theme={"system"}
{
  "idempotencyKey": "example-idempotency-key-0009",
  "keyTakeaways": [
    "They offered to refer me in April."
  ],
  "meetingId": "c0ffeec0ffeec0ffee000002",
  "outcomeNotes": "A warm conversation that ended with a clear next step.",
  "rating": 5,
  "referralOutcome": "GOT_REFERRAL"
}
```

### Result

A result is never larger than 4,096 bytes.

This tool's result takes one of these 4 forms, and one call returns exactly one of them. The field named beside each form below says which one you are looking at. Open a form to read its top-level fields.

> **Shape 1, where tag is completed**
>
> ```json Top-level fields theme={"system"}
> [
>   "operationId",
>   "operationStatus",
>   "result",
>   "scenario",
>   "tag"
> ]
> ```

> **Shape 2, where tag is accepted**
>
> ```json Top-level fields theme={"system"}
> [
>   "operationId",
>   "operationStatus",
>   "scenario",
>   "tag"
> ]
> ```

> **Shape 3, where status is failed**
>
> ```json Top-level fields theme={"system"}
> [
>   "error",
>   "operationId",
>   "scenario",
>   "status"
> ]
> ```

> **Shape 4, where status is uncertain**
>
> ```json Top-level fields theme={"system"}
> [
>   "error",
>   "operationId",
>   "scenario",
>   "status"
> ]
> ```

### The result may carry a retry hint

A call can be accepted and still ask the agent to come back later. When that happens the result is an accepted result and not a failure, and it carries a hint beside it holding one of these codes and a delay in milliseconds. Nothing has gone wrong and nothing has been written yet.

| Code | What it means |
| - | - |
| `PERMIT_BACKPRESSURE` | Too much work is already running on this connection. The agent should wait for the stated delay and call the tool again. |
| `PERMIT_CONTENTION` | Another call was holding the same slot. The agent should wait for the stated delay and call the tool again. |

### Errors

A call that does not succeed carries one of these codes.

| Code | What it means |
| - | - |
| `ACTION_DENIED` | Coffee Chats would not let this connection make the change, so nothing was written. The connection may have been revoked, or it may no longer hold the permission this tool needs. |
| `ACTION_EXPIRED` | Coffee Chats did not finish the change inside the short window it allows itself, and stopped rather than write late. Nothing was written. Ask the agent to make the change again. |
| `NOT_APPLIED` | Coffee Chats stopped before writing anything. Your data is exactly as it was. |
| `OUTCOME_UNKNOWN` | Coffee Chats cannot prove whether the change was written and will not guess. Open your Coffee Chats page and look before you decide what to do. Do not ask the agent to retry with a new key, because that could apply the change twice. |
| `SERVICE_UNAVAILABLE` | Coffee Chats could not do the work just now and wrote nothing. Try again later. |
| `VERSION_CONFLICT` | Your stored preference changed after the agent read it, so nothing was written. Ask the agent to read it again and make the change from what is there now. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.