Files
waggle-os/packages/hive-mind-mcp-server/src/tools/workspace.ts
Oleg Maslov 0c3e2ead3b
Some checks failed
Installer Smoke / installer-smoke (push) Has been cancelled
moving
2026-09-02 10:10:29 +02:00

103 lines
3.3 KiB
TypeScript

/**
* Workspace tools — list_workspaces + create_workspace.
* Wraps WorkspaceManager from @waggle/hive-mind-core.
*/
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';
import { getWorkspaceManager, getWorkspaceMind, getFrameStore, getKnowledgeGraph } from '../core/setup.js';
export function registerWorkspaceTools(server: McpServer): void {
// ── list_workspaces ─────────────────────────────────────────────
server.tool(
'list_workspaces',
'List all workspaces with their configuration and memory stats.',
{},
async () => {
const wm = getWorkspaceManager();
const workspaces = wm.list();
// Get personal mind stats
const personalFrameStore = getFrameStore();
const personalKg = getKnowledgeGraph();
const personalStats = personalFrameStore.getStats();
const personalEntityCount = personalKg.getEntityCount();
const result = {
personal: {
frames: personalStats.total,
by_type: personalStats.byType,
by_importance: personalStats.byImportance,
entities: personalEntityCount,
},
workspaces: workspaces.map(ws => {
// Try to get workspace mind stats (non-fatal if unavailable)
let wsStats = { frames: 0, entities: 0 };
try {
const mind = getWorkspaceMind(ws.id);
if (mind) {
const fs = mind.frameStore.getStats();
const ec = mind.knowledgeGraph.getEntityCount();
wsStats = { frames: fs.total, entities: ec };
}
} catch { /* workspace mind not accessible */ }
return {
id: ws.id,
name: ws.name,
group: ws.group,
icon: ws.icon ?? null,
model: ws.model ?? null,
created: ws.created,
...wsStats,
};
}),
default_workspace: wm.getDefault(),
};
return {
content: [{
type: 'text' as const,
text: JSON.stringify(result, null, 2),
}],
};
},
);
// ── create_workspace ────────────────────────────────────────────
server.tool(
'create_workspace',
'Create a new workspace with its own isolated memory mind.',
{
name: z.string().describe('Workspace name'),
group: z.string().optional().describe('Group/category. Defaults to "general"'),
icon: z.string().optional().describe('Optional short icon (emoji)'),
model: z.string().optional().describe('Optional default model id for this workspace'),
},
async ({ name, group, icon, model }) => {
const wm = getWorkspaceManager();
const ws = wm.create({
name,
group: group ?? 'general',
...(icon !== undefined && { icon }),
...(model !== undefined && { model }),
});
return {
content: [{
type: 'text' as const,
text: JSON.stringify({
id: ws.id,
name: ws.name,
group: ws.group,
icon: ws.icon ?? null,
model: ws.model ?? null,
created: ws.created,
}, null, 2),
}],
};
},
);
}