Skip to main content
Glama

Save a portfolio from explicit holdings

create_portfolio_from_positions

Persist exact tickers and weights as a reviewable paper-portfolio draft without re-picking tickers. Review and accept or discard.

Instructions

Use when YOU (or the user) have ALREADY decided the exact holdings and want them saved as-is — e.g. after researching and settling on a specific basket with target weights. Persists a REVIEWABLE paper-portfolio draft built from the tickers you supply, sized by weight (percent) or by explicit USD amount. Unlike create_portfolio_draft this does NOT use the LLM and NEVER re-selects tickers: your basket lands exactly as given. Like the other draft tools it is available to signed-in free accounts within daily usage limits and portfolio capacity, and needs OAuth with the write:drafts scope. DRAFT-ONLY: the draft is saved to the user's Bullrun account and appears in the Portfolio tab under "Pending AI drafts", where the user reviews it and explicitly accepts it (creating a NEW portfolio) or discards it — it never changes any live position. Tickers must exist in Bullrun's priced stock/ETF universe; any that cannot be priced are returned in unresolved and skipped (use search_etfs / get_etf_snapshot / screen_stocks / get_stock_metrics to confirm exact tickers first). For a vague brief where the model should pick, use create_portfolio_draft instead.

Input Schema

NameRequiredDescriptionDefault
nameNoPortfolio name. Default "Custom Portfolio Draft".
cashPctNoExplicit cash percentage to hold back. Overrides the weight-remainder rule.
positionsYesThe exact holdings to persist (1-30). Tickers are used verbatim, never re-selected.
startingCashNoTotal portfolio cash in USD. Default 10000 in weight mode; the sum of amounts in amount mode.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv0.7.0

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnly=false, destructive=false, openWorld=false) by disclosing the full lifecycle: draft is saved to the Bullrun account, appears under "Pending AI drafts", requires explicit user acceptance to create a NEW portfolio, and never mutates live positions. It also names the OAuth scope (write:drafts) and the free-tier daily limits and portfolio-capacity constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the triggering condition and the sibling contrast, so the most decision-relevant content lands first. It is a dense block of several long clauses (auth scope, draft lifecycle, ticker resolution) that could be split for scanability, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write tool with no output schema, the description covers the important unknowns: what gets created, where it appears, that it is inert until accepted, and that unpriceable tickers come back in `unresolved` and are skipped. It stops short of describing the rest of the successful response (e.g. the draft identifier), which leaves a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents name, cashPct, weights, amounts, and startingCash in detail. The description reinforces the weight-vs-USD sizing choice and adds the universe constraint, but that is largely restatement rather than new parameter meaning — baseline 3 is appropriate when the schema carries the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — persists a reviewable paper-portfolio draft built from tickers the caller supplies — and immediately contrasts it with create_portfolio_draft ("does NOT use the LLM and NEVER re-selects tickers"). An agent can distinguish this from the vague-brief sibling without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger condition ("when YOU (or the user) have ALREADY decided the exact holdings"), names the counter-case and the alternative tool ("For a vague brief where the model should pick, use create_portfolio_draft instead"), and even routes ticker verification to search_etfs / screen_stocks first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.