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.
This commit is contained in:
392
assets/documentation/MCP-Architecture.md
Normal file
392
assets/documentation/MCP-Architecture.md
Normal file
@@ -0,0 +1,392 @@
|
||||
# MCP (Model Context Protocol) Architecture
|
||||
|
||||
## Overview
|
||||
|
||||
This document describes the Model Context Protocol (MCP) architecture for the Managing trading platform. The architecture uses a dual-MCP approach: one internal C# MCP server for proprietary tools, and one open-source Node.js MCP server for community use.
|
||||
|
||||
## Architecture Decision
|
||||
|
||||
**Selected Option: Option 4 - Two MCP Servers by Deployment Model**
|
||||
|
||||
- **C# MCP Server**: Internal, in-process, proprietary tools
|
||||
- **Node.js MCP Server**: Standalone, open-source, community-distributed
|
||||
|
||||
## Rationale
|
||||
|
||||
### Why Two MCP Servers?
|
||||
|
||||
1. **Proprietary vs Open Source Separation**
|
||||
- C# MCP: Contains proprietary business logic, trading algorithms, and internal tools
|
||||
- Node.js MCP: Public tools that can be open-sourced and contributed to by the community
|
||||
|
||||
2. **Deployment Flexibility**
|
||||
- C# MCP: Runs in-process within the API (fast, secure, no external access)
|
||||
- Node.js MCP: Community members install and run independently using their own API keys
|
||||
|
||||
3. **Community Adoption**
|
||||
- Node.js MCP can be published to npm
|
||||
- Community can contribute improvements
|
||||
- Works with existing Node.js MCP ecosystem
|
||||
|
||||
4. **Security & Access Control**
|
||||
- Internal tools stay private
|
||||
- Public tools use ManagingApiKeys for authentication
|
||||
- Each community member uses their own API key
|
||||
|
||||
## Architecture Diagram
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Your Infrastructure │
|
||||
│ │
|
||||
│ ┌──────────────┐ ┌──────────────┐ │
|
||||
│ │ LLM Service │─────▶│ C# MCP │ │
|
||||
│ │ (Your API) │ │ (Internal) │ │
|
||||
│ └──────────────┘ └──────────────┘ │
|
||||
│ │ │
|
||||
│ │ HTTP + API Key │
|
||||
│ ▼ │
|
||||
│ ┌─────────────────────────────────────┐ │
|
||||
│ │ Public API Endpoints │ │
|
||||
│ │ - /api/public/agents │ │
|
||||
│ │ - /api/public/market-data │ │
|
||||
│ │ - (Protected by ManagingApiKeys) │ │
|
||||
│ └─────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
▲
|
||||
│ HTTP + API Key
|
||||
│
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ Community Infrastructure (Each User Runs Their Own) │
|
||||
│ │
|
||||
│ ┌──────────────┐ ┌──────────────┐ │
|
||||
│ │ LLM Client │─────▶│ Node.js MCP │ │
|
||||
│ │ (Claude, etc)│ │ (Open Source)│ │
|
||||
│ └──────────────┘ └──────────────┘ │
|
||||
│ │ │
|
||||
│ │ Uses ManagingApiKey │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────────┐ │
|
||||
│ │ API Key Config │ │
|
||||
│ │ (User's Key) │ │
|
||||
│ └─────────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Component Details
|
||||
|
||||
### 1. C# MCP Server (Internal/Proprietary)
|
||||
|
||||
**Location**: `src/Managing.Mcp/`
|
||||
|
||||
**Characteristics**:
|
||||
- Runs in-process within the API
|
||||
- Contains proprietary trading logic
|
||||
- Direct access to internal services via DI
|
||||
- Fast execution (no network overhead)
|
||||
- Not exposed externally
|
||||
|
||||
**Tools**:
|
||||
- Internal trading operations
|
||||
- Proprietary analytics
|
||||
- Business-critical operations
|
||||
- Admin functions
|
||||
|
||||
**Implementation**:
|
||||
```csharp
|
||||
[McpServerToolType]
|
||||
public static class InternalTradingTools
|
||||
{
|
||||
[McpServerTool, Description("Open a trading position (internal only)")]
|
||||
public static async Task<object> OpenPosition(
|
||||
ITradingService tradingService,
|
||||
IAccountService accountService,
|
||||
// ... internal services
|
||||
) { }
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Node.js MCP Server (Open Source/Community)
|
||||
|
||||
**Location**: `src/Managing.Mcp.Nodejs/` (future)
|
||||
|
||||
**Characteristics**:
|
||||
- Standalone Node.js package
|
||||
- Published to npm
|
||||
- Community members install and run independently
|
||||
- Connects to public API endpoints
|
||||
- Uses ManagingApiKeys for authentication
|
||||
|
||||
**Tools**:
|
||||
- Public agent summaries
|
||||
- Market data queries
|
||||
- Public analytics
|
||||
- Read-only operations
|
||||
|
||||
**Distribution**:
|
||||
- Published as `@yourorg/managing-mcp` on npm
|
||||
- Community members install: `npm install -g @yourorg/managing-mcp`
|
||||
- Each user configures their own API key
|
||||
|
||||
### 3. Public API Endpoints
|
||||
|
||||
**Location**: `src/Managing.Api/Controllers/PublicController.cs`
|
||||
|
||||
**Purpose**:
|
||||
- Expose safe, public data to community
|
||||
- Protected by ManagingApiKeys authentication
|
||||
- Rate-limited per API key
|
||||
- Audit trail for usage
|
||||
|
||||
**Endpoints**:
|
||||
- `GET /api/public/agents/{agentName}` - Get public agent summary
|
||||
- `GET /api/public/agents` - List public agents
|
||||
- `GET /api/public/market-data/{ticker}` - Get market data
|
||||
|
||||
**Security**:
|
||||
- API key authentication required
|
||||
- Only returns public-safe data
|
||||
- No internal business logic exposed
|
||||
|
||||
### 4. ManagingApiKeys Feature
|
||||
|
||||
**Status**: Not yet implemented
|
||||
|
||||
**Purpose**:
|
||||
- Authenticate community members using Node.js MCP
|
||||
- Control access to public API endpoints
|
||||
- Enable rate limiting per user
|
||||
- Track usage and analytics
|
||||
|
||||
**Implementation Requirements**:
|
||||
- API key generation and management
|
||||
- API key validation middleware
|
||||
- User association with API keys
|
||||
- Rate limiting per key
|
||||
- Usage tracking and analytics
|
||||
|
||||
## Implementation Phases
|
||||
|
||||
### Phase 1: C# MCP Server (Current)
|
||||
|
||||
**Status**: To be implemented
|
||||
|
||||
**Tasks**:
|
||||
- [ ] Install ModelContextProtocol NuGet package
|
||||
- [ ] Create `Managing.Mcp` project structure
|
||||
- [ ] Implement internal tools using `[McpServerTool]` attributes
|
||||
- [ ] Create in-process MCP server service
|
||||
- [ ] Integrate with LLM service
|
||||
- [ ] Register in DI container
|
||||
|
||||
**Files to Create**:
|
||||
- `src/Managing.Mcp/Managing.Mcp.csproj`
|
||||
- `src/Managing.Mcp/Tools/InternalTradingTools.cs`
|
||||
- `src/Managing.Mcp/Tools/InternalAdminTools.cs`
|
||||
- `src/Managing.Application/LLM/IMcpService.cs`
|
||||
- `src/Managing.Application/LLM/McpService.cs`
|
||||
|
||||
### Phase 2: Public API Endpoints
|
||||
|
||||
**Status**: To be implemented
|
||||
|
||||
**Tasks**:
|
||||
- [ ] Create `PublicController` with public endpoints
|
||||
- [ ] Implement `ApiKeyAuthenticationHandler`
|
||||
- [ ] Create `[ApiKeyAuth]` attribute
|
||||
- [ ] Design public data models (only safe data)
|
||||
- [ ] Add rate limiting per API key
|
||||
- [ ] Implement usage tracking
|
||||
|
||||
**Files to Create**:
|
||||
- `src/Managing.Api/Controllers/PublicController.cs`
|
||||
- `src/Managing.Api/Authentication/ApiKeyAuthenticationHandler.cs`
|
||||
- `src/Managing.Api/Filters/ApiKeyAuthAttribute.cs`
|
||||
- `src/Managing.Application/Abstractions/Services/IApiKeyService.cs`
|
||||
- `src/Managing.Application/ApiKeys/ApiKeyService.cs`
|
||||
|
||||
### Phase 3: ManagingApiKeys Feature
|
||||
|
||||
**Status**: Not yet ready
|
||||
|
||||
**Tasks**:
|
||||
- [ ] Design API key database schema
|
||||
- [ ] Implement API key generation
|
||||
- [ ] Create API key management UI/API
|
||||
- [ ] Add API key validation
|
||||
- [ ] Implement rate limiting
|
||||
- [ ] Add usage analytics
|
||||
|
||||
**Database Schema** (proposed):
|
||||
```sql
|
||||
CREATE TABLE api_keys (
|
||||
id UUID PRIMARY KEY,
|
||||
user_id UUID REFERENCES users(id),
|
||||
key_hash VARCHAR(255) NOT NULL,
|
||||
name VARCHAR(255),
|
||||
created_at TIMESTAMP,
|
||||
last_used_at TIMESTAMP,
|
||||
expires_at TIMESTAMP,
|
||||
rate_limit_per_hour INTEGER,
|
||||
is_active BOOLEAN
|
||||
);
|
||||
```
|
||||
|
||||
### Phase 4: Node.js MCP Server (Future/Open Source)
|
||||
|
||||
**Status**: Future - after ManagingApiKeys is ready
|
||||
|
||||
**Tasks**:
|
||||
- [ ] Create Node.js project structure
|
||||
- [ ] Implement MCP server using `@modelcontextprotocol/sdk`
|
||||
- [ ] Create API client with API key support
|
||||
- [ ] Implement public tool handlers
|
||||
- [ ] Create configuration system
|
||||
- [ ] Write documentation
|
||||
- [ ] Publish to npm
|
||||
|
||||
**Files to Create**:
|
||||
- `src/Managing.Mcp.Nodejs/package.json`
|
||||
- `src/Managing.Mcp.Nodejs/index.js`
|
||||
- `src/Managing.Mcp.Nodejs/tools/public-tools.ts`
|
||||
- `src/Managing.Mcp.Nodejs/api/client.ts`
|
||||
- `src/Managing.Mcp.Nodejs/config/config.ts`
|
||||
- `src/Managing.Mcp.Nodejs/README.md`
|
||||
|
||||
## Service Integration
|
||||
|
||||
### LLM Service Integration
|
||||
|
||||
Your internal LLM service only uses the C# MCP:
|
||||
|
||||
```csharp
|
||||
public class LLMService : ILLMService
|
||||
{
|
||||
private readonly IMcpService _internalMcpService; // C# only
|
||||
|
||||
public async Task<LLMResponse> GenerateContentAsync(...)
|
||||
{
|
||||
// Only use internal C# MCP
|
||||
// Community uses Node.js MCP separately
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Unified Service (Optional)
|
||||
|
||||
If you need to combine both MCPs in the future:
|
||||
|
||||
```csharp
|
||||
public class UnifiedMcpService : IUnifiedMcpService
|
||||
{
|
||||
private readonly IMcpService _internalMcpService;
|
||||
private readonly IMcpClientService _externalMcpClientService;
|
||||
|
||||
// Routes tools to appropriate MCP based on prefix
|
||||
// internal:* -> C# MCP
|
||||
// public:* -> Node.js MCP (if needed internally)
|
||||
}
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### C# MCP Configuration
|
||||
|
||||
```json
|
||||
// appsettings.json
|
||||
{
|
||||
"Mcp": {
|
||||
"Internal": {
|
||||
"Enabled": true,
|
||||
"Type": "in-process"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Node.js MCP Configuration (Community)
|
||||
|
||||
```json
|
||||
// ~/.managing-mcp/config.json
|
||||
{
|
||||
"apiUrl": "https://api.yourdomain.com",
|
||||
"apiKey": "user-api-key-here"
|
||||
}
|
||||
```
|
||||
|
||||
Or environment variables:
|
||||
- `MANAGING_API_URL`
|
||||
- `MANAGING_API_KEY`
|
||||
|
||||
## Benefits
|
||||
|
||||
### For Your Platform
|
||||
|
||||
1. **No Hosting Burden**: Community runs their own Node.js MCP instances
|
||||
2. **API Key Control**: You control access via ManagingApiKeys
|
||||
3. **Scalability**: Distributed across community
|
||||
4. **Security**: Internal tools stay private
|
||||
5. **Analytics**: Track usage per API key
|
||||
|
||||
### For Community
|
||||
|
||||
1. **Open Source**: Can contribute improvements
|
||||
2. **Easy Installation**: Simple npm install
|
||||
3. **Privacy**: Each user uses their own API key
|
||||
4. **Flexibility**: Can customize or fork
|
||||
5. **Ecosystem**: Works with existing Node.js MCP tools
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### Internal C# MCP
|
||||
- Runs in-process, no external access
|
||||
- Direct service access via DI
|
||||
- No network exposure
|
||||
- Proprietary code stays private
|
||||
|
||||
### Public API Endpoints
|
||||
- API key authentication required
|
||||
- Rate limiting per key
|
||||
- Only public-safe data returned
|
||||
- Audit trail for all requests
|
||||
|
||||
### Node.js MCP
|
||||
- Community members manage their own instances
|
||||
- Each user has their own API key
|
||||
- No access to internal tools
|
||||
- Can be audited (open source)
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
1. **MCP Registry**: List community-created tools
|
||||
2. **Tool Marketplace**: Community can share custom tools
|
||||
3. **Analytics Dashboard**: Usage metrics per API key
|
||||
4. **Webhook Support**: Real-time updates via MCP
|
||||
5. **Multi-tenant Support**: Organizations with shared API keys
|
||||
|
||||
## References
|
||||
|
||||
- [Model Context Protocol Specification](https://modelcontextprotocol.io)
|
||||
- [C# SDK Documentation](https://github.com/modelcontextprotocol/csharp-sdk)
|
||||
- [Node.js SDK Documentation](https://github.com/modelcontextprotocol/typescript-sdk)
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [Architecture.drawio](Architecture.drawio) - Overall system architecture
|
||||
- [Workers processing/](Workers%20processing/) - Worker architecture details
|
||||
|
||||
## Status
|
||||
|
||||
- **C# MCP Server**: Planning
|
||||
- **Public API Endpoints**: Planning
|
||||
- **ManagingApiKeys**: Not yet ready
|
||||
- **Node.js MCP Server**: Future (after ManagingApiKeys)
|
||||
|
||||
## Notes
|
||||
|
||||
- The Node.js MCP will NOT be hosted by you - community members run it themselves
|
||||
- Each community member uses their own ManagingApiKey
|
||||
- Internal LLM service only uses C# MCP (in-process)
|
||||
- Public API endpoints are the bridge between community and your platform
|
||||
|
||||
Reference in New Issue
Block a user