| name | user-profile |
| description | Manage user profile including watchlists, portfolio, and preferences. Also contains onboarding instructions. |
User Profile Skill
This skill provides 3 unified tools for managing user data:
get_user_data - Read user data
update_user_data - Create or update user data
remove_user_data - Delete user data
The tools are hidden by default and will be available to you after loading the skill.
To load the skill, use the LoadSkill tool with the skill name "user-profile".
You should call the tools being loaded directly instead of using ExecuteCode tool.
For first-time user setup, see onboarding.md.
Tool 1: get_user_data
Retrieve user data by entity type.
Entities
| Entity | Description | entity_id |
|---|
all | Complete user data (profile, preferences, watchlists with items, portfolio) | Not used |
profile | User info (name, timezone, locale) | Not used |
preferences | All preferences (risk, investment, agent) | Not used |
watchlists | List of all watchlists | Not used |
watchlist_items | Items in a specific watchlist | Optional watchlist_id |
portfolio | All portfolio holdings | Not used |
Examples
get_user_data(entity="all")
get_user_data(entity="profile")
get_user_data(entity="preferences")
get_user_data(entity="watchlists")
get_user_data(entity="watchlist_items")
get_user_data(entity="watchlist_items", entity_id="abc-123")
get_user_data(entity="portfolio")
Tool 2: update_user_data
Create or update user data (upsert semantics).
Common Options for Preferences
All preference entities (risk_preference, investment_preference, agent_preference) support:
| Parameter | Type | Description |
|---|
replace | bool | If True, completely replace the preference instead of merging with existing data |
The data dict also accepts extra fields like notes, instruction, avoid_sectors, etc.
update_user_data(entity="agent_preference", data={"output_style": "quick", "notes": "User prefers brevity"})
update_user_data(entity="agent_preference", data={"output_style": "deep_dive"}, replace=True)
Entity: profile
Update user profile info.
| Field | Type | Description |
|---|
name | str | Display name |
timezone | str | e.g., "America/New_York" |
locale | str | Preferred language, e.g., "en-US", "zh-CN" |
onboarding_completed | bool | Mark onboarding done (write-only, not returned in get) |
update_user_data(entity="profile", data={"name": "John Doe"})
update_user_data(entity="profile", data={"onboarding_completed": True})
Entity: risk_preference
Set risk tolerance settings.
| Field | Type | Required | Description |
|---|
risk_tolerance | str | Yes | "low", "medium", "high", "long_term_focus" |
update_user_data(
entity="risk_preference",
data={"risk_tolerance": "medium"}
)
update_user_data(
entity="risk_preference",
data={"risk_tolerance": "long_term_focus"}
)
Entity: investment_preference
Set investment style settings. At least one field is required.
| Field | Type | Required | Description |
|---|
company_interest | str | No* | "growth", "stable", "value", "esg" |
holding_period | str | No* | "short_term", "mid_term", "long_term", "flexible" |
analysis_focus | str | No* | "growth", "valuation", "moat", "risk" |
*At least one field must be provided.
update_user_data(
entity="investment_preference",
data={"company_interest": "growth"}
)
update_user_data(
entity="investment_preference",
data={
"company_interest": "value",
"holding_period": "long_term",
"analysis_focus": "moat"
}
)
Entity: agent_preference
Set agent behavior settings.
| Field | Type | Required | Description |
|---|
output_style | str | Yes | "summary", "data", "deep_dive", "quick" |
update_user_data(
entity="agent_preference",
data={"output_style": "quick"}
)
update_user_data(
entity="agent_preference",
data={"output_style": "deep_dive"}
)
Entity: watchlist
Create or update a watchlist.
| Field | Type | Required | Description |
|---|
name | str | Yes | Watchlist name (used as key for upsert) |
description | str | No | Purpose of the watchlist |
is_default | bool | No | Set as default watchlist |
update_user_data(
entity="watchlist",
data={"name": "AI Companies", "description": "Companies focused on AI"}
)
update_user_data(
entity="watchlist",
data={"name": "My Watchlist", "is_default": True}
)
Entity: watchlist_item
Add or update an item in a watchlist.
| Field | Type | Required | Description |
|---|
symbol | str | Yes | Stock symbol (used as key) |
watchlist_id | str | No | Target watchlist (uses default if omitted) |
instrument_type | str | No | "stock", "etf", "index", "crypto" (default: "stock") |
exchange | str | No | e.g., "NASDAQ" |
name | str | No | Company name |
notes | str | No | Why you're watching |
update_user_data(
entity="watchlist_item",
data={"symbol": "NVDA", "notes": "Watching for AI chip growth"}
)
update_user_data(
entity="watchlist_item",
data={
"symbol": "AAPL",
"watchlist_id": "abc-123",
"name": "Apple Inc.",
"exchange": "NASDAQ",
"notes": "iPhone revenue growth"
}
)
update_user_data(
entity="watchlist_item",
data={"symbol": "QQQ", "instrument_type": "etf", "notes": "Tech exposure"}
)
Entity: portfolio_holding
Add or update a portfolio holding.
| Field | Type | Required | Description |
|---|
symbol | str | Yes | Stock symbol (used as key) |
quantity | float | Yes | Number of shares |
average_cost | float | No | Cost per share |
account_name | str | No | e.g., "Robinhood", "Fidelity IRA" (part of key) |
instrument_type | str | No | Default: "stock" |
currency | str | No | Default: "USD" |
notes | str | No | Additional notes |
update_user_data(
entity="portfolio_holding",
data={"symbol": "AAPL", "quantity": 50, "average_cost": 175.0}
)
update_user_data(
entity="portfolio_holding",
data={
"symbol": "VTI",
"quantity": 100,
"average_cost": 220.50,
"account_name": "Fidelity 401k",
"instrument_type": "etf",
"notes": "Long-term retirement holding"
}
)
update_user_data(
entity="portfolio_holding",
data={"symbol": "MSFT", "quantity": 25, "account_name": "Robinhood"}
)
update_user_data(
entity="portfolio_holding",
data={"symbol": "MSFT", "quantity": 50, "account_name": "Schwab IRA"}
)
Tool 3: remove_user_data
Delete user data by entity type.
Entity: watchlist
Delete an entire watchlist.
| Field | Type | Required | Description |
|---|
watchlist_id | str | Either | Watchlist ID |
name | str | Either | Watchlist name |
remove_user_data(
entity="watchlist",
identifier={"watchlist_id": "abc-123"}
)
remove_user_data(
entity="watchlist",
identifier={"name": "Tech Stocks"}
)
Entity: watchlist_item
Remove an item from a watchlist.
| Field | Type | Required | Description |
|---|
symbol | str | Yes | Stock symbol |
watchlist_id | str | No | Uses default if omitted |
remove_user_data(
entity="watchlist_item",
identifier={"symbol": "NVDA"}
)
remove_user_data(
entity="watchlist_item",
identifier={"symbol": "AAPL", "watchlist_id": "abc-123"}
)
Entity: portfolio_holding
Remove a portfolio holding.
| Field | Type | Required | Description |
|---|
symbol | str | Yes | Stock symbol |
account_name | str | No | For disambiguation if same symbol in multiple accounts |
remove_user_data(
entity="portfolio_holding",
identifier={"symbol": "AAPL"}
)
remove_user_data(
entity="portfolio_holding",
identifier={"symbol": "MSFT", "account_name": "Robinhood"}
)
Conversation Tips
-
Be conversational - Don't ask all questions at once. Let the conversation flow naturally.
-
Provide context - When asking about risk tolerance, explain what each level means:
- Conservative: Prefer stability, avoid volatile stocks
- Moderate: Balance between growth and stability
- Aggressive: Willing to accept high volatility for growth potential
-
Handle partial info - If user mentions "I own some AAPL", ask follow-up:
- "How many shares do you have?"
- "What's your average cost per share?"
- "Which brokerage account is it in?"
-
Confirm entries - After saving, confirm what was added:
- "Added AAPL (50 shares @ $175) to your portfolio."
-
Use defaults - If user doesn't have a watchlist, items go to the default one automatically.
Error Handling
- If a stock is already in a watchlist, inform the user and offer alternatives
- If a holding already exists, offer to update it instead of creating a duplicate
- If user_id is not available, inform that the user needs to be logged in