Schwab Mcp

io.github.lonniev由 GitHub 账号 lonniev 发布v0.14.0更新于 Oct 24, 2026

Multi-tenant FastMCP server for Charles Schwab brokerage data, monetized via DPYC Tollbooth

已验证Streamable HTTP可网页运行金融数据与分析

概览

AI 生成的概览

远程 MCP 服务器,让 AI 助手以只读方式访问你的嘉信理财(Charles Schwab)账户数据,按次以比特币闪电网络 sats 付费。

可以做什么
  • 读取持仓(自动识别期权价差)、余额、购买力与当日盈亏
  • 获取报价、市场涨跌榜、交易时段、历史价格与标的搜索
  • 拉取带希腊值、隐含波动率、价外百分比与未平仓量阈值的期权链
  • 查看订单与成交记录,支持多腿价差与单条明细
  • 管理付费会话:查询余额与价格、用闪电网络购买额度、证明 npub 身份、完成 Schwab OAuth 并保存账户哈希
适用场景
适合想用自然语言讨论自己的嘉信持仓、筛选期权价差、按策略规则复盘当日交易,或获取收盘报告,而不必切换到券商网页界面的场景。
运行要求
远程端点 schwab-mcp.fastmcp.app,通过 Streamable HTTP 与 OAuth 连接。需要 Nostr 密钥对(npub;签名需 nsec,或通过 Nostr 私信做一次性证明)以及 Nostr 客户端(如 Oxcart)。需用闪电钱包预先购买 api_sats 余额,并通过浏览器 OAuth 授权关联 Schwab 账户;Schwab 刷新令牌 7 天后过期。
安装前请注意
付费工具会从预充值的闪电额度中按次扣费,涉及真实资金,额度在运营方设定的有效期后过期。Schwab 账户通过 OAuth 关联,令牌保存在运营方的加密保险库中。身份基于 Nostr 密钥对,nsec 属机密,不应外泄。券商工具为只读、不下单,但持仓、余额与交易记录会发送到服务器和 AI 客户端。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Schwab Mcp,将其添加到工作区。
  2. 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
  3. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.lonniev%2Fschwab-mcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。

{
  "mcpServers": {
    "schwab": {
      "type": "http",
      "url": "https://schwab-mcp.fastmcp.app/mcp"
    }
  }
}

README

schwab-mcp

[Open Positions — Options Risk Profile]

Your brokerage data, conversationally. Ask your AI assistant about your positions, screen option spreads, audit today's trades against your strategy rules, and get end-of-day reports — all from natural language. The data cost? About 6 sats per session (~$0.005).

Why This Exists

The data in schwab-mcp is nothing you can't get from ThinkOrSwim, OptionAlpha, or Schwab's own web UI. What you can't get from those tools is a personal trading assistant that blends:

  • Your live positions and account balances
  • Real-time option chains with Greeks, IV, and OTM%
  • Your trading strategy rules (credit floors, RWR targets, sector concentration limits)
  • Market context (earnings calendars, VIX levels, sector rotation)
  • All of the above in a single conversational turn

Ask "How would you judge my new trades for the day?" and get a structured audit against your criteria. Ask "What are three SPS candidates aligned with my strategy and balanced with my current book?" and get sector-aware, earnings-aware, IV-aware suggestions — grounded in your actual positions, not generic advice.

The AI does the synthesis. schwab-mcp provides the data bridge. You pay per-call in Bitcoin Lightning sats — no subscription, no KYC, no vendor lock-in. A full day of morning report + evening report + follow-up analysis costs about 6 sats (< $0.01).


Multi-tenant MCP server exposing Charles Schwab brokerage data to AI agents via FastMCP. Monetized via Tollbooth DPYC™ Lightning micropayments. Serves over Streamable HTTP with direct async httpx calls to api.schwabapi.com.

Don't Pester Your Customer™ (DPYC™) — API monetization for Entrepreneurial Bitcoin Advocates

Inspired by The Phantom Tollbooth by Norton Juster, illustrated by Jules Feiffer (1961).

[Python 3.12+]

The DPYC™ Economy

DPYC™ stands for Don't Pester Your Customer. It is a philosophy and protocol for API monetization that eliminates mid-session payment popups, subscription nag screens, and KYC friction.

How it works

  1. Pre-funded balances -- Users buy credits (api_sats) via Bitcoin Lightning before using tools. Each tool call silently debits from their balance. No interruptions, no "please upgrade" modals. Credits expire after a tranche_lifetime window set by the operator's pricing model.

  2. Nostr keypair identity -- Users are identified by a Nostr public key (npub), not an email or password. One keypair per role, managed by the user. No account creation forms.

  3. Identity on the connection -- Every paid tool call names the patron's npub; the connection proves it. A client holding the nsec signs each request (NIP-98). A client holding no key connects with OAuth and proves the npub once through request_npub_proof / receive_npub_proof -- a human-in-the-loop Secure Courier exchange the patron approves in their Nostr client. The connection then holds the npub for the duration the patron chose, across MCP restarts.

  4. UUID-keyed tool identity -- Every tool is a ToolIdentity object with a deterministic UUID v5 derived from a capability name. Pricing hints come from the category field:

    CategoryPricing hintUse case
    free0 satsBalance checks, status
    read1 satSimple lookups
    write5 satsMulti-step operations
    heavy10 satsExpensive queries

    Actual prices (api_sats) are set dynamically by the operator's pricing model in Neon.

  5. Rollback on failure -- If the downstream API fails after a debit, credits are automatically rolled back via a compensating tranche. The user never pays for a failed call.

  6. Social Contract -- The DPYC™ ecosystem is a voluntary community:

    • Citizens -- Users who consume API services
    • Operators -- Developers who run MCP services (like this one)
    • Authorities -- Certify operators and collect a small tax on purchases
    • First Curator -- The root of the chain, mints the initial cert-sat supply

Tools

Brokerage (paid -- credit-gated)

All paid tools take the patron's npub; the connection proves it.

ToolTierDescription
get_brokerage_positionswritePortfolio positions with automatic options spread detection (bull put / bear call)
get_brokerage_balanceswriteCash, buying power, net liquidation value, day P&L
get_stock_quotewriteReal-time quotes for one or more symbols
get_market_moverswriteTop movers for a market index ($SPX, $DJI, $COMPX)
get_market_hourswriteTrading hours for equity, option, bond, future, forex markets
search_instrumentswriteSearch for instruments by symbol, name, or CUSIP
get_option_chainheavyFiltered option chain with Greeks, IV, OTM%, and OI threshold
get_price_historyheavyHistorical OHLCV candle data
get_brokerage_ordersheavyOrder history with multi-leg spread support (default 30 days)
get_brokerage_orderheavySingle order detail by ID
get_brokerage_transactionsheavyTransaction history -- trades, dividends, cash movements (default 30 days)
get_brokerage_transactionheavySingle transaction detail by ID

Free

ToolDescription
session_statusCheck operator lifecycle state and readiness
service_statusCheck health and configuration of this service
begin_oauthStart OAuth2 flow -- returns Schwab authorization URL
check_oauth_statusPoll whether OAuth flow completed and session is active
get_account_numbersList linked Schwab account numbers and hashes
request_credential_channelOpen a Secure Courier channel for credential delivery via Nostr DM
receive_credentialsPick up credentials from the encrypted vault
forget_credentialsDelete vaulted credentials for re-delivery
update_patron_credentialAdd or update a single patron credential field
delete_patron_credentialRemove a single patron credential field
get_patron_credential_fieldsList stored patron credential field names
check_balanceView credit balance and usage
check_pricePreview tool cost before calling
purchase_creditsCreate a Lightning invoice to buy credits
check_paymentVerify Lightning payment and credit the balance
restore_creditsRestore credits from a previously paid invoice
account_statementView account statement summary
account_statement_infographicVisual SVG infographic of account (1 sat)
check_authority_balanceCheck operator's cert-sat balance at Authority
get_pricing_modelView the active pricing model
list_constraint_typesList available constraint types and schemas
request_npub_proofRequest an npub ownership proof via Nostr DM; returns its nonce
receive_npub_proofCollect the reply into this connection, which then holds the npub
get_operator_onboarding_statusReport operator configuration readiness
get_patron_onboarding_statusReport patron credential readiness
list_notarizationsList recent Bitcoin notarization records
get_notarization_proofGenerate a Merkle inclusion proof for a patron balance

All brokerage tools are read-only. No orders are placed.

Architecture

  • Multi-tenant: operator delivers btcpay_host + btcpay_api_key + btcpay_store_id + app_key + secret via Secure Courier (service="schwab-operator"); each patron authenticates via OAuth2 browser flow. Sessions are keyed by npub. No Schwab credentials in env vars
  • Direct httpx: thin SchwabClient wrapper with bearer auth and proactive token refresh (no third-party Schwab SDK)
  • Tollbooth DPYC™: pre-funded Lightning balances, Authority-certified purchase orders, NeonVault (Postgres) for ledger persistence
  • Registry discovery: OAuth2 collector URL resolved from DPYC™ registry at runtime (no OAUTH_COLLECTOR_URL env var needed)
  • Credential validation: operator credentials are validated at receive time -- btcpay_host, app_key, and secret must all be present before vaulting
  • Identity on the connection: a request signed with the npub's key (NIP-98), or an OAuth connection that holds the npub after one Secure Courier DM. Survives restarts; patron-chosen duration. Restricted tools (operator-only) need the operator's npub proven the same way.

Getting Started

This guide covers the full Tollbooth onboarding path -- from generating a Nostr identity to making your first brokerage data call. It applies to both Operators (who deploy schwab-mcp) and Patrons (who consume it through Claude.ai or another MCP client).

1. Get a Nostr Identity (npub)

Every participant in the DPYC™ ecosystem is identified by a Nostr keypair -- no email, no password, no vendor lock-in.

What is an npub? It is a public key in the Nostr protocol, encoded as a bech32 string starting with npub1.... Your corresponding private key (nsec1...) stays on your device. The npub is safe to share -- it is how the system knows who you are.

How to generate one:

  1. Install Oxcart (the preferred Nostr client for DPYC™ workflows; other clients have not been tested)
  2. Create an account -- the app generates your keypair automatically
  3. Find your npub in the app's profile/settings screen (it starts with npub1...)

Alternatively, use a CLI key generator like nak: nak key generate

Operators should keep a separate npub for their service identity, distinct from their personal Nostr account.

2. Register as a DPYC™ Citizen

Before you can buy credits or operate a service, register your npub with the DPYC™ community:

  1. In Claude.ai (with the DPYC Oracle connected), call how_to_join() to learn about citizenship
  2. Follow the Oracle's instructions to register your npub

Citizenship is free and gives you a portable identity across the entire Tollbooth network.

3. For Operators -- Set Up Your BTCPay Store

The Operator collects Lightning payments from Patrons via BTCPay Server. You need:

  • A BTCPay Server instance (self-hosted or hosted by your Authority)
  • A Store ID and API Key with invoice creation permissions

These credentials are delivered via Secure Courier (see step 6), not set as environment variables.

4. For Operators -- Register with a Tollbooth Authority

Every Operator is sponsored by an Authority in the DPYC™ trust chain. The Authority certifies your purchase orders and collects a small fee (default 2%).

  1. On your own Schwab MCP, call request_adoption(authority_npub=<your Authority's npub>, service_url=<your MCP endpoint>), signing the request with your operator nsec (NIP-98; Pricing Studio does this for you)
  2. The Authority's owner approves it (approve_operator_request), which creates your ledger entry and provisions your Neon database
  3. adoption_status(authority_npub=...) on your MCP reads provisioned once it is done

5. For Operators -- Fund Your Certification Balance

Before your service can issue credits to Patrons, you need cert-sats:

  1. Call authority_purchase_credits(amount_sats=1000) on your Authority -- returns a Lightning invoice
  2. Pay the invoice with any Lightning wallet
  3. Call authority_check_payment(invoice_id="...") -- confirms settlement and credits your balance

Your cert-sat balance is consumed automatically when Patrons purchase credits from your service.

6. For Operators -- Deliver Credentials (Secure Courier)

The Operator must register a Schwab Developer app and deliver both BTCPay and Schwab API credentials via Secure Courier. Credentials never appear in chat.

Schwab Developer apps use app_key and secret as the vendor field names (these map to OAuth client_id and client_secret internally). The redirect_uri registered with Schwab should have no /callback suffix -- use the base collector URL exactly as shown in the registry.

The Secure Courier is a human-in-the-loop exchange: the operator consciously replies in their Nostr client. The relay is drained destructively after pickup -- messages are consumed, not left on the wire.

  1. Call request_credential_channel(service="schwab-operator", sender_npub=<operator_npub>) -- it returns a nonce, and a welcome DM arrives in your Nostr client (Oxcart)
  2. In Oxcart, reply to the DM with:
    json
    {  "btcpay_host": "https://btcpay.example.com",  "btcpay_api_key": "YOUR_API_KEY",  "btcpay_store_id": "YOUR_STORE_ID",  "app_key": "YOUR_SCHWAB_APP_KEY",  "secret": "YOUR_SCHWAB_SECRET"}
  3. Call receive_credentials(sender_npub=<operator_npub>, service="schwab-operator", nonce=<that nonce>) -- credentials are validated (btcpay_host, app_key, and secret must all be present) and vaulted

This is a one-time setup per deployment. Operator credentials are encrypted and stored in the NeonVault, persisting across server restarts.

7. For Patrons -- Buy Credits (api_sats)

Patrons pre-fund a satoshi balance and consume brokerage tools against it -- no per-request payment interruptions. This is the Don't Pester Your Customer™ philosophy in action. Credits are denominated in api_sats and expire after the operator-configured tranche_lifetime.

  1. Call purchase_credits(amount_sats=500) -- returns a Lightning invoice with a checkout link
  2. Pay the invoice with any Lightning wallet (Phoenix, Breez, Zeus, etc.)
  3. Call check_payment(invoice_id="...") -- confirms settlement and credits your balance

Your balance depletes as you call paid tools. Recharge anytime with another purchase_credits call. Check your balance at any time with check_balance (free). Preview any tool's cost with check_price (free).

8. For Patrons -- Connect Your Schwab Account

You need to authorize schwab-mcp to read your Schwab account:

  1. Call begin_oauth(npub=<your_npub>) to get an authorization URL
  2. Open the URL in your browser and log in to Schwab
  3. Call check_oauth_status(npub=<your_npub>) to confirm session activation
  4. Call get_account_numbers(npub=<your_npub>) to list your accounts and hashes
  5. Call update_patron_credential(npub=<your_npub>, field="account_hash", value=<hash>) to set your preferred account

9. Using Schwab Tools in Conversation

Once your session is active, ask your AI agent naturally:

  • "Show me my positions" -- calls get_brokerage_positions
  • "What's my account balance?" -- calls get_brokerage_balances
  • "Get a quote for AAPL and MSFT" -- calls get_stock_quote
  • "What are today's biggest gainers?" -- calls get_market_movers
  • "Is the market open tomorrow?" -- calls get_market_hours
  • "Look up the ticker for Berkshire Hathaway" -- calls search_instruments
  • "Show me the GLD option chain for next month" -- calls get_option_chain
  • "What are my recent orders?" -- calls get_brokerage_orders
  • "Show me my trade history for the last week" -- calls get_brokerage_transactions

Free tools are always available:

  • "What's my schwab-mcp balance?" -- calls check_balance
  • "Show me my account statement" -- calls account_statement

Security

  • npub identity -- All sessions are keyed by a Nostr public key. No email, no username, no password.
  • Identity on the connection -- Tools carry no proof argument. A client holding the nsec signs each HTTP request (NIP-98, kind 27235); an OAuth client proves the npub once into its connection with request_npub_proof / receive_npub_proof, which the patron approves in their Nostr client for a duration they choose (up to 30 days).
  • Secure Courier -- Credentials are exchanged over NIP-44 encrypted Nostr DMs. The relay is drained destructively after pickup; messages do not persist on the wire.
  • NeonVault -- Credentials (token_json) and ledger state are stored in Postgres with per-operator row isolation. No secrets in environment variables or chat history.
  • Operator credential isolation -- BTCPay and Schwab API credentials (app_key, secret) are delivered via Secure Courier with service="schwab-operator", validated at receive time, and never exposed in logs or responses.

Troubleshooting

Cold start / first tool call fails: The Horizon runtime may cold-start on the first request. Retry the tool call inline -- the server warms up within a few seconds and the second call succeeds.

"proof is required": Call request_npub_proof, reply to the DM, then receive_npub_proof(patron_npub, nonce) once. Your connection then holds the npub; pass only npub on later calls. Duration is patron-chosen. The proof survives MCP restarts.

"Insufficient credit balance": Call purchase_credits to top up. Use check_balance to see your current api_sats balance and tranche_lifetime expiry.

"Operator credentials not configured": This is an operator setup issue, not the patron's problem. The operator must complete the Secure Courier flow (step 6) to deliver app_key and secret.

Credential lifecycle states: Credentials move through pending (channel opened) -> delivered (DM sent by human) -> vaulted (picked up and validated). If receive_credentials returns a lifecycle state instead of success, it is not an error -- it is telling you where in the flow you are. Follow the guidance in the response.

OAuth token stored in vault: After a successful OAuth2 flow, the token_json is persisted in NeonVault. Sessions survive server restarts via the wheel's restore_oauth_session -- which detects expiration, refreshes the token via the provider, and persists the rotated pair back to vault. If the refresh token itself expires (Schwab: 7 days), the patron must re-run begin_oauth.


DPYC™ Community Resources

ResourceDescription
tollbooth-dpycOperator SDK -- Python library for vault, auth, pricing, Lightning, and Nostr identity
dpyc-communityGovernance registry -- membership, advisories, threat model, creed, and trademarks
dpyc-oracleCommunity concierge -- free onboarding and member lookup
tollbooth-authorityCertification backbone -- Schnorr-signed certificates and fee collection
tollbooth-sampleSample Operator -- canonical template for new MCP services
tollbooth-pricing-studioiOS pricing-model editor and operator console
cypher-mcpMonetized graph answers -- named Cypher templates over Neo4j/AuraDB
schwab-mcpCharles Schwab brokerage data
thebrain-mcpTheBrain personal knowledge graph
excalibur-mcpX (Twitter) posting service with Secure Courier
taxsort-mcpTax classification with a Cloudflare Pages UI
optionality-mcpOptions analytics (brokerage-data operator)
tollbooth-oauth2-collectorOAuth2 callback handler (advocate service)
tollbooth-shortlinksURL shortener utility
goodearth-mcpClimate analytics for small specialty-crop farms
beesknees-mcpThe Bee's Knees -- a monetized multiplayer race game
roastify-mcpRoastify coffee catalog and packaging artwork
ChartRemotely-mcpPuts a security on a desktop chart, by voice or tool call
tollbooth-webShared browser SDK for DPYC™ operator front ends
DPYC WhitepaperTechnical whitepaper for the Tollbooth architecture
The Phantom Tollbooth on the Lightning TurnpikeNarrative introduction to Tollbooth DPYC™

Deployment

schwab-mcp runs on Horizon. Any MCP client (Claude.ai, Claude Desktop, Cursor, your own agent) can connect:

https://schwab-mcp.fastmcp.app/mcp

Patron identity is on the connection (a NIP-98 signed request, or an OAuth connection that holds the npub after request_npub_proof / receive_npub_proof). The Schwab account is linked separately with begin_oauth / check_oauth_status. Sessions are keyed by npub.

Operator Environment Variables

Required
VariableDescription
TOLLBOOTH_NOSTR_OPERATOR_NSECOperator's Nostr secret key -- the single bootstrap key for identity, Secure Courier DMs, and audit signing

This is the only env var required to start. Certified operators bootstrap their Neon database URL from the Authority via encrypted Nostr DM -- NEON_DATABASE_URL is not read from the environment. The relay set comes from the shared dpyc-community registry and tranche lifetime from the operator's pricing model -- neither is an env var.

Optional Tuning
VariableDescription
SCHWAB_TRADER_APIAPI base URL (default https://api.schwabapi.com)
Credentials via Secure Courier (NOT env vars)

BTCPay credentials (btcpay_host, btcpay_api_key, btcpay_store_id) and Schwab API credentials (app_key, secret) are delivered exclusively through Secure Courier (service="schwab-operator"), validated at receive time, and stored in the encrypted vault. No secrets in env vars or chat.

Development

Prerequisites

  • Python 3.12+
  • A Schwab Developer app with API credentials
  • Oxcart Nostr client for Secure Courier credential delivery

Install & Test

bash
uv sync            # or: pip install -e ".[dev]"uv run pytest tests/ -v

Project Structure

schwab-mcp/  server.py            # FastMCP server, OperatorRuntime, credit gating, domain tool endpoints  schwab_client.py     # Thin async httpx client — bearer auth + token refresh  vault.py             # Per-user session management (in-memory cache)  oauth_flow.py        # OAuth2 authorization code flow (state tokens, exchange, callback)  settings.py          # pydantic-settings (env vars, .env file)  models.py            # Pydantic response models  tools/    account.py         # Positions, balances, orders, transactions (spread detection)    market.py          # Quotes, price history, market movers, market hours, instrument search    options.py         # Option chain retrieval + filtering  tests/    test_schwab_client.py  # httpx client, token refresh, URL building    test_server.py         # Singletons, credit gating, Secure Courier callback    test_vault.py          # Session management    test_account.py        # Position, balance, order, transaction parsing    test_market.py         # Quote + price history formatting    test_oauth_flow.py     # OAuth2 state tokens and code exchange    test_options.py        # Option chain filtering

Prior Art & Attribution

The methods, algorithms, and implementations contained in this repository may represent original work by Lonnie VanZandt, first published in April 2026. This public disclosure establishes prior art under U.S. patent law (35 U.S.C. 102).

All use, reproduction, or derivative work must comply with the Apache License 2.0 included in this repository and must provide proper attribution to the original author per the NOTICE file.

How to Attribute

If you use or build upon this work, please include the following in your documentation or source:

Based on original work by Lonnie VanZandt and Claude.aiOriginally published: April 2026Source: https://github.com/lonniev/schwab-mcpLicensed under Apache License 2.0

Visit the technologist's virtual cafe for Bitcoin advocates and coffee aficionados at stablecoin.myshopify.com.

Patent Notice

The author reserves all rights to seek patent protection for the novel methods and systems described herein. Public disclosure of this work establishes a priority date of April 2026. Under the America Invents Act, the author retains a one-year grace period from the date of first public disclosure to file patent applications.

Note to potential filers: This public repository and its full Git history serve as evidence of prior art. Any patent application covering substantially similar methods filed after the publication date of this repository may be subject to invalidation under 35 U.S.C. 102(a).

Further Reading

The Phantom Tollbooth on the Lightning Turnpike -- the full story of how we're monetizing the monetization of AI APIs, and then fading to the background.

Trademarks

DPYC™, Tollbooth DPYC™, and Don't Pester Your Customer™ are trademarks of Lonnie VanZandt. See the TRADEMARKS.md in the dpyc-community repository for usage guidelines.

License

Apache License 2.0 -- see LICENSE and NOTICE for details.


Because in the end, the tollbooth was never the destination. It was always just the beginning of the journey.

来源:README.md,提交 13aa3b1

工具

0
该服务器需要登录,因此 SourceWeft 无法在没有账号的情况下读取其工具,也未收录。已连接账号所能看到的内容可能因账号及其权限而异。

版本历史

2
  1. v0.14.0最新Oct 21, 2026
  2. v0.13.6Sep 16, 2026

评分

已满足适用检查项的 85%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分