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

# Document tools

> Tools that read your studio resumes and the tailored resume and cover letter for one application, write them with credits, and edit one part of a ready document.

These tools read your studio resumes and the tailored resume and cover letter for one application, write them with credits, and edit one part of a ready document. They need the permissions `documents:generate`, `documents:read` and `documents:write`, which you grant on the Authorize access page when you connect.

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

## Permissions this page needs

* `documents:generate`: Write resumes, and tailored resumes and cover letters for your applications, which uses credits
* `documents:read`: Read your resumes and the tailored resumes and cover letters for your applications, with their text and download links that work for 15 minutes
* `documents:write`: Edit sections of your resumes and cover letters

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

## `documents.resumes.get`

Your agent host shows this tool as "Get studio resumes".

Read the student's resume studio: the master resume and up to 3 role variants. Each has a ref, label, family, template, status (ready, generating or missing; questions come back from documents.resumes.generate) and stale (made from an older upload). A ready one also carries pdfUrl, a download link that works for 15 minutes (the DOCX link when there is no PDF; mimeType says which). Sections, the text with the sectionKey and entryIndex documents.section.update takes, come back for one ready document: the one ref names (a resume ref from this tool), else the master. Also the suggested families for a new variant and whether a resume is uploaded. Read only: it creates and charges nothing.

Permissions: This tool needs `documents:read`, which the Authorize access page describes as "Read your resumes and the tailored resumes and cover letters for your applications, with their text and download links that work for 15 minutes".

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 | | |
| - | - | - | - | - | - |
| `ref` | string | no | pattern \`^(?:resume:\[a-f0-9]24 | job:\[a-f0-9]24:(?:resume | coverLetter))\$\` |

### Example call

```json documents.resumes.get input theme={"system"}
{}
```

### Result

A result is never larger than 65,536 bytes.

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"}
> [
>   "hasUploadedResume",
>   "master",
>   "maxVariants",
>   "suggestedFamilies",
>   "variants"
> ]
> ```

> **Shape 2**
>
> ```json Top-level fields theme={"system"}
> [
>   "code",
>   "error",
>   "meter",
>   "note",
>   "reason"
> ]
> ```

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

## `documents.jobs.get`

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

Read the tailored resume and cover letter for one tracked application (an applicationId from jobs.applications.list): each kind's ref and status (ready, generating or missing), and, when ready, its sections and pdfUrl, a download link that works for 15 minutes (the DOCX link when there is no PDF; mimeType says which). usingOwnUpload means the student sends a file they uploaded, so sections and pdfUrl are null. base names the studio resume a tailored resume starts from. Read only: it creates and charges nothing.

Permissions: This tool needs `documents:read`, which the Authorize access page describes as "Read your resumes and the tailored resumes and cover letters for your applications, with their text and download links that work for 15 minutes".

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 |
| - | - | - | - |
| `internshipId` | string | yes | pattern `^[a-f0-9]{24}$` |

### Example call

```json documents.jobs.get input theme={"system"}
{
  "internshipId": "c0ffeec0ffeec0ffee000004"
}
```

### Result

A result is never larger than 65,536 bytes.

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"}
> [
>   "base",
>   "coverLetter",
>   "internshipId",
>   "note",
>   "resume"
> ]
> ```

> **Shape 2**
>
> ```json Top-level fields theme={"system"}
> [
>   "code",
>   "error",
>   "meter",
>   "note",
>   "reason"
> ]
> ```

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

## `documents.resumes.generate`

Your agent host shows this tool as "Write a studio resume".

What this changes: Write the student's master resume (no family) or a role variant (a family; it needs a ready master, and the student keeps at most 3 variants), which uses 1 credit.

A ready or generating document is returned as it is and charged nothing, unless regenerate is true, which writes a new version for 1 more credit. An out-of-date master (a newer upload) is written again for 1 credit. It waits up to 25 seconds; a resume not written by then comes back as generating, and you read it with documents.resumes.get. Calling again while it is generating charges nothing. needs\_facts lists questions the student must answer in the Coffee Chats app first. On the free plan the master is written once per uploaded resume and once from LinkedIn, and variants need Pro. A refused call returns error and code and charges nothing. A connection made before the resume studio was available must reconnect to grant documents:read, documents:write and documents:generate.

Permissions: This tool needs `documents:generate`, which the Authorize access page describes as "Write resumes, and tailored resumes and cover letters for your applications, which uses credits", and `documents:read`, which the Authorize access page describes as "Read your resumes and the tailored resumes and cover letters for your applications, with their text and download links that work for 15 minutes".

Risk: `consequential`. This tool writes a resume when the agent calls it and uses 1 credit for it. Coffee Chats does not ask you to approve first. The tool is marked as not read only, so your agent host can ask you before it calls it. A ready resume is returned without a new charge unless the agent asks to regenerate it.

### Input

| Property | Type | Required | Bounds |
| - | - | - | - |
| `family` | string | no | one of `ENGINEERING`, `PRODUCT`, `DESIGN`, `DATA`, `FINANCE`, `CONSULTING`, `MARKETING`, `SALES`, `OPERATIONS`, `RESEARCH`, `LEGAL`, `PEOPLE` |
| `regenerate` | boolean | no | none stated |

### Example call

```json documents.resumes.generate input theme={"system"}
{
  "family": "CONSULTING"
}
```

### Result

A result is never larger than 65,536 bytes.

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"}
> [
>   "document",
>   "note"
> ]
> ```

> **Shape 2**
>
> ```json Top-level fields theme={"system"}
> [
>   "code",
>   "error",
>   "meter",
>   "note",
>   "reason"
> ]
> ```

### Errors

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

| Code | What it means |
| - | - |
| `SERVICE_UNAVAILABLE` | Coffee Chats could not do the work just now and wrote nothing. Try again later. |

## `documents.jobs.tailor`

Your agent host shows this tool as "Tailor job documents".

What this changes: Write a tailored resume and cover letter for one tracked application (an applicationId from jobs.applications.list).

Both documents use that application's job credit (1 job credit = 1 job application), and regenerating them is included. Ready documents are returned as they are, unless regenerate is true, which writes them again. A kind the student sends their own upload for (usingOwnUpload) is never written, even with regenerate. It waits up to 25 seconds; a document not written by then comes back as generating, and you read it with documents.jobs.get. needs\_facts lists questions the student must answer in the Coffee Chats app first. A kind refused with meter job\_credits carries the reason to tell the student. It never changes the application itself. A connection made before the resume studio was available must reconnect to grant documents:read, documents:write and documents:generate.

Permissions: This tool needs `documents:generate`, which the Authorize access page describes as "Write resumes, and tailored resumes and cover letters for your applications, which uses credits", and `documents:read`, which the Authorize access page describes as "Read your resumes and the tailored resumes and cover letters for your applications, with their text and download links that work for 15 minutes".

Risk: `consequential`. This tool writes a tailored resume and cover letter when the agent calls it and uses that application's job credit, which covers both documents and their regenerations. Coffee Chats does not ask you to approve first. The tool is marked as not read only, so your agent host can ask you before it calls it.

### Input

| Property | Type | Required | Bounds |
| - | - | - | - |
| `internshipId` | string | yes | pattern `^[a-f0-9]{24}$` |
| `regenerate` | boolean | no | none stated |

### Example call

```json documents.jobs.tailor input theme={"system"}
{
  "internshipId": "c0ffeec0ffeec0ffee000004"
}
```

### Result

A result is never larger than 65,536 bytes.

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"}
> [
>   "base",
>   "coverLetter",
>   "internshipId",
>   "note",
>   "resume"
> ]
> ```

> **Shape 2**
>
> ```json Top-level fields theme={"system"}
> [
>   "code",
>   "error",
>   "meter",
>   "note",
>   "reason"
> ]
> ```

### Errors

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

| Code | What it means |
| - | - |
| `SERVICE_UNAVAILABLE` | Coffee Chats could not do the work just now and wrote nothing. Try again later. |

## `documents.section.update`

Your agent host shows this tool as "Edit a document section".

What this changes: Edit one part of a ready document, for free.

Resume: the sectionKey and entryIndex from the sections documents.resumes.get or documents.jobs.get returns, and bullets, the full new bullet list for that entry. Cover letter: sectionKey introduction, body, bullets or closing, with paragraphs (bullets for the bullet list). Every claim is checked against the student's resume and profile; a number, name or employer that cannot be matched is left out and listed in leftOut, and nothing is saved when every item is left out. It saves a new version, so the student's earlier version stays one click away in the app. A refused call returns error and code.

Permissions: This tool needs `documents:write`, which the Authorize access page describes as "Edit sections of your resumes and cover letters".

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 | | |
| - | - | - | - | - | - |
| `bullets` | array | no | at most 12 items | | |
| `entryIndex` | integer | no | from 0 to 50 | | |
| `paragraphs` | array | no | at most 8 items | | |
| `ref` | string | yes | pattern \`^(?:resume:\[a-f0-9]24 | job:\[a-f0-9]24:(?:resume | coverLetter))\$\` |
| `sectionKey` | string | yes | 1 to 40 characters | | |

### Example call

```json documents.section.update input theme={"system"}
{
  "bullets": [
    "Built a scheduling tool used by 40 students"
  ],
  "entryIndex": 0,
  "ref": "job:c0ffeec0ffeec0ffee000004:resume",
  "sectionKey": "experience"
}
```

### Result

A result is never larger than 32,768 bytes.

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"}
> [
>   "leftOut",
>   "note",
>   "ref",
>   "saved"
> ]
> ```

> **Shape 2**
>
> ```json Top-level fields theme={"system"}
> [
>   "code",
>   "error",
>   "meter",
>   "note",
>   "reason"
> ]
> ```

### Errors

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

| Code | What it means |
| - | - |
| `SERVICE_UNAVAILABLE` | Coffee Chats could not do the work just now and wrote nothing. Try again later. |


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