Atlas / MCP servers / sudowealth / Schwab

SchwabBLOCK

mcp/sudowealth/schwab-1

Schwab MCP server that enables AI assistants like Claude to retrieve and interact with your Schwab accounts and Schwab market data.

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
22 18r · 4w · 0d
Transport
—
License
—
Stars
81
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

A Model Context Protocol (MCP) server that enables AI assistants like Claude to securely interact with Charles Schwab accounts and market data through the official Schwab API.

What You Can Do

Ask Claude to:

  • "Show me my Schwab account balances and positions"
  • "Get real-time quotes for AAPL, GOOGL, and MSFT"
  • "What are today's market movers in the $SPX?"
  • "Show me the options chain for TSLA with Greeks"
  • "Get my transactions from the last 30 days"
  • "Search for ETFs related to technology"
  • "Check if the markets are open"

Unofficial MCP Server

This is an unofficial, community-developed TypeScript MCP server for Charles Schwab. It has not been approved, endorsed, or certified by Charles Schwab. It is provided as-is, and its functionality may be incomplete or unstable. Use at your own risk, especially when dealing with financial data or transactions.

Overview

This MCP server acts as a bridge between AI assistants and the Schwab API, providing:

  • Secure OAuth Authentication: Implements Schwab's OAuth 2.0 flow with PKCE

for secure authentication

  • Comprehensive Trading Tools: Access to accounts, orders, quotes, and

transactions

  • Market Data Tools: Real-time quotes, price history, market hours, movers,

and options chains

  • Account Privacy: Built-in account identifier scrubbing to protect

sensitive information

  • Enterprise-Ready: Deployed on Cloudflare Workers with Durable Objects for

state management

Features

Trading Tools

  • Account Management
  • getAccounts: Retrieve all account information with positions and balances
  • getAccountNumbers: Get list of account identifiers
  • Order Management
  • getOrder: Get order by ID
  • getOrders: Fetch orders with filtering by status, time range, and symbol
  • getOrdersByAccountNumber: Get orders by account number
  • cancelOrder: Cancel an order (Experimental)
  • placeOrder: Place an order (Experimental)
  • replaceOrder:
Read from source at commit e57f606d61ebOBSERVED · 2026-10-08
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add schwab-mcp -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "schwab-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ]
    }
  }
}
03

Exposed tools (22)

18 read · 4 write · 0 destructive.

ToolRiskDescription
cancelOrderwriteCancel order by order id for a specific account
getAccountreadGet account
getAccountNumbersreadGet account numbers
getAccountsreadGet accounts
getInstrumentByCusipreadGet instrument by cusip
getMarketHoursreadGet market hours for different markets
getMarketHoursByMarketIdreadGet market hours for a specific market
getMoversreadGet movers for a specific index
getOptionChainreadGet option chain for an optionable symbol
getOptionExpirationChainreadGet option expiration chain for an optionable symbol
getOrderwriteGet order by order id for a specific account
getOrdersreadGet orders
getOrdersByAccountNumberreadGet orders by account number
getPriceHistoryreadGet price history for a specific symbol and date range
getQuoteBySymbolIdreadGet quote for a one symbol
getQuotesreadGet quotes for a list of symbols
getTransactionreadGet transaction
getTransactionsreadGet transactions
getUserPreferencereadGet user preference
placeOrderwritePlace order for a specific account
replaceOrderwriteReplace order by order id for a specific account
searchInstrumentsreadSearch for instruments by symbols and projections
04

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
UNDECLARED (5 observation(s))
Network
declared (5 observation(s))
Shell
declared (2 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (12)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
types/worker-configuration.d.ts:2738
exec(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
types/worker-configuration.d.ts:5537
exec(query: string): Promise<D1ExecResult>
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWInventory / provenance · inv.no_license · CWE-1104
Why it matters. no LICENSE file and no repo licence
Fix. add a licence
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/auth/client.ts:15
import { type ValidatedEnv, type Env } from '../../types/env'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/auth/cookies.ts:6
import { type ValidatedEnv } from '../../types/env'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/auth/handler.ts:11
import { type Env } from '../../types/env'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/auth/stateUtils.ts:6
import { type ValidatedEnv } from '../../types/env'
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/auth/ui/approvalDialog.ts:2
import { type ValidatedEnv } from '../../../types/env'
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/auth/cookies.ts:144
const decodedStateJson = atob(encodedState)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
types/worker-configuration.d.ts:230
atob(data: string): string
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
types/worker-configuration.d.ts:339
declare function atob(data: string): string
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@cloudflare/workers-oauth-provider, @modelcontextprotocol/sdk, @sudowealth/schwab-api, hono, pino, workers-mcp, zod, @cloudflare/workers-types
Why it matters. 15 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass, no_license.

Audited 2026-10-08 · audit v0.4.1 · source sha e57f606d61ebfull audit observations/trust-audit/mcp-server/sudowealth__schwab-1.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-08e57f606d61ebBLOCKD69first audit
06

Questions

What is the Schwab MCP server?

Schwab MCP server that enables AI assistants like Claude to retrieve and interact with your Schwab accounts and Schwab market data.

What tools does Schwab expose?

22 in total: 18 read-only, 4 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is Schwab safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (69/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does Schwab need?

No credential environment variables were found in its source, so it appears to need none.

How current is this page?

The grade is for one exact copy of the source (e57f606d61eb), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement