Skip to content

Commit 5d38e4b

Browse files
committed
chore(examples): harden multiprotocol client/script flows
Make api_key and mutual_tls runs non-interactive with clear PASS/FAIL, add oauth_dpop mode wiring, and allow forcing mutual_tls protocol injection for placeholder coverage.
1 parent 571edfe commit 5d38e4b

3 files changed

Lines changed: 73 additions & 24 deletions

File tree

examples/clients/simple-auth-multiprotocol-client/mcp_simple_auth_multiprotocol_client/main.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,10 +233,16 @@ async def redirect_handler(url: str) -> None:
233233
protocols.append(oauth_protocol)
234234
print(f"OAuth protocol enabled (DPoP: {self.dpop_enabled})")
235235

236-
# Always add API Key and mTLS as fallback
237-
api_key = os.getenv("MCP_API_KEY", "demo-api-key-12345")
238-
protocols.append(ApiKeyProtocol(api_key=api_key))
239-
protocols.append(MutualTlsPlaceholderProtocol())
236+
# Add non-OAuth protocols. Allow forcing protocol injection for integration tests.
237+
forced = os.getenv("MCP_AUTH_PROTOCOL", os.getenv("MCP_PHASE2_PROTOCOL", "")).strip().lower()
238+
if forced in ("mutual_tls", "mtls"):
239+
# Force mTLS placeholder to be selectable (do not inject API key fallback).
240+
protocols.append(MutualTlsPlaceholderProtocol())
241+
else:
242+
# Default: API key (from env) plus mTLS placeholder as fallback.
243+
api_key = os.getenv("MCP_API_KEY", "demo-api-key-12345")
244+
protocols.append(ApiKeyProtocol(api_key=api_key))
245+
protocols.append(MutualTlsPlaceholderProtocol())
240246

241247
try:
242248
# Create http_client first, then pass it to auth provider

examples/clients/simple-auth-multiprotocol-client/run_dpop_test.sh

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,27 @@ echo "Running Automated DPoP Tests"
115115
echo "============================================================"
116116
echo ""
117117

118-
# Test B2: API Key Authentication
119-
echo "[Test B2] API Key Authentication (DPoP should not affect)"
118+
# Test B2: API Key Authentication (curl)
119+
echo "[Test B2] API Key Authentication via curl (DPoP should not affect)"
120120
STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X POST "$MCP_ENDPOINT" \
121121
-H "Content-Type: application/json" \
122122
-H "Accept: application/json, text/event-stream" \
123123
-H "X-API-Key: $API_KEY" \
124124
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"dpop-test","version":"1.0"}}}')
125125
run_test "API Key auth works with DPoP enabled" "200" "$STATUS"
126126

127+
# Test B3: API Key Authentication via MultiProtocolAuth client
128+
echo "[Test B3] API Key Authentication via MultiProtocolAuth client"
129+
cd "$MULTIPROTOCOL_CLIENT"
130+
if printf "list\ncall get_time {}\nquit\n" | MCP_SERVER_URL="$MCP_ENDPOINT" MCP_API_KEY="$API_KEY" MCP_AUTH_PROTOCOL="api_key" uv run mcp-simple-auth-multiprotocol-client >/dev/null 2>&1; then
131+
echo " PASS: simple-auth-multiprotocol-client (API Key via MultiProtocolAuth)"
132+
PASSED=$((PASSED + 1))
133+
else
134+
echo " FAIL: simple-auth-multiprotocol-client (API Key via MultiProtocolAuth)"
135+
FAILED=$((FAILED + 1))
136+
fi
137+
cd "$REPO_ROOT"
138+
127139
# Test: No Authentication
128140
echo "[Test] No Authentication (expect 401)"
129141
STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X POST "$MCP_ENDPOINT" \

examples/clients/simple-auth-multiprotocol-client/run_multiprotocol_test.sh

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
11
#!/usr/bin/env bash
2-
# Multi-protocol integration test: start simple-auth-multiprotocol RS (and optionally AS for OAuth),
3-
# then run client with API Key, OAuth, or Mutual TLS (placeholder).
4-
# This test is for testing multi-protocol support with API Key, OAuth, or Mutual TLS.
2+
# Multi-protocol integration test (MultiProtocolAuthProvider):
3+
# start simple-auth-multiprotocol RS (and optionally AS for OAuth),
4+
# then run simple-auth-multiprotocol-client with API Key, OAuth, OAuth+DPoP, or Mutual TLS (placeholder).
55
# Usage: in the repo root, run: ./examples/clients/simple-auth-multiprotocol-client/run_multiprotocol_test.sh
6-
# Env: MCP_PHASE2_PROTOCOL=api_key (default) | oauth | mutual_tls (client will show "not implemented" for mTLS).
7-
# For api_key/mutual_tls: simple-auth-multiprotocol-client; for oauth: simple-auth-client (complete OAuth in browser).
8-
# You must run at mcp> prompt: list, call get_time {}, quit.
6+
# Env: MCP_AUTH_PROTOCOL=api_key (default) | oauth | oauth_dpop | mutual_tls
7+
# For api_key/mutual_tls: script runs non-interactive commands (list/call/quit) and asserts PASS/FAIL.
8+
# For oauth/oauth_dpop: complete OAuth in browser, then run: list, call get_time {}, quit.
9+
# Optional: MCP_SKIP_OAUTH=1 to skip oauth/oauth_dpop manual cases.
910

1011
set -e
1112

1213
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)"
1314
SIMPLE_AUTH_SERVER="${REPO_ROOT}/examples/servers/simple-auth"
1415
MULTIPROTOCOL_SERVER="${REPO_ROOT}/examples/servers/simple-auth-multiprotocol"
1516
MULTIPROTOCOL_CLIENT="${REPO_ROOT}/examples/clients/simple-auth-multiprotocol-client"
16-
SIMPLE_AUTH_CLIENT="${REPO_ROOT}/examples/clients/simple-auth-client"
1717
RS_PORT="${MCP_RS_PORT:-8002}"
1818
AS_PORT="${MCP_AS_PORT:-9000}"
19-
PROTOCOL="${MCP_PHASE2_PROTOCOL:-api_key}"
19+
PROTOCOL="${MCP_AUTH_PROTOCOL:-api_key}"
20+
SKIP_OAUTH="${MCP_SKIP_OAUTH:-0}"
2021

2122
cd "$REPO_ROOT"
2223
echo "Repo root: $REPO_ROOT"
2324
echo "Protocol: $PROTOCOL"
25+
echo "Skip OAuth: $SKIP_OAUTH"
2426

2527
uv sync --quiet 2>/dev/null || true
2628

@@ -49,7 +51,7 @@ cleanup() {
4951
trap cleanup EXIT
5052

5153
# Start Authorization Server only for OAuth
52-
if [ "$PROTOCOL" = "oauth" ]; then
54+
if [ "$PROTOCOL" = "oauth" ] || [ "$PROTOCOL" = "oauth_dpop" ]; then
5355
cd "$SIMPLE_AUTH_SERVER"
5456
uv run mcp-simple-auth-as --port="$AS_PORT" &
5557
AS_PID=$!
@@ -61,6 +63,8 @@ fi
6163
cd "$MULTIPROTOCOL_SERVER"
6264
if [ "$PROTOCOL" = "oauth" ]; then
6365
uv run mcp-simple-auth-multiprotocol-rs --port="$RS_PORT" --auth-server="http://localhost:${AS_PORT}" --api-keys="demo-api-key-12345" &
66+
elif [ "$PROTOCOL" = "oauth_dpop" ]; then
67+
uv run mcp-simple-auth-multiprotocol-rs --port="$RS_PORT" --auth-server="http://localhost:${AS_PORT}" --api-keys="demo-api-key-12345" --dpop-enabled &
6468
else
6569
uv run mcp-simple-auth-multiprotocol-rs --port="$RS_PORT" --api-keys="demo-api-key-12345" &
6670
fi
@@ -76,20 +80,47 @@ echo ""
7680
echo ""
7781

7882
# Run client by protocol
79-
if [ "$PROTOCOL" = "oauth" ]; then
80-
echo "Starting simple-auth-client (OAuth). Complete OAuth in the browser, then run: list, call get_time {}, quit"
83+
if [ "$PROTOCOL" = "oauth" ] || [ "$PROTOCOL" = "oauth_dpop" ]; then
84+
if [ "$SKIP_OAUTH" = "1" ]; then
85+
echo "Skipping OAuth manual test (MCP_SKIP_OAUTH=1)"
86+
exit 0
87+
fi
88+
echo "Starting simple-auth-multiprotocol-client (OAuth). Complete OAuth in the browser, then run: list, call get_time {}, quit"
8189
echo ""
82-
cd "$SIMPLE_AUTH_CLIENT"
83-
MCP_SERVER_PORT="$RS_PORT" MCP_TRANSPORT_TYPE=streamable-http uv run mcp-simple-auth-client
90+
cd "$MULTIPROTOCOL_CLIENT"
91+
MCP_SERVER_URL="http://localhost:${RS_PORT}/mcp" \
92+
MCP_USE_OAUTH=1 \
93+
MCP_DPOP_ENABLED=$([ "$PROTOCOL" = "oauth_dpop" ] && echo 1 || echo 0) \
94+
MCP_AUTH_PROTOCOL="$PROTOCOL" \
95+
uv run mcp-simple-auth-multiprotocol-client
8496
elif [ "$PROTOCOL" = "mutual_tls" ]; then
85-
echo "Starting simple-auth-multiprotocol-client (mTLS placeholder). At mcp> run: list, call get_time {}, quit"
97+
echo "Running mTLS placeholder selection (expect not implemented)"
8698
echo ""
8799
cd "$MULTIPROTOCOL_CLIENT"
88-
unset MCP_API_KEY
89-
MCP_SERVER_URL="http://localhost:${RS_PORT}/mcp" uv run mcp-simple-auth-multiprotocol-client
100+
set +e
101+
OUT=$(MCP_SERVER_URL="http://localhost:${RS_PORT}/mcp" MCP_AUTH_PROTOCOL="mutual_tls" uv run mcp-simple-auth-multiprotocol-client 2>&1)
102+
CODE=$?
103+
set -e
104+
echo "$OUT" | head -60
105+
if echo "$OUT" | grep -q "Mutual TLS not implemented"; then
106+
echo "PASS: mutual_tls placeholder reported not implemented"
107+
exit 0
108+
fi
109+
echo "FAIL: mutual_tls placeholder did not report expected error (exit=$CODE)"
110+
exit 1
90111
else
91-
echo "Starting simple-auth-multiprotocol-client (API Key). At mcp> run: list, call get_time {}, quit"
112+
echo "Running API Key flow (non-interactive): list, call get_time {}, quit"
92113
echo ""
93114
cd "$MULTIPROTOCOL_CLIENT"
94-
MCP_SERVER_URL="http://localhost:${RS_PORT}/mcp" MCP_API_KEY="demo-api-key-12345" uv run mcp-simple-auth-multiprotocol-client
115+
set +e
116+
OUT=$(printf "list\ncall get_time {}\nquit\n" | MCP_SERVER_URL="http://localhost:${RS_PORT}/mcp" MCP_API_KEY="demo-api-key-12345" MCP_AUTH_PROTOCOL="api_key" uv run mcp-simple-auth-multiprotocol-client 2>&1)
117+
CODE=$?
118+
set -e
119+
echo "$OUT" | head -80
120+
if [ "$CODE" -eq 0 ] && echo "$OUT" | grep -q "Session initialized" && ! echo "$OUT" | grep -q "Session terminated"; then
121+
echo "PASS: api_key flow succeeded"
122+
exit 0
123+
fi
124+
echo "FAIL: api_key flow failed (exit=$CODE)"
125+
exit 1
95126
fi

0 commit comments

Comments
 (0)