> ## 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.

# Profile tools

> Tools that read your Coffee Chats profile and update your email-length preference and your job-search stage.

These tools read your Coffee Chats profile and update your email-length preference and your job-search stage. They need the permissions `profile:read` and `profile:write`, which you grant on the Authorize access page when you connect.

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

## Permissions this page needs

* `profile:read`: Read your Coffee Chats profile and preferences
* `profile:write`: Update your profile preferences, and propose booking page changes you approve

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

## `profile.get`

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

Read the authenticated student's bounded basic profile fields, list counts, email-length preference, and completed onboarding state.

Permissions: This tool needs `profile:read`, which the Authorize access page describes as "Read your Coffee Chats profile and preferences".

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

### Input

This tool takes no input.

### Example call

```json profile.get input theme={"system"}
{}
```

### Result

A result is never larger than 16,384 bytes.

A result carries these top-level fields:

```json Top-level fields theme={"system"}
[
  "aboutMe",
  "educationCount",
  "emailLength",
  "headline",
  "jobPreferenceCounts",
  "location",
  "name",
  "onboarding",
  "preferredName"
]
```

### 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.

## `profile.education.list`

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

List the authenticated student's education entries in stable stored order. current is true when the entry is marked current or its graduation year is still ahead.

Permissions: This tool needs `profile:read`, which the Authorize access page describes as "Read your Coffee Chats profile and preferences".

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 256 characters; pattern `^[A-Za-z0-9_-]+$` |

### Example call

```json profile.education.list input theme={"system"}
{}
```

### Result

A result is never larger than 16,384 bytes.

A result carries these top-level fields:

```json Top-level fields theme={"system"}
[
  "education",
  "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.

## `profile.job_preferences.get`

Your agent host shows this tool as "Get job preferences".

Read one authenticated student job-preference list in stable stored order.

Permissions: This tool needs `profile:read`, which the Authorize access page describes as "Read your Coffee Chats profile and preferences".

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 256 characters; pattern `^[A-Za-z0-9_-]+$` |
| `list` | string | yes | one of `locations`, `industries`, `excludedCompanies`, `targetRoles` |

### Example call

```json profile.job_preferences.get input theme={"system"}
{
  "list": "targetRoles"
}
```

### Result

A result is never larger than 16,384 bytes.

A result carries these top-level fields:

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

### 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.

## `profile.job_search_stage.get`

Your agent host shows this tool as "Get job search stage".

Read the authenticated student's stored job-search stage, experience level and recruiting timeline, with null for a value the student has not set.

Permissions: This tool needs `profile:read`, which the Authorize access page describes as "Read your Coffee Chats profile and preferences".

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

### Input

This tool takes no input.

### Example call

```json profile.job_search_stage.get input theme={"system"}
{}
```

### Result

A result is never larger than 4,096 bytes.

A result carries these top-level fields:

```json Top-level fields theme={"system"}
[
  "experienceLevel",
  "onboarding",
  "recruitingTimeline",
  "seekingStage"
]
```

### 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.

## `profile.update`

Your agent host shows this tool as "Update profile preference".

What this changes: Change one profile preference of the authenticated student with durable idempotency: the email length (short or medium), the headline (one line, at most 160 characters; an empty string clears it) or the about-me summary (at most 1000 characters; an empty string clears it).

Send exactly one of emailLength, headline or aboutMe per call.

Permissions: This tool needs `profile:write`, which the Authorize access page describes as "Update your profile preferences, and propose booking page changes you approve".

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

The agent sends one object, and the table below is that object exactly as the connector publishes it. The connector accepts the object in one of these 3 forms and refuses any mixture of them. A published schema cannot state that rule, which is why the Required column reads `no` on every property and why each form is written out under the table. Within a form, every property the form does not name is refused.

| Property | Type | Required | Bounds |
| - | - | - | - |
| `aboutMe` | string | no | at most 1000 characters |
| `emailLength` | string | no | one of `short`, `medium` |
| `headline` | string | no | at most 160 characters |
| `idempotencyKey` | string | no | 16 to 128 characters |

#### Form 1, sending `emailLength`, `idempotencyKey`

Send `emailLength` and `idempotencyKey`. They are required in this form. No other property is accepted with them.

#### Form 2, sending `headline`, `idempotencyKey`

Send `headline` and `idempotencyKey`. They are required in this form. No other property is accepted with them.

#### Form 3, sending `aboutMe`, `idempotencyKey`

Send `aboutMe` and `idempotencyKey`. They are required in this form. No other property is accepted with them.

### Example calls

```json profile.update input form 1 theme={"system"}
{
  "emailLength": "short",
  "idempotencyKey": "example-idempotency-key-0001"
}
```

```json profile.update input form 2 theme={"system"}
{
  "headline": "Economics student at Dartmouth",
  "idempotencyKey": "example-idempotency-key-0015"
}
```

```json profile.update input form 3 theme={"system"}
{
  "aboutMe": "Economics major interested in product roles.",
  "idempotencyKey": "example-idempotency-key-0016"
}
```

### 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. |

## `profile.job_search_stage.update`

Your agent host shows this tool as "Update job search stage".

What this changes: Set the authenticated student's job-search stage, experience level and recruiting timeline together, with durable idempotency.

Permissions: This tool needs `profile:write`, which the Authorize access page describes as "Update your profile preferences, and propose booking page changes you approve".

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 |
| - | - | - | - |
| `experienceLevel` | null or string | yes | one of `college_freshman`, `college_sophomore`, `college_junior`, `college_senior`, `grad_student`, `new_grad`, `early_career`, `mid_career`, `senior` |
| `idempotencyKey` | string | yes | 16 to 128 characters |
| `recruitingTimeline` | null or string | yes | one of `immediate`, `this_term`, `next_term`, `exploring` |
| `seekingStage` | null or string | yes | one of `internship`, `new_grad`, `experienced`, `board_advisory` |

### Example call

```json profile.job_search_stage.update input theme={"system"}
{
  "experienceLevel": "college_junior",
  "idempotencyKey": "example-idempotency-key-0004",
  "recruitingTimeline": "this_term",
  "seekingStage": "internship"
}
```

### 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.