Files
managing-apps/assets/documentation/MCP-Implementation-Summary.md
cryptooda 6f55566db3 Implement LLM provider configuration and update user settings
- Added functionality to update the default LLM provider for users via a new endpoint in UserController.
- Introduced LlmProvider enum to manage available LLM options: Auto, Gemini, OpenAI, and Claude.
- Updated User and UserEntity models to include DefaultLlmProvider property.
- Enhanced database context and migrations to support the new LLM provider configuration.
- Integrated LLM services into the application bootstrap for dependency injection.
- Updated TypeScript API client to include methods for managing LLM providers and chat requests.
2026-01-03 21:55:55 +07:00

12 KiB

MCP Implementation Summary

Overview

This document summarizes the complete implementation of the in-process MCP (Model Context Protocol) with LLM integration for the Managing trading platform.

Architecture

The implementation follows the architecture diagram provided, with these key components:

  1. Frontend (React/TypeScript): AI chat interface
  2. API Layer (.NET): LLM controller with provider selection
  3. MCP Service: Tool execution and management
  4. LLM Providers: Gemini, OpenAI, Claude adapters
  5. MCP Tools: Backtest pagination tool

Implementation Details

Backend Components

1. Managing.Mcp Project

Location: src/Managing.Mcp/

Purpose: Contains MCP tools that can be called by the LLM

Files Created:

  • Managing.Mcp.csproj - Project configuration with necessary dependencies
  • Tools/BacktestTools.cs - MCP tool for paginated backtest queries

Key Features:

  • GetBacktestsPaginated tool with comprehensive filtering
  • Supports sorting, pagination, and multiple filter criteria
  • Returns structured data for LLM consumption

2. LLM Service Infrastructure

Location: src/Managing.Application/LLM/

Files Created:

  • McpService.cs - Service for executing MCP tools
  • LlmService.cs - Service for LLM provider management
  • Providers/ILlmProvider.cs - Provider interface
  • Providers/GeminiProvider.cs - Google Gemini implementation
  • Providers/OpenAiProvider.cs - OpenAI GPT implementation
  • Providers/ClaudeProvider.cs - Anthropic Claude implementation

Key Features:

  • Auto Mode: Backend automatically selects the best available provider
  • BYOK Support: Users can provide their own API keys
  • Tool Calling: Seamless MCP tool integration
  • Provider Abstraction: Easy to add new LLM providers

3. Service Interfaces

Location: src/Managing.Application.Abstractions/Services/

Files Created:

  • IMcpService.cs - MCP service interface with tool definitions
  • ILlmService.cs - LLM service interface with request/response models

Models:

  • LlmChatRequest - Chat request with messages, provider, and settings
  • LlmChatResponse - Response with content, tool calls, and usage stats
  • LlmMessage - Message in conversation (user/assistant/system/tool)
  • LlmToolCall - Tool call representation
  • McpToolDefinition - Tool metadata and parameter definitions

4. API Controller

Location: src/Managing.Api/Controllers/LlmController.cs

Endpoints:

  • POST /Llm/Chat - Send chat message with MCP tool calling
  • GET /Llm/Providers - Get available LLM providers
  • GET /Llm/Tools - Get available MCP tools

Flow:

  1. Receives chat request from frontend
  2. Fetches available MCP tools
  3. Sends request to selected LLM provider
  4. If LLM requests tool calls, executes them via MCP service
  5. Sends tool results back to LLM
  6. Returns final response to frontend

5. Dependency Injection

Location: src/Managing.Bootstrap/ApiBootstrap.cs

Registrations:

services.AddScoped<ILlmService, LlmService>();
services.AddScoped<IMcpService, McpService>();
services.AddScoped<BacktestTools>();

6. Configuration

Location: src/Managing.Api/appsettings.json

Settings:

{
  "Llm": {
    "Gemini": {
      "ApiKey": "",
      "DefaultModel": "gemini-2.0-flash-exp"
    },
    "OpenAI": {
      "ApiKey": "",
      "DefaultModel": "gpt-4o"
    },
    "Claude": {
      "ApiKey": "",
      "DefaultModel": "claude-3-5-sonnet-20241022"
    }
  }
}

Frontend Components

1. AI Chat Service

Location: src/Managing.WebApp/src/services/aiChatService.ts

Purpose: Client-side service for interacting with LLM API

Methods:

  • sendMessage() - Send chat message to AI
  • getProviders() - Get available LLM providers
  • getTools() - Get available MCP tools

2. AI Chat Component

Location: src/Managing.WebApp/src/components/organism/AiChat.tsx

Features:

  • Real-time chat interface
  • Provider selection (Auto/Gemini/OpenAI/Claude)
  • Message history with timestamps
  • Loading states
  • Error handling
  • Keyboard shortcuts (Enter to send, Shift+Enter for new line)

3. AI Chat Button

Location: src/Managing.WebApp/src/components/organism/AiChatButton.tsx

Features:

  • Floating action button (bottom-right)
  • Expandable chat window
  • Clean, modern UI using DaisyUI

4. App Integration

Location: src/Managing.WebApp/src/app/index.tsx

Integration:

  • Added <AiChatButton /> to main app
  • Available on all authenticated pages

User Flow

Complete Chat Flow

┌──────────────┐
│   User       │
└──────┬───────┘
       │
       │ 1. Clicks AI chat button
       ▼
┌─────────────────────┐
│   AiChat Component  │
│  - Shows chat UI    │
│  - User types query │
└──────┬──────────────┘
       │
       │ 2. POST /Llm/Chat
       │    {messages: [...], provider: "auto"}
       ▼
┌─────────────────────────────────────┐
│   LlmController                      │
│  1. Get available MCP tools          │
│  2. Select provider (Gemini)         │
│  3. Call LLM with tools              │
└──────────┬───────────────────────────┘
           │
           │ 3. LLM returns tool_calls
           │    [{ name: "get_backtests_paginated", args: {...} }]
           ▼
┌─────────────────────────────────────┐
│   Tool Call Handler                  │
│  For each tool call:                 │
│  → Execute via McpService            │
└──────────┬───────────────────────────┘
           │
           │ 4. Execute tool
           ▼
┌─────────────────────────────────────┐
│   BacktestTools                      │
│  → GetBacktestsPaginated(...)        │
│  → Query database via IBacktester    │
│  → Return filtered results           │
└──────────┬───────────────────────────┘
           │
           │ 5. Tool results returned
           ▼
┌─────────────────────────────────────┐
│   LlmController                      │
│  → Send tool results to LLM          │
│  → Get final natural language answer │
└──────────┬───────────────────────────┘
           │
           │ 6. Final response
           ▼
┌─────────────────────────────────────┐
│   AiChat Component                   │
│  → Display AI response to user       │
│  → "Found 10 backtests with..."      │
└─────────────────────────────────────┘

Features Implemented

Auto Mode

  • Backend automatically selects the best available LLM provider
  • Priority: Gemini > OpenAI > Claude (based on cost/performance)

BYOK (Bring Your Own Key)

  • Users can provide their own API keys
  • Keys are never stored, only used for that session
  • Supports all three providers (Gemini, OpenAI, Claude)

MCP Tool Calling

  • LLM can call backend tools seamlessly
  • Tool results automatically sent back to LLM
  • Final response includes tool execution results

Security

  • Backend API keys never exposed to frontend
  • User authentication required for all LLM endpoints
  • Tool execution respects user context

Scalability

  • Easy to add new LLM providers (implement ILlmProvider)
  • Easy to add new MCP tools (create new tool class)
  • Provider abstraction allows switching without code changes

Flexibility

  • Supports both streaming and non-streaming (currently non-streaming)
  • Temperature and max tokens configurable
  • Provider selection per request

Example Usage

Example 1: Query Backtests

User: "Show me my best backtests from the last month with a score above 80"

LLM Thinks: "I need to use the get_backtests_paginated tool"

Tool Call:

{
  "name": "get_backtests_paginated",
  "arguments": {
    "scoreMin": 80,
    "durationMinDays": 30,
    "sortBy": "Score",
    "sortOrder": "desc",
    "pageSize": 10
  }
}

Tool Result: Returns 5 backtests matching criteria

LLM Response: "I found 5 excellent backtests from the past month with scores above 80. The top performer achieved a score of 92.5 with a 68% win rate and minimal drawdown of 12%..."

Example 2: Analyze Specific Ticker

User: "What's the performance of my BTC backtests?"

Tool Call:

{
  "name": "get_backtests_paginated",
  "arguments": {
    "tickers": "BTC",
    "sortBy": "GrowthPercentage",
    "sortOrder": "desc"
  }
}

LLM Response: "Your BTC backtests show strong performance. Out of 15 BTC strategies, the average growth is 34.2%. Your best strategy achieved 87% growth with a Sharpe ratio of 2.1..."

Next Steps

Future Enhancements

  1. Additional MCP Tools:

    • Create/run backtests via chat
    • Get bot status and control
    • Query market data
    • Analyze positions
  2. Streaming Support:

    • Implement SSE (Server-Sent Events)
    • Real-time token streaming
    • Better UX for long responses
  3. Context Management:

    • Persistent chat history
    • Multi-session support
    • Context summarization
  4. Advanced Features:

    • Voice input/output
    • File uploads (CSV analysis)
    • Chart generation
    • Strategy recommendations
  5. Admin Features:

    • Usage analytics per user
    • Cost tracking per provider
    • Rate limiting

Testing

Manual Testing Steps

  1. Configure API Key:

    # Add to appsettings.Development.json or user secrets
    {
      "Llm": {
        "Gemini": {
          "ApiKey": "your-gemini-api-key"
        }
      }
    }
    
  2. Run Backend:

    cd src/Managing.Api
    dotnet run
    
  3. Run Frontend:

    cd src/Managing.WebApp
    npm run dev
    
  4. Test Chat:

    • Login to the app
    • Click the AI chat button (bottom-right)
    • Try queries like:
      • "Show me my backtests"
      • "What are my best performing strategies?"
      • "Find backtests with winrate above 70%"

Example Test Queries

1. "Show me all my backtests sorted by score"
2. "Find backtests for ETH with a score above 75"
3. "What's my best performing backtest this week?"
4. "Show me backtests with low drawdown (under 15%)"
5. "List backtests using the RSI indicator"

Files Modified/Created

Backend

  • src/Managing.Mcp/Managing.Mcp.csproj
  • src/Managing.Mcp/Tools/BacktestTools.cs
  • src/Managing.Application.Abstractions/Services/IMcpService.cs
  • src/Managing.Application.Abstractions/Services/ILlmService.cs
  • src/Managing.Application/LLM/McpService.cs
  • src/Managing.Application/LLM/LlmService.cs
  • src/Managing.Application/LLM/Providers/ILlmProvider.cs
  • src/Managing.Application/LLM/Providers/GeminiProvider.cs
  • src/Managing.Application/LLM/Providers/OpenAiProvider.cs
  • src/Managing.Application/LLM/Providers/ClaudeProvider.cs
  • src/Managing.Api/Controllers/LlmController.cs
  • src/Managing.Bootstrap/ApiBootstrap.cs (modified)
  • src/Managing.Bootstrap/Managing.Bootstrap.csproj (modified)
  • src/Managing.Api/appsettings.json (modified)

Frontend

  • src/Managing.WebApp/src/services/aiChatService.ts
  • src/Managing.WebApp/src/components/organism/AiChat.tsx
  • src/Managing.WebApp/src/components/organism/AiChatButton.tsx
  • src/Managing.WebApp/src/app/index.tsx (modified)

Conclusion

The implementation provides a complete, production-ready AI chat interface with MCP tool calling capabilities. The architecture is:

  • Secure: API keys protected, user authentication required
  • Scalable: Easy to add providers and tools
  • Flexible: Supports auto mode and BYOK
  • Interactive: Real-time chat like Cursor but in the web app
  • Powerful: Can query and analyze backtest data via natural language

The system is ready for testing and can be extended with additional MCP tools for enhanced functionality.