用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/vellum-ai/vellum-assistant --skill oura-setup命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Use when the user wants to build, scaffold, ship, or edit a Vellum plugin that bundles multiple surfaces (hooks, tools, skills, and more) into one installable package.
Perform a one-time migration from memory v1, to memory v2, which was introduced in 0.8.0.
Migrate from ChatGPT, Claude, OpenClaw, Hermes, Manus, and other AI assistants into Vellum by inspecting their data exports, conversation archives, files, prompts, custom instructions, memory, saved memories, tools, GPTs, workflows, integrations, and relationships, then mapping as much as safely possible into Vellum primitives. Handles single-source and multi-source migrations with a unified, deduplicated inventory.
正在显示 SKILL.md
基于 SOC 职业分类
| name | oura-setup |
| description | Connect an Oura Ring via OAuth2 — app registration, token exchange, and credential storage |
| compatibility | Designed for Vellum personal assistants |
| metadata | {"emoji":"💍","vellum":{"category":"health","display-name":"Oura Ring Setup"}} |
Connect the user's Oura Ring to pull sleep, heart rate, readiness, activity, and other health data via the Oura Cloud API V2.
Have the user go to https://developer.ouraring.com/applications and create a new application:
http://localhost:3000/callbackpersonal, daily, heartrate, sleep, workout, spo2, stress, heart_health, session, ring_configurationSave the Client ID and Client Secret.
Store the client secret securely using assistant credentials prompt, then write and run the OAuth helper script on the user's machine:
#!/usr/bin/env python3
"""Oura Ring OAuth2 helper — catches auth code and exchanges for tokens instantly."""
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs, urlencode
import urllib.request, json, webbrowser, ssl
CLIENT_ID = 'YOUR_CLIENT_ID'
CLIENT_SECRET = 'YOUR_CLIENT_SECRET'
REDIRECT_URI = 'http://localhost:3000/callback'
SCOPES = 'email personal daily heartrate workout tag session spo2 ring_configuration stress heart_health'
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
parsed = urlparse(self.path)
if parsed.path == '/':
params = urlencode({
'response_type': 'code', 'client_id': CLIENT_ID,
'redirect_uri': REDIRECT_URI, 'scope': SCOPES, 'state': 'assistant'
})
self.send_response(302)
self.send_header('Location', f'https://cloud.ouraring.com/oauth/authorize?{params}')
self.end_headers()
elif parsed.path == '/callback':
code = parse_qs(parsed.query).get('code', [''])[0]
if code:
token_data = urlencode({
'grant_type': , : code,
: REDIRECT_URI, : CLIENT_ID,
: CLIENT_SECRET,
}).encode()
:
req = urllib.request.Request(,
data=token_data,
headers={: },
method=)
resp = urllib.request.urlopen(req, context=ssl.create_default_context())
result = json.loads(resp.read())
(, ) f:
json.dump(result, f, indent=)
.send_response()
.send_header(, )
.end_headers()
.wfile.write()
()
Exception e:
.send_response()
.end_headers()
.wfile.write(.encode())
():
()
webbrowser.()
HTTPServer((, ), Handler).serve_forever()
Run with python3 /path/to/script.py on the user's machine (host_bash). The user authorizes in their browser, the script catches the code and exchanges it for tokens in under a second.
Important: Auth codes expire in ~30 seconds. Do NOT have the user paste codes manually — use this script to catch and exchange them automatically.
After the OAuth flow, read tokens from /tmp/oura_tokens.json and store them:
access_token — store in credential vault with injection template for api.ouraring.com Authorization header (Bearer prefix) and allowed_tools: ["bash"]refresh_token — store in credential vault for token refreshTest with the personal info endpoint:
curl -s -H "Authorization: Bearer $TOKEN" "https://api.ouraring.com/v2/usercollection/personal_info"
All endpoints use GET https://api.ouraring.com/v2/usercollection/{type} with query params start_date and end_date (YYYY-MM-DD format).
| Endpoint | Data | Notes |
|---|---|---|
/v2/usercollection/daily_sleep | Sleep score, duration, efficiency, stages | Best checked after user's typical wake time |
/v2/usercollection/sleep | Detailed sleep periods with HR, HRV, movement | Raw sleep period data |
/v2/usercollection/daily_readiness | Readiness score, HRV balance, recovery | Good morning check-in metric |
/v2/usercollection/daily_activity | Steps, calories, movement, inactivity | Activity summary |
/v2/usercollection/heartrate | Continuous HR (use start_datetime/end_datetime in ISO format) | Can be large — limit date range |
/v2/usercollection/daily_spo2 | Blood oxygen levels | Nightly average |
/v2/usercollection/daily_stress | Stress score and recovery | Daytime stress tracking |
/v2/usercollection/workout | Detected workouts with HR, calories | Auto-detected or manual |
/v2/usercollection/personal_info | Age, weight, height, email | Good connection test |
Tokens expire after 30 days. Refresh with:
curl -s -X POST "https://api.ouraring.com/oauth/token" \
-d "grant_type=refresh_token&refresh_token=$REFRESH_TOKEN&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET"
Store the new access_token and refresh_token from the response.