T09 · Insecure Skill Coding Practices
- Location
mcp/main.go:12- Finding
API Key Can Be Transmitted to an Arbitrary Configured Server
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a coherent Transition coaching API wrapper, but it has under-disclosed credential and data-routing risks that users should review before installing.
Install only if you trust Transition with your workout history, profile, performance metrics, coach-chat messages, and any health-related details you provide. Keep TRANSITION_API_KEY private, avoid setting TRANSITION_API_URL unless you are intentionally using a trusted endpoint, and explicitly approve plan changes or third-party pushes such as Garmin before running them.
mcp/main.go:12API Key Can Be Transmitted to an Arbitrary Configured Server
mcp/client.go:21Custom Authentication Header May Be Forwarded Across Redirects
mcp/client.go:47Unbounded API and SSE Response Buffering Enables Memory Exhaustion
mcp/tools.go:117Workout Generator Constructs Query Strings Without Input Validation or Encoding
The declared description promises an AI coaching capability focused on personalized workouts, training plans, and performance analytics for endurance sports. The supplied code does not implement any of that domain logic. Instead, it is a reusable network client that sends HTTP requests to a configurable base URL, optionally authenticates with an X-API-Key header, and reads standard JSON or SSE responses. This is a materially different primary purpose from multisport coaching. While API access could be a supporting detail if the surrounding code clearly implemented coaching features, this chunk itself only exposes generic transport functionality and accesses an external service not described in the skill purpose. Therefore, the description does not accurately represent the actual behavior shown.
The declared purpose is a multisport coaching assistant focused on workouts, training plans, and performance analytics. The supplied code instead sets up an MCP server connected to a 'Transition' API using environment-provided credentials and URL. There is no visible logic related to running, cycling, swimming, triathlon, coaching, analytics, or athlete personalization. While this is only a bootstrap file, the observable primary purpose is infrastructure for a Transition service, which does not accurately represent the declared coaching functionality.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Try it right now — no API key needed:
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
For personalized features (your training plan, performance data, AI coach), you need a Transition account + API key. See Getting an API Key below.
The README encourages users to access personalized workouts, performance data, and AI coaching through a remote service but does not clearly warn that sensitive health, training, and performance information will be transmitted to a third-party API. In a coaching skill context, this omission matters because users may share injury details, schedules, and athlete metrics without understanding the privacy implications.
The README advertises plan adaptation and AI coaching features without warning that these actions may modify recommendations derived from user data or trigger remote processing of athlete history and health-related context. This can mislead users into invoking impactful features without informed consent about data use or the consequences of automated coaching outputs.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Use the API from scripts, automations, or any HTTP client. See SKILL.md for complete endpoint documentation with curl examples.
# Get this week's workouts
The coach chat example encourages sending a health-related prompt ('My left knee hurts...') to a remote AI endpoint without warning that medical-adjacent or injury information will be transmitted off-device. In this skill context, that increases privacy and safety risk because users may disclose sensitive health information and over-rely on non-medical AI advice.
curl -X POST -H "X-API-Key: $TRANSITION_API_KEY"
-H "Content-Type: application/json"
-d '{"message": "My left knee hurts after long runs. Should I adjust my plan?"}'
"https://api.transition.fun/api/v1/coach/chat"
---
The skill documents use of environment-based secrets and shell/curl interactions with an external API but do not declare any explicit tool scope or permissions boundary. This increases the chance that an agent runtime grants broader capabilities than users expect, especially where API keys and outbound requests are involved.
The skill transmits sensitive training history, athlete profile information, and coach-chat content to an external service, but it does not prominently warn users about data sharing, retention, or privacy implications. In a coaching context, this data can reveal health, schedule, and behavioral information that users may not expect to leave the agent environment.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
Generate a random structured workout. Each request returns a different workout.
curl "https://api.transition.fun/api/v1/wod?sport=run&duration=45"
Parameters:
The Garmin push operation can modify or synchronize data with a third-party account, but the skill does not warn that this is an external side-effecting action. Users may unintentionally trigger changes in connected services if the agent performs this action without explicit confirmation.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
echo ""
echo "=== AI Coach Chat ==="
curl -s -X POST -H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{"message": "What should I focus on this week?"}' \
"$BASE/api/v1/coach/chat"
No suspicious patterns detected.