setup-credentials
エージェントの設定に必要な認証情報を確認し、不足している場合はユーザーから収集して、安全な場所に保管することで、エージェントがスムーズに利用開始できるようにするSkill。
📜 元の英語説明(参考)
Set up and install credentials for an agent. Detects missing credentials from agent config, collects them from the user, and stores them securely in the encrypted credential store at ~/.hive/credentials.
🇯🇵 日本人クリエイター向け解説
エージェントの設定に必要な認証情報を確認し、不足している場合はユーザーから収集して、安全な場所に保管することで、エージェントがスムーズに利用開始できるようにするSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o setup-credentials.zip https://jpskill.com/download/9613.zip && unzip -o setup-credentials.zip && rm setup-credentials.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/9613.zip -OutFile "$d\setup-credentials.zip"; Expand-Archive "$d\setup-credentials.zip" -DestinationPath $d -Force; ri "$d\setup-credentials.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
setup-credentials.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
setup-credentialsフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
資格情報の設定
複数の認証オプションを持つエージェントのためのインタラクティブな資格情報設定です。何が不足しているかを検出し、認証方法の選択肢を提供し、ヘルスチェックで検証し、資格情報を安全に保存します。
どのような時に使うか
- エージェントを初めて実行またはテストする前
AgentRunner.run()が "missing required credentials" で失敗した場合- ユーザーがエージェントの資格情報を設定するように依頼した場合
- APIキーを必要とするツールを使用する新しいエージェントを構築した後
ワークフロー
ステップ 1: エージェントの特定
資格情報を必要とするエージェントを特定します。ユーザーは次のいずれかを行います。
- エージェントを直接指定する (例: "hubspot-agent の資格情報を設定する")
- エージェントのディレクトリを開いている (エージェントのディレクトリについて
exports/を確認する) - 現在のセッションでエージェントを操作している
exports/{agent_name}/ の下にあるエージェントのディレクトリを探します。
ステップ 2: 必要な資格情報の検出
エージェントの設定を読み取り、どのツールとノードタイプを使用しているかを判断します。
from core.framework.runner import AgentRunner
runner = AgentRunner.load("exports/{agent_name}")
validation = runner.validate()
# validation.missing_credentials には環境変数名が含まれています
# validation.warnings にはヘルプ URL を含む詳細なメッセージが含まれています
または、資格情報ストアを直接確認します。
from core.framework.credentials import CredentialStore
# 暗号化されたストレージを使用します (デフォルト: ~/.hive/credentials)
store = CredentialStore.with_encrypted_storage()
# 利用可能なものを確認します
available = store.list_credentials()
print(f"Available credentials: {available}")
# 特定の資格情報が存在するかどうかを確認します
if store.is_available("hubspot"):
print("HubSpot credential found")
else:
print("HubSpot credential missing")
既知のすべての資格情報仕様 (ヘルプ URL と設定手順用) を表示するには:
from aden_tools.credentials import CREDENTIAL_SPECS
for name, spec in CREDENTIAL_SPECS.items():
print(f"{name}: env_var={spec.env_var}, aden={spec.aden_supported}")
ステップ 3: 不足している資格情報ごとに認証オプションを提示する
不足している資格情報ごとに、利用可能な認証方法を確認します。
from aden_tools.credentials import CREDENTIAL_SPECS
spec = CREDENTIAL_SPECS.get("hubspot")
if spec:
# 利用可能な認証オプションを決定します
auth_options = []
if spec.aden_supported:
auth_options.append("aden")
if spec.direct_api_key_supported:
auth_options.append("direct")
auth_options.append("custom") # 常に利用可能
# 設定情報を取得します
setup_info = {
"env_var": spec.env_var,
"description": spec.description,
"help_url": spec.help_url,
"api_key_instructions": spec.api_key_instructions,
}
AskUserQuestion を使用して、利用可能なオプションを提示します。
HUBSPOT_ACCESS_TOKEN の設定方法を選択してください:
1) Aden Authorization Server (推奨)
integration.adenhq.com を介したセキュアな OAuth2 フロー
- 自動トークン更新による迅速な設定
- APIキーを手動で管理する必要はありません
2) Direct API Key
独自の APIキーを手動で入力します
- HubSpot Private App の作成が必要です
- スコープと権限を完全に制御できます
3) Custom Credential Store (高度)
CI/CD のためのプログラムによる設定
- 自動デプロイメント用
- 手動 API 呼び出しが必要です
ステップ 4: ユーザーの選択に基づいて認証フローを実行する
オプション 1: Aden Authorization Server
これは、サポートされている統合 (HubSpot など) に推奨されるフローです。
Aden OAuth の仕組み:
ADEN_API_KEY は、Aden のプラットフォームで OAuth 認証を既に完了しているユーザーを表します。ユーザーが Aden にサインアップして統合を接続すると、それらの OAuth トークンはサーバー側に保存されます。ADEN_API_KEY を持つことは、次のことを意味します。
- ユーザーは Aden アカウントを持っている
- ユーザーは Aden で OAuth を介して統合 (HubSpot など) を既に承認している
- これらの資格情報をローカルの資格情報ストアに同期するだけでよい
4.1a. ADEN_API_KEY の確認
import os
aden_key = os.environ.get("ADEN_API_KEY")
設定されていない場合は、Aden から取得するようにユーザーを誘導します (ここで OAuth を実行します)。
from aden_tools.credentials import open_browser, get_aden_setup_url
# Aden でブラウザを開きます - ユーザーはサインアップしてそこで統合を接続します
url = get_aden_setup_url() # https://integration.adenhq.com/setup
success, msg = open_browser(url)
print("Aden にサインインして、統合 (HubSpot など) を接続してください。")
print("完了したら、APIキーをコピーしてここに戻ってください。")
ユーザーに、受け取った ADEN_API_KEY を提供するように依頼します。
4.1b. ADEN_API_KEY をシェル設定に保存する
ユーザーの承認を得て、ADEN_API_KEY をシェル設定に保持します。
from aden_tools.credentials import (
detect_shell,
add_env_var_to_shell_config,
get_shell_source_command,
)
shell_type = detect_shell() # 'bash', 'zsh', または 'unknown'
# シェル設定を変更する前にユーザーに承認を求めます
# 承認された場合:
success, config_path = add_env_var_to_shell_config(
"ADEN_API_KEY",
user_provided_key,
comment="Aden authorization server API key"
)
if success:
source_cmd = get_shell_source_command()
print(f"Saved to {config_path}")
print(f"Run: {source_cmd}")
フレームワーク用に ~/.hive/configuration.json にも保存します。
import json
from pathlib import Path
config_path = Path.home() / ".hive" / "configuration.json"
config = json.loads(config_path.read_text()) if config_path.exists() else {}
config["aden"] = {
"api_key_configured": True,
"api_url": "https://api.adenhq.com"
}
config_path.parent.mkdir(parents=True, exist_ok=True)
config_path.write_text(json.dumps(config, indent=2))
4.1c. Aden サーバーから資格情報を同期する
ユーザーは Aden で統合を既に承認しているので、ワンライナーのファクトリメソッドを使用します。
from core.framework.credentials import CredentialStore
# この単一の呼び出しですべてを処理します。
# - ~/.hive/credentials に暗号化されたローカルストレージを作成します
# - ADEN_API_KEY 環境変数から Aden クライアントを設定します
# - すべてを同期します
(原文はここで切り詰められています) 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Setup Credentials
Interactive credential setup for agents with multiple authentication options. Detects what's missing, offers auth method choices, validates with health checks, and stores credentials securely.
When to Use
- Before running or testing an agent for the first time
- When
AgentRunner.run()fails with "missing required credentials" - When a user asks to configure credentials for an agent
- After building a new agent that uses tools requiring API keys
Workflow
Step 1: Identify the Agent
Determine which agent needs credentials. The user will either:
- Name the agent directly (e.g., "set up credentials for hubspot-agent")
- Have an agent directory open (check
exports/for agent dirs) - Be working on an agent in the current session
Locate the agent's directory under exports/{agent_name}/.
Step 2: Detect Required Credentials
Read the agent's configuration to determine which tools and node types it uses:
from core.framework.runner import AgentRunner
runner = AgentRunner.load("exports/{agent_name}")
validation = runner.validate()
# validation.missing_credentials contains env var names
# validation.warnings contains detailed messages with help URLs
Alternatively, check the credential store directly:
from core.framework.credentials import CredentialStore
# Use encrypted storage (default: ~/.hive/credentials)
store = CredentialStore.with_encrypted_storage()
# Check what's available
available = store.list_credentials()
print(f"Available credentials: {available}")
# Check if specific credential exists
if store.is_available("hubspot"):
print("HubSpot credential found")
else:
print("HubSpot credential missing")
To see all known credential specs (for help URLs and setup instructions):
from aden_tools.credentials import CREDENTIAL_SPECS
for name, spec in CREDENTIAL_SPECS.items():
print(f"{name}: env_var={spec.env_var}, aden={spec.aden_supported}")
Step 3: Present Auth Options for Each Missing Credential
For each missing credential, check what authentication methods are available:
from aden_tools.credentials import CREDENTIAL_SPECS
spec = CREDENTIAL_SPECS.get("hubspot")
if spec:
# Determine available auth options
auth_options = []
if spec.aden_supported:
auth_options.append("aden")
if spec.direct_api_key_supported:
auth_options.append("direct")
auth_options.append("custom") # Always available
# Get setup info
setup_info = {
"env_var": spec.env_var,
"description": spec.description,
"help_url": spec.help_url,
"api_key_instructions": spec.api_key_instructions,
}
Present the available options using AskUserQuestion:
Choose how to configure HUBSPOT_ACCESS_TOKEN:
1) Aden Authorization Server (Recommended)
Secure OAuth2 flow via integration.adenhq.com
- Quick setup with automatic token refresh
- No need to manage API keys manually
2) Direct API Key
Enter your own API key manually
- Requires creating a HubSpot Private App
- Full control over scopes and permissions
3) Custom Credential Store (Advanced)
Programmatic configuration for CI/CD
- For automated deployments
- Requires manual API calls
Step 4: Execute Auth Flow Based on User Choice
Option 1: Aden Authorization Server
This is the recommended flow for supported integrations (HubSpot, etc.).
How Aden OAuth Works:
The ADEN_API_KEY represents a user who has already completed OAuth authorization on Aden's platform. When users sign up and connect integrations on Aden, those OAuth tokens are stored server-side. Having an ADEN_API_KEY means:
- User has an Aden account
- User has already authorized integrations (HubSpot, etc.) via OAuth on Aden
- We just need to sync those credentials down to the local credential store
4.1a. Check for ADEN_API_KEY
import os
aden_key = os.environ.get("ADEN_API_KEY")
If not set, guide user to get one from Aden (this is where they do OAuth):
from aden_tools.credentials import open_browser, get_aden_setup_url
# Open browser to Aden - user will sign up and connect integrations there
url = get_aden_setup_url() # https://integration.adenhq.com/setup
success, msg = open_browser(url)
print("Please sign in to Aden and connect your integrations (HubSpot, etc.).")
print("Once done, copy your API key and return here.")
Ask user to provide the ADEN_API_KEY they received.
4.1b. Save ADEN_API_KEY to Shell Config
With user approval, persist ADEN_API_KEY to their shell config:
from aden_tools.credentials import (
detect_shell,
add_env_var_to_shell_config,
get_shell_source_command,
)
shell_type = detect_shell() # 'bash', 'zsh', or 'unknown'
# Ask user for approval before modifying shell config
# If approved:
success, config_path = add_env_var_to_shell_config(
"ADEN_API_KEY",
user_provided_key,
comment="Aden authorization server API key"
)
if success:
source_cmd = get_shell_source_command()
print(f"Saved to {config_path}")
print(f"Run: {source_cmd}")
Also save to ~/.hive/configuration.json for the framework:
import json
from pathlib import Path
config_path = Path.home() / ".hive" / "configuration.json"
config = json.loads(config_path.read_text()) if config_path.exists() else {}
config["aden"] = {
"api_key_configured": True,
"api_url": "https://api.adenhq.com"
}
config_path.parent.mkdir(parents=True, exist_ok=True)
config_path.write_text(json.dumps(config, indent=2))
4.1c. Sync Credentials from Aden Server
Since the user has already authorized integrations on Aden, use the one-liner factory method:
from core.framework.credentials import CredentialStore
# This single call handles everything:
# - Creates encrypted local storage at ~/.hive/credentials
# - Configures Aden client from ADEN_API_KEY env var
# - Syncs all credentials from Aden server automatically
store = CredentialStore.with_aden_sync(
base_url="https://api.adenhq.com",
auto_sync=True, # Syncs on creation
)
# Check what was synced
synced = store.list_credentials()
print(f"Synced credentials: {synced}")
# If the required credential wasn't synced, the user hasn't authorized it on Aden yet
if "hubspot" not in synced:
print("HubSpot not found in your Aden account.")
print("Please visit https://integration.adenhq.com to connect HubSpot, then try again.")
For more control over the sync process:
from core.framework.credentials import CredentialStore
from core.framework.credentials.aden import (
AdenCredentialClient,
AdenClientConfig,
AdenSyncProvider,
)
# Create client (API key loaded from ADEN_API_KEY env var)
client = AdenCredentialClient(AdenClientConfig(
base_url="https://api.adenhq.com",
))
# Create provider and store
provider = AdenSyncProvider(client=client)
store = CredentialStore.with_encrypted_storage()
# Manual sync
synced_count = provider.sync_all(store)
print(f"Synced {synced_count} credentials from Aden")
4.1d. Run Health Check
from aden_tools.credentials import check_credential_health
# Get the token from the store
cred = store.get_credential("hubspot")
token = cred.keys["access_token"].value.get_secret_value()
result = check_credential_health("hubspot", token)
if result.valid:
print("HubSpot credentials validated successfully!")
else:
print(f"Validation failed: {result.message}")
# Offer to retry the OAuth flow
Option 2: Direct API Key
For users who prefer manual API key management.
4.2a. Show Setup Instructions
from aden_tools.credentials import CREDENTIAL_SPECS
spec = CREDENTIAL_SPECS.get("hubspot")
if spec and spec.api_key_instructions:
print(spec.api_key_instructions)
# Output:
# To get a HubSpot Private App token:
# 1. Go to HubSpot Settings > Integrations > Private Apps
# 2. Click "Create a private app"
# 3. Name your app (e.g., "Hive Agent")
# ...
if spec and spec.help_url:
print(f"More info: {spec.help_url}")
4.2b. Collect API Key from User
Use AskUserQuestion to securely collect the API key:
Please provide your HubSpot access token:
(This will be stored securely in ~/.hive/credentials)
4.2c. Run Health Check Before Storing
from aden_tools.credentials import check_credential_health
result = check_credential_health("hubspot", user_provided_token)
if not result.valid:
print(f"Warning: {result.message}")
# Ask user if they want to:
# 1. Try a different token
# 2. Continue anyway (not recommended)
4.2d. Store in Encrypted Credential Store
from core.framework.credentials import CredentialStore, CredentialObject, CredentialKey
from pydantic import SecretStr
store = CredentialStore.with_encrypted_storage()
cred = CredentialObject(
id="hubspot",
name="HubSpot Access Token",
keys={
"access_token": CredentialKey(
name="access_token",
value=SecretStr(user_provided_token),
)
},
)
store.save_credential(cred)
4.2e. Export to Current Session
export HUBSPOT_ACCESS_TOKEN="the-value"
Option 3: Custom Credential Store (Advanced)
For programmatic/CI/CD setups.
4.3a. Show Documentation
For advanced credential management, you can use the CredentialStore API directly:
from core.framework.credentials import CredentialStore, CredentialObject, CredentialKey
from pydantic import SecretStr
store = CredentialStore.with_encrypted_storage()
cred = CredentialObject(
id="hubspot",
name="HubSpot Access Token",
keys={"access_token": CredentialKey(name="access_token", value=SecretStr("..."))}
)
store.save_credential(cred)
For CI/CD environments:
- Set HIVE_CREDENTIAL_KEY for encryption
- Pre-populate ~/.hive/credentials programmatically
- Or use environment variables directly (HUBSPOT_ACCESS_TOKEN)
Documentation: See core/framework/credentials/README.md
Step 5: Record Configuration Method
Track which auth method was used for each credential in ~/.hive/configuration.json:
import json
from pathlib import Path
from datetime import datetime
config_path = Path.home() / ".hive" / "configuration.json"
config = json.loads(config_path.read_text()) if config_path.exists() else {}
if "credential_methods" not in config:
config["credential_methods"] = {}
config["credential_methods"]["hubspot"] = {
"method": "aden", # or "direct" or "custom"
"configured_at": datetime.now().isoformat(),
}
config_path.write_text(json.dumps(config, indent=2))
Step 6: Verify All Credentials
Run validation again to confirm everything is set:
runner = AgentRunner.load("exports/{agent_name}")
validation = runner.validate()
assert not validation.missing_credentials, "Still missing credentials!"
Report the result to the user.
Health Check Reference
Health checks validate credentials by making lightweight API calls:
| Credential | Endpoint | What It Checks |
|---|---|---|
hubspot |
GET /crm/v3/objects/contacts?limit=1 |
Bearer token validity, CRM scopes |
brave_search |
GET /res/v1/web/search?q=test&count=1 |
API key validity |
from aden_tools.credentials import check_credential_health, HealthCheckResult
result: HealthCheckResult = check_credential_health("hubspot", token_value)
# result.valid: bool
# result.message: str
# result.details: dict (status_code, rate_limited, etc.)
Encryption Key (HIVE_CREDENTIAL_KEY)
The encrypted credential store requires HIVE_CREDENTIAL_KEY to encrypt/decrypt credentials.
- If the user doesn't have one,
EncryptedFileStoragewill auto-generate one and log it - The user MUST persist this key (e.g., in
~/.bashrcor a secrets manager) - Without this key, stored credentials cannot be decrypted
- This is the ONLY secret that should live in
~/.bashrcor environment config
If HIVE_CREDENTIAL_KEY is not set:
- Let the store generate one
- Tell the user to save it:
export HIVE_CREDENTIAL_KEY="{generated_key}" - Recommend adding it to
~/.bashrcor their shell profile
Security Rules
- NEVER log, print, or echo credential values in tool output
- NEVER store credentials in plaintext files, git-tracked files, or agent configs
- NEVER hardcode credentials in source code
- ALWAYS use
SecretStrfrom Pydantic when handling credential values in Python - ALWAYS use the encrypted credential store (
~/.hive/credentials) for persistence - ALWAYS run health checks before storing credentials (when possible)
- ALWAYS verify credentials were stored by re-running validation, not by reading them back
- When modifying
~/.bashrcor~/.zshrc, confirm with the user first
Credential Sources Reference
All credential specs are defined in tools/src/aden_tools/credentials/:
| File | Category | Credentials | Aden Supported |
|---|---|---|---|
llm.py |
LLM Providers | anthropic |
No |
search.py |
Search Tools | brave_search, google_search, google_cse |
No |
integrations.py |
Integrations | hubspot |
Yes |
Note: Additional LLM providers (Cerebras, Groq, OpenAI) are handled by LiteLLM via environment
variables (CEREBRAS_API_KEY, GROQ_API_KEY, OPENAI_API_KEY) but are not yet in CREDENTIAL_SPECS.
Add them to llm.py as needed.
To check what's registered:
from aden_tools.credentials import CREDENTIAL_SPECS
for name, spec in CREDENTIAL_SPECS.items():
print(f"{name}: aden={spec.aden_supported}, direct={spec.direct_api_key_supported}")
Migration: CredentialManager → CredentialStore
CredentialManager is deprecated. Use CredentialStore instead.
| Old (Deprecated) | New (Recommended) |
|---|---|
CredentialManager() |
CredentialStore.with_encrypted_storage() |
creds.get("hubspot") |
store.get("hubspot") or store.get_key("hubspot", "access_token") |
creds.validate_for_tools(tools) |
Use store.is_available(cred_id) per credential |
creds.get_auth_options("hubspot") |
Check CREDENTIAL_SPECS["hubspot"].aden_supported |
creds.get_setup_instructions("hubspot") |
Access CREDENTIAL_SPECS["hubspot"] directly |
Why migrate?
- CredentialStore supports encrypted storage, multi-key credentials, template resolution, and automatic token refresh
- CredentialManager only reads from environment variables and .env files (no encryption, no refresh)
- CredentialStoreAdapter exists for backward compatibility during migration
# Old way (deprecated)
from aden_tools.credentials import CredentialManager
creds = CredentialManager()
token = creds.get("hubspot")
# New way (recommended)
from core.framework.credentials import CredentialStore
store = CredentialStore.with_encrypted_storage()
token = store.get("hubspot")
# With Aden sync (recommended for OAuth integrations)
store = CredentialStore.with_aden_sync()
token = store.get_key("hubspot", "access_token")
Example Session
User: /setup-credentials for my hubspot-agent
Agent: Let me check what credentials your hubspot-agent needs.
[Runs validation, finds ANTHROPIC_API_KEY and HUBSPOT_ACCESS_TOKEN missing]
Agent: Your hubspot-agent requires 2 credentials:
1. ANTHROPIC_API_KEY - Anthropic API key for LLM calls
2. HUBSPOT_ACCESS_TOKEN - HubSpot access token
Let's set these up one at a time.
--- Setting up ANTHROPIC_API_KEY ---
This credential only supports direct API key entry.
[Shows instructions for getting Anthropic API key]
[AskUserQuestion: "Please provide your Anthropic API key:"]
[User provides key]
[Stores in credential store, exports to env]
--- Setting up HUBSPOT_ACCESS_TOKEN ---
[AskUserQuestion with 3 options]
Choose how to configure HUBSPOT_ACCESS_TOKEN:
1) Aden Authorization Server (Recommended)
2) Direct API Key
3) Custom Credential Store (Advanced)
User: 1 (Aden)
Agent: Great! Let me check if you have an Aden API key configured...
[Checks for ADEN_API_KEY, not found]
[Opens browser to integration.adenhq.com/setup]
Agent: I've opened Aden's setup page. Please:
1. Sign in or create an account
2. Connect your HubSpot account (OAuth happens on Aden's site)
3. Copy the API key shown after setup
[AskUserQuestion: "Please provide your Aden API key:"]
[User provides key]
Agent: Would you like me to save this to your shell config (~/.zshrc) for future sessions?
[User approves]
[Saves to ~/.zshrc and ~/.hive/configuration.json]
Agent: Let me sync your credentials from Aden...
[Syncs credentials from Aden server - OAuth already done on Aden's side]
[Runs health check]
Agent: HubSpot credentials validated successfully!
All credentials are now configured:
- ANTHROPIC_API_KEY: Stored in encrypted credential store
- HUBSPOT_ACCESS_TOKEN: Synced from Aden (OAuth completed on Aden)
- Validation passed - your agent is ready to run!