@everstateai/mcp 1.0.0 → 1.2.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/dist/index.js +50 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +55 -4
package/dist/index.js
CHANGED
|
@@ -15,11 +15,38 @@ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
|
15
15
|
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
16
16
|
const API_BASE = process.env.EVERSTATE_API_URL || "https://www.everstate.ai";
|
|
17
17
|
const API_KEY = process.env.EVERSTATE_API_KEY;
|
|
18
|
-
const
|
|
18
|
+
const INITIAL_PROJECT_ID = process.env.EVERSTATE_PROJECT_ID;
|
|
19
|
+
// Session state - persists projectId across tool calls within this proxy instance
|
|
20
|
+
let sessionProjectId = INITIAL_PROJECT_ID;
|
|
19
21
|
if (!API_KEY) {
|
|
20
22
|
console.error("EVERSTATE_API_KEY environment variable is required");
|
|
21
23
|
process.exit(1);
|
|
22
24
|
}
|
|
25
|
+
// Auto-detect default project from API key if not explicitly set
|
|
26
|
+
async function detectDefaultProject() {
|
|
27
|
+
if (sessionProjectId) {
|
|
28
|
+
console.error(`[Everstate] Using configured project: ${sessionProjectId}`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const res = await fetch(`${API_BASE}/api/projects`, {
|
|
33
|
+
headers: { Authorization: `Bearer ${API_KEY}` },
|
|
34
|
+
});
|
|
35
|
+
if (res.ok) {
|
|
36
|
+
const projects = await res.json();
|
|
37
|
+
if (projects.length > 0) {
|
|
38
|
+
sessionProjectId = projects[0].id;
|
|
39
|
+
console.error(`[Everstate] Auto-detected default project: ${projects[0].name} (${sessionProjectId})`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.error("[Everstate] Warning: No projects found. Use switch_project or sync to set one.");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error("[Everstate] Could not auto-detect project:", error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
23
50
|
// Create MCP server
|
|
24
51
|
const server = new index_js_1.Server({ name: "everstate", version: "1.0.0" }, { capabilities: { tools: {} } });
|
|
25
52
|
// Fetch tool definitions from cloud
|
|
@@ -46,8 +73,9 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
|
46
73
|
const enrichedArgs = { ...args };
|
|
47
74
|
const params = enrichedArgs.params;
|
|
48
75
|
const hasProjectIdInParams = params && typeof params === 'object' && 'projectId' in params && params.projectId;
|
|
49
|
-
|
|
50
|
-
|
|
76
|
+
// Use session projectId (may have been set by switch_project or sync)
|
|
77
|
+
if (sessionProjectId && !enrichedArgs.projectId && !hasProjectIdInParams) {
|
|
78
|
+
enrichedArgs.projectId = sessionProjectId;
|
|
51
79
|
}
|
|
52
80
|
const res = await fetch(`${API_BASE}/mcp/execute`, {
|
|
53
81
|
method: "POST",
|
|
@@ -63,10 +91,28 @@ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
|
63
91
|
isError: true,
|
|
64
92
|
};
|
|
65
93
|
}
|
|
66
|
-
|
|
94
|
+
const result = (await res.json());
|
|
95
|
+
// Update session state based on tool results
|
|
96
|
+
// switch_project and sync can set the active project
|
|
97
|
+
if (name === 'switch_project' || name === 'everstate_switch_project') {
|
|
98
|
+
// Extract projectId from result
|
|
99
|
+
const data = result.data || result.project;
|
|
100
|
+
if (data?.id) {
|
|
101
|
+
sessionProjectId = data.id;
|
|
102
|
+
console.error(`[Everstate] Session project set to: ${sessionProjectId}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else if (name === 'sync' && enrichedArgs.projectId) {
|
|
106
|
+
// sync with explicit projectId sets the session project
|
|
107
|
+
sessionProjectId = enrichedArgs.projectId;
|
|
108
|
+
console.error(`[Everstate] Session project set to: ${sessionProjectId}`);
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
67
111
|
});
|
|
68
112
|
// Start server
|
|
69
113
|
async function main() {
|
|
114
|
+
// Auto-detect default project before starting
|
|
115
|
+
await detectDefaultProject();
|
|
70
116
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
71
117
|
await server.connect(transport);
|
|
72
118
|
console.error("Everstate MCP Proxy connected to", API_BASE);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA;;;;;;;;GAQG;;AAEH,wEAAmE;AACnE,wEAAiF;AACjF,iEAM4C;AAE5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,0BAA0B,CAAC;AAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAC9C,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -21,13 +21,42 @@ import {
|
|
|
21
21
|
|
|
22
22
|
const API_BASE = process.env.EVERSTATE_API_URL || "https://www.everstate.ai";
|
|
23
23
|
const API_KEY = process.env.EVERSTATE_API_KEY;
|
|
24
|
-
const
|
|
24
|
+
const INITIAL_PROJECT_ID = process.env.EVERSTATE_PROJECT_ID;
|
|
25
|
+
|
|
26
|
+
// Session state - persists projectId across tool calls within this proxy instance
|
|
27
|
+
let sessionProjectId = INITIAL_PROJECT_ID;
|
|
25
28
|
|
|
26
29
|
if (!API_KEY) {
|
|
27
30
|
console.error("EVERSTATE_API_KEY environment variable is required");
|
|
28
31
|
process.exit(1);
|
|
29
32
|
}
|
|
30
33
|
|
|
34
|
+
// Auto-detect default project from API key if not explicitly set
|
|
35
|
+
async function detectDefaultProject(): Promise<void> {
|
|
36
|
+
if (sessionProjectId) {
|
|
37
|
+
console.error(`[Everstate] Using configured project: ${sessionProjectId}`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
const res = await fetch(`${API_BASE}/api/projects`, {
|
|
43
|
+
headers: { Authorization: `Bearer ${API_KEY}` },
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
if (res.ok) {
|
|
47
|
+
const projects = await res.json() as Array<{ id: string; name: string }>;
|
|
48
|
+
if (projects.length > 0) {
|
|
49
|
+
sessionProjectId = projects[0].id;
|
|
50
|
+
console.error(`[Everstate] Auto-detected default project: ${projects[0].name} (${sessionProjectId})`);
|
|
51
|
+
} else {
|
|
52
|
+
console.error("[Everstate] Warning: No projects found. Use switch_project or sync to set one.");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
} catch (error) {
|
|
56
|
+
console.error("[Everstate] Could not auto-detect project:", error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
31
60
|
// Type for API responses
|
|
32
61
|
interface ToolsResponse {
|
|
33
62
|
tools: Tool[];
|
|
@@ -68,8 +97,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request): Promise<CallToo
|
|
|
68
97
|
const enrichedArgs = { ...args } as Record<string, unknown>;
|
|
69
98
|
const params = enrichedArgs.params as Record<string, unknown> | undefined;
|
|
70
99
|
const hasProjectIdInParams = params && typeof params === 'object' && 'projectId' in params && params.projectId;
|
|
71
|
-
|
|
72
|
-
|
|
100
|
+
|
|
101
|
+
// Use session projectId (may have been set by switch_project or sync)
|
|
102
|
+
if (sessionProjectId && !enrichedArgs.projectId && !hasProjectIdInParams) {
|
|
103
|
+
enrichedArgs.projectId = sessionProjectId;
|
|
73
104
|
}
|
|
74
105
|
|
|
75
106
|
const res = await fetch(`${API_BASE}/mcp/execute`, {
|
|
@@ -88,11 +119,31 @@ server.setRequestHandler(CallToolRequestSchema, async (request): Promise<CallToo
|
|
|
88
119
|
};
|
|
89
120
|
}
|
|
90
121
|
|
|
91
|
-
|
|
122
|
+
const result = (await res.json()) as CallToolResult & { data?: any };
|
|
123
|
+
|
|
124
|
+
// Update session state based on tool results
|
|
125
|
+
// switch_project and sync can set the active project
|
|
126
|
+
if (name === 'switch_project' || name === 'everstate_switch_project') {
|
|
127
|
+
// Extract projectId from result
|
|
128
|
+
const data = result.data || (result as any).project;
|
|
129
|
+
if (data?.id) {
|
|
130
|
+
sessionProjectId = data.id;
|
|
131
|
+
console.error(`[Everstate] Session project set to: ${sessionProjectId}`);
|
|
132
|
+
}
|
|
133
|
+
} else if (name === 'sync' && enrichedArgs.projectId) {
|
|
134
|
+
// sync with explicit projectId sets the session project
|
|
135
|
+
sessionProjectId = enrichedArgs.projectId as string;
|
|
136
|
+
console.error(`[Everstate] Session project set to: ${sessionProjectId}`);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return result;
|
|
92
140
|
});
|
|
93
141
|
|
|
94
142
|
// Start server
|
|
95
143
|
async function main() {
|
|
144
|
+
// Auto-detect default project before starting
|
|
145
|
+
await detectDefaultProject();
|
|
146
|
+
|
|
96
147
|
const transport = new StdioServerTransport();
|
|
97
148
|
await server.connect(transport);
|
|
98
149
|
console.error("Everstate MCP Proxy connected to", API_BASE);
|