1+ #! /bin/bash
2+ set -e
3+
4+ echo " =================================================="
5+ echo " End-to-End Test - Integrated Mode"
6+ echo " =================================================="
7+
8+ # Use environment variables if available, otherwise defaults
9+ MCP_SERVER=" ${BASE_URI:- http:// localhost: 3232} "
10+ USER_ID=" e2e-test-$( date +%s) "
11+
12+ echo " 🔧 Configuration:"
13+ echo " MCP Server: $MCP_SERVER "
14+ echo " User ID: $USER_ID "
15+ echo " Auth Mode: ${AUTH_MODE:- integrated} (from environment)"
16+ echo " "
17+
18+ # Check prerequisites
19+ echo " 🔍 Checking prerequisites..."
20+
21+ # Check Redis
22+ if ! docker ps | grep -q redis; then
23+ echo " ❌ Redis not running"
24+ echo " Start Redis: docker compose up -d"
25+ exit 1
26+ fi
27+ echo " ✅ Redis is running"
28+
29+ # Check if wrong mode is set
30+ if [ " ${AUTH_MODE:- integrated} " != " integrated" ]; then
31+ echo " ⚠️ AUTH_MODE is set to '${AUTH_MODE} ' but this script tests integrated mode"
32+ echo " Either run: AUTH_MODE=integrated $0 "
33+ echo " Or use: ./scripts/test-separate-e2e.sh"
34+ fi
35+
36+ # Check MCP server
37+ if ! curl -s -f " $MCP_SERVER /" > /dev/null; then
38+ echo " ❌ MCP server not running at $MCP_SERVER "
39+ echo " Required setup:"
40+ echo " 1. Start Redis: docker compose up -d"
41+ echo " 2. Start MCP server: npm run dev:integrated"
42+ echo " 3. Or set up environment:"
43+ echo " cp .env.integrated .env && npm run dev"
44+ exit 1
45+ fi
46+ echo " ✅ MCP server is running"
47+
48+ echo " 🔐 PHASE 1: OAuth Authentication"
49+ echo " ================================"
50+
51+ # OAuth flow (abbreviated for clarity)
52+ CLIENT_RESPONSE=$( curl -s -X POST -H " Content-Type: application/json" -d ' {"client_name":"e2e-fixed","redirect_uris":["http://localhost:3000/callback"]}' " $MCP_SERVER /register" )
53+ CLIENT_ID=$( echo " $CLIENT_RESPONSE " | jq -r .client_id)
54+ CLIENT_SECRET=$( echo " $CLIENT_RESPONSE " | jq -r .client_secret)
55+
56+ CODE_VERIFIER=$( openssl rand -base64 32 | tr -d " =+/" | cut -c1-43)
57+ CODE_CHALLENGE=$( echo -n " $CODE_VERIFIER " | openssl dgst -binary -sha256 | base64 | tr " +/" " -_" | tr -d " =" )
58+
59+ AUTH_PAGE=$( curl -s " $MCP_SERVER /authorize?response_type=code&client_id=$CLIENT_ID &redirect_uri=http://localhost:3000/callback&code_challenge=$CODE_CHALLENGE &code_challenge_method=S256&state=e2e-state" )
60+ AUTH_CODE=$( echo " $AUTH_PAGE " | grep -o ' state=[^"&]*' | cut -d= -f2)
61+
62+ curl -s " $MCP_SERVER /fakeupstreamauth/callback?state=$AUTH_CODE &code=fakecode&userId=$USER_ID " > /dev/null
63+
64+ TOKEN_RESPONSE=$( curl -s -X POST -H " Content-Type: application/x-www-form-urlencoded" -d " grant_type=authorization_code&client_id=$CLIENT_ID &client_secret=$CLIENT_SECRET &code=$AUTH_CODE &redirect_uri=http://localhost:3000/callback&code_verifier=$CODE_VERIFIER " " $MCP_SERVER /token" )
65+
66+ ACCESS_TOKEN=$( echo " $TOKEN_RESPONSE " | jq -r .access_token)
67+ echo " ✅ OAuth complete, token: ${ACCESS_TOKEN: 0: 15} ..."
68+
69+ echo " "
70+ echo " 🧪 PHASE 2: MCP Feature Testing"
71+ echo " ==============================="
72+
73+ # Step 1: Initialize MCP session (no session ID header)
74+ echo " "
75+ echo " 📱 Step 1: Initialize MCP session"
76+ INIT_RESPONSE=$( curl -i -s -H " Authorization: Bearer $ACCESS_TOKEN " \
77+ -H " Accept: application/json, text/event-stream" \
78+ -X POST -H " Content-Type: application/json" \
79+ -d ' {"jsonrpc":"2.0","id":"init","method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"e2e-test","version":"1.0"}}}' \
80+ " $MCP_SERVER /mcp" )
81+
82+ # Extract session ID from response header
83+ SESSION_ID=$( echo " $INIT_RESPONSE " | grep -i " mcp-session-id:" | cut -d' ' -f2 | tr -d ' \r' )
84+
85+ if [ -n " $SESSION_ID " ]; then
86+ echo " ✅ Session initialized: $SESSION_ID "
87+ else
88+ echo " ❌ No session ID in response headers"
89+ echo " Headers:"
90+ echo " $INIT_RESPONSE " | head -20
91+ exit 1
92+ fi
93+
94+ # Step 2: Test tools with session ID
95+ echo " "
96+ echo " 🔧 Step 2: Test Tools"
97+ TOOLS_RESPONSE=$( curl -s -H " Authorization: Bearer $ACCESS_TOKEN " \
98+ -H " Accept: application/json, text/event-stream" \
99+ -H " Mcp-Session-Id: $SESSION_ID " \
100+ -X POST -H " Content-Type: application/json" \
101+ -d ' {"jsonrpc":"2.0","id":"tools","method":"tools/list"}' \
102+ " $MCP_SERVER /mcp" )
103+
104+ if echo " $TOOLS_RESPONSE " | grep -q " event: message" ; then
105+ TOOLS_JSON=$( echo " $TOOLS_RESPONSE " | grep " ^data: " | sed ' s/^data: //' )
106+ TOOL_COUNT=$( echo " $TOOLS_JSON " | jq ' .result.tools | length' )
107+ echo " ✅ Tools: $TOOL_COUNT (README claims: 7)"
108+
109+ # Test echo tool
110+ ECHO_RESPONSE=$( curl -s -H " Authorization: Bearer $ACCESS_TOKEN " \
111+ -H " Accept: application/json, text/event-stream" \
112+ -H " Mcp-Session-Id: $SESSION_ID " \
113+ -X POST -H " Content-Type: application/json" \
114+ -d ' {"jsonrpc":"2.0","id":"echo","method":"tools/call","params":{"name":"echo","arguments":{"message":"E2E working!"}}}' \
115+ " $MCP_SERVER /mcp" )
116+
117+ if echo " $ECHO_RESPONSE " | grep -q " event: message" ; then
118+ ECHO_JSON=$( echo " $ECHO_RESPONSE " | grep " ^data: " | sed ' s/^data: //' )
119+ ECHO_RESULT=$( echo " $ECHO_JSON " | jq -r ' .result.content[0].text' )
120+ echo " 🔊 Echo test: '$ECHO_RESULT '"
121+ fi
122+ else
123+ echo " ❌ Tools test failed: $TOOLS_RESPONSE "
124+ fi
125+
126+ # Step 3: Test resources
127+ echo " "
128+ echo " 📚 Step 3: Test Resources (counting all pages)"
129+ TOTAL_RESOURCES=0
130+ CURSOR=" "
131+ PAGE=1
132+
133+ while true ; do
134+ if [ -n " $CURSOR " ]; then
135+ PARAMS=" {\" cursor\" :\" $CURSOR \" }"
136+ else
137+ PARAMS=" {}"
138+ fi
139+
140+ RESOURCES_RESPONSE=$( curl -s -H " Authorization: Bearer $ACCESS_TOKEN " \
141+ -H " Accept: application/json, text/event-stream" \
142+ -H " Mcp-Session-Id: $SESSION_ID " \
143+ -X POST -H " Content-Type: application/json" \
144+ -d " {\" jsonrpc\" :\" 2.0\" ,\" id\" :\" resources$PAGE \" ,\" method\" :\" resources/list\" ,\" params\" :$PARAMS }" \
145+ " $MCP_SERVER /mcp" )
146+
147+ if echo " $RESOURCES_RESPONSE " | grep -q " event: message" ; then
148+ RESOURCES_JSON=$( echo " $RESOURCES_RESPONSE " | grep " ^data: " | sed ' s/^data: //' )
149+ PAGE_COUNT=$( echo " $RESOURCES_JSON " | jq ' .result.resources | length' )
150+ NEXT_CURSOR=$( echo " $RESOURCES_JSON " | jq -r ' .result.nextCursor // empty' )
151+
152+ TOTAL_RESOURCES=$(( TOTAL_RESOURCES + PAGE_COUNT))
153+ echo " 📄 Page $PAGE : $PAGE_COUNT resources (total: $TOTAL_RESOURCES )"
154+
155+ if [ -z " $NEXT_CURSOR " ]; then
156+ break
157+ fi
158+ CURSOR=" $NEXT_CURSOR "
159+ PAGE=$(( PAGE + 1 ))
160+ else
161+ echo " ❌ Resources page $PAGE failed: $RESOURCES_RESPONSE "
162+ break
163+ fi
164+ done
165+
166+ RESOURCE_COUNT=$TOTAL_RESOURCES
167+ echo " 📊 Total Resources: $RESOURCE_COUNT (README claims: 100)"
168+
169+ # Step 4: Test prompts
170+ echo " "
171+ echo " 💭 Step 4: Test Prompts"
172+ PROMPTS_RESPONSE=$( curl -s -H " Authorization: Bearer $ACCESS_TOKEN " \
173+ -H " Accept: application/json, text/event-stream" \
174+ -H " Mcp-Session-Id: $SESSION_ID " \
175+ -X POST -H " Content-Type: application/json" \
176+ -d ' {"jsonrpc":"2.0","id":"prompts","method":"prompts/list"}' \
177+ " $MCP_SERVER /mcp" )
178+
179+ if echo " $PROMPTS_RESPONSE " | grep -q " event: message" ; then
180+ PROMPTS_JSON=$( echo " $PROMPTS_RESPONSE " | grep " ^data: " | sed ' s/^data: //' )
181+ PROMPT_COUNT=$( echo " $PROMPTS_JSON " | jq ' .result.prompts | length' )
182+ echo " 💬 Prompts: $PROMPT_COUNT "
183+ else
184+ echo " ❌ Prompts test failed: $PROMPTS_RESPONSE "
185+ fi
186+
187+ echo " "
188+ echo " 🎉 INTEGRATED MODE E2E TEST COMPLETE!"
189+ echo " ====================================="
190+ echo " 📊 Verification Results:"
191+ echo " Tools: $TOOL_COUNT (README: 7) $( [ " $TOOL_COUNT " = " 7" ] && echo " ✅" || echo " ❌" ) "
192+ echo " Resources: $RESOURCE_COUNT (README: 100) $( [ " $RESOURCE_COUNT " = " 100" ] && echo " ✅" || echo " ❌" ) "
193+ echo " Prompts: $PROMPT_COUNT "
194+ echo " OAuth flow: ✅ Working"
195+ echo " MCP features: ✅ Working"
0 commit comments