mcpField
M
modelslab-account-management

modelslab-account-management

github.com/modelslabその他1357 回インストール36 週間前に更新
リポジトリ

modelslab-account-management について

ModelsLab Account Managementは、Agent Control Plane APIでModelsLabアカウントを管理するスキルです。認証、トークン、プロフィール、APIキー、チームを扱い、ブラウザーを使わないメール認証にも対応します。これらの機能はMCPサーバーからも利用できます。

主な機能

  1. 01登録、ログイン、メール認証
  2. 02トークンの発行、更新、失効
  3. 03プロフィールとパスワードの管理
  4. 04APIキーの作成と管理
  5. 05チームメンバーの招待と管理

活用シーン

  1. 01ブラウザーなしでのアカウント作成と認証
  2. 02エージェントのアクセストークン更新
  3. 03生成エンドポイント用APIキーの管理
  4. 04チームメンバーの招待や削除

MCP 対応

MCPサーバーは https://modelslab.com/mcp/agents で提供され、アカウント、トークン、プロフィール、APIキー、チーム管理のツールを公開します。Bearerトークンで認証します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/modelslab/skills --skill modelslab-account-management

インストール後、Claude Code で/modelslab-account-managementを入力して読み込まれたか確認します。

詳細

ModelsLab アカウント管理

Agent Control Plane API を通じて、認証、トークン、プロフィール、API キー、チームなど、ModelsLab アカウントのライフサイクル全般を管理します。

このスキルを使用する場面

  • ModelsLab にプログラムから登録またはログインする
  • 生成エンドポイント用の API キーを作成、管理する
  • ユーザープロフィール、パスワード、ソーシャルリンクを更新する
  • アクセストークンを管理する(一覧表示、無効化、チームアカウントの切り替え)
  • チームメンバーを招待、更新、削除する
  • アカウントの初期設定が必要なエージェントのワークフローを構築する

認証

Agent Control Plane では ベアラートークン(API キーではありません)を使用します。一部のエンドポイント(登録、ログイン、パスワードを忘れた場合)は、トークンなしで利用できます。

Base URL: https://modelslab.com/api/agents/v1
Authorization: Bearer <agent_access_token>

認証:登録とログイン

登録
import requests

def signup(email, password, name=None):
    """Create a new ModelsLab account."""
    response = requests.post(
        "https://modelslab.com/api/agents/v1/auth/signup",
        json={
            "email": email,
            "password": password,
            "name": name or ""
        }
    )
    data = response.json()
    if "error" in data:
        raise Exception(data["error"])
    return data["data"]  # Contains access_token

# Usage
result = signup("[email protected]", "securepass123", "My Agent")
token = result["access_token"]
print(f"Signed up! Token: {token}")
ログイン
def login(email, password, token_expiry="1_month"):
    """Log in and get a bearer token.

    Args:
        token_expiry: "1_week", "1_month" (default), "3_months", "never"
    """
    response = requests.post(
        "https://modelslab.com/api/agents/v1/auth/login",
        json={
            "email": email,
            "password": password,
            "device_name": "my-agent",
            "token_expiry": token_expiry
        }
    )
    data = response.json()
    if "error" in data:
        raise Exception(data["error"])
    return data["data"]["access_token"]

# Usage
token = login("[email protected]", "securepass123")
ログアウト
def logout(token):
    """Revoke current token."""
    requests.post(
        "https://modelslab.com/api/agents/v1/auth/logout",
        headers={"Authorization": f"Bearer {token}"}
    )

def logout_all(token):
    """Revoke all tokens for this account."""
    requests.post(
        "https://modelslab.com/api/agents/v1/auth/logout-all",
        headers={"Authorization": f"Bearer {token}"}
    )
メールアドレスの確認(ヘッドレス)

登録後、ユーザーはメールで verification_code を受け取ります。ブラウザーを使わずに確認します。

def verify_email(verification_code):
    """Verify email with the code from the verification email.

    Returns an access_token and api_key — no browser required.
    """
    response = requests.post(
        "https://modelslab.com/api/agents/v1/auth/verify-email",
        json={"verification_code": verification_code}
    )
    data = response.json()
    if "error" in data:
        raise Exception(data["error"])
    return data["data"]

# Usage — complete headless signup flow
result = verify_email("the_code_from_email")
token = result["access_token"]
api_key = result["api_key"]
print(f"Verified! Token: {token}, API Key: {api_key}")
トークンの更新

再認証せずに、現在のベアラートークンをローテーションします。

def refresh_token(token, token_expiry="1_month"):
    """Refresh/rotate the current access token.

    The old token is revoked and a new one is issued.

    Args:
        token_expiry: "1_week", "1_month" (default), "3_months", "never"
    """
    response = requests.post(
        "https://modelslab.com/api/agents/v1/auth/refresh",
        headers={"Authorization": f"Bearer {token}"},
        json={"token_expiry": token_expiry}
    )
    data = response.json()
    if "error" in data:
        raise Exception(data["error"])
    return data["data"]["access_token"]

# Usage — rotate token before it expires
new_token = refresh_token(old_token, token_expiry="1_month")
パスワードのリセット
def forgot_password(email):
    """Request a password reset email."""
    requests.post(
        "https://modelslab.com/api/agents/v1/auth/forgot-password",
        json={"email": email}
    )

def reset_password(email, token, new_password):
    """Reset password using the reset token from email."""
    requests.post(
        "https://modelslab.com/api/agents/v1/auth/reset-password",
        json={
            "email": email,
            "token": token,
            "password": new_password,
            "password_confirmation": new_password
        }
    )

トークン管理

def make_headers(token):
    return {"Authorization": f"Bearer {token}"}

def list_tokens(token):
    """List all active tokens."""
    resp = requests.get(
        "https://modelslab.com/api/agents/v1/auth/tokens",
        headers=make_headers(token)
    )
    return resp.json()["data"]

def revoke_token(token, token_id):
    """Revoke a specific token by ID."""
    requests.delete(
        f"https://modelslab.com/api/agents/v1/auth/tokens/{token_id}",
        headers=make_headers(token)
    )

def revoke_other_tokens(token):
    """Revoke all tokens except the current one."""
    requests.post(
        "https://modelslab.com/api/agents/v1/auth/tokens/revoke-others",
        headers=make_headers(token)
    )

def switch_account(token, team_username):
    """Switch to a team account context. Returns new token."""
    resp = requests.post(
        "https://modelslab.com/api/agents/v1/auth/switch-account",
        headers=make_headers(token),
        json={"account_username": team_username}
    )
    return resp.json()["data"]["access_token"]

プロフィール管理

プロフィールの取得
def get_profile(token):
    """Get the authenticated user's profile."""
    resp = requests.get(
        "https://modelslab.com/api/agents/v1/me",
        headers=make_headers(token)
    )
    return resp.json()["data"]

# Usage
profile = get_profile(token)
print(f"Name: {profile['name']}, Email: {profile['email']}")
print(f"Wallet: ${profile.get('wallet_balance', 0)}")
プロフィールの更新
def update_profile(token, name=None, username=None, about_me=None):
    """Update profile fields."""
    payload = {}
    if name: payload["name"] = name
    if username: payload["username"] = username
    if about_me: payload["about_me"] = about_me

    resp = requests.patch(
        "https://modelslab.com/api/agents/v1/me",
        headers=make_headers(token),
        json=payload
    )
    return resp.json()["data"]

def update_password(token, current_password, new_password):
    """Change account password."""
    requests.patch(
        "https://modelslab.com/api/agents/v1/me/password",
        headers=make_headers(token),
        json={
            "current_password": current_password,
            "password": new_password,
            "password_confirmation": new_password
        }
    )

def update_socials(token, github=None, twitter=None, discord=None):
    """Update social media links."""
    payload = {}
    if github: payload["github"] = github
    if twitter: payload["twitter"] = twitter
    if discord: payload["discord"] = discord

    requests.patch(
        "https://modelslab.com/api/agents/v1/me/socials",
        headers=make_headers(token),
        json=payload
    )

def update_preferences(token, nsfw_content=None, wallet_notification_enabled=None):
    """Update account preferences."""
    payload = {}
    if nsfw_content is not None: payload["nsfw_content"] = nsfw_content
    if wallet_notification_enabled is not None:
        payload["wallet_notification_enabled"] = wallet_notification_enabled

    requests.patch(
        "https://modelslab.com/api/agents/v1/me/preferences",
        headers=make_headers(token),
        json=payload
    )

API キー管理

API キーは生成エンドポイント(/api/v6、/api/v7、/api/v8)で使用します。

API キーの一覧表示
def list_api_keys(token):
    """List all API keys."""
    resp = requests.get(
        "https://modelslab.com/api/agents/v1/api-keys",
        headers=make_headers(token)
    )
    return resp.json()["data"]
API キーの作成
def create_api_key(token, name, notes=None):
    """Create a new API key for generation endpoints.

    Returns the full key — store it securely, it won't be shown again.
    """
    payload = {"name": name}
    if notes: payload["notes"] = notes

    resp = requests.post(
        "https://modelslab.com/api/agents/v1/api-keys",
        headers=make_headers(token),
        json=payload
    )
    return resp.json()["data"]

# Usage
key_data = create_api_key(token, "production-key", notes="Used by CI/CD")
api_key = key_data["key"]
print(f"API Key: {api_key}")
API キーの取得、更新、削除
def get_api_key(token, key_id):
    """Get details of a specific API key."""
    resp = requests.get(
        f"https://modelslab.com/api/agents/v1/api-keys/{key_id}",
        headers=make_headers(token)
    )
    return resp.json()["data"]

def update_api_key(token, key_id, name=None, notes=None):
    """Update an API key's name or notes."""
    payload = {}
    if name: payload["name"] = name
    if notes: payload["notes"] = notes

    resp = requests.put(
        f"https://modelslab.com/api/agents/v1/api-keys/{key_id}",
        headers=make_headers(token),
        json=payload
    )
    return resp.json()["data"]

def delete_api_key(token, key_id):
    """Delete an API key."""
    requests.delete(
        f"https://modelslab.com/api/agents/v1/api-keys/{key_id}",
        headers=make_headers(token)
    )

チーム管理

チームメンバーの一覧表示
def list_team_members(token):
    """List all team members and pending invites."""
    resp = requests.get(
        "https://modelslab.com/api/agents/v1/teams",
        headers=make_headers(token)
    )
    return resp.json()["data"]
チームメンバーの招待
def invite_team_member(token, email):
    """Send a team invite to an email address."""
    resp = requests.post(
        "https://modelslab.com/api/agents/v1/teams",
        headers=make_headers(token),
        json={"email": email}
    )
    return resp.json()["data"]

# Usage
invite_team_member(token, "[email protected]")
メンバーの管理
def get_team_member(token, member_id):
    """Get details of a team member."""
    resp = requests.get(
        f"https://modelslab.com/api/agents/v1/teams/{member_id}",
        headers=make_headers(token)
    )
    return resp.json()["data"]

def update_team_member(token, member_id, role=None, permissions=None):
    """Update a team member's role or permissions."""
    payload = {}
    if role: payload["role"] = role
    if permissions: payload["permissions"] = permissions

    resp = requests.put(
        f"https://modelslab.com/api/agents/v1/teams/{member_id}",
        headers=make_headers(token),
        json=payload
    )
    return resp.json()["data"]

def remove_team_member(token, member_id):
    """Remove a member from the team."""
    requests.delete(
        f"https://modelslab.com/api/agents/v1/teams/{member_id}",
        headers=make_headers(token)
    )

def resend_invite(token, member_id):
    """Resend a pending team invite."""
    requests.post(
        f"https://modelslab.com/api/agents/v1/teams/{member_id}/resend-invite",
        headers=make_headers(token)
    )

def accept_invite(token, invite_id):
    """Accept a team invitation."""
    requests.post(
        f"https://modelslab.com/api/agents/v1/teams/invitations/{invite_id}/accept",
        headers=make_headers(token)
    )

エージェントの完全な初期設定例

import requests

class ModelsLabAgent:
    """Bootstrap a ModelsLab account for an AI agent."""

    BASE = "https://modelslab.com/api/agents/v1"

    def __init__(self):
        self.token = None
        self.api_key = None

    def _headers(self):
        return {"Authorization": f"Bearer {self.token}"}

    def login(self, email, password):
        """Step 1: Authenticate."""
        resp = requests.post(f"{self.BASE}/auth/login", json={
            "email": email,
            "password": password,
            "token_expiry": "1_month"
        })
        self.token = resp.json()["data"]["access_token"]
        return self

    def get_or_create_api_key(self, name="agent-key"):
        """Step 2: Get existing key or create one."""
        keys = requests.get(
            f"{self.BASE}/api-keys",
            headers=self._headers()
        ).json()["data"]

        for key in keys:
            if key["name"] == name:
                self.api_key = key["key"]
                return self.api_key

        new_key = requests.post(
            f"{self.BASE}/api-keys",
            headers=self._headers(),
            json={"name": name}
        ).json()["data"]

        self.api_key = new_key["key"]
        return self.api_key

    def check_ready(self):
        """Step 3: Verify account is ready for generation."""
        profile = requests.get(
            f"{self.BASE}/me",
            headers=self._headers()
        ).json()["data"]

        print(f"Account: {profile['name']} ({profile['email']})")
        print(f"API Key: {self.api_key[:8]}...")
        return True

# Usage
agent = ModelsLabAgent()
agent.login("[email protected]", "password")
agent.get_or_create_api_key("production")
agent.check_ready()

# Now use agent.api_key with generation endpoints

ヘッドレスエージェントのフロー(ブラウザー不要)

ブラウザーを操作せずに、登録、確認、支払い方法の追加、サブスクリプションの登録、コンテンツの生成を行う必要があるエージェント向けの完全なフローです。3 種類すべての支払い方法(ヘッドレス、Setup Intent、人による操作)については、modelslab-billing-subscriptions を参照してください。

import requests

BASE = "https://modelslab.com/api/agents/v1"

# Fetch Stripe publishable key dynamically
config_resp = requests.get(f"{BASE}/billing/stripe-config",
    headers={"Authorization": f"Bearer {token}"})
STRIPE_PK = config_resp.json()["publishable_key"]

# 1. Sign up
signup_resp = requests.post(f"{BASE}/auth/signup", json={
    "email": "[email protected]",
    "password": "securepass123",
    "name": "My Agent"
})
# -> User receives verification_code in email

# 2. Verify email with code from email (no browser needed)
verify_resp = requests.post(f"{BASE}/auth/verify-email", json={
    "verification_code": "the_code_from_email"
})
token = verify_resp.json()["data"]["access_token"]
api_key = verify_resp.json()["data"]["api_key"]
hdrs = {"Authorization": f"Bearer {token}"}

# 3a. Option A: Headless card tokenization via Stripe API (recommended)
# Or fetch key dynamically: GET /billing/stripe-config
pm_resp = requests.post(
    "https://api.stripe.com/v1/payment_methods",
    auth=(STRIPE_PK, ""),
    data={
        "type": "card",
        "card[number]": "4242424242424242",
        "card[exp_month]": 12,
        "card[exp_year]": 2027,
        "card[cvc]": "123",
    }
)
pm_id = pm_resp.json()["id"]

# 3b. Option B: Setup Intent flow (save card for future use)
# setup_resp = requests.post(f"{BASE}/billing/setup-intent", headers=hdrs)
# -> Confirm with Stripe API, then use the resulting pm_id

# 3c. Option C: Human-assisted payment link
# link = requests.post(f"{BASE}/billing/payment-link", headers=hdrs, json={
#     "purpose": "subscribe", "plan_id": 123
# }).json()["data"]
# -> Forward link["payment_url"] to human, then confirm-checkout

# 4. Attach the payment method
requests.post(f"{BASE}/billing/payment-methods", headers=hdrs, json={
    "payment_method_id": pm_id,
    "make_default": True
})

# 5. Subscribe headlessly with payment_method_id (no Checkout redirect)
sub_resp = requests.post(f"{BASE}/subscriptions", headers=hdrs, json={
    "plan_id": 123,
    "payment_method_id": pm_id
})

# 6. Generate content using existing APIs with the api_key from step 2
gen_resp = requests.post("https://modelslab.com/api/v6/images/text2img", json={
    "key": api_key,
    "model_id": "flux-dev",
    "prompt": "A sunset over mountains",
    "width": 1024,
    "height": 1024
})

MCP サーバーへのアクセス

これらと同じ機能は、Agent Control Plane の MCP サーバーからも利用できます。

  • URL:https://modelslab.com/mcp/agents
  • 認証:Authorization: Bearer <token>
  • ツール:agent-auth、agent-tokens、agent-profile、agent-api-keys、agent-teams

参照先:https://docs.modelslab.com/mcp-web-api/agent-control-plane

API エンドポイントのリファレンス

MethodEndpointDescription
POST/auth/signupアカウントを作成
POST/auth/loginベアラートークンを取得
POST/auth/verify-emailコードを使用してメールアドレスを確認(ヘッドレス)
POST/auth/refreshアクセストークンを更新/ローテーション
POST/auth/logout現在のトークンを無効化
POST/auth/logout-allすべてのトークンを無効化
POST/auth/forgot-passwordリセット用メールをリクエスト
POST/auth/reset-passwordトークンを使用してリセット
POST/auth/resend-verification確認メールを再送信
GET/auth/tokens有効なトークンを一覧表示
DELETE/auth/tokens/{id}指定したトークンを無効化
POST/auth/tokens/revoke-othersほかのトークンを無効化
POST/auth/switch-accountチームのコンテキストを切り替え
GET/meプロフィールを取得
PATCH/meプロフィールを更新
PATCH/me/passwordパスワードを変更
PATCH/me/socialsソーシャルリンクを更新
PATCH/me/preferences設定を更新
GET/api-keysAPI キーを一覧表示
POST/api-keysAPI キーを作成
GET/api-keys/{id}API キーを取得
PUT/api-keys/{id}API キーを更新
DELETE/api-keys/{id}API キーを削除
GET/teamsチームメンバーを一覧表示
POST/teamsメンバーを招待
GET/teams/{id}メンバーの詳細を取得
PUT/teams/{id}メンバーを更新
DELETE/teams/{id}メンバーを削除
POST/teams/{id}/resend-invite招待を再送信
POST/teams/invitations/{id}/accept招待を承認

ベストプラクティス

1. トークンを安全に保管する
import os
# Use environment variables, not hardcoded values
token = os.getenv("MODELSLAB_AGENT_TOKEN")
2. トークンの有効期限を適切に利用する
# Short-lived for CI/CD
login(email, password, token_expiry="1_week")

# Long-lived for persistent agents
login(email, password, token_expiry="never")
3. 内容がわかりやすい API キーを作成する
create_api_key(token, "staging-backend", notes="Used by staging environment")
create_api_key(token, "ci-tests", notes="Used by GitHub Actions")
4. 古いトークンを削除する
# Revoke all other tokens when rotating
revoke_other_tokens(token)

リソース

関連スキル

  • modelslab-billing-subscriptions - 請求、ウォレット、サブスクリプションの管理
  • modelslab-model-discovery - モデルの検索と使用状況の分析
  • modelslab-training - モデルのトレーニングとファインチューニング
  • modelslab-servers - 専用 GPU サーバーのデプロイ
  • modelslab-image-generation - 画像生成に API キーを使用

コメント