- 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.
393 lines
13 KiB
Markdown
393 lines
13 KiB
Markdown
# 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
|
|
|