jpskill.com
🛠️ 開発・MCP コミュニティ

terra-connections

Terra APIを活用し、FitbitやGarminなどのウェアラブルデバイスと連携して、ユーザーのセッション管理や接続・切断処理などをスムーズに行えるようにするSkill。

📜 元の英語説明(参考)

Terra API device and provider connections. Use when connecting users to wearables (Fitbit, Garmin, Apple Health, Oura, WHOOP), managing user sessions, or handling disconnections.

🇯🇵 日本人クリエイター向け解説

一言でいうと

Terra APIを活用し、FitbitやGarminなどのウェアラブルデバイスと連携して、ユーザーのセッション管理や接続・切断処理などをスムーズに行えるようにするSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o terra-connections.zip https://jpskill.com/download/9511.zip && unzip -o terra-connections.zip && rm terra-connections.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/9511.zip -OutFile "$d\terra-connections.zip"; Expand-Archive "$d\terra-connections.zip" -DestinationPath $d -Force; ri "$d\terra-connections.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して terra-connections.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → terra-connections フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Terra Connections

ユーザーを150以上のウェアラブルデバイスおよび健康データプロバイダーに接続します。

サポートされているプロバイダー (150+)

ウェアラブル&フィットネストラッカー

  • Garmin - 全モデル、完全な履歴データ
  • Fitbit - 全デバイス、栄養サポート
  • Apple Health - iOS SDK が必要
  • Oura Ring - 睡眠、準備、活動
  • WHOOP - 回復、負荷、睡眠
  • Polar - トレーニング、睡眠、活動
  • Withings - 腕時計、体重計、血圧計
  • Samsung Health - Android SDK が必要
  • Google Fit / Health Connect - Android SDK が必要
  • Suunto, Coros, Biostrap, Zepp - フルサポート

栄養アプリ

  • MyFitnessPal - 食事記録、マクロ
  • Cronometer - 詳細な栄養
  • MacrosFirst, FatSecret - 食事の追跡

医療機器

  • Freestyle Libre - CGM グルコースデータ
  • Dexcom - CGM グルコース (特別なプロセス)
  • Omron - 血圧モニター

接続方法

方法 1: Widget Flow (推奨)

事前構築済みの UI で、最も簡単な統合方法です。

from terra import Terra

client = Terra(
    dev_id="botaniqalmedtech-testing-SjyfjtG33s",
    api_key="_W7Pm-kAaIf1GA_Se21NnzCaFZjg3Izc"
)

# Widget セッションの生成
response = client.authentication.generatewidgetsession(
    reference_id="user_12345",  # 内部ユーザー ID
    auth_success_redirect_url="https://app.botaniqal.com/success",
    auth_failure_redirect_url="https://app.botaniqal.com/failure",
    providers=["FITBIT", "GARMIN", "OURA"]  # オプション: プロバイダーのフィルタリング
)

widget_url = response.url
# ユーザーを widget_url にリダイレクト

ユーザーフロー:

  1. ユーザーが widget URL にアクセス
  2. プロバイダーを選択 (Fitbit, Garmin など)
  3. プロバイダーとの OAuth を完了
  4. 成功 URL にリダイレクト
  5. type: "auth" の Webhook がエンドポイントに送信

方法 2: Custom UI Flow

独自のプロバイダー選択 UI を構築します。

# ステップ 1: 利用可能な統合を取得
integrations = client.integrations.fetch()
# UI にプロバイダーリストを表示

# ステップ 2: ユーザーがプロバイダーを選択し、認証 URL を生成
response = client.authentication.authenticateuser(
    resource="FITBIT",  # ユーザーが選択したプロバイダー
    reference_id="user_12345"
)

auth_url = response.auth_url
# ブラウザで auth_url を開く (WebView/iFrame では**ない**)

重要: 認証 URL は常に実際のブラウザで開いてください。WebView や iFrame ではありません (OAuth のセキュリティ要件)。

方法 3: Mobile SDK (Apple/Samsung/Health Connect に必須)

これらのソースには Web API がありません。モバイル SDK が必要です。

iOS (Swift) - Apple Health:

import TerraiOS

// 1. バックエンドからトークンを取得
let token = await fetchTerraToken()

// 2. Terra を初期化
Terra.initTerra(devId: "botaniqalmedtech-testing-SjyfjtG33s", referenceId: "user_12345")

// 3. Apple Health に接続
Terra.initConnection(
    type: Connections.APPLE_HEALTH,
    token: token,
    schedulerOn: true  // バックグラウンド同期を有効にする
) { success, error in
    if success {
        print("Connected to Apple Health!")
    }
}

Android (Kotlin) - Samsung Health / Health Connect:

import co.tryterra.terra.Terra

// 1. バックエンドからトークンを取得
val token = fetchTerraToken()

// 2. Terra を初期化 (minSDK 28 が必要)
Terra.initTerra(
    devId = "botaniqalmedtech-testing-SjyfjtG33s",
    referenceId = "user_12345",
    context = this
)

// 3. Samsung Health または Health Connect に接続
Terra.initConnection(
    connection = Connections.SAMSUNG,  // または Connections.HEALTH_CONNECT
    token = token,
    context = this,
    schedulerOn = true
) { success ->
    if (success) {
        println("Connected to Samsung Health!")
    }
}

React Native:

import { Terra, Connections } from "terra-react";

// 初期化
Terra.initTerra("botaniqalmedtech-testing-SjyfjtG33s", "user_12345");

// 接続 (iOS: Apple Health, Android: Samsung/Health Connect)
await Terra.initConnection(
    Connections.APPLE_HEALTH,
    authToken,
    true  // バックグラウンド同期のための schedulerOn
);

操作

connect-user

ユーザーをウェアラブルプロバイダーに接続します。

def connect_user(
    client: Terra,
    reference_id: str,
    provider: str = None,
    success_url: str = None,
    failure_url: str = None
) -> dict:
    """
    ユーザーをウェアラブルプロバイダーに接続します。

    Args:
        reference_id: 内部ユーザー ID
        provider: 特定のプロバイダー。すべての場合ウィジェットの場合は None
        success_url: 成功時のリダイレクト URL
        failure_url: 失敗時のリダイレクト URL

    Returns:
        url と session_id を含む dict
    """
    if provider:
        # Custom UI flow - 特定のプロバイダー
        response = client.authentication.authenticateuser(
            resource=provider,
            reference_id=reference_id
        )
        return {"url": response.auth_url, "type": "direct"}
    else:
        # Widget flow - ユーザーがプロバイダーを選択
        response = client.authentication.generatewidgetsession(
            reference_id=reference_id,
            auth_success_redirect_url=success_url,
            auth_failure_redirect_url=failure_url
        )
        return {
            "url": response.url,
            "session_id": response.session_id,
            "type": "widget"
        }

disconnect-user

ユーザーを切断し、データを削除します。

def disconnect_user(client: Terra, terra_user_id: str) -> bool:
    """
    Terra からユーザーを切断します (アクセスを取り消し、データを削除します)。

    Args:
        terra_user_id: Terra のユーザー ID (reference_id ではありません)

    Returns:
        bool: 成功ステータス
    """
    response = client.authentication.deauthenticateuser(user_id=terra_user_id)
    return response.success

get-user-info

ユーザーの接続ステータスと詳細を取得します。

def get_user_info(client: Terra, terra_user_id: str) -> dict:
    """接続されたユーザーに関する情報を取得します。"""

    response = client.user.getuser(user_id=terra_user_id)

    return {
        "user_id": response.user.user_id,
        "provider": response.user.provider,
        "reference_id": response.user.reference_id

(原文がここで切り詰められています)
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Terra Connections

Connect users to 150+ wearable devices and health data providers.

Supported Providers (150+)

Wearables & Fitness Trackers

  • Garmin - All models, full historical data
  • Fitbit - All devices, nutrition support
  • Apple Health - iOS SDK required
  • Oura Ring - Sleep, readiness, activity
  • WHOOP - Recovery, strain, sleep
  • Polar - Training, sleep, activity
  • Withings - Watches, scales, blood pressure
  • Samsung Health - Android SDK required
  • Google Fit / Health Connect - Android SDK required
  • Suunto, Coros, Biostrap, Zepp - Full support

Nutrition Apps

  • MyFitnessPal - Food logging, macros
  • Cronometer - Detailed nutrition
  • MacrosFirst, FatSecret - Meal tracking

Medical Devices

  • Freestyle Libre - CGM glucose data
  • Dexcom - CGM glucose (special process)
  • Omron - Blood pressure monitors

Connection Methods

Method 1: Widget Flow (Recommended)

Pre-built UI, easiest integration:

from terra import Terra

client = Terra(
    dev_id="botaniqalmedtech-testing-SjyfjtG33s",
    api_key="_W7Pm-kAaIf1GA_Se21NnzCaFZjg3Izc"
)

# Generate widget session
response = client.authentication.generatewidgetsession(
    reference_id="user_12345",  # Your internal user ID
    auth_success_redirect_url="https://app.botaniqal.com/success",
    auth_failure_redirect_url="https://app.botaniqal.com/failure",
    providers=["FITBIT", "GARMIN", "OURA"]  # Optional: filter providers
)

widget_url = response.url
# Redirect user to widget_url

User Flow:

  1. User visits widget URL
  2. Selects provider (Fitbit, Garmin, etc.)
  3. Completes OAuth with provider
  4. Redirected to success URL
  5. Webhook sent to your endpoint with type: "auth"

Method 2: Custom UI Flow

Build your own provider selection UI:

# Step 1: Get available integrations
integrations = client.integrations.fetch()
# Display provider list in your UI

# Step 2: User selects provider, generate auth URL
response = client.authentication.authenticateuser(
    resource="FITBIT",  # Provider selected by user
    reference_id="user_12345"
)

auth_url = response.auth_url
# Open auth_url in browser (NOT WebView/iFrame!)

Important: Always open auth URLs in a real browser, not WebView or iFrame (OAuth security requirement).

Method 3: Mobile SDK (Required for Apple/Samsung/Health Connect)

These sources have no web API - mobile SDK required:

iOS (Swift) - Apple Health:

import TerraiOS

// 1. Get token from your backend
let token = await fetchTerraToken()

// 2. Initialize Terra
Terra.initTerra(devId: "botaniqalmedtech-testing-SjyfjtG33s", referenceId: "user_12345")

// 3. Connect to Apple Health
Terra.initConnection(
    type: Connections.APPLE_HEALTH,
    token: token,
    schedulerOn: true  // Enable background sync
) { success, error in
    if success {
        print("Connected to Apple Health!")
    }
}

Android (Kotlin) - Samsung Health / Health Connect:

import co.tryterra.terra.Terra

// 1. Get token from your backend
val token = fetchTerraToken()

// 2. Initialize Terra (minSDK 28 required)
Terra.initTerra(
    devId = "botaniqalmedtech-testing-SjyfjtG33s",
    referenceId = "user_12345",
    context = this
)

// 3. Connect to Samsung Health or Health Connect
Terra.initConnection(
    connection = Connections.SAMSUNG,  // or Connections.HEALTH_CONNECT
    token = token,
    context = this,
    schedulerOn = true
) { success ->
    if (success) {
        println("Connected to Samsung Health!")
    }
}

React Native:

import { Terra, Connections } from "terra-react";

// Initialize
Terra.initTerra("botaniqalmedtech-testing-SjyfjtG33s", "user_12345");

// Connect (iOS: Apple Health, Android: Samsung/Health Connect)
await Terra.initConnection(
    Connections.APPLE_HEALTH,
    authToken,
    true  // schedulerOn for background sync
);

Operations

connect-user

Connect a user to a wearable provider.

def connect_user(
    client: Terra,
    reference_id: str,
    provider: str = None,
    success_url: str = None,
    failure_url: str = None
) -> dict:
    """
    Connect user to wearable provider.

    Args:
        reference_id: Your internal user ID
        provider: Specific provider or None for widget with all
        success_url: Redirect URL on success
        failure_url: Redirect URL on failure

    Returns:
        dict with url and session_id
    """
    if provider:
        # Custom UI flow - specific provider
        response = client.authentication.authenticateuser(
            resource=provider,
            reference_id=reference_id
        )
        return {"url": response.auth_url, "type": "direct"}
    else:
        # Widget flow - user selects provider
        response = client.authentication.generatewidgetsession(
            reference_id=reference_id,
            auth_success_redirect_url=success_url,
            auth_failure_redirect_url=failure_url
        )
        return {
            "url": response.url,
            "session_id": response.session_id,
            "type": "widget"
        }

disconnect-user

Disconnect user and remove their data.

def disconnect_user(client: Terra, terra_user_id: str) -> bool:
    """
    Disconnect user from Terra (revokes access, removes data).

    Args:
        terra_user_id: Terra's user ID (not your reference_id)

    Returns:
        bool: Success status
    """
    response = client.authentication.deauthenticateuser(user_id=terra_user_id)
    return response.success

get-user-info

Get user's connection status and details.

def get_user_info(client: Terra, terra_user_id: str) -> dict:
    """Get information about a connected user."""

    response = client.user.getuser(user_id=terra_user_id)

    return {
        "user_id": response.user.user_id,
        "provider": response.user.provider,
        "reference_id": response.user.reference_id,
        "scopes": response.user.scopes,
        "last_webhook_update": response.user.last_webhook_update
    }

list-connected-users

Get all users connected to your app.

def list_connected_users(client: Terra) -> list:
    """List all connected Terra users."""

    response = client.user.getsubscriptions()

    users = []
    for user in response.users:
        users.append({
            "user_id": user.user_id,
            "provider": user.provider,
            "reference_id": user.reference_id,
            "last_update": user.last_webhook_update
        })

    return users

get-users-by-reference

Find Terra users by your internal reference ID.

def get_users_by_reference(client: Terra, reference_id: str) -> list:
    """
    Get all Terra users for a reference_id.
    (One person can have multiple providers connected)
    """

    response = client.user.getuser(reference_id=reference_id)

    return response.users  # List of TerraUser objects

Multi-Device Setup

One user can connect multiple wearables:

# User connects Fitbit
connect_user(client, "user_123", provider="FITBIT")

# Same user connects Oura Ring
connect_user(client, "user_123", provider="OURA")

# Get all connections for user
users = get_users_by_reference(client, "user_123")
# Returns: [TerraUser(provider="FITBIT"), TerraUser(provider="OURA")]

Each provider creates a separate Terra User ID, but all share the same reference_id.

Provider-Specific Notes

Apple Health (iOS)

  • Requires: Mobile SDK, iOS 13+
  • No web API: Must use native app
  • Background sync: Enable schedulerOn: true
  • Permissions: Request during connection

Samsung Health / Health Connect (Android)

  • Requires: Mobile SDK, minSDK 28
  • Health Connect: Google's unified health API
  • Samsung specific: Uses Samsung Health SDK

WHOOP

  • Special process: Contact Terra for activation
  • Data: Recovery, strain, sleep, HRV

Dexcom (CGM)

  • Special process: Contact Terra for activation
  • Data: Continuous glucose monitoring

Freestyle Libre (EU)

  • Dedicated API keys: Required for EU
  • Data: CGM glucose readings

Strava

  • Dedicated API keys: Required
  • Data: Activities, routes

Webhook Events for Connections

When user connects/disconnects, you receive webhooks:

Connection Success (type: "auth"):

{
  "type": "auth",
  "user": {
    "user_id": "terra_abc123",
    "provider": "FITBIT",
    "reference_id": "user_12345"
  },
  "status": "authenticated"
}

Disconnection (type: "deauth"):

{
  "type": "deauth",
  "user": {
    "user_id": "terra_abc123",
    "provider": "FITBIT"
  },
  "status": "deauthenticated"
}

Connection Error (type: "connection_error"):

{
  "type": "connection_error",
  "user": {
    "user_id": "terra_abc123",
    "provider": "FITBIT"
  },
  "message": "Token refresh failed"
}

Database Schema Recommendation

CREATE TABLE terra_connections (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id),  -- Your user
    terra_user_id VARCHAR(255) UNIQUE,     -- Terra's user ID
    provider VARCHAR(50),                   -- FITBIT, GARMIN, etc.
    reference_id VARCHAR(255),              -- Your reference ID
    connected_at TIMESTAMP DEFAULT NOW(),
    last_sync TIMESTAMP,
    status VARCHAR(20) DEFAULT 'active',    -- active, disconnected
    scopes TEXT[]                           -- Granted permissions
);

CREATE INDEX idx_terra_user ON terra_connections(user_id);
CREATE INDEX idx_terra_reference ON terra_connections(reference_id);

Related Skills

  • terra-auth: Authentication and credentials
  • terra-data: Retrieve health data
  • terra-webhooks: Handle connection events
  • terra-sdk: Mobile SDK integration