import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from '@modelcontextprotocol/sdk/types.js';
import { trackMCP } from 'agnost';
// Create server
const server = new Server(
{
name: 'analytics-demo-server',
version: '1.0.0',
},
{
capabilities: {
tools: {},
},
}
);
// Define available tools
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: 'analyze_text',
description: 'Analyze text and return statistics',
inputSchema: {
type: 'object',
properties: {
text: {
type: 'string',
description: 'Text to analyze',
},
},
required: ['text'],
},
},
{
name: 'generate_report',
description: 'Generate a report based on data',
inputSchema: {
type: 'object',
properties: {
dataType: {
type: 'string',
enum: ['sales', 'users', 'performance'],
description: 'Type of report to generate',
},
timeRange: {
type: 'string',
description: 'Time range for the report (e.g., "7d", "30d")',
},
},
required: ['dataType', 'timeRange'],
},
},
],
};
});
// Handle tool execution
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
switch (name) {
case 'analyze_text': {
const { text } = args as { text: string };
const wordCount = text.split(/\s+/).length;
const charCount = text.length;
const sentenceCount = text.split(/[.!?]+/).length - 1;
return {
content: [
{
type: 'text',
text: JSON.stringify({
wordCount,
charCount,
sentenceCount,
avgWordLength: (charCount / wordCount).toFixed(2),
}, null, 2),
},
],
};
}
case 'generate_report': {
const { dataType, timeRange } = args as {
dataType: string;
timeRange: string;
};
return {
content: [
{
type: 'text',
text: `Generated ${dataType} report for time range: ${timeRange}\n\nReport ID: ${Date.now()}\nStatus: Success`,
},
],
};
}
default:
throw new Error(`Unknown tool: ${name}`);
}
});
// Add analytics with user identification
trackMCP(server, 'your-org-id-here', {
endpoint: 'https://api.agnost.ai',
disableInput: false,
disableOutput: false,
identify: (request, env) => ({
userId: request?.headers?.['x-user-id'] || env?.USER_ID || 'anonymous',
email: request?.headers?.['x-user-email'] || env?.USER_EMAIL,
}),
});
// Start server
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
console.error('Analytics Demo MCP Server running on stdio');
}
main().catch((error) => {
console.error('Server error:', error);
process.exit(1);
});