@inferevents/mcp 0.2.0 → 0.3.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 ADDED
@@ -0,0 +1,118 @@
1
+ # @inferevents/mcp
2
+
3
+ MCP server for [Infer](https://infer.events) — analytics designed for AI agents, not dashboards.
4
+
5
+ Connects to Claude Code (or any MCP client) and exposes 5 analytics tools. Includes auto-detected insights pushed hourly.
6
+
7
+ ## Install
8
+
9
+ Add to your Claude Code MCP config:
10
+
11
+ ```json
12
+ {
13
+ "mcpServers": {
14
+ "infer": {
15
+ "command": "npx",
16
+ "args": ["@inferevents/mcp"]
17
+ }
18
+ }
19
+ }
20
+ ```
21
+
22
+ The server reads credentials from `~/.infer/config.json`:
23
+
24
+ ```json
25
+ {
26
+ "apiKey": "pk_read_...",
27
+ "endpoint": "https://api.infer.events",
28
+ "projectId": "proj_..."
29
+ }
30
+ ```
31
+
32
+ ## Tools
33
+
34
+ ### `get_insights`
35
+
36
+ Returns auto-detected anomalies and notable patterns. Computed hourly by the Infer backend. Always call this first.
37
+
38
+ ```
39
+ "Any insights?" → get_insights()
40
+ "What's wrong?" → get_insights(severity: "critical")
41
+ ```
42
+
43
+ Returns pre-computed findings: volume drops, error spikes, new events, milestones, cohort trends.
44
+
45
+ ### `get_event_counts`
46
+
47
+ Count events over a time range, optionally grouped by a property.
48
+
49
+ ```
50
+ "How many signups this week?" → get_event_counts(event_name: "signup", time_range: "last_7d")
51
+ "Signups by country" → get_event_counts(event_name: "signup", time_range: "last_7d", group_by: "country")
52
+ "Compare this week vs last" → two calls with different time_range values
53
+ ```
54
+
55
+ Supports grouping by event properties, context fields (browser, os, country, city), and top-level columns (anonymous_id, user_id).
56
+
57
+ ### `get_retention`
58
+
59
+ Cohort-based retention analysis.
60
+
61
+ ```
62
+ "What's our retention?" → get_retention(start_event: "signup", return_event: "page_view", time_range: "last_30d", granularity: "week")
63
+ "Do users come back after onboarding?" → get_retention(start_event: "onboarding_done", return_event: "login", ...)
64
+ ```
65
+
66
+ Returns retention percentages per cohort with visual bar charts and benchmark indicators.
67
+
68
+ ### `get_user_journey`
69
+
70
+ Ordered event sequence for a specific user.
71
+
72
+ ```
73
+ "What did this user do?" → get_user_journey(user_id: "user_123")
74
+ "Trace a churned user" → get_user_journey(user_id: "<id from get_event_counts group_by anonymous_id>")
75
+ ```
76
+
77
+ Groups events into sessions (30-min gap), shows timestamps and properties.
78
+
79
+ ### `get_top_events`
80
+
81
+ Most frequent events with counts and unique users.
82
+
83
+ ```
84
+ "What events are being tracked?" → get_top_events(time_range: "last_30d")
85
+ "Top events this week" → get_top_events(time_range: "last_7d", limit: 10)
86
+ ```
87
+
88
+ Includes available fields for `group_by` so the agent knows what it can query.
89
+
90
+ ## Output format
91
+
92
+ All tools return pre-formatted text with Unicode bar charts inside code blocks:
93
+
94
+ ```
95
+ Top Events — last_7d
96
+ 84 total events across 8 types
97
+ ──────────────────────────────────────────────────
98
+
99
+ click ████████████████████ 26 (31%)
100
+
101
+ demo_tab_clicked ███████████████████░ 25 (30%)
102
+
103
+ page_view ████████████░░░░░░░░ 16 (19%)
104
+ ```
105
+
106
+ ## Skills
107
+
108
+ Install the agent skills for guided analytics workflows:
109
+
110
+ ```bash
111
+ npx skills add infer-events/skills
112
+ ```
113
+
114
+ Skills teach the agent how to interpret data, run health checks, build tracking plans, and keep everything updated.
115
+
116
+ ## License
117
+
118
+ MIT
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
  }
@@ -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;AAkBD,wBAAsB,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC,CA+CvD;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B"}
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 CONFIG_PATH = join(homedir(), ".infer", "config.json");
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
- To set up, create ~/.infer/config.json with:
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
- "projectId": "your-project-id"
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
- const apiKey = config.apiKey;
41
- if (!apiKey.startsWith("pk_read_")) {
42
- throw new ConfigError(`The MCP server requires a read API key (starts with "pk_read_"). ` +
43
- `The key in ${CONFIG_PATH} appears to be a different key type.`);
44
- }
45
- const endpoint = typeof config.endpoint === "string"
46
- ? config.endpoint.replace(/\/+$/, "")
47
- : "https://api.infer.events";
48
- const projectId = typeof config.projectId === "string" ? config.projectId : undefined;
49
- return { apiKey, endpoint, projectId };
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAQlC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;AAE7D,MAAM,kBAAkB,GAAG;;;;;;;;;;;;CAY1B,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,WAAW,CACnB,mBAAmB,WAAW,iCAAiC,CAChE,CAAC;IACJ,CAAC;IAED,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACf,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC;QACrB,OAAQ,MAAkC,CAAC,MAAM,KAAK,QAAQ,EAC9D,CAAC;QACD,MAAM,IAAI,WAAW,CACnB,kCAAkC,WAAW,QAAQ,kBAAkB,EAAE,CAC1E,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAgB,CAAC;IAEvC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,WAAW,CACnB,mEAAmE;YACjE,cAAc,WAAW,sCAAsC,CAClE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GACZ,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QACjC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,CAAC,CAAC,0BAA0B,CAAC;IAEjC,MAAM,SAAS,GACb,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -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,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAsB/C,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAkH3D"}
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,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA8B/C,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAwJ3D"}
package/dist/server.js CHANGED
@@ -6,6 +6,8 @@ import { getRetentionSchema, handleGetRetention, } from "./tools/get-retention.j
6
6
  import { getUserJourneySchema, handleGetUserJourney, } from "./tools/get-user-journey.js";
7
7
  import { getTopEventsSchema, handleGetTopEvents, } from "./tools/get-top-events.js";
8
8
  import { getInsightsSchema, handleGetInsights, } from "./tools/get-insights.js";
9
+ import { switchProjectSchema, handleSwitchProject, } from "./tools/switch-project.js";
10
+ import { createProjectSchema, handleCreateProject, } from "./tools/create-project.js";
9
11
  export function createServer(config) {
10
12
  const client = new ApiClient(config);
11
13
  const server = new McpServer({
@@ -90,6 +92,34 @@ export function createServer(config) {
90
92
  };
91
93
  }
92
94
  });
95
+ server.tool("switch_project", "Switch between Infer projects or list all configured projects. " +
96
+ "Use when the user says 'switch to project X' or 'list my projects' or " +
97
+ "wants to query data from a different project.", switchProjectSchema, async (params) => {
98
+ try {
99
+ const text = await handleSwitchProject(params);
100
+ return { content: [{ type: "text", text }] };
101
+ }
102
+ catch (error) {
103
+ return {
104
+ content: [{ type: "text", text: formatError(error) }],
105
+ isError: true,
106
+ };
107
+ }
108
+ });
109
+ server.tool("create_project", "Create a new Infer project from the CLI. " +
110
+ "Use when the user wants to add analytics to a new codebase. " +
111
+ "Requires an active session from prior signup.", createProjectSchema, async (params) => {
112
+ try {
113
+ const text = await handleCreateProject(params, config.endpoint);
114
+ return { content: [{ type: "text", text }] };
115
+ }
116
+ catch (error) {
117
+ return {
118
+ content: [{ type: "text", text: formatError(error) }],
119
+ isError: true,
120
+ };
121
+ }
122
+ });
93
123
  return server;
94
124
  }
95
125
  function formatError(error) {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@inferevents/mcp",
3
- "version": "0.2.0",
4
- "description": "MCP server for Infer analytics — lets AI agents query your event data",
3
+ "version": "0.3.0",
4
+ "description": "MCP server for Infer analytics — 5 tools including auto-detected insights pushed hourly",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -16,7 +16,8 @@
16
16
  },
17
17
  "files": [
18
18
  "dist",
19
- "skill.md"
19
+ "skill.md",
20
+ "README.md"
20
21
  ],
21
22
  "scripts": {
22
23
  "build": "tsc",