Inbox brimming with stank, algorithmically-generated logs? Wanna cut the crap and get the stuff that matters into your calendars, Atlassian, Jira, Asana, G sheets (etc., etc.) ... in two clicks?
### (Cat) nip it in the bud!!
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":
### Declawed is a configurable, prompt purrr-fectable LLM mail and task automation assisty-kitty.
### More private than other options (not purrfect *yet* - but privacy is our number one goal with every release).
### More accurate actions/results (read on).
### Eliminates the frustrating feeling you'll never get the dangling, catnip-stuffed mouse you've been chasing all week
### 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 offers greater control, configurability and transparency over permissions.
Avoid the flakey (molty?) black-box installs that are loaded with more Trojans than an Olympic Village. Silent/dark processes, data harvesting phone-homes, behavioral analytics, telemetry backdoors - the nasties lurking in the dark detritus.
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.
💩 You know lobsters eat poop, right? 💩
# Simplicity
### NLP prompts are **actually** easy and **demonstrably** more effective
Stop drilling down byzantine menus in mail, scheduling and workflow platforms to configure filters and actions that 1. only ever work 20% of the time 2. change in functionality and scope every two months.
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 our "built in" library are evaluated using, for example, cosine similarity, ROUGE scoring and real human feedback.
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 into the whole house.
### Imagine your morning inbox or summaries brimming with a fresh, spring-meadow aroma of opportunity and insight -- not last night's litter.
### 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.
---
# Scope and Architecture
## Current implementation requires building/using:
-- Claude Desktop (as UI - proprietary UI coming soonish)
-- Building/Connecting a Local Model Context Protocol Server
-- 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 Hugging Face models galore.
- Support for wiring to local LLMs.
-- 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/).
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:
```bash
cp credentials.example.json credentials.json
# Now replace credentials.json with the file downloaded from Google Cloud Console.
```
The structure looks like this (the example file ships with empty values):
```json
{
"installed":{
@@ -240,14 +322,18 @@ The structure looks like this (the example file ships with empty values):
}
```
#### 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) |
| `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**.
---
## MCP Tools
| Tool | Description |
|------|-------------|
| `fetch_new_emails` | Fetches unread emails for a given account. Classification and action prompts are automatically appended to the response. |
@@ -285,24 +381,32 @@ Fully quit (**Cmd+Q**, not just close the window) and reopen. The `assistant` se
| `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. |
## MCP Prompts (built in as of now-ish - add your own)
### BETTER YET - DO A PR OR FORK
| 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."
---
## 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 |
@@ -310,18 +414,23 @@ The LLM calls `fetch_new_emails`, which returns email data with the classificati
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. Review my inbox and apply the following instructions to all new emails.
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.
STEP 1: Constraints
- Do not make up information.
@@ -23,7 +25,9 @@ STEP 3: DELETE emails classified as Category A and Category C.
STEP 4: ("Anti step") - NEVER DELETE Category B emails.
STEP 5: SUMMARIZE emails classified as Category B and Category D. For each, include:
STEP 5: Confirm via natrual lanugage output in the cat, the total number of emails fetched for review.
STEP 6: SUMMARIZE emails classified as Category B and Category D. For each, include:
@@ -24,7 +24,7 @@ Immediately after logging to the spreadsheet, check whether ANY of these fields
- Company Second Interview
For EACH of the above fields that contains a date/time, create a Google Calendar event using the create_calendar_event tool:
- Title format: "[<Recruiter NaME> Call] Company - Role" or "[First Interview] Company - Role" or "[Second Interview] Company - Role"
- Title format: "[<Recruiter Name> Call] Company - Role" or "[First Interview] Company - Role" or "[Second Interview] Company - Role"
- Start date/time: extracted from the email (convert to ISO 8601)
- Duration: 30 minutes unless otherwise specified in the email
- Location: the video meeting link, phone number, or platform name
@@ -38,8 +38,8 @@ When an email indicates advancement beyond the recruiter screen to a company int
STRICT CONSTRAINTS:
- Do not make up phone numbers, links, dates, or anything at all. If it does not exist in text wihtin a verifiable email, IT DOES NOT EXIST.
- PAST-DATE CHECK: Before creating a calendar event, compare the proposed meeting date/time against today's date. 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.
- 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) iIf 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.
- Always use the same account for calendar events as was used for email fetching.
- Do not create duplicate calendar events for the same meeting.
- If information is not present in the email, leave that field empty do ot guess.
- 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.
.describe("Maximum number of unread emails to fetch (1-100)"),
.max(200)
.describe("Maximum number of unread emails to fetch (1-200)"),
},
},
async({account,maxResults})=>{
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.