305 lines
13 KiB
PowerShell
305 lines
13 KiB
PowerShell
# MCP Server Demo Test Script
|
|
# Tests the complete AI + Human collaboration workflow
|
|
|
|
param(
|
|
[string]$BaseUrl = "http://localhost:5000",
|
|
[string]$Username = "mcp_demo_user",
|
|
[string]$Email = "mcp.demo@colaflow.dev",
|
|
[string]$Password = "Demo@123456"
|
|
)
|
|
|
|
# Global variables
|
|
$ApiKey = ""
|
|
$JwtToken = ""
|
|
$ProjectId = ""
|
|
$PendingChangeId = ""
|
|
$EpicId = ""
|
|
|
|
# Helper function for API calls
|
|
function Invoke-Api {
|
|
param(
|
|
[string]$Method,
|
|
[string]$Endpoint,
|
|
[object]$Body = $null,
|
|
[hashtable]$Headers = @{},
|
|
[switch]$UseMcpAuth
|
|
)
|
|
|
|
$url = "$BaseUrl$Endpoint"
|
|
|
|
if ($UseMcpAuth -and $ApiKey) {
|
|
$Headers["X-MCP-API-Key"] = $ApiKey
|
|
} elseif ($JwtToken) {
|
|
$Headers["Authorization"] = "Bearer $JwtToken"
|
|
}
|
|
|
|
$Headers["Content-Type"] = "application/json"
|
|
|
|
try {
|
|
if ($Body) {
|
|
$jsonBody = $Body | ConvertTo-Json -Depth 10
|
|
$response = Invoke-RestMethod -Uri $url -Method $Method -Headers $Headers -Body $jsonBody -ErrorAction Stop
|
|
} else {
|
|
$response = Invoke-RestMethod -Uri $url -Method $Method -Headers $Headers -ErrorAction Stop
|
|
}
|
|
return $response
|
|
} catch {
|
|
Write-Host "Error calling $Method $Endpoint" -ForegroundColor Red
|
|
Write-Host $_.Exception.Message -ForegroundColor Red
|
|
if ($_.ErrorDetails) {
|
|
Write-Host $_.ErrorDetails.Message -ForegroundColor Red
|
|
}
|
|
throw
|
|
}
|
|
}
|
|
|
|
# Main test flow
|
|
Write-Host "=== MCP Server Demo Test ===" -ForegroundColor Cyan
|
|
Write-Host "Base URL: $BaseUrl" -ForegroundColor Gray
|
|
Write-Host "Username: $Username" -ForegroundColor Gray
|
|
Write-Host ""
|
|
|
|
# Step 0: Check if services are running
|
|
Write-Host "[Step 0] Checking if services are running..." -ForegroundColor Yellow
|
|
try {
|
|
$healthCheck = Invoke-RestMethod -Uri "$BaseUrl/api/health" -Method Get -ErrorAction Stop
|
|
Write-Host "✓ API is running" -ForegroundColor Green
|
|
Write-Host " Status: $($healthCheck.status)" -ForegroundColor Gray
|
|
} catch {
|
|
Write-Host "✗ API is not running at $BaseUrl" -ForegroundColor Red
|
|
Write-Host " Please start the API with: dotnet run --project src/ColaFlow.Api" -ForegroundColor Yellow
|
|
exit 1
|
|
}
|
|
|
|
# Step 1: Register user (if not exists) and login
|
|
Write-Host "`n[Step 1] Register and login..." -ForegroundColor Yellow
|
|
try {
|
|
# Try to register
|
|
$registerBody = @{
|
|
username = $Username
|
|
email = $Email
|
|
password = $Password
|
|
}
|
|
|
|
try {
|
|
$registerResponse = Invoke-Api -Method Post -Endpoint "/api/auth/register" -Body $registerBody
|
|
Write-Host "✓ User registered successfully" -ForegroundColor Green
|
|
} catch {
|
|
Write-Host " User may already exist, proceeding to login..." -ForegroundColor Gray
|
|
}
|
|
|
|
# Login
|
|
$loginBody = @{
|
|
email = $Email
|
|
password = $Password
|
|
}
|
|
|
|
$loginResponse = Invoke-Api -Method Post -Endpoint "/api/auth/login" -Body $loginBody
|
|
$JwtToken = $loginResponse.token
|
|
Write-Host "✓ Login successful" -ForegroundColor Green
|
|
Write-Host " JWT Token: $($JwtToken.Substring(0, 50))..." -ForegroundColor Gray
|
|
} catch {
|
|
Write-Host "✗ Failed to login" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Step 2: Create Test Project
|
|
Write-Host "`n[Step 2] Create Test Project..." -ForegroundColor Yellow
|
|
try {
|
|
$projectBody = @{
|
|
name = "MCP Demo Project $(Get-Date -Format 'yyyyMMdd_HHmmss')"
|
|
key = "MCP$(Get-Date -Format 'HHmmss')"
|
|
description = "Test project for MCP Server demo"
|
|
}
|
|
|
|
$projectResponse = Invoke-Api -Method Post -Endpoint "/api/projects" -Body $projectBody
|
|
$ProjectId = $projectResponse.id
|
|
Write-Host "✓ Project created successfully" -ForegroundColor Green
|
|
Write-Host " Project ID: $ProjectId" -ForegroundColor Gray
|
|
Write-Host " Project Name: $($projectResponse.name)" -ForegroundColor Gray
|
|
Write-Host " Project Key: $($projectResponse.key)" -ForegroundColor Gray
|
|
} catch {
|
|
Write-Host "✗ Failed to create project" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Step 3: Create MCP API Key
|
|
Write-Host "`n[Step 3] Create MCP API Key..." -ForegroundColor Yellow
|
|
try {
|
|
$apiKeyBody = @{
|
|
name = "Demo API Key $(Get-Date -Format 'HHmmss')"
|
|
permissions = @("read", "write")
|
|
}
|
|
|
|
$apiKeyResponse = Invoke-Api -Method Post -Endpoint "/api/mcp/api-keys" -Body $apiKeyBody
|
|
$ApiKey = $apiKeyResponse.key
|
|
Write-Host "✓ MCP API Key created successfully" -ForegroundColor Green
|
|
Write-Host " API Key: $($ApiKey.Substring(0, 50))..." -ForegroundColor Gray
|
|
Write-Host " Key ID: $($apiKeyResponse.id)" -ForegroundColor Gray
|
|
Write-Host " Permissions: $($apiKeyResponse.permissions -join ', ')" -ForegroundColor Gray
|
|
} catch {
|
|
Write-Host "✗ Failed to create MCP API Key" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Step 4: Test MCP Resources (list)
|
|
Write-Host "`n[Step 4] Test MCP Resources (list)..." -ForegroundColor Yellow
|
|
try {
|
|
$resourcesResponse = Invoke-Api -Method Get -Endpoint "/api/mcp/resources" -UseMcpAuth
|
|
Write-Host "✓ Resources list retrieved successfully" -ForegroundColor Green
|
|
Write-Host " Total resources: $($resourcesResponse.resources.Count)" -ForegroundColor Gray
|
|
foreach ($resource in $resourcesResponse.resources) {
|
|
Write-Host " - $($resource.uri): $($resource.name)" -ForegroundColor Gray
|
|
}
|
|
} catch {
|
|
Write-Host "✗ Failed to get resources list" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Step 5: Test MCP Resources (read project)
|
|
Write-Host "`n[Step 5] Test MCP Resources (read project)..." -ForegroundColor Yellow
|
|
try {
|
|
$projectUri = "project://$ProjectId"
|
|
$resourceReadResponse = Invoke-Api -Method Get -Endpoint "/api/mcp/resources/read?uri=$([System.Web.HttpUtility]::UrlEncode($projectUri))" -UseMcpAuth
|
|
Write-Host "✓ Project resource read successfully" -ForegroundColor Green
|
|
Write-Host " URI: $($resourceReadResponse.uri)" -ForegroundColor Gray
|
|
Write-Host " MIME Type: $($resourceReadResponse.mimeType)" -ForegroundColor Gray
|
|
if ($resourceReadResponse.contents -and $resourceReadResponse.contents.Count -gt 0) {
|
|
$content = $resourceReadResponse.contents[0]
|
|
Write-Host " Content (first 200 chars):" -ForegroundColor Gray
|
|
$contentPreview = $content.text.Substring(0, [Math]::Min(200, $content.text.Length))
|
|
Write-Host " $contentPreview..." -ForegroundColor Gray
|
|
}
|
|
} catch {
|
|
Write-Host "✗ Failed to read project resource" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Step 6: Test MCP Tools (create_epic via Tool)
|
|
Write-Host "`n[Step 6] AI proposes creating Epic (via MCP Tool)..." -ForegroundColor Yellow
|
|
try {
|
|
$createEpicToolBody = @{
|
|
name = "tools/create_epic"
|
|
arguments = @{
|
|
projectId = $ProjectId
|
|
title = "MCP Demo Epic - User Authentication System"
|
|
description = "Implement complete user authentication system with SSO, MFA, and role-based access control"
|
|
priority = "High"
|
|
}
|
|
}
|
|
|
|
$toolResponse = Invoke-Api -Method Post -Endpoint "/api/mcp/tools/call" -Body $createEpicToolBody -UseMcpAuth
|
|
Write-Host "✓ MCP Tool call successful (PendingChange created)" -ForegroundColor Green
|
|
Write-Host " Tool: $($toolResponse.name)" -ForegroundColor Gray
|
|
|
|
if ($toolResponse.content -and $toolResponse.content.Count -gt 0) {
|
|
$resultContent = $toolResponse.content[0]
|
|
if ($resultContent.type -eq "text") {
|
|
Write-Host " Result:" -ForegroundColor Gray
|
|
Write-Host " $($resultContent.text)" -ForegroundColor Gray
|
|
|
|
# Extract PendingChangeId from result text
|
|
if ($resultContent.text -match "PendingChange ID: ([a-f0-9\-]+)") {
|
|
$PendingChangeId = $matches[1]
|
|
Write-Host " Pending Change ID: $PendingChangeId" -ForegroundColor Cyan
|
|
}
|
|
}
|
|
}
|
|
} catch {
|
|
Write-Host "✗ Failed to call MCP tool" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Step 7: Get PendingChange details
|
|
Write-Host "`n[Step 7] Get PendingChange details..." -ForegroundColor Yellow
|
|
try {
|
|
$pendingChangeResponse = Invoke-Api -Method Get -Endpoint "/api/mcp/pending-changes/$PendingChangeId"
|
|
Write-Host "✓ PendingChange retrieved successfully" -ForegroundColor Green
|
|
Write-Host " Change ID: $($pendingChangeResponse.id)" -ForegroundColor Gray
|
|
Write-Host " Operation: $($pendingChangeResponse.operation)" -ForegroundColor Gray
|
|
Write-Host " Resource URI: $($pendingChangeResponse.resourceUri)" -ForegroundColor Gray
|
|
Write-Host " Status: $($pendingChangeResponse.status)" -ForegroundColor Gray
|
|
Write-Host " Created By: $($pendingChangeResponse.createdBy)" -ForegroundColor Gray
|
|
Write-Host " Proposed Data:" -ForegroundColor Gray
|
|
Write-Host " $(($pendingChangeResponse.proposedData | ConvertTo-Json -Compress).Substring(0, [Math]::Min(200, ($pendingChangeResponse.proposedData | ConvertTo-Json -Compress).Length)))..." -ForegroundColor Gray
|
|
} catch {
|
|
Write-Host "✗ Failed to get PendingChange" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Step 8: Approve PendingChange (Human decision)
|
|
Write-Host "`n[Step 8] Human approves change..." -ForegroundColor Yellow
|
|
try {
|
|
$approveBody = @{
|
|
decision = "approved"
|
|
comment = "Looks good! AI proposed changes are approved."
|
|
}
|
|
|
|
$approveResponse = Invoke-Api -Method Post -Endpoint "/api/mcp/pending-changes/$PendingChangeId/review" -Body $approveBody
|
|
Write-Host "✓ PendingChange approved successfully" -ForegroundColor Green
|
|
Write-Host " Status: $($approveResponse.status)" -ForegroundColor Gray
|
|
Write-Host " Reviewed At: $($approveResponse.reviewedAt)" -ForegroundColor Gray
|
|
Write-Host " Comment: $($approveResponse.comment)" -ForegroundColor Gray
|
|
|
|
# Extract Epic ID from result
|
|
if ($approveResponse.result -and $approveResponse.result.id) {
|
|
$EpicId = $approveResponse.result.id
|
|
Write-Host " Epic Created ID: $EpicId" -ForegroundColor Cyan
|
|
}
|
|
} catch {
|
|
Write-Host "✗ Failed to approve PendingChange" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Step 9: Verify Epic was created
|
|
Write-Host "`n[Step 9] Verify Epic was created..." -ForegroundColor Yellow
|
|
try {
|
|
$epicResponse = Invoke-Api -Method Get -Endpoint "/api/epics/$EpicId"
|
|
Write-Host "✓ Epic verified successfully" -ForegroundColor Green
|
|
Write-Host " Epic ID: $($epicResponse.id)" -ForegroundColor Gray
|
|
Write-Host " Title: $($epicResponse.title)" -ForegroundColor Gray
|
|
Write-Host " Description: $($epicResponse.description)" -ForegroundColor Gray
|
|
Write-Host " Priority: $($epicResponse.priority)" -ForegroundColor Gray
|
|
Write-Host " Status: $($epicResponse.status)" -ForegroundColor Gray
|
|
} catch {
|
|
Write-Host "✗ Failed to verify Epic" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Step 10: Get Audit Logs
|
|
Write-Host "`n[Step 10] View Audit Logs..." -ForegroundColor Yellow
|
|
try {
|
|
$auditLogsResponse = Invoke-Api -Method Get -Endpoint "/api/mcp/audit-logs?entityId=$EpicId&limit=10"
|
|
Write-Host "✓ Audit logs retrieved successfully" -ForegroundColor Green
|
|
Write-Host " Total logs: $($auditLogsResponse.items.Count)" -ForegroundColor Gray
|
|
|
|
foreach ($log in $auditLogsResponse.items) {
|
|
Write-Host " ---" -ForegroundColor Gray
|
|
Write-Host " Event: $($log.eventType)" -ForegroundColor Gray
|
|
Write-Host " Actor: $($log.actorId) ($($log.actorType))" -ForegroundColor Gray
|
|
Write-Host " Timestamp: $($log.timestamp)" -ForegroundColor Gray
|
|
if ($log.metadata) {
|
|
Write-Host " Metadata: $(($log.metadata | ConvertTo-Json -Compress).Substring(0, [Math]::Min(100, ($log.metadata | ConvertTo-Json -Compress).Length)))..." -ForegroundColor Gray
|
|
}
|
|
}
|
|
} catch {
|
|
Write-Host " Warning: Could not retrieve audit logs" -ForegroundColor Yellow
|
|
}
|
|
|
|
# Summary
|
|
Write-Host "`n=== Test Summary ===" -ForegroundColor Cyan
|
|
Write-Host "✓ All tests passed!" -ForegroundColor Green
|
|
Write-Host ""
|
|
Write-Host "Workflow completed:" -ForegroundColor White
|
|
Write-Host " 1. User authenticated: $Username" -ForegroundColor Gray
|
|
Write-Host " 2. Project created: $ProjectId" -ForegroundColor Gray
|
|
Write-Host " 3. MCP API Key created: $($ApiKey.Substring(0, 20))..." -ForegroundColor Gray
|
|
Write-Host " 4. AI proposed Epic creation via MCP Tool" -ForegroundColor Gray
|
|
Write-Host " 5. PendingChange created: $PendingChangeId" -ForegroundColor Gray
|
|
Write-Host " 6. Human approved the change" -ForegroundColor Gray
|
|
Write-Host " 7. Epic created: $EpicId" -ForegroundColor Gray
|
|
Write-Host " 8. Audit trail recorded" -ForegroundColor Gray
|
|
Write-Host ""
|
|
Write-Host "This demonstrates the complete AI + Human collaboration workflow!" -ForegroundColor Green
|
|
Write-Host "AI can propose changes safely, and humans maintain control through approval." -ForegroundColor Green
|