ci.sh•3.63 kB
#!/usr/bin/env bash
set -Eeuo pipefail
CONTAINER_NAME="keboola-mcp-server-test-docker"
IMAGE_NAME="keboola/mcp-server:ci"
cleanup() {
docker stop "$CONTAINER_NAME" >/dev/null 2>&1 || true
docker rm "$CONTAINER_NAME" >/dev/null 2>&1 || true
}
trap cleanup EXIT
main() {
# Start container
echo "Starting container..."
docker run -d \
--name "$CONTAINER_NAME" \
-p "8080:8000" \
"$IMAGE_NAME" \
--transport http-compat \
--api-url "$STORAGE_API_URL" \
--storage-token "$STORAGE_API_TOKEN" \
--workspace-schema "$WORKSPACE_SCHEMA" \
--host "0.0.0.0" \
--port 8000 >/dev/null
# Give server time to start
sleep 5
# Wait and test MCP initialize
echo "Testing MCP initialize..."
for i in $(seq 1 30); do
response=$(curl -s -w "\n%{http_code}" -D "headers.txt" -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"protocolVersion": "2024-11-05", "capabilities": {}, "clientInfo": {"name": "ci-docker-test", "version": "1.0.0"}}}' \
"http://localhost:8080/mcp" 2>/dev/null)
http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | sed '$d')
mcp_session_id=$(cat "headers.txt" | grep -i "mcp-session-id" | cut -d: -f2 | sed -r 's/\s//g')
if [ "$http_code" = "200" ] && [ -n "$body" ] && [ -n "$mcp_session_id" ]; then
echo "✓ MCP server initialized successfully, session ID $mcp_session_id"
response=$(curl -s -w "\n%{http_code}" -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "mcp-session-id: $mcp_session_id" \
-d '{"jsonrpc": "2.0", "method": "notifications/initialized"}' \
"http://localhost:8080/mcp" 2>/dev/null)
http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | sed '$d')
if [ "$http_code" = "202" ]; then
echo "✓ MCP initialization confirmed"
response=$(curl -s -w "\n%{http_code}" -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "mcp-session-id: $mcp_session_id" \
-d '{"jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": {"name": "get_project_info", "arguments": {}}}' \
"http://localhost:8080/mcp" 2>/dev/null)
http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | sed '$d')
if [ "$http_code" = "200" ] && [ -n "$body" ]; then
echo "✓ Tool call succeeded"
project_id=$(echo "$body" | grep "^data: " | grep -oP "\"project_id\":\s*\d+" | cut -d: -f2)
token_project_id=$(echo "$STORAGE_API_TOKEN" | cut -d- -f1)
if [ "$project_id" = "$token_project_id" ]; then
echo "✓ Project ID test passed"
exit 0
else
echo "✗ Wrong project ID returned, expecting $token_project_id, got $project_id"
fi
fi
fi
# If tool call didn't succeed, continue outer loop
fi
sleep 1
done
echo "✗ Server failed to respond"
docker logs "$CONTAINER_NAME" 2>&1 | tail -10
exit 1
}
main "$@"