1.2kβ
by khj809
srt β OpenClaw Skill
srt is an OpenClaw Skills integration for coding workflows. Korean SRT (Super Rapid Train) search, reservation, and booking management
Skill Snapshot
| name | srt |
| description | Korean SRT (Super Rapid Train) search, reservation, and booking management OpenClaw Skills integration. |
| owner | khj809 |
| repository | khj809/srt |
| language | Markdown |
| license | MIT |
| topics | |
| security | L1 |
| install | openclaw add @khj809/srt |
| last updated | Feb 7, 2026 |
Maintainer

name: srt description: Korean SRT (Super Rapid Train) search, reservation, and booking management homepage: https://github.com/khj809/openclaw-srt-skill user-invocable: true metadata: { "openclaw": { "emoji": "π ", "requires": { "bins": ["python3", "uv"] }, "install": [ {"id": "uv", "kind": "uv", "package": "SRTrain", "label": "Install SRTrain (uv)"} ] }, }
SRT Korean Train Service Skill
OpenClaw skill for managing Korean SRT (Super Rapid Train) reservations with search, booking, view, and cancellation capabilities.
Features
- π Search trains between stations with real-time seat availability
- π« Make reservations with automatic rate limiting to protect your account
- π View bookings to see all active reservations
- ποΈ Cancel bookings with confirmation prompts
- π€ AI-friendly JSON output for programmatic access
- π‘οΈ Rate limiting to prevent account blocking (3s between reservations, 5s between searches)
- β οΈ Retry protection with maximum 10 attempts per session
Prerequisites
- Python 3.10+ installed
- SRT account with phone number and password
- OpenClaw installed and configured
Configuration
Set your SRT credentials as environment variables:
export SRT_PHONE="010-1234-5678"
export SRT_PASSWORD="your_password"
Add these to your shell profile (~/.zshrc, ~/.bashrc, etc.) for persistence.
Security Note: Avoid committing credentials to version control.
Important: Phone number must include hyphens in the format 010-XXXX-XXXX
Usage
User-Invocable Command
Use the /srt slash command in OpenClaw:
/srt search --departure "μμ" --arrival "λΆμ°" --date "20260217" --time "140000"
/srt reserve --train-id "1"
/srt reserve --retry --timeout-minutes 60
/srt reserve --retry --train-id "1,3,5" --timeout-minutes 60
/srt log -n 30
/srt list
/srt cancel --reservation-id "RES123456"
Natural Language (AI-Orchestrated)
The AI can invoke this skill based on user intent:
Examples:
- "2μ 17μΌμ μμμμ λΆμ° κ°λ κΈ°μ°¨ κ²μν΄μ€" (Search trains)
- "μ μΌ λΉ λ₯Έκ±Έλ‘ μμ½ν΄μ€" (Reserve first available)
- "λ΄ μμ½ νμΈν΄μ€" (List bookings)
- "λΆμ° μμ½ μ·¨μν΄μ€" (Cancel booking)
Direct CLI Usage
# Search trains
uv run --with SRTrain python3 scripts/srt_cli.py search \
--departure "μμ" \
--arrival "λΆμ°" \
--date "20260217" \
--time "140000" \
--passengers "adult=2"
# Make reservation (single attempt)
uv run --with SRTrain python3 scripts/srt_cli.py reserve --train-id "1"
# Make reservation with automatic retry - all trains (background mode recommended)
uv run --with SRTrain python3 scripts/srt_cli.py reserve --retry \
--timeout-minutes 60 \
--wait-seconds 10
# Make reservation with automatic retry - specific trains only
uv run --with SRTrain python3 scripts/srt_cli.py reserve --retry \
--train-id "1,3,5" \
--timeout-minutes 60 \
--wait-seconds 10
# Check reservation log
uv run --with SRTrain python3 scripts/srt_cli.py log -n 30
# View bookings
uv run --with SRTrain python3 scripts/srt_cli.py list --format json
# Cancel booking
uv run --with SRTrain python3 scripts/srt_cli.py cancel \
--reservation-id "RES123456" \
--confirm
Common Korean Station Names
Main SRT Stations:
- μμ (Suseo) - Seoul SRT station
- λΆμ° (Busan)
- λλꡬ (Dongdaegu) - Daegu
- λμ (Daejeon)
- μ²μμμ° (Cheonan-Asan)
- μ€μ‘ (Osong)
- κ΄μ£Όμ‘μ (Gwangju-Songjeong)
- μΈμ° (Ulsan)
- ν¬ν (Pohang)
- κ²½μ£Ό (Gyeongju)
- κΉμ²κ΅¬λ―Έ (Gimcheon-Gumi)
- μ΅μ° (Iksan)
- μ μ£Ό (Jeonju)
- λͺ©ν¬ (Mokpo)
- μ κ²½μ£Ό (Singyeongju)
Important: Station names MUST be in Korean (Hangul) for the SRT API to work correctly.
Date and Time Formats
- Date: YYYYMMDD (e.g.,
20260217for February 17, 2026) - Time: HHMMSS (e.g.,
140000for 2:00 PM,093000for 9:30 AM)
Tools for AI Agent
This skill provides 5 tools for managing SRT train reservations:
1. search_trains
Search for available trains between stations.
Usage:
uv run --with SRTrain python3 scripts/srt_cli.py search \
--departure "μμ" \
--arrival "λΆμ°" \
--date "20260217" \
--time "120000"
Returns: JSON array of available trains with seat availability
JSON Format:
{
"success": true,
"data": [
{
"train_id": "1",
"train_number": "301",
"train_name": "SRT301",
"departure_time": "120500",
"arrival_time": "143000",
"departure_station": "μμ",
"arrival_station": "λΆμ°",
"seat_available": true,
"general_seat": "μμ½κ°λ₯",
"special_seat": "μμ½κ°λ₯"
}
]
}
2. make_reservation
Reserve trains with optional automatic retry support.
Usage (single attempt):
uv run --with SRTrain python3 scripts/srt_cli.py reserve --train-id "1"
Usage (with retry):
# Try all trains
uv run --with SRTrain python3 scripts/srt_cli.py reserve --retry \
--timeout-minutes 60 \
--wait-seconds 10
# Try specific trains only
uv run --with SRTrain python3 scripts/srt_cli.py reserve --retry \
--train-id "1,3,5" \
--timeout-minutes 60 \
--wait-seconds 10
Options:
--train-id: Specific train(s) to reserve (comma-separated, e.g., "1" or "1,3,5"; omit to try all trains)--retry: Enable automatic retry on failure--timeout-minutes: Maximum retry duration in minutes (default: 60)--wait-seconds: Wait time between retry attempts in seconds (default: 10)
Behavior with --retry:
- Cycles through all available trains from search results
- Waits
--wait-secondsbetween attempts (plus rate-limiting delays) - Continues until success or timeout
- Logs progress to
~/.openclaw/tmp/srt/reserve.log
Returns: Reservation details with payment deadline
JSON Format:
{
"success": true,
"data": {
"reservation_id": "RES123456",
"journey_date": "20260217",
"journey_time": "120500",
"departure": "μμ",
"arrival": "λΆμ°",
"train_number": "301",
"seat_number": "3A",
"payment_required": true,
"attempts": 12
}
}
Note:
- Payment must be completed manually by user via SRT app/website
- For retry mode, run in background with exec tool and periodically check logs
3. view_bookings
List all current reservations.
Usage:
uv run --with SRTrain python3 scripts/srt_cli.py list --format json
Returns: JSON array of active reservations
JSON Format:
{
"success": true,
"data": [
{
"reservation_id": "RES123456",
"journey_date": "20260217",
"journey_time": "120500",
"departure": "μμ",
"arrival": "λΆμ°",
"train_number": "301",
"seat_number": "3A",
"payment_required": true
}
]
}
4. cancel_booking
Cancel a reservation by ID.
Usage:
uv run --with SRTrain python3 scripts/srt_cli.py cancel \
--reservation-id "RES123456" \
--confirm
Returns: Cancellation confirmation
JSON Format:
{
"success": true,
"data": {
"success": true,
"reservation_id": "RES123456",
"message": "Reservation cancelled successfully"
}
}
5. check_log
Check the progress of reservation attempts (especially useful for retry mode).
Usage:
uv run --with SRTrain python3 scripts/srt_cli.py log -n 30
Returns: Last N lines of reservation log file (~/.openclaw/tmp/srt/reserve.log)
Options:
-n, --lines: Number of lines to show (default: 20)
Log Format Example:
[2026-02-03 11:00:00] INFO: === SRT μμ½ μμ (μ¬μλ λͺ¨λ) ===
[2026-02-03 11:00:00] INFO: νμμμ: 60λΆ
[2026-02-03 11:00:00] INFO: μ¬μλ κ°κ²©: 10μ΄
[2026-02-03 11:00:00] INFO: λμ μ΄μ°¨: 1,3,5 (μ΄ 3κ°)
[2026-02-03 11:00:05] INFO: === μλ #1 (μ΄μ°¨ 1/3) ===
[2026-02-03 11:00:05] INFO: π« μμ½ μλ μ€... (μ΄μ°¨ 301, 120500)
[2026-02-03 11:00:06] WARN: β μ’μ μμ (μ΄μ°¨ 301)
[2026-02-03 11:00:06] INFO: β³ 10μ΄ λκΈ° ν μ¬μλ...
[2026-02-03 11:00:26] INFO: === μλ #2 (μ΄μ°¨ 2/3) ===
...
[2026-02-03 11:05:00] SUCCESS: β
μμ½ μ±κ³΅!
Error Handling
The skill provides clear, actionable error messages:
Common Errors:
-
AuthenticationFailed
- Invalid credentials
- Solution: Check phone number and password in config
-
NoSeatsAvailable
- Train is sold out
- Solution: Try next train or different time
- Exit code: 1 (retryable)
-
StationNotFound
- Invalid station name
- Solution: Use Korean station names from the list above
-
NoTrainsFound
- No trains for specified route/time
- Solution: Try different date or time
-
RateLimitExceeded
- Too many retry attempts (max 10 per session)
- Solution: Wait a few minutes before trying again
-
NetworkError
- Connection timeout or failure
- Solution: Check internet connection and retry
Exit Codes:
0- Success1- Retryable error (e.g., no seats available)2- Fatal error (e.g., authentication failed, invalid input)
β οΈ Rate Limiting and Account Protection
To protect your SRT account from being blocked by the server:
- Automatic delays between requests:
- Minimum 3 seconds between reservation attempts
- Minimum 5 seconds between search requests
- Maximum 10 retry attempts per session
- Exponential backoff after failures (3s β 5s β 10s β 15s β 20s β 30s)
What this means for users:
- The skill will automatically wait between requests
- You'll see waiting messages like "β³ SRT μλ² λ³΄νΈλ₯Ό μν΄ λκΈ° μ€ (3μ΄)"
- If you hit the retry limit, wait a few minutes before trying again
For AI orchestration:
- The AI should inform users about delays during retries
- Example: "μ¬μλ μ€μ λλ€. μλ² λ³΄νΈλ₯Ό μν΄ 3μ΄ λκΈ°ν©λλ€..."
- After 10 failed attempts, suggest alternatives like different times or dates
Natural Language Handling
When users make requests in Korean, the AI should:
-
Extract parameters from natural language:
- Stations (must convert to Korean if given in English)
- Date (relative dates like "λ΄μΌ", "λ€μμ£Ό κΈμμΌ" β YYYYMMDD)
- Time (relative times like "μ€ν 2μ", "12μ μ΄ν" β HHMMSS)
- Passenger count (default to 1 if not specified)
-
Call tools in correct sequence:
- Search before reserving
- List before canceling
- Handle retry logic with rate limiting
-
Handle errors gracefully:
- If no seats available, try next train (with delays)
- If station not found, suggest correct Korean name
- Inform user about waiting times during rate limiting
-
Confirm actions in Korean:
- "μμ½μ΄ μλ£λμμ΅λλ€" (Reservation completed)
- "3μ΄ ν λ€μ μ΄μ°¨λ₯Ό μλν©λλ€" (Trying next train in 3 seconds)
- "κ²°μ λ SRT μ±μμ μλ£ν΄μ£ΌμΈμ" (Complete payment in SRT app)
Real-World Usage Scenarios
Scenario 1: Simple Reservation
User: "2μ 17μΌμ μμμμ λλꡬ κ°λκ±° 12μμ΄ν μ μΌ λΉ λ₯Έκ±Έλ‘ 2μ₯ μμ½ν΄μ€"
AI Actions:
- Parse: departure=μμ, arrival=λλꡬ, date=20260217, time=120000, passengers=adult:2
- Search trains
- Select first available train
- Reserve train
- Confirm with payment reminder
Scenario 2: Retry Until Success
User: "λ§€μ§μ΄λ©΄ μ±κ³΅ν λκΉμ§ λ°λ³΅ν΄"
AI Actions:
- Search trains
- Start background retry:
exec reserve --retry --timeout-minutes 60 --wait-seconds 10 (in background) - Create monitoring cron job (isolated session + agentTurn):
cron add --job '{ "schedule": {"kind": "every", "everyMs": 120000}, "payload": { "kind": "agentTurn", "message": "Check SRT retry log and report progress", "deliver": true, "channel": "discord" }, "sessionTarget": "isolated", "enabled": true }' cron wake --mode "now" - Inform user: "λ°±κ·ΈλΌμ΄λ μ¬μλ μμ. 2λΆλ§λ€ μ λ°μ΄νΈν©λλ€."
β οΈ Background Retry Monitoring
MANDATORY: Use isolated session + agentTurn cron jobs for monitoring reserve --retry.
Setup
# 1. Start background retry
exec reserve --retry --timeout-minutes 60 (background)
# 2. Create monitoring cron (isolated + agentTurn)
cron add --job '{
"schedule": {"kind": "every", "everyMs": 120000},
"payload": {
"kind": "agentTurn",
"message": "Check `srt_cli.py log -n 30`, parse progress, report to user. Delete cron if done.",
"deliver": true,
"channel": "discord"
},
"sessionTarget": "isolated",
"enabled": true
}'
# 3. Wake immediately
cron wake --mode "now"
Requirements
- sessionTarget:
"isolated"(NOT "main") - payload.kind:
"agentTurn"(NOT "systemEvent") - payload.deliver:
true - Schedule: Every 1-3 minutes depending on task duration
- Wake: Always call
cron wake --mode "now"after creating job
Why
systemEventin main session doesn't trigger agent actionagentTurnin isolated session actually executes and reports- Prevents blocking, message batching, and silent monitoring
Scenario 3: Check and Cancel
User: "λ΄ μμ½ νμΈν΄μ£Όκ³ μ μΌ λΉ λ₯Έκ±° μ·¨μν΄μ€"
AI Actions:
- List reservations
- Parse JSON, find earliest by date/time
- Cancel reservation
- Confirm cancellation
Scenario 4: Modify Booking
User: "λΆμ° μμ½ μ·¨μνκ³ λλκ΅¬λ‘ λ€μ μμ½ν΄μ€"
AI Actions:
- List reservations
- Find Busan reservation
- Cancel Busan reservation
- Search for trains to λλꡬ (same date/time)
- Reserve new train
- Confirm both actions
Payment Notes
IMPORTANT: This skill can search and reserve trains, but cannot process payments.
After making a reservation:
- You'll receive a reservation number
- Payment must be completed via:
- SRT mobile app (iOS/Android)
- SRT website (https://etk.srail.kr)
- Check payment deadline (usually 20 minutes after reservation)
- Unpaid reservations will be automatically cancelled
Troubleshooting
"SRT μΈμ¦ μ 보λ₯Ό μ°Ύμ μ μμ΅λλ€"
- Verify
SRT_PHONEandSRT_PASSWORDenvironment variables are set - Check your shell profile (
~/.zshrc,~/.bashrc) hasexportkeyword - Example:
export SRT_PHONE="010-1234-5678"
"κ²μ κ²°κ³Όλ₯Ό μ°Ύμ μ μμ΅λλ€"
- Run
searchcommand beforereserve - Search results are cached in
~/.openclaw/tmp/srt/last_search.pkl
"μ¬μλ νλ μ΄κ³Ό"
- You've made 10 reservation attempts
- Wait 5-10 minutes before trying again
- Try different trains or times
Login failures
- Verify credentials are correct
- Check if SRT service is available
- Ensure phone number format includes hyphens (010-1234-5678)
Development
Testing Locally
# Install dependencies
# Install uv if not already installed
# https://docs.astral.sh/uv/getting-started/installation/
# Configure credentials
export SRT_PHONE="010-1234-5678"
export SRT_PASSWORD="your_password"
# Test commands
uv run --with SRTrain python3 scripts/srt_cli.py search --departure "μμ" --arrival "λΆμ°" --date "20260203" --time "140000"
uv run --with SRTrain python3 scripts/srt_cli.py list
Publishing to ClawHub
# Authenticate
clawhub login
# Publish
clawhub publish . \
--slug srt \
--name "SRT Korean Train Service" \
--version 0.1.2 \
--tags latest
License
MIT
Support
For issues or questions:
- File an issue on GitHub
- Check SRT service status: https://etk.srail.kr
Version History
- 0.1.3 - Retry improvements and monitoring requirements
- Unified
reservecommand with--retryflag - Added
--timeout-minutesfor time-based retry limits (default: 60) - Added
--train-idsupport for comma-separated multiple trains (e.g., "1,3,5") - Changed
--wait-secondsdefault from 20 to 10 seconds - Search includes sold-out trains by default (
available_only=False) - Monitoring: Isolated session + agentTurn cron jobs required for background retry
- Unified
- 0.1.2 - Add
--allflag for sold-out trains (deprecated) - 0.1.1 - Use
uvfor dependency management- Replace venv/pip with
uv run --with SRTrain - Environment variables only for credentials (remove config file support)
- Replace venv/pip with
- 0.1.0 - Initial release
- Search trains
- Make reservations
- View bookings
- Cancel bookings
- Rate limiting protection
- AI-friendly JSON output
No README available.
Permissions & Security
Security level L1: Low-risk skills with minimal permissions. Review inputs and outputs before running in production.
Requirements
- **sessionTarget:** `"isolated"` (NOT "main") - **payload.kind:** `"agentTurn"` (NOT "systemEvent") - **payload.deliver:** `true` - **Schedule:** Every 1-3 minutes depending on task duration - **Wake:** Always call `cron wake --mode "now"` after creating job
Configuration
Set your SRT credentials as environment variables: ```bash export SRT_PHONE="010-1234-5678" export SRT_PASSWORD="your_password" ``` Add these to your shell profile (`~/.zshrc`, `~/.bashrc`, etc.) for persistence. **Security Note:** Avoid committing credentials to version control. **Important:** Phone number must include hyphens in the format `010-XXXX-XXXX`
FAQ
How do I install srt?
Run openclaw add @khj809/srt in your terminal. This installs srt into your OpenClaw Skills catalog.
Does this skill run locally or in the cloud?
OpenClaw Skills execute locally by default. Review the SKILL.md and permissions before running any skill.
Where can I verify the source code?
The source repository is available at https://github.com/openclaw/skills/tree/main/skills/khj809/srt. Review commits and README documentation before installing.
