← Files StockLensARCHIVED FILE
.codex-plugin/plugin.json
12.1 KB · Nov 3, 2026 · 18:16 UTC
{
"author": {
"name": "Stock Lens Inc."
},
"description": "Nightly stock scores, on-demand analyses, portfolio summaries, and stock discovery. Not investment advice.",
"mcpServers": "./.mcp.json",
"interface": {
"capabilities": [],
"category": "Finance",
"defaultPrompt": [
"Summarize NVDA using the latest scores",
"Add Google to my StockLens portfolio and tell me how everything in it scored",
"Show me the 5 highest-scored Technology stocks on NASDAQ from last night's run"
],
"developerName": "Stock Lens Inc.",
"displayName": "StockLens",
"longDescription": "StockLens scores stocks every night across five domains: Fundamental, Technical, Risk, Sentiment and Macro. Every score, explained.\n\nSee what sits behind a company's score. Ask about one and get:\n- its latest composite score and rating, with the five domain scores behind it\n- the named signals that most shaped the reading (up to three, each with its evidence), the business-model lens where one applies, and any domain that was not scored in it\n- the same read for each company you name, to compare them\n\nFind your next idea instead of checking one ticker at a time. Discover Stocks screens the companies StockLens scores:\n- filter by region, exchange, sector, industry, market cap or volume\n- sort by market cap, volume, ticker or a StockLens score (the composite or any one domain), highest or lowest first\n\nPut a whole portfolio through StockLens and see where it stands. Ask for it by name, or for your default, and get:\n- the portfolio's average score and rating across the companies you follow, beside each company's own score and rating\n- how that average has changed over 7 and 30 nights, flagged if StockLens changed its scoring method in that window\n- the biggest movers over the last 7 nights, each with a driver of its latest reading where one exists\n- the largest sector in it, counted by company rather than by money\n\nThe average counts every company equally, holding or watching, with no position sizes or money. Companies not rescored in 7 nights are flagged and left out of the average, and funds are listed, not scored.\n\nAdd or remove companies by asking, or add a list of up to 100 after a preview you approve.\n\nWhen one company matters most, start a full analysis on demand and get:\n- the composite and rating, how much evidence stood behind it (Full, Core or Low), and each domain's score, grade and contribution\n- written summaries for each domain and an overall synthesis\n- a saved report on stocklens.com, with factor values and peer context where available\n\nStockLens scores listings nightly on 23 exchanges in North America, Europe and Asia-Pacific; not every listed company is scored, and macro context is drawn from the United States, Canada, the eurozone, the United Kingdom, Switzerland and Japan. It does not score ETFs, funds, indices, options or currencies. Without an account, scores answer for the 600 largest companies by market value; a signed-in account also reaches any company in its own portfolios. Every score carries the date it was computed.\n\nSign in with your StockLens account for analyses, screening and portfolios. StockLens never places a trade. For informational and educational purposes only, not investment advice.",
"privacyPolicyURL": "https://stocklens.com/privacy-policy",
"shortDescription": "Stock picking intelligence",
"supportURL": "https://stocklens.com/contact-us",
"termsOfServiceURL": "https://stocklens.com/terms-conditions",
"websiteURL": "https://stocklens.com",
"logo": "./assets/stocklens-icon.jpg",
"composerIcon": "./assets/stocklens-icon.jpg"
},
"name": "app-6a383168e69881918059edd89ef27451",
"version": "1.4.0",
"extensions": {
"com.openai": {
"review": {
"test_cases": {
"positive": [
{
"description": "Public latest-score lookup with explicit exchange and no changing-value assertions.",
"prompt": "Using StockLens, summarize AAPL on NASDAQ from the latest nightly scores. Do not start a new analysis.",
"tools_triggered": "get_market_summary",
"expected_behavior": "Calls get_market_summary once with ticker=AAPL, exchange=NASDAQ. Returns status=scored, ticker/exchange, a numeric composite_score, rating, domain_scores, analysis_date, freshness and config_context. A non-scored status is an answer, never an error. No fixed values asserted; initiate_analysis not called."
},
{
"description": "TSLA Plus Analysis receipt followed by exactly one result fetch; validates cross-tool analysis ID handoff without polling.",
"prompt": "Use StockLens to start or reuse one Plus Analysis for TSLA on NASDAQ, then fetch that exact analysis once; do not wait or poll again.",
"tools_triggered": "initiate_analysis, fetch_analysis_result",
"expected_behavior": "Calls initiate_analysis once (TSLA, NASDAQ, depth=plus): nonempty analysis_id, credit_type=LENS_AI_PLUS, explicit new_run_started and reused_existing. Then calls fetch_analysis_result once with that id: complete with the result, or in_progress with progress_pct and retry_after_seconds."
},
{
"description": "Add a company to a named non-default portfolio, then read that portfolio; validates portfolio_name on both tools and that the write names where the company went.",
"prompt": "Use StockLens to add GOOGL to my Growth ideas portfolio, then show me how that portfolio scored last night.",
"tools_triggered": "add_to_watchlist, get_portfolio_insights",
"expected_behavior": "Calls add_to_watchlist once (GOOGL, portfolio_name Growth ideas): status added, or already_in_portfolio (relayed; no retry), naming Growth ideas. Then calls get_portfolio_insights once for Growth ideas: GOOGL listed with its mode, company_count and as_of. No price or plan language."
},
{
"description": "Add a list in two calls: a preview that adds nothing, then a commit of the approved rows bound to that preview; validates the batch relay and that no row is added unpreviewed.",
"prompt": "Use StockLens to add AMZN, NFLX and NVDA to my portfolio. Preview the list first, then add every row that can be added without asking me again.",
"tools_triggered": "add_to_watchlist_batch",
"expected_behavior": "Calls add_to_watchlist_batch with confirm=false (AMZN, NFLX, NVDA): status previewed, preview_id, summary_line. Then, if any row is addable, calls it once with confirm=true, that preview_id, the same rows and those indexes: status committed. A row already in the portfolio answers already_in_portfolio. No row is added unpreviewed."
},
{
"description": "Filtered multi-stock ranking request, runnable on the reviewer account.",
"prompt": "Use StockLens to show me the 5 highest-scored Technology stocks listed on NASDAQ from last night's run.",
"tools_triggered": "discover_stocks",
"expected_behavior": "Calls discover_stocks once with sector_in=[TECHNOLOGY], exchange_in=[NASDAQ], sort_by=composite_score, direction=top, limit=5. Returns status=ranked, scores_locked=false and up to 5 rows. Every ticker, score, and rank shown must appear verbatim in the tool's structured result, ranks 1-5 following array position."
}
],
"negative": [
{
"description": "Out-of-domain weather request should not trigger StockLens because none of its tools provide weather data.",
"prompt": "What is the weather in New York?",
"expected_behavior": "Do not call any StockLens tool because StockLens has no weather capability. Respond without StockLens or explain that this app cannot answer weather questions."
},
{
"description": "Unsupported destructive account-management request must not be mapped to an analysis or read tool.",
"prompt": "Use StockLens to permanently delete my StockLens account and all stored data now.",
"expected_behavior": "Do not call any StockLens tool. Explain that the available StockLens tools cannot delete accounts or stored data, do not claim the deletion was performed, and direct the user to StockLens support or its account-management channel if they want to continue."
},
{
"description": "A trade-execution request must not be backfilled with a fabricated trade confirmation or ranking.",
"prompt": "Buy 10 shares of whatever StockLens ranks number one today.",
"expected_behavior": "StockLens places no trades. The assistant may call discover_stocks to name the top-ranked company, but must say StockLens cannot buy shares, and must not claim a purchase, show a trade confirmation, or invent a ticker or a StockLens score."
}
]
},
"commerce": false,
"commerce_description": "The app sells nothing and shows no prices. When a limit is reached, the tool result says it is the limit on the person's current plan and \"To change your plan, visit stocklens.com/pricing.\", an informational page describing the plans that starts no checkout. No tool message names a plan or makes an upgrade pitch, and the app links no checkout or upgrade page."
},
"publication": {
"release_notes": "Changed: the listing now states what StockLens scores and where, the date every score carries, and which companies answer without an account. No tool message names a plan, and a reached limit says it is the limit on the person's current plan and points to the plans page on stocklens.com.\n\nGet Company Score (get_market_summary) now answers every question with a status. A company outside what the person's plan reaches, a listing StockLens does not score, a name that matches more than one company and a ticker StockLens does not recognise are answers with a sentence to relay and a next step, not errors. A scored answer says how fresh it is and, when another listing of the company was served, which one. It names the signals that most shaped the reading (up to three, each with its evidence), the business-model lens where one applies, the domains that were not scored and the Sentiment evidence StockLens could not read. Ask StockLens to compare companies you name and it looks up each one's score, for the companies your plan reaches; a company outside that reach is named as such, never as unscored. It can offer to add a company to your portfolio or to run a fresh analysis, says when a fresh analysis uses one of your analysis credits, and does neither unless you agree.\n\nDiscover Stocks says whether the requested order was used. It sorts by market cap, volume, ticker or a StockLens score; popularity ordering is not available, and a request for it is refused with a message to choose another. Sorting by a StockLens score depends on your current plan. Fetch Analysis Result states evidence as a word and links a completed analysis to its saved report on stocklens.com.\n\nChanged: ask about any of your StockLens portfolios by name, not only the default one. Get Portfolio (get_portfolio_insights) now reads one portfolio the way stocklens.com shows it: every company in it marked holding or watching with its score and rating word, the portfolio's average and rating word, its change over 7 and 30 nights, its largest sector share and its biggest movers this week. Add to Portfolio and Remove from Portfolio (add_to_watchlist, remove_from_watchlist) take the portfolio's name too, and every answer says which portfolio it was. A company already in the portfolio, a full portfolio or a portfolio name that does not match is now an answer to relay, not an error.\n\nNew: Add Several to Portfolio (add_to_watchlist_batch) adds a list of up to 100 companies to one of your portfolios in two steps: a preview that adds nothing and says what would happen to each company, then only the ones you approve. It never records holdings or trades. The identifiers of the existing tools are unchanged."
}
}
},
"apps": "./.app.json"
}
SHA-256: 7bafad097bd8e61bb01359787412ac5dcec7661557558aa6014349a77e84cbd8