# ποΈ DhanHQ MCP Server Architecture
## System Overview
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MCP Inspector (Browser) β
β Interactive Tool Testing UI β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
Stdio Communication
β
ββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β MCP Server (Node.js) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Tool Handlers (index.ts) β β
β β ββ start_authentication β β
β β ββ get_login_instructions β β
β β ββ complete_authentication β β
β β ββ check_auth_status β β
β β ββ reset_authentication β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Authentication Module (authentication.ts) β β
β β ββ generateConsent() β Step 1 β β
β β ββ getStep2Instructions() β Step 2 Info β β
β β ββ consumeConsent() β Step 3 β β
β β ββ getAccessToken() β β
β β ββ isTokenValid() β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Config & State Management (config.ts, types.ts) β β
β β ββ Environment Variables (.env) β β
β β ββ In-Memory Auth State β β
β β ββ Type Definitions β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β
HTTPS / REST API
(Axios HTTP Client)
β
ββββββββββββββββββββββββ΄βββββββββββββββββββββββ
β β
βββββββββΌβββββββββββββββββ βββββββββββββΌββββββββββ
β DhanHQ OAuth Endpoints β β User's Browser β
ββββββββββββββββββββββββββ€ βββββββββββββββββββββββ€
β Step 1: β ββββββββ> β Step 2: User Login β
β generate-consent β β & 2FA Verification β
β β β β
β Step 3: β <ββββββββ β Step 2: Redirect β
β consumeApp-consent β tokenId β with tokenId β
ββββββββββββββββββββββββββ βββββββββββββββββββββββ
```
## Authentication Flow Sequence
```
βββββββββββββββ
β User β
ββββββββ¬βββββββ
β
β 1. Call start_authentication
βΌ
ββββββββββββββββββββββββ
β MCP Inspector UI β
ββββββββ¬ββββββββββββββββ
β
β 2. MCP Request
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β MCP Server (index.ts) β
β - Receives start_authentication β
β - Routes to authentication.ts β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
β 3. HTTP POST with API key/secret
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β DhanHQ: generate-consent API β
β POST /app/generate-consent β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
β 4. Returns consentAppId
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β MCP Server (authentication.ts) β
β - Stores consentAppId in memory β
β - Generates login URL β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
β 5. Response to Inspector
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β MCP Inspector Shows: β
β - loginUrl β
β - consentAppId β
β - Instructions β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
β 6. User opens loginUrl in browser (MANUAL STEP)
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β DhanHQ Login Page β
β - User enters credentials β
β - Completes 2FA β
β - Redirected to callback URL β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
β 7. Redirect: callback?tokenId=xyz
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β User's Browser β
β - Extracts tokenId from URL β
β - Copies tokenId β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
β 8. Call complete_authentication with tokenId
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β MCP Inspector UI β
β - Input: { tokenId: "xyz..." } β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
β 9. MCP Request
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β MCP Server (index.ts) β
β - Receives complete_authentication β
β - Routes to authentication.ts β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
β 10. HTTP GET with API key/secret
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β DhanHQ: consumeApp-consent API β
β GET /app/consumeApp-consent?tokenId β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
β 11. Returns JWT access token
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β MCP Server (authentication.ts) β
β - Stores accessToken in memory β
β - Stores client details β
β - Validates expiry time β
ββββββββ¬ββββββββββββββββββββββββββββββββ
β
β 12. Response to Inspector
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β MCP Inspector Shows: β
β - success: true β
β - authToken { β
β accessToken, β
β dhanClientId, β
β dhanClientName, β
β expiryTime, β
β ... β
β } β
ββββββββββββββββββββββββββββββββββββββββ
β
Authentication Complete!
Ready for API requests.
```
## Component Relationships
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β index.ts (Entry Point) β
β - Creates MCP Server β
β - Registers tool handlers β
β - Validates config β
β - Connects stdio transport β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β β
β β Tool Handlers (switch statement) β
β β - Parse incoming requests β
β β - Call authentication functions β
β β - Format responses β
β β - Handle errors β
β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β β β
β β β authentication.ts (Business Logic) β
β β β - HTTP calls to DhanHQ β
β β β - Token management β
β β β - State persistence β
β β β β
β β β ββββββββββββββββββββββββββββββββββββββββββββββ€
β β β β β
β β β β config.ts (Configuration) β
β β β β - Load .env variables β
β β β β - Validate credentials β
β β β β β
β β β β types.ts (Type Definitions) β
β β β β - AuthState interface β
β β β β - DhanAuthToken interface β
β β β β - API response types β
β β β β β
β β β ββββββββββββββββββββββββββββββββββββββββββββββ€
β β β β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
## State Management
```
In-Memory Auth State (authState object)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Authentication State Structure β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β authState = { β
β consentAppId: string | undefined, β
β consentAppStatus: string | undefined, β
β tokenId: string | undefined, β
β authToken: { β
β accessToken: string, β
β dhanClientId: string, β
β dhanClientName: string, β
β dhanClientUcc: string, β
β expiryTime: ISO 8601 string, β
β givenPowerOfAttorney: boolean, β
β generatedAt: ISO 8601 string β
β } | undefined β
β } β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β οΈ Note: Stored in-memory only
- Lost on server restart
- Not persistent
- Suitable for development/testing
π Production Upgrade Path:
- Migrate to database (MongoDB/PostgreSQL)
- Add token refresh mechanism
- Implement secure session storage
```
## Error Handling Flow
```
ββββββββββββββββββββββββββββ
β Tool Handler in index.tsβ
ββββββββββββ¬ββββββββββββββββ
β
βΌ
try-catch block
β
ββββββββ΄βββββββ
β β
βΌ βΌ
Success Error
β β
β ββ Parse error message
β β
β ββ Log to console
β β
β ββ Return error response
β to MCP Inspector
β
ββ Format response
ββ Return to MCP Inspector
```
## Data Flow for Each Tool
### start_authentication
```
User Input β Tool Handler
β
validateConfig()
β
axios.post (generate-consent API)
β
Store consentAppId in-memory
β
Generate loginUrl
β
Format Response
β
Return to Inspector
```
### complete_authentication
```
User Input (tokenId) β Tool Handler
β
Get tokenId from args
β
axios.get (consumeApp-consent API)
β
Extract accessToken & details
β
Store authToken in-memory
β
Return Response
β
Return to Inspector
```
### check_auth_status
```
User Input β Tool Handler
β
Get authState from memory
β
Validate token expiry
β
Redact sensitive data
β
Build status object
β
Return to Inspector
```
## Security Layers
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Layer 1: Input Validation β
β - Check tokenId exists β
β - Validate required parameters β
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Layer 2: Configuration Security β
β - Environment variables for credentials β
β - NOT hardcoded β
β - Validated on startup β
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Layer 3: API Communication β
β - HTTPS to DhanHQ APIs β
β - API Key/Secret in headers β
β - OAuth token obtained securely β
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Layer 4: Data Redaction β
β - Tokens redacted in responses β
β - Sensitive data marked as ***REDACTED*** β
β - Console logs don't expose tokens β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
## Deployment Architecture (Future)
```
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β React Frontend β
β (User Interface & UX) β
ββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β HTTP/WebSocket
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Backend API Gateway β
β (Node.js Express or similar) β
ββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β MCP Server (DhanHQ) β
β (This project - authentication layer) β
ββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β PostgreSQL Database β
β (Token storage, user sessions) β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
```
---
This architecture is designed for:
- β
Local development with MCP Inspector
- β
Gradual expansion with new trading tools
- β
Easy migration to production
- β
Type-safe TypeScript throughout
- β
Clear separation of concerns