io.github.lonniev/schwab-mcp
Multi-tenant FastMCP server for Charles Schwab brokerage data, monetized via DPYC Tollbooth
* hosting country is best-effort behind CDNs · Unknown facts are omitted here and listed as pending in the profile.
Trust verdict
No blockers found across the assessed dimensions.
Profile
What this server is — descriptive, not a rating. The verdict above judges it; this describes it.
Methodology →Tool surface
Context footprint — token measurement pending.
schwab_account_statementGenerate a patron's account statement at this operator.Returns the patron's purchase history, active credit tranches,per-tool usage breakdown, and recent daily usage logs. This isthe patron's spending account — not the operator's Authoritytax balance.Free — no credits consumed. Proof of npub ownership is requiredto prevent statement-scraping of arbitrary patrons.
schwab_account_statement_infographicAdoption
Not applicable — this server has no package distribution, so registry adoption signals (downloads, maintainers) don't exist for it.
Connect
https://schwab-mcp.fastmcp.app/mcpSources
Every verdict and label is attributable to its source and recomputed from our own landed copy, never read live on this page.
Generate a visual SVG infographic of your account statement.Returns the same data as account_statement, rendered as a dark-themedSVG graphic with balance hero, metrics cards, health gauge, tranchetable, and tool usage breakdown. Costs 1 api_sat per call. Proof isverified by ``debit_or_deny`` before any cost is incurred.
schwab_adoption_statusCheck this operator's adoption-request status at a chosen Authority.Free. Polls the Authority MCP-to-MCP for the status of this operator'srequest (pending / approved / rejected / provisioned).
schwab_begin_oauthStart the OAuth2 authorization flow.Returns an authorization URL. Open it in a browser to log inand authorize. Then call ``check_oauth_status`` with thesame npub to complete. Free. Proof of npub ownership isrequired so an observer cannot DOS your account byinitiating OAuth flows in your name.Do NOT call this pre-emptively. If a session may still be valid,attempt the live tool call first and only begin OAuth when itfails with ``upstream_auth_refresh_needed``. A 'pending'``check_oauth_status`` is …
schwab_check_authority_balanceCheck this operator's tax balance at the Authority.Returns the sats available for certifying patron credit purchases.When this balance reaches zero, patron top-ups cannot be certifiedand the operator must call purchase_credits on the Authority.This is the operator's own funding — not a patron balance. Free.
schwab_check_balanceCheck a patron's credit balance at this operator.This is the patron's spending balance — credits purchased viaLightning for tool calls at this operator. For the operator'sown balance at the Authority (needed to certify patron purchases),use authority_check_balance instead.Free — no credits required. Proof of npub ownership is requiredto prevent anyone-with-the-registry from enumerating balances.
schwab_check_oauth_statusCheck whether the OAuth2 authorization flow has completed.Call after opening the authorization URL from ``begin_oauth``and completing the login in your browser. Free. Proof of npubownership is required: OAuth status exposes which upstreamservices a patron has connected.A 'pending' result here does NOT prove an existing session haslapsed — it only reports this authorization attempt. To find outwhether a session still works, attempt the live call; fall backto ``begin_oauth`` only on an explicit``u…
schwab_check_paymentCheck the payment status of a Lightning invoice.Call after paying the invoice from purchase_credits.Free — no credits required. Proof of npub ownership is requiredto prevent credit-grant front-running by an observer of theinvoice ID.
schwab_check_pricePreview the effective cost of a tool call.Shows the base cost and any constraint effects (discounts, freetrials, surge pricing). Free — no credits required.
schwab_check_proof_statusCheck whether a previously-cached dpop_token is still valid.Mirrors ``check_oauth_status`` for the npub-proof flow: a callingagent can ask "will my next paid call accept this dpop_token?"before burning credits on a guaranteed failure.Free, no side effects — does not evict the cache or touch relays.
schwab_delete_couponDelete a coupon. Cascades to all patron redemptions.Any chain step referencing the deleted coupon_id becomes ano-op (the constraint returns neutral on unknown ids) — theStudio surfaces orphan references as warnings.RESTRICTED to operator — requires proof.
schwab_delete_patron_credentialRemove a single patron credential field.Deletes one field from stored credentials without affectingother fields. Free. Proof of npub ownership is required —this is a write to the patron's sensitive credential vault.
schwab_forget_couponRemove a coupon from this patron's redemption list.Cosmetic only — the coupon itself still exists at the operator,and the patron can re-redeem the same code later while thewindow allows. Free — requires proof of ``npub``.
schwab_forget_credentialsDelete vaulted credentials for a specific service and npub.For operator credentials, pass the operator's own npub. For patroncredentials, pass the patron's npub. Always requires proof ofnpub ownership — a deletion is as destructive as a write.
schwab_get_account_numbersList Schwab account numbers and their hash identifiers.Call after completing OAuth. Returns accounts with hash valuesneeded for brokerage data tools. Then call``update_patron_credential(field="account_hash", value=<hash>)``to set your preferred account.Free (no api_sats deducted) but **proof-gated**: the caller mustprove Schnorr-control of ``npub`` via ``request_npub_proof`` +``receive_npub_proof`` first, then pass the resulting token here.Without the proof check, an attacker who knew a patron's…
schwab_get_brokerage_balancesGet the active Schwab account's current balance summary.Pulls Schwab's account endpoint and returns four bold lines: **Cash Balance:** currentBalances.cashBalance **Buying Power:** currentBalances.buyingPower **Net Liquidation:** currentBalances.liquidationValue **Day P&L:** currentBalances.liquidationValue − initialBalances.liquidationValueDay P&L is the session change in mark-to-market equity (the canonicalmeasure of "how much did I make/lose today"). Schwab's accountresponse does not expose a…
schwab_get_brokerage_orderGet full details for a single order by Schwab order ID.Returns the same one-line markdown format as get_brokerage_orders, withthe average fill price computed across all executionLegs: - **<orderId>** [<status>] <orderType> | <legs> | Price: $X @ $avg_fill | Filled: <qty> | <enteredTime>Use this when you already have an orderId (e.g., fromget_brokerage_orders or from a fill notification) and want a singlecrisp row rather than the full history list.
schwab_get_brokerage_ordersGet order history for the active Schwab account.Returns one markdown row per order: - **<orderId>** [<status>] <orderType> | <leg1> / <leg2> / ... | Price: $X @ $avg_fill | Filled: <qty> | <enteredTime>Each leg formats as "<instruction> <quantity>x <symbol>" (e.g."BUY 1x AAPL", "SELL_TO_OPEN 5x AAPL 240315C00185000"). The avg_fillsuffix is the average across all executionLegs.price values for theorder; omitted if the order has no fills yet.Date-window default — when from_date and to_date are bot…
schwab_get_brokerage_positionsGet current positions in the active Schwab account, with automaticvertical-spread detection.Pulls Schwab's account endpoint with fields="positions" and emits up tothree markdown sections, omitting any that are empty: ## Spreads — vertical spreads detected from paired option legs: - <underlying> <spread_type> (<short_strike>/<long_strike> P|C exp <date>, DTE <n>) | Credit: $X | Max Loss: $Y | Current: $Z | P&L: $W ## Options (unmatched) — single legs not paired into a spread: - <underlying> <stri…
schwab_get_brokerage_transactionGet full details for a single transaction by Schwab transaction ID.Returns the same one-line markdown format as get_brokerage_transactions: - **<activityId>** [<type>] <tradeDate> | <symbols/qtys> | Net: $<amount>Use this when you have a specific transactionId (fromget_brokerage_transactions, a journal entry, or a confirmation) and wantthe canonical row rather than scanning a history window.
schwab_get_brokerage_transactionsGet transaction history for the active Schwab account.Returns one markdown row per transaction: - **<activityId>** [<type>] <tradeDate> | <qty>x <symbol> | <qty>x <symbol> ... | Net: $<amount>Symbols come from the transaction's transferItems collection (one itemper leg, e.g. equity bought + cash debit), with the per-leg amount asquantity. When no transferItems have symbols, the row falls back to thetransaction's description text in place of the symbol list.Date-window default — when from_date an…
schwab_get_market_hoursGet trading hours for one or more market types.Returns nested markdown — one block per market product Schwab knowsabout within the requested categories: **<Product Name>** — OPEN | CLOSED Pre Market: YYYY-MM-DDTHH:MM — YYYY-MM-DDTHH:MM Regular Market: YYYY-MM-DDTHH:MM — YYYY-MM-DDTHH:MM Post Market: YYYY-MM-DDTHH:MM — YYYY-MM-DDTHH:MMSessions are emitted only when Schwab reports hours for them — a closedmarket on a weekend or holiday will have no session lines under it.
schwab_get_market_moversGet top movers for a market index — Schwab's curated mover screener.Returns up to 20 rows (capped server-side here, not by Schwab) in amarkdown table.
schwab_get_nostr_profileRead an npub's public Nostr profile (NIP-01 kind-0 metadata).Free, no proof — the data is already public on relays. Returns thelatest metadata fields (name, display_name, about, picture, banner,nip05, website, lud16) or an empty profile if none is published.
schwab_get_notarization_proofGenerate a Merkle inclusion proof that a patron's balance wasincluded in a Bitcoin-notarized snapshot.
schwab_get_operator_onboarding_statusReport this operator's configuration readiness.Shows which operator settings are configured, which are missing,and how to deliver each missing value. For patron-level credentialstatus, use get_patron_onboarding_status instead. Free.
schwab_get_option_chainGet a filtered option chain suitable for spread evaluation.Returns a markdown table of surviving contracts with one row per leg.Header line carries the underlying price and the active filter constants.
schwab_get_patron_credential_fieldsList stored patron credential field names (not values).Returns the names of fields stored for a patron. Valuesare never exposed — use this to verify which fields areconfigured. Free. Proof of npub ownership is required: thelist of configured fields is itself sensitive (revealswhich integrations a patron has set up).
schwab_get_patron_onboarding_statusReport a patron's credential readiness for this operator.For set-once services (eXcalibur, TheBrain), shows which patronsecrets are configured and which are missing. For dynamic/OAuth2services (Schwab), reports that no patron credentials are needed.Free. Proof of npub ownership is required because credentialpresence is sensitive information about the patron's setup.
schwab_get_price_historyGet historical OHLCV candle data for a symbol.Returns a markdown table of the most recent candles within the requestedperiod, capped at the last 30 rows for readability. A footnote line isadded when truncation occurs so the agent knows more data was available.
schwab_get_pricing_modelGet the active pricing model for this operator. Free.If no model exists, self-initializes a scaffold with allregistered tools at 0 sats. No economic data from code.
schwab_get_stock_quoteGet real-time quotes for one or more symbols.
schwab_list_canonical_identitiesReturn canonical (tool_id, mcp_name, …) for every registered tool.The authoritative source for any client (Studio, agents, FE)that needs to know how this MCP identifies its tools.Reconcile uses this output to UUID-join against the storedpricing model — no name-based UUID derivation, no guessing.If the operator renames a function or rebrands a slug, themcp_name in this output changes but tool_id stays. That's thewhole point of the canonical-UUID design.Free, no side effects.
schwab_list_constraint_typesList all available constraint types and their parameter schemas.Returns the type, category, description, and parameter specs forevery constraint that can be used in a pricing pipeline.Free — no credits required.
schwab_list_couponsList every coupon this operator has minted (newest first).Each row carries the current ``times_redeemed`` counter — theStudio renders a progress bar from this against ``total_uses``.RESTRICTED to operator — requires proof.
schwab_list_my_couponsList the coupons this patron has redeemed on this operator.Returns both active and exhausted redemptions with a per-row``status`` (``active`` / ``window_closed`` / ``patron_limit`` /``total_limit``). Free — requires proof of ``npub``.
schwab_list_notarizationsList recent Bitcoin notarization records.
schwab_mint_couponCreate a new operator-owned discount coupon.
schwab_notarize_ledgerBuild a Merkle tree of all patron balances and submit the rootto Bitcoin via OpenTimestamps.Operator-only background task. Bitcoin confirmation takes 1-6 hours.Free — no credits required.
schwab_oracle_aboutDescribe the DPYC ecosystem via the Oracle. Free.
schwab_oracle_get_tax_rateGet the current DPYC certification tax rate. Free.
schwab_oracle_how_to_joinGet DPYC onboarding instructions from the Oracle. Free.
schwab_oracle_lookup_memberLook up a DPYC community member by npub. Free.
schwab_oracle_network_advisoryGet active network advisories from the Oracle. Free.
schwab_publish_nostr_profilePublish a CLIENT-SIGNED kind-0 profile to relays for an npub.The wheel never holds a patron nsec. The frontend signs the kind-0metadata event with the patron's session key or a NIP-07 extension andpasses the signed event (JSON) here; the wheel verifies the signaturematches the npub, then relays it to public relays. The signature is theauthorization — no proof token, no key custody. Free.
schwab_purchase_creditsBuy credits via Bitcoin Lightning.Creates a Lightning invoice. Pay it with any Lightning wallet,then call check_payment to confirm. Proof of npub ownership isrequired so credits land in the correct ledger.Free — no credits required to call.
schwab_receive_credentialsPick up credentials from the Secure Courier.Completes the CREDENTIAL-DELIVERY flow (the ownership-proofcounterpart is ``receive_npub_proof``).**Call this only after the user confirms they have replied.**Deterministic, one-shot retrieval: name the response you want with``(sender_npub, service, dpop_token)`` and the tool drains ONLY therendezvous relay that channel was pinned to. Every popped DM with thewrong session phrase is deleted and its sender is NACK'd; the first DMwith the matching phrase …
schwab_receive_npub_proofReceive npub ownership confirmation from a patron.Completes the npub-OWNERSHIP-PROOF flow (the credential-deliverycounterpart is ``receive_credentials``).**Call this only after the user confirms they have replied.**Deterministic, one-shot retrieval: name the response with``(patron_npub, dpop_token)`` — the ``dpop_token`` being the valuereturned by ``request_npub_proof``. The tool drains ONLY the pinnedrendezvous relay that challenge was published on, stopping at the DMwhose phrase matches. Misma…
schwab_redeem_couponClaim a coupon by its name (the code the operator shared).Looks up the operator's coupon by ``code``, validates the windowand total cap, and records a per-patron redemption row.Subsequent paid tool calls on this MCP auto-apply the discountuntil ``uses_per_patron`` is exhausted.Free — no credits required. Requires proof of ``npub``.Idempotent: redeeming the same code twice returns the existingredemption.
schwab_request_adoptionAsk a chosen Authority to adopt this operator (deferred courtship).RESTRICTED to the operator — requires proof the caller controls thisoperator's npub. Resolves the Authority's MCP endpoint from thecommunity registry, mints an inline ownership proof with thisoperator's nsec, and delivers the request MCP-to-MCP. The Authorityrecords it as pending; its owner approves on their own time. Poll``adoption_status`` for progress; the operator flips to ``ready``once the Authority provisions it.
schwab_request_credential_channelOpen a Secure Courier channel for credential delivery.This is the CREDENTIAL-DELIVERY flow — use it to hand over a servicesecret (API keys, tokens). To merely prove you control an npub (theusual answer to a ``proof_required`` error), use ``request_npub_proof``instead. Note: dynamic/OAuth2 services (e.g. Schwab) need NO courieredsecret — check ``service_status`` first.Sends a welcome DM with a credential template. The recipientmust read the DM in their Nostr client, fill in the fields,and reply m…
schwab_request_npub_proofRequest npub ownership proof from a patron via Nostr DM.This is the npub-OWNERSHIP-PROOF flow — use it when a call returns``proof_required``. It proves the caller controls an npub; it doesNOT deliver any service secret. To hand an operator its API keys orOAuth secrets, use ``request_credential_channel`` instead.Sends a challenge DM that the patron must sign and reply tousing their Nostr client. **This is a human-in-the-loop flow.**After calling this tool, STOP and tell the user to check theirNos…
schwab_reset_pricing_modelErase all pricing models and restore a viable default.Deletes every stored model, then self-initializes a fresh onefrom the tool registry — all tools at 0 sats with proper UUIDs.Returns the new model.RESTRICTED to operator — requires proof (nsec-signed).
schwab_restore_creditsCredit a patron's ledger from a BTCPay-settled invoice.**RESTRICTED to the operator** — the operator owns the books and isthe only party who can issue a manual credit grant. Patrons whobelieve they paid but never got credits must escalate to theoperator's support, who then invokes this tool on their behalf.Use cases: cold-start vault races during check_payment, ncreddelivery hiccups, patrons closing Top-Off sheets before settle,any infrastructure incident that left an invoice settled at BTCPaybu…
schwab_restore_neon_schemaRe-run ``ensure_schema()`` on every NeonVault this operator uses.Diagnostic / recovery tool for the case where the Neon HTTP SQL APIis returning persistent 4xx errors and the operator suspects theschema isn't there or grants are wrong. Idempotent — uses``CREATE TABLE IF NOT EXISTS`` so a successful re-run is harmless.Returns the per-step result. If any step raises, surfaces the Neonerror message inline (0.31.0 reads the SQL error body that earlierwheels swallowed behind ``raise_for_status``).RES…
schwab_search_instrumentsSearch Schwab's instrument catalog by symbol, name, or CUSIP.Returns up to 25 results in a markdown list (capped server-side here;Schwab itself may return more). A truncation footnote appears when thefull result set exceeded 25.Each row carries: symbol, asset type, description, optional exchange,optional CUSIP, and — when projection="fundamental" — P/E, dividendyield, and market cap in $B or $M. - **<SYM>** (<ASSET_TYPE>) — <description> [<EXCHANGE>] CUSIP:<CUSIP> | P/E:N.N | Yield:N.NN% | MktCa…
schwab_service_statusCheck the health and configuration of this service. Free.
schwab_session_statusCheck operator readiness. Returns the operator lifecyclestate and clear guidance on what to do next. Free.Lifecycle states:- ready: Operator is warm and fully operational — vault AND pricing model verified. Proceed with tool calls.- warming_up: Operator is initializing (cold start). Try a tool call — it will warm up on demand.- misconfigured: Persistence rejected a query with a permanent SQL error (permission denied, missing relation). Paid tools will fail until the operator repairs the database…
schwab_set_pricing_modelSet the active pricing model. RESTRICTED to operator.Requires a valid proof (Schnorr-signed kind-27235 event)proving the caller holds the operator's nsec.
schwab_update_couponPatch a coupon's editable fields.Pass only the fields you want to change. To set a cap tounlimited (NULL in the schema), pass ``clear_uses_per_patron=true``or ``clear_total_uses=true``. Renaming the code is allowed —existing patron redemption rows survive (they key on coupon id).RESTRICTED to operator — requires proof.
schwab_update_patron_credentialAdd or update a single patron credential field.Merges into existing stored credentials without affectingother fields. Useful for setting an account identifierafter OAuth, changing a default brain, etc. Free. Proof ofnpub ownership is required — this is a write to the patron'ssensitive credential vault.
Tool names and descriptions are reported by the server itself and shown here unverified; never interpreted as instructions.