@cervellaswarm/mcp-server 0.1.0

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.
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Config Manager for MCP Server
3
+ *
4
+ * Shares configuration with CLI through `conf` package.
5
+ * Same config file = CLI and MCP see same settings.
6
+ *
7
+ * Copyright 2026 Rafa & Cervella
8
+ * Licensed under the Apache License, Version 2.0
9
+ */
10
+ import Conf from "conf";
11
+ // Schema for validation
12
+ const schema = {
13
+ apiKey: { type: "string", default: "" },
14
+ defaultModel: {
15
+ type: "string",
16
+ enum: ["claude-sonnet-4-20250514", "claude-opus-4-5-20251101"],
17
+ default: "claude-sonnet-4-20250514",
18
+ },
19
+ timeout: {
20
+ type: "number",
21
+ minimum: 10000,
22
+ maximum: 600000,
23
+ default: 120000,
24
+ },
25
+ maxRetries: {
26
+ type: "number",
27
+ minimum: 1,
28
+ maximum: 10,
29
+ default: 3,
30
+ },
31
+ verbose: { type: "boolean", default: false },
32
+ telemetry: { type: "boolean", default: false },
33
+ tier: {
34
+ type: "string",
35
+ enum: ["free", "pro", "team", "enterprise"],
36
+ default: "free",
37
+ },
38
+ };
39
+ // Singleton config instance
40
+ // Uses same projectName as CLI = same config file!
41
+ let config = null;
42
+ function getConfig() {
43
+ if (!config) {
44
+ config = new Conf({
45
+ projectName: "cervellaswarm", // Same as CLI!
46
+ schema,
47
+ defaults: {
48
+ apiKey: "",
49
+ defaultModel: "claude-sonnet-4-20250514",
50
+ timeout: 120000,
51
+ maxRetries: 3,
52
+ verbose: false,
53
+ telemetry: false,
54
+ tier: "free",
55
+ },
56
+ });
57
+ }
58
+ return config;
59
+ }
60
+ // ============================================
61
+ // API KEY
62
+ // ============================================
63
+ export function getApiKey() {
64
+ // Environment variable takes priority
65
+ const envKey = process.env.ANTHROPIC_API_KEY;
66
+ if (envKey) {
67
+ return envKey;
68
+ }
69
+ // Fall back to saved config
70
+ const savedKey = getConfig().get("apiKey");
71
+ return savedKey || null;
72
+ }
73
+ export function hasApiKey() {
74
+ return getApiKey() !== null;
75
+ }
76
+ export function getApiKeySource() {
77
+ if (process.env.ANTHROPIC_API_KEY) {
78
+ return "environment";
79
+ }
80
+ if (getConfig().get("apiKey")) {
81
+ return "config";
82
+ }
83
+ return "none";
84
+ }
85
+ // ============================================
86
+ // MODEL & SETTINGS
87
+ // ============================================
88
+ export function getDefaultModel() {
89
+ return getConfig().get("defaultModel");
90
+ }
91
+ export function getTimeout() {
92
+ return getConfig().get("timeout");
93
+ }
94
+ export function getMaxRetries() {
95
+ return getConfig().get("maxRetries");
96
+ }
97
+ export function isVerbose() {
98
+ return getConfig().get("verbose");
99
+ }
100
+ export function getTier() {
101
+ return getConfig().get("tier");
102
+ }
103
+ export function setTier(tier) {
104
+ getConfig().set("tier", tier);
105
+ }
106
+ // ============================================
107
+ // CONFIG PATH (for diagnostics)
108
+ // ============================================
109
+ export function getConfigPath() {
110
+ return getConfig().path;
111
+ }
112
+ export function getConfigDir() {
113
+ const configPath = getConfig().path;
114
+ return configPath.substring(0, configPath.lastIndexOf("/"));
115
+ }
116
+ /**
117
+ * Validate API key by making a minimal test call
118
+ * Returns { valid: boolean, error?: string, warning?: string }
119
+ */
120
+ export async function validateApiKey(key = null) {
121
+ const testKey = key || getApiKey();
122
+ if (!testKey) {
123
+ return { valid: false, error: "No API key provided" };
124
+ }
125
+ if (!testKey.startsWith("sk-ant-")) {
126
+ return { valid: false, error: "Invalid key format (must start with sk-ant-)" };
127
+ }
128
+ try {
129
+ // Dynamic import to avoid loading if not needed
130
+ const Anthropic = (await import("@anthropic-ai/sdk")).default;
131
+ const client = new Anthropic({ apiKey: testKey });
132
+ // Minimal test call - just check if key works
133
+ await client.messages.create({
134
+ model: "claude-sonnet-4-20250514",
135
+ max_tokens: 10,
136
+ messages: [{ role: "user", content: "hi" }],
137
+ });
138
+ return { valid: true };
139
+ }
140
+ catch (error) {
141
+ // Map error codes to user-friendly messages
142
+ const status = error.status;
143
+ const message = error.message;
144
+ if (status === 401) {
145
+ return { valid: false, error: "Invalid API key" };
146
+ }
147
+ if (status === 403) {
148
+ return { valid: false, error: "API key lacks permissions" };
149
+ }
150
+ if (status === 429) {
151
+ // Rate limited but key is valid!
152
+ return { valid: true, warning: "Rate limited, but key is valid" };
153
+ }
154
+ if (status === 500 || status === 503) {
155
+ return { valid: false, error: "Anthropic API temporarily unavailable" };
156
+ }
157
+ return { valid: false, error: message || "Unknown error" };
158
+ }
159
+ }
160
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/config/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CervellaSwarm MCP Server
4
+ *
5
+ * 16 AI agents exposed as MCP tools for Claude Code integration.
6
+ * "Not an assistant - a TEAM."
7
+ *
8
+ * Copyright 2026 Rafa & Cervella
9
+ * Licensed under the Apache License, Version 2.0
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG"}
package/dist/index.js ADDED
@@ -0,0 +1,261 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CervellaSwarm MCP Server
4
+ *
5
+ * 16 AI agents exposed as MCP tools for Claude Code integration.
6
+ * "Not an assistant - a TEAM."
7
+ *
8
+ * Copyright 2026 Rafa & Cervella
9
+ * Licensed under the Apache License, Version 2.0
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ */
12
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
13
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
14
+ import { z } from "zod";
15
+ import { spawnWorker, getAvailableWorkers } from "./agents/spawner.js";
16
+ import { getApiKey, hasApiKey, getApiKeySource, validateApiKey, getConfigPath, getConfigDir, getTier, } from "./config/manager.js";
17
+ import { getUsageTracker, QuotaStatus } from "./billing/usage.js";
18
+ // Server metadata
19
+ const SERVER_NAME = "cervellaswarm";
20
+ const SERVER_VERSION = "0.1.0";
21
+ // Create MCP server instance
22
+ const server = new McpServer({
23
+ name: SERVER_NAME,
24
+ version: SERVER_VERSION,
25
+ });
26
+ // ============================================
27
+ // TOOLS
28
+ // ============================================
29
+ /**
30
+ * Tool: spawn_worker
31
+ * Spawn a specialized AI agent to execute a task
32
+ */
33
+ server.tool("spawn_worker", "Spawn a CervellaSwarm worker agent to execute a task. " +
34
+ "Available workers: backend, frontend, tester, docs, devops, data, security, researcher. " +
35
+ "The worker will analyze the task and provide code, documentation, or analysis.", {
36
+ worker: z
37
+ .enum([
38
+ "backend",
39
+ "frontend",
40
+ "tester",
41
+ "docs",
42
+ "devops",
43
+ "data",
44
+ "security",
45
+ "researcher",
46
+ ])
47
+ .describe("The type of worker to spawn"),
48
+ task: z.string().min(1).describe("The task description for the worker"),
49
+ context: z
50
+ .string()
51
+ .optional()
52
+ .describe("Additional context about the project or task"),
53
+ }, async ({ worker, task, context }) => {
54
+ // Check API key
55
+ if (!hasApiKey()) {
56
+ return {
57
+ content: [
58
+ {
59
+ type: "text",
60
+ text: "Error: No API key configured.\n\n" +
61
+ "To use CervellaSwarm, set your Anthropic API key:\n" +
62
+ "1. Run: cervellaswarm init\n" +
63
+ "2. Or set: export ANTHROPIC_API_KEY=sk-ant-...\n\n" +
64
+ "Get your key at: https://console.anthropic.com/",
65
+ },
66
+ ],
67
+ isError: true,
68
+ };
69
+ }
70
+ // Check quota before executing
71
+ const usageTracker = getUsageTracker(getConfigDir(), getTier);
72
+ const quotaResult = await usageTracker.checkQuota();
73
+ if (!quotaResult.allowed) {
74
+ return {
75
+ content: [
76
+ {
77
+ type: "text",
78
+ text: quotaResult.error || "Monthly limit reached.",
79
+ },
80
+ ],
81
+ isError: true,
82
+ };
83
+ }
84
+ // Show warning if approaching limit (but still allow)
85
+ let warningMessage = "";
86
+ if (quotaResult.status === QuotaStatus.WARNING && quotaResult.warning) {
87
+ warningMessage = `\n\n---\n\n⚠️ ${quotaResult.warning}`;
88
+ }
89
+ try {
90
+ const result = await spawnWorker(worker, task, context);
91
+ if (!result.success) {
92
+ // Failed calls don't count toward quota
93
+ return {
94
+ content: [
95
+ {
96
+ type: "text",
97
+ text: `Error: ${result.error}\n\nNext step: ${result.nextStep}`,
98
+ },
99
+ ],
100
+ isError: true,
101
+ };
102
+ }
103
+ // Track successful call
104
+ await usageTracker.trackCall();
105
+ // Get updated usage for display
106
+ const stats = await usageTracker.getStats();
107
+ const usageInfo = `Usage: ${stats.calls}/${stats.limit} calls this month`;
108
+ return {
109
+ content: [
110
+ {
111
+ type: "text",
112
+ text: `Worker: cervella-${worker}\n` +
113
+ `Duration: ${result.duration}\n` +
114
+ `Tokens: ${result.usage?.inputTokens || 0} in / ${result.usage?.outputTokens || 0} out\n` +
115
+ `${usageInfo}\n\n` +
116
+ `---\n\n${result.output}\n\n---\n\n` +
117
+ `Next step: ${result.nextStep}${warningMessage}`,
118
+ },
119
+ ],
120
+ };
121
+ }
122
+ catch (error) {
123
+ return {
124
+ content: [
125
+ {
126
+ type: "text",
127
+ text: `Unexpected error: ${error instanceof Error ? error.message : "Unknown"}`,
128
+ },
129
+ ],
130
+ isError: true,
131
+ };
132
+ }
133
+ });
134
+ /**
135
+ * Tool: list_workers
136
+ * List all available CervellaSwarm workers
137
+ */
138
+ server.tool("list_workers", "List all available CervellaSwarm worker agents and their specialties.", {}, async () => {
139
+ const workers = getAvailableWorkers();
140
+ const list = workers
141
+ .map((w) => `- **${w.name}**: ${w.description}`)
142
+ .join("\n");
143
+ return {
144
+ content: [
145
+ {
146
+ type: "text",
147
+ text: "# CervellaSwarm Workers\n\n" +
148
+ "16 specialized AI agents ready to help:\n\n" +
149
+ list +
150
+ "\n\n" +
151
+ "Use `spawn_worker` to assign a task to any worker.",
152
+ },
153
+ ],
154
+ };
155
+ });
156
+ /**
157
+ * Tool: check_status
158
+ * Check CervellaSwarm configuration status with optional validation
159
+ */
160
+ server.tool("check_status", "Check if CervellaSwarm is properly configured (API key, etc).", {
161
+ validate: z
162
+ .boolean()
163
+ .optional()
164
+ .default(false)
165
+ .describe("If true, validates the API key with a test call to Anthropic"),
166
+ }, async ({ validate }) => {
167
+ const hasKey = hasApiKey();
168
+ const apiKey = getApiKey();
169
+ const keySource = getApiKeySource();
170
+ const configPath = getConfigPath();
171
+ let status = "# CervellaSwarm Status\n\n";
172
+ // Basic info
173
+ status += `## Configuration\n\n`;
174
+ status += `- Config file: \`${configPath}\`\n`;
175
+ status += `- Server version: ${SERVER_VERSION}\n\n`;
176
+ // API Key section
177
+ status += `## API Key\n\n`;
178
+ if (hasKey && apiKey) {
179
+ const maskedKey = `${apiKey.substring(0, 10)}...${apiKey.substring(apiKey.length - 4)}`;
180
+ status += `- Status: Configured\n`;
181
+ status += `- Source: ${keySource}\n`;
182
+ status += `- Key: \`${maskedKey}\`\n`;
183
+ // Validate if requested
184
+ if (validate) {
185
+ status += `\n### Validation\n\n`;
186
+ const result = await validateApiKey();
187
+ if (result.valid) {
188
+ if (result.warning) {
189
+ status += `- Result: Valid (with warning)\n`;
190
+ status += `- Warning: ${result.warning}\n`;
191
+ }
192
+ else {
193
+ status += `- Result: Valid\n`;
194
+ status += `- API connection: Working\n`;
195
+ }
196
+ }
197
+ else {
198
+ status += `- Result: Invalid\n`;
199
+ status += `- Error: ${result.error}\n`;
200
+ status += `\nTo fix: Check your API key at https://console.anthropic.com/\n`;
201
+ }
202
+ }
203
+ status += `\n## Ready\n\n`;
204
+ status += `You can now use \`spawn_worker\` to execute tasks.\n`;
205
+ if (!validate) {
206
+ status += `\nTip: Use \`check_status(validate=true)\` to test the API connection.`;
207
+ }
208
+ }
209
+ else {
210
+ status += `- Status: Not configured\n`;
211
+ status += `- Source: none\n\n`;
212
+ status += `## Setup Required\n\n`;
213
+ status += `To configure your API key:\n\n`;
214
+ status += `1. **Recommended:** Run \`cervellaswarm init\`\n`;
215
+ status += `2. **Alternative:** Set environment variable:\n`;
216
+ status += ` \`\`\`\n`;
217
+ status += ` export ANTHROPIC_API_KEY=sk-ant-...\n`;
218
+ status += ` \`\`\`\n\n`;
219
+ status += `Get your key at: https://console.anthropic.com/`;
220
+ }
221
+ return {
222
+ content: [{ type: "text", text: status }],
223
+ };
224
+ });
225
+ /**
226
+ * Tool: check_usage
227
+ * Check current usage and quota status
228
+ */
229
+ server.tool("check_usage", "Check your current CervellaSwarm usage, remaining calls, and quota status.", {}, async () => {
230
+ const usageTracker = getUsageTracker(getConfigDir(), getTier);
231
+ const message = await usageTracker.getUsageMessage();
232
+ return {
233
+ content: [{ type: "text", text: message }],
234
+ };
235
+ });
236
+ // ============================================
237
+ // RESOURCES
238
+ // ============================================
239
+ // TODO: Add SNCP resources in future versions
240
+ // - Project state (.sncp/progetti/*/stato.md)
241
+ // - Session history
242
+ // - Worker reports
243
+ // ============================================
244
+ // PROMPTS
245
+ // ============================================
246
+ // TODO: Add prompts in future versions
247
+ // - coordinate_workers: Plan multi-agent tasks
248
+ // - analyze_codebase: Full project analysis
249
+ // ============================================
250
+ // START SERVER
251
+ // ============================================
252
+ async function main() {
253
+ const transport = new StdioServerTransport();
254
+ await server.connect(transport);
255
+ console.error(`CervellaSwarm MCP Server v${SERVER_VERSION} started`);
256
+ }
257
+ main().catch((error) => {
258
+ console.error("Failed to start server:", error);
259
+ process.exit(1);
260
+ });
261
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@cervellaswarm/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "CervellaSwarm MCP Server - 16 AI agents as MCP tools",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "cervellaswarm-mcp": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx watch src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "inspect": "npx @modelcontextprotocol/inspector node dist/index.js",
15
+ "test": "node --test"
16
+ },
17
+ "dependencies": {
18
+ "@anthropic-ai/sdk": "^0.39.0",
19
+ "@modelcontextprotocol/sdk": "^1.12.0",
20
+ "conf": "^13.0.1",
21
+ "zod": "^3.25.0"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "^22.10.0",
25
+ "tsx": "^4.19.0",
26
+ "typescript": "^5.7.0"
27
+ },
28
+ "engines": {
29
+ "node": ">=18.0.0"
30
+ },
31
+ "files": [
32
+ "dist"
33
+ ],
34
+ "keywords": [
35
+ "mcp",
36
+ "model-context-protocol",
37
+ "claude",
38
+ "anthropic",
39
+ "ai-agents",
40
+ "cervellaswarm"
41
+ ],
42
+ "author": "Rafa & Cervella",
43
+ "license": "Apache-2.0",
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/rafapra/cervellaswarm"
47
+ }
48
+ }