@inferevents/mcp 0.2.1 → 0.3.1
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/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +122 -23
- package/dist/config.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +47 -6
- package/dist/server.js.map +1 -1
- package/dist/tools/create-project.d.ts +10 -0
- package/dist/tools/create-project.d.ts.map +1 -0
- package/dist/tools/create-project.js +51 -0
- package/dist/tools/create-project.js.map +1 -0
- package/dist/tools/switch-project.d.ts +8 -0
- package/dist/tools/switch-project.d.ts.map +1 -0
- package/dist/tools/switch-project.js +26 -0
- package/dist/tools/switch-project.js.map +1 -0
- package/package.json +1 -1
package/dist/config.d.ts
CHANGED
|
@@ -3,7 +3,27 @@ export interface InferConfig {
|
|
|
3
3
|
endpoint: string;
|
|
4
4
|
projectId?: string;
|
|
5
5
|
}
|
|
6
|
+
export interface InferConfigFile {
|
|
7
|
+
session?: string;
|
|
8
|
+
activeProject?: string;
|
|
9
|
+
endpoint?: string;
|
|
10
|
+
projects: Record<string, {
|
|
11
|
+
apiKey: string;
|
|
12
|
+
projectId: string;
|
|
13
|
+
writeKey?: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
6
16
|
export declare function loadConfig(): Promise<InferConfig>;
|
|
17
|
+
export declare function readConfigFile(): Promise<InferConfigFile>;
|
|
18
|
+
export declare function writeConfigFile(config: InferConfigFile): Promise<void>;
|
|
19
|
+
export declare function addProject(name: string, apiKey: string, projectId: string, writeKey?: string, setActive?: boolean, session?: string): Promise<void>;
|
|
20
|
+
export declare function switchProject(name: string): Promise<InferConfig>;
|
|
21
|
+
export declare function listProjects(): Promise<Array<{
|
|
22
|
+
name: string;
|
|
23
|
+
projectId: string;
|
|
24
|
+
active: boolean;
|
|
25
|
+
}>>;
|
|
26
|
+
export declare function getSession(): Promise<string | undefined>;
|
|
7
27
|
export declare class ConfigError extends Error {
|
|
8
28
|
constructor(message: string);
|
|
9
29
|
}
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAsBD,wBAAsB,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC,CAmFvD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAyB/D;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,UAAO,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAWtE;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAOzG;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAG9D;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B"}
|
package/dist/config.js
CHANGED
|
@@ -1,21 +1,35 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
1
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
|
-
const
|
|
4
|
+
const CONFIG_DIR = join(homedir(), ".infer");
|
|
5
|
+
const CONFIG_PATH = join(CONFIG_DIR, "config.json");
|
|
5
6
|
const SETUP_INSTRUCTIONS = `
|
|
6
7
|
Infer MCP server is not configured.
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
Run /infer-setup in Claude Code, or create ~/.infer/config.json:
|
|
9
10
|
|
|
10
11
|
{
|
|
11
|
-
"apiKey": "pk_read_...",
|
|
12
12
|
"endpoint": "https://api.infer.events",
|
|
13
|
-
"
|
|
13
|
+
"activeProject": "my-project",
|
|
14
|
+
"projects": {
|
|
15
|
+
"my-project": {
|
|
16
|
+
"apiKey": "pk_read_...",
|
|
17
|
+
"projectId": "proj_..."
|
|
18
|
+
}
|
|
19
|
+
}
|
|
14
20
|
}
|
|
15
|
-
|
|
16
|
-
Get your read API key from https://infer.events/settings/api-keys
|
|
17
21
|
`.trim();
|
|
18
22
|
export async function loadConfig() {
|
|
23
|
+
// Env overrides (highest priority)
|
|
24
|
+
const envKey = process.env.INFER_API_KEY;
|
|
25
|
+
const envProject = process.env.INFER_PROJECT_ID;
|
|
26
|
+
if (envKey) {
|
|
27
|
+
return {
|
|
28
|
+
apiKey: envKey,
|
|
29
|
+
endpoint: process.env.INFER_ENDPOINT ?? "https://api.infer.events",
|
|
30
|
+
projectId: envProject,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
19
33
|
let raw;
|
|
20
34
|
try {
|
|
21
35
|
raw = await readFile(CONFIG_PATH, "utf-8");
|
|
@@ -30,23 +44,108 @@ export async function loadConfig() {
|
|
|
30
44
|
catch {
|
|
31
45
|
throw new ConfigError(`Invalid JSON in ${CONFIG_PATH}. Please check the file syntax.`);
|
|
32
46
|
}
|
|
33
|
-
if (typeof parsed !== "object" ||
|
|
34
|
-
parsed === null ||
|
|
35
|
-
!("apiKey" in parsed) ||
|
|
36
|
-
typeof parsed.apiKey !== "string") {
|
|
37
|
-
throw new ConfigError(`Missing or invalid "apiKey" in ${CONFIG_PATH}.\n\n${SETUP_INSTRUCTIONS}`);
|
|
38
|
-
}
|
|
39
47
|
const config = parsed;
|
|
40
|
-
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
// Backwards compat: old flat format { apiKey, endpoint, projectId }
|
|
49
|
+
if ("apiKey" in config && typeof config.apiKey === "string") {
|
|
50
|
+
const apiKey = config.apiKey;
|
|
51
|
+
if (!apiKey.startsWith("pk_read_")) {
|
|
52
|
+
throw new ConfigError(`The MCP server requires a read API key (starts with "pk_read_").`);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
apiKey,
|
|
56
|
+
endpoint: typeof config.endpoint === "string"
|
|
57
|
+
? config.endpoint.replace(/\/+$/, "")
|
|
58
|
+
: "https://api.infer.events",
|
|
59
|
+
projectId: typeof config.projectId === "string" ? config.projectId : undefined,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// New profiles format
|
|
63
|
+
if ("projects" in config && typeof config.projects === "object" && config.projects !== null) {
|
|
64
|
+
const projects = config.projects;
|
|
65
|
+
const names = Object.keys(projects);
|
|
66
|
+
if (names.length === 0) {
|
|
67
|
+
throw new ConfigError(`No projects in ${CONFIG_PATH}. Run /infer-setup to add one.`);
|
|
68
|
+
}
|
|
69
|
+
const activeName = typeof config.activeProject === "string"
|
|
70
|
+
? config.activeProject
|
|
71
|
+
: names[0];
|
|
72
|
+
const project = projects[activeName];
|
|
73
|
+
if (!project) {
|
|
74
|
+
throw new ConfigError(`Active project "${activeName}" not found in config. Available: ${names.join(", ")}`);
|
|
75
|
+
}
|
|
76
|
+
const apiKey = project.apiKey;
|
|
77
|
+
if (!apiKey || !apiKey.startsWith("pk_read_")) {
|
|
78
|
+
throw new ConfigError(`Invalid read key for project "${activeName}" in ${CONFIG_PATH}.`);
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
apiKey,
|
|
82
|
+
endpoint: typeof config.endpoint === "string"
|
|
83
|
+
? config.endpoint.replace(/\/+$/, "")
|
|
84
|
+
: "https://api.infer.events",
|
|
85
|
+
projectId: typeof project.projectId === "string" ? project.projectId : undefined,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
throw new ConfigError(SETUP_INSTRUCTIONS);
|
|
89
|
+
}
|
|
90
|
+
export async function readConfigFile() {
|
|
91
|
+
try {
|
|
92
|
+
const raw = await readFile(CONFIG_PATH, "utf-8");
|
|
93
|
+
const parsed = JSON.parse(raw);
|
|
94
|
+
// Migrate old flat format
|
|
95
|
+
if ("apiKey" in parsed && !("projects" in parsed)) {
|
|
96
|
+
return {
|
|
97
|
+
session: typeof parsed.session === "string" ? parsed.session : undefined,
|
|
98
|
+
endpoint: typeof parsed.endpoint === "string" ? parsed.endpoint : "https://api.infer.events",
|
|
99
|
+
activeProject: "default",
|
|
100
|
+
projects: {
|
|
101
|
+
default: {
|
|
102
|
+
apiKey: parsed.apiKey,
|
|
103
|
+
projectId: parsed.projectId ?? "",
|
|
104
|
+
writeKey: parsed.writeKey,
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return parsed;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return { projects: {}, endpoint: "https://api.infer.events" };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export async function writeConfigFile(config) {
|
|
116
|
+
await mkdir(CONFIG_DIR, { recursive: true });
|
|
117
|
+
await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
118
|
+
}
|
|
119
|
+
export async function addProject(name, apiKey, projectId, writeKey, setActive = true, session) {
|
|
120
|
+
const config = await readConfigFile();
|
|
121
|
+
config.projects[name] = { apiKey, projectId, writeKey };
|
|
122
|
+
if (setActive)
|
|
123
|
+
config.activeProject = name;
|
|
124
|
+
if (session)
|
|
125
|
+
config.session = session;
|
|
126
|
+
await writeConfigFile(config);
|
|
127
|
+
}
|
|
128
|
+
export async function switchProject(name) {
|
|
129
|
+
const config = await readConfigFile();
|
|
130
|
+
if (!config.projects[name]) {
|
|
131
|
+
const available = Object.keys(config.projects);
|
|
132
|
+
throw new ConfigError(`Project "${name}" not found. Available: ${available.join(", ")}`);
|
|
133
|
+
}
|
|
134
|
+
config.activeProject = name;
|
|
135
|
+
await writeConfigFile(config);
|
|
136
|
+
return loadConfig();
|
|
137
|
+
}
|
|
138
|
+
export async function listProjects() {
|
|
139
|
+
const config = await readConfigFile();
|
|
140
|
+
return Object.entries(config.projects).map(([name, p]) => ({
|
|
141
|
+
name,
|
|
142
|
+
projectId: p.projectId,
|
|
143
|
+
active: name === config.activeProject,
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
export async function getSession() {
|
|
147
|
+
const config = await readConfigFile();
|
|
148
|
+
return config.session;
|
|
50
149
|
}
|
|
51
150
|
export class ConfigError extends Error {
|
|
52
151
|
constructor(message) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
import type
|
|
2
|
+
import { type InferConfig } from "./config.js";
|
|
3
3
|
export declare function createServer(config: InferConfig): McpServer;
|
|
4
4
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AA8B3D,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAiK3D"}
|
package/dist/server.js
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
// Skills are separate (@inferevents/skills). MCP server = tools only.
|
|
3
3
|
import { ApiClient, ApiError } from "./api-client.js";
|
|
4
|
+
import { loadConfig } from "./config.js";
|
|
4
5
|
import { getEventCountsSchema, handleGetEventCounts, } from "./tools/get-event-counts.js";
|
|
5
6
|
import { getRetentionSchema, handleGetRetention, } from "./tools/get-retention.js";
|
|
6
7
|
import { getUserJourneySchema, handleGetUserJourney, } from "./tools/get-user-journey.js";
|
|
7
8
|
import { getTopEventsSchema, handleGetTopEvents, } from "./tools/get-top-events.js";
|
|
8
9
|
import { getInsightsSchema, handleGetInsights, } from "./tools/get-insights.js";
|
|
10
|
+
import { switchProjectSchema, handleSwitchProject, } from "./tools/switch-project.js";
|
|
11
|
+
import { createProjectSchema, handleCreateProject, } from "./tools/create-project.js";
|
|
9
12
|
export function createServer(config) {
|
|
10
|
-
|
|
13
|
+
// Re-reads config from disk on each call so switch_project takes effect immediately
|
|
14
|
+
async function getClient() {
|
|
15
|
+
try {
|
|
16
|
+
const freshConfig = await loadConfig();
|
|
17
|
+
return new ApiClient(freshConfig);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return new ApiClient(config);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
11
23
|
const server = new McpServer({
|
|
12
24
|
name: "infer-analytics",
|
|
13
25
|
version: "0.1.0",
|
|
@@ -20,7 +32,7 @@ export function createServer(config) {
|
|
|
20
32
|
"Use this for questions like 'how many signups this week', " +
|
|
21
33
|
"'page views by country last 30 days', or 'purchase count trend'.", getEventCountsSchema, async (params) => {
|
|
22
34
|
try {
|
|
23
|
-
const text = await handleGetEventCounts(
|
|
35
|
+
const text = await handleGetEventCounts(await getClient(), params);
|
|
24
36
|
return { content: [{ type: "text", text }] };
|
|
25
37
|
}
|
|
26
38
|
catch (error) {
|
|
@@ -35,7 +47,7 @@ export function createServer(config) {
|
|
|
35
47
|
"Use for questions like 'what is our week-over-week retention', " +
|
|
36
48
|
"'do users come back after signing up', or 'retention by monthly cohort'.", getRetentionSchema, async (params) => {
|
|
37
49
|
try {
|
|
38
|
-
const text = await handleGetRetention(
|
|
50
|
+
const text = await handleGetRetention(await getClient(), params);
|
|
39
51
|
return { content: [{ type: "text", text }] };
|
|
40
52
|
}
|
|
41
53
|
catch (error) {
|
|
@@ -51,7 +63,7 @@ export function createServer(config) {
|
|
|
51
63
|
"To find user IDs: first call get_event_counts with group_by='anonymous_id' " +
|
|
52
64
|
"to list anonymous user IDs, then pass one to this tool as user_id.", getUserJourneySchema, async (params) => {
|
|
53
65
|
try {
|
|
54
|
-
const text = await handleGetUserJourney(
|
|
66
|
+
const text = await handleGetUserJourney(await getClient(), params);
|
|
55
67
|
return { content: [{ type: "text", text }] };
|
|
56
68
|
}
|
|
57
69
|
catch (error) {
|
|
@@ -65,7 +77,7 @@ export function createServer(config) {
|
|
|
65
77
|
"Use for questions like 'what events are being tracked', 'what are users doing', " +
|
|
66
78
|
"'show me all event types', or 'what's the most common action'.", getTopEventsSchema, async (params) => {
|
|
67
79
|
try {
|
|
68
|
-
const text = await handleGetTopEvents(
|
|
80
|
+
const text = await handleGetTopEvents(await getClient(), params);
|
|
69
81
|
return { content: [{ type: "text", text }] };
|
|
70
82
|
}
|
|
71
83
|
catch (error) {
|
|
@@ -80,7 +92,36 @@ export function createServer(config) {
|
|
|
80
92
|
"Returns pre-computed insights like volume drops, error spikes, milestones, " +
|
|
81
93
|
"and new events. Insights are auto-detected hourly — no query needed.", getInsightsSchema, async (params) => {
|
|
82
94
|
try {
|
|
83
|
-
const text = await handleGetInsights(
|
|
95
|
+
const text = await handleGetInsights(await getClient(), params);
|
|
96
|
+
return { content: [{ type: "text", text }] };
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
return {
|
|
100
|
+
content: [{ type: "text", text: formatError(error) }],
|
|
101
|
+
isError: true,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
server.tool("switch_project", "Switch between Infer projects or list all configured projects. " +
|
|
106
|
+
"Use when the user says 'switch to project X' or 'list my projects' or " +
|
|
107
|
+
"wants to query data from a different project.", switchProjectSchema, async (params) => {
|
|
108
|
+
try {
|
|
109
|
+
const text = await handleSwitchProject(params);
|
|
110
|
+
return { content: [{ type: "text", text }] };
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
return {
|
|
114
|
+
content: [{ type: "text", text: formatError(error) }],
|
|
115
|
+
isError: true,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
server.tool("create_project", "Create a new Infer project from the CLI. " +
|
|
120
|
+
"Use when the user wants to add analytics to a new codebase. " +
|
|
121
|
+
"Requires an active session from prior signup.", createProjectSchema, async (params) => {
|
|
122
|
+
try {
|
|
123
|
+
const freshConfig = await loadConfig().catch(() => config);
|
|
124
|
+
const text = await handleCreateProject(params, freshConfig.endpoint);
|
|
84
125
|
return { content: [{ type: "text", text }] };
|
|
85
126
|
}
|
|
86
127
|
catch (error) {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,sEAAsE;AACtE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const createProjectSchema: {
|
|
3
|
+
project_name: z.ZodString;
|
|
4
|
+
session: z.ZodOptional<z.ZodString>;
|
|
5
|
+
};
|
|
6
|
+
export declare function handleCreateProject(params: {
|
|
7
|
+
project_name: string;
|
|
8
|
+
session?: string;
|
|
9
|
+
}, endpoint: string): Promise<string>;
|
|
10
|
+
//# sourceMappingURL=create-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/tools/create-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,mBAAmB;;;CAQ/B,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,MAAM,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EAClD,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAoDjB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { addProject, readConfigFile, getSession } from "../config.js";
|
|
3
|
+
export const createProjectSchema = {
|
|
4
|
+
project_name: z
|
|
5
|
+
.string()
|
|
6
|
+
.describe("Name for the new project (e.g., 'my-saas-app', 'mobile-app')"),
|
|
7
|
+
session: z
|
|
8
|
+
.string()
|
|
9
|
+
.optional()
|
|
10
|
+
.describe("Session token from infer.events login. If omitted, uses the saved session from ~/.infer/config.json."),
|
|
11
|
+
};
|
|
12
|
+
export async function handleCreateProject(params, endpoint) {
|
|
13
|
+
const config = await readConfigFile();
|
|
14
|
+
// Use provided session, fall back to saved session from config
|
|
15
|
+
let session = params.session;
|
|
16
|
+
if (!session) {
|
|
17
|
+
session = await getSession();
|
|
18
|
+
}
|
|
19
|
+
if (!session) {
|
|
20
|
+
return "No session found. Sign up at https://infer.events/signup first, then run /infer-setup.";
|
|
21
|
+
}
|
|
22
|
+
const baseUrl = config.endpoint ?? endpoint;
|
|
23
|
+
// Call the API to create the project
|
|
24
|
+
const response = await fetch(`${baseUrl}/v1/auth/create-project`, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: { "Content-Type": "application/json" },
|
|
27
|
+
body: JSON.stringify({ session, project_name: params.project_name }),
|
|
28
|
+
});
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
const body = await response.json().catch(() => ({}));
|
|
31
|
+
return `Failed to create project: ${body.error ?? response.statusText}`;
|
|
32
|
+
}
|
|
33
|
+
const result = await response.json();
|
|
34
|
+
// Save to config
|
|
35
|
+
const slug = params.project_name.toLowerCase().replace(/[^a-z0-9]+/g, "-");
|
|
36
|
+
await addProject(slug, result.read_key, result.project_id, result.write_key, true);
|
|
37
|
+
const lines = [
|
|
38
|
+
`Project "${result.project_name}" created and set as active.`,
|
|
39
|
+
"",
|
|
40
|
+
`Project ID: ${result.project_id}`,
|
|
41
|
+
`Write key: ${result.write_key}`,
|
|
42
|
+
`Read key: ${result.read_key}`,
|
|
43
|
+
"",
|
|
44
|
+
`Saved to ~/.infer/config.json as "${slug}" (now active).`,
|
|
45
|
+
"",
|
|
46
|
+
"Next: Install the SDK in your project with npm install @inferevents/sdk",
|
|
47
|
+
`Then init with: init({ projectId: "${result.write_key}" })`,
|
|
48
|
+
];
|
|
49
|
+
return lines.join("\n");
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=create-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/tools/create-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEtE,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,CAAC,8DAA8D,CAAC;IAC3E,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sGAAsG,CAAC;CACpH,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAkD,EAClD,QAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IAEtC,+DAA+D;IAC/D,IAAI,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,wFAAwF,CAAC;IAClG,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC;IAE5C,qCAAqC;IACrC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,yBAAyB,EAAE;QAChE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;KACrE,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAA4B,CAAC;QAChF,OAAO,6BAA6B,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC1E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAMjC,CAAC;IAEF,iBAAiB;IACjB,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAC3E,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAEnF,MAAM,KAAK,GAAG;QACZ,YAAY,MAAM,CAAC,YAAY,8BAA8B;QAC7D,EAAE;QACF,gBAAgB,MAAM,CAAC,UAAU,EAAE;QACnC,gBAAgB,MAAM,CAAC,SAAS,EAAE;QAClC,gBAAgB,MAAM,CAAC,QAAQ,EAAE;QACjC,EAAE;QACF,qCAAqC,IAAI,iBAAiB;QAC1D,EAAE;QACF,yEAAyE;QACzE,sCAAsC,MAAM,CAAC,SAAS,MAAM;KAC7D,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const switchProjectSchema: {
|
|
3
|
+
project_name: z.ZodOptional<z.ZodString>;
|
|
4
|
+
};
|
|
5
|
+
export declare function handleSwitchProject(params: {
|
|
6
|
+
project_name?: string;
|
|
7
|
+
}): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=switch-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch-project.d.ts","sourceRoot":"","sources":["../../src/tools/switch-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,mBAAmB;;CAK/B,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,MAAM,EAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { listProjects, switchProject } from "../config.js";
|
|
3
|
+
export const switchProjectSchema = {
|
|
4
|
+
project_name: z
|
|
5
|
+
.string()
|
|
6
|
+
.optional()
|
|
7
|
+
.describe("Name of the project to switch to. Omit to list all projects."),
|
|
8
|
+
};
|
|
9
|
+
export async function handleSwitchProject(params) {
|
|
10
|
+
const projects = await listProjects();
|
|
11
|
+
if (!params.project_name) {
|
|
12
|
+
if (projects.length === 0) {
|
|
13
|
+
return "No projects configured. Run /infer-setup to create one.";
|
|
14
|
+
}
|
|
15
|
+
const lines = ["Your Infer projects:", ""];
|
|
16
|
+
for (const p of projects) {
|
|
17
|
+
const marker = p.active ? " (active)" : "";
|
|
18
|
+
lines.push(` ${p.name} — ${p.projectId}${marker}`);
|
|
19
|
+
}
|
|
20
|
+
lines.push("", "To switch: call switch_project with the project name.");
|
|
21
|
+
return lines.join("\n");
|
|
22
|
+
}
|
|
23
|
+
const config = await switchProject(params.project_name);
|
|
24
|
+
return `Switched to project "${params.project_name}" (${config.projectId}). MCP tools now query this project.`;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=switch-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switch-project.js","sourceRoot":"","sources":["../../src/tools/switch-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,8DAA8D,CAAC;CAC5E,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAiC;IAEjC,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IAEtC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,yDAAyD,CAAC;QACnE,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,uDAAuD,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACxD,OAAO,wBAAwB,MAAM,CAAC,YAAY,MAAM,MAAM,CAAC,SAAS,sCAAsC,CAAC;AACjH,CAAC"}
|