Files
ColaFlow/docs/plans/sprint_5.md
Yaojia Wang 34a379750f
Some checks failed
Code Coverage / Generate Coverage Report (push) Has been cancelled
Tests / Run Tests (9.0.x) (push) Has been cancelled
Tests / Docker Build Test (push) Has been cancelled
Tests / Test Summary (push) Has been cancelled
Clean up
2025-11-15 08:58:48 +01:00

1192 lines
37 KiB
Markdown

---
sprint_id: sprint_5
milestone: M2
status: not_started
created_date: 2025-11-06
start_date: 2025-11-27
target_end_date: 2026-01-22
duration_weeks: 8
---
# Sprint 5: MCP Server Foundation - Phase 1-3
**Milestone**: M2 - MCP Server Implementation
**Goal**: Build the foundational MCP Server infrastructure to enable AI agents (Claude, ChatGPT) to safely read and modify ColaFlow project data through the MCP protocol.
**Sprint Scope**: Phase 1-3 of MCP Server implementation (Weeks 1-6 from architecture roadmap)
## Sprint Context
### Background
ColaFlow M1 core features are 82% complete (Day 17). M2 phase focuses on implementing the MCP (Model Context Protocol) Server to enable AI integration. The architecture design document provides a comprehensive 16-week implementation plan. This Sprint covers the first 6 weeks (Phase 1-3), establishing the foundation for AI-powered project management.
### Reference Documents
- **Architecture Design**: `docs/architecture/mcp-server-architecture.md` (1,867 lines, 73KB)
- **MCP Suggestions**: `docs/mcp-suggestion.md`
- **Product Roadmap**: `product.md` - M2 section
### M2 Key Objectives
1. Let AI become a true team member
2. AI can read project data (Projects, Epics, Stories, Tasks, Sprints)
3. AI can execute operations (create tasks, update status, assign users)
4. All AI write operations require human approval (Diff Preview mechanism)
5. Complete audit trail for all AI operations
## Sprint Objectives (Phase 1-3)
### Phase 1: Foundation (Week 1-2)
- Establish MCP protocol infrastructure
- Implement API Key authentication
- Basic error handling and logging
### Phase 2: Resources (Week 3-4)
- Implement read-only data exposure (5 core Resources)
- Multi-tenant isolation verification
- Redis caching integration
### Phase 3: Tools & Diff Preview (Week 5-6)
- Implement write operations (3 core Tools)
- Build Diff Preview mechanism
- SignalR real-time notifications
## Stories
### Phase 1 Stories (Week 1-2)
- [ ] [story_1](sprint_5_story_1.md) - MCP Protocol Handler Implementation - `not_started` - **P0 Critical** - 3 days
- [ ] [story_2](sprint_5_story_2.md) - API Key Management System - `not_started` - **P0 Critical** - 2 days
- [ ] [story_3](sprint_5_story_3.md) - MCP Domain Layer Design - `not_started` - **P0 Critical** - 2 days
- [ ] [story_4](sprint_5_story_4.md) - Error Handling & Logging - `not_started` - **P0 Critical** - 1 day
### Phase 2 Stories (Week 3-4)
- [ ] [story_5](sprint_5_story_5.md) - Core MCP Resources Implementation - `not_started` - **P0 Critical** - 3 days
- [ ] [story_6](sprint_5_story_6.md) - Resource Registration & Discovery - `not_started` - **P0 Critical** - 1 day
- [ ] [story_7](sprint_5_story_7.md) - Multi-Tenant Isolation Verification - `not_started` - **P0 Critical** - 2 days
- [ ] [story_8](sprint_5_story_8.md) - Redis Caching Integration - `not_started` - **P1 High** - 2 days
### Phase 3 Stories (Week 5-6)
- [ ] [story_9](sprint_5_story_9.md) - Diff Preview Service Implementation - `not_started` - **P0 Critical** - 2 days
- [ ] [story_10](sprint_5_story_10.md) - PendingChange Management - `not_started` - **P0 Critical** - 2 days
- [ ] [story_11](sprint_5_story_11.md) - Core MCP Tools Implementation - `not_started` - **P0 Critical** - 3 days
- [ ] [story_12](sprint_5_story_12.md) - SignalR Real-Time Notifications - `not_started` - **P0 Critical** - 1 day
**Progress**: 0/12 stories completed (0%)
---
## 🚀 NEW: Microsoft .NET MCP SDK Migration (Epic)
### Background
After completing Phase 1-3 (Stories 1-12) using custom MCP implementation, the research team discovered Microsoft's official .NET MCP SDK. Research report shows:
- **60-70% code reduction** (SDK handles protocol, registration, transport)
- **30-40% performance improvement** (optimized JSON parsing, middleware)
- **Future-proof**: Microsoft maintains protocol updates
- **Hybrid architecture**: SDK handles boring stuff, ColaFlow keeps unique features (Diff Preview, multi-tenant)
### Epic Story: SDK Migration
- [ ] [story_0](sprint_5_story_0.md) - **EPIC**: Integrate Microsoft .NET MCP SDK - `not_started` - **P0 Critical** - 8 weeks
### SDK Migration Stories (Phase 1-5 Extension)
#### Phase 1: Foundation & PoC (Week 1-2)
- [ ] [story_13](sprint_5_story_13.md) - MCP SDK Foundation & Proof of Concept - `not_started` - **P0 Critical** - 10 days
#### Phase 2: Tool Migration (Week 3-4)
- [ ] [story_14](sprint_5_story_14.md) - Tool Migration to SDK Attributes - `not_started` - **P0 Critical** - 10 days
#### Phase 3: Resource Migration (Week 5)
- [ ] [story_15](sprint_5_story_15.md) - Resource Migration to SDK Attributes - `not_started` - **P0 Critical** - 5 days
#### Phase 4: Transport Layer (Week 6)
- [ ] [story_16](sprint_5_story_16.md) - Transport Layer Migration to SDK - `not_started` - **P0 Critical** - 5 days
#### Phase 5: Testing & Optimization (Week 7-8)
- [ ] [story_17](sprint_5_story_17.md) - Testing, Optimization & Documentation - `not_started` - **P0 Critical** - 10 days
**SDK Migration Progress**: 0/5 stories completed (0%)
### SDK Migration Timeline
**Prerequisite**: Complete Stories 1-12 (custom implementation)
**Week 1-2**: Story 13 - SDK Foundation & PoC
- Install SDK, create PoC Tool/Resource
- Performance baseline benchmarking
- Compatibility verification
- Team training
**Week 3-4**: Story 14 - Tool Migration
- Migrate 10 Tools to `[McpTool]` attributes
- Preserve DiffPreview integration
- Integration testing
**Week 5**: Story 15 - Resource Migration
- Migrate 11 Resources to `[McpResource]` attributes
- Preserve multi-tenant isolation + Redis caching
**Week 6**: Story 16 - Transport Layer
- Replace custom middleware with SDK transports
- Configure stdio + HTTP/SSE
- Preserve API Key auth + field-level permissions
**Week 7-8**: Story 17 - Testing & Docs
- Comprehensive testing (integration, performance, security)
- Documentation update
- Production deployment
**Total SDK Migration**: 8 weeks (40 days)
**Expected Benefits**: 60-70% code reduction, 20-40% performance gain
---
## Sprint Total Progress
**Phase 1-3 (Custom Implementation)**: 0/12 stories (0%)
**SDK Migration (Phase 1-5)**: 0/5 stories (0%)
**Overall Sprint**: 0/17 stories (0%)
---
## Architecture Overview
### Clean Architecture + CQRS + DDD
```
┌─────────────────────────────────────┐
│ Presentation Layer │
│ - MCP Protocol Handler (JSON-RPC) │
│ - REST API for MCP Management │
└─────────────────┬───────────────────┘
┌─────────────────────────────────────┐
│ Application Layer │
│ - McpResourceService │
│ - McpToolService │
│ - DiffPreviewService │
│ - PendingChangeService │
└─────────────────┬───────────────────┘
┌─────────────────────────────────────┐
│ Domain Layer │
│ - McpApiKey (Aggregate Root) │
│ - PendingChange (Aggregate Root) │
│ - DiffPreview (Value Object) │
└─────────────────┬───────────────────┘
┌─────────────────────────────────────┐
│ Infrastructure Layer │
│ - EF Core Repositories │
│ - Redis Cache │
│ - SignalR Hub │
└─────────────────────────────────────┘
```
### Core Components
1. **MCP Protocol Handler**: JSON-RPC 2.0 protocol parser and router
2. **McpResourceService**: Read-only data exposure (5 Resources)
3. **McpToolService**: Write operations with Diff Preview (3 Tools)
4. **DiffPreviewService**: Generate before/after data snapshots
5. **PendingChangeService**: Manage approval workflow
6. **McpApiKeyService**: API Key authentication and authorization
---
## Phase 1: Foundation (Week 1-2)
### Story 1: MCP Protocol Handler Implementation (3 days) - P0 CRITICAL
**Goal**: Implement JSON-RPC 2.0 protocol handler for MCP communication
**Scope**:
- Create MCP Protocol Handler interfaces and base classes
- Implement JSON-RPC 2.0 message parsing
- Build request/response routing mechanism
- Implement MCP `initialize` handshake
- Error handling and validation
- Unit tests for protocol parsing
**Acceptance Criteria**:
- [ ] MCP protocol `initialize` handshake succeeds
- [ ] JSON-RPC 2.0 messages correctly parsed
- [ ] Request routing to Resource/Tool/Prompt handlers works
- [ ] Error responses conform to MCP specification
- [ ] Unit test coverage > 80%
**Deliverables**:
- `IMcpProtocolHandler` interface
- `McpProtocolHandler` implementation
- `McpRequest` / `McpResponse` DTOs
- `McpResourceController` / `McpToolController` base classes
- Unit tests
**Technical Details**:
```csharp
public interface IMcpProtocolHandler
{
Task<McpResponse> HandleRequestAsync(
McpRequest request,
CancellationToken cancellationToken);
}
public class McpRequest
{
public string JsonRpc { get; set; } = "2.0";
public string Method { get; set; }
public object? Params { get; set; }
public string? Id { get; set; }
}
public class McpResponse
{
public string JsonRpc { get; set; } = "2.0";
public object? Result { get; set; }
public McpError? Error { get; set; }
public string? Id { get; set; }
}
```
---
### Story 2: API Key Management System (2 days) - P0 CRITICAL
**Goal**: Implement secure API Key creation, validation, and management
**Scope**:
- Create `McpApiKey` aggregate root (Domain Layer)
- Implement API Key generation (40-char random string)
- BCrypt hashing for secure storage
- API Key validation middleware
- CRUD operations via REST API
- Database migration (mcp_api_keys table)
- Multi-tenant isolation
**Acceptance Criteria**:
- [ ] API Key creation generates unique 40-char key
- [ ] API Key hashed with BCrypt before storage
- [ ] Validation middleware authenticates requests
- [ ] Unauthorized requests return 401
- [ ] API Keys isolated per tenant
- [ ] CRUD endpoints work correctly
**Database Schema**:
```sql
CREATE TABLE mcp_api_keys (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
key_hash VARCHAR(64) NOT NULL UNIQUE,
key_prefix VARCHAR(16) NOT NULL,
name VARCHAR(255) NOT NULL,
description TEXT,
permissions JSONB NOT NULL,
ip_whitelist JSONB,
status INT NOT NULL DEFAULT 1,
last_used_at TIMESTAMP NULL,
usage_count BIGINT NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
expires_at TIMESTAMP NOT NULL,
revoked_at TIMESTAMP NULL,
INDEX idx_key_prefix (key_prefix),
INDEX idx_tenant_user (tenant_id, user_id),
INDEX idx_expires_at (expires_at)
);
```
**API Endpoints**:
- `POST /api/mcp/keys` - Create API Key
- `GET /api/mcp/keys` - List API Keys
- `DELETE /api/mcp/keys/{id}` - Revoke API Key
---
### Story 3: MCP Domain Layer Design (2 days) - P0 CRITICAL
**Goal**: Design and implement MCP domain entities, aggregates, and events
**Scope**:
- Create `McpApiKey` aggregate root
- Create `PendingChange` aggregate root
- Create `DiffPreview` value object
- Define domain events (ApiKeyCreated, PendingChangeCreated, etc.)
- Implement domain logic and validation
- Unit tests for domain entities
**Acceptance Criteria**:
- [ ] All aggregates correctly implement entity base classes
- [ ] Domain events fire at appropriate lifecycle points
- [ ] Business rules enforced in domain entities
- [ ] Aggregates are immutable where appropriate
- [ ] Unit test coverage > 90% for domain layer
**Aggregates**:
1. **McpApiKey** (Aggregate Root)
```csharp
public class McpApiKey : AggregateRoot
{
public Guid TenantId { get; private set; }
public Guid UserId { get; private set; }
public string KeyHash { get; private set; }
public string KeyPrefix { get; private set; }
public string Name { get; private set; }
public ApiKeyPermissions Permissions { get; private set; }
public ApiKeyStatus Status { get; private set; }
public DateTime ExpiresAt { get; private set; }
public static McpApiKey Create(string name, Guid tenantId, Guid userId);
public void Revoke();
public void UpdatePermissions(ApiKeyPermissions permissions);
}
```
2. **PendingChange** (Aggregate Root)
```csharp
public class PendingChange : AggregateRoot
{
public Guid TenantId { get; private set; }
public Guid ApiKeyId { get; private set; }
public string ToolName { get; private set; }
public DiffPreview Diff { get; private set; }
public PendingChangeStatus Status { get; private set; }
public DateTime ExpiresAt { get; private set; }
public Guid? ApprovedBy { get; private set; }
public static PendingChange Create(string toolName, DiffPreview diff);
public void Approve(Guid userId);
public void Reject(Guid userId, string reason);
public void Expire();
}
```
3. **DiffPreview** (Value Object)
```csharp
public class DiffPreview : ValueObject
{
public string Operation { get; private set; } // CREATE, UPDATE, DELETE
public string EntityType { get; private set; }
public Guid? EntityId { get; private set; }
public object? BeforeData { get; private set; }
public object? AfterData { get; private set; }
public DiffField[] ChangedFields { get; private set; }
}
```
**Domain Events**:
- `ApiKeyCreatedEvent`
- `ApiKeyRevokedEvent`
- `PendingChangeCreatedEvent`
- `PendingChangeApprovedEvent`
- `PendingChangeRejectedEvent`
- `PendingChangeExpiredEvent`
---
### Story 4: Error Handling & Logging (1 day) - P0 CRITICAL
**Goal**: Implement comprehensive error handling and structured logging for MCP operations
**Scope**:
- Create MCP-specific exception classes
- Implement exception-to-MCP-error mapping
- Structured logging with Serilog
- Request/response logging middleware
- Performance monitoring (timing)
- Error rate tracking
**Acceptance Criteria**:
- [ ] All exceptions mapped to MCP error responses
- [ ] Structured logs include correlation IDs
- [ ] Request/response logged at DEBUG level
- [ ] Errors logged at ERROR level with stack traces
- [ ] Performance metrics captured
- [ ] No sensitive data in logs
**MCP Error Codes**:
```csharp
public enum McpErrorCode
{
ParseError = -32700,
InvalidRequest = -32600,
MethodNotFound = -32601,
InvalidParams = -32602,
InternalError = -32603,
Unauthorized = -32001,
Forbidden = -32002,
NotFound = -32003,
ValidationFailed = -32004
}
```
---
## Phase 2: Resources (Week 3-4)
### Story 5: Core MCP Resources Implementation (3 days) - P0 CRITICAL
**Goal**: Implement 5 core read-only MCP Resources
**Scope**:
Implement the following Resources:
1. `colaflow://projects.list` - List all projects
2. `colaflow://projects.get/{id}` - Get project details
3. `colaflow://issues.search` - Search issues (with filters)
4. `colaflow://issues.get/{id}` - Get issue details
5. `colaflow://sprints.current` - Get current active Sprint
6. `colaflow://users.list` - List team members
**Acceptance Criteria**:
- [ ] All 5 Resources return correct data
- [ ] Data respects multi-tenant isolation (TenantId filter)
- [ ] Query parameters work (status, priority, assignee, etc.)
- [ ] Pagination implemented (limit, offset)
- [ ] Response time < 200ms
- [ ] Unit and integration tests pass
**Resource Interface**:
```csharp
public interface IMcpResource
{
string Uri { get; }
string Name { get; }
string Description { get; }
string MimeType { get; }
Task<McpResourceContent> GetContentAsync(
McpResourceRequest request,
CancellationToken cancellationToken);
}
```
**Example Implementation**:
```csharp
public class ProjectsListResource : IMcpResource
{
public string Uri => "colaflow://projects.list";
public string Name => "Projects List";
public string Description => "List all projects in current tenant";
public string MimeType => "application/json";
private readonly IProjectRepository _projectRepo;
private readonly ITenantContext _tenantContext;
public async Task<McpResourceContent> GetContentAsync(...)
{
var projects = await _projectRepo.GetAllAsync(
_tenantContext.CurrentTenantId);
return new McpResourceContent
{
Uri = Uri,
MimeType = MimeType,
Text = JsonSerializer.Serialize(new { projects })
};
}
}
```
**Response Format**:
```json
{
"projects": [
{
"id": "uuid",
"name": "ColaFlow Development",
"key": "COLA",
"status": "Active",
"owner": { "id": "uuid", "name": "John Doe" },
"issueCount": 145,
"memberCount": 8,
"createdAt": "2024-01-01T00:00:00Z"
}
]
}
```
---
### Story 6: Resource Registration & Discovery (1 day) - P0 CRITICAL
**Goal**: Implement plugin-based Resource registration and discovery mechanism
**Scope**:
- Create `IMcpRegistry` interface
- Implement auto-discovery of Resources via Reflection
- Build Resource catalog (`resources/list` endpoint)
- Resource versioning support
- Configuration-based Resource enable/disable
**Acceptance Criteria**:
- [ ] All Resources auto-registered at startup
- [ ] `resources/list` returns complete catalog
- [ ] Resources can be disabled via config
- [ ] Resource metadata complete (URI, name, description, schema)
**Registry Interface**:
```csharp
public interface IMcpRegistry
{
void RegisterResource(IMcpResource resource);
void RegisterTool(IMcpTool tool);
void RegisterPrompt(IMcpPrompt prompt);
IMcpResource? GetResource(string uri);
IReadOnlyList<IMcpResource> GetAllResources();
}
```
---
### Story 7: Multi-Tenant Isolation Verification (2 days) - P0 CRITICAL
**Goal**: Verify 100% multi-tenant data isolation for all MCP operations
**Scope**:
- Implement TenantContext service for MCP
- Apply EF Core Global Query Filters
- Create integration tests for cross-tenant access attempts
- Test all 5 Resources with multi-tenant scenarios
- Security audit for tenant leaks
**Acceptance Criteria**:
- [ ] TenantContext correctly extracts tenant from API Key
- [ ] Global Query Filters applied to all entities
- [ ] Cross-tenant access attempts return 404 (not 403)
- [ ] Integration tests verify 100% isolation
- [ ] No tenant leaks found in security audit
**Test Scenarios**:
- Tenant A cannot read Tenant B's projects
- API Key from Tenant A cannot access Tenant B's issues
- Search queries never return cross-tenant results
- Direct ID access fails for other tenant's data
---
### Story 8: Redis Caching Integration (2 days) - P1 HIGH
**Goal**: Implement Redis caching for frequently accessed MCP Resources
**Scope**:
- Integrate Redis distributed cache
- Implement cache-aside pattern for Resources
- Configure TTL per Resource type (5 minutes default)
- Cache invalidation on data updates (domain events)
- Cache hit rate monitoring
**Acceptance Criteria**:
- [ ] Redis cache integrated into Resource queries
- [ ] Cache hit rate > 80% for hot Resources
- [ ] TTL correctly enforced (5 minutes)
- [ ] Cache invalidated on data changes
- [ ] Performance improvement measured (30-50% faster)
**Cached Resources**:
- `projects.list` (TTL: 5 min)
- `users.list` (TTL: 5 min)
- `sprints.current` (TTL: 2 min)
- `issues.search` (TTL: 2 min, cache by query params)
**Cache Key Format**: `mcp:{tenantId}:{resourceUri}:{params_hash}`
---
## Phase 3: Tools & Diff Preview (Week 5-6)
### Story 9: Diff Preview Service Implementation (2 days) - P0 CRITICAL
**Goal**: Implement service to generate before/after data previews for write operations
**Scope**:
- Create `DiffPreviewService` class
- Implement snapshot capture (before data)
- Simulate operation execution (after data)
- Calculate field-level differences
- Format diff as human-readable output
- Generate diff HTML for UI display
**Acceptance Criteria**:
- [ ] Diff Preview accurately shows changed fields
- [ ] Before/after snapshots captured correctly
- [ ] HTML diff output renders in UI
- [ ] Nested object changes handled
- [ ] Array/list changes detected
**Service Interface**:
```csharp
public interface IDiffPreviewService
{
Task<DiffPreview> GeneratePreviewAsync<TEntity>(
Guid? entityId,
TEntity afterData,
string operation,
CancellationToken cancellationToken);
}
```
**Diff Output Example**:
```json
{
"operation": "UPDATE",
"entityType": "Issue",
"entityId": "uuid",
"entityKey": "COLA-146",
"changedFields": [
{
"fieldName": "title",
"displayName": "Title",
"oldValue": "Implement MCP Server",
"newValue": "Implement MCP Server (updated)",
"diffHtml": "<del>Implement MCP Server</del> <ins>Implement MCP Server (updated)</ins>"
},
{
"fieldName": "priority",
"displayName": "Priority",
"oldValue": "High",
"newValue": "Critical"
}
]
}
```
---
### Story 10: PendingChange Management (2 days) - P0 CRITICAL
**Goal**: Implement approval workflow for AI write operations
**Scope**:
- Implement `PendingChangeService`
- CRUD operations for PendingChange entity
- Approval/rejection workflow
- 24-hour auto-expiration mechanism (background job)
- Query pending changes by tenant/user
- Persistence to PostgreSQL
**Acceptance Criteria**:
- [ ] PendingChange created correctly with Diff Preview
- [ ] Approve action executes actual operation
- [ ] Reject action logs reason and notifies AI
- [ ] 24-hour expiration works (background task)
- [ ] Query APIs return correct results
**Database Schema**:
```sql
CREATE TABLE mcp_pending_changes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES tenants(id),
api_key_id UUID NOT NULL REFERENCES mcp_api_keys(id),
tool_name VARCHAR(100) NOT NULL,
operation VARCHAR(20) NOT NULL,
entity_type VARCHAR(50) NOT NULL,
entity_id UUID,
diff_data JSONB NOT NULL,
status INT NOT NULL DEFAULT 0, -- PendingApproval, Approved, Rejected, Expired
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
expires_at TIMESTAMP NOT NULL,
approved_by UUID REFERENCES users(id),
approved_at TIMESTAMP,
rejection_reason TEXT,
INDEX idx_tenant_status (tenant_id, status),
INDEX idx_expires (expires_at) WHERE status = 0
);
```
**API Endpoints**:
- `GET /api/mcp/pending-changes` - List pending changes
- `POST /api/mcp/pending-changes/{id}/approve` - Approve change
- `POST /api/mcp/pending-changes/{id}/reject` - Reject change
---
### Story 11: Core MCP Tools Implementation (3 days) - P0 CRITICAL
**Goal**: Implement 3 core write operation Tools with Diff Preview
**Scope**:
Implement the following Tools:
1. `create_issue` - Create new Epic/Story/Task
2. `update_status` - Change issue status
3. `add_comment` - Add comment to issue
Each Tool must:
- Generate Diff Preview before execution
- Create PendingChange record
- NOT execute immediately (wait for approval)
- Return pendingChangeId to AI
**Acceptance Criteria**:
- [ ] All 3 Tools generate correct Diff Preview
- [ ] PendingChange created with complete diff data
- [ ] Tool execution deferred until approval
- [ ] AI receives pendingChangeId in response
- [ ] Integration tests verify workflow
**Tool Interface**:
```csharp
public interface IMcpTool
{
string Name { get; }
string Description { get; }
McpToolInputSchema InputSchema { get; }
Task<McpToolResult> ExecuteAsync(
McpToolCall toolCall,
CancellationToken cancellationToken);
}
```
**Example: CreateIssueTool**:
```csharp
public class CreateIssueTool : IMcpTool
{
public string Name => "create_issue";
public string Description => "Create a new issue (Epic/Story/Task)";
private readonly IDiffPreviewService _diffPreview;
private readonly IPendingChangeService _pendingChange;
public async Task<McpToolResult> ExecuteAsync(...)
{
// 1. Parse input
var input = ParseInput(toolCall.Arguments);
// 2. Generate Diff Preview
var diff = await _diffPreview.GeneratePreviewAsync(
null, // no entityId for CREATE
input,
"CREATE",
cancellationToken);
// 3. Create PendingChange
var pendingChange = await _pendingChange.CreateAsync(
Name,
diff,
cancellationToken);
// 4. Return pendingChangeId (do NOT execute yet)
return new McpToolResult
{
Content = new[]
{
new McpToolContent
{
Type = "text",
Text = $"Change pending approval. ID: {pendingChange.Id}"
}
},
IsError = false
};
}
}
```
**Input Schema for create_issue**:
```json
{
"type": "object",
"properties": {
"projectId": { "type": "string", "format": "uuid" },
"title": { "type": "string", "minLength": 1, "maxLength": 200 },
"description": { "type": "string" },
"type": { "enum": ["Epic", "Story", "Task", "Bug"] },
"priority": { "enum": ["Low", "Medium", "High", "Critical"] },
"assigneeId": { "type": "string", "format": "uuid" },
"estimatedHours": { "type": "number", "minimum": 0 }
},
"required": ["projectId", "title", "type"]
}
```
---
### Story 12: SignalR Real-Time Notifications (1 day) - P0 CRITICAL
**Goal**: Integrate SignalR to push approval results to AI in real-time
**Scope**:
- Create `McpHub` SignalR hub
- Implement `PendingChangeApproved` event handler
- Push approval/rejection notification via WebSocket
- AI client connection management
- Fallback to polling if WebSocket unavailable
**Acceptance Criteria**:
- [ ] SignalR hub accepts MCP client connections
- [ ] Approval notification pushed within 1 second
- [ ] Rejection notification includes reason
- [ ] Connection authenticated via API Key
- [ ] Handles disconnections gracefully
**SignalR Hub**:
```csharp
public class McpHub : Hub
{
public async Task SubscribeToPendingChange(Guid pendingChangeId)
{
await Groups.AddToGroupAsync(
Context.ConnectionId,
$"pending-change-{pendingChangeId}");
}
public async Task UnsubscribeFromPendingChange(Guid pendingChangeId)
{
await Groups.RemoveFromGroupAsync(
Context.ConnectionId,
$"pending-change-{pendingChangeId}");
}
}
```
**Event Handler**:
```csharp
public class PendingChangeApprovedEventHandler
: INotificationHandler<PendingChangeApprovedEvent>
{
private readonly IHubContext<McpHub> _hubContext;
public async Task Handle(PendingChangeApprovedEvent e, ...)
{
await _hubContext.Clients
.Group($"pending-change-{e.PendingChangeId}")
.SendAsync("PendingChangeApproved", new
{
PendingChangeId = e.PendingChangeId,
Status = "Approved",
Result = e.ExecutionResult,
Timestamp = DateTime.UtcNow
});
}
}
```
---
## Timeline
### Week 1-2: Phase 1 - Foundation
- Day 1-3: Story 1 - MCP Protocol Handler
- Day 4-5: Story 2 - API Key Management
- Day 6-7: Story 3 - MCP Domain Layer
- Day 8: Story 4 - Error Handling & Logging
**Milestone**: MCP infrastructure ready, API Key authentication working
### Week 3-4: Phase 2 - Resources
- Day 9-11: Story 5 - Core Resources Implementation
- Day 12: Story 6 - Resource Registration
- Day 13-14: Story 7 - Multi-Tenant Isolation Verification
- Day 15-16: Story 8 - Redis Caching Integration
**Milestone**: AI can read ColaFlow data via MCP Resources
### Week 5-6: Phase 3 - Tools & Diff Preview
- Day 17-18: Story 9 - Diff Preview Service
- Day 19-20: Story 10 - PendingChange Management
- Day 21-23: Story 11 - Core Tools Implementation
- Day 24: Story 12 - SignalR Notifications
**Milestone**: AI can request write operations (with approval workflow)
---
## Definition of Done
### Sprint-Level DoD
- [ ] All P0 stories completed (Stories 1-12)
- [ ] MCP protocol `initialize` handshake works
- [ ] API Key authentication functional
- [ ] 5 Resources return correct data with < 200ms latency
- [ ] 3 Tools generate Diff Preview correctly
- [ ] Approval workflow complete (PendingChange Approve Execute)
- [ ] SignalR real-time notifications working
- [ ] Multi-tenant isolation 100% verified
- [ ] Redis caching improves performance by 30%+
- [ ] Unit test coverage > 80%
- [ ] Integration tests pass
- [ ] No CRITICAL security vulnerabilities
- [ ] Architecture documentation updated
### Story-Level DoD (Per Story)
- [ ] Code complete and compiles
- [ ] Unit tests written and passing
- [ ] Integration tests written and passing
- [ ] Code reviewed and approved
- [ ] No compiler warnings
- [ ] No TODO/FIXME comments
- [ ] XML documentation for public APIs
- [ ] Follows C# coding standards
- [ ] Database migrations created (if applicable)
- [ ] Performance tested (if applicable)
---
## Success Metrics
### Performance Metrics
- **API Response Time**: < 200ms (P50), < 500ms (P95)
- **MCP Protocol Overhead**: < 5ms per request
- **Cache Hit Rate**: > 80% for hot Resources
- **Throughput**: > 100 requests/second per instance
### Quality Metrics
- **Unit Test Coverage**: > 80%
- **Integration Test Coverage**: > 70%
- **Security Vulnerabilities**: 0 CRITICAL, 0 HIGH
- **Code Duplication**: < 5%
### Functional Metrics
- **Resources Implemented**: 5/5 (100%)
- **Tools Implemented**: 3/3 (100%)
- **Multi-Tenant Isolation**: 100% verified
- **Diff Preview Accuracy**: 100% (all changed fields detected)
---
## Dependencies
### Prerequisites
- M1 Core Features 82% complete (Sprint 1-4)
- ProjectManagement Module production-ready
- SignalR infrastructure complete (Day 17)
- Multi-tenant security verified (Day 14-16)
- Audit Log system available (Day 14 design complete)
### Technical Stack
- .NET 9 (ASP.NET Core)
- PostgreSQL 15+
- Redis 7+
- EF Core 9
- MediatR (CQRS)
- SignalR
- BCrypt.Net
- Serilog
### External Dependencies
- MCP Protocol Specification (JSON-RPC 2.0)
- Claude Desktop / ChatGPT MCP clients (for testing)
---
## Risks & Mitigation
| Risk ID | Description | Impact | Probability | Mitigation | Owner |
|---------|-------------|--------|-------------|------------|-------|
| RISK-001 | MCP protocol specification changes | High | Medium | Version control, quick adaptation | Architect |
| RISK-002 | Performance bottleneck (high concurrency) | Medium | Medium | Redis caching, horizontal scaling | Backend Lead |
| RISK-003 | API Key security breach | High | Low | BCrypt hashing, IP whitelist, rate limiting | Security Lead |
| RISK-004 | Diff Preview inaccurate for complex objects | Medium | Medium | Comprehensive testing, JSON diff library | Backend Dev |
| RISK-005 | SignalR scalability issues | Medium | Low | Use Redis backplane for multi-instance | Backend Lead |
| RISK-006 | Multi-tenant data leak | Critical | Very Low | 100% test coverage, security audit | QA Lead |
---
## Architecture Decisions
### AD-001: Custom .NET MCP Implementation (Not Node.js SDK)
**Decision**: Implement MCP protocol natively in .NET 9 instead of using official Node.js SDK
**Rationale**:
- Native integration with ASP.NET Core backend
- Better performance (especially concurrency)
- No Node.js deployment dependency
- Team expertise in .NET
- Type safety with C#
**Alternatives Considered**:
- Official Node.js MCP SDK (rejected: extra runtime, worse performance)
- Hybrid approach with Node.js bridge (rejected: added complexity)
### AD-002: Diff Preview Approval Workflow
**Decision**: All AI write operations require human approval via Diff Preview
**Rationale**:
- Security: Prevent AI mistakes
- Transparency: Users see what will change
- Compliance: Audit trail required
- Trust: Build user confidence in AI
**Alternatives Considered**:
- Auto-approval for low-risk operations (deferred to Phase 4)
- No preview, direct execution (rejected: too risky)
### AD-003: Direct Service Integration (Not HTTP API)
**Decision**: MCP Server calls existing CQRS commands directly via MediatR
**Rationale**:
- Zero network latency
- Shared transaction context
- Reuse existing business logic
- Simpler deployment (same process)
**Alternatives Considered**:
- HTTP API calls (deferred to M4 if services split)
### AD-004: PostgreSQL JSONB for Diff Storage
**Decision**: Store Diff Preview data in PostgreSQL JSONB column
**Rationale**:
- Flexible schema for different entity types
- Efficient querying with JSONB operators
- No additional storage system needed
- Transactional consistency
**Alternatives Considered**:
- MongoDB (rejected: adds new dependency)
- Separate diff tables per entity (rejected: too complex)
---
## Technical Debt
### Known Limitations (To Address Post-Sprint)
1. **No IP Whitelist Enforcement** (Phase 1)
- Debt: API Key validation doesn't check IP whitelist
- Plan: Add in Phase 4 (Approval Workflow)
2. **Simple Cache Invalidation** (Phase 2)
- Debt: Cache invalidation is time-based (TTL), not event-driven
- Plan: Add domain event listeners in Phase 5
3. **No Advanced Query Language** (Phase 2)
- Debt: `issues.search` uses simple filters, not JQL
- Plan: Add JQL-like query parser in M3
4. **No Rate Limiting** (Phase 1)
- Debt: API Key has no rate limits
- Plan: Add rate limiting middleware in Phase 6
5. **Hardcoded Approval Rules** (Phase 3)
- Debt: All Tools require approval (no config)
- Plan: Add configurable approval rules in Phase 7
---
## Testing Strategy
### Unit Tests (> 80% Coverage)
- Domain entities and value objects
- CQRS command/query handlers
- Diff Preview generation logic
- API Key validation logic
- MCP protocol parsing
### Integration Tests (> 70% Coverage)
- End-to-end MCP request/response flow
- Database operations (EF Core repositories)
- Multi-tenant isolation verification
- Cache hit/miss scenarios
- SignalR notifications
### Performance Tests
- Concurrent API requests (100 req/s)
- Cache performance benchmarks
- Database query performance
- MCP protocol overhead
### Security Tests
- Cross-tenant access attempts
- API Key brute force
- SQL injection attempts
- JWT token validation
---
## Related Documents
### Architecture Documents
- [MCP Server Architecture](../architecture/mcp-server-architecture.md) - Complete 1,867-line design doc
- [MCP Suggestions](../mcp-suggestion.md) - Architect's suggestions and analysis
### Planning Documents
- [Product Roadmap](../../product.md) - M2 section
- [Sprint 1](sprint_1.md) - Frontend Integration
- [Sprint 2](sprint_2.md) - M1 Backend Features
- [Sprint 3](sprint_3.md) - Frontend Code Quality
- [Sprint 4](sprint_4.md) - Story Management & UX Enhancement
### Technical References
- [ProjectManagement Module](../../colaflow-api/src/ColaFlow.Modules.ProjectManagement/)
- [Identity & RBAC Module](../../colaflow-api/src/ColaFlow.Modules.Identity/)
- [SignalR Hubs](../../colaflow-api/src/ColaFlow.Infrastructure.SignalR/)
---
## Notes
### Why This Sprint Matters
**For Product**:
- **AI Integration Foundation**: Enables ColaFlow to become AI-native
- **Market Differentiation**: MCP support is cutting-edge (few competitors)
- **M2 Milestone Progress**: 50% of M2 completed after this Sprint
**For Users**:
- **Natural Language PM**: Talk to AI to manage projects
- **50% Time Savings**: AI automates repetitive tasks
- **Safe AI Operations**: Every change previewed and approved
**For Development**:
- **Clean Architecture**: Solid foundation for M3-M5
- **Reusable Patterns**: Diff Preview, approval workflow reusable
- **Quality Focus**: High test coverage, security-first design
### Phase 4-7 Preview (Not in This Sprint)
**Phase 4: Approval Workflow** (Week 7-8)
- Frontend approval UI
- Audit log integration
- Advanced approval rules
**Phase 5: Prompts & Integration** (Week 9-10)
- 2 core Prompts (generate_prd, split_epic_to_stories)
- Claude Desktop integration PoC
- End-to-end testing
**Phase 6: Testing & Hardening** (Week 11-12)
- Performance optimization
- Security audit
- Production readiness
**Phase 7: Documentation & PoC** (Week 13-16)
- Complete API documentation
- Video demo
- Internal training
---
## Sprint Retrospective Questions
### What Went Well?
- Clean architecture enabled fast development?
- Domain-driven design reduced bugs?
- Test coverage caught issues early?
### What Can Improve?
- Integration testing too slow?
- Domain events too complex?
- Diff Preview edge cases?
### Action Items for Next Sprint
- Optimize integration test performance
- Simplify domain event handlers
- Add more Diff Preview test cases
---
**Created**: 2025-11-06 by Product Manager Agent
**Next Review**: 2025-12-04 (mid-sprint checkpoint, Week 3)
**Sprint Duration**: 8 weeks (40 working days)
**Target Completion**: 2026-01-22
**Minimum Viable**: 2026-01-08 (Phase 1-2 only, 6 weeks)