Skip to content

Commit f525ddc

Browse files
committed
testing tools
1 parent a26caa1 commit f525ddc

25 files changed

+13459
-6
lines changed

src/garth_mcp_server/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ def get_spo2_data(date: str) -> ConnectAPIResponse:
267267
Get SpO2 (blood oxygen) data from Garmin Connect.
268268
date: Date for SpO2 data (YYYY-MM-DD format)
269269
"""
270-
return garth.connectapi(f"wellness-service/wellness/dailyPulseOx/{date}")
270+
return garth.connectapi(f"wellness-service/wellness/daily/spo2acclimation/{date}")
271271

272272

273273
@server.tool()

tests/cassettes/test_activity_related_tools.yaml

Lines changed: 1582 additions & 0 deletions
Large diffs are not rendered by default.

tests/cassettes/test_daily_body_battery.yaml

Lines changed: 398 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
interactions:
2+
- request:
3+
body: mfa_token=SANITIZED
4+
headers:
5+
Accept:
6+
- !!binary |
7+
Ki8q
8+
Accept-Encoding:
9+
- !!binary |
10+
Z3ppcCwgZGVmbGF0ZQ==
11+
Authorization:
12+
- Bearer SANITIZED
13+
Connection:
14+
- !!binary |
15+
a2VlcC1hbGl2ZQ==
16+
Content-Length:
17+
- '74'
18+
Content-Type:
19+
- !!binary |
20+
YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVk
21+
User-Agent:
22+
- !!binary |
23+
Y29tLmdhcm1pbi5hbmRyb2lkLmFwcHMuY29ubmVjdG1vYmlsZQ==
24+
method: POST
25+
uri: https://connectapi.garmin.com/oauth-service/oauth/exchange/user/2.0
26+
response:
27+
body:
28+
string: '{"scope": "GARMINPAY_WRITE ATP_READ GHS_SAMD INSIGHTS_READ CIQ_APPSTORE_SERVICES_CREATE
29+
COMMUNITY_COURSE_WRITE GCOFFER_WRITE DT_CLIENT_ANALYTICS_WRITE CIQ_APPSTORE_SERVICES_DELETE
30+
OMT_SUBSCRIPTION_READ CONNECT_READ COMMUNITY_COURSE_READ GOLF_API_READ GHS_UPLOAD
31+
DIVE_API_READ CIQ_APPSTORE_SERVICES_READ CIQ_APPSTORE_SERVICES_UPDATE CONNECT_WRITE
32+
CONNECT_MCT_DAILY_LOG_READ DI_OAUTH_2_AUTHORIZATION_CODE_CREATE GARMINPAY_READ
33+
GOLF_API_WRITE INSIGHTS_WRITE PRODUCT_SEARCH_READ OMT_CAMPAIGN_READ GCOFFER_READ
34+
ATP_WRITE", "jti": "SANITIZED", "access_token": "SANITIZED", "token_type":
35+
"bearer", "refresh_token": "SANITIZED", "expires_in": 107726, "refresh_token_expires_in":
36+
2591999}'
37+
headers:
38+
CF-RAY:
39+
- 99675e79c8f8154d-QRO
40+
Cache-Control:
41+
- no-cache, no-store, private
42+
Connection:
43+
- keep-alive
44+
Content-Type:
45+
- application/json
46+
Date:
47+
- Thu, 30 Oct 2025 02:09:10 GMT
48+
NEL:
49+
- '{"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}'
50+
Report-To:
51+
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=VhuKXgNYIeFeZAhB80AbPsH57Rb6%2BS7%2BVTM3MmnPu3M%2BM1wzfsatS2xS6u1WBJ8sK62lLBcaxipqehOSp4d4jNDM588bWAK1gFhQ3pHw7oMHAFxTWztwOl5LdKD4rcs7P%2FFqdRqmA%2BOm7JFfA5FtOomOOQ%3D%3D"}],"group":"cf-nel","max_age":604800}'
52+
Server:
53+
- cloudflare
54+
Set-Cookie:
55+
- _cfuvid=SANITIZED; path=SANITIZED; domain=SANITIZED; HttpOnly; Secure; SameSite=SANITIZED
56+
Transfer-Encoding:
57+
- chunked
58+
alt-svc:
59+
- h3=":443"; ma=86400
60+
cf-cache-status:
61+
- DYNAMIC
62+
pragma:
63+
- no-cache
64+
status:
65+
code: 200
66+
message: OK
67+
- request:
68+
body: null
69+
headers:
70+
Accept:
71+
- '*/*'
72+
Accept-Encoding:
73+
- gzip, deflate
74+
Authorization:
75+
- Bearer SANITIZED
76+
Connection:
77+
- keep-alive
78+
Cookie:
79+
- _cfuvid=SANITIZED
80+
User-Agent:
81+
- GCM-iOS-5.7.2.1
82+
method: GET
83+
uri: https://connectapi.garmin.com/hrv-service/hrv/daily/2025-10-29/2025-10-29
84+
response:
85+
body:
86+
string: '{"hrvSummaries": [{"calendarDate": "2025-10-29", "weeklyAvg": 43, "lastNightAvg":
87+
47, "lastNight5MinHigh": 76, "baseline": {"lowUpper": 39, "balancedLow": 41,
88+
"balancedUpper": 52, "markerValue": 0.3408966}, "status": "BALANCED", "feedbackPhrase":
89+
"HRV_BALANCED_7", "createTimeStamp": "2025-10-29T13:37:39.967"}], "userProfilePk":
90+
2591602}'
91+
headers:
92+
CF-RAY:
93+
- 99675e7c88ce34d1-QRO
94+
Cache-Control:
95+
- no-cache, no-store, private
96+
Connection:
97+
- keep-alive
98+
Content-Type:
99+
- application/json
100+
Date:
101+
- Thu, 30 Oct 2025 02:09:11 GMT
102+
NEL:
103+
- '{"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}'
104+
Report-To:
105+
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=x1Egr11ALlPFHfkDxvSTF3OHHuzAu4cyPRsToS%2BPnAcTgEmdKuj8lz0jim%2BP3GAMSmeXkkJNXc%2FE85bmLada5qr6bQ3izr6WqMqKjCn5sVDa9lR1HrvSBAwwOi%2FgPuauqjrP8NB%2BrKFhKdEcDJwMo%2FQjvQ%3D%3D"}],"group":"cf-nel","max_age":604800}'
106+
Server:
107+
- cloudflare
108+
Transfer-Encoding:
109+
- chunked
110+
alt-svc:
111+
- h3=":443"; ma=86400
112+
cf-cache-status:
113+
- DYNAMIC
114+
pragma:
115+
- no-cache
116+
status:
117+
code: 200
118+
message: OK
119+
version: 1
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
interactions:
2+
- request:
3+
body: mfa_token=SANITIZED
4+
headers:
5+
Accept:
6+
- !!binary |
7+
Ki8q
8+
Accept-Encoding:
9+
- !!binary |
10+
Z3ppcCwgZGVmbGF0ZQ==
11+
Authorization:
12+
- Bearer SANITIZED
13+
Connection:
14+
- !!binary |
15+
a2VlcC1hbGl2ZQ==
16+
Content-Length:
17+
- '74'
18+
Content-Type:
19+
- !!binary |
20+
YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVk
21+
User-Agent:
22+
- !!binary |
23+
Y29tLmdhcm1pbi5hbmRyb2lkLmFwcHMuY29ubmVjdG1vYmlsZQ==
24+
method: POST
25+
uri: https://connectapi.garmin.com/oauth-service/oauth/exchange/user/2.0
26+
response:
27+
body:
28+
string: '{"scope": "GARMINPAY_WRITE ATP_READ GHS_SAMD INSIGHTS_READ CIQ_APPSTORE_SERVICES_CREATE
29+
COMMUNITY_COURSE_WRITE GCOFFER_WRITE DT_CLIENT_ANALYTICS_WRITE CIQ_APPSTORE_SERVICES_DELETE
30+
OMT_SUBSCRIPTION_READ CONNECT_READ COMMUNITY_COURSE_READ GOLF_API_READ GHS_UPLOAD
31+
DIVE_API_READ CIQ_APPSTORE_SERVICES_READ CIQ_APPSTORE_SERVICES_UPDATE CONNECT_WRITE
32+
CONNECT_MCT_DAILY_LOG_READ DI_OAUTH_2_AUTHORIZATION_CODE_CREATE GARMINPAY_READ
33+
GOLF_API_WRITE INSIGHTS_WRITE PRODUCT_SEARCH_READ OMT_CAMPAIGN_READ GCOFFER_READ
34+
ATP_WRITE", "jti": "SANITIZED", "access_token": "SANITIZED", "token_type":
35+
"bearer", "refresh_token": "SANITIZED", "expires_in": 93121, "refresh_token_expires_in":
36+
2591999}'
37+
headers:
38+
CF-RAY:
39+
- 99675e6aaa6569dc-DFW
40+
Cache-Control:
41+
- no-cache, no-store, private
42+
Connection:
43+
- keep-alive
44+
Content-Type:
45+
- application/json
46+
Date:
47+
- Thu, 30 Oct 2025 02:09:08 GMT
48+
NEL:
49+
- '{"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}'
50+
Report-To:
51+
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=hnh2gIl7YRPO1P39mW9a0cMcn4T5szLoJhNQ9Uglp4CQJzil4Vsop5tckZv6Q%2F3QOcjfY5E%2BEHkfq9sYewtkBvYUoHc%2BYoSyAEcWfMkofo0PNk68OcQUPHtsjZOKAfcoXaxT0LNbA1h%2BUkyEreL8uHH0Kw%3D%3D"}],"group":"cf-nel","max_age":604800}'
52+
Server:
53+
- cloudflare
54+
Set-Cookie:
55+
- _cfuvid=SANITIZED; path=SANITIZED; domain=SANITIZED; HttpOnly; Secure; SameSite=SANITIZED
56+
Transfer-Encoding:
57+
- chunked
58+
alt-svc:
59+
- h3=":443"; ma=86400
60+
cf-cache-status:
61+
- DYNAMIC
62+
pragma:
63+
- no-cache
64+
status:
65+
code: 200
66+
message: OK
67+
- request:
68+
body: null
69+
headers:
70+
Accept:
71+
- '*/*'
72+
Accept-Encoding:
73+
- gzip, deflate
74+
Authorization:
75+
- Bearer SANITIZED
76+
Connection:
77+
- keep-alive
78+
Cookie:
79+
- _cfuvid=SANITIZED
80+
User-Agent:
81+
- GCM-iOS-5.7.2.1
82+
method: GET
83+
uri: https://connectapi.garmin.com/usersummary-service/stats/hydration/daily/2025-10-02/2025-10-29
84+
response:
85+
body:
86+
string: '[]'
87+
headers:
88+
CF-RAY:
89+
- 99675e6e9d65f07a-DFW
90+
Cache-Control:
91+
- no-cache, no-store, private
92+
Connection:
93+
- keep-alive
94+
Content-Length:
95+
- '2'
96+
Content-Type:
97+
- application/json
98+
Date:
99+
- Thu, 30 Oct 2025 02:09:08 GMT
100+
NEL:
101+
- '{"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}'
102+
Report-To:
103+
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=EyvC8DfGZUlq3Ky8INM9F%2FaJOHV94GK1FllgvIRnGllCvnl5HPNTMz%2BQcOMtzoAl0%2FOVactCJof%2BJTUkhihXmXGCe0uNi6LgYAWPyzBa3x0C2CuRHAMd9eD1PJrkKcFJNtdpu%2FHdvvL6pwT%2FMemxLtDNxw%3D%3D"}],"group":"cf-nel","max_age":604800}'
104+
Server:
105+
- cloudflare
106+
alt-svc:
107+
- h3=":443"; ma=86400
108+
cf-cache-status:
109+
- DYNAMIC
110+
pragma:
111+
- no-cache
112+
status:
113+
code: 200
114+
message: OK
115+
version: 1
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
interactions:
2+
- request:
3+
body: mfa_token=SANITIZED
4+
headers:
5+
Accept:
6+
- !!binary |
7+
Ki8q
8+
Accept-Encoding:
9+
- !!binary |
10+
Z3ppcCwgZGVmbGF0ZQ==
11+
Authorization:
12+
- Bearer SANITIZED
13+
Connection:
14+
- !!binary |
15+
a2VlcC1hbGl2ZQ==
16+
Content-Length:
17+
- '74'
18+
Content-Type:
19+
- !!binary |
20+
YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVk
21+
User-Agent:
22+
- !!binary |
23+
Y29tLmdhcm1pbi5hbmRyb2lkLmFwcHMuY29ubmVjdG1vYmlsZQ==
24+
method: POST
25+
uri: https://connectapi.garmin.com/oauth-service/oauth/exchange/user/2.0
26+
response:
27+
body:
28+
string: '{"scope": "GARMINPAY_WRITE ATP_READ GHS_SAMD INSIGHTS_READ CIQ_APPSTORE_SERVICES_CREATE
29+
COMMUNITY_COURSE_WRITE GCOFFER_WRITE DT_CLIENT_ANALYTICS_WRITE CIQ_APPSTORE_SERVICES_DELETE
30+
OMT_SUBSCRIPTION_READ CONNECT_READ COMMUNITY_COURSE_READ GOLF_API_READ GHS_UPLOAD
31+
DIVE_API_READ CIQ_APPSTORE_SERVICES_READ CIQ_APPSTORE_SERVICES_UPDATE CONNECT_WRITE
32+
CONNECT_MCT_DAILY_LOG_READ DI_OAUTH_2_AUTHORIZATION_CODE_CREATE GARMINPAY_READ
33+
GOLF_API_WRITE INSIGHTS_WRITE PRODUCT_SEARCH_READ OMT_CAMPAIGN_READ GCOFFER_READ
34+
ATP_WRITE", "jti": "SANITIZED", "access_token": "SANITIZED", "token_type":
35+
"bearer", "refresh_token": "SANITIZED", "expires_in": 71323, "refresh_token_expires_in":
36+
2591999}'
37+
headers:
38+
CF-RAY:
39+
- 99675ea6bfa8537f-DEN
40+
Cache-Control:
41+
- no-cache, no-store, private
42+
Connection:
43+
- keep-alive
44+
Content-Type:
45+
- application/json
46+
Date:
47+
- Thu, 30 Oct 2025 02:09:18 GMT
48+
NEL:
49+
- '{"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}'
50+
Report-To:
51+
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=IJ4j2P4QpXAUUwzCfJ7SkTx3gP7W9hhOakjJWjwk%2B5KP3RqcWKCCh%2BteMyNvCLA8j5CiqJ%2BKwkwEy2pWL4%2BihfddNgw3NZIuOdF4QFmeV9vJRmCIpZPn9kGAqh8sb0wUUq2JfRjiNfjAGR3lDUJ58klAhw%3D%3D"}],"group":"cf-nel","max_age":604800}'
52+
Server:
53+
- cloudflare
54+
Set-Cookie:
55+
- _cfuvid=SANITIZED; path=SANITIZED; domain=SANITIZED; HttpOnly; Secure; SameSite=SANITIZED
56+
Transfer-Encoding:
57+
- chunked
58+
alt-svc:
59+
- h3=":443"; ma=86400
60+
cf-cache-status:
61+
- DYNAMIC
62+
pragma:
63+
- no-cache
64+
status:
65+
code: 200
66+
message: OK
67+
- request:
68+
body: null
69+
headers:
70+
Accept:
71+
- '*/*'
72+
Accept-Encoding:
73+
- gzip, deflate
74+
Authorization:
75+
- Bearer SANITIZED
76+
Connection:
77+
- keep-alive
78+
Cookie:
79+
- _cfuvid=SANITIZED
80+
User-Agent:
81+
- GCM-iOS-5.7.2.1
82+
method: GET
83+
uri: https://connectapi.garmin.com/usersummary-service/stats/im/daily/2025-10-29/2025-10-29
84+
response:
85+
body:
86+
string: '[{"calendarDate": "2025-10-29", "weeklyGoal": 150, "moderateValue":
87+
0, "vigorousValue": 0}]'
88+
headers:
89+
CF-RAY:
90+
- 99675eaa6e27e663-DEN
91+
Cache-Control:
92+
- no-cache, no-store, private
93+
Connection:
94+
- keep-alive
95+
Content-Type:
96+
- application/json
97+
Date:
98+
- Thu, 30 Oct 2025 02:09:18 GMT
99+
NEL:
100+
- '{"success_fraction":0.01,"report_to":"cf-nel","max_age":604800}'
101+
Report-To:
102+
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=8ZOFlbjIzE98HLMEVMC24IIYQueL%2BzXRSK0Xhh3Wio4NmCaAy8AmIqHJJgRB5545B9M2xpoFMRw5W37xBOh7U%2Bp%2BvoGQCxl3r49ump9eK9fXGW95Q2crORwi4VD2UGg5rkH%2BMpUIkJtXgt2usGd%2Bd4jd5w%3D%3D"}],"group":"cf-nel","max_age":604800}'
103+
Server:
104+
- cloudflare
105+
Transfer-Encoding:
106+
- chunked
107+
alt-svc:
108+
- h3=":443"; ma=86400
109+
cf-cache-status:
110+
- DYNAMIC
111+
pragma:
112+
- no-cache
113+
status:
114+
code: 200
115+
message: OK
116+
version: 1

0 commit comments

Comments
 (0)