get-claudia 1.53.0 → 1.53.2
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
CHANGED
|
@@ -2,6 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Claudia will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## 1.53.2 (2026-03-04)
|
|
6
|
+
|
|
7
|
+
### Re-enable Gmail and Calendar MCPs
|
|
8
|
+
|
|
9
|
+
Gmail and Calendar MCP servers were disabled in v1.53.1 as a workaround for Claude Code bug #17962 (multiple stdio servers). Multiple stdio servers now work reliably, so these are re-enabled.
|
|
10
|
+
|
|
11
|
+
- **Gmail and Calendar enabled by default** -- `.mcp.json.example` ships `gmail` and `google-calendar` as active entries (no `_disabled_` prefix). Both require Google Cloud credentials (see Google Integration Setup in CLAUDE.md).
|
|
12
|
+
- **Restore function re-enables Gmail/Calendar** -- `restoreMcpServers()` now also restores `gmail` and `google-calendar` from `_disabled_mcpServers` on upgrade. Additionally handles `_disabled_`-prefixed keys in `mcpServers` itself.
|
|
13
|
+
- **Diagnose skill updated** -- Removed multiple-stdio warning (Step 1b) and the advice to disable Gmail/Calendar. Step 1b now simply lists active servers without warning about conflicts.
|
|
14
|
+
- **Removed stdio_warning from config notes** -- `.mcp.json.example` no longer warns about multiple stdio servers or suggests disabling Gmail/Calendar.
|
|
15
|
+
|
|
16
|
+
## 1.53.1 (2026-03-04)
|
|
17
|
+
|
|
18
|
+
### The One-Stdio Fix: Memory Tools Actually Connect
|
|
19
|
+
|
|
20
|
+
The daemon was healthy, all 26 tools registered, preflight passed, but tools silently vanished from Claude Code's palette. Root cause: `.mcp.json.example` shipped with 4 active stdio MCP servers. Claude Code bug [#17962](https://github.com/anthropics/claude-code/issues/17962) means only one stdio server connects reliably. Additionally, the daemon's JSON schemas used union type shorthand (`["integer","string"]`) that Claude Code's Zod validator may reject ([#10031](https://github.com/anthropics/claude-code/issues/10031)).
|
|
21
|
+
|
|
22
|
+
- **Disable extra stdio servers by default** -- `.mcp.json.example` now ships gmail and google-calendar as `_disabled_` prefixed keys. Only `claudia-memory` is active as stdio. Matches the v1.49.0 pattern that worked.
|
|
23
|
+
- **Rube switched to HTTP transport** -- Rube (Composio) entry changed from `command: npx` (stdio) to `type: http` with `url: https://mcp.composio.dev`. No stdio conflict, no slot consumed.
|
|
24
|
+
- **Fix JSON Schema union types** -- Tool schemas changed from `["integer","string"]` and `["array","string"]` to simple `"string"` and `"array"`. The `_coerce_int()` and `_coerce_arg()` helpers already handle type conversion at runtime, so the unions were unnecessary and potentially caused all tools to vanish.
|
|
25
|
+
- **Multi-stdio detection in installer** -- New `warnMultipleStdioServers()` warns during install if >1 stdio server is active. New "MCP Config" progress step shows stdio server count.
|
|
26
|
+
- **Post-install component checklist** -- Installer now shows a component summary (Personality & Skills, Memory Daemon, MCP Config, Stdio Servers) with status indicators after install/upgrade.
|
|
27
|
+
- **Diagnose skill: Step 1b** -- New diagnostic step counts active stdio servers and flags multiples. New common issue entry for "Multiple stdio MCP servers" with fix instructions.
|
|
28
|
+
- **Fix `restoreMcpServers()`** -- Restore function no longer re-enables gmail/google-calendar as active stdio servers on upgrade. Only `claudia-memory` is restored from `_disabled_mcpServers`.
|
|
29
|
+
- **Closed GitHub issues** -- [#7](https://github.com/kbanc85/claudia/issues/7) (migration 20 UNIQUE constraint) and [#8](https://github.com/kbanc85/claudia/issues/8) (schema.sql missing from npm) were both fixed in earlier releases by the removal of the Node.js CLI.
|
|
30
|
+
|
|
5
31
|
## 1.53.0 (2026-03-04)
|
|
6
32
|
|
|
7
33
|
### The Reliability Release: Self-Diagnosing MCP Daemon
|
package/bin/index.js
CHANGED
|
@@ -96,6 +96,7 @@ const STEPS = [
|
|
|
96
96
|
{ id: 'models', label: 'AI Models' },
|
|
97
97
|
{ id: 'memory', label: 'Memory System' },
|
|
98
98
|
{ id: 'daemon', label: 'Memory Daemon' },
|
|
99
|
+
{ id: 'mcp', label: 'MCP Config' },
|
|
99
100
|
{ id: 'vault', label: 'Obsidian Vault' },
|
|
100
101
|
{ id: 'health', label: 'Health Check' },
|
|
101
102
|
];
|
|
@@ -818,9 +819,23 @@ async function main() {
|
|
|
818
819
|
await ensureLaunchAgent(venvPython, targetPath);
|
|
819
820
|
}
|
|
820
821
|
|
|
821
|
-
//
|
|
822
|
+
// MCP Config step: verify .mcp.json is correct and check stdio server count
|
|
823
|
+
renderer.update('mcp', 'active', 'checking .mcp.json...');
|
|
824
|
+
const mcpCheckResult = checkMcpConfig(targetPath);
|
|
825
|
+
if (mcpCheckResult.hasDaemon && mcpCheckResult.stdioCount <= 1) {
|
|
826
|
+
renderer.update('mcp', 'done', `claudia-memory configured${mcpCheckResult.stdioCount === 1 ? '' : ' (no stdio servers?)'}`);
|
|
827
|
+
if (!supportsInPlace) renderer.appendLine('mcp', 'done', 'claudia-memory configured');
|
|
828
|
+
} else if (mcpCheckResult.hasDaemon && mcpCheckResult.stdioCount > 1) {
|
|
829
|
+
renderer.update('mcp', 'warn', `${mcpCheckResult.stdioCount} stdio servers (only 1 reliable)`);
|
|
830
|
+
if (!supportsInPlace) renderer.appendLine('mcp', 'warn', `${mcpCheckResult.stdioCount} stdio servers`);
|
|
831
|
+
} else {
|
|
832
|
+
renderer.update('mcp', 'warn', 'claudia-memory not in .mcp.json');
|
|
833
|
+
if (!supportsInPlace) renderer.appendLine('mcp', 'warn', 'daemon not configured');
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
// Vault step: handled below
|
|
822
837
|
|
|
823
|
-
//
|
|
838
|
+
// Health Check: check daemon health endpoint or verify daemon can import
|
|
824
839
|
renderer.update('health', 'active', 'verifying...');
|
|
825
840
|
let healthOk = false;
|
|
826
841
|
|
|
@@ -950,16 +965,34 @@ async function main() {
|
|
|
950
965
|
|
|
951
966
|
console.log('');
|
|
952
967
|
console.log(`${colors.dim}${'━'.repeat(46)}${colors.reset}`);
|
|
953
|
-
|
|
968
|
+
|
|
969
|
+
// Post-install component summary
|
|
970
|
+
const mcpCheck = checkMcpConfig(targetPath);
|
|
971
|
+
const components = [
|
|
972
|
+
{ name: 'Personality & Skills', ok: true },
|
|
973
|
+
{ name: 'Memory Daemon', ok: memoryInstalled },
|
|
974
|
+
{ name: 'MCP Config', ok: mcpCheck.hasDaemon },
|
|
975
|
+
];
|
|
976
|
+
|
|
977
|
+
console.log(` ${colors.bold}Components:${colors.reset}`);
|
|
978
|
+
for (const c of components) {
|
|
979
|
+
if (c.ok && !c.warn) {
|
|
980
|
+
console.log(` ${colors.green}✓${colors.reset} ${c.name}`);
|
|
981
|
+
} else if (c.warn) {
|
|
982
|
+
console.log(` ${colors.yellow}⚠${colors.reset} ${c.name} ${colors.dim}${c.warn}${colors.reset}`);
|
|
983
|
+
} else {
|
|
984
|
+
console.log(` ${colors.yellow}○${colors.reset} ${c.name} ${colors.dim}(not ready)${colors.reset}`);
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
console.log('');
|
|
989
|
+
console.log(` ${colors.bold}Next:${colors.reset} Open Claude Code:`);
|
|
954
990
|
console.log(` ${colors.cyan}${cdCmd}claude${colors.reset}`);
|
|
955
991
|
|
|
956
992
|
if (!memoryInstalled) {
|
|
957
993
|
console.log('');
|
|
958
994
|
console.log(` ${colors.dim}Memory requires Python 3.10+, the claudia-memory daemon, and Ollama.${colors.reset}`);
|
|
959
995
|
console.log(` ${colors.dim}Re-run setup after installing Python and Ollama.${colors.reset}`);
|
|
960
|
-
} else {
|
|
961
|
-
console.log('');
|
|
962
|
-
console.log(` ${colors.dim}Memory system ready. Claudia will remember across sessions.${colors.reset}`);
|
|
963
996
|
}
|
|
964
997
|
|
|
965
998
|
console.log('');
|
|
@@ -969,9 +1002,10 @@ async function main() {
|
|
|
969
1002
|
|
|
970
1003
|
/**
|
|
971
1004
|
* Restore MCP servers that were moved to _disabled_mcpServers by earlier versions.
|
|
972
|
-
* - Gmail/Calendar: v1.51.9-v1.51.12 treated them as legacy, now restored.
|
|
973
1005
|
* - claudia-memory: v1.51.13+ treated the daemon as legacy (replaced by CLI),
|
|
974
1006
|
* but MCP is the primary memory interface as of v1.51.22.
|
|
1007
|
+
* - Gmail/Calendar: v1.53.1 disabled these due to Claude Code bug #17962,
|
|
1008
|
+
* but multiple stdio servers now work reliably. Restore them.
|
|
975
1009
|
*/
|
|
976
1010
|
function restoreMcpServers(targetPath) {
|
|
977
1011
|
const mcpPath = join(targetPath, '.mcp.json');
|
|
@@ -983,7 +1017,8 @@ function restoreMcpServers(targetPath) {
|
|
|
983
1017
|
if (!config._disabled_mcpServers) return;
|
|
984
1018
|
if (!config.mcpServers) config.mcpServers = {};
|
|
985
1019
|
|
|
986
|
-
|
|
1020
|
+
// Restore all previously disabled servers (memory, gmail, google-calendar)
|
|
1021
|
+
const toRestore = ['claudia-memory', 'claudia_memory', 'gmail', 'google-calendar'];
|
|
987
1022
|
let changed = false;
|
|
988
1023
|
const restored = [];
|
|
989
1024
|
|
|
@@ -991,6 +1026,7 @@ function restoreMcpServers(targetPath) {
|
|
|
991
1026
|
if (config._disabled_mcpServers[key] && !config.mcpServers[key]) {
|
|
992
1027
|
const serverConfig = { ...config._disabled_mcpServers[key] };
|
|
993
1028
|
delete serverConfig._replaced_by;
|
|
1029
|
+
delete serverConfig._warning;
|
|
994
1030
|
config.mcpServers[key] = serverConfig;
|
|
995
1031
|
delete config._disabled_mcpServers[key];
|
|
996
1032
|
changed = true;
|
|
@@ -998,6 +1034,21 @@ function restoreMcpServers(targetPath) {
|
|
|
998
1034
|
}
|
|
999
1035
|
}
|
|
1000
1036
|
|
|
1037
|
+
// Also rename _disabled_ prefixed keys in mcpServers itself
|
|
1038
|
+
for (const key of Object.keys(config.mcpServers)) {
|
|
1039
|
+
if (key.startsWith('_disabled_')) {
|
|
1040
|
+
const realKey = key.replace('_disabled_', '');
|
|
1041
|
+
if (['gmail', 'google-calendar'].includes(realKey) && !config.mcpServers[realKey]) {
|
|
1042
|
+
const serverConfig = { ...config.mcpServers[key] };
|
|
1043
|
+
delete serverConfig._warning;
|
|
1044
|
+
config.mcpServers[realKey] = serverConfig;
|
|
1045
|
+
delete config.mcpServers[key];
|
|
1046
|
+
changed = true;
|
|
1047
|
+
restored.push(realKey);
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1001
1052
|
// Clean up _disabled_mcpServers if it's now empty
|
|
1002
1053
|
if (config._disabled_mcpServers && Object.keys(config._disabled_mcpServers).length === 0) {
|
|
1003
1054
|
delete config._disabled_mcpServers;
|
|
@@ -1055,6 +1106,28 @@ function ensureDaemonMcpConfig(targetPath, venvPythonPath) {
|
|
|
1055
1106
|
writeFileSync(mcpPath, JSON.stringify(config, null, 2) + '\n');
|
|
1056
1107
|
}
|
|
1057
1108
|
|
|
1109
|
+
/**
|
|
1110
|
+
* Check .mcp.json configuration and return status.
|
|
1111
|
+
* Returns { hasDaemon, stdioCount, stdioServers }.
|
|
1112
|
+
*/
|
|
1113
|
+
function checkMcpConfig(targetPath) {
|
|
1114
|
+
const mcpPath = join(targetPath, '.mcp.json');
|
|
1115
|
+
if (!existsSync(mcpPath)) return { hasDaemon: false, stdioCount: 0, stdioServers: [] };
|
|
1116
|
+
try {
|
|
1117
|
+
const config = JSON.parse(readFileSync(mcpPath, 'utf-8'));
|
|
1118
|
+
const servers = config.mcpServers || {};
|
|
1119
|
+
const hasDaemon = !!servers['claudia-memory'];
|
|
1120
|
+
const stdioServers = Object.entries(servers)
|
|
1121
|
+
.filter(([key]) => !key.startsWith('_'))
|
|
1122
|
+
.filter(([, val]) => !val._disabled && (!val.type || val.type === 'stdio'))
|
|
1123
|
+
.map(([key]) => key);
|
|
1124
|
+
return { hasDaemon, stdioCount: stdioServers.length, stdioServers };
|
|
1125
|
+
} catch {
|
|
1126
|
+
return { hasDaemon: false, stdioCount: 0, stdioServers: [] };
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
|
|
1058
1131
|
/**
|
|
1059
1132
|
* Register (or update) the macOS LaunchAgent for the standalone daemon.
|
|
1060
1133
|
* The standalone daemon runs 24/7 for scheduled jobs (consolidation, decay, vault sync).
|
|
@@ -1614,7 +1614,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
1614
1614
|
"default": "fact",
|
|
1615
1615
|
},
|
|
1616
1616
|
"about": {
|
|
1617
|
-
"type":
|
|
1617
|
+
"type": "array",
|
|
1618
1618
|
"items": {"type": "string"},
|
|
1619
1619
|
"description": "Entity names this memory relates to (people, projects, etc.)",
|
|
1620
1620
|
},
|
|
@@ -1668,12 +1668,12 @@ async def list_tools() -> ListToolsResult:
|
|
|
1668
1668
|
"description": "What to search for (required unless ids is provided)",
|
|
1669
1669
|
},
|
|
1670
1670
|
"limit": {
|
|
1671
|
-
"type":
|
|
1671
|
+
"type": "string",
|
|
1672
1672
|
"description": "Maximum number of results",
|
|
1673
1673
|
"default": 10,
|
|
1674
1674
|
},
|
|
1675
1675
|
"types": {
|
|
1676
|
-
"type":
|
|
1676
|
+
"type": "array",
|
|
1677
1677
|
"items": {"type": "string"},
|
|
1678
1678
|
"description": "Filter by memory types (fact, preference, observation, learning, commitment)",
|
|
1679
1679
|
},
|
|
@@ -1687,7 +1687,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
1687
1687
|
"default": False,
|
|
1688
1688
|
},
|
|
1689
1689
|
"ids": {
|
|
1690
|
-
"type":
|
|
1690
|
+
"type": "array",
|
|
1691
1691
|
"items": {"type": "integer"},
|
|
1692
1692
|
"description": "Fetch specific memories by ID (skips search). Use after a compact search to get full content.",
|
|
1693
1693
|
},
|
|
@@ -1711,7 +1711,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
1711
1711
|
"description": "Name of the person, project, or entity",
|
|
1712
1712
|
},
|
|
1713
1713
|
"limit": {
|
|
1714
|
-
"type":
|
|
1714
|
+
"type": "string",
|
|
1715
1715
|
"description": "Maximum number of memories to return",
|
|
1716
1716
|
"default": 20,
|
|
1717
1717
|
},
|
|
@@ -1798,7 +1798,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
1798
1798
|
"type": "object",
|
|
1799
1799
|
"properties": {
|
|
1800
1800
|
"episode_id": {
|
|
1801
|
-
"type":
|
|
1801
|
+
"type": "string",
|
|
1802
1802
|
"description": "Episode ID from buffer_turn calls during the session",
|
|
1803
1803
|
},
|
|
1804
1804
|
"narrative": {
|
|
@@ -1812,7 +1812,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
1812
1812
|
),
|
|
1813
1813
|
},
|
|
1814
1814
|
"facts": {
|
|
1815
|
-
"type":
|
|
1815
|
+
"type": "array",
|
|
1816
1816
|
"items": {
|
|
1817
1817
|
"type": "object",
|
|
1818
1818
|
"properties": {
|
|
@@ -1846,7 +1846,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
1846
1846
|
"description": "Structured facts, preferences, observations, learnings extracted from the session",
|
|
1847
1847
|
},
|
|
1848
1848
|
"commitments": {
|
|
1849
|
-
"type":
|
|
1849
|
+
"type": "array",
|
|
1850
1850
|
"items": {
|
|
1851
1851
|
"type": "object",
|
|
1852
1852
|
"properties": {
|
|
@@ -1874,7 +1874,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
1874
1874
|
"description": "Commitments or promises made during the session",
|
|
1875
1875
|
},
|
|
1876
1876
|
"entities": {
|
|
1877
|
-
"type":
|
|
1877
|
+
"type": "array",
|
|
1878
1878
|
"items": {
|
|
1879
1879
|
"type": "object",
|
|
1880
1880
|
"properties": {
|
|
@@ -1895,7 +1895,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
1895
1895
|
"description": "New or updated entities mentioned during the session",
|
|
1896
1896
|
},
|
|
1897
1897
|
"relationships": {
|
|
1898
|
-
"type":
|
|
1898
|
+
"type": "array",
|
|
1899
1899
|
"items": {
|
|
1900
1900
|
"type": "object",
|
|
1901
1901
|
"properties": {
|
|
@@ -1909,12 +1909,12 @@ async def list_tools() -> ListToolsResult:
|
|
|
1909
1909
|
"description": "Relationships between entities observed during the session",
|
|
1910
1910
|
},
|
|
1911
1911
|
"key_topics": {
|
|
1912
|
-
"type":
|
|
1912
|
+
"type": "array",
|
|
1913
1913
|
"items": {"type": "string"},
|
|
1914
1914
|
"description": "Main topics discussed in the session",
|
|
1915
1915
|
},
|
|
1916
1916
|
"reflections": {
|
|
1917
|
-
"type":
|
|
1917
|
+
"type": "array",
|
|
1918
1918
|
"items": {
|
|
1919
1919
|
"type": "object",
|
|
1920
1920
|
"properties": {
|
|
@@ -1971,7 +1971,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
1971
1971
|
"description": "Semantic search query (optional). If omitted, returns recent high-importance reflections.",
|
|
1972
1972
|
},
|
|
1973
1973
|
"types": {
|
|
1974
|
-
"type":
|
|
1974
|
+
"type": "array",
|
|
1975
1975
|
"items": {
|
|
1976
1976
|
"type": "string",
|
|
1977
1977
|
"enum": ["observation", "pattern", "learning", "question"],
|
|
@@ -1983,7 +1983,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
1983
1983
|
"description": "Filter to reflections about a specific entity (optional)",
|
|
1984
1984
|
},
|
|
1985
1985
|
"limit": {
|
|
1986
|
-
"type":
|
|
1986
|
+
"type": "string",
|
|
1987
1987
|
"default": 10,
|
|
1988
1988
|
"description": "Maximum results to return",
|
|
1989
1989
|
},
|
|
@@ -1994,7 +1994,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
1994
1994
|
"description": "Action: get (list), search (semantic), update, delete",
|
|
1995
1995
|
},
|
|
1996
1996
|
"reflection_id": {
|
|
1997
|
-
"type":
|
|
1997
|
+
"type": "string",
|
|
1998
1998
|
"description": "Reflection ID (required for update/delete actions)",
|
|
1999
1999
|
},
|
|
2000
2000
|
"content": {
|
|
@@ -2019,7 +2019,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2019
2019
|
"type": "object",
|
|
2020
2020
|
"properties": {
|
|
2021
2021
|
"operations": {
|
|
2022
|
-
"type":
|
|
2022
|
+
"type": "array",
|
|
2023
2023
|
"description": "Array of operations to execute in order",
|
|
2024
2024
|
"items": {
|
|
2025
2025
|
"type": "object",
|
|
@@ -2181,7 +2181,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2181
2181
|
"description": "List of entity names to summarize",
|
|
2182
2182
|
},
|
|
2183
2183
|
"top_facts_limit": {
|
|
2184
|
-
"type":
|
|
2184
|
+
"type": "string",
|
|
2185
2185
|
"description": "Maximum top facts per entity (default 5)",
|
|
2186
2186
|
"default": 5,
|
|
2187
2187
|
},
|
|
@@ -2234,7 +2234,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2234
2234
|
"description": "Name of the person to project health for",
|
|
2235
2235
|
},
|
|
2236
2236
|
"days_ahead": {
|
|
2237
|
-
"type":
|
|
2237
|
+
"type": "string",
|
|
2238
2238
|
"description": "How far ahead to project (default 30)",
|
|
2239
2239
|
"default": 30,
|
|
2240
2240
|
},
|
|
@@ -2261,7 +2261,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2261
2261
|
"description": "Which temporal query to run",
|
|
2262
2262
|
},
|
|
2263
2263
|
"days": {
|
|
2264
|
-
"type":
|
|
2264
|
+
"type": "string",
|
|
2265
2265
|
"description": "Look ahead window in days (for upcoming, default 14)",
|
|
2266
2266
|
"default": 14,
|
|
2267
2267
|
},
|
|
@@ -2279,7 +2279,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2279
2279
|
"description": "Entity name (for timeline, or optional filter for since)",
|
|
2280
2280
|
},
|
|
2281
2281
|
"limit": {
|
|
2282
|
-
"type":
|
|
2282
|
+
"type": "string",
|
|
2283
2283
|
"description": "Maximum results",
|
|
2284
2284
|
"default": 50,
|
|
2285
2285
|
},
|
|
@@ -2319,12 +2319,12 @@ async def list_tools() -> ListToolsResult:
|
|
|
2319
2319
|
"description": "Second entity (for path operation)",
|
|
2320
2320
|
},
|
|
2321
2321
|
"max_depth": {
|
|
2322
|
-
"type":
|
|
2322
|
+
"type": "string",
|
|
2323
2323
|
"description": "Maximum hops to search (for path, default 4)",
|
|
2324
2324
|
"default": 4,
|
|
2325
2325
|
},
|
|
2326
2326
|
"min_connections": {
|
|
2327
|
-
"type":
|
|
2327
|
+
"type": "string",
|
|
2328
2328
|
"description": "Minimum relationships to be a hub (for hubs, default 5)",
|
|
2329
2329
|
"default": 5,
|
|
2330
2330
|
},
|
|
@@ -2334,7 +2334,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2334
2334
|
"description": "Filter by entity type (for hubs)",
|
|
2335
2335
|
},
|
|
2336
2336
|
"days": {
|
|
2337
|
-
"type":
|
|
2337
|
+
"type": "string",
|
|
2338
2338
|
"description": "Days without activity (for dormant, default 60)",
|
|
2339
2339
|
"default": 60,
|
|
2340
2340
|
},
|
|
@@ -2344,7 +2344,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2344
2344
|
"default": 0.3,
|
|
2345
2345
|
},
|
|
2346
2346
|
"limit": {
|
|
2347
|
-
"type":
|
|
2347
|
+
"type": "string",
|
|
2348
2348
|
"description": "Maximum results to return",
|
|
2349
2349
|
"default": 20,
|
|
2350
2350
|
},
|
|
@@ -2384,7 +2384,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2384
2384
|
"description": "Entity description (for create)",
|
|
2385
2385
|
},
|
|
2386
2386
|
"aliases": {
|
|
2387
|
-
"type":
|
|
2387
|
+
"type": "array",
|
|
2388
2388
|
"items": {"type": "string"},
|
|
2389
2389
|
"description": "Alternative names (for create)",
|
|
2390
2390
|
},
|
|
@@ -2393,20 +2393,20 @@ async def list_tools() -> ListToolsResult:
|
|
|
2393
2393
|
"description": "Search query (for search)",
|
|
2394
2394
|
},
|
|
2395
2395
|
"types": {
|
|
2396
|
-
"type":
|
|
2396
|
+
"type": "array",
|
|
2397
2397
|
"items": {"type": "string"},
|
|
2398
2398
|
"description": "Filter by entity types (for search)",
|
|
2399
2399
|
},
|
|
2400
2400
|
"source_id": {
|
|
2401
|
-
"type":
|
|
2401
|
+
"type": "string",
|
|
2402
2402
|
"description": "Entity ID to merge FROM (for merge)",
|
|
2403
2403
|
},
|
|
2404
2404
|
"target_id": {
|
|
2405
|
-
"type":
|
|
2405
|
+
"type": "string",
|
|
2406
2406
|
"description": "Entity ID to merge INTO (for merge)",
|
|
2407
2407
|
},
|
|
2408
2408
|
"entity_id": {
|
|
2409
|
-
"type":
|
|
2409
|
+
"type": "string",
|
|
2410
2410
|
"description": "Entity ID (for delete)",
|
|
2411
2411
|
},
|
|
2412
2412
|
"reason": {
|
|
@@ -2414,7 +2414,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2414
2414
|
"description": "Reason for merge or delete",
|
|
2415
2415
|
},
|
|
2416
2416
|
"entities": {
|
|
2417
|
-
"type":
|
|
2417
|
+
"type": "array",
|
|
2418
2418
|
"items": {"type": "string"},
|
|
2419
2419
|
"description": "Entity names for overview",
|
|
2420
2420
|
},
|
|
@@ -2429,7 +2429,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2429
2429
|
"default": True,
|
|
2430
2430
|
},
|
|
2431
2431
|
"limit": {
|
|
2432
|
-
"type":
|
|
2432
|
+
"type": "string",
|
|
2433
2433
|
"description": "Maximum results (for search, default 10)",
|
|
2434
2434
|
"default": 10,
|
|
2435
2435
|
},
|
|
@@ -2492,7 +2492,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2492
2492
|
"description": "Which modification to perform",
|
|
2493
2493
|
},
|
|
2494
2494
|
"memory_id": {
|
|
2495
|
-
"type":
|
|
2495
|
+
"type": "string",
|
|
2496
2496
|
"description": "Memory ID (for correct, invalidate)",
|
|
2497
2497
|
},
|
|
2498
2498
|
"correction": {
|
|
@@ -2545,7 +2545,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2545
2545
|
"description": "What the assistant said (for buffer)",
|
|
2546
2546
|
},
|
|
2547
2547
|
"episode_id": {
|
|
2548
|
-
"type":
|
|
2548
|
+
"type": "string",
|
|
2549
2549
|
"description": "Episode ID from previous buffer call (for buffer)",
|
|
2550
2550
|
},
|
|
2551
2551
|
"source": {
|
|
@@ -2598,12 +2598,12 @@ async def list_tools() -> ListToolsResult:
|
|
|
2598
2598
|
"description": "Brief summary (for store)",
|
|
2599
2599
|
},
|
|
2600
2600
|
"about": {
|
|
2601
|
-
"type":
|
|
2601
|
+
"type": "array",
|
|
2602
2602
|
"items": {"type": "string"},
|
|
2603
2603
|
"description": "Entity names this document relates to",
|
|
2604
2604
|
},
|
|
2605
2605
|
"memory_ids": {
|
|
2606
|
-
"type":
|
|
2606
|
+
"type": "array",
|
|
2607
2607
|
"items": {"type": "integer"},
|
|
2608
2608
|
"description": "Memory IDs to link (for store)",
|
|
2609
2609
|
},
|
|
@@ -2620,7 +2620,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2620
2620
|
"description": "Filter by entity (for search)",
|
|
2621
2621
|
},
|
|
2622
2622
|
"limit": {
|
|
2623
|
-
"type":
|
|
2623
|
+
"type": "string",
|
|
2624
2624
|
"description": "Maximum results (for search, default 20)",
|
|
2625
2625
|
"default": 20,
|
|
2626
2626
|
},
|
|
@@ -2647,15 +2647,15 @@ async def list_tools() -> ListToolsResult:
|
|
|
2647
2647
|
"description": "Which provenance operation to perform",
|
|
2648
2648
|
},
|
|
2649
2649
|
"memory_id": {
|
|
2650
|
-
"type":
|
|
2650
|
+
"type": "string",
|
|
2651
2651
|
"description": "Memory ID (for trace, or audit by memory)",
|
|
2652
2652
|
},
|
|
2653
2653
|
"entity_id": {
|
|
2654
|
-
"type":
|
|
2654
|
+
"type": "string",
|
|
2655
2655
|
"description": "Entity ID (for audit by entity)",
|
|
2656
2656
|
},
|
|
2657
2657
|
"limit": {
|
|
2658
|
-
"type":
|
|
2658
|
+
"type": "string",
|
|
2659
2659
|
"description": "Maximum audit entries (default 20)",
|
|
2660
2660
|
"default": 20,
|
|
2661
2661
|
},
|
|
@@ -2712,7 +2712,7 @@ async def list_tools() -> ListToolsResult:
|
|
|
2712
2712
|
"description": "What context to build for",
|
|
2713
2713
|
},
|
|
2714
2714
|
"token_budget": {
|
|
2715
|
-
"type":
|
|
2715
|
+
"type": "string",
|
|
2716
2716
|
"description": "Maximum tokens (default: 8000)",
|
|
2717
2717
|
},
|
|
2718
2718
|
"include_sacred": {
|
package/package.json
CHANGED
|
@@ -36,6 +36,24 @@ If the Python binary in the `command` field doesn't exist:
|
|
|
36
36
|
ls -la ~/.claudia/daemon/venv/bin/python 2>/dev/null || echo "Daemon venv not found"
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
+
### Step 1b: Check Active MCP Servers
|
|
40
|
+
|
|
41
|
+
List all active MCP servers (entries without `_disabled` prefix):
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
python3 -c "
|
|
45
|
+
import json
|
|
46
|
+
c = json.load(open('.mcp.json'))
|
|
47
|
+
servers = c.get('mcpServers', {})
|
|
48
|
+
active = [k for k, v in servers.items() if not k.startswith('_')]
|
|
49
|
+
stdio = [k for k in active if servers[k].get('type', 'stdio') == 'stdio']
|
|
50
|
+
http = [k for k in active if servers[k].get('type') == 'http']
|
|
51
|
+
print(f'Active servers ({len(active)}): {chr(44).join(active)}')
|
|
52
|
+
print(f' stdio: {chr(44).join(stdio) or \"none\"}')
|
|
53
|
+
print(f' http: {chr(44).join(http) or \"none\"}')
|
|
54
|
+
"
|
|
55
|
+
```
|
|
56
|
+
|
|
39
57
|
### Step 2: Run Preflight Check
|
|
40
58
|
|
|
41
59
|
The daemon has a built-in preflight validator that tests all 11 startup steps:
|
|
@@ -108,6 +126,7 @@ Format the diagnosis as:
|
|
|
108
126
|
| Component | Status | Details |
|
|
109
127
|
|-----------|--------|---------|
|
|
110
128
|
| .mcp.json config | ✅/❌ | [daemon entry present/missing] |
|
|
129
|
+
| Active MCP servers | ✅/⚠️ | [list of active servers] |
|
|
111
130
|
| Daemon Python binary | ✅/❌ | [path exists/missing] |
|
|
112
131
|
| Preflight | ✅/❌ | [all passed / N failures] |
|
|
113
132
|
| Session manifest | ✅/❌ | [running/died/never started] |
|
|
@@ -17,25 +17,26 @@
|
|
|
17
17
|
"_setup": "Requires your own Google Cloud credentials. See Google Integration Setup in CLAUDE.md, then run: npx @gongrzhe/server-calendar-autoauth-mcp auth"
|
|
18
18
|
},
|
|
19
19
|
"rube": {
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
20
|
+
"type": "http",
|
|
21
|
+
"url": "https://mcp.composio.dev",
|
|
22
|
+
"headers": {
|
|
23
|
+
"x-composio-api-key": ""
|
|
24
24
|
},
|
|
25
|
-
"
|
|
25
|
+
"_description": "Rube by Composio -- 500+ app integrations (HTTP, no stdio conflict)",
|
|
26
|
+
"_setup": "Connect 500+ apps via Rube: Slack, Notion, Drive, GitHub, Granola, Otter.ai, Jira, Linear, Airtable, HubSpot, Stripe, and more. 1) Sign up free at https://rube.app 2) Connect your apps in Rube's marketplace 3) Copy your API key from the dashboard 4) Paste it in x-composio-api-key above 5) Restart Claude Code. See Rube section in CLAUDE.md for full guide."
|
|
26
27
|
}
|
|
27
28
|
},
|
|
28
29
|
|
|
29
30
|
"_notes": {
|
|
30
31
|
"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.",
|
|
31
|
-
"gmail_and_calendar": "Gmail and Calendar
|
|
32
|
-
"rube": "Rube (by Composio) connects 500+ apps through one MCP
|
|
32
|
+
"gmail_and_calendar": "Gmail and Calendar are enabled by default as stdio MCP servers. Each requires Google Cloud credentials (see Google Integration Setup in CLAUDE.md). Alternatively, connect them through Rube (HTTP) for a simpler setup.",
|
|
33
|
+
"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.",
|
|
33
34
|
"security": "Each user authenticates with their own accounts and credentials. OAuth tokens are stored locally on your machine, never shared.",
|
|
34
35
|
"not_included": {
|
|
35
36
|
"filesystem": "Claude Code has native Read/Write/Edit tools",
|
|
36
37
|
"web-search": "Claude Code has native WebSearch",
|
|
37
38
|
"fetch": "Claude Code has native WebFetch"
|
|
38
39
|
},
|
|
39
|
-
"adding_servers": "Add MCP servers here if needed. Find more at mcp.so or github.com/modelcontextprotocol/servers"
|
|
40
|
+
"adding_servers": "Add MCP servers here if needed. Find more at mcp.so or github.com/modelcontextprotocol/servers."
|
|
40
41
|
}
|
|
41
42
|
}
|