Schwab MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Schwab MCPshow me my portfolio summary and today's P&L"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Schwab MCP
一个只读的 Charles Schwab(嘉信理财)Model Context Protocol 服务器。 Claude、GPT 等 AI agent 可以通过它查询你的持仓、账户余额、实时报价、K 线、期权链、订单和交易记录。
本项目不能下单、改单、撤单,代码里也没有任何交易接口,只负责把 Schwab 的数据安全地交给 agent。 非 Schwab 官方项目,也不构成投资建议。
特性
持仓 + 实时价格:
get_positions(include_quotes=true)一次调用返回每个持仓的成本、市值、浮盈亏、当日盈亏、 仓位占比,并附带实时报价组合总览:
get_portfolio_summary汇总所有账户的总资产、现金、当日盈亏、资产类别配置和前 N 大持仓 (同一只股票在多个账户里的持仓会合并)行情:实时报价(股票、ETF、指数、期货、期权及希腊值)、K 线、期权链、开闭市时间、涨跌榜、基本面搜索
隐私:账号默认脱敏成
****1234,Schwab 的 account hash 不会出现在输出里;agent 可以用尾号或昵称指定账户为 LLM 优化的输出:snake_case 字段、去掉空值、数字取整、时间统一为美东时间、预先算好百分比,既省 token 又不容易算错
自动续期:access token(30 分钟)自动刷新;refresh token 7 天后过期,重新执行
schwab-mcp auth即可, 正在运行的 server 不需要重启两种传输方式:stdio(Claude Desktop / Claude Code / Codex CLI / OpenAI Agents SDK)和 Streamable HTTP (必须配置 Bearer token)
Related MCP server: Schwab MCP Server
工具一览
工具 | 说明 |
| 全部账户总览:总资产、现金、当日/浮动盈亏、资产配置、前 N 大持仓、各账户占比 |
| 各账户持仓明细; |
| 账户列表:类型(MARGIN/CASH)、昵称、总资产、现金、购买力等 |
| 实时报价:最新价、买卖盘、涨跌幅、成交量、日内/52 周区间;期权带希腊值;可选基本面 |
| K 线(1 分钟到月线)+ 区间统计(涨跌幅、最高最低、均量),支持预设周期或起止日期 |
| 期权链:bid/ask/mark、成交量、未平仓量、IV、希腊值,按到期日排序 |
| 某个标的的所有期权到期日 |
| 开闭市时间(盘前/盘中/盘后),并标出当前所处时段 |
| 指数/交易所的涨跌榜、成交量榜 |
| 按代码或公司名搜索; |
| 最近 60 天内的订单(含成交明细和平均成交价),只读 |
| 交易流水:买卖、分红、利息、出入金、费用 |
| 登录状态,以及距离 7 天过期还剩多久 |
| 当前美东时间和 UTC 时间(方便模型做日期计算) |
另外提供一个 prompt 模板 portfolio_review,一键生成组合复盘。
快速开始
1. 申请 Schwab 开发者 App(只需一次)
用你的 Schwab 账号登录 https://developer.schwab.com,进入 Dashboard → Apps → Create App。
API Product 选 Accounts and Trading Production(如果能选,再加上 Market Data Production)。
Callback URL 填
https://127.0.0.1:8182(末尾不要加/,后续配置必须与这里一字不差)。创建后的状态通常是
Approved - Pending,要等变成Ready For Use(可能需要几天)才能使用。在 App 详情页拿到 App Key 和 Secret。
2. 安装
需要 Python ≥ 3.10,推荐使用 uv:
git clone https://github.com/<you>/Schwab-MCP.git
cd Schwab-MCP
uv sync # 或者:python -m venv .venv && .venv/bin/pip install -e .3. 配置凭据
mkdir -p ~/.config/schwab-mcp
cp .env.example ~/.config/schwab-mcp/.env
chmod 600 ~/.config/schwab-mcp/.env
# 编辑该文件,填入 SCHWAB_CLIENT_ID(App Key)和 SCHWAB_CLIENT_SECRET(Secret)配置的读取顺序(先读到的优先):真实环境变量 → --env-file / $SCHWAB_MCP_ENV_FILE → 当前目录的 .env
→ ~/.config/schwab-mcp/.env。
4. 登录(每 7 天一次)
uv run schwab-mcp auth浏览器会打开 Schwab 登录页 → 登录并勾选要授权的账户 → 浏览器跳转到 https://127.0.0.1:8182/?code=...,
页面打不开是正常的 → 把地址栏里的完整 URL 粘贴回终端。Token 保存在 ~/.config/schwab-mcp/token.json(权限 600)。
uv run schwab-mcp status # 查看登录状态,并测试 API 连通性5. 接入你的 agent
把下面的 /ABS/PATH/Schwab-MCP 换成仓库的绝对路径。如果凭据已经写在 ~/.config/schwab-mcp/.env 里,
env 部分可以省略。
编辑 claude_desktop_config.json(macOS 位于 ~/Library/Application Support/Claude/):
{
"mcpServers": {
"schwab": {
"command": "uv",
"args": ["--directory", "/ABS/PATH/Schwab-MCP", "run", "schwab-mcp"],
"env": {
"SCHWAB_CLIENT_ID": "your-app-key",
"SCHWAB_CLIENT_SECRET": "your-app-secret"
}
}
}
}Claude Desktop 可能找不到 uv。如果启动失败,把 "command" 改成 which uv 输出的绝对路径。
claude mcp add schwab --scope user -- uv --directory /ABS/PATH/Schwab-MCP run schwab-mcp~/.codex/config.toml:
[mcp_servers.schwab]
command = "uv"
args = ["--directory", "/ABS/PATH/Schwab-MCP", "run", "schwab-mcp"]import asyncio
from agents import Agent, Runner
from agents.mcp import MCPServerStdio
async def main():
async with MCPServerStdio(
params={"command": "uv", "args": ["--directory", "/ABS/PATH/Schwab-MCP", "run", "schwab-mcp"]},
) as schwab:
agent = Agent(name="Portfolio assistant", mcp_servers=[schwab],
instructions="用中文回答,只使用工具返回的数据。")
result = await Runner.run(agent, "我今天的持仓表现怎么样?哪只股票拖累最大?")
print(result.final_output)
asyncio.run(main())export SCHWAB_MCP_HTTP_TOKEN=$(python -c "import secrets; print(secrets.token_urlsafe(32))")
uv run schwab-mcp serve --transport http --port 8765 # 端点:http://127.0.0.1:8765/mcp
# 通过隧道或反向代理暴露时,加上 --allowed-host your.domain.com所有请求都必须带 Authorization: Bearer $SCHWAB_MCP_HTTP_TOKEN,否则返回 401。
from openai import OpenAI
resp = OpenAI().responses.create(
model="gpt-5", # 任意支持远程 MCP 工具的模型
tools=[{
"type": "mcp",
"server_label": "schwab",
"server_url": "https://your.domain.com/mcp",
"headers": {"Authorization": "Bearer <SCHWAB_MCP_HTTP_TOKEN>"},
"require_approval": "never",
}],
input="列出我的前五大持仓和它们今天的涨跌幅",
)
print(resp.output_text)⚠️ 这相当于把你的券商数据暴露到公网。只在确实需要时使用:token 要足够长,放在 HTTPS 后面,用完就关。 ChatGPT 网页版的自定义连接器只支持 OAuth 或无认证,所以不建议直接接入。GPT 用户请优先使用 Codex CLI 或 Agents SDK(本地 stdio,数据只会发给模型,不会暴露在公网上)。
6. 试一试
「我的组合今天表现如何?」→
get_portfolio_summary「列出我所有持仓的实时价格和浮盈」→
get_positions(include_quotes=true)「NVDA 和 AAPL 现在多少钱?」→
get_quotes「AAPL 过去 6 个月的走势」→
get_price_history(period="6M")「我的 Roth IRA 这个月收到多少分红?」→
get_transactions(account="Roth IRA", types=["DIVIDEND_OR_INTEREST"])「现在美股开盘了吗?」→
get_market_hours
配置项
环境变量 | 默认值 | 说明 |
| — | App Key(必填) |
| — | App Secret(必填) |
|
| 必须与开发者后台填写的完全一致 |
|
| Token 文件位置 |
|
| 账号脱敏;设为 |
| — | HTTP 传输使用的 Bearer token(HTTP 模式必填) |
|
| 单次请求超时(秒) |
|
| 日志级别(日志只写 stderr,不会干扰 stdio 协议) |
命令行:schwab-mcp [serve] [--transport stdio|http] [--host] [--port] [--allowed-host HOST]、
schwab-mcp auth [--no-browser]、schwab-mcp status,以及全局参数 --env-file PATH。
安全与隐私
只读:客户端只实现了 GET 接口,所有工具都带 MCP 的
readOnlyHint注解。Token 存储:
token.json以0600权限原子写入,所在目录为0700。不要把它和.env提交到 git(.gitignore已排除)。账号脱敏:输出中的完整账号会被替换成
****1234,交易描述之类的自由文本也不例外;hash 值从不输出。数据流向:agent 调用工具后,返回的数据会发给你所用的模型提供方(Anthropic、OpenAI 等),请按自己的隐私要求取舍。
HTTP 模式:未设置
SCHWAB_MCP_HTTP_TOKEN时拒绝启动;--insecure-no-auth只允许绑定回环地址。 绑定 127.0.0.1 时默认开启 DNS rebinding 防护。
常见问题
现象 | 处理方法 |
工具提示 | 运行 |
登录时 Schwab 提示 callback/redirect 不匹配 |
|
HTTP 401 | App 还没到 |
HTTP 403 | App 没有开通对应的 API Product(账户或行情) |
HTTP 429 | 触发了 Schwab 的频率限制(约 120 次/分钟),server 会自动退避重试 |
Claude Desktop 里看不到工具 | 检查 |
开发
uv sync
uv run pytest # 针对模拟的 Schwab API 运行,不需要真实账户
uv run ruff check src tests
npx @modelcontextprotocol/inspector uv run schwab-mcp # 在浏览器里交互式调试工具代码结构和设计取舍见 docs/DESIGN.md。
参考项目
设计参考了以下开源项目,具体借鉴点见 docs/DESIGN.md:
jkoelker/schwab-mcp:Python,基于 schwab-py;交易需要审批,
--json精简输出sudowealth/schwab-mcp:TypeScript + Cloudflare Workers;账号脱敏、日志脱敏
alexgolec/schwab-py:社区 Schwab API 客户端,OAuth 流程和接口参数的权威参考
License
MIT
Available Tools
14 toolsget_auth_statusARead-onlyIdempotent
Check whether the Schwab login is valid and when it expires (Schwab requires a new browser login every 7 days). Call this first if other tools report authentication errors.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description adds genuinely useful behavioral context beyond the annotations: the 7-day expiry window and that a browser login (not an API token) is required, which shapes what the agent should tell the user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the purpose front-loaded and the usage trigger as the closing actionable clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. For a zero-parameter, read-only auth check with full annotation coverage, the description provides everything needed: what it checks, why it matters, and when to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so per the rubric the baseline is 4. Nothing in the description needs to explain inputs, and it correctly stays silent on them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Check) and resource (Schwab login validity/expiry), and adds the domain constraint that Schwab requires a new browser login every 7 days. No sibling tool overlaps with authentication status, so an agent can identify it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to call it: 'Call this first if other tools report authentication errors.' That is a concrete routing condition tied to a failure mode of the sibling tools, which is exactly what usage guidance should do.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_timeARead-only
Current date and time in US/Eastern (the exchange clock) and UTC. Useful before date math.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the agent knows this is a safe, closed-world read. The description adds one piece of genuine context — that US/Eastern is 'the exchange clock,' implying which timezone matters for trading decisions — but says nothing about precision, caching, or freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact clauses with the timezones front-loaded and the usage hint trailing. Every word earns its place and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and an output schema that already documents the returned fields, the description only needs to frame what clock is returned and why; it does that. Minor gap: no indication of timezone format (e.g. ISO 8601) or freshness guarantees.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly avoids padding with nonexistent arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (current date and time) with concrete scope: US/Eastern and UTC. Clear enough that an agent instantly distinguishes it from siblings like get_market_hours, though it doesn't name those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Useful before date math' gives an implied usage context, but there is no when-to-use vs. when-not guidance and no named alternatives among the many sibling tools that also return time-related data (e.g. get_market_hours).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_hoursARead-onlyIdempotent
Trading sessions (pre-market, regular, post-market) for a day and whether the market is open.
For today it also reports which session is active right now (session_now).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD, default today. | |
| markets | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the bar is lower. The description adds genuine behavioral context by disclosing the return semantics — session breakdown per day plus an active `session_now` field for today only — which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, with the core capability front-loaded and the today-only `session_now` caveat following. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description is not obligated to explain return values, and what it does state (sessions, open flag, session_now) is sufficient for an agent to invoke the tool correctly. The remaining gap is the undocumented `markets` parameter, which is a minor completeness shortfall rather than a blocker.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%: `date` documents its format ('YYYY-MM-DD, default today'), but `markets` has no description anywhere, including the description text. The description mentions neither parameter, so it does not compensate for the undocumented `markets` enum list (equity, option, bond, future, forex) or its default behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (trading sessions: pre-market, regular, post-market) and a specific clarification (whether the market is open), so an agent immediately knows what it returns. It does not explicitly name or contrast with siblings, but the purpose is distinct enough that differentiation is unnecessary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is for checking market open/closed state and session boundaries. There is no explicit when-to-use, when-not-to-use, or reference to alternatives such as get_current_time, which is the nearest sibling an agent might confuse it with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_moversCRead-onlyIdempotent
Top movers in an index or exchange, sorted by volume, trades or % change.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | PERCENT_CHANGE_UP | |
| index | No | $SPX | |
| frequency | No | Minimum % move to qualify (0 = any). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds essentially nothing behavioral beyond that: it does not say how many movers are returned, whether results are paginated, or any rate/latency characteristics. The sorting detail it does provide is already available in the schema enum.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the core scoping information front-loaded and no filler. It is appropriately sized for the tool, though it could have used one more clause for usage guidance without becoming bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return formatting need not be described. Still, for a tool where every parameter is optional and behavior depends heavily on defaults (sort=PERCENT_CHANGE_UP, index=$SPX), the description omits the defaults and any guidance on selection, leaving the agent to read the schema to use it sensibly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (only 'frequency' is documented in the schema), so the description must compensate. It partially does: 'sorted by volume, trades or % change' maps onto the sort enum values and 'index or exchange' hints at the index parameter. However, it does not explain that PERCENT_CHANGE_UP/DOWN are separate ranking directions, nor what INDEX_ALL/EQUITY_ALL/OPTION_* select.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-less but clear operation: 'Top movers in an index or exchange, sorted by volume, trades or % change.' It identifies the resource (market movers) and the ranking dimension, which no sibling tool (get_quotes, get_price_history, search_instruments) provides. It stops short of explicitly distinguishing itself from siblings, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to use this tool versus alternatives such as get_quotes or get_price_history, and no mention that all three parameters are optional or that defaults apply. Usage must be inferred entirely from the one-line purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_option_chainARead-onlyIdempotent
Option chain with bid/ask/mark, volume, open interest, implied volatility and greeks, nearest expirations first. Use get_option_expirations to pick dates.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Underlying ticker, e.g. "AAPL" or "$SPX". | |
| to_date | No | Latest expiration, YYYY-MM-DD. | |
| from_date | No | Earliest expiration, YYYY-MM-DD. | |
| strike_count | No | Strikes around the money. | |
| contract_type | No | ALL | |
| max_contracts | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered structurally. The description adds the ordering trait "nearest expirations first," which is genuine behavioral context, but says nothing about pagination, rate limits, or default date-range behavior when from_date/to_date are omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with zero filler; the return-value content comes first and the routing hint second, which is the right front-loading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed further, and annotations cover the safety profile. The main gap is that default date-range behavior when from_date/to_date are omitted is left unstated, but for a read-only market-data tool this is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with described params for symbol, from_date, to_date and strike_count. The description adds no parameter-level detail beyond implying date filtering, and the undocumented contract_type and max_contracts remain unexplained in both places. Baseline 3 is appropriate given the schema does most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource (option chain) and enumerates its payload precisely: bid/ask/mark, volume, open interest, implied volatility and greeks. It also distinguishes itself from the date-selection sibling get_option_expirations, so an agent can tell the two apart without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use get_option_expirations to pick dates" explicitly routes the agent to the right alternative for the expiration-window parameters. It gives clear context but offers no exclusion guidance about the other siblings (e.g. get_quotes vs this chain), so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_option_expirationsBRead-onlyIdempotent
All listed option expiration dates for an underlying, with days to expiration.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Underlying ticker. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior, so the safety profile is fully covered without the description. The description adds only 'days to expiration' as return-content context, which is slight but useful given no other behavioral disclosures like ordering or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence with no filler, and the key scope (underlying, expiration dates) is front-loaded. It is efficient, though it stops before any statement that would help an agent choose it over alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with an output schema that carries return structure and annotations that carry the safety profile, the description tells the agent what it gets. The main gap is absence of routing guidance against get_option_chain in the adjacent toolset.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema already documents 'symbol' as the underlying ticker. The description's use of 'underlying' reinforces meaning but adds no syntax or format detail beyond the schema, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (lists) and resource (option expiration dates) scoped to an underlying, and adds the returned derivative (days to expiration). It is distinguishable from get_option_chain in scoping but never names the sibling, so it stops short of explicit differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use statement, no prerequisites, and no mention of the obvious alternative get_option_chain. The usage is only implied by the phrase 'for an underlying' and the tool name, so an agent gets little routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ordersBRead-onlyIdempotent
Recent orders (open, filled, cancelled...) with legs, fills and average fill price. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look back this many days (Schwab max 60). | |
| status | No | Only orders in this status. | |
| account | No | Account label/last digits/nickname. Omit for all. | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the trailing 'Read-only.' largely repeats structured data. The description does add value by disclosing the return shape (legs, fills, average fill price), which the annotations do not cover, but says nothing about pagination or how max_results interacts with the filters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short clauses, front-loaded with the resource and what it returns. Efficient and easy to scan, with only minor redundancy in the 'Read-only.' tail that duplicates the annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and annotations carry the safety profile. The remaining gap is the absence of any when-to-use routing against sibling tools, but for a zero-required-parameter read tool this is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, with days, status, and account well documented in the schema; only max_results lacks a description. The description's '(open, filled, cancelled...)' loosely gestures at the status filter but adds no syntax or format detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Recent orders') and resource with descriptive content (legs, fills, average fill price), going beyond a bare name restatement. It is distinguishable from siblings like get_transactions and get_positions, though it never names or contrasts them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus get_transactions or get_positions, nor any mention of prerequisites such as retrieving an account first. Usage context (recent orders, lookback window) must be inferred from the parameter defaults.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_summaryARead-onlyIdempotent
One-shot overview across all accounts: total value, cash, today's P/L, unrealized P/L, allocation by asset type, top holdings (merged across accounts) and per-account totals.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | How many top holdings to list. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds genuine behavioral context by noting results are merged/aggregated across all accounts, but says nothing about latency, cost, freshness of P/L, or data scope limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the scope phrase and then a compact enumeration of contents. No filler, no redundancy with annotations or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be explained, yet the description helpfully enumerates the key fields. For a zero-required-parameter read tool with full annotations and full param coverage, this is nearly complete; only explicit routing guidance against siblings is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and top_n is fully documented in the schema with a default of 10 and bounds 1-50. The description's 'top holdings' hints at top_n but adds no meaning beyond the schema, so the baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('get_portfolio_summary') with a full enumeration of the contents: total value, cash, today's P/L, unrealized P/L, allocation, top holdings, per-account totals. The phrase 'one-shot overview across all accounts' and 'merged across accounts' clearly distinguishes it from granular siblings like get_positions or list_accounts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The implied usage ('one-shot overview') tells the agent this is the aggregate call rather than a granular one, which is useful context. However, it never explicitly states when to prefer it over get_positions/list_accounts, nor any exclusions or prerequisites. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_positionsARead-onlyIdempotent
Holdings per account: quantity, average cost, market value, unrealized and today's P/L, and weight in the account. Sorted by market value. Set include_quotes=true for live last/mark prices.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | No | Only return positions in this symbol. | |
| account | No | Account label (e.g. ****1234), last digits or nickname. Omit for all. | |
| include_quotes | No | Also fetch a real-time quote for every holding (adds a `live` block). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is low. Beyond them, the description discloses the result ordering ('Sorted by market value') and that quote fetching yields 'live last/mark prices', which is genuine behavioral context. It still doesn't note the added latency or extra request cost of include_quotes=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler: the field inventory and sort behavior come first, and the optional live-quote toggle is placed last. Every clause carries information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple read-only tool with all parameters documented and an output schema that carries the return shape, so the description does not need to define return values in detail. The gaps, mainly routing guidance versus get_portfolio_summary, are modest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (symbol, account, include_quotes) are already documented in the schema, establishing a baseline of 3. The description's note about include_quotes adding live last/mark prices partially duplicates the schema's 'adds a `live` block' text and adds little beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (holdings per account) and enumerates the returned fields (quantity, average cost, market value, unrealized and today's P/L, weight), which lets an agent tell it apart from generic siblings like get_portfolio_summary. However, it never names a sibling or explicitly contrasts itself with the portfolio/summary tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one inline usage instruction ('Set include_quotes=true for live last/mark prices'), which is helpful but only covers one parameter choice. There is no guidance on when to prefer this over get_portfolio_summary, get_orders, or get_transactions, and no stated prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_price_historyBRead-onlyIdempotent
OHLCV candles plus a summary (change, % change, high/low, average volume) for a period.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Lookback window, ignored when start_date is set. | 1M |
| symbol | Yes | Ticker, e.g. "AAPL" or "$SPX". | |
| end_date | No | YYYY-MM-DD (default today). | |
| interval | No | Candle size. Minute candles only work with day periods (1D-10D) or with start_date. Default picks a sensible size. | |
| start_date | No | YYYY-MM-DD; overrides `period`. | |
| max_candles | No | Return only the most recent N candles; the summary always covers the full range. | |
| extended_hours | No | Include pre/post-market candles (intraday). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds that results bundle candles with an aggregate summary, but says nothing about data source, latency, or rate limits; for an open-world market-data read, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the primary payload (OHLCV candles) and then the secondary summary fields. Every clause carries information; nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema present, the description need not explain return values, and it correctly focuses on what data comes back. Combined with 100% schema coverage, an agent has nearly everything needed; only the choice against get_quotes is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all seven parameters, including the enum, defaults, and the period/start_date override relationship. The description adds no parameter detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete output (OHLCV candles plus change, % change, high/low, and average volume) and scopes it to a period, so an agent knows exactly what data it returns. It does not, however, explicitly differentiate itself from the sibling get_quotes tool, which is the nearest conceptual neighbor.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives such as get_quotes, nor any prerequisites or exclusions. 'For a period' hints at historical rather than real-time data, but the routing decision is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quotesBRead-onlyIdempotent
Real-time quotes: last, bid/ask, day change and %, volume, day range, 52-week range, plus greeks for options and optional fundamentals.
| Name | Required | Description | Default |
|---|---|---|---|
| symbols | Yes | Ticker symbols, e.g. ["AAPL", "SPY", "$SPX", "/ES"] or "AAPL,MSFT". Option symbols use the OCC format, e.g. "AAPL 250117C00200000". | |
| include_fundamentals | No | Include P/E, EPS, dividend yield and similar fields. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, and non-destructive behavior. The description adds the real-time nature of the data and what fields are returned, but does not mention rate limits, auth requirements, or data freshness guarantees beyond 'real-time'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single front-loaded sentence with no filler. The field list is somewhat lengthy, but it remains readable and efficiently conveys the tool's scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only quote tool with full parameter documentation, rich annotations, and a separate output schema, the description provides enough context to invoke it. The main omission is guidance on choosing it over historical or option-chain siblings, which is a usage-guideline gap rather than a fundamental completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the symbols format and include_fundamentals are fully documented by the schema. The description only alludes to optional fundamentals, adding little beyond the baseline for a high-coverage schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (real-time quotes) and enumerates the returned fields, including options greeks and optional fundamentals. It distinguishes itself from historical tools through the 'Real-time' qualifier, though it does not name a sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is provided. The agent must infer that this tool is for current quotes rather than historical data and that get_price_history is the alternative; the description offers no routing or prerequisite information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionsBRead-onlyIdempotent
Account history: trades, dividends, interest, deposits/withdrawals and fees, newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look back this many days (max 365). | |
| types | No | Transaction types, e.g. ["TRADE", "DIVIDEND_OR_INTEREST"]. Omit for all. | |
| symbol | No | Only transactions involving this symbol. | |
| account | No | Account label/last digits/nickname. Omit for all. | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description usefully adds the 'newest first' ordering, but says nothing about pagination, truncation, or the 100-default/1000-max result cap that affects behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and its contents are stated immediately and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, return format need not be explained, and the description covers the resource scope plus ordering. It falls short only on the sibling boundary with get_orders and the result-cap/pagination behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the schema already documents days, types, symbol and account; the description only loosely echoes the type categories. Since structured data does the heavy lifting, baseline 3 is appropriate, with max_results left undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (account transaction history) and enumerates the included categories (trades, dividends, interest, deposits/withdrawals, fees), so an agent knows what comes back. It does not, however, differentiate itself from close siblings like get_orders, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance or named alternative. The overlap with get_orders (which also returns trade activity) is left entirely to inference, so the agent has no stated rule for choosing this tool over that one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsARead-onlyIdempotent
List the linked Schwab accounts with type, nickname and key balances (total value, cash,
buying power). Use the returned account labels with the other tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered elsewhere. The description only adds a restatement of the returned fields, which the output schema also provides, so it contributes little behavioral context beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler; the purpose is front-loaded and the cross-tool hint follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema present, and annotations covering the safety profile, the description is nearly sufficient. Only minor gaps remain, such as whether multiple accounts can be returned or whether authentication must already be established.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero input parameters, so there is nothing for the description to disambiguate; baseline is 4. The description's mention of returned fields is output-side, not parameter-side.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the linked Schwab accounts') and enumerates the returned fields (type, nickname, total value, cash, buying power). It is naturally distinguishable from siblings like get_positions or get_portfolio_summary, but it never explicitly contrasts itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives clear workflow context: use the returned `account` labels with the other tools, positioning this as the discovery/entry step. It does not name an alternative or state a when-not condition, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_instrumentsBRead-onlyIdempotent
Look up instruments by symbol or company name, or get fundamentals for a symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Symbol or company-name text, e.g. "NVDA" or "nvidia". | |
| search_type | No | `description` searches company names; `fundamental` returns P/E, market cap, beta, margins... for an exact symbol. | symbol |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds a modest behavioral nuance: the fundamental mode returns a different shape of data than a plain lookup, which is a mode-dependent return trait rather than mere repetition. It says nothing about result limits, pagination, or whether the search is exact-match, so it does not go far 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the primary capability comes first and the secondary fundamental mode follows. Slightly muddy because it compresses three distinct behaviors into one compound sentence that reads as one capability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values need not be explained, and annotations cover safety. But the tool exposes five search types and the description addresses only three, leaving symbol_regex and description_regex behavior entirely to the schema, and one required plus one optional parameter with a default is thin coverage for a multi-mode search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, including the enum values and the example query. The description restates symbol/company-name/fundamentals use but adds no syntax, matching behavior, or regex-mode detail beyond what the schema provides. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb ('look up') plus the resource ('instruments') and enumerates the lookup modes: by symbol, by company name, or fundamentals for a symbol. It is distinguishable from siblings like get_quotes or get_price_history, which retrieve data rather than resolve identifiers. It stops short of naming a sibling, so it is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The three clauses imply when each mode applies (symbol lookup, name lookup, fundamentals), which is useful implied guidance. However, there is no explicit when-to-use/when-not framing, no guidance on choosing among the five enum values, and no routing to alternatives such as get_quotes once a symbol is resolved.
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.
14 tool updates
v0.1.0- First observed
get_auth_status - First observed
get_current_time - First observed
get_market_hours - First observed
get_movers - First observed
get_option_chain - First observed
get_option_expirations - First observed
get_orders - First observed
get_portfolio_summary - First observed
get_positions - First observed
get_price_history - First observed
get_quotes - First observed
get_transactions - First observed
list_accounts - First observed
search_instruments
TDQS
Scored across 14 tools
Most tools target distinct resource/action pairs, and descriptions clarify boundaries. There is some conceptual overlap between get_positions and get_portfolio_summary, and between get_orders and get_transactions, but they are distinguished by detail level and scope.
All tool names use snake_case with a consistent verb_noun pattern such as get_*, list_*, and search_*. The naming is predictable throughout the set.
14 tools is well-scoped for a read-only Schwab brokerage and market-data server. Each tool covers a clear area such as accounts, quotes, options, orders, or time, without excessive duplication.
The read-only surface is strong: auth, accounts, positions, portfolio, orders, transactions, quotes, price history, options, market hours, movers, instruments, and time are all covered. Missing write/trading operations like placing or cancelling orders and minor extras like watchlists or news are the main gaps.
Maintenance
Related MCP Connectors
Agentic brokerage access to a US brokerage account: quotes, orders, positions, cash and documents.
Financial data MCP server for Claude, ChatGPT, Cursor and Codex. Real-time stock quotes, financial statements, options flow, SEC filings, insider trades, 13F holdings, macro data and market news from gloom.sh, the open-source Bloomberg Terminal alternative.
A Model Context Protocol server exposing real-time and historical Colombo Stock Exchange (CSE) data to AI agents and LLM applications. Provides quotes and OHLCV price history, full financial statements (income, balance sheet, cash flow), pre-computed technicals (moving averages, RS ratings, volume signals), macroeconomic indicators, corporate actions, and rule-based screening across CSE stocks and sector indices, everything needed to build CSE-aware trading assistants, research tools, and market-analysis agents. This is the official MCP server of www.ceyloncharts.com
MCP server for OpenMM — exposes market data, account, trading, and strategy tools to AI agents
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA server that implements the Model Context Protocol for Schwab API, allowing access to account information, positions, stock quotes, and order/transaction history designed for integration with Large Language Models.61MIT
- AlicenseAqualityDmaintenanceA read-only MCP server that provides access to Charles Schwab account data and market information, including portfolio positions, real-time quotes, options chains, price history, and account balances through AI assistants.9MIT
- AlicenseNot gradedqualityDmaintenanceA read-only Model Context Protocol server that connects your Schwab brokerage account to LLM applications for portfolio monitoring and market data retrieval.MIT
- AlicenseAqualityBmaintenanceA read-only MCP server for Trading 212 accounts, enabling AI assistants to query balances, positions, orders, dividends, pies, and instruments without trading capabilities.121MIT