@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.
- package/README.md +109 -0
- package/dist/agents/spawner.d.ts +36 -0
- package/dist/agents/spawner.d.ts.map +1 -0
- package/dist/agents/spawner.js +218 -0
- package/dist/agents/spawner.js.map +1 -0
- package/dist/billing/messages.d.ts +27 -0
- package/dist/billing/messages.d.ts.map +1 -0
- package/dist/billing/messages.js +108 -0
- package/dist/billing/messages.js.map +1 -0
- package/dist/billing/tiers.d.ts +55 -0
- package/dist/billing/tiers.d.ts.map +1 -0
- package/dist/billing/tiers.js +86 -0
- package/dist/billing/tiers.js.map +1 -0
- package/dist/billing/types.d.ts +113 -0
- package/dist/billing/types.d.ts.map +1 -0
- package/dist/billing/types.js +19 -0
- package/dist/billing/types.js.map +1 -0
- package/dist/billing/usage.d.ts +95 -0
- package/dist/billing/usage.d.ts.map +1 -0
- package/dist/billing/usage.js +383 -0
- package/dist/billing/usage.js.map +1 -0
- package/dist/config/manager.d.ts +31 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +160 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +261 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|