Files
ColaFlow/scripts/test-mcp-runtime.ps1
Yaojia Wang 4479c9ef91 docs(mcp): Complete Phase 3 Runtime Testing and Validation
Phase 3 runtime testing has been completed with critical findings:
- Microsoft MCP SDK is registered but NOT actually used at runtime
- Application uses custom HTTP-based MCP implementation instead of SDK's stdio
- SDK tools (Ping, GetServerTime, GetProjectInfo) discovered but not exposed
- Requires architecture decision: Remove SDK, Use SDK properly, or Hybrid approach

Test artifacts:
- Complete test report with detailed analysis
- Summary document for quick reference
- Runtime test scripts (PowerShell)
- API key creation utilities (SQL + PowerShell)

Key findings:
- Transport mismatch: SDK expects stdio, app uses HTTP
- Tool discovery works but not integrated with custom handler
- Cannot verify DI in SDK tools (tools never called)
- Claude Desktop integration blocked (requires stdio)

Next steps:
1. Make architecture decision (Remove/Use/Hybrid)
2. Either remove SDK or implement stdio transport
3. Bridge SDK tools to custom handler if keeping SDK

Test Status: Phase 3 Complete (Blocked on architecture decision)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 22:47:19 +01:00

394 lines
13 KiB
PowerShell

# MCP Runtime Validation Test Script
# Phase 3: Runtime Testing and Verification
param(
[string]$BaseUrl = "http://localhost:5000",
[string]$McpEndpoint = "/mcp",
[int]$StartupWaitSeconds = 10
)
$ErrorActionPreference = "Continue"
$ProgressPreference = "SilentlyContinue"
Write-Host "=====================================" -ForegroundColor Cyan
Write-Host "MCP Runtime Validation Test" -ForegroundColor Cyan
Write-Host "=====================================" -ForegroundColor Cyan
Write-Host ""
# Test Results
$TestResults = @{
Timestamp = Get-Date
BaseUrl = $BaseUrl
Tests = @()
}
function Add-TestResult {
param(
[string]$TestName,
[string]$Status,
[object]$Details
)
$result = @{
TestName = $TestName
Status = $Status
Details = $Details
Timestamp = Get-Date
}
$TestResults.Tests += $result
$color = switch ($Status) {
"PASS" { "Green" }
"FAIL" { "Red" }
"WARN" { "Yellow" }
"INFO" { "Cyan" }
default { "White" }
}
Write-Host "[$Status] $TestName" -ForegroundColor $color
if ($Details) {
Write-Host " Details: $Details" -ForegroundColor Gray
}
}
function Test-McpEndpoint {
param(
[string]$Url,
[string]$Method,
[object]$Body
)
try {
$bodyJson = if ($Body) { $Body | ConvertTo-Json -Depth 10 } else { $null }
$params = @{
Uri = $Url
Method = "POST"
ContentType = "application/json"
Body = $bodyJson
TimeoutSec = 10
}
$response = Invoke-WebRequest @params -ErrorAction Stop
return @{
Success = $true
StatusCode = $response.StatusCode
Content = $response.Content | ConvertFrom-Json
RawContent = $response.Content
}
}
catch {
return @{
Success = $false
Error = $_.Exception.Message
StatusCode = $_.Exception.Response.StatusCode.value__
}
}
}
# Test 1: Check if application is running
Write-Host "`n1. Checking if application is running..." -ForegroundColor Yellow
try {
$healthCheck = Invoke-WebRequest -Uri "$BaseUrl/health" -Method GET -TimeoutSec 5 -ErrorAction Stop
Add-TestResult -TestName "Application Health Check" -Status "PASS" -Details "Application is running on $BaseUrl"
}
catch {
Add-TestResult -TestName "Application Health Check" -Status "FAIL" -Details "Application not responding: $($_.Exception.Message)"
Write-Host "`nPlease start the application first:" -ForegroundColor Red
Write-Host " cd colaflow-api/src/ColaFlow.API" -ForegroundColor Yellow
Write-Host " dotnet run" -ForegroundColor Yellow
exit 1
}
# Test 2: Discover MCP endpoints
Write-Host "`n2. Discovering MCP endpoints..." -ForegroundColor Yellow
$possibleEndpoints = @(
"/mcp",
"/api/mcp",
"/.well-known/mcp",
"/mcp/sse",
"/mcp/ws"
)
$discoveredEndpoint = $null
foreach ($endpoint in $possibleEndpoints) {
$url = "$BaseUrl$endpoint"
try {
$response = Invoke-WebRequest -Uri $url -Method POST -ContentType "application/json" -Body '{"jsonrpc":"2.0","id":0,"method":"ping"}' -TimeoutSec 5 -ErrorAction Stop
$discoveredEndpoint = $endpoint
Add-TestResult -TestName "Endpoint Discovery" -Status "PASS" -Details "Found MCP endpoint at $endpoint"
break
}
catch {
# Endpoint not found, try next
}
}
if (-not $discoveredEndpoint) {
Add-TestResult -TestName "Endpoint Discovery" -Status "WARN" -Details "No HTTP endpoint found. SDK might be using stdio transport."
Write-Host "`nNote: Microsoft MCP SDK might be configured for stdio transport (Claude Desktop)." -ForegroundColor Yellow
}
$McpUrl = "$BaseUrl$discoveredEndpoint"
# Test 3: MCP Initialize
if ($discoveredEndpoint) {
Write-Host "`n3. Testing MCP Initialize..." -ForegroundColor Yellow
$initRequest = @{
jsonrpc = "2.0"
id = 1
method = "initialize"
params = @{
protocolVersion = "2024-11-05"
capabilities = @{}
clientInfo = @{
name = "test-client"
version = "1.0.0"
}
}
}
$result = Test-McpEndpoint -Url $McpUrl -Method "initialize" -Body $initRequest
if ($result.Success) {
Add-TestResult -TestName "MCP Initialize" -Status "PASS" -Details "Protocol version: $($result.Content.result.protocolVersion)"
Write-Host " Server Info: $($result.Content.result.serverInfo.name) v$($result.Content.result.serverInfo.version)" -ForegroundColor Gray
}
else {
Add-TestResult -TestName "MCP Initialize" -Status "FAIL" -Details $result.Error
}
}
# Test 4: List Tools
if ($discoveredEndpoint) {
Write-Host "`n4. Testing tools/list..." -ForegroundColor Yellow
$listToolsRequest = @{
jsonrpc = "2.0"
id = 2
method = "tools/list"
params = @{}
}
$result = Test-McpEndpoint -Url $McpUrl -Method "tools/list" -Body $listToolsRequest
if ($result.Success) {
$tools = $result.Content.result.tools
Add-TestResult -TestName "List Tools" -Status "PASS" -Details "Found $($tools.Count) tools"
Write-Host " Available Tools:" -ForegroundColor Gray
foreach ($tool in $tools) {
Write-Host " - $($tool.name): $($tool.description)" -ForegroundColor Gray
}
}
else {
Add-TestResult -TestName "List Tools" -Status "FAIL" -Details $result.Error
}
}
# Test 5: Call Ping Tool
if ($discoveredEndpoint) {
Write-Host "`n5. Testing tools/call (Ping)..." -ForegroundColor Yellow
$callPingRequest = @{
jsonrpc = "2.0"
id = 3
method = "tools/call"
params = @{
name = "Ping"
arguments = @{}
}
}
$result = Test-McpEndpoint -Url $McpUrl -Method "tools/call" -Body $callPingRequest
if ($result.Success) {
Add-TestResult -TestName "Call Ping Tool" -Status "PASS" -Details "Response: $($result.Content.result.content[0].text)"
}
else {
Add-TestResult -TestName "Call Ping Tool" -Status "FAIL" -Details $result.Error
}
}
# Test 6: Call GetServerTime Tool (with DI Logger)
if ($discoveredEndpoint) {
Write-Host "`n6. Testing tools/call (GetServerTime) - Verifying DI..." -ForegroundColor Yellow
$callGetServerTimeRequest = @{
jsonrpc = "2.0"
id = 4
method = "tools/call"
params = @{
name = "GetServerTime"
arguments = @{}
}
}
$result = Test-McpEndpoint -Url $McpUrl -Method "tools/call" -Body $callGetServerTimeRequest
if ($result.Success) {
Add-TestResult -TestName "Call GetServerTime Tool (DI Test)" -Status "PASS" -Details "Response: $($result.Content.result.content[0].text)"
Write-Host " Note: Check server logs to verify ILogger was injected successfully" -ForegroundColor Gray
}
else {
Add-TestResult -TestName "Call GetServerTime Tool (DI Test)" -Status "FAIL" -Details $result.Error
}
}
# Test 7: Call GetProjectInfo Tool
if ($discoveredEndpoint) {
Write-Host "`n7. Testing tools/call (GetProjectInfo)..." -ForegroundColor Yellow
$callGetProjectInfoRequest = @{
jsonrpc = "2.0"
id = 5
method = "tools/call"
params = @{
name = "GetProjectInfo"
arguments = @{
projectId = "test-project-123"
}
}
}
$result = Test-McpEndpoint -Url $McpUrl -Method "tools/call" -Body $callGetProjectInfoRequest
if ($result.Success) {
Add-TestResult -TestName "Call GetProjectInfo Tool" -Status "PASS" -Details "Response: $($result.Content.result.content[0].text)"
}
else {
Add-TestResult -TestName "Call GetProjectInfo Tool" -Status "FAIL" -Details $result.Error
}
}
# Test 8: List Resources
if ($discoveredEndpoint) {
Write-Host "`n8. Testing resources/list..." -ForegroundColor Yellow
$listResourcesRequest = @{
jsonrpc = "2.0"
id = 6
method = "resources/list"
params = @{}
}
$result = Test-McpEndpoint -Url $McpUrl -Method "resources/list" -Body $listResourcesRequest
if ($result.Success) {
$resources = $result.Content.result.resources
Add-TestResult -TestName "List Resources" -Status "PASS" -Details "Found $($resources.Count) resources"
if ($resources.Count -gt 0) {
Write-Host " Available Resources:" -ForegroundColor Gray
foreach ($resource in $resources) {
Write-Host " - $($resource.uri): $($resource.name)" -ForegroundColor Gray
}
}
}
else {
Add-TestResult -TestName "List Resources" -Status "FAIL" -Details $result.Error
}
}
# Test 9: Error Handling
if ($discoveredEndpoint) {
Write-Host "`n9. Testing error handling..." -ForegroundColor Yellow
$invalidRequest = @{
jsonrpc = "2.0"
id = 7
method = "tools/call"
params = @{
name = "NonExistentTool"
arguments = @{}
}
}
$result = Test-McpEndpoint -Url $McpUrl -Method "tools/call" -Body $invalidRequest
if ($result.Success -eq $false) {
Add-TestResult -TestName "Error Handling (Invalid Tool)" -Status "PASS" -Details "Correctly returned error"
}
else {
Add-TestResult -TestName "Error Handling (Invalid Tool)" -Status "WARN" -Details "Should have returned error for non-existent tool"
}
}
# Test Summary
Write-Host "`n=====================================" -ForegroundColor Cyan
Write-Host "Test Summary" -ForegroundColor Cyan
Write-Host "=====================================" -ForegroundColor Cyan
$passCount = ($TestResults.Tests | Where-Object { $_.Status -eq "PASS" }).Count
$failCount = ($TestResults.Tests | Where-Object { $_.Status -eq "FAIL" }).Count
$warnCount = ($TestResults.Tests | Where-Object { $_.Status -eq "WARN" }).Count
Write-Host "Total Tests: $($TestResults.Tests.Count)" -ForegroundColor White
Write-Host "Passed: $passCount" -ForegroundColor Green
Write-Host "Failed: $failCount" -ForegroundColor Red
Write-Host "Warnings: $warnCount" -ForegroundColor Yellow
# Save results to JSON
$reportPath = "c:\Users\yaoji\git\ColaCoder\product-master\scripts\mcp-runtime-test-results.json"
$TestResults | ConvertTo-Json -Depth 10 | Out-File -FilePath $reportPath -Encoding UTF8
Write-Host "`nDetailed results saved to: $reportPath" -ForegroundColor Gray
# Key Questions
Write-Host "`n=====================================" -ForegroundColor Cyan
Write-Host "Key Questions to Answer" -ForegroundColor Cyan
Write-Host "=====================================" -ForegroundColor Cyan
Write-Host "1. SDK Transport Layer:" -ForegroundColor Yellow
if ($discoveredEndpoint) {
Write-Host " HTTP endpoint found at: $discoveredEndpoint" -ForegroundColor Green
}
else {
Write-Host " No HTTP endpoint found - likely using stdio" -ForegroundColor Yellow
}
Write-Host "`n2. Endpoint URL:" -ForegroundColor Yellow
Write-Host " $McpUrl" -ForegroundColor White
Write-Host "`n3. Tools Discovery:" -ForegroundColor Yellow
$toolTest = $TestResults.Tests | Where-Object { $_.TestName -eq "List Tools" }
if ($toolTest -and $toolTest.Status -eq "PASS") {
Write-Host " Tools correctly discovered: $($toolTest.Details)" -ForegroundColor Green
}
else {
Write-Host " Tools discovery failed" -ForegroundColor Red
}
Write-Host "`n4. Dependency Injection:" -ForegroundColor Yellow
$diTest = $TestResults.Tests | Where-Object { $_.TestName -eq "Call GetServerTime Tool (DI Test)" }
if ($diTest -and $diTest.Status -eq "PASS") {
Write-Host " DI appears to be working (check server logs for ILogger)" -ForegroundColor Green
}
else {
Write-Host " DI test failed or not executed" -ForegroundColor Red
}
Write-Host "`n5. Performance:" -ForegroundColor Yellow
Write-Host " Check response times in detailed results" -ForegroundColor Gray
Write-Host "`n=====================================" -ForegroundColor Cyan
Write-Host "Next Steps" -ForegroundColor Cyan
Write-Host "=====================================" -ForegroundColor Cyan
if (-not $discoveredEndpoint) {
Write-Host "1. Check application startup logs for MCP SDK initialization" -ForegroundColor Yellow
Write-Host "2. Review SDK documentation for transport configuration" -ForegroundColor Yellow
Write-Host "3. Consider testing with Claude Desktop (stdio transport)" -ForegroundColor Yellow
}
else {
Write-Host "1. Review detailed test results in JSON file" -ForegroundColor Yellow
Write-Host "2. Check server logs for any errors or warnings" -ForegroundColor Yellow
Write-Host "3. Proceed with Claude Desktop integration if stdio is supported" -ForegroundColor Yellow
}
Write-Host ""