fullstory-mcp-server 1.0.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.
@@ -0,0 +1,172 @@
1
+ import axios, { AxiosError } from 'axios';
2
+ export class FullstoryClient {
3
+ client;
4
+ dataCenter;
5
+ constructor(config) {
6
+ this.dataCenter = config.dataCenter || 'na1';
7
+ const baseURL = this.dataCenter === 'eu1'
8
+ ? 'https://api.eu1.fullstory.com'
9
+ : 'https://api.fullstory.com';
10
+ this.client = axios.create({
11
+ baseURL,
12
+ headers: {
13
+ 'Authorization': `Basic ${config.apiKey}`,
14
+ 'Content-Type': 'application/json',
15
+ },
16
+ });
17
+ }
18
+ handleError(error) {
19
+ if (error instanceof AxiosError) {
20
+ const status = error.response?.status;
21
+ const message = error.response?.data?.message || error.message;
22
+ if (status === 401) {
23
+ throw new Error('Authentication failed. Check your API key.');
24
+ }
25
+ else if (status === 403) {
26
+ throw new Error('Access forbidden. Your API key may not have sufficient permissions.');
27
+ }
28
+ else if (status === 429) {
29
+ throw new Error('Rate limit exceeded. Please wait before making more requests.');
30
+ }
31
+ else if (status === 404) {
32
+ throw new Error('Resource not found.');
33
+ }
34
+ throw new Error(`Fullstory API error: ${message}`);
35
+ }
36
+ throw error;
37
+ }
38
+ // ============ SESSIONS ============
39
+ async getUserSessions(userId, limit = 20) {
40
+ try {
41
+ const response = await this.client.get('/v1/sessions', {
42
+ params: { uid: userId, limit },
43
+ });
44
+ return response.data.sessions || [];
45
+ }
46
+ catch (error) {
47
+ this.handleError(error);
48
+ }
49
+ }
50
+ async getSessionReplayUrl(sessionId) {
51
+ try {
52
+ const response = await this.client.get(`/v1/sessions/${sessionId}`);
53
+ return response.data.fsUrl;
54
+ }
55
+ catch (error) {
56
+ this.handleError(error);
57
+ }
58
+ }
59
+ // ============ USERS ============
60
+ async getUser(userId) {
61
+ try {
62
+ const response = await this.client.get(`/v2/users/${userId}`);
63
+ return response.data;
64
+ }
65
+ catch (error) {
66
+ this.handleError(error);
67
+ }
68
+ }
69
+ async searchUsers(query) {
70
+ try {
71
+ const response = await this.client.post('/v2/users/search', query);
72
+ return response.data.users || [];
73
+ }
74
+ catch (error) {
75
+ this.handleError(error);
76
+ }
77
+ }
78
+ // ============ EVENTS ============
79
+ async getUserEvents(userId, startTime, endTime) {
80
+ try {
81
+ const params = { uid: userId };
82
+ if (startTime)
83
+ params.start = startTime;
84
+ if (endTime)
85
+ params.end = endTime;
86
+ const response = await this.client.get('/v1/users/events', { params });
87
+ return response.data.events || [];
88
+ }
89
+ catch (error) {
90
+ this.handleError(error);
91
+ }
92
+ }
93
+ async sendEvent(event) {
94
+ try {
95
+ await this.client.post('/v2/events', {
96
+ user: { uid: event.userId },
97
+ session: event.sessionId ? { id: event.sessionId } : undefined,
98
+ name: event.eventName,
99
+ properties: event.eventData,
100
+ timestamp: event.timestamp || new Date().toISOString(),
101
+ });
102
+ }
103
+ catch (error) {
104
+ this.handleError(error);
105
+ }
106
+ }
107
+ // ============ SEGMENT EXPORTS ============
108
+ async createSegmentExport(request) {
109
+ try {
110
+ const response = await this.client.post('/segments/v1/exports', {
111
+ segmentId: request.segmentId,
112
+ type: request.type.toUpperCase(),
113
+ format: request.format || 'FORMAT_JSON',
114
+ timeRange: {
115
+ start: request.startTime,
116
+ end: request.endTime,
117
+ },
118
+ });
119
+ return {
120
+ operationId: response.data.operationId,
121
+ status: 'PENDING',
122
+ };
123
+ }
124
+ catch (error) {
125
+ this.handleError(error);
126
+ }
127
+ }
128
+ async getExportStatus(operationId) {
129
+ try {
130
+ const response = await this.client.get(`/operations/v1/${operationId}`);
131
+ return {
132
+ operationId,
133
+ status: response.data.state,
134
+ progress: response.data.progress,
135
+ downloadUrl: response.data.results?.downloadUrl,
136
+ };
137
+ }
138
+ catch (error) {
139
+ this.handleError(error);
140
+ }
141
+ }
142
+ async downloadExport(downloadUrl) {
143
+ try {
144
+ const response = await axios.get(downloadUrl);
145
+ return response.data;
146
+ }
147
+ catch (error) {
148
+ this.handleError(error);
149
+ }
150
+ }
151
+ // ============ SEGMENTS ============
152
+ async listSegments() {
153
+ try {
154
+ const response = await this.client.get('/segments/v1');
155
+ return response.data.segments || [];
156
+ }
157
+ catch (error) {
158
+ this.handleError(error);
159
+ }
160
+ }
161
+ // ============ AUDIT / SETTINGS ============
162
+ async getAuditTrail(settingType) {
163
+ try {
164
+ const response = await this.client.get(`/settings/v1/audit/${settingType}`);
165
+ return response.data;
166
+ }
167
+ catch (error) {
168
+ this.handleError(error);
169
+ }
170
+ }
171
+ }
172
+ //# sourceMappingURL=fullstory-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fullstory-client.js","sourceRoot":"","sources":["../src/fullstory-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,401 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
5
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
6
+ import { createServer } from 'http';
7
+ import { FullstoryClient } from './fullstory-client.js';
8
+ // Configuration from environment variables
9
+ const FULLSTORY_API_KEY = process.env.FULLSTORY_API_KEY;
10
+ const FULLSTORY_DATA_CENTER = process.env.FULLSTORY_DATA_CENTER || 'na1';
11
+ const PORT = parseInt(process.env.PORT || '3000', 10);
12
+ const TRANSPORT = process.env.TRANSPORT || 'stdio'; // 'stdio' or 'http'
13
+ if (!FULLSTORY_API_KEY) {
14
+ console.error('Error: FULLSTORY_API_KEY environment variable is required');
15
+ process.exit(1);
16
+ }
17
+ // Initialize Fullstory client
18
+ const fullstory = new FullstoryClient({
19
+ apiKey: FULLSTORY_API_KEY,
20
+ dataCenter: FULLSTORY_DATA_CENTER,
21
+ });
22
+ // Define available tools
23
+ const tools = [
24
+ {
25
+ name: 'fullstory_get_user_sessions',
26
+ description: 'Retrieve session replay data for a specific user. Returns list of sessions with replay URLs.',
27
+ inputSchema: {
28
+ type: 'object',
29
+ properties: {
30
+ userId: {
31
+ type: 'string',
32
+ description: 'The user ID (uid) to look up sessions for',
33
+ },
34
+ limit: {
35
+ type: 'number',
36
+ description: 'Maximum number of sessions to return (default: 20)',
37
+ },
38
+ },
39
+ required: ['userId'],
40
+ },
41
+ },
42
+ {
43
+ name: 'fullstory_get_session_replay_url',
44
+ description: 'Get a direct URL to watch a specific session replay in Fullstory.',
45
+ inputSchema: {
46
+ type: 'object',
47
+ properties: {
48
+ sessionId: {
49
+ type: 'string',
50
+ description: 'The session ID to get replay URL for',
51
+ },
52
+ },
53
+ required: ['sessionId'],
54
+ },
55
+ },
56
+ {
57
+ name: 'fullstory_get_user',
58
+ description: 'Get detailed information about a specific user including custom properties.',
59
+ inputSchema: {
60
+ type: 'object',
61
+ properties: {
62
+ userId: {
63
+ type: 'string',
64
+ description: 'The user ID to look up',
65
+ },
66
+ },
67
+ required: ['userId'],
68
+ },
69
+ },
70
+ {
71
+ name: 'fullstory_search_users',
72
+ description: 'Search for users matching specific criteria.',
73
+ inputSchema: {
74
+ type: 'object',
75
+ properties: {
76
+ email: {
77
+ type: 'string',
78
+ description: 'Filter by email address',
79
+ },
80
+ displayName: {
81
+ type: 'string',
82
+ description: 'Filter by display name',
83
+ },
84
+ customProperty: {
85
+ type: 'object',
86
+ description: 'Filter by custom property (key-value pair)',
87
+ properties: {
88
+ key: { type: 'string' },
89
+ value: { type: 'string' },
90
+ },
91
+ },
92
+ },
93
+ },
94
+ },
95
+ {
96
+ name: 'fullstory_get_user_events',
97
+ description: 'Retrieve events recorded for a specific user within a time range.',
98
+ inputSchema: {
99
+ type: 'object',
100
+ properties: {
101
+ userId: {
102
+ type: 'string',
103
+ description: 'The user ID to get events for',
104
+ },
105
+ startTime: {
106
+ type: 'string',
107
+ description: 'Start time in ISO 8601 format (e.g., 2024-01-01T00:00:00Z)',
108
+ },
109
+ endTime: {
110
+ type: 'string',
111
+ description: 'End time in ISO 8601 format',
112
+ },
113
+ },
114
+ required: ['userId'],
115
+ },
116
+ },
117
+ {
118
+ name: 'fullstory_list_segments',
119
+ description: 'List all available segments in your Fullstory account.',
120
+ inputSchema: {
121
+ type: 'object',
122
+ properties: {},
123
+ },
124
+ },
125
+ {
126
+ name: 'fullstory_export_segment',
127
+ description: 'Start an export job for a segment. Returns an operation ID to check status.',
128
+ inputSchema: {
129
+ type: 'object',
130
+ properties: {
131
+ segmentId: {
132
+ type: 'string',
133
+ description: 'The segment ID to export',
134
+ },
135
+ type: {
136
+ type: 'string',
137
+ enum: ['individuals', 'events'],
138
+ description: 'Export type: "individuals" for user data or "events" for event data',
139
+ },
140
+ format: {
141
+ type: 'string',
142
+ enum: ['FORMAT_CSV', 'FORMAT_JSON', 'FORMAT_NDJSON'],
143
+ description: 'Export format (default: FORMAT_JSON)',
144
+ },
145
+ startTime: {
146
+ type: 'string',
147
+ description: 'Start time for the export range (ISO 8601)',
148
+ },
149
+ endTime: {
150
+ type: 'string',
151
+ description: 'End time for the export range (ISO 8601)',
152
+ },
153
+ },
154
+ required: ['segmentId', 'type'],
155
+ },
156
+ },
157
+ {
158
+ name: 'fullstory_get_export_status',
159
+ description: 'Check the status of a segment export job. Returns progress and download URL when complete.',
160
+ inputSchema: {
161
+ type: 'object',
162
+ properties: {
163
+ operationId: {
164
+ type: 'string',
165
+ description: 'The operation ID from the export request',
166
+ },
167
+ },
168
+ required: ['operationId'],
169
+ },
170
+ },
171
+ {
172
+ name: 'fullstory_download_export',
173
+ description: 'Download the results of a completed export job.',
174
+ inputSchema: {
175
+ type: 'object',
176
+ properties: {
177
+ downloadUrl: {
178
+ type: 'string',
179
+ description: 'The download URL from the completed export status',
180
+ },
181
+ },
182
+ required: ['downloadUrl'],
183
+ },
184
+ },
185
+ {
186
+ name: 'fullstory_send_event',
187
+ description: 'Send a custom event to Fullstory for a user.',
188
+ inputSchema: {
189
+ type: 'object',
190
+ properties: {
191
+ userId: {
192
+ type: 'string',
193
+ description: 'The user ID to associate the event with',
194
+ },
195
+ sessionId: {
196
+ type: 'string',
197
+ description: 'Optional session ID to associate the event with',
198
+ },
199
+ eventName: {
200
+ type: 'string',
201
+ description: 'Name of the custom event',
202
+ },
203
+ eventData: {
204
+ type: 'object',
205
+ description: 'Additional event properties (key-value pairs)',
206
+ },
207
+ },
208
+ required: ['userId', 'eventName'],
209
+ },
210
+ },
211
+ ];
212
+ // Tool execution handler
213
+ async function executeTool(name, args) {
214
+ switch (name) {
215
+ case 'fullstory_get_user_sessions': {
216
+ const sessions = await fullstory.getUserSessions(args?.userId, args?.limit);
217
+ return JSON.stringify(sessions, null, 2);
218
+ }
219
+ case 'fullstory_get_session_replay_url': {
220
+ const url = await fullstory.getSessionReplayUrl(args?.sessionId);
221
+ return `Session replay URL: ${url}`;
222
+ }
223
+ case 'fullstory_get_user': {
224
+ const user = await fullstory.getUser(args?.userId);
225
+ return JSON.stringify(user, null, 2);
226
+ }
227
+ case 'fullstory_search_users': {
228
+ const query = {};
229
+ if (args?.email)
230
+ query.email = args.email;
231
+ if (args?.displayName)
232
+ query.displayName = args.displayName;
233
+ if (args?.customProperty) {
234
+ const prop = args.customProperty;
235
+ query[prop.key] = prop.value;
236
+ }
237
+ const users = await fullstory.searchUsers(query);
238
+ return JSON.stringify(users, null, 2);
239
+ }
240
+ case 'fullstory_get_user_events': {
241
+ const events = await fullstory.getUserEvents(args?.userId, args?.startTime, args?.endTime);
242
+ return JSON.stringify(events, null, 2);
243
+ }
244
+ case 'fullstory_list_segments': {
245
+ const segments = await fullstory.listSegments();
246
+ return JSON.stringify(segments, null, 2);
247
+ }
248
+ case 'fullstory_export_segment': {
249
+ const exportResult = await fullstory.createSegmentExport({
250
+ segmentId: args?.segmentId,
251
+ type: args?.type,
252
+ format: args?.format,
253
+ startTime: args?.startTime,
254
+ endTime: args?.endTime,
255
+ });
256
+ return `Export started. Operation ID: ${exportResult.operationId}\nUse fullstory_get_export_status to check progress.`;
257
+ }
258
+ case 'fullstory_get_export_status': {
259
+ const status = await fullstory.getExportStatus(args?.operationId);
260
+ return JSON.stringify(status, null, 2);
261
+ }
262
+ case 'fullstory_download_export': {
263
+ const data = await fullstory.downloadExport(args?.downloadUrl);
264
+ return JSON.stringify(data, null, 2);
265
+ }
266
+ case 'fullstory_send_event': {
267
+ await fullstory.sendEvent({
268
+ userId: args?.userId,
269
+ sessionId: args?.sessionId,
270
+ eventName: args?.eventName,
271
+ eventData: args?.eventData,
272
+ });
273
+ return 'Event sent successfully.';
274
+ }
275
+ default:
276
+ throw new Error(`Unknown tool: ${name}`);
277
+ }
278
+ }
279
+ // Create server instance
280
+ function createMcpServer() {
281
+ const server = new Server({
282
+ name: 'fullstory-mcp-server',
283
+ version: '1.0.0',
284
+ }, {
285
+ capabilities: {
286
+ tools: {},
287
+ },
288
+ });
289
+ // Handle tool listing
290
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
291
+ return { tools };
292
+ });
293
+ // Handle tool execution
294
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
295
+ const { name, arguments: args } = request.params;
296
+ try {
297
+ const result = await executeTool(name, args);
298
+ return {
299
+ content: [{ type: 'text', text: result }],
300
+ };
301
+ }
302
+ catch (error) {
303
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
304
+ return {
305
+ content: [{ type: 'text', text: `Error: ${errorMessage}` }],
306
+ isError: true,
307
+ };
308
+ }
309
+ });
310
+ return server;
311
+ }
312
+ // Start with stdio transport (for local use)
313
+ async function startStdio() {
314
+ const server = createMcpServer();
315
+ const transport = new StdioServerTransport();
316
+ await server.connect(transport);
317
+ console.error('Fullstory MCP Server running on stdio');
318
+ }
319
+ // Start with HTTP/SSE transport (for cloud deployment)
320
+ async function startHttp() {
321
+ const sessions = new Map();
322
+ const httpServer = createServer(async (req, res) => {
323
+ // CORS headers
324
+ res.setHeader('Access-Control-Allow-Origin', '*');
325
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
326
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
327
+ if (req.method === 'OPTIONS') {
328
+ res.writeHead(204);
329
+ res.end();
330
+ return;
331
+ }
332
+ // Health check endpoint
333
+ if (req.url === '/health') {
334
+ res.writeHead(200, { 'Content-Type': 'application/json' });
335
+ res.end(JSON.stringify({ status: 'ok', server: 'fullstory-mcp-server' }));
336
+ return;
337
+ }
338
+ // SSE endpoint for MCP connection
339
+ if (req.url === '/sse' && req.method === 'GET') {
340
+ const server = createMcpServer();
341
+ const transport = new SSEServerTransport('/message', res);
342
+ const sessionId = Date.now().toString();
343
+ sessions.set(sessionId, transport);
344
+ res.on('close', () => {
345
+ sessions.delete(sessionId);
346
+ });
347
+ await server.connect(transport);
348
+ return;
349
+ }
350
+ // Message endpoint for SSE
351
+ if (req.url === '/message' && req.method === 'POST') {
352
+ let body = '';
353
+ req.on('data', chunk => { body += chunk; });
354
+ req.on('end', async () => {
355
+ try {
356
+ // Find active session and forward message
357
+ for (const transport of sessions.values()) {
358
+ await transport.handlePostMessage(req, res, body);
359
+ return;
360
+ }
361
+ res.writeHead(404);
362
+ res.end('No active session');
363
+ }
364
+ catch (error) {
365
+ res.writeHead(500);
366
+ res.end('Error processing message');
367
+ }
368
+ });
369
+ return;
370
+ }
371
+ // Default response
372
+ res.writeHead(200, { 'Content-Type': 'application/json' });
373
+ res.end(JSON.stringify({
374
+ name: 'fullstory-mcp-server',
375
+ version: '1.0.0',
376
+ endpoints: {
377
+ health: '/health',
378
+ sse: '/sse',
379
+ message: '/message'
380
+ }
381
+ }));
382
+ });
383
+ httpServer.listen(PORT, () => {
384
+ console.log(`Fullstory MCP Server running on http://0.0.0.0:${PORT}`);
385
+ console.log(`SSE endpoint: http://0.0.0.0:${PORT}/sse`);
386
+ });
387
+ }
388
+ // Main entry point
389
+ async function main() {
390
+ if (TRANSPORT === 'http') {
391
+ await startHttp();
392
+ }
393
+ else {
394
+ await startStdio();
395
+ }
396
+ }
397
+ main().catch((error) => {
398
+ console.error('Fatal error:', error);
399
+ process.exit(1);
400
+ });
401
+ //# 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,31 @@
1
+ {
2
+ "name": "fullstory-mcp-server",
3
+ "version": "1.0.1",
4
+ "description": "MCP Server for Fullstory analytics integration with Claude",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "fullstory-mcp-server": "dist/cli.js"
8
+ },
9
+ "type": "module",
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "start": "node dist/index.js",
13
+ "dev": "tsx src/index.ts",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": ["mcp", "fullstory", "claude", "anthropic", "analytics"],
17
+ "author": "Olena Osipenkova",
18
+ "license": "MIT",
19
+ "dependencies": {
20
+ "@modelcontextprotocol/sdk": "^1.0.0",
21
+ "axios": "^1.6.0",
22
+ "zod": "^3.22.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^20.10.0",
26
+ "typescript": "^5.3.0"
27
+ },
28
+ "engines": {
29
+ "node": ">=18"
30
+ }
31
+ }