get-claudia 1.55.11 → 1.55.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/bin/google-setup.js +15 -9
- package/bin/index.js +84 -9
- package/package.json +1 -1
- package/template-v2/.claude/skills/feedback/SKILL.md +118 -0
- package/template-v2/.claude/skills/skill-index.json +15 -0
- package/template-v2/.mcp.json.example +21 -2
- package/template-v2/CLAUDE.md +45 -7
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Claudia will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## 1.55.13 (2026-03-16)
|
|
6
|
+
|
|
7
|
+
- **Gmail & Calendar MCPs as standard options** -- The standalone `gmail` (`@gongrzhe/server-gmail-autoauth-mcp`) and `google-calendar` (`@gongrzhe/server-calendar-autoauth-mcp`) servers are now first-class options alongside workspace-mcp. Two paths for Google integration: Option A (lightweight, focused, fewer tools) and Option B (all-in-one workspace-mcp with Drive, Docs, Sheets, etc.). Both can coexist.
|
|
8
|
+
- **Auto-detect Gmail/Calendar credentials** -- The installer now checks `~/.gmail-mcp/` and `~/.calendar-mcp/` for existing OAuth credentials. If found, it automatically adds `gmail` and `google-calendar` entries to `.mcp.json`. No manual config needed.
|
|
9
|
+
- **Installer no longer removes standalone MCPs** -- Running `npx get-claudia google` (workspace-mcp setup) no longer deletes existing `gmail` or `google-calendar` entries. Both integration paths coexist safely.
|
|
10
|
+
- **Completion message shows Google MCPs** -- The installer now lists detected Gmail and Calendar servers in the MCP config summary line.
|
|
11
|
+
- **Updated docs** -- CLAUDE.md and .mcp.json.example files document both Google integration paths with setup instructions for each.
|
|
12
|
+
|
|
13
|
+
## 1.55.12 (2026-03-15)
|
|
14
|
+
|
|
15
|
+
- **Feedback skill** -- New `/feedback` command lets users share bugs, ideas, or suggestions. Claudia collects system context (version, OS, memory count, daemon health), builds a pre-filled GitHub Discussion URL, and opens it in the browser. The user reviews and submits. No data is sent without their knowledge.
|
|
16
|
+
- **GitHub Discussions enabled** -- Feedback and community discussion now live at github.com/kbanc85/claudia/discussions.
|
|
17
|
+
- **Installer feedback hint** -- Completion message now mentions `/feedback` and links to Discussions.
|
|
18
|
+
|
|
5
19
|
## 1.55.11 (2026-03-15)
|
|
6
20
|
|
|
7
21
|
- **Auto-repair corrupt claudia.db** -- Installer detects when `claudia.db` is empty or corrupt (no tables, malformed disk image) and removes it along with stale WAL/SHM files so the daemon can create a fresh one. Previously, a corrupt db with leftover SHM files caused "database disk image is malformed" on every startup, blocking the daemon and preventing database consolidation.
|
package/bin/google-setup.js
CHANGED
|
@@ -69,20 +69,27 @@ export function buildApiEnableUrl(projectNumber, tier) {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
/**
|
|
72
|
-
* Detect
|
|
73
|
-
* Returns {
|
|
72
|
+
* Detect Google MCP server entries in .mcp.json.
|
|
73
|
+
* Returns { hasGmail, hasCalendar, hasWorkspace }.
|
|
74
|
+
*
|
|
75
|
+
* gmail and google-calendar are valid standalone options (lightweight, focused),
|
|
76
|
+
* not legacy entries. They can coexist with google_workspace.
|
|
74
77
|
*/
|
|
75
78
|
export function detectOldGoogleMcp(targetPath) {
|
|
76
79
|
const mcpPath = join(targetPath, '.mcp.json');
|
|
77
|
-
const result = {
|
|
80
|
+
const result = { hasGmail: false, hasCalendar: false, hasWorkspace: false,
|
|
81
|
+
// Keep backward-compat aliases for callers that check the old property names
|
|
82
|
+
get hasOldGmail() { return this.hasGmail; },
|
|
83
|
+
get hasOldCalendar() { return this.hasCalendar; },
|
|
84
|
+
};
|
|
78
85
|
|
|
79
86
|
if (!existsSync(mcpPath)) return result;
|
|
80
87
|
|
|
81
88
|
try {
|
|
82
89
|
const config = JSON.parse(readFileSync(mcpPath, 'utf-8'));
|
|
83
90
|
const servers = config.mcpServers || {};
|
|
84
|
-
result.
|
|
85
|
-
result.
|
|
91
|
+
result.hasGmail = !!servers.gmail;
|
|
92
|
+
result.hasCalendar = !!servers['google-calendar'];
|
|
86
93
|
result.hasWorkspace = !!servers.google_workspace;
|
|
87
94
|
} catch {
|
|
88
95
|
// Malformed JSON
|
|
@@ -93,7 +100,7 @@ export function detectOldGoogleMcp(targetPath) {
|
|
|
93
100
|
|
|
94
101
|
/**
|
|
95
102
|
* Add or update the google_workspace entry in .mcp.json.
|
|
96
|
-
*
|
|
103
|
+
* Keeps existing gmail and google-calendar entries (they are valid standalone options).
|
|
97
104
|
* Creates .mcp.json if it doesn't exist.
|
|
98
105
|
*/
|
|
99
106
|
export function setupGoogleWorkspace(targetPath, clientId, clientSecret, tier) {
|
|
@@ -113,9 +120,8 @@ export function setupGoogleWorkspace(targetPath, clientId, clientSecret, tier) {
|
|
|
113
120
|
|
|
114
121
|
if (!config.mcpServers) config.mcpServers = {};
|
|
115
122
|
|
|
116
|
-
//
|
|
117
|
-
|
|
118
|
-
delete config.mcpServers['google-calendar'];
|
|
123
|
+
// Note: gmail and google-calendar entries are kept if present.
|
|
124
|
+
// They are valid standalone options that can coexist with google_workspace.
|
|
119
125
|
|
|
120
126
|
// Add/update google_workspace
|
|
121
127
|
config.mcpServers.google_workspace = {
|
package/bin/index.js
CHANGED
|
@@ -962,6 +962,9 @@ async function main() {
|
|
|
962
962
|
ensureDaemonMcpConfig(targetPath, venvPython);
|
|
963
963
|
}
|
|
964
964
|
|
|
965
|
+
// Auto-detect and add Gmail/Calendar MCP entries if credentials exist
|
|
966
|
+
const googleMcpResult = ensureGoogleMcpEntries(targetPath);
|
|
967
|
+
|
|
965
968
|
// Run preflight check to verify daemon can actually start
|
|
966
969
|
if (daemonOk && existsSync(venvPython)) {
|
|
967
970
|
renderer.update('daemon', 'active', 'running preflight...');
|
|
@@ -1013,9 +1016,15 @@ async function main() {
|
|
|
1013
1016
|
renderer.update('mcp', 'active', 'checking .mcp.json...');
|
|
1014
1017
|
const mcpCheckResult = checkMcpConfig(targetPath);
|
|
1015
1018
|
if (mcpCheckResult.hasDaemon && mcpCheckResult.stdioCount >= 1) {
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
+
// Build detail string showing what's configured
|
|
1020
|
+
const extras = [];
|
|
1021
|
+
if (mcpCheckResult.stdioServers.includes('gmail')) extras.push('gmail');
|
|
1022
|
+
if (mcpCheckResult.stdioServers.includes('google-calendar')) extras.push('calendar');
|
|
1023
|
+
const otherCount = mcpCheckResult.stdioCount - 1 - extras.length;
|
|
1024
|
+
const parts = ['claudia-memory'];
|
|
1025
|
+
if (extras.length > 0) parts.push(extras.join(', '));
|
|
1026
|
+
if (otherCount > 0) parts.push(`+${otherCount} more`);
|
|
1027
|
+
const serverDetail = parts.join(' + ');
|
|
1019
1028
|
renderer.update('mcp', 'done', serverDetail);
|
|
1020
1029
|
if (!supportsInPlace) renderer.appendLine('mcp', 'done', serverDetail);
|
|
1021
1030
|
} else if (mcpCheckResult.hasDaemon && mcpCheckResult.stdioCount === 0) {
|
|
@@ -1227,7 +1236,7 @@ async function main() {
|
|
|
1227
1236
|
console.log('');
|
|
1228
1237
|
console.log(` ${colors.cyan}${launchCmd}${colors.reset}`);
|
|
1229
1238
|
console.log('');
|
|
1230
|
-
console.log(` ${colors.dim}What's new: /morning-brief · /inbox-check${colors.reset}`);
|
|
1239
|
+
console.log(` ${colors.dim}What's new: /morning-brief · /inbox-check · /feedback${colors.reset}`);
|
|
1231
1240
|
} else {
|
|
1232
1241
|
// Fresh install: build anticipation for the onboarding
|
|
1233
1242
|
console.log(` ${colors.cyan}Claudia is ready.${colors.reset} ${colors.dim}She's waiting to meet you.${colors.reset}`);
|
|
@@ -1240,6 +1249,7 @@ async function main() {
|
|
|
1240
1249
|
console.log(` ${colors.dim}She'll introduce herself and learn how you work.${colors.reset}`);
|
|
1241
1250
|
console.log(` ${colors.dim}Try: ${colors.reset}${colors.cyan}"Say hi"${colors.reset} ${colors.dim}·${colors.reset} ${colors.cyan}/morning-brief${colors.reset} ${colors.dim}·${colors.reset} ${colors.cyan}"Who do I know?"${colors.reset}`);
|
|
1242
1251
|
}
|
|
1252
|
+
console.log(` ${colors.dim}Feedback? Tell Claudia, or visit github.com/kbanc85/claudia/discussions${colors.reset}`);
|
|
1243
1253
|
console.log('');
|
|
1244
1254
|
return;
|
|
1245
1255
|
}
|
|
@@ -1473,6 +1483,71 @@ function ensureDaemonMcpConfig(targetPath, venvPythonPath) {
|
|
|
1473
1483
|
writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n');
|
|
1474
1484
|
}
|
|
1475
1485
|
|
|
1486
|
+
/**
|
|
1487
|
+
* Ensure gmail and google-calendar MCP entries exist in .mcp.json
|
|
1488
|
+
* if the user has credentials at ~/.gmail-mcp/ and ~/.calendar-mcp/.
|
|
1489
|
+
* Does not overwrite existing entries. Only adds if credentials are found.
|
|
1490
|
+
* Returns { addedGmail, addedCalendar } indicating what was added.
|
|
1491
|
+
*/
|
|
1492
|
+
function ensureGoogleMcpEntries(targetPath) {
|
|
1493
|
+
const mcpPath = join(targetPath, '.mcp.json');
|
|
1494
|
+
const result = { addedGmail: false, addedCalendar: false };
|
|
1495
|
+
|
|
1496
|
+
let config;
|
|
1497
|
+
if (existsSync(mcpPath)) {
|
|
1498
|
+
try {
|
|
1499
|
+
config = JSON.parse(readFileSync(mcpPath, 'utf-8'));
|
|
1500
|
+
} catch {
|
|
1501
|
+
return result; // Malformed JSON -- don't touch
|
|
1502
|
+
}
|
|
1503
|
+
} else {
|
|
1504
|
+
return result; // No .mcp.json yet (ensureDaemonMcpConfig creates it first)
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
if (!config.mcpServers) config.mcpServers = {};
|
|
1508
|
+
|
|
1509
|
+
const home = homedir();
|
|
1510
|
+
let changed = false;
|
|
1511
|
+
|
|
1512
|
+
// Gmail: add if credentials exist and entry doesn't
|
|
1513
|
+
const gmailOauthPath = join(home, '.gmail-mcp', 'gcp-oauth.keys.json');
|
|
1514
|
+
const gmailCredsPath = join(home, '.gmail-mcp', 'credentials.json');
|
|
1515
|
+
if (!config.mcpServers.gmail && existsSync(gmailOauthPath) && existsSync(gmailCredsPath)) {
|
|
1516
|
+
config.mcpServers.gmail = {
|
|
1517
|
+
command: 'npx',
|
|
1518
|
+
args: ['-y', '@gongrzhe/server-gmail-autoauth-mcp@latest'],
|
|
1519
|
+
env: {
|
|
1520
|
+
GMAIL_OAUTH_PATH: gmailOauthPath,
|
|
1521
|
+
GMAIL_CREDENTIALS_PATH: gmailCredsPath,
|
|
1522
|
+
},
|
|
1523
|
+
};
|
|
1524
|
+
result.addedGmail = true;
|
|
1525
|
+
changed = true;
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1528
|
+
// Google Calendar: add if credentials exist and entry doesn't
|
|
1529
|
+
const calOauthPath = join(home, '.calendar-mcp', 'gcp-oauth.keys.json');
|
|
1530
|
+
const calCredsPath = join(home, '.calendar-mcp', 'credentials.json');
|
|
1531
|
+
if (!config.mcpServers['google-calendar'] && existsSync(calOauthPath) && existsSync(calCredsPath)) {
|
|
1532
|
+
config.mcpServers['google-calendar'] = {
|
|
1533
|
+
command: 'npx',
|
|
1534
|
+
args: ['-y', '@gongrzhe/server-calendar-autoauth-mcp@latest'],
|
|
1535
|
+
env: {
|
|
1536
|
+
CALENDAR_OAUTH_PATH: calOauthPath,
|
|
1537
|
+
CALENDAR_CREDENTIALS_PATH: calCredsPath,
|
|
1538
|
+
},
|
|
1539
|
+
};
|
|
1540
|
+
result.addedCalendar = true;
|
|
1541
|
+
changed = true;
|
|
1542
|
+
}
|
|
1543
|
+
|
|
1544
|
+
if (changed) {
|
|
1545
|
+
writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n');
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
return result;
|
|
1549
|
+
}
|
|
1550
|
+
|
|
1476
1551
|
/**
|
|
1477
1552
|
* Check .mcp.json configuration and return status.
|
|
1478
1553
|
* Returns { hasDaemon, stdioCount, stdioServers }.
|
|
@@ -1712,9 +1787,9 @@ async function runGoogleSetup() {
|
|
|
1712
1787
|
// Detect existing state
|
|
1713
1788
|
const state = detectOldGoogleMcp(targetPath);
|
|
1714
1789
|
|
|
1715
|
-
if (state.
|
|
1716
|
-
console.log(` ${colors.yellow}→${colors.reset} Found
|
|
1717
|
-
console.log(` ${colors.dim}
|
|
1790
|
+
if (state.hasGmail || state.hasCalendar) {
|
|
1791
|
+
console.log(` ${colors.yellow}→${colors.reset} Found standalone Gmail/Calendar MCP servers. These will be kept.`);
|
|
1792
|
+
console.log(` ${colors.dim}Both options work side by side. Workspace MCP adds Drive, Docs, Sheets, and more.${colors.reset}`);
|
|
1718
1793
|
console.log('');
|
|
1719
1794
|
}
|
|
1720
1795
|
|
|
@@ -1760,8 +1835,8 @@ async function runGoogleSetup() {
|
|
|
1760
1835
|
console.log('');
|
|
1761
1836
|
console.log(` ${colors.cyan}✓${colors.reset} Google Workspace MCP configured (${colors.bold}${tier}${colors.reset} tier)`);
|
|
1762
1837
|
|
|
1763
|
-
if (state.
|
|
1764
|
-
console.log(` ${colors.cyan}✓${colors.reset}
|
|
1838
|
+
if (state.hasGmail || state.hasCalendar) {
|
|
1839
|
+
console.log(` ${colors.cyan}✓${colors.reset} Standalone Gmail/Calendar MCP servers kept alongside Workspace`);
|
|
1765
1840
|
}
|
|
1766
1841
|
|
|
1767
1842
|
// Build one-click API enablement URL
|
package/package.json
CHANGED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: feedback
|
|
3
|
+
description: Send feedback, ideas, or bug reports about Claudia. Opens a pre-filled GitHub Discussion with system context. Use when user says "feedback", "suggestion", "report a bug", "feature request", or "I have an idea".
|
|
4
|
+
effort-level: low
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Claudia Feedback
|
|
8
|
+
|
|
9
|
+
Help users share feedback, ideas, bug reports, or feature requests about Claudia. Opens a GitHub Discussion with auto-populated system info so the user just writes their message.
|
|
10
|
+
|
|
11
|
+
## Trigger Phrases
|
|
12
|
+
|
|
13
|
+
- "feedback", "give feedback", "send feedback"
|
|
14
|
+
- "I have a suggestion", "feature request", "idea for Claudia"
|
|
15
|
+
- "report a bug", "something's broken", "I found a bug"
|
|
16
|
+
- "how do I report an issue"
|
|
17
|
+
|
|
18
|
+
## Process
|
|
19
|
+
|
|
20
|
+
### Step 1: Ask What's On Their Mind
|
|
21
|
+
|
|
22
|
+
Ask the user what kind of feedback they want to share. Keep it casual:
|
|
23
|
+
|
|
24
|
+
- "What's on your mind? Bug, idea, or just general feedback?"
|
|
25
|
+
|
|
26
|
+
If they've already described it, skip this step.
|
|
27
|
+
|
|
28
|
+
### Step 2: Gather System Context
|
|
29
|
+
|
|
30
|
+
Collect system info silently (don't show raw data to user). Run these:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Version
|
|
34
|
+
cat package.json 2>/dev/null | grep '"version"' | head -1
|
|
35
|
+
|
|
36
|
+
# OS and Node
|
|
37
|
+
echo "$(uname -s) $(uname -m), Node $(node -v 2>/dev/null)"
|
|
38
|
+
|
|
39
|
+
# Memory daemon health
|
|
40
|
+
~/.claudia/daemon/venv/bin/python3 -m claudia_memory --preflight 2>&1 | grep "Result:" || echo "Daemon: not checked"
|
|
41
|
+
|
|
42
|
+
# Memory count
|
|
43
|
+
sqlite3 ~/.claudia/memory/claudia.db "SELECT COUNT(*) FROM memories WHERE invalidated_at IS NULL;" 2>/dev/null || echo "0"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Step 3: Categorize
|
|
47
|
+
|
|
48
|
+
Map their feedback to a GitHub Discussions category:
|
|
49
|
+
|
|
50
|
+
| Feedback Type | Category |
|
|
51
|
+
|--------------|----------|
|
|
52
|
+
| Bug report | Ideas (no Bugs category by default) |
|
|
53
|
+
| Feature request / idea | Ideas |
|
|
54
|
+
| General feedback | General |
|
|
55
|
+
| Question | Q&A |
|
|
56
|
+
|
|
57
|
+
### Step 4: Build the Discussion URL
|
|
58
|
+
|
|
59
|
+
Construct a pre-filled GitHub Discussion URL. The URL format:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
https://github.com/kbanc85/claudia/discussions/new?category={CATEGORY}&title={TITLE}&body={BODY}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The body should include:
|
|
66
|
+
1. The user's feedback (their words, not paraphrased)
|
|
67
|
+
2. A "System Info" section at the bottom with the collected context
|
|
68
|
+
|
|
69
|
+
**Body template:**
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
{user's feedback text}
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
**System Info** (auto-generated by Claudia)
|
|
77
|
+
- Version: {version}
|
|
78
|
+
- OS: {os}
|
|
79
|
+
- Node: {node_version}
|
|
80
|
+
- Memories: {count}
|
|
81
|
+
- Daemon: {healthy/not running}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
URL-encode the title and body for the query string.
|
|
85
|
+
|
|
86
|
+
### Step 5: Open in Browser
|
|
87
|
+
|
|
88
|
+
Use the Bash tool to open the URL:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# macOS
|
|
92
|
+
open "{url}"
|
|
93
|
+
|
|
94
|
+
# Linux
|
|
95
|
+
xdg-open "{url}" 2>/dev/null || echo "Open this URL: {url}"
|
|
96
|
+
|
|
97
|
+
# Windows
|
|
98
|
+
start "{url}"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Step 6: Confirm
|
|
102
|
+
|
|
103
|
+
Tell the user:
|
|
104
|
+
- "Opened a new discussion in your browser. Add any details and hit Submit."
|
|
105
|
+
- If the browser didn't open, show the URL directly so they can copy it.
|
|
106
|
+
|
|
107
|
+
## Important
|
|
108
|
+
|
|
109
|
+
- **Never post feedback without the user's knowledge.** This opens a browser for them to review and submit.
|
|
110
|
+
- **Don't paraphrase their feedback.** Use their exact words in the body.
|
|
111
|
+
- **Keep system info minimal.** Version, OS, memory count. No sensitive data, no file paths, no personal info.
|
|
112
|
+
- **The user submits, not Claudia.** The browser opens a pre-filled form. The user reviews and clicks Submit.
|
|
113
|
+
|
|
114
|
+
## GitHub Discussions URL
|
|
115
|
+
|
|
116
|
+
Repository: `kbanc85/claudia`
|
|
117
|
+
|
|
118
|
+
Direct link to create a discussion: `https://github.com/kbanc85/claudia/discussions/new`
|
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
"$schema": "Claudia Skill Index v2",
|
|
3
3
|
"description": "Progressive loading index - lightweight metadata for all skills with trigger examples for contextual matching",
|
|
4
4
|
"skills": [
|
|
5
|
+
{
|
|
6
|
+
"name": "feedback",
|
|
7
|
+
"path": "feedback/SKILL.md",
|
|
8
|
+
"description": "Send feedback, ideas, or bug reports about Claudia via GitHub Discussions",
|
|
9
|
+
"invocation": "explicit",
|
|
10
|
+
"effort_level": "low",
|
|
11
|
+
"triggers": ["feedback", "suggestion", "bug report", "feature request", "idea", "report issue"],
|
|
12
|
+
"examples": [
|
|
13
|
+
"I have feedback",
|
|
14
|
+
"I want to suggest a feature",
|
|
15
|
+
"I found a bug",
|
|
16
|
+
"how do I report an issue",
|
|
17
|
+
"I have an idea for Claudia"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
5
20
|
{
|
|
6
21
|
"name": "onboarding",
|
|
7
22
|
"path": "onboarding.md",
|
|
@@ -6,6 +6,24 @@
|
|
|
6
6
|
"_description": "Claudia memory system with vector search",
|
|
7
7
|
"_setup": "Auto-configured by the installer (npx get-claudia). The installer creates a Python venv at ~/.claudia/daemon/venv/ and sets the correct command path in .mcp.json automatically."
|
|
8
8
|
},
|
|
9
|
+
"gmail": {
|
|
10
|
+
"command": "npx",
|
|
11
|
+
"args": ["-y", "@gongrzhe/server-gmail-autoauth-mcp@latest"],
|
|
12
|
+
"env": {
|
|
13
|
+
"GMAIL_OAUTH_PATH": "",
|
|
14
|
+
"GMAIL_CREDENTIALS_PATH": ""
|
|
15
|
+
},
|
|
16
|
+
"_setup": "Lightweight Gmail-only MCP. Requires Google Cloud OAuth credentials. Run: npx @gongrzhe/server-gmail-autoauth-mcp auth"
|
|
17
|
+
},
|
|
18
|
+
"google-calendar": {
|
|
19
|
+
"command": "npx",
|
|
20
|
+
"args": ["-y", "@gongrzhe/server-calendar-autoauth-mcp@latest"],
|
|
21
|
+
"env": {
|
|
22
|
+
"CALENDAR_OAUTH_PATH": "",
|
|
23
|
+
"CALENDAR_CREDENTIALS_PATH": ""
|
|
24
|
+
},
|
|
25
|
+
"_setup": "Lightweight Calendar-only MCP. Requires Google Cloud OAuth credentials. Run: npx @gongrzhe/server-calendar-autoauth-mcp auth"
|
|
26
|
+
},
|
|
9
27
|
"google_workspace": {
|
|
10
28
|
"command": "uvx",
|
|
11
29
|
"args": ["workspace-mcp", "--tool-tier", "core"],
|
|
@@ -13,7 +31,7 @@
|
|
|
13
31
|
"GOOGLE_OAUTH_CLIENT_ID": "",
|
|
14
32
|
"GOOGLE_OAUTH_CLIENT_SECRET": ""
|
|
15
33
|
},
|
|
16
|
-
"_setup": "Google Workspace MCP: Gmail, Calendar, Drive, Docs, Sheets, Tasks, and more
|
|
34
|
+
"_setup": "All-in-one Google Workspace MCP: Gmail, Calendar, Drive, Docs, Sheets, Tasks, and more. Alternative to the standalone gmail + google-calendar servers above. Requires Google Cloud OAuth credentials. See Google Integration Setup in CLAUDE.md.",
|
|
17
35
|
"_tiers": {
|
|
18
36
|
"core": "Gmail, Calendar, Drive, Contacts (43 tools, recommended default)",
|
|
19
37
|
"extended": "Adds Docs, Sheets, Tasks, Chat (83 tools)",
|
|
@@ -33,7 +51,8 @@
|
|
|
33
51
|
|
|
34
52
|
"_notes": {
|
|
35
53
|
"memory": "Claudia's memory is powered by the claudia-memory daemon (Python MCP server). It provides ~33 tools for semantic search, pattern detection, and relationship tracking. The installer (npx get-claudia) automatically sets up the daemon in a Python venv at ~/.claudia/daemon/venv/ and configures .mcp.json.",
|
|
36
|
-
"
|
|
54
|
+
"google_options": "Two paths for Google integration: (A) gmail + google-calendar (lightweight, focused, fewer tools) or (B) google_workspace via workspace-mcp (all-in-one, more tools). Both can coexist. See Google Integration Setup in CLAUDE.md.",
|
|
55
|
+
"google_workspace": "Google Workspace uses the workspace-mcp server (taylorwilsdon/google_workspace_mcp). One server covers Gmail, Calendar, Drive, Docs, Sheets, Tasks, and more. Tool tiers control context usage.",
|
|
37
56
|
"rube": "Rube (by Composio) connects 500+ apps through one HTTP MCP connection. Each user creates their own free Rube account at rube.app. See the Rube section in CLAUDE.md for setup and troubleshooting.",
|
|
38
57
|
"security": "Each user authenticates with their own accounts and credentials. OAuth tokens are stored locally on your machine, never shared.",
|
|
39
58
|
"not_included": {
|
package/template-v2/CLAUDE.md
CHANGED
|
@@ -319,9 +319,20 @@ I adapt to whatever tools are available. When you ask me to do something that ne
|
|
|
319
319
|
|
|
320
320
|
**Obsidian vault:** My memory syncs to an Obsidian vault at `~/.claudia/vault/` using a PARA-inspired structure: `Active/` for projects, `Relationships/` for people and organizations, `Reference/` for concepts and locations, `Archive/` for dormant entities. Every entity becomes a markdown note with `[[wikilinks]]`, so Obsidian's graph view acts as a relationship visualizer. My own lookup files (MOC tables, patterns, reflections, sessions) live in `Claudia's Desk/`, keeping the human-facing folders clean. The vault syncs on-demand via `claudia vault sync`. SQLite remains the source of truth; the vault is a read projection.
|
|
321
321
|
|
|
322
|
-
**Google
|
|
322
|
+
**Google Integration:** Two paths are available for connecting Google services:
|
|
323
323
|
|
|
324
|
-
|
|
324
|
+
**Option A: Gmail + Calendar MCPs** (lightweight, focused)
|
|
325
|
+
- Two separate servers: `gmail` (`@gongrzhe/server-gmail-autoauth-mcp`) and `google-calendar` (`@gongrzhe/server-calendar-autoauth-mcp`)
|
|
326
|
+
- Fewer tools, lower context usage
|
|
327
|
+
- Auth: `npx @gongrzhe/server-gmail-autoauth-mcp auth` and `npx @gongrzhe/server-calendar-autoauth-mcp auth`
|
|
328
|
+
- Credentials stored at `~/.gmail-mcp/` and `~/.calendar-mcp/`
|
|
329
|
+
|
|
330
|
+
**Option B: Google Workspace MCP** (all-in-one)
|
|
331
|
+
- One server (`google_workspace` via [workspace-mcp](https://github.com/taylorwilsdon/google_workspace_mcp)) covers Gmail, Calendar, Drive, Docs, Sheets, Tasks, Contacts, and more
|
|
332
|
+
- Tool tiers: `--tool-tier core` (43 tools, default), `--tool-tier extended` (83 tools), `--tool-tier complete` (111 tools)
|
|
333
|
+
- Auth: `npx get-claudia google` for guided setup
|
|
334
|
+
|
|
335
|
+
Both options can coexist in `.mcp.json`. When both are present, I use whichever tools are available. If the MCP tools aren't responding or you see authentication errors, the user needs to set up their Google Cloud credentials. See the **Google Integration Setup** section below.
|
|
325
336
|
|
|
326
337
|
**Rube (500+ Apps):** Rube (by Composio) is an optional MCP aggregator that connects Claudia to hundreds of apps through a single server. Each user creates their own free Rube account, connects the apps they want via one-click OAuth, and Claudia gets access to all of them through one MCP connection.
|
|
327
338
|
|
|
@@ -346,7 +357,7 @@ If a user asks about connecting apps, integrations, or any of the services liste
|
|
|
346
357
|
| **Calendar** | Google Calendar, Outlook Calendar, Calendly |
|
|
347
358
|
| **And 500+ more** | Browse the full list at [rube.app](https://rube.app) |
|
|
348
359
|
|
|
349
|
-
**External integrations** (Google Workspace, Rube, Brave Search) are optional add-ons that extend what I can see and do. I work fully without them. The core value is relationships and context.
|
|
360
|
+
**External integrations** (Gmail, Calendar, Google Workspace, Rube, Brave Search) are optional add-ons that extend what I can see and do. I work fully without them. The core value is relationships and context.
|
|
350
361
|
|
|
351
362
|
### Rube Setup (Guide Users Through This)
|
|
352
363
|
|
|
@@ -401,13 +412,40 @@ The MCP tools from Rube will have names like `SLACK_SEND_MESSAGE`, `NOTION_CREAT
|
|
|
401
412
|
| Rate limited | Rube has usage limits on the free tier. The user may need to upgrade at rube.app/pricing. |
|
|
402
413
|
| Want to disconnect an app | Go to Rube dashboard and disconnect the app there. No Claudia config changes needed. |
|
|
403
414
|
|
|
404
|
-
**Rube vs.
|
|
415
|
+
**Rube vs. direct Google MCPs:** Rube works alongside (not instead of) the direct Google MCP servers (gmail, google-calendar, or workspace-mcp). Direct servers give a connection with no intermediary but require Google Cloud setup. Rube gives one setup for everything but routes data through Composio servers. All can coexist. If a user has both direct Google MCPs and Rube's Google apps connected, prefer the direct MCP tools.
|
|
405
416
|
|
|
406
417
|
### Google Integration Setup
|
|
407
418
|
|
|
408
|
-
|
|
419
|
+
Both Google integration paths require a Google Cloud project with OAuth credentials. The same GCP project works for either option.
|
|
409
420
|
|
|
410
|
-
|
|
421
|
+
**Option A: Gmail + Calendar MCPs (lightweight)**
|
|
422
|
+
|
|
423
|
+
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
|
|
424
|
+
2. Create a new project (or select an existing one)
|
|
425
|
+
3. Enable the **Gmail API** and **Google Calendar API** in APIs & Services > Library
|
|
426
|
+
4. Create OAuth credentials (APIs & Services > Credentials > OAuth client ID, Desktop app type)
|
|
427
|
+
5. Download the OAuth JSON file as `gcp-oauth.keys.json`
|
|
428
|
+
6. Authenticate each service:
|
|
429
|
+
```
|
|
430
|
+
npx @gongrzhe/server-gmail-autoauth-mcp auth
|
|
431
|
+
npx @gongrzhe/server-calendar-autoauth-mcp auth
|
|
432
|
+
```
|
|
433
|
+
Each opens your browser for Google sign-in. Tokens stored at `~/.gmail-mcp/` and `~/.calendar-mcp/`.
|
|
434
|
+
7. Set the paths in `.mcp.json`:
|
|
435
|
+
```json
|
|
436
|
+
"gmail": {
|
|
437
|
+
"env": {
|
|
438
|
+
"GMAIL_OAUTH_PATH": "~/.gmail-mcp/gcp-oauth.keys.json",
|
|
439
|
+
"GMAIL_CREDENTIALS_PATH": "~/.gmail-mcp/credentials.json"
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
(Same pattern for `google-calendar` with `~/.calendar-mcp/` paths.)
|
|
444
|
+
8. Restart Claude Code.
|
|
445
|
+
|
|
446
|
+
**Option B: Google Workspace MCP (all-in-one)**
|
|
447
|
+
|
|
448
|
+
**Recommended:** Run `npx get-claudia google` for a guided setup that generates a one-click API enablement URL.
|
|
411
449
|
|
|
412
450
|
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
|
|
413
451
|
2. Create a new project (or select an existing one)
|
|
@@ -443,7 +481,7 @@ The workspace-mcp server requires your own Google Cloud credentials. Each user s
|
|
|
443
481
|
7. Restart Claude Code. On first run, the server opens your browser for Google sign-in. Tokens are stored locally for future sessions.
|
|
444
482
|
8. **Re-authentication after enabling new APIs:** If you enable additional APIs after your initial sign-in, you must re-authenticate. Delete `~/.workspace-mcp/token.json` and restart Claude Code to trigger a new sign-in with the updated scopes.
|
|
445
483
|
|
|
446
|
-
**
|
|
484
|
+
**Using both:** Option A and Option B can coexist. If you already have the standalone Gmail/Calendar MCPs and want to add Drive, Docs, etc., just add the `google_workspace` entry alongside them.
|
|
447
485
|
|
|
448
486
|
---
|
|
449
487
|
|