Skip to main content
Glama
quality-screener

Quality Screener MCP Server

Quality Screener MCP server

A standalone Model Context Protocol (MCP) server that exposes the Quality Screener stock-screening engine as tools for AI agents (Claude, Cursor, and any other MCP client).

Once connected, an agent can screen and filter the scored universe, compute custom quality scores, inspect score history, manage saved scoring systems, and generate shareable screen links — acting as the signed-in user, against the same data they see in the web dashboard.

  • No SDK dependency. The server is a thin HTTP layer over the public Quality Screener API. It has no dependency on the backend Python package — every tool just calls a REST endpoint and returns the JSON payload.

  • Multi-tenant & credential-free. When deployed over HTTP the server stores no credentials of its own. Each request carries the caller's own access token, which the server forwards to the API, so a single public deployment can serve many users without ever acting on a shared account.


Table of contents


Related MCP server: Rozkoduj MCP

How it works

┌─────────────┐   MCP (stdio | streamable-HTTP)   ┌──────────────────┐   HTTPS   ┌──────────────────────┐
│  AI agent   │ ────────────────────────────────► │  qscreener-mcp   │ ────────► │ Quality Screener API │
│ (MCP client)│ ◄──────────────────────────────── │   (this server)  │ ◄──────── │   (FastAPI backend)  │
└─────────────┘         tool calls / JSON          └──────────────────┘  REST     └──────────────────────┘

Each MCP tool maps to one Quality Screener REST endpoint. The server attaches the caller's bearer token to every outbound request (header X-Stobot-CLI-Token, Authorization: Bearer … also accepted) and returns the decoded JSON. There is no business logic in the server itself — it is a typed, authenticated façade over the API.

It runs in two transport modes:

Transport

Use

Authentication

stdio (default)

A local agent (e.g. Claude Code) launches the server as a subprocess

Token from $QSCREENER_TOKEN or ~/.config/qscreener/credentials.json

streamable-http

A remote, externally reachable deployment (e.g. Railway)

End-to-end MCP OAuth 2.0 — the client opens the browser once, then sends the token automatically; or a per-request X-Stobot-CLI-Token header

Over HTTP the MCP endpoint is served at /mcp.


Quick start (remote)

The easiest way to use the server is to point your MCP client at the hosted deployment. No token to copy — the client triggers a browser sign-in on first connect:

{
  "mcpServers": {
    "qscreener": {
      "type": "streamable-http",
      "url": "https://mcp.qualityscreener.io/mcp"
    }
  }
}

On first use your browser opens the Quality Screener sign-in page. Approve once, and the agent stays connected. You need a Quality Screener account; the agent inherits exactly your access.


Running locally

Requires uv.

# Install dependencies
uv sync

# stdio — for a local agent that launches this as a subprocess
uv run qscreener-mcp

# streamable-HTTP — mirrors the remote deployment
QSCREENER_MCP_TRANSPORT=streamable-http QSCREENER_MCP_PORT=8080 \
  QSCREENER_API_URL=http://localhost:8001 \
  uv run qscreener-mcp
# -> MCP endpoint at http://localhost:8080/mcp

With Docker:

docker build -t qscreener-mcp .
docker run --rm -p 8080:8080 \
  -e QSCREENER_API_URL=https://your-backend.example.com \
  -e QSCREENER_MCP_PUBLIC_URL=http://localhost:8080 \
  qscreener-mcp
# -> MCP endpoint at http://localhost:8080/mcp

By default the container runs the streamable-http transport on port 8080.


Configuration

All configuration is via environment variables, resolved at startup.

Env var

Default

Meaning

QSCREENER_API_URL

http://localhost:8001

Base URL of the Quality Screener backend API the tools call

QSCREENER_MCP_TRANSPORT

stdio

stdio, streamable-http, or sse

QSCREENER_WEBSITE_URL

http://localhost:3001

Web-app base URL used to build the OAuth browser-login link and shareable screen URLs

QSCREENER_MCP_PUBLIC_URL

http://localhost:{PORT|8080}

Publicly reachable base URL of this server; used to build the OAuth callback URL

PORT

Bind port for HTTP transports (Railway sets this automatically)

QSCREENER_MCP_PORT

8080

Bind port fallback when PORT is unset

QSCREENER_MCP_HOST

0.0.0.0

Bind host for HTTP transports

QSCREENER_TOKEN

Bearer-token override for stdio mode (single user)

QSCREENER_CONFIG_DIR

~/.config/qscreener

Directory holding credentials.json for stdio mode


Authentication

The server resolves a bearer token for each call with the following precedence:

  1. HTTP request headerX-Stobot-CLI-Token, then Authorization: Bearer <token>.

  2. $QSCREENER_TOKEN environment variable.

  3. $QSCREENER_CONFIG_DIR/credentials.json — the token field.

Remote (OAuth 2.0)

For a streamable-http deployment, authentication is fully automated via the MCP OAuth flow:

  1. The MCP client discovers the authorization server and opens the user's browser.

  2. The browser lands on the Quality Screener web app, which exchanges the user's web session for a short-lived CLI token and redirects back to this server's /oauth/callback.

  3. The server hands the token to the MCP client, which sends it as a bearer token on every subsequent request.

The token is validated on each request by calling the backend's /v1/cli/auth/whoami endpoint, so a revoked or expired token is rejected immediately. The server never persists user tokens.

Local (stdio)

Mint a token through the browser login flow and store it locally, then run the server over stdio:

qscreener auth login                          # opens the web app, stores a token
cat ~/.config/qscreener/credentials.json      # the "token" field is your bearer token

Or set QSCREENER_TOKEN directly for CI / scripted use.


Tools

All tools require authentication. Filters use OR logic within a filter and AND logic across filters. Market caps are always in USD.

Account & status

Tool

Signature

Description

auth_status

auth_status()

Whether a token is present and which user it authenticates as.

account_profile

account_profile()

The signed-in user's profile (email, username, organization).

health

health()

API and database health check.

Scores & screening

Tool

Signature

Description

scores_top

scores_top(limit=20)

Top tickers by quality score, as a {ticker: score} map.

scores_list

scores_list(ticker=None, sectors=None, industries=None, countries=None, currencies=None, exchanges=None, min_score=None, max_score=None, min_market_cap_usd=None, max_market_cap_usd=None, sort_by="quality_score", sort_order="desc", offset=0, limit=50, include_duplicates=False)

List scored tickers with optional filters.

scores_show

scores_show(ticker)

Full score row(s) for a single ticker.

scores_for_tickers

scores_for_tickers(tickers, scoring_system_id=None)

Current scores for a specific list of tickers, under default scoring or a saved scoring system. Unknown tickers are omitted.

scores_statistics

scores_statistics(sectors=None, min_score=None, max_score=None, min_market_cap_usd=None, max_market_cap_usd=None)

Min / max / average score statistics for a filtered universe.

scores_market_cap

scores_market_cap(sectors=None, min_score=None)

Aggregated total market cap (USD) for a filtered universe.

score_compute

score_compute(config, scoring_universe=None, sectors=None, industries=None, regions=None, countries=None, currencies=None, exchanges=None, min_market_cap_usd=None, max_market_cap_usd=None, sort_by="quality_score", sort_order="desc", offset=0, limit=50, include_duplicates=False)

Compute custom scores from a CustomScoreConfig. scoring_universe picks the peer group (changes the scores); the other filters select rows (do not).

Sharing

Tool

Signature

Description

screen_share

screen_share(config)

Persist a CustomScoreConfig and return a public, copy-pasteable share link (url, slug, created, view_count). Content-addressed: an identical config returns the same link.

Filters & tickers

Tool

Signature

Description

filters_list

filters_list()

Available filter values (sectors, industries, countries, currencies, exchanges).

tickers_list

tickers_list(limit=None)

Available tickers, optionally truncated to limit.

tickers_search

tickers_search(query)

Search available tickers by case-insensitive substring.

Score history

Dates are YYYY-MM-DD. Pass scoring_system_id to compute history against a saved scoring system instead of the default quality score.

Tool

Signature

Description

history_ticker

history_ticker(ticker, start=None, end=None, scoring_system_id=None)

Score history for a single ticker over a date range.

history_batch

history_batch(tickers, start=None, end=None, scoring_system_id=None)

Score history for several tickers at once.

history_top

history_top(top=10, scoring_system_id=None)

Fetch the current top-N tickers and return their score history.

Saved scoring systems

A scoring system is a named, reusable CustomScoreConfig stored against your account.

Tool

Signature

Description

systems_list

systems_list()

List your saved scoring systems.

systems_show

systems_show(system_id)

Show a saved scoring system by ID.

systems_create

systems_create(name, config, description=None)

Create a saved scoring system from a config object.

systems_update

systems_update(system_id, name=None, config=None, description=None)

Update a saved scoring system.

systems_delete

systems_delete(system_id)

Delete a saved scoring system.

systems_apply

systems_apply(system_id)

Apply a saved scoring system (increments its usage count).


Working with CustomScoreConfig

score_compute, screen_share, and the systems_* tools accept a CustomScoreConfig object describing how to weight financial metrics. Its shape mirrors the score builder in the web dashboard: weighted metric groups, each containing weighted metrics, plus scoring parameters and an optional nested filters block. A minimal example:

{
  "name": "My quality screen",
  "winsorizePercentile": 5,
  "missingDataPercentile": 0.25,
  "normalizeGroupZScores": false,
  "includeDuplicatesInScoring": false,
  "groups": [
    {
      "id": "returns",
      "name": "Returns",
      "weight": 0.5,
      "metrics": [
        { "id": "roe", "name": "ROE", "weight": 0.5 },
        { "id": "roic", "name": "ROIC", "weight": 0.5 }
      ]
    },
    {
      "id": "profitability",
      "name": "Profitability",
      "weight": 0.5,
      "metrics": [
        { "id": "profit_margin", "name": "Profit Margin", "weight": 1.0 }
      ]
    }
  ],
  "scoringUniverseFilters": { "countries": ["Italy"], "min_market_cap": 1 },
  "filters": { "min_score": 1.2 }
}

Scoring parameters use camelCase: winsorizePercentile (1-10), missingDataPercentile (0.1-0.5), normalizeGroupZScores and includeDuplicatesInScoring (booleans). scoringUniverseFilters defines the peer group the scores are computed against; the nested filters block holds saved-screen state. Market caps are in billions USD inside both blocks (the tool arguments take USD). Loose inputs — snake_case keys, the legacy winsorize/zScore flags, or filter keys placed at the top level — are normalized to this shape automatically, but emitting it directly is preferred. Use filters_list to discover valid filter values, and build a config interactively in the dashboard if you want a starting point to copy.

Two stages: score against, then filter

Quality scores are relative — every company is winsorized and z-scored against a population — so who is in the peer group and which rows you look at are different questions, and score_compute takes them separately.

Stage

Where

Effect

1. Scoring universe

scoring_universe argument, or config.scoringUniverseFilters

applied before winsorize/z-score — changes every score

2. Result filters

the sectors / countries / … arguments

applied after scoring — never changes a score

"Best European tech judged against European tech" and "best European tech judged against the world" are different lists, not the same list rescaled — narrowing the universe moves each metric's bounds, mean and σ by different amounts, so companies genuinely reorder:

// judged against European tech — the peer group is European tech
score_compute(config, scoring_universe={"sectors": ["Technology"], "regions": ["Europe"]})

// judged against the world — the peer group is everyone, then Europe is shown
score_compute(config, sectors=["Technology"], regions=["Europe"])

Stage 1 accepts sectors, industries, regions, countries, currencies, exchanges, min_market_cap_usd and max_market_cap_usd. It rejects min_score, max_score, ticker and tickers with an error rather than ignoring them: the first two filter on the very scores being computed, the rest select rows.

Every response carries a scoring_universe field naming the peer group and its size. Scores computed against different peer groups are not comparable — do not mix them in one table.

Two edges worth knowing:

  • min_market_cap_usd as a stage-2 argument also floors the scoring population. This is long-standing backend behaviour, kept for compatibility. Set min_market_cap_usd inside scoring_universe to control the peer group explicitly; it overrides the stage-2 floor. max_market_cap_usd filters rows only unless you set it in scoring_universe.

  • A very small universe still scores. There is no minimum-population guard yet, so winsorizing at the 5th/95th percentile of a dozen companies returns confident nonsense.

What the nested filters block does

It is saved-screen state. screen_share and systems_create/systems_update persist it so a shared screen or saved scoring system restores its filter selections when reopened in the dashboard.

It does not define the peer group — scoringUniverseFilters does. Passing a saved config to score_compute applies its filters block as stage-2 filters (an explicit argument wins), matching what the dashboard does, so re-scoring a saved system keeps its view.


Connecting an MCP client

Any streamable-http MCP client works. No token needed — OAuth handles login:

{
  "mcpServers": {
    "qscreener": {
      "type": "streamable-http",
      "url": "https://mcp.qualityscreener.io/mcp"
    }
  }
}

If your client cannot perform the OAuth flow, send a minted token directly:

{
  "mcpServers": {
    "qscreener": {
      "url": "https://mcp.qualityscreener.io/mcp",
      "headers": { "X-Stobot-CLI-Token": "<your token>" }
    }
  }
}

Local (stdio)

{
  "mcpServers": {
    "qscreener": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/quality-screener-mcp-server", "qscreener-mcp"],
      "env": { "QSCREENER_API_URL": "https://your-backend.example.com" }
    }
  }
}

Deployment

The server deploys as a single container. On Railway:

  1. New service → Deploy from repo, pointing at this repository. The Dockerfile is self-contained, so the build context is the repo root.

  2. Set environment variables:

    • QSCREENER_MCP_TRANSPORT=streamable-http

    • QSCREENER_API_URL=https://<your-backend-domain>

    • QSCREENER_WEBSITE_URL=https://<your-frontend-domain>

    • QSCREENER_MCP_PUBLIC_URL=https://<generated-mcp-domain>

    Railway injects PORT automatically; the server binds to it.

  3. Networking → Generate Domain. The MCP endpoint is https://<generated-domain>/mcp.

    • Leave the HTTP healthcheck path unset (or use a TCP check): /mcp answers 406 Not Acceptable to a plain GET, so an HTTP healthcheck expecting 200 would mark the deploy unhealthy.

  4. Connect your MCP client — the OAuth flow triggers automatically on first connection.


Development

uv sync            # install dependencies (including dev)
uv run pytest      # run the test suite

The codebase is small and self-contained:

Path

Purpose

qscreener_mcp/server.py

FastMCP server, tool definitions, transport entry point

qscreener_mcp/client.py

Minimal httpx client that attaches the bearer token

qscreener_mcp/oauth.py

MCP OAuth 2.0 provider (token validation, browser flow)

tests/

pytest suite (token resolution, filter forwarding, share-link building)


Privacy Policy

The full privacy policy is published at PRIVACY.md (https://github.com/quality-screener/quality-screener-mcp-server/blob/main/PRIVACY.md).

In short:

  • The only personal data retained is your email address, which identifies your account. Username and organization are optional profile fields.

  • The MCP server is a stateless proxy — it holds no database and writes no personal data to storage of its own. Each request is forwarded to the Quality Screener API using your access token, never a shared account.

  • Your data is not sold, not used for advertising, and not used to train machine-learning models.

  • Operational logs reference accounts by a pseudonymous user ID, not by email.

  • Account data is deleted when you delete your account.

See the policy for retention periods, third-party recipients, international transfers, and your GDPR rights.


Support

Channel

Use it for

info@qualityscreener.io

Support requests, security reports, privacy and data-subject requests

GitHub Issues

Bug reports and feature requests

This README is the canonical documentation for the MCP server: https://github.com/quality-screener/quality-screener-mcp-server

Please report suspected security vulnerabilities privately by email rather than opening a public issue.


License

MIT © Quality Screener.

Available Tools

23 tools
account_profileA
Read-only
Inspect

Return the signed-in user's profile (email, username, organization).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds useful detail about what the profile contains (email, username, organization), but does not disclose additional behavioral aspects such as authentication requirements or potential error conditions.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no redundant wording. It conveys the action, the subject, and the expected content efficiently.

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 zero-parameter read-only tool, the description is nearly complete: it names the three expected profile fields and the user scope. It does not define the exact response structure, but no output schema exists and the simple nature of the tool makes this acceptable.

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

Parameters4/5

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

There are zero parameters, and the schema description coverage is 100% since the schema is empty. The description compensates by describing the return value, which is the only semantically relevant information for invoking the tool.

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?

The description states a specific verb ('Return') and a clear resource: the signed-in user's profile, listing the key fields (email, username, organization). This makes the tool's purpose unambiguous and distinguishes it from siblings like auth_status.

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

Usage Guidelines4/5

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

The description provides clear context: use this tool to retrieve the profile of the currently signed-in user. It does not explicitly mention alternatives or when not to use it, but for a zero-parameter profile read the implied usage is evident.

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

auth_statusA
Read-only
Inspect

Report whether a CLI token is present and which user it authenticates as.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark the tool as read-only and open-world, so the description does not need to repeat safety signals. It adds value by specifying what the tool reports: token presence and the authenticated user. This is sufficient behavioral disclosure for a no-parameter status tool.

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

Conciseness5/5

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

A single sentence that states the tool's core behavior with no filler or redundancy. Every word contributes to understanding what the tool does.

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

Completeness5/5

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

For a zero-parameter, read-only status tool with no output schema, the description fully covers what an agent needs to know: what condition is checked and what information is returned. There are no remaining gaps that would prevent correct invocation.

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

Parameters4/5

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

The tool has zero parameters, so there is no parameter meaning for the description to clarify. The baseline for a parameterless tool is 4, and the description correctly focuses on the tool's output rather than irrelevant parameter details.

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?

The description uses a specific verb ('Report') and clearly identifies the resource: CLI token presence and the authenticated user. It is immediately distinguishable from siblings like health or account_profile, so an agent knows exactly what this tool does.

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

Usage Guidelines3/5

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

The purpose implies when to call this tool: to verify CLI authentication status. However, there is no explicit guidance about when not to use it or how it differs from related tools such as account_profile, leaving the usage context somewhat implicit.

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

filters_listA
Read-only
Inspect

Return available filter values (sectors, industries, countries, currencies, exchanges).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, and the description does not contradict them. It does add useful context about the kinds of values returned, but it does not disclose response format, ordering, pagination, or possible variability. With annotations covering the safety profile, the description adds some but not rich behavioral detail.

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

Conciseness5/5

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

The description is a single, compact sentence that front-loads the verb and resource and uses parenthetical categories efficiently. Every word earns its place, with no filler or redundant restating of the tool name.

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

Completeness5/5

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

For a zero-parameter, read-only, open-world list operation, the description is fully adequate. It specifies the return domain and the categories included, and the tool's purpose is obvious from the name and description. Nothing essential is missing at this complexity level.

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

Parameters4/5

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

The tool has zero parameters, and the input schema already documents this with 100% coverage. There are no parameter semantics for the description to clarify, so the baseline of 4 is appropriate; no additional parameter information is needed.

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?

The description uses a specific verb, 'Return', and names the exact resource: 'available filter values', followed by concrete categories (sectors, industries, countries, currencies, exchanges). This clearly distinguishes the tool from siblings like tickers_list and scores_list and states its purpose without ambiguity.

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

Usage Guidelines3/5

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

The intended usage is implied: call this tool when filter values are needed, likely for constructing or understanding screens. However, the description provides no explicit guidance on when to use this tool versus alternatives, and no alternatives or exclusions are mentioned.

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

healthA
Read-only
Inspect

Check API and database health.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, and the 'Check' action is consistent with that safe read-only profile. The description adds value by expanding scope beyond the annotation title 'API health' to include the database, but it does not disclose response behavior or failure semantics; given the annotation coverage, this is adequate though not rich.

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

Conciseness5/5

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

A single five-word sentence with zero waste. The core action and target resource are front-loaded, and every word earns its place.

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 zero-parameter, annotation-backed health check, the description is nearly complete. The only minor gap is the unspecified response shape, but with no output schema and low complexity, an 'ok/error' style result is reasonably predictable.

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

Parameters4/5

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

The tool has zero parameters and schema coverage is 100%, so per baseline no parameter explanation is required. There is nothing for the description to add about inputs.

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?

The description states a specific verb ('Check') and resource ('API and database health'), making the tool's purpose unambiguous. None of the 22 sibling tools perform health checks, so it is fully distinguished from alternatives.

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

Usage Guidelines3/5

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

Usage is implied rather than explicit — the description clearly suggests it is used to verify system health, and no sibling tool competes for that role. However, it does not state when to call it (e.g., pre-flight checks, troubleshooting) or any conditions that would make it the right or wrong choice.

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

history_batchA
Read-only
Inspect

Return score history for several tickers at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
startNo
tickersYes
scoring_system_idNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already provide readOnlyHint=true, so the operation is known to be non-destructive. The description adds the batch behavior beyond the annotations, but does not disclose limits, date-range handling semantics, or output format. This is adequate but not rich.

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

Conciseness5/5

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

The description is a single efficient sentence with no filler. The key batch behavior is front-loaded, and every word contributes to understanding what the tool does.

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

Completeness2/5

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

With no output schema, no per-parameter descriptions, and only a one-line description, the tool is under-specified for correct invocation. An agent would need to guess date formats, the meaning of scoring_system_id, and response shape, despite the read-only annotation.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the bare parameter names. It clarifies that 'tickers' is an array of security identifiers, but it does not explain start, end, or scoring_system_id, leaving three of four parameters semantically under-specified.

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?

The description uses a specific verb ('Return'), a clear resource ('score history'), and a defining scope ('several tickers at once'). This distinguishes it from siblings like history_ticker, which implies single-ticker history, and history_top, which implies top-ranked tickers.

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

Usage Guidelines4/5

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

'Several tickers at once' clearly communicates the batch context and implies this tool is the right choice when multiple ticker histories are needed. However, it does not explicitly name alternatives or state when not to use it.

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

history_tickerA
Read-only
Inspect

Return score history for a single ticker (dates: YYYY-MM-DD).

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
startNo
tickerYes
scoring_system_idNo

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only behavior is covered. The description adds single-ticker scope and the date format, but does not disclose return ordering, default date-range behavior, or what happens when scoring_system_id is omitted.

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

Conciseness5/5

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

One compact sentence that front-loads the action and scope, with the date format in a parenthetical. Every element earns its place and there is no wasted text.

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

Completeness2/5

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

With four parameters, no output schema, and no parameter descriptions, the definition leaves the agent without guidance on the meaning of scoring_system_id, the expected response shape, or the default behavior for omitted start/end. It is minimally viable for a basic default call but not complete enough for confident invocation in varied cases.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, but it only provides a generic date format and does not explain start/end semantics, optionality, or scoring_system_id. The ticker parameter is inferable from the tool name, but scoring_system_id remains unexplained, leaving a clear gap for correct invocation.

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?

Description states a specific verb ('return') and resource ('score history' for a single ticker), clearly distinguishing it from siblings like history_batch and history_top. The parenthetical date format adds precision without obscuring the core purpose.

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

Usage Guidelines4/5

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

'Single ticker' provides a clear selection criterion: use this when you need history for one ticker rather than multiple tickers or top-ranked tickers. It does not explicitly name alternatives, but the scoping is unambiguous enough to guide correct selection.

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

history_topB
Read-only
Inspect

Fetch the top-N tickers and return their score history.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNo
scoring_system_idNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already signal readOnlyHint=true and openWorldHint=true, so the description only needs to add extra behavioral context. It does indicate the output is 'score history', but it does not clarify how top-N is determined, what scoring_system_id controls, or whether results are sorted or paginated.

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

Conciseness5/5

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

The description is a single sentence with no filler, front-loading the verb and resource. Every word contributes to the core purpose, and it does not repeat information already available in the annotations or schema.

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

Completeness3/5

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

The tool has only two optional parameters and read-only annotations, so the description is sufficient for a basic default call. However, with no output schema, it leaves the structure of the returned score history unspecified, and scoring_system_id remains unexplained.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for missing parameter documentation. It implicitly explains 'top' via 'top-N', but it never mentions scoring_system_id, its effect on results, or where to find valid scoring system IDs.

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?

The description names a concrete operation and resource: 'Fetch the top-N tickers' and specifies the return type 'score history'. This clearly separates it from siblings like history_ticker (single ticker), history_batch (arbitrary tickers), and scores_top (current top scores without history).

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

Usage Guidelines2/5

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

No guidance is provided on when to choose this tool over alternatives. The description does not mention that history_ticker covers a single ticker, history_batch covers multiple specific tickers, or that scores_top returns a current snapshot. The agent must infer the intended use from the name alone.

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

score_computeA
Read-only
Inspect

Compute custom scores from a CustomScoreConfig, scored against a chosen peer group.

The config is a CustomScoreConfig: weighted metric groups (each with weighted metrics) plus scoring parameters winsorizePercentile (1-10), missingDataPercentile (0.1-0.5), normalizeGroupZScores and includeDuplicatesInScoring (booleans). Loose inputs (snake_case keys, legacy winsorize/zScore flags) are normalized automatically.

Scoring happens in two stages, and they answer different questions.

Stage 1 — scoring_universe: who is in the peer group. Quality scores are relative: each company is winsorized and z-scored against a population. Narrowing this changes every score and can reorder the list. Accepts sectors, industries, regions, countries, currencies, exchanges, min_market_cap_usd and max_market_cap_usd. Omit it to score against the whole universe.

Stage 2 — the filter arguments below: which rows come back. Applied after scoring, so they never change a score. They accept the same keys as stage 1, so any filter can be asked either way. OR logic within a filter, AND across filters.

So "best European tech judged against European tech" is scoring_universe={"sectors": ["Technology"], "regions": ["Europe"]}, while "best European tech judged against the world" is sectors=["Technology"], regions=[...] as stage-2 arguments. The response's scoring_universe field reports the peer group and its size — scores computed against different peer groups are not comparable, so do not mix them in one table.

Two things do not fit the split cleanly, and both are deliberate:

  • min_market_cap_usd as a stage-2 argument also floors the scoring population (a long-standing backend behaviour). Set min_market_cap_usd inside scoring_universe to control the peer group explicitly; it overrides the stage-2 floor. max_market_cap_usd filters rows only unless set in scoring_universe.

  • min_score/max_score/ticker/tickers cannot appear in scoring_universe: the first two filter on the scores being computed, the rest select rows. Passing them there returns an error rather than being ignored.

A nested config['filters'] block is saved-screen state, persisted by screen_share/systems_create/systems_update so a screen restores its view. Passing a saved config here applies that block as stage-2 filters (an explicit argument below wins), matching what the web app does — it never defines the peer group.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
configYes
offsetNo
regionsNo
sectorsNo
sort_byNoquality_score
countriesNo
exchangesNo
currenciesNo
industriesNo
sort_orderNodesc
scoring_universeNo
include_duplicatesNo
max_market_cap_usdNo
min_market_cap_usdNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only supply readOnlyHint and openWorldHint; the description adds substantial behavioral disclosure: two-stage scoring, filters applied after scoring, OR/AND logic, the min_market_cap_usd backend floor quirk, error behavior for invalid scoring_universe keys, and saved-screen config handling. No contradiction with annotations.

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

Conciseness5/5

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

Long but tightly structured: a one-line summary, bolded stage headers, concrete examples, and a dedicated paragraph for edge cases. Each section adds a distinct rule, and the length is warranted by 15 parameters and zero schema coverage.

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?

Covers invocation semantics, filter logic, config details, edge cases, and the saved-state path from screen_share/systems tools. The main gap is return/pagination details: limit, offset, sort_by, sort_order, and the general response shape are not described, and there is no output schema to fill that gap.

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

Parameters4/5

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

Schema description coverage is 0%, and the description compensates for most non-obvious parameters: config structure, scoring_universe keys, filter keys, min/max market cap asymmetry, and loose-input normalization. It omits limit/offset/sort_by/sort_order and the top-level include_duplicates parameter, but those are simpler and more inferable.

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: 'Compute custom scores from a CustomScoreConfig, scored against a chosen peer group.' The detailed two-stage explanation and concrete examples make the tool's purpose clear and distinguish it from standard score-listing siblings like scores_top and scores_list, even though no sibling is named.

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

Usage Guidelines4/5

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

Clearly explains when to put criteria in scoring_universe vs stage-2 filters, with explicit examples and exclusions: min_score/max_score/ticker/tickers cannot go in scoring_universe, and min_market_cap_usd has special peer-group behavior. It does not explicitly name alternative sibling tools, but the usage boundaries are unambiguous.

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

scores_for_tickersA
Read-only
Inspect

Return current scores for a specific list of tickers.

Looks up the latest score for each requested ticker under the default quality score, or under a saved scoring system when scoring_system_id is given (which requires being signed in and owning that system). Tickers with no score are omitted from the response. Results are sorted by quality score descending.

Rows are slimmed for MCP by default (duplicates as ticker strings, description truncated); pass full_rows=True for the raw backend payload.

Args: tickers: Exact ticker symbols to score (e.g. ["AAPL", "MSFT", "ASML.AS"]). scoring_system_id: Optional saved scoring-system id; omit for default scoring. full_rows: Return unmodified rows (embedded duplicate rows, full descriptions).

Returns: dict: A ScoreListResponse with data (one row per found ticker), pagination (total_count = number found), and aggregates.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickersYes
full_rowsNo
scoring_system_idNo

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses several non-obvious behaviors: tickers with no score are omitted, results are sorted by quality score descending, default rows are slimmed with truncated descriptions and duplicate rows, and full_rows returns the raw backend payload. It also surfaces authentication/ownership requirements for saved scoring systems.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, then moves into scoping, edge behavior, response shape, and parameter details. Every sentence contributes useful information without redundancy, and the Args/Returns structure makes it easily scannable.

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

Completeness5/5

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

For a read-only lookup tool with no output schema, the description is impressively complete: it defines what is returned, how missing tickers are handled, sort order, response shape components, and the difference between default and full rows. An agent has enough information to select and invoke it correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden for parameters. It explains tickers are exact symbols with examples, scoring_system_id is optional and falls back to default scoring, and full_rows switches to the unmodified backend payload. This adds meaningful behavioral detail absent from the schema.

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?

The description opens with a specific verb and resource: 'Return current scores for a specific list of tickers.' It clearly distinguishes this tool from sibling tools like scores_top or scores_show by emphasizing a user-supplied list and the exact-ticker scope, leaving no ambiguity about what the tool does.

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

Usage Guidelines4/5

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

The description gives clear context for when to use the tool: when you have exact ticker symbols and need their current scores. It also explains when to include scoring_system_id and the prerequisite of being signed in and owning that system, though it does not explicitly name alternative sibling tools or state when not to use them.

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

scores_listB
Read-only
Inspect

List scored tickers with optional filters. Market caps are in USD.

Rows are slimmed for MCP by default (duplicates as ticker strings, description truncated); pass full_rows=True for the raw backend payload.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
tickerNo
sectorsNo
sort_byNoquality_score
countriesNo
exchangesNo
full_rowsNo
max_scoreNo
min_scoreNo
currenciesNo
industriesNo
sort_orderNodesc
include_duplicatesNo
max_market_cap_usdNo
min_market_cap_usdNo

TDQS

B3.2/5.0
Behavior4/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses meaningful behavior: default rows are slimmed, duplicates appear as ticker strings, descriptions are truncated, and full_rows=True returns the raw backend payload. It also clarifies that market caps are in USD, adding value beyond the annotations.

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

Conciseness5/5

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

The description is short, front-loaded with the core purpose, and every sentence adds useful information. The market-cap unit note and the full_rows payload distinction are high-value details with no filler.

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

Completeness2/5

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

Given the tool's complexity — 16 parameters, no output schema, and no parameter descriptions — the description is incomplete. It explains the general list behavior and row-slimming but does not describe pagination, sort behavior, filter value formats, or the actual row fields returned, limiting an agent's confidence in invoking it correctly.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the 16 parameters. It only clarifies that market-cap parameters are in USD and explains full_rows; the rest, including limit, offset, ticker, sectors, sort_by, sort_order, min_score, and max_score, are left to inference from parameter names.

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

Purpose4/5

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

Description states a specific action and resource: 'List scored tickers with optional filters.' It adds distinguishing details like market caps in USD and the default slimmed row format, making the purpose clear even though it does not explicitly contrast with sibling list tools like scores_top or scores_for_tickers.

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

Usage Guidelines2/5

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

The description provides no guidance on when to choose scores_list over sibling tools such as scores_top, scores_for_tickers, or scores_show. The only conditional advice is the full_rows=True switch, which explains payload shape rather than tool selection, so there is no when-to-use or when-not-to-use guidance.

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

scores_market_capB
Read-only
Inspect

Return aggregated total market cap (USD) for a filtered universe.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectorsNo
min_scoreNo

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the basic safety profile is covered. The description adds 'aggregated' and 'USD' context, but it does not disclose output shape, pagination, or other behavioral details beyond what annotations provide.

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

Conciseness5/5

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

The description is a single, focused sentence with no filler. It front-loads the key result ('aggregated total market cap (USD)') and wastes no tokens.

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

Completeness3/5

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

The tool is simple with two optional parameters and no required arguments, and annotations cover the read-only behavior. However, with no output schema, the description does not specify the return format or the precise interaction between min_score and sectors, leaving it at minimum viable completeness.

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

Parameters2/5

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

Schema description coverage is 0%, and the description's 'filtered universe' is too vague to map to the two parameters, sectors and min_score. It does not explain how these parameters affect the aggregation, leaving the schema titles to carry the semantic weight.

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

Purpose4/5

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

The description uses a specific verb ('Return') and resource ('aggregated total market cap (USD)'), making the tool's purpose clear. It is distinguishable from the sibling score tools, though it does not explicitly name any alternative.

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

Usage Guidelines2/5

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

No guidance is given about when to use this tool versus siblings such as scores_statistics or scores_top. The phrase 'for a filtered universe' implies a use case, but there are no explicit alternatives, prerequisites, or exclusions.

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

scores_showB
Read-only
Inspect

Return the score row(s) for a single ticker.

ParametersJSON Schema
NameRequiredDescriptionDefault
tickerYes

TDQS

B3.1/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only nature is covered. The description adds only that the result is 'score row(s)' for one ticker, which is mildly informative but does not disclose return shape, error behavior, or data interpretation.

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

Conciseness5/5

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

The description is one concise sentence, front-loads the key action and resource, and contains no filler. Every word contributes to understanding the tool's core purpose.

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

Completeness3/5

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

For a simple single-parameter tool with read-only annotations, the description covers the essential operation. However, without an output schema, the vague 'score row(s)' does not fully explain what the response contains, and usage context relative to sibling tools is absent.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It minimally clarifies that the ticker parameter refers to a single ticker, but it omits format requirements, case sensitivity, or accepted symbol forms.

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

Purpose4/5

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

The description clearly states the action (Return), resource (score rows), and scope (a single ticker). It distinguishes from sibling tools like scores_list and scores_for_tickers by the 'single ticker' qualifier, though it does not explicitly name those alternatives.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus related tools such as scores_for_tickers, scores_list, or score_compute. The single-ticker constraint is implied, but there is no explicit context for choosing it over alternatives.

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

scores_statisticsB
Read-only
Inspect

Return min/max/average score statistics for a filtered universe.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectorsNo
max_scoreNo
min_scoreNo
max_market_cap_usdNo
min_market_cap_usdNo

TDQS

B3/5.0
Behavior3/5

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

readOnlyHint=true already discloses the safe read-only nature, so the description's main contribution is naming the exact outputs (min/max/average). It does not disclose behavior when filters are null/omitted, how sector and market-cap filters combine, or whether multiple sectors yield per-sector or pooled statistics. No contradiction with annotations.

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

Conciseness5/5

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

A single front-loaded sentence with zero filler: the verb, the computed statistics, and the scope all appear in the opening clause. Every word earns its place, and the length is appropriate for a one-purpose read-only aggregation tool.

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

Completeness2/5

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

There is no output schema and no parameter documentation, so the agent must infer return shape (beyond the three numbers) and filter semantics from names alone. Critical ambiguities—default universe when all filters are null, multi-sector behavior, and filter interaction—are unaddressed, making the one-sentence description insufficient despite the simple surface.

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

Parameters2/5

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

Schema description coverage is 0%, so the description carries the burden of explaining the five filter parameters, but it only gestures at them via 'filtered universe.' It does not clarify whether min/max bounds are inclusive, whether filters are ANDed, or how an array of sectors is handled; the parameter names themselves carry the entire semantic load.

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

Purpose4/5

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

The description states a specific verb ('Return') and resource ('min/max/average score statistics') over a 'filtered universe,' making the aggregate intent unambiguous. It is internally clear and distinct in function from siblings like scores_list and scores_show, though it never names a sibling or explicitly states what it is not.

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

Usage Guidelines2/5

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

No guidance on when to prefer this tool over the five other score-related siblings (scores_list, scores_top, scores_show, scores_for_tickers, scores_market_cap). 'For a filtered universe' weakly implies a filtering use case, but there are no exclusions, prerequisites, or explicit alternative routing.

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

scores_topB
Read-only
Inspect

Return the top tickers by quality score as a {ticker: score} map.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

B3.4/5.0
Behavior3/5

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

The annotations already declare readOnlyHint and openWorldHint, covering the main safety model. The description adds the return format and the top-ranked nature, but it does not disclose ordering direction, limit semantics, or whether the map includes all tickers beyond the limited result.

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

Conciseness5/5

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

A single, front-loaded sentence contains the essential purpose and output format with no wasted words. Every part earns its place.

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 simple read-only top-N tool with one optional parameter, the description is mostly sufficient: it states what is returned and in what shape. It is slightly incomplete around limit semantics and sibling differentiation, but the annotations and simple schema keep the overall context adequate.

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

Parameters2/5

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

Schema description coverage is 0%, so the description carries the burden, but it never mentions the 'limit' parameter. The property name and default value are somewhat self-explanatory, but the description adds no explicit meaning about how the limit affects the returned map.

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

Purpose4/5

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

The description states a specific verb ('Return'), the resource ('top tickers'), and the selection criterion ('by quality score'), plus the exact output shape. It is clear on its own, though it does not explicitly distinguish itself from sibling tools like scores_list or scores_show.

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

Usage Guidelines3/5

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

The phrasing implies use when the agent needs the highest-quality tickers rather than all scores or per-ticker details. However, it gives no explicit when-to-use guidance and does not name alternatives or exclusions despite many closely related sibling tools.

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

screen_shareA
Idempotent
Inspect

Create a shareable link for a screen (CustomScoreConfig) and return its URL.

Persists the screen configuration and returns a short, public link that can be copy-pasted to anyone — recipients open it to view and load the exact screen. The link is content-addressed: sharing an identical config returns the same URL instead of creating a duplicate.

Args: config: The complete CustomScoreConfig to share — weighted metric groups, scoring parameters (winsorizePercentile, missingDataPercentile, normalizeGroupZScores, includeDuplicatesInScoring), and an optional nested filters block. Loose inputs (snake_case keys, legacy winsorize/zScore flags, or top-level filter keys) are normalized to this shape so the shared link always renders.

Returns: dict with url (the shareable link to copy-paste), slug (the short identifier), created (True if newly created, False if an identical screen already existed), and view_count.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYes

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses that this persists configuration, is content-addressed so identical configs return the same URL, and creates no duplicate when the screen already exists. It also explains input normalization behavior, giving agents a concrete model of side effects without contradicting idempotentHint or readOnlyHint.

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

Conciseness5/5

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

The description is well-structured with a one-sentence summary, a behavior section, and explicit Args/Returns sections. Every sentence adds meaningful operational detail; the most important behavior—link creation and content addressing—appears early.

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

Completeness5/5

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

Given an absent output schema and a single complex nested parameter, the description covers input semantics, normalization, return keys (url, slug, created, view_count), persistence, and deduplication. Nothing needed for correct invocation or interpreting the result is missing.

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

Parameters5/5

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

Schema coverage is 0% and the config parameter is an opaque object with additionalProperties allowed. The description compensates fully by enumerating the key fields (groups, winsorizePercentile, missingDataPercentile, normalizeGroupZScores, includeDuplicatesInScoring, optional filters) and clarifying loose-input normalization.

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?

The description states a specific verb and resource: 'Create a shareable link for a screen (CustomScoreConfig) and return its URL.' It clearly differentiates itself from siblings that list, compute, or manage systems by focusing on sharing a screen configuration via a persistent link.

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

Usage Guidelines4/5

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

The intended use is clear: generate a shareable, public link that can be copy-pasted to anyone so they can view and load an exact screen. It does not explicitly name alternatives or list when-not-to-use, but the description's scoping makes the usage context obvious among the sibling tools.

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

systems_applyAInspect

Apply a saved scoring system (increments its usage count).

ParametersJSON Schema
NameRequiredDescriptionDefault
system_idYes

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already cover readOnlyHint=false, idempotentHint=false, destructiveHint=false, and openWorldHint=true, so the baseline burden on the description is lower. The parenthetical about incrementing usage count adds useful behavioral context about a side effect that is not visible in the schema or annotations. It does not contradict annotations.

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?

The description is a single, compact sentence and the most important behavioral distinction (usage count side effect) is included in parentheses without bloating. It earns its place, though it could define 'apply' somewhat more.

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?

Given the tool has only one parameter, no output schema, and sibling names largely self-explanatory (systems_* family), the single-sentence description is mostly sufficient for an agent to call it correctly. A minor gap is that it does not say anything about the return value or when applying is valid, but the simplicity of the operation and the annotations keep the definition reasonably complete.

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?

The schema has only one required integer parameter, system_id, and the schema description coverage is 0% so the schema itself doesn't explain it. The description names the resource ('saved scoring system') which implies system_id refers to the ID of that saved system, adding some meaning. However, it doesn't explicitly state the format/requirements of system_id or explain what 'apply' results in.

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?

The description uses a specific verb 'Apply' plus resource 'saved scoring system' and even clarifies the side-effect ('increments its usage count'). This makes it clearly distinct from sibling tools like systems_show, systems_list, systems_create, systems_update, and systems_delete, which involve other operations on scoring systems.

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

Usage Guidelines4/5

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

The description clearly states that this tool applies a saved scoring system, implying it is used when the agent needs to activate or use an existing scoring system. It does not explicitly name alternatives or say 'when NOT to use', but among the systems_* siblings the verb 'apply' is distinct enough to convey the intended usage context.

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

systems_createBInspect

Create a saved scoring system from a config object.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
configYes
descriptionNo

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already indicate this is a mutating but non-destructive operation. The description adds the context that the resulting system is 'saved' and configured from an object, which is useful, but it does not disclose return values, validation, uniqueness constraints, or side effects beyond creation. No contradiction with annotations.

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?

The description is a single, front-loaded sentence with no wasted words. However, given the opaque config parameter and the lack of other context, the brevity leaves important information out; it is concise but slightly under-structured for the tool's complexity.

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

Completeness2/5

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

With no output schema and an open-ended config object, the description is not complete enough for an agent to confidently construct a valid call. It omits return behavior, config semantics, and how this creation interacts with systems_apply, systems_update, or scoring workflows.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the schema's lack of parameter documentation. It only mentions 'config object', giving no detail about the required name, the optional description, or the actual shape/fields expected inside config. This is insufficient for a permissive additionalProperties object.

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?

The description clearly states the action: create a saved scoring system. It specifies the resource ('scoring system') and the input source ('config object'), and the 'create' verb naturally distinguishes it from sibling operations like systems_update, systems_delete, and systems_apply.

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

Usage Guidelines2/5

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

There is no guidance about when to use this tool versus alternatives such as systems_update, systems_apply, or score_compute. No prerequisites, exclusions, or decision rules are provided, so the agent must infer usage entirely from the tool name and siblings.

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

systems_deleteB
DestructiveIdempotent
Inspect

Delete a saved scoring system.

ParametersJSON Schema
NameRequiredDescriptionDefault
system_idYes

TDQS

B3.2/5.0
Behavior2/5

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

The annotations already declare destructiveHint=true and readOnlyHint=false, so the description adds no behavioral context beyond the word 'Delete'. It doesn't state that deletion is permanent, what side effects may occur, or why the idempotentHint might matter.

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

Conciseness5/5

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

One sentence, front-loaded with 'Delete', and no wasted words. This is appropriately concise for a simple single-parameter delete operation.

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

Completeness3/5

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

The description plus annotations cover the core safety profile for a low-complexity, one-parameter operation with no output schema. However, it omits any statement about postconditions, error behavior, or how to source the system_id, making it only minimally viable.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explain system_id beyond the schema's title. It doesn't say how to find the system_id or that it must reference an existing saved scoring system, leaving the agent without useful parameter-level guidance.

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?

The description states a specific verb ('Delete') and resource ('a saved scoring system'), making the tool's purpose immediately clear. It also naturally distinguishes this from sibling tools like systems_create, systems_update, systems_apply, and systems_show.

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

Usage Guidelines2/5

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

The description gives no guidance on when to use this tool versus alternatives, no mention of irreversibility, and no indication that system_id should come from systems_list or systems_show. An agent gets no context about preconditions or caution.

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

systems_listA
Read-only
Inspect

List the user's saved scoring systems.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the scope of 'user's saved' systems, but does not disclose additional behavior such as response format, ordering, or whether the open-world hint means results may include unsaved or external systems. This is acceptable but minimal.

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

Conciseness5/5

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

A single, compact sentence that states the action, the resource, and the ownership scope with no filler. Every word earns its place and the key information is front-loaded.

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 zero-parameter read-only list operation, the description is nearly complete. It lacks explicit mention of return values or pagination behavior, but with no output schema and simple semantics, the provided description is adequate for an agent to invoke the tool correctly.

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

Parameters4/5

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

The tool has zero parameters, so the input schema imposes no burden on the description. The description correctly implies that the tool takes no arguments and simply returns the user's saved systems, which is sufficient at the baseline for parameterless tools.

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?

The description uses a specific verb and resource: 'List the user's saved scoring systems.' It clearly distinguishes this list operation from sibling tools like systems_show, systems_create, and systems_update by emphasizing the 'saved' collection and the user's ownership.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus alternatives. While the description implies a list-all-saved-systems use case, it does not mention that systems_show is for a single system or that creating/updating systems are the mutation counterparts, leaving selection largely to the agent's inference.

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

systems_showA
Read-only
Inspect

Show a saved scoring system by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
system_idYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safe read-only nature is covered. The description adds only the fact that the system is 'saved' and looked up by ID, which is contextually useful but not a rich behavioral disclosure. No contradiction with annotations exists.

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

Conciseness5/5

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

One short sentence communicates the action, object, and key scope. There is no wasted wording, and the essential information is front-loaded.

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 simple read-only single-ID retrieval tool with no output schema, the description is nearly complete. It could arguably mention what a 'scoring system' includes or the return format, but the phrase 'Show a saved scoring system' sufficiently covers the expected behavior for an agent.

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 coverage is 0%, so the description carries the burden. It relates system_id to the saved scoring system via 'by ID,' which is useful but somewhat redundant given the parameter is already named system_id. No additional detail is provided about where to find the ID or how the lookup behaves.

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?

The description uses a clear verb ('Show') with a specific resource ('saved scoring system') and a precise access method ('by ID'). It naturally distinguishes this tool from siblings like systems_list, systems_create, and systems_update, making its role immediately understandable.

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

Usage Guidelines4/5

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

The description clearly implies the intended use case: retrieve a single existing scoring system when you have its ID. It does not explicitly mention alternatives like systems_list or systems_delete, but the 'by ID' scoping provides enough context for an agent to select it appropriately.

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

systems_updateC
Idempotent
Inspect

Update a saved scoring system.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
configNo
system_idYes
descriptionNo

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already indicate readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the mutation profile is known. However, the description adds no behavioral context beyond the word 'update'—it does not clarify whether this is a partial update, whether config is replaced entirely, or what side effects occur. No added value beyond the annotations.

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?

The description is a single, direct, front-loaded sentence with no filler or redundancies. It is concise to a fault—it earns its place as a purpose statement but omits useful supporting detail that could have been added without bloating the description.

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

Completeness2/5

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

Given 4 parameters, 0% schema coverage, and no output schema, the description is far too sparse. An agent cannot tell whether omitted fields are preserved, what config should contain, whether applying the system is affected, or what the tool returns. The description alone is insufficient for correct invocation beyond guessing at the required system_id.

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

Parameters1/5

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

Schema description coverage is 0%, so the description needed to explain what system_id, name, config, and description mean and how they behave. It mentions none of them. An agent gets no help understanding that config is an object, which fields are optional, or what the required system_id refers to beyond the generic tool name.

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?

The description clearly states a specific verb ('Update') and resource ('a saved scoring system'), which distinguishes it from sibling tools like systems_create, systems_delete, systems_apply, and systems_show. Even without the title, the purpose is immediately understandable.

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

Usage Guidelines2/5

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

The description gives no guidance about when to use this tool versus alternatives. It does not mention that systems_create is for new systems, systems_delete for removal, or systems_apply for scoring with a system. The word 'saved' only weakly implies an existing system, but no explicit usage context or exclusions are provided.

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

tickers_listA
Read-only
Inspect

Return available tickers, optionally truncated to limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

A3.6/5.0
Behavior3/5

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

The annotations already signal readOnlyHint=true and openWorldHint=true, so the description does not need to restate those. The phrase 'optionally truncated to limit' adds some behavioral context about how the limit parameter affects output. However, it does not disclose any further behaviors such as ordering, pagination, or how 'available' is determined.

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

Conciseness5/5

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

The description is a single short sentence where every word earns its place. It is front-loaded with the core action ('Return available tickers') and adds the optional truncation behavior without any filler or redundancy.

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 simple read-only list tool with one optional parameter and no output schema, the description is nearly sufficient. It tells the agent what the tool returns and the one way to constrain the result. It could be more complete by stating the output format, but the simplicity of the operation and the tool name reduce the need for elaborate explanation.

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 0%, so the description must compensate for explaining the limit parameter. The phrase 'optionally truncated to limit' clarifies that limit is an optional cap on the return set. This is useful but minimal; it does not specify behavior for null, zero, negative, or very large limit values.

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

Purpose4/5

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

The description clearly states the tool's action and resource: 'Return available tickers.' This is specific enough to communicate the core purpose. However, it does not explicitly differentiate itself from the sibling tool tickers_search, relying on the reader to infer that 'available' implies a full list rather than a search.

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

Usage Guidelines3/5

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

The description implies the tool should be used when one wants to retrieve available tickers, optionally with a limit. It does not explicitly state when to use this tool instead of tickers_search or other sibling tools, nor does it provide exclusion criteria. Usage guidance is therefore only implied, not directly articulated.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 23 tool updatesv0.2.0
    • First observedaccount_profile
    • First observedauth_status
    • First observedfilters_list
    • First observedhealth
    • First observedhistory_batch
    • First observedhistory_ticker
    • First observedhistory_top
    • First observedscore_compute
    • First observedscores_for_tickers
    • First observedscores_list
    • First observedscores_market_cap
    • First observedscores_show
    • First observedscores_statistics
    • First observedscores_top
    • First observedscreen_share
    • First observedsystems_apply
    • First observedsystems_create
    • First observedsystems_delete
    • First observedsystems_list
    • First observedsystems_show
    • First observedsystems_update
    • First observedtickers_list
    • First observedtickers_search

TDQS

A3.5/5.0

Scored across 23 tools

Disambiguation4/5

Most tools map to a distinct resource/action (scores queries, history, systems CRUD, tickers/filters), and the descriptions clearly separate custom score computation from canned score lookups. A few pairs overlap conceptually, such as scores_list vs scores_top or auth_status vs account_profile, but their output shapes and inputs make them distinguishable.

Naming Consistency4/5

Tool names are predominantly snake_case and follow a resource-prefix pattern like scores_*, systems_*, history_*, and tickers_*. Minor deviations such as score_compute (singular vs the plural scores_* family), screen_share (noun_verb rather than resource_verb), and the non-action names auth_status/health keep it from being fully consistent.

Tool Count3/5

At 23 tools the surface is heavy and falls in the borderline 16-25 range; some tools like scores_top, scores_for_tickers, and history_top overlap with list/batch operations and could be consolidated. The broad scope (auth, scores, screens, systems, history) justifies most of the count, but it is not tight.

Completeness4/5

Core workflows are well covered: score retrieval, custom score computation, saved-system CRUD, screen sharing, filters, tickers, history, and health/auth. Minor gaps exist, such as no way to fetch a shared screen by slug and no direct score-comparison tool, but agents can work around these without dead ends.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Provides comprehensive stock screening capabilities through Yahoo Finance. Enables LLMs to screen stocks based on technical, fundamental, and options criteria, with support for watchlist management and result storage.
    4
    48
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides AI assistants with market screening, analysis, and scoring across stocks, crypto, and forex, enabling natural language queries for trading insights.
    4
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Provides derived financial intelligence for AI agents, including insider activity analysis, earnings surprises, institutional moves, stock screening with a proprietary composite value score, and macro indicators.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to analyze stocks, screen markets, compare peers, read earnings calls, and track sector rotations using live financial data from Financial Modeling Prep.
    21
    PolyForm Noncommercial 1.0.0