Schwab MCP Server
Click on "Install 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 MCP Servershow me my current portfolio positions"
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 Server
A read-only Model Context Protocol (MCP) server for Charles Schwab API. Access your Schwab account data and market information through AI assistants like Claude, ChatGPT, and more.
Features
Portfolio Analysis - View positions with cost basis, quantity, and market value
Real-time Quotes - Get current prices for stocks and ETFs
Options Data - Access options chains with Greeks
Price History - Historical OHLCV data for technical analysis
Account Info - View account balances and details
Security Note: This server is strictly READ-ONLY. No trading or account modification functionality is implemented.
Related MCP server: t212-mcp
Prerequisites
Python 3.10 or higher
A Charles Schwab Developer account with:
App Key (Client ID)
App Secret (Client Secret)
A valid Refresh Token
Callback URL configured
Installation
Clone the repository:
git clone https://github.com/yourusername/schwab-mcp-server.git
cd schwab-mcp-serverCreate and activate a virtual environment:
python -m venv venv
# On macOS/Linux:
source venv/bin/activate
# On Windows:
venv\Scripts\activateInstall the package:
pip install -e .Configuration
Environment Variables
Create a .env file in the project root:
SCHWAB_CALLBACK_URL=https://127.0.0.1:8182/callback
SCHWAB_TOKEN_PATH=~/.schwab-mcp/token.json
LOG_LEVEL=INFO
# Optional overrides if you don't keep them in the token file:
# SCHWAB_CLIENT_ID=your_app_key_here
# SCHWAB_CLIENT_SECRET=your_app_secret_hereInitial Token Setup
Create the token file at the path specified in SCHWAB_TOKEN_PATH (default: ~/.schwab-mcp/token.json):
{
"client_id": "your_app_key_here",
"client_secret": "your_app_secret_here",
"access_token": "",
"refresh_token": "YOUR_REFRESH_TOKEN_HERE",
"expires_at": 0,
"token_type": "Bearer"
}Setting expires_at to 0 forces an automatic token refresh on first use.
The MCP server will load client_id and client_secret directly from this token file. Environment variables with the same names can override these values if needed.
Client Setup
Claude Desktop
Windows (Automated)
Run the PowerShell script to automatically configure Claude Desktop:
.\scripts\update_claude_schwab.ps1The script will:
Stop Claude Desktop (prompts for confirmation)
Clear MCP-related cache files
Update the config with correct paths to the venv Python and src directory
Restart Claude Desktop
Options:
-RepoPath- Path to this repo (default: auto-detected)-SkipRestart- Update config without restarting Claude-ServerName- MCP server name in config (default:schwab)
Manual Configuration
macOS: Edit ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: Edit %APPDATA%\Claude\claude_desktop_config.json
Add the following configuration:
{
"mcpServers": {
"schwab": {
"command": "python",
"args": ["-m", "schwab_mcp.server"],
"cwd": "/path/to/schwab-mcp-server",
"env": {
"SCHWAB_CALLBACK_URL": "https://127.0.0.1:8182/callback",
"SCHWAB_TOKEN_PATH": "/path/to/.schwab-mcp/token.json",
"PYTHONPATH": "/path/to/schwab-mcp-server/src",
"LOG_LEVEL": "INFO"
}
}
}
}Restart Claude Desktop after saving the configuration.
ChatGPT Desktop
ChatGPT Desktop supports MCP servers through its settings. To configure:
Open ChatGPT Desktop
Go to Settings > Features > MCP Servers
Click Add Server and enter:
Name:
schwabCommand:
pythonArguments:
-m schwab_mcp.serverWorking Directory:
/path/to/schwab-mcp-server
Add environment variables (client id/secret are read from the token file):
SCHWAB_CALLBACK_URL: https://127.0.0.1:8182/callbackSCHWAB_TOKEN_PATH: /path/to/.schwab-mcp/token.json
Save and restart ChatGPT Desktop
File-based setup (auto-detected by ChatGPT Desktop):
macOS: create
~/Library/Application Support/ChatGPT/.well-known/mcp.jsonWindows: create
%APPDATA%\ChatGPT\.well-known\mcp.json
Copy chatgpt_desktop_config.example.json to that location and update the paths to match your environment (Python executable, repo path, and token path). Restart ChatGPT Desktop after saving.
Claude Code (CLI)
Add the MCP server to your Claude Code configuration. Create or edit ~/.claude/claude_code_config.json:
{
"mcpServers": {
"schwab": {
"command": "python",
"args": ["-m", "schwab_mcp.server"],
"cwd": "/path/to/schwab-mcp-server",
"env": {
"SCHWAB_CALLBACK_URL": "https://127.0.0.1:8182/callback",
"SCHWAB_TOKEN_PATH": "/path/to/.schwab-mcp/token.json"
}
}
}
}Alternatively, you can add it to your project's .claude/settings.json for project-specific configuration:
{
"mcpServers": {
"schwab": {
"command": "python",
"args": ["-m", "schwab_mcp.server"],
"cwd": "/path/to/schwab-mcp-server",
"env": {
"SCHWAB_CALLBACK_URL": "https://127.0.0.1:8182/callback",
"SCHWAB_TOKEN_PATH": "/path/to/.schwab-mcp/token.json"
}
}
}
}OpenAI Codex
For Codex CLI, configure the MCP server in your environment:
Set up environment variables in your shell profile (
.bashrc,.zshrc, etc.):
export SCHWAB_CALLBACK_URL="https://127.0.0.1:8182/callback"
export SCHWAB_TOKEN_PATH="$HOME/.schwab-mcp/token.json"
# Optional overrides if you don't keep them in the token file:
# export SCHWAB_CLIENT_ID="your_client_id"
# export SCHWAB_CLIENT_SECRET="your_client_secret"Configure Codex to use the MCP server by adding to your Codex configuration:
{
"mcpServers": {
"schwab": {
"command": "python",
"args": ["-m", "schwab_mcp.server"],
"cwd": "/path/to/schwab-mcp-server"
}
}
}Available Tools
Tool | Description |
| Get account information including type and balances |
| Get all positions with cost basis and market value |
| Get real-time quote for a single symbol |
| Get real-time quotes for multiple symbols |
| Get options chain with Greeks for a symbol |
| Get historical OHLCV price data |
Usage Examples
Once configured, you can ask your AI assistant questions like:
"What are my current positions and their cost basis?"
"Get me a quote for AAPL"
"Show me the options chain for MSFT expiring in January"
"What's the price history for NVDA over the last 6 months?"
"What are my account balances?"
Testing
Using MCP Inspector
Test the server locally using the MCP Inspector:
npx @modelcontextprotocol/inspector python -m schwab_mcp.serverManual Test
Verify authentication is working:
python -c "from schwab_mcp.auth import TokenManager; from schwab_mcp.config import settings; tm = TokenManager(settings.schwab_client_id, settings.schwab_client_secret, settings.schwab_token_path); tm.load_token(); print('Token loaded successfully')"Troubleshooting
Token Refresh Fails
Ensure your refresh token is valid and not expired (7-day expiration)
Verify your client ID and secret are correct
Check that your Schwab Developer app is approved and active
Server Won't Start
Verify Python 3.10+ is installed:
python --versionEnsure all dependencies are installed:
pip install -e .Check that the
.envfile exists and has correct values
No Data Returned
Confirm your Schwab account has the appropriate permissions
Check if markets are open (some data limited outside trading hours)
Review logs for API error messages
Security
Read-only access only - No trading or account modification capabilities
Token storage - Tokens are stored locally with restricted file permissions (600)
No credential logging - Sensitive data is never written to logs
Environment variables - Credentials should be passed via environment, not hardcoded
References
License
MIT - Use at your own risk. Not affiliated with Charles Schwab.
Available Tools
9 toolsget_data_schemaB
Get schema information for market data tables including column definitions, available data, and example SQL queries for common analyses like volume profile.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It describes what information is returned but doesn't address important behavioral aspects such as whether this is a read-only operation (implied by 'get'), potential rate limits, authentication requirements, or response format. The description adds some context about content but lacks operational transparency.
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 description is a single, well-structured sentence that efficiently conveys the tool's purpose and scope. It front-loads the main action ('get schema information') and includes relevant details without redundancy. Every part of the sentence contributes meaning, though it could be slightly more concise by removing 'like volume profile' which is somewhat extraneous.
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?
Given the tool has no parameters, no annotations, and no output schema, the description provides a basic understanding of what the tool does. However, it lacks details on behavioral traits (e.g., safety, performance) and doesn't explain the return format or structure. For a schema retrieval tool, more information about the output (e.g., JSON structure, example response) would enhance completeness, but the absence of an output schema means the description doesn't fully compensate.
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?
The tool has 0 parameters, and schema description coverage is 100% (though trivial since there are no parameters). The description appropriately doesn't discuss parameters, which is correct for a parameterless tool. It adds value by explaining what schema information is retrieved without needing to compensate for parameter documentation gaps.
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 clearly states the tool's purpose with specific verbs ('get schema information') and resources ('market data tables'), including what information is retrieved (column definitions, available data, example SQL queries). It distinguishes from siblings by focusing on schema metadata rather than actual data retrieval or queries. However, it doesn't explicitly contrast with each sibling tool.
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 description provides no guidance on when to use this tool versus alternatives. While it mentions 'example SQL queries for common analyses,' it doesn't specify when this tool is appropriate compared to direct querying tools like 'query_market_data' or data retrieval tools like 'get_quote.' There are no explicit when/when-not statements or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_instrumentsC
Search for instruments by symbol or description, or get fundamental data for a symbol
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Symbol or search term to look up | |
| projection | No | Type of search: symbol-search (default), symbol-regex, desc-search, desc-regex, search, or fundamental | symbol-search |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions search and data retrieval functions but doesn't cover critical aspects like whether this is a read-only operation, potential rate limits, authentication needs, or what happens with invalid inputs. This leaves significant gaps for an agent to understand the tool's 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?
The description is a single, efficient sentence that front-loads the core functionality without any wasted words. It directly communicates the tool's purpose in a compact form, making it easy to parse quickly.
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?
Given the lack of annotations and output schema, the description is incomplete for a tool with two parameters and multiple search types. It doesn't explain return values, error handling, or behavioral constraints, which are essential for proper agent usage in this context.
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 already documents both parameters thoroughly. The description adds minimal value by mentioning 'symbol or description' and 'fundamental data', which loosely map to parameters but don't provide additional syntax or format details beyond what the schema specifies.
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 clearly states the tool's purpose with specific verbs ('search' and 'get') and resources ('instruments' and 'fundamental data'), making it easy to understand what the tool does. However, it doesn't explicitly distinguish this from sibling tools like 'get_quote' or 'get_quotes', which might also retrieve instrument-related data.
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 description provides no guidance on when to use this tool versus alternatives like 'get_quote' or 'get_quotes', nor does it mention any prerequisites or exclusions. It implies usage through its functional description but lacks explicit context for selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_moversB
Get top movers (gainers or losers) for an index by percent or value change
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | Market index: $DJI (Dow Jones), $COMPX (NASDAQ Composite), $SPX (S&P 500), NYSE, NASDAQ, OTCBB, INDEX_ALL, EQUITY_ALL, OPTION_ALL, OPTION_PUT, OPTION_CALL | $DJI |
| direction | No | Mover direction: up (gainers) or down (losers) | up |
| change | No | Metric used to rank movers (percent or value change) | percent |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It describes the tool's function but lacks details on behavioral traits such as rate limits, authentication needs, output format, or whether it's a read-only operation. This leaves significant gaps for an agent to understand how to interact with it effectively.
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 description is a single, efficient sentence that front-loads the core purpose ('Get top movers') and includes key details without waste. Every word contributes to understanding the tool's function, making it appropriately sized and well-structured.
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?
Given the tool's moderate complexity (3 parameters with enums) and no output schema, the description is adequate but incomplete. It covers the basic purpose and parameters but lacks information on return values, error handling, or behavioral constraints, which are important for an agent to use it correctly without annotations.
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?
The schema description coverage is 100%, with clear descriptions for all parameters (index, direction, change) including enums and defaults. The description adds minimal value beyond the schema by summarizing the parameters ('by percent or value change'), but doesn't provide additional context or usage examples, so it meets the baseline for high schema coverage.
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 clearly states the tool's purpose with specific verbs ('Get top movers') and resources ('for an index'), specifying what kind of data it retrieves. It distinguishes itself from siblings by focusing on market movers rather than quotes, positions, or schemas, though it doesn't explicitly contrast with similar tools like query_market_data.
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 description implies usage context by mentioning 'gainers or losers' and 'percent or value change,' suggesting when to use it for ranking market movements. However, it lacks explicit guidance on when to choose this tool over alternatives like get_quote or query_market_data, and no exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_positionsC
Get all positions with cost basis, quantity, market value, and gain/loss for an account
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Account hash (optional, uses first account if not provided) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states what data is returned but doesn't cover critical aspects like whether this is a read-only operation (implied by 'Get' but not explicit), potential rate limits, authentication requirements, error conditions, or response format. For a financial data tool with zero annotation coverage, this leaves significant gaps in understanding its 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?
The description is a single, efficient sentence that front-loads the core purpose ('Get all positions') followed by specific data fields. Every word earns its place with zero redundancy or wasted phrasing. It's appropriately sized for a simple retrieval tool.
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?
Given the complexity (financial data retrieval), lack of annotations, and no output schema, the description is incomplete. It doesn't explain the return structure, pagination, error handling, or data freshness—critical context for an agent to use this tool effectively. The description alone is insufficient for reliable tool invocation despite good conciseness.
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 input schema fully documents the single optional parameter (account_id). The description adds no additional parameter semantics beyond implying the tool operates on an account. Since the schema already provides complete parameter documentation, the baseline score of 3 is appropriate—the description doesn't add value here but doesn't need to compensate for gaps.
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 clearly states the action ('Get all positions') and specifies the data fields returned (cost basis, quantity, market value, gain/loss) for a specific resource (account). It distinguishes from siblings like get_quote or get_quotes by focusing on portfolio positions rather than market data. However, it doesn't explicitly differentiate from all siblings (e.g., get_instruments might overlap in scope).
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 description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, timing considerations, or compare it to sibling tools like get_instruments or query_market_data. The agent must infer usage solely from the tool name and description without explicit context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quoteB
Get real-time quote for a stock symbol including price, bid/ask, volume, and fundamentals
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Stock ticker symbol (e.g., 'AAPL', 'CRM') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but only states what data is returned, not behavioral traits. It doesn't disclose whether this is a cached or live feed, rate limits, authentication requirements, error conditions, or what happens with invalid symbols. For a real-time data tool with zero annotation coverage, this is insufficient.
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?
Single sentence, front-loaded with the core purpose, efficiently lists included data fields without unnecessary elaboration. Every word earns its place—no redundant phrases or structural waste.
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?
Given one parameter with full schema coverage and no output schema, the description adequately covers the basic purpose but lacks context for a real-time data tool. It doesn't explain return format, error handling, or behavioral nuances, making it minimally viable but with clear gaps in completeness.
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% with one well-documented parameter, so the baseline is 3. The description adds no additional parameter semantics beyond what the schema provides (it doesn't clarify symbol format constraints, exchange requirements, or validation rules). The description's mention of 'stock symbol' aligns with but doesn't expand upon the 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 clearly states the verb 'Get' and resource 'real-time quote for a stock symbol', specifying what data is included (price, bid/ask, volume, fundamentals). It distinguishes from siblings like 'get_quotes' (plural) by focusing on a single symbol, but doesn't explicitly contrast with other market data tools like 'get_movers' or 'load_price_history'.
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 guidance on when to use this tool versus alternatives like 'get_quotes' (plural), 'load_price_history', or 'query_market_data'. The description implies it's for real-time single-symbol quotes but doesn't state exclusions or prerequisites, leaving the agent to infer usage context from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_quotesC
Get real-time quotes for multiple symbols at once
| Name | Required | Description | Default |
|---|---|---|---|
| symbols | Yes | List of ticker symbols |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool provides 'real-time quotes' but doesn't cover critical aspects like rate limits, authentication needs, data freshness, error handling, or response format. For a data-fetching tool with zero annotation coverage, this leaves significant gaps in understanding its operation.
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 description is a single, efficient sentence that front-loads the key information ('Get real-time quotes for multiple symbols at once'). It wastes no words and directly communicates the core functionality, making it highly concise and well-structured.
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?
Given the lack of annotations and output schema, the description is incomplete for a tool that fetches market data. It doesn't explain what the quotes include (e.g., price, volume), how results are returned, or any limitations. For a tool with no structured behavioral or output information, the description should provide more context to be fully helpful.
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?
The input schema has 100% description coverage, with the 'symbols' parameter clearly documented as 'List of ticker symbols'. The description adds no additional parameter details beyond what the schema provides, such as format examples or constraints. With high schema coverage, the baseline score of 3 is appropriate as 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?
The description clearly states the action ('Get') and resource ('real-time quotes for multiple symbols'), making the purpose understandable. However, it doesn't explicitly differentiate from sibling tools like 'get_quote' (singular) or 'query_market_data', which might offer similar functionality. The description is specific about batch processing ('multiple symbols at once') but lacks sibling distinction.
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 guidance is provided on when to use this tool versus alternatives. The description doesn't mention prerequisites, exclusions, or compare it to siblings like 'get_quote' (which might handle single symbols) or 'query_market_data' (which could offer broader market data). Usage context is implied by the batch nature but not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_option_chainA
Fetch option chain and load into SQL database for querying. Use this instead of get_option_chain when you need to analyze the data with SQL. After loading, use query_market_data to run SQL queries.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Underlying stock symbol | |
| contract_type | No | Type of options to retrieve | ALL |
| strike_count | No | Number of strikes above and below ATM (default: all strikes) | |
| from_date | No | Start date for expirations (YYYY-MM-DD) | |
| to_date | No | End date for expirations (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that data is loaded into a SQL database (important behavioral context), but doesn't mention permissions needed, whether this is a read/write operation, potential data volume limitations, or what happens if the database already contains data. It adds some value but leaves significant behavioral gaps.
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?
Three concise sentences with zero waste: first states purpose, second provides usage guidance with alternative, third gives next-step workflow. Every sentence earns its place and information is front-loaded appropriately.
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 tool with 5 parameters, 100% schema coverage, and no output schema, the description provides good contextual completeness. It explains the purpose, when to use it, and what to do next. However, as a data loading tool with no annotations, it should ideally mention more about the SQL database behavior (permissions, overwrite policy, etc.).
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 already documents all 5 parameters thoroughly. The description doesn't add any parameter-specific information beyond what's in the schema, but doesn't need to since schema coverage is complete. Baseline 3 is appropriate when 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?
The description clearly states the specific action ('Fetch option chain and load into SQL database') and distinguishes it from sibling 'get_option_chain' by specifying when to use this alternative ('when you need to analyze the data with SQL'). It provides both verb and resource with clear 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?
The description explicitly states when to use this tool ('Use this instead of get_option_chain when you need to analyze the data with SQL') and provides a clear workflow ('After loading, use query_market_data to run SQL queries'), giving both alternatives and next steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_price_historyA
Fetch price history and load into SQL database for querying. Use this instead of get_price_history when you need to analyze the data with SQL. After loading, use query_market_data to run SQL queries.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Stock ticker symbol | |
| period_type | No | Type of period (default: year) | year |
| period | No | Number of periods (default: 1) | |
| frequency_type | No | Frequency of data points (default: daily) | daily |
| frequency | No | Frequency interval (default: 1) | |
| start_date | No | Start date (YYYY-MM-DD), alternative to period | |
| end_date | No | End date (YYYY-MM-DD) | |
| extended_hours | No | Include extended hours data (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the tool's primary behavior (fetching and loading data into a database) and mentions the need for subsequent querying, but lacks details about permissions, rate limits, error handling, or what 'loading' entails (e.g., overwriting existing data, appending). It doesn't contradict annotations, but could provide more operational context.
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 description is extremely concise and well-structured in just two sentences. The first sentence states the purpose and differentiation, while the second provides usage guidance and workflow. Every word earns its place with no redundancy or fluff.
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 tool with 8 parameters, 100% schema coverage, and no output schema, the description provides good contextual completeness. It explains the tool's purpose, differentiation, and workflow. However, it could be more complete by mentioning what happens after loading (e.g., confirmation message, error handling) or prerequisites, though the lack of annotations means some behavioral gaps remain.
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?
The schema description coverage is 100%, meaning all parameters are documented in the schema itself. The description doesn't add any specific parameter semantics beyond what's in the schema (e.g., it doesn't explain how 'period' interacts with 'period_type' or provide examples). Since the schema does the heavy lifting, the baseline score of 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?
The description clearly states the tool's purpose with specific verbs ('fetch price history' and 'load into SQL database') and distinguishes it from sibling tools by explicitly mentioning 'use this instead of get_price_history'. It identifies the resource (price history) and the transformation (loading into SQL database).
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 description provides explicit guidance on when to use this tool ('when you need to analyze the data with SQL') and when not to use it (instead of get_price_history). It also specifies the workflow by mentioning the subsequent tool to use ('After loading, use query_market_data to run SQL queries').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_market_dataA
Run SQL query against loaded market data (price_history and options tables). First use load_price_history or load_option_chain to load data, then query it. Only SELECT queries are allowed. Use get_data_schema to see table schemas and example queries.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | SQL SELECT query to run against loaded market data. Available tables: 'price_history' (OHLCV data) and 'options' (option chain with Greeks). Only SELECT queries are allowed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively communicates key constraints: data must be pre-loaded, only SELECT queries are permitted, and specific tables are available. However, it doesn't mention potential limitations like query timeout, result size limits, or error handling, leaving some behavioral aspects unspecified.
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 description is efficiently structured with three sentences that each serve a distinct purpose: stating the tool's function, providing prerequisites and constraints, and directing to related tools. There is no wasted text, and critical information is front-loaded.
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?
Given the tool's complexity (SQL query execution with dependencies) and lack of annotations/output schema, the description is mostly complete. It covers purpose, prerequisites, constraints, and related tools. However, it doesn't explain what the query returns (e.g., result format, error responses), which would be helpful since there's no output schema.
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 already fully documents the single 'sql' parameter. The description adds minimal value beyond the schema by reiterating that it's a SELECT query against specific tables, but doesn't provide additional syntax, format examples, or constraints not already in the schema description.
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 clearly states the tool's purpose with specific verbs ('run SQL query') and resources ('against loaded market data'), explicitly naming the tables ('price_history and options tables'). It distinguishes from siblings by specifying this is for querying loaded data, unlike tools like get_quote or load_price_history.
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 description provides explicit usage instructions: 'First use load_price_history or load_option_chain to load data, then query it' and 'Only SELECT queries are allowed.' It also directs users to get_data_schema for table schemas and examples, clearly differentiating when to use this tool versus alternatives.
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. Dates show when Glama detected each change.
9 tool updates
v1.0.0- First observed
get_data_schema - First observed
get_instruments - First observed
get_movers - First observed
get_positions - First observed
get_quote - First observed
get_quotes - First observed
load_option_chain - First observed
load_price_history - First observed
query_market_data
TDQS
Most tools have distinct purposes, but there is some overlap between get_quote and get_quotes, which could cause confusion as they differ only in handling single vs. multiple symbols. The load_* tools and query_market_data are clearly differentiated by their data loading vs. querying roles, and other tools like get_positions and get_movers target unique functions.
All tool names follow a consistent verb_noun pattern using snake_case, such as get_instruments, load_option_chain, and query_market_data. This uniformity makes the tool set predictable and easy to navigate, with no deviations in naming conventions.
With 9 tools, the server is well-scoped for market data and trading analysis, covering key areas like quotes, positions, movers, instruments, and SQL-based data handling. Each tool serves a clear purpose without redundancy, making the count appropriate for the domain.
The tool set provides strong coverage for market data retrieval and analysis, including real-time quotes, historical data, options, and positions. A minor gap exists in the lack of tools for executing trades or managing orders, which might be expected in a trading context, but the available tools support comprehensive data workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Multi-tenant FastMCP server for Charles Schwab brokerage data, monetized via DPYC Tollbooth
MCP server for OpenMM — exposes market data, account, trading, and strategy tools to AI agents
Hosted MCP for stocks, options, Greeks, brokers, order previews, alerts, and workflows.
MCP server giving AI agents one-connection access to China A-share market intelligence: financials,
Related MCP Servers
- 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

wealthapi-mcpofficial
AlicenseAqualityBmaintenanceMCP server that enables AI assistants to answer portfolio questions about a wealthAPI account, with read-only tools for accounts, transactions, investments, dividends, and market data.2164MIT- FlicenseAqualityCmaintenanceMCP server for read-only access to Charles Schwab market data and account information. It provides quotes, price history, technical indicators, fundamentals, option chains, market hours, movers, and account/transaction data via the official Schwab API.10-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/acidsolution/schwab-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server