Compare commits
2 Commits
FEAT-Add-S
...
FEAT-refin
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d17c409be | ||
|
|
f96a8541c6 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -10,3 +10,5 @@ accountsAndCredentials/token.json.bak
|
|||||||
|
|
||||||
# Runtime output
|
# Runtime output
|
||||||
mailSummaries/
|
mailSummaries/
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -487,4 +487,5 @@ deClawed-Assity-Kitty/
|
|||||||
├── vitest.config.ts
|
├── vitest.config.ts
|
||||||
├── .gitignore
|
├── .gitignore
|
||||||
└── README.md
|
└── README.md
|
||||||
```
|
```
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"work": {
|
"work": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"tokenFile": "token.json",
|
"tokenFile": "token.json",
|
||||||
"spreadsheetId": "",
|
"spreadsheetId": "",
|
||||||
"calendarId": "primary"
|
"calendarId": "primary"
|
||||||
},
|
},
|
||||||
"secondary": {
|
"secondary": {
|
||||||
"label": "",
|
"label": "",
|
||||||
"tokenFile": "token-secondary.json"
|
"tokenFile": "token-secondary.json"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
{
|
{
|
||||||
"installed": {
|
"installed": {
|
||||||
"client_id": "",
|
"client_id": "",
|
||||||
"project_id": "",
|
"project_id": "",
|
||||||
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
||||||
"token_uri": "https://oauth2.googleapis.com/token",
|
"token_uri": "https://oauth2.googleapis.com/token",
|
||||||
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
||||||
"client_secret": "",
|
"client_secret": "",
|
||||||
"redirect_uris": ["http://localhost"]
|
"redirect_uris": [
|
||||||
}
|
"http://localhost"
|
||||||
}
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"access_token": "",
|
"access_token": "",
|
||||||
"refresh_token": "",
|
"refresh_token": "",
|
||||||
"scope": "https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/gmail.modify https://www.googleapis.com/auth/calendar.events",
|
"scope": "https://www.googleapis.com/auth/spreadsheets https://www.googleapis.com/auth/gmail.modify https://www.googleapis.com/auth/calendar.events",
|
||||||
"token_type": "Bearer",
|
"token_type": "Bearer",
|
||||||
"expiry_date": 0
|
"expiry_date": 0
|
||||||
}
|
}
|
||||||
6744
package-lock.json
generated
6744
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
60
package.json
60
package.json
@@ -1,31 +1,31 @@
|
|||||||
{
|
{
|
||||||
"name": "assistant",
|
"name": "assistant",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "MCP server for Gmail job application management",
|
"description": "MCP server for Gmail job application management",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"bin": {
|
"bin": {
|
||||||
"assistant": "./build/index.js"
|
"assistant": "./build/index.js"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc && chmod 755 build/index.js",
|
"build": "tsc && chmod 755 build/index.js",
|
||||||
"auth": "npm run build && node build/auth.js",
|
"auth": "npm run build && node build/auth.js",
|
||||||
"test": "vitest run",
|
"test": "vitest run",
|
||||||
"test:watch": "vitest"
|
"test:watch": "vitest"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"build"
|
"build"
|
||||||
],
|
],
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@modelcontextprotocol/sdk": "^1.30.0",
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
||||||
"googleapis": "^171.4.0",
|
"googleapis": "^171.4.0",
|
||||||
"zod": "^3.25.76"
|
"zod": "^3.25.76"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^25.2.3",
|
"@types/node": "^25.2.3",
|
||||||
"typescript": "^5.9.3",
|
"typescript": "^5.9.3",
|
||||||
"vitest": "^4.0.18"
|
"vitest": "^4.0.18"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,3 +4,5 @@ export const server = new McpServer({
|
|||||||
name: "assistant",
|
name: "assistant",
|
||||||
version: "1.0.0",
|
version: "1.0.0",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -117,3 +117,5 @@ authorize().catch((err) => {
|
|||||||
console.error("Authorization failed:", err);
|
console.error("Authorization failed:", err);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -18,3 +18,5 @@ main().catch((error) => {
|
|||||||
console.error("Fatal error in main():", error);
|
console.error("Fatal error in main():", error);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -149,3 +149,5 @@ export const getSpreadsheetId = (account: string): string => {
|
|||||||
|
|
||||||
export const getCalendarId = (account: string): string =>
|
export const getCalendarId = (account: string): string =>
|
||||||
accounts[account]?.calendarId ?? "primary";
|
accounts[account]?.calendarId ?? "primary";
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -54,3 +54,5 @@ server.registerPrompt(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ 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.
|
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
|
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.
|
- For EVERY email processed and reviewed in this run that is in Category A, C, and D (NOT B), 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.
|
STEP 4: Confirm, via natural language output in the chat window, the total number of emails fetched for review and starred.
|
||||||
|
|
||||||
@@ -58,3 +58,5 @@ STRICT CONSTRAINTS:
|
|||||||
- Always use the same account for calendar events as was used for email fetching.
|
- 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)
|
- 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.
|
- If information is not present in the email, leave that field empty (it's OK!) - do not guess or make up information.
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -21,3 +21,5 @@ STRICT CONSTRAINTS:
|
|||||||
- Always use the same account for calendar events as was used for email fetching.
|
- 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)
|
- 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.
|
- If information is not present in the email, leave that field empty (it's OK!) - do not guess or make up information.
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -109,3 +109,5 @@ server.registerTool(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -358,3 +358,5 @@ server.registerTool(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -177,3 +177,5 @@ server.registerTool(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
2
test/fixtures/mock-emails.ts
vendored
2
test/fixtures/mock-emails.ts
vendored
@@ -165,3 +165,5 @@ export const RAW_BODIES = {
|
|||||||
"msg-cat-c-001": catCBody,
|
"msg-cat-c-001": catCBody,
|
||||||
"msg-cat-d-001": catDBody,
|
"msg-cat-d-001": catDBody,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -285,3 +285,5 @@ describe("Phase 1: Email Review Workflow", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -84,3 +84,5 @@ describe("decodeBody", () => {
|
|||||||
expect(decodeBody(msg)).toBe(htmlContent);
|
expect(decodeBody(msg)).toBe(htmlContent);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
@@ -1,15 +1,21 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
"module": "Node16",
|
"module": "Node16",
|
||||||
"moduleResolution": "Node16",
|
"moduleResolution": "Node16",
|
||||||
"outDir": "./build",
|
"outDir": "./build",
|
||||||
"rootDir": "./src",
|
"rootDir": "./src",
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"esModuleInterop": true,
|
"esModuleInterop": true,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"forceConsistentCasingInFileNames": true
|
"forceConsistentCasingInFileNames": true
|
||||||
},
|
},
|
||||||
"include": ["src/**/*"],
|
"include": [
|
||||||
"exclude": ["node_modules", "test", "vitest.config.ts"]
|
"src/**/*"
|
||||||
}
|
],
|
||||||
|
"exclude": [
|
||||||
|
"node_modules",
|
||||||
|
"test",
|
||||||
|
"vitest.config.ts"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -6,3 +6,5 @@ export default defineConfig({
|
|||||||
globals: true,
|
globals: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// revised Aug 31
|
||||||
|
|||||||
Reference in New Issue
Block a user