Compare commits
4 Commits
FEAT-refin
...
FEAT-readm
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
94a0a485d9 | ||
|
|
cebfb0d589 | ||
|
|
c22d616595 | ||
|
|
cfcac8607c |
544
README.md
544
README.md
@@ -1,490 +1,188 @@
|
||||
<p align="center">
|
||||
<img src="assets/logo.png" alt="Declawed" width="120" />
|
||||
<img src="assets/logo.png" alt="deClawed" width="120" />
|
||||
</p>
|
||||
|
||||
# deClawed
|
||||
|
||||
# Declawed: your kuddly assisty-kitty
|
||||
|
||||
|
||||
Inbox brimming with stank? Wanna cut the crap and get the messaging that matters into calendars, Atlassian, Jira, Asana, Google Calendar/Sheets (etc.) ... in two clicks? (Cat) nip slop in the bud with Assisty-Kitty!!
|
||||
|
||||
|
||||
# The "why":
|
||||
|
||||
|
||||
### Eliminates that frustrating feeling you'll never get your paws around the dangling, catnip-stuffed mouse through haunch-high mail from list you're never signed up for or were re-sold to from ones you have, bot-generated marketing slop, and, of course, nigerians princes that need help claim their lottery jackpot.
|
||||
|
||||
|
||||
"deClawed" because: no one should be beholden to one LLM api or local model. Have you seen that baddie Kimi K3?
|
||||
|
||||
|
||||
The platform princes are rent extractors.
|
||||
|
||||
|
||||
Open weights are heavy weight champions.
|
||||
|
||||
|
||||
# The "how"
|
||||
|
||||
|
||||
Because It's soooo easy.
|
||||
deClawed is configurable, prompt purrr-fectable, LLM-driven mail and task automation for anyone that can cut n' paste a few CLI commands and can type in short declarative sentences.
|
||||
More private than other options (not purrfect *yet* - but privacy is our number one goal with every release).
|
||||
More accurate actions/results (read on).
|
||||
|
||||
|
||||
# Privacy: more than the blue-plate crustacean
|
||||
|
||||
|
||||
Your own local Model Context Protocol (MCP) server integrates with your preferred LLM API. Each step in the install, and setup offers greater control, and transparency. Permissions are 100% configurable.
|
||||
|
||||
|
||||
Escape black-box installs stocked with more Trojans than an Olympic Village - silent/dark processes, data harvesting phone-homes, behavioral analytics, telemetry backdoors, corporate surveillance - the nasties lurking in the dark discoverable only by secops edgelords that are masters of the the CLI.
|
||||
|
||||
|
||||
# Simplicity
|
||||
|
||||
|
||||
### NLP prompts are **actually** easy and **demonstrably** more effective
|
||||
|
||||
|
||||
Stop drilling down byzantine menus in mail, scheduling and workflow to configure filters and actions that 1. only ever work 20% of the time 2. change in functionality and scope every two months because a project manager needs to justify their salary.
|
||||
|
||||
|
||||
Write short, declarative prompts instead. It's like wrapping busywork's paws in tinfoil and tossing it in a bathtub.
|
||||
|
||||
|
||||
Prompts
|
||||
|
||||
|
||||
1. Use semantic grouping, organizing by message intent, purpose, and context.
|
||||
2. The prompt templates in Kitty's "built in" library are evaluated using, for example, cosine similarity, ROUGE scoring and real human eval in the SDLC dev loop.
|
||||
3. For example: you'll consistently keep the treasure and trash the junk when you task deClawed with reviewing forums/feeds where actionable insights are gold, but only 10% of the signal.
|
||||
|
||||
|
||||
### Prompting: easily configured to cron: cleaning the litter(in)box before the stank wafts through the whole work house.
|
||||
### Imagine your morning inbox or summaries brimming with a fresh, spring-meadow aroma of opportunity and insight -- not last night's Kitty kibble.
|
||||
|
||||
|
||||
# -- You just might feel like it' s freakin' 1998 again.
|
||||
|
||||
|
||||
# Wiring up your kitty
|
||||
|
||||
|
||||
Assisty-kitty easily interfaces with mail and calendar and other app APIs (about any other service you want to plug in) ... it keeps things moving so you can go chase laser pointers or enjoy a 19-hour nap in a sunbeam.
|
||||
**LLM-powered email triage and workflow automation via the Model Context Protocol**
|
||||
|
||||
deClawed is an MCP server that connects your Gmail inbox to any LLM-capable client (such as Claude Desktop). It classifies incoming emails, automates routine actions (delete, archive, summarize), and integrates with Google Sheets and Calendar to keep your job search—or any high-volume email workflow—organized and actionable.
|
||||
|
||||
---
|
||||
|
||||
## Getting Started
|
||||
|
||||
# Scope and Architecture
|
||||
### Requirements
|
||||
|
||||
| Dependency | Version |
|
||||
|------------|---------|
|
||||
| Node.js | 16+ |
|
||||
| npm | 8+ |
|
||||
| Google Cloud Project | With Gmail API enabled |
|
||||
| MCP Client | Claude Desktop (or any MCP-compatible client) |
|
||||
|
||||
## Current implementation requires building/using:
|
||||
-- Claude Desktop (as UI only - proprietary UI coming soonish)
|
||||
-- Building/Connecting a Model API or Local Model Context Protocol Server
|
||||
-- A DNS-config’d domain, with MX records pointing to:
|
||||
-- A commercial or self-hosted SMTP Server
|
||||
|
||||
|
||||
## Coming soonish:
|
||||
-- Proprietary, custom UI.
|
||||
-- Support for all stripes of models on HugginFFace.
|
||||
- Support for local LLMs.
|
||||
|
||||
|
||||
# Setup
|
||||
|
||||
|
||||
### 1. Install Node.js (v16+ required).
|
||||
|
||||
|
||||
```bash
|
||||
node --version
|
||||
npm --version
|
||||
```
|
||||
|
||||
|
||||
If not installed, grab it from [nodejs.org](https://nodejs.org/).
|
||||
|
||||
|
||||
### 2. Clone and Install
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
git clone https://git.sjdev.online/kjannette/deClawed-Assity-Kitty
|
||||
cd deClawed-Assity-Kitty
|
||||
npm i
|
||||
```
|
||||
### 3. Set Up Google Cloud Credentials
|
||||
|
||||
|
||||
#### 3a. Create a Google Cloud Project
|
||||
|
||||
|
||||
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
|
||||
2. Sign in with the Google account that owns the target Gmail
|
||||
3. Click the project dropdown (top-left) > **New Project**
|
||||
4. Name it (e.g., `assistant-mcp`) and click **Create**
|
||||
5. Select the new project from the dropdown
|
||||
|
||||
|
||||
#### 3b. Enable APIs
|
||||
|
||||
|
||||
In **APIs & Services > Library**, enable:
|
||||
- **Gmail API**
|
||||
- **Google Sheets API** (if mapping mail to sheets)
|
||||
- **Google Calendar API** (if using calendar event creation, etc.s)
|
||||
|
||||
|
||||
#### 3c. Configure the OAuth Consent Screen
|
||||
|
||||
|
||||
1. Go to **Google Auth Platform > Branding** (or **APIs & Services > OAuth consent screen**)
|
||||
2. Set user type to **External**, click **Create**
|
||||
3. Fill in app name, support email, and developer contact email
|
||||
4. Save and continue
|
||||
|
||||
|
||||
#### 3d. Add OAuth Scopes
|
||||
|
||||
|
||||
In **Google Auth Platform > Data Access**, add:
|
||||
- `https://www.googleapis.com/auth/gmail.modify`
|
||||
- `https://www.googleapis.com/auth/spreadsheets` (for Sheets integration)
|
||||
- `https://www.googleapis.com/auth/calendar.events` (for Calendar integration)
|
||||
|
||||
|
||||
#### 3e. Add Yourself as a Test User
|
||||
|
||||
|
||||
Go to **Google Auth Platform > Audience** and add each Gmail address you'll use.
|
||||
|
||||
|
||||
#### 3f. Create OAuth Client Credentials
|
||||
|
||||
|
||||
1. Go to **Google Auth Platform > Clients** (or **APIs & Services > Credentials**)
|
||||
2. Click **Create Client** > Application type: **Desktop app**
|
||||
3. **Download the JSON**, rename it to `credentials.json`
|
||||
4. Place it in the project root
|
||||
|
||||
|
||||
### 4. Configure Accounts
|
||||
|
||||
|
||||
Create file `accounts.json` in the project root. Each key is an account alias with its own token file and optional Sheets/Calendar config:
|
||||
|
||||
|
||||
```json
|
||||
{
|
||||
"work": {
|
||||
"label": "you@yourdomain.com",
|
||||
"tokenFile": "token.json",
|
||||
"spreadsheetId": "YOUR_GOOGLE_SHEET_ID",
|
||||
"calendarId": "primary"
|
||||
},
|
||||
"secondary": {
|
||||
"label": "you@gmail.com",
|
||||
"tokenFile": "token-secondary.json"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
- **`label`** -- display name (typically the email address)
|
||||
- **`tokenFile`** -- per-account OAuth token (auto-generated during auth)
|
||||
- **`spreadsheetId`** -- Google Sheets ID for recruiter contact logging (optional)
|
||||
- **`calendarId`** -- Google Calendar ID for event creation (optional, `"primary"` uses the default calendar)
|
||||
|
||||
|
||||
### 5. Authorize Gmail Accounts
|
||||
|
||||
|
||||
Build and run the auth script for each account:
|
||||
|
||||
|
||||
```bash
|
||||
npm run auth # authorizes the "work" account
|
||||
npm run auth -- secondary # authorizes the "secondary" account
|
||||
```
|
||||
|
||||
|
||||
Each run required steps:
|
||||
|
||||
|
||||
1. Print a URL -- open it in your browser
|
||||
2. Sign in and click **Allow**
|
||||
3. You'll land on a "localhost refused to connect" page (normal)
|
||||
4. Copy the **entire URL** from the address bar and paste it back into the terminal
|
||||
5. The script saves the token file (e.g., `token.json` or `token-secondary.json`)
|
||||
|
||||
|
||||
You only need to do this once per account. Tokens auto-refresh.
|
||||
|
||||
|
||||
### 6. Write the Prompts
|
||||
|
||||
|
||||
Two plain-text prompt files in `src/prompts/` control the workflow:
|
||||
|
||||
|
||||
| File | Phase | Purpose |
|
||||
|------|-------|---------|
|
||||
| `src/prompts/classify-emails.txt` | 1 -- Classification | Defines categories A/B/C/D and how to sort emails |
|
||||
| `src/prompts/take-action-on-emails.txt` | 2 -- Action | Tell the LLM what to do with each category (delete, log, schedule, etc.) |
|
||||
|
||||
|
||||
**Tips:**
|
||||
|
||||
|
||||
- Use clear, explicit category definitions with example language
|
||||
- Handle ambiguous cases (e.g., "If an email both acknowledges receipt AND requests action, classify as B")
|
||||
- Prompt files are loaded at runtime -- edit them anytime, no rebuild required
|
||||
|
||||
|
||||
### 7. Build
|
||||
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Google Cloud Setup
|
||||
|
||||
Compiles `src/**/*.ts` into `build/`.
|
||||
1. Create a project at [Google Cloud Console](https://console.cloud.google.com/)
|
||||
2. Enable the **Gmail API** (and optionally **Sheets API** and **Calendar API**)
|
||||
3. Configure OAuth consent screen (External, add your email as a test user)
|
||||
4. Create OAuth credentials (Desktop app) and download `credentials.json`
|
||||
5. Place `credentials.json` in the `accountsAndCredentials/` directory
|
||||
|
||||
### Account Configuration
|
||||
|
||||
## 8. Configure Claude Desktop
|
||||
|
||||
|
||||
Edit your Claude Desktop config:
|
||||
|
||||
|
||||
```bash
|
||||
code ~/Library/Application\ Support/Claude/claude_desktop_config.json
|
||||
```
|
||||
|
||||
|
||||
Add the server:
|
||||
|
||||
Create `accountsAndCredentials/accounts.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"assistant": {
|
||||
"command": "/ABSOLUTE/PATH/TO/node",
|
||||
"args": [
|
||||
"/ABSOLUTE/PATH/TO/deClawed-Assity-Kitty/build/index.js"
|
||||
]
|
||||
}
|
||||
}
|
||||
"work": {
|
||||
"label": "you@example.com",
|
||||
"tokenFile": "token.json",
|
||||
"spreadsheetId": "YOUR_GOOGLE_SHEET_ID",
|
||||
"calendarId": "primary"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
Replace paths with the output of `which node` and your actual project location.
|
||||
|
||||
|
||||
## 9. Add/Configure API Keys, Credentials, and Other Secrets
|
||||
|
||||
|
||||
Secret files are **gitignored** -- they never leave your machine. Example templates are provided so you know what shape each file needs to be in.
|
||||
|
||||
|
||||
#### 9a. `credentials.json`
|
||||
|
||||
|
||||
This file holds your Google OAuth client credentials. **You do not write this by hand** -- it is downloaded from the Google Cloud Console (see Step 3f above). Copy the example and then replace it with the real download:
|
||||
|
||||
### Authorize Gmail Access
|
||||
|
||||
```bash
|
||||
cp credentials.example.json credentials.json
|
||||
# Now replace credentials.json with the file downloaded from Google Cloud Console.
|
||||
npm run auth # Authorize default account
|
||||
npm run auth -- secondary # Authorize additional accounts
|
||||
```
|
||||
|
||||
Follow the browser prompts to complete OAuth. Tokens are saved locally and auto-refresh.
|
||||
|
||||
The structure looks like this (the example file ships with empty values):
|
||||
### Connect to Claude Desktop
|
||||
|
||||
Add the server to `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"installed": {
|
||||
"client_id": "",
|
||||
"project_id": "",
|
||||
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
||||
"token_uri": "https://oauth2.googleapis.com/token",
|
||||
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
||||
"client_secret": "",
|
||||
"redirect_uris": ["http://localhost"]
|
||||
}
|
||||
"mcpServers": {
|
||||
"assistant": {
|
||||
"command": "/path/to/node",
|
||||
"args": ["/path/to/deClawed-Assity-Kitty/build/index.js"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
#### 9b. `accounts.json`
|
||||
|
||||
|
||||
Defines each Gmail account the server manages. Copy the example and fill in your values:
|
||||
|
||||
|
||||
```bash
|
||||
cp accounts.example.json accounts.json
|
||||
```
|
||||
|
||||
|
||||
| Field | What to put here |
|
||||
|-------|-----------------|
|
||||
| `label` | The email address for this account (display only) |
|
||||
| `tokenFile` | Filename for this account's OAuth token (e.g., `token.json`) |
|
||||
| `spreadsheetId` | The ID from your Google Sheet URL: `docs.google.com/spreadsheets/d/<THIS_PART>/edit` (optional) |
|
||||
| `calendarId` | `"primary"` for your default calendar, or a specific calendar ID (optional) |
|
||||
|
||||
|
||||
Add as many accounts as you need. Each key (e.g., `"work"`, `"secondary"`) becomes the account name used in tool calls and auth commands.
|
||||
|
||||
|
||||
#### 9c. `token*.json` (auto-generated)
|
||||
|
||||
|
||||
Token files are **created automatically** when you run `npm run auth` (Step 5). You do not need to create or edit them manually. A `token.example.json` is provided for reference only -- it shows the structure but the values are populated by the OAuth flow.
|
||||
|
||||
|
||||
#### Summary of secret files
|
||||
|
||||
|
||||
| Example template | Actual file (gitignored) | How to create |
|
||||
|-----------------|--------------------------|---------------|
|
||||
| `credentials.example.json` | `credentials.json` | Download from Google Cloud Console |
|
||||
| `accounts.example.json` | `accounts.json` | Copy example, fill in your email/sheet/calendar IDs |
|
||||
| `token.example.json` | `token.json`, `token-secondary.json`, etc. | Auto-generated by `npm run auth` |
|
||||
|
||||
|
||||
### 10. Restart Claude Desktop
|
||||
|
||||
|
||||
Fully quit (**Cmd+Q**, not just close the window) and reopen. The `assistant` server should appear under **Connectors**.
|
||||
|
||||
Restart Claude Desktop. The server appears under **Connectors**.
|
||||
|
||||
---
|
||||
|
||||
## Usage
|
||||
|
||||
## MCP Tools
|
||||
### Basic Workflow
|
||||
|
||||
In Claude Desktop, invoke the email review workflow:
|
||||
|
||||
```
|
||||
Review my inbox
|
||||
```
|
||||
|
||||
The server fetches unread emails, classifies them using your configured prompts, and executes the appropriate actions.
|
||||
|
||||
### Classification Categories
|
||||
|
||||
| Category | Description | Default Action |
|
||||
|----------|-------------|----------------|
|
||||
| **A** | Acknowledgements, auto-replies | Delete |
|
||||
| **B** | Advancement (interview requests, next steps) | Log + Calendar event |
|
||||
| **C** | Rejections | Delete |
|
||||
| **D** | Other/uncategorized | Log for review |
|
||||
|
||||
### Customizing Prompts
|
||||
|
||||
Edit the plain-text files in `src/prompts/` to adjust classification rules and actions:
|
||||
|
||||
- `classify-emails.txt` — Defines category criteria
|
||||
- `take-action-on-emails.txt` — Specifies actions per category
|
||||
|
||||
Changes take effect immediately without rebuilding.
|
||||
|
||||
---
|
||||
|
||||
## MCP Tools Reference
|
||||
|
||||
| Tool | Description |
|
||||
|------|-------------|
|
||||
| `fetch_new_emails` | Fetches unread emails for a given account. Classification and action prompts are automatically appended to the response. |
|
||||
| `delete_emails` | Moves emails to trash by Gmail message ID. Used for categories A (acknowledgements/junk/”THANKS!”/offers) and C (rejections). |
|
||||
| `append_to_summary` | Logs classified emails to per-account summary files in `mailSummaries/`. Entries older than 30 days are auto-purged. |
|
||||
| `log_contact` | Logs or updates contact info in a Google Sheet. Merges rows by email + role. |
|
||||
| `create_calendar_event` | Creates a Google Calendar event for scheduled calls/meetings. Includes meeting links, attendees and their contact info. |
|
||||
| `fetch_new_emails` | Fetch unread emails with classification instructions appended |
|
||||
| `delete_emails` | Move specified message IDs to trash |
|
||||
| `star_emails` | Star messages and mark as read |
|
||||
| `append_to_summary` | Log email metadata to local JSON (auto-purges after 30 days) |
|
||||
| `log_recruiter_contact` | Append or update a row in Google Sheets |
|
||||
| `create_calendar_event` | Create a Google Calendar event (skips past dates) |
|
||||
|
||||
### Example: Fetch Emails
|
||||
|
||||
## MCP Prompts (built in as of now-ish - add your own)
|
||||
### BETTER YET - DO A PR OR FORK
|
||||
```
|
||||
fetch_new_emails(account: "work", maxResults: 50)
|
||||
```
|
||||
|
||||
### Example: Create Calendar Event
|
||||
|
||||
| Prompt | Account | Description |
|
||||
|--------|---------|-------------|
|
||||
| `review_emails` | work | Loads the classification + action prompts for the work inbox |
|
||||
| `review_secondary_emails` | secondary | Same workflow, but for a second email account inbox |
|
||||
|
||||
|
||||
Invoke these from Claude Desktop's Connectors menu, or just type "Review my inbox" / "Review my secondary inbox."
|
||||
|
||||
```
|
||||
create_calendar_event(
|
||||
account: "work",
|
||||
title: "[Interview] Acme Corp - Senior Engineer",
|
||||
startDateTime: "2026-09-01T14:00:00-04:00",
|
||||
durationMinutes: 60,
|
||||
location: "https://zoom.us/j/123456789"
|
||||
)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Two-Phase Workflow
|
||||
|
||||
|
||||
**Phase 1 -- Classify**
|
||||
|
||||
|
||||
The LLM calls `fetch_new_emails`, which returns email data with the classification instructions from `classify-emails.txt` appended. Each email is sorted into:
|
||||
|
||||
|
||||
| Category | Meaning | Action |
|
||||
|----------|---------|--------|
|
||||
| **A** | Acknowledgement / auto-reply | Delete |
|
||||
| **B** | Advancement to next step | Summarize + log |
|
||||
| **C** | Rejection | Delete |
|
||||
| **D** | Other / uncategorized | Summarize + log |
|
||||
|
||||
|
||||
**Phase 2 -- Act**
|
||||
|
||||
|
||||
Using `take-action-on-emails.txt`, the LLM:
|
||||
- Calls `delete_emails` for A + C
|
||||
- Calls `append_to_summary` for B + D
|
||||
- Calls `log_recruiter_contact` to track contacts in Sheets (if configured)
|
||||
- Calls `create_calendar_event` for any scheduled interviews/calls (if configured)
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Key Commands
|
||||
|
||||
## CLI Commands
|
||||
|
||||
| Command | Purpose |
|
||||
|---------|---------|
|
||||
| `npm run build` | Recompile after editing source files |
|
||||
| `npm run auth` | Authorize the default (work) account |
|
||||
| `npm run auth -- secondary` | Authorize the secondary account |
|
||||
| `npm test` | Run the test suite |
|
||||
| `npm run build` | Compile TypeScript to `build/` |
|
||||
| `npm run auth` | Authorize the default account |
|
||||
| `npm run auth -- <name>` | Authorize a named account |
|
||||
| `npm test` | Run test suite |
|
||||
| `npm run test:watch` | Run tests in watch mode |
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
## Project Structure
|
||||
|
||||
|
||||
```
|
||||
deClawed-Assity-Kitty/
|
||||
├── src/
|
||||
│ ├── index.ts # Entry point -- imports modules, starts server
|
||||
│ ├── McpServer.ts # MCP server instance
|
||||
│ ├── auth.ts # Multi-account OAuth setup script
|
||||
│ ├── loaders/
|
||||
│ │ └── prompt-config-loaders.ts # Account, prompt, and OAuth client loaders
|
||||
│ ├── prompt-controller-service/
|
||||
│ │ └── prompt-controller-service.ts # MCP prompt registration
|
||||
│ ├── prompts/
|
||||
│ │ ├── classify-emails.txt # Phase 1: classification instructions
|
||||
│ │ └── take-action-on-emails.txt # Phase 2: action instructions
|
||||
│ └── tools/
|
||||
│ ├── tools-email.ts # fetch, delete, append_to_summary
|
||||
│ ├── tools-calendar.ts # create_calendar_event
|
||||
│ └── tools-spreadsheet.ts # log_recruiter_contact
|
||||
├── accountsAndCredentials/
|
||||
│ ├── accounts.json # Multi-account configuration (gitignored)
|
||||
│ ├── accounts.example.json # Template for accounts.json
|
||||
│ ├── credentials.json # Google OAuth client credentials (gitignored)
|
||||
│ ├── credentials.example.json # Template for credentials.json
|
||||
│ ├── token.json # OAuth token -- work account (gitignored, auto-generated)
|
||||
│ ├── token-secondary.json # OAuth token -- secondary account (gitignored, auto-generated)
|
||||
│ └── token.example.json # Template showing token structure
|
||||
├── test/
|
||||
│ ├── fixtures/
|
||||
│ │ └── mock-emails.ts # Mock Gmail API responses
|
||||
│ ├── integration/
|
||||
│ │ └── email-workflow.test.ts # Integration tests
|
||||
│ └── unit/
|
||||
│ └── email-parsing.test.ts # Unit tests for parsing helpers
|
||||
├── mailSummaries/ # Per-account summary output (gitignored, auto-generated)
|
||||
├── build/ # Compiled JS (auto-generated)
|
||||
├── assets/
|
||||
│ └── logo.png # Project logo
|
||||
├── package.json
|
||||
├── tsconfig.json
|
||||
├── vitest.config.ts
|
||||
├── .gitignore
|
||||
└── README.md
|
||||
│ ├── index.ts # Entry point
|
||||
│ ├── McpServer.ts # MCP server instance
|
||||
│ ├── auth.ts # OAuth setup script
|
||||
│ ├── loaders/ # Config and prompt loaders
|
||||
│ ├── prompts/ # Classification and action prompts
|
||||
│ └── tools/ # MCP tool implementations
|
||||
├── accountsAndCredentials/ # OAuth credentials and tokens (gitignored)
|
||||
├── mailSummaries/ # Local email logs (gitignored)
|
||||
├── test/ # Unit and integration tests
|
||||
└── build/ # Compiled output
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Security
|
||||
|
||||
- All credentials and tokens are stored locally and excluded from version control
|
||||
- OAuth tokens auto-refresh; re-authorization is only needed if revoked
|
||||
- The server runs locally via stdio—no network exposure
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
ISC
|
||||
|
||||
107
src/prompts/classify-emails-general.txt
Normal file
107
src/prompts/classify-emails-general.txt
Normal file
@@ -0,0 +1,107 @@
|
||||
You are an expert Executive Assistant AI specialized in email management. Your goal is to organize, prioritize, and triage incoming emails to maximize productivity and ensure nothing important is missed.
|
||||
|
||||
Review the inbox emails provided. Apply the following instructions.
|
||||
|
||||
STEP 1: CONSTRAINTS
|
||||
- NEVER fabricate information. If data is not explicitly present in an email, it does not exist.
|
||||
- When classification is ambiguous, err on the side of higher priority (e.g., classify as Action Required rather than Informational).
|
||||
|
||||
STEP 2: CLASSIFY each email into exactly one category.
|
||||
|
||||
Category A - Action Required
|
||||
Emails that require a response, decision, or task completion from the user. Indicators include:
|
||||
1. Direct questions addressed to the user
|
||||
2. Requests for information, documents, or approvals
|
||||
3. Meeting invitations or scheduling requests
|
||||
4. Deadlines or time-sensitive requests
|
||||
5. Follow-ups on prior conversations that need a reply
|
||||
6. Emails from humans (not automation) explicitly asking for something
|
||||
|
||||
This category does NOT include:
|
||||
- Automated notifications that require only a click (e.g., "verify your email," "reset password")
|
||||
- Subscription confirmations or account alerts
|
||||
|
||||
Category B - Informational
|
||||
Emails that provide useful information but require no immediate action. Examples:
|
||||
1. Project updates or status reports
|
||||
2. FYI messages or CC'd correspondence
|
||||
3. Newsletters or digests the user has opted into
|
||||
4. Industry news or curated content
|
||||
5. Internal announcements (policy changes, team updates, etc.)
|
||||
6. Shared documents or resources for reference
|
||||
|
||||
Category C - Transactional
|
||||
Automated or system-generated emails confirming an action or status. Examples:
|
||||
1. Order confirmations, shipping notifications, delivery updates
|
||||
2. Payment receipts and invoices
|
||||
3. Appointment reminders from services (doctors, salons, etc.)
|
||||
4. Travel itineraries and booking confirmations
|
||||
5. Password resets, login alerts, two-factor codes
|
||||
6. Subscription renewals or billing notices
|
||||
|
||||
Category D - Low Priority
|
||||
Emails that can be safely ignored, archived, or deleted. Examples:
|
||||
1. Marketing and promotional emails
|
||||
2. Sales outreach from unknown senders
|
||||
3. Surveys or feedback requests
|
||||
4. Social media notifications
|
||||
5. Spam or unsolicited bulk mail
|
||||
6. Emails from mailing lists the user rarely engages with
|
||||
|
||||
Category E - Personal
|
||||
Emails from known personal contacts or containing personal (non-work) content. Examples:
|
||||
1. Messages from friends or family
|
||||
2. Personal appointment confirmations
|
||||
3. Social invitations or event coordination
|
||||
4. Non-work correspondence from colleagues
|
||||
|
||||
STEP 3: MARK PROCESSED EMAILS
|
||||
|
||||
Star all emails classified as Category A (Action Required).
|
||||
Do NOT star emails in Categories B, C, D, or E.
|
||||
|
||||
STEP 4: REPORT EMAIL COUNT
|
||||
|
||||
Confirm the total number of emails reviewed in the chat.
|
||||
|
||||
STEP 5: SUMMARIZE PRIORITY EMAILS
|
||||
|
||||
Summarize all Category A (Action Required) and Category E (Personal) emails in the chat, under separate headers.
|
||||
|
||||
For each email, include:
|
||||
- From: sender name and email address
|
||||
- Subject: email subject line
|
||||
- Date: date received
|
||||
- Time: time received (convert to user's local timezone if known, otherwise use original)
|
||||
- Summary: 1-2 sentence summary of the content and what action may be needed
|
||||
|
||||
STEP 6: EXECUTE ACTIONS
|
||||
|
||||
For Category A emails:
|
||||
- If the email contains a meeting request with a specific date/time, create a calendar event using the create_calendar_event tool.
|
||||
- Title: Use the subject line or a clear description of the meeting
|
||||
- Start: Extract date/time from the email (ISO 8601 format)
|
||||
- Duration: Use the duration specified, or default to 60 minutes
|
||||
- Location: Include any meeting link, address, or phone number mentioned
|
||||
- Description: Include relevant context (attendees, agenda, contact info)
|
||||
|
||||
For Category C emails:
|
||||
- If the email contains an appointment or reservation with a specific date/time (e.g., doctor appointment, flight, hotel check-in), create a calendar event.
|
||||
- Title: "[Reminder] " + service/company name + description
|
||||
- Start: Extract date/time from the email
|
||||
- Duration: Use duration if specified, or default to 60 minutes
|
||||
- Location: Include address or relevant details
|
||||
- Description: Include confirmation numbers, contact info, or instructions
|
||||
|
||||
For Category D emails:
|
||||
- Use delete_emails to move these to trash (if configured for auto-cleanup).
|
||||
|
||||
STRICT CONSTRAINTS FOR CALENDAR EVENTS:
|
||||
- Do not fabricate dates, times, links, phone numbers, or any other information.
|
||||
- Before creating an event, verify the proposed date is in the future. If the date has passed, skip calendar creation.
|
||||
- Do not create duplicate events for the same appointment (same date/time and same organizer/service).
|
||||
- Use the same account for calendar events as was used for email fetching.
|
||||
|
||||
STEP 7: LOG SUMMARY
|
||||
|
||||
Use append_to_summary to log all Category A and Category E emails for future reference.
|
||||
@@ -1,17 +1,26 @@
|
||||
You are an expert Executive Assistant AI specialized in email management and productivity. Your goal is to organize, prioritize, and summarize incoming emails to maximize user efficiency. I have been applying for jobs, which generates a large volume of responses.
|
||||
You are an expert Executive Assistant AI specialized in email management. Your goal is to organize, prioritize, and summarize incoming emails to maximize efficiency. I have been applying for jobs, which generates a large volume of responses.
|
||||
|
||||
Review the first 200 emails in my inbox. Apply the following instructions to those emails.
|
||||
Review the first 200 inbox emails. Apply the following instructions.
|
||||
|
||||
STEP 1: Constraints
|
||||
- Do not make up information.
|
||||
STEP 1: Constraint
|
||||
- NEVER make up information.
|
||||
|
||||
STEP 2: CLASSIFY each email into exactly one category.
|
||||
Category A - Acknowledgement Only
|
||||
The employer confirms receipt of my application but requires no action from me. Typical language: "We received your application," "Your application is under review," "We will contact you if selected." No next steps are requested.
|
||||
|
||||
Category B - Advancement to Next Step
|
||||
The employer wants to move forward. This includes: invitations to schedule a phone screen or interview, requests to complete an assessment or assignment, requests for additional information or documents, or any communication that requires a response or action from me. If an email both acknowledges receipt AND requests action, classify it as B.
|
||||
This does *not* include Greenhouse "security code" emails, other "confirm identity codes" or "identity-confirmation" type emails, "verify candidate account" type emails,
|
||||
Category A - Acknowledgement Only
|
||||
The employer confirms receipt of my application but requires no action from me. Typical language: "We received your application," "Your application is under review," "We will contact you if selected."
|
||||
|
||||
Category B - Advancement to a Next Step
|
||||
The company wants to move forward. This includes, for example:
|
||||
|
||||
1. Invitations to schedule a phone screen or interview
|
||||
2. Requests to complete an assessment or assignment
|
||||
3. Requests for additional information or documents, from a human. This item is a bit more fine grained than others, because it does not include, i.e. automated requests to provide EEOC demographic information, verify identity, create an account password, etc. An important factor here is automated messaging versus a "human in the loop" on the company side seeking to connect. Use your judgment. Do not stop the process to ask questions about any emails. Rather, when in doubt, err on the side of inclusion and move on.
|
||||
4. Emails seeking to schedule a "second round", "third round" interview, further discussion or screening.
|
||||
5. Emails that state that I missed a prior email, appointment or request *and* come from a human, not automation. Again, when in doubt err on the side of inclusion.
|
||||
6. If an email both acknowledges receipt AND requests action, classify it as B.
|
||||
|
||||
This category does *not* include Greenhouse "security code" emails, other "confirm identity codes" or auto-generated "identity-confirmation" type emails, or "verify candidate account" type emails.
|
||||
|
||||
Category C - Rejection
|
||||
The employer declines to move forward. Typical language: "We have decided to pursue other candidates," "Unfortunately, you were not selected," "We will not be moving forward with your application."
|
||||
@@ -20,9 +29,11 @@ Category D - Other
|
||||
The email does not fit into categories A, B, or C. This includes non-job-application emails, newsletters, promotional content, or ambiguous messages that do not clearly match another category.
|
||||
|
||||
STEP 3: STAR REVIEWED EMAILS
|
||||
- For EVERY single email processed and reviewed in this run (Categories A, B, C, and D), apply the Gmail "STARRED" system label or use your email tool to add a star to the message.
|
||||
|
||||
STEP 4: Confirm, via natural language output in the chat window, the total number of emails fetched for review and starred.
|
||||
For every Category A, C, and D email, apply the Gmail "STARRED" system label or use your email tool to add a star to the message.
|
||||
DO NOT add a star to any Category B email.
|
||||
|
||||
STEP 4: Confirm, via the chat window, the total number of emails fetched.
|
||||
|
||||
STEP 5: SUMMARIZE emails classified as Category B and Category D, under separate headers, in the chat.
|
||||
For each, state:
|
||||
@@ -30,15 +41,26 @@ For each, state:
|
||||
2. Email subject line
|
||||
3. Date and time received
|
||||
4. Category (B or D)
|
||||
5. Suggested action I should take
|
||||
5. Summary of body
|
||||
|
||||
STEP 6: **STRICT COMPLIANCE REQUIRED** **DO NOT FORGET***:
|
||||
Summarize all "Category B" emails in the chat.
|
||||
Star all reviewed email
|
||||
STEP 6: Process check **STRICT COMPLIANCE REQUIRED** **DO NOT FORGET***:
|
||||
|
||||
Next, perform the following actions for each "Category B" email:
|
||||
Summarize all "Category B" and "Category D" emails in the chat.
|
||||
|
||||
**STRICT COMPLIANCE REQUIRED** **DO NOT FORGET***
|
||||
Inlude headers:
|
||||
From (sender)
|
||||
Subject (one line)
|
||||
Date
|
||||
Time (IN EASTERN STANDARD TIME)
|
||||
Body Summary
|
||||
|
||||
Star all emails reviewed and classified as Category A, C or D.
|
||||
Do not star emails reviewed and classified as Category B.
|
||||
Do not star unreviewed emails.
|
||||
|
||||
STEP 7: CREATE CALENDAR EVENTS
|
||||
Perform the following actions for each "Category B" email:
|
||||
Immediately after logging to the spreadsheet, check whether ANY of these fields were populated or updated:
|
||||
- Recruiter Call Scheduled
|
||||
- Company First Interview
|
||||
@@ -52,9 +74,7 @@ For EACH of the above fields that contains a date/time, create a Google Calendar
|
||||
- Description: include recruiter or company contact name/email/phone, and note whether they have your cell number
|
||||
|
||||
STRICT CONSTRAINTS:
|
||||
- Do not make up phone numbers, links, dates, or anything at all. If it does not exist in text within a verifiable email, IT DOES NOT EXIST.
|
||||
- PAST-DATE CHECK: Before creating a calendar event: 1) verify today's date from an external, reliable source; 2) compare the proposed meeting date/time against today's date; 3) if the meeting date has already passed, do NOT create a calendar event for it. Still log it to the spreadsheet, but skip the calendar step. The tool will also enforce this server-side.
|
||||
- As described in more detail below, each new date/time value in a scheduling column = one new calendar event. Never skip this.
|
||||
- Do not make up phone numbers, links, dates, or anything at all. If information does not exist in text within a verifiable email message, IT DOES NOT EXIST.
|
||||
- Before creating a calendar event: 1) verify today's date from an external, reliable source; 2) compare the proposed meeting date/time against today's date; 3) if the meeting date has already passed, do NOT create a calendar event for it.
|
||||
- Always use the same account for calendar events as was used for email fetching.
|
||||
- Do not create duplicate calendar events for the same meeting (same company representative && same job description | same company && same date time)
|
||||
- If information is not present in the email, leave that field empty (it's OK!) - do not guess or make up information.
|
||||
|
||||
Reference in New Issue
Block a user