
Quality Screener
io.github.quality-screener由 GitHub 账号 quality-screener 发布v0.1.0更新于 Oct 24, 2026
Screen and score stocks with the Quality Screener engine: filters, custom scores, and history.
概览
远程 MCP 服务器,让助手以登录用户身份使用 Quality Screener 引擎筛选、评分和比较股票。
- 可以做什么
- 筛选与排名股票:列出最高分或按条件过滤的已评分股票,查看单只股票的完整评分,获取指定股票列表的评分,并统计分数分布或汇总市值。
- 按加权指标组构建自定义质量评分,并指定评分所依据的同类股票范围。
- 查看单只、多只或当前前 N 名股票在指定日期区间内的评分历史。
- 管理已保存的评分体系:列出、查看、创建、更新、删除和应用。
- 生成可分享的筛选链接,并查询可用的筛选值和股票代码。
- 检查认证状态、账户资料和 API 健康状态。
- 适用场景
- 适合让助手执行股票质量筛选、按自定义加权指标比较公司,或追踪评分随时间的变化,所用数据与 Quality Screener 网页仪表盘一致。更适合投研与分析类对话,而非通用任务。
- 运行要求
- 远程 streamable-HTTP 端点,无需本地运行时或安装包。需要 Quality Screener 账户,客户端首次连接时须完成 OAuth 2.0 浏览器登录,或在 X-Stobot-CLI-Token 请求头中提供已签发的令牌(也接受 Authorization: Bearer)。本地自建需 uv 或 Docker,并配置 QSCREENER_API_URL 等环境变量。
安装
在 SourceWeft 中
- 打开 控制台中的 Quality Screener,将其添加到工作区。
- 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
- 为需要使用其工具的对话启用该服务。
Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。
交给智能体安装
把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。
阅读 https://sourceweft.com/mcp/io.github.quality-screener%2Fqscreener/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。其他 MCP 客户端
把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。
{
"mcpServers": {
"quality-screener": {
"type": "http",
"url": "https://mcp.qualityscreener.io/mcp"
}
}
}README
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
- How it works
- Quick start (remote)
- Running locally
- Configuration
- Authentication
- Tools
- Working with
CustomScoreConfig - Connecting an MCP client
- Deployment
- Deploy on Vercel
- Development
- Privacy Policy
- Support
- License
How it works
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:
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:
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.
With Docker:
By default the container runs the streamable-http transport on port 8080.
Configuration
All configuration is via environment variables, resolved at startup.
Authentication
The server resolves a bearer token for each call with the following precedence:
- HTTP request header —
X-Stobot-CLI-Token, thenAuthorization: Bearer <token>. $QSCREENER_TOKENenvironment variable.$QSCREENER_CONFIG_DIR/credentials.json— thetokenfield.
Remote (OAuth 2.0)
For a streamable-http deployment, authentication is fully automated via the
MCP OAuth flow:
- The MCP client discovers the authorization server and opens the user's browser.
- 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. - 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. Access tokens are the
CLI token, so they need no local store. Pending login state, authorization
codes, and dynamically registered clients are HMAC-signed JWTs when
QSCREENER_OAUTH_SIGNING_KEY is set, which is what a multi-instance host
(Vercel) needs; a single process without the key keeps the original
in-memory behaviour.
Local (stdio)
Mint a token through the browser login flow and store it locally, then run the server over stdio:
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
Scores & screening
Sharing
Filters & tickers
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.
Saved scoring systems
A scoring system is a named, reusable CustomScoreConfig stored against your
account.
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:
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.
"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:
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_usdas a stage-2 argument also floors the scoring population. This is long-standing backend behaviour, kept for compatibility. Setmin_market_cap_usdinsidescoring_universeto control the peer group explicitly; it overrides the stage-2 floor.max_market_cap_usdfilters rows only unless you set it inscoring_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
Remote (recommended)
Any streamable-http MCP client works. No token needed — OAuth handles login:
If your client cannot perform the OAuth flow, send a minted token directly:
Local (stdio)
Deployment
The server deploys as a single container. On Railway:
-
New service → Deploy from repo, pointing at this repository. The Dockerfile is self-contained, so the build context is the repo root.
-
Set environment variables:
QSCREENER_MCP_TRANSPORT=streamable-httpQSCREENER_API_URL=https://<your-backend-domain>QSCREENER_WEBSITE_URL=https://<your-frontend-domain>QSCREENER_MCP_PUBLIC_URL=https://<generated-mcp-domain>
Railway injects
PORTautomatically; the server binds to it. -
Networking → Generate Domain. The MCP endpoint is
https://<generated-domain>/mcp.- Leave the HTTP healthcheck path unset (or use a TCP check):
/mcpanswers406 Not Acceptableto a plainGET, so an HTTP healthcheck expecting200would mark the deploy unhealthy.
- Leave the HTTP healthcheck path unset (or use a TCP check):
-
Connect your MCP client — the OAuth flow triggers automatically on first connection.
Deploy on Vercel
The same ASGI app that Docker/Railway serve via mcp.run() is exported from
app.py as a FastAPI app so Vercel’s Python runtime can host it as one
Function. The FastMCP app already listens on /mcp, /.well-known/*,
/authorize, /token, /register, and /oauth/callback; Vercel routes
every request to that Function with the original path, so those URLs resolve
without remapping. vercel.json only sets maxDuration (60s) on app.py.
Do not rewrite /mcp (or the OAuth paths) onto / — FastMCP matches the
literal paths.
Create a Vercel project pointed at this repository (Framework Preset: FastAPI / Other, Root Directory: repository root). Set these environment variables — names only; never commit values:
Vercel injects VERCEL_URL automatically (hostname, no scheme). It is only a
fallback issuer when QSCREENER_MCP_PUBLIC_URL is unset. Do not use it as
the production issuer if the MCP client will connect via a custom domain.
These are not required on Vercel (the app.py entrypoint is always HTTP,
and the Function does not bind a port):
QSCREENER_MCP_TRANSPORTQSCREENER_MCP_HOSTQSCREENER_MCP_PORT/PORTQSCREENER_TOKENQSCREENER_CONFIG_DIR
After deploy the MCP endpoint is https://<vercel-domain>/mcp. Point an MCP
client at that URL the same way as the Railway deployment. Raise
functions["app.py"].maxDuration in vercel.json if custom scoring hits the
60s cap.
Development
The codebase is small and self-contained:
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
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.
来源:README.md,提交 2515e5f
工具
0版本历史
1- v0.1.0最新Sep 16, 2026
评分
已满足适用检查项的 85%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通必需25 分
- 已声明认证方式必需10 分
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分