three.ws Portfolio
io.github.nirholas/portfolio-mcp · 231 stars · JavaScript · Apache-2.0
MCP server An agent's trading state — portfolio value, PnL, live balances, trade feed, and signed transfers.
Install
The repo has no one-line install. Follow its README.
Published as
- npm
@three-ws/portfolio-mcpstdio
From the server's entry in the official MCP Registry.
Configuration
| Name | Set as | What it is |
|---|---|---|
THREE_WS_BASEOptional | Env var | Base URL of the three.ws API that serves the portfolio + trades endpoints. Override only when self-hosting or targeting a preview deployment. |
THREE_WS_TIMEOUT_MSOptional | Env var | Per-request timeout in milliseconds for the live three.ws API reads. |
THREE_WS_SESSIONOptional · Secret | Env var | Your three.ws session token (the value of the `__Host-sid` cookie from a signed-in browser). Required for the account-scoped reads — get_portfolio_summary, get_portfolio_history, get_portfolio_asset — which return data for the agents YOU own. The public trade feed and on-chain balance reads do not need it. Treat like a password. |
SOLANA_RPC_URLOptional | Env var | Solana mainnet RPC endpoint used by get_wallet_balances and send_transfer. Defaults to https://api.mainnet-beta.solana.com — bring your own (Helius / Quicknode / Triton) for production traffic. |
SOLANA_SECRET_KEYRequired · Secret | Env var | Base58-encoded Solana secret key for the wallet that send_transfer signs from. REQUIRED for send_transfer (the only write tool); a per-call `secret` arg overrides it. Not needed for any read tool. Treat like cash. |
MAX_SOL_PER_TXOptional | Env var | Per-transaction spend cap in SOL for native SOL transfers via send_transfer. Bounds the blast radius of a leaked key or an injected argument. |
RECIPIENT_ALLOWLISTOptional | Env var | Optional comma-separated base58 pubkeys. When set, send_transfer refuses any recipient not in the list. |
REQUIRE_CONFIRMOptional | Env var | When on (default), send_transfer refuses until re-issued with confirm:true. Set 0/false to disable the gate. |
Files
@three-ws/portfolio-mcp
An AI agent's own trading state over MCP — portfolio value, PnL, live balances, the public trade feed, and one real write: a signed on-chain Solana transfer.
A Model Context Protocol server that gives an AI agent programmatic access to its own trading state over stdio: what it holds, how that value moves over time, a single token's position with live market data, the platform-wide feed of closed trades and their realized PnL, live on-chain balances for any wallet — and one real write, a signed Solana transfer of SOL or any SPL token.
Reads hit the live three.ws API and Solana RPC — nothing is mocked. The account-scoped reads run against the agent wallets you own (resolved from your three.ws session). The one write, send_transfer, signs locally with your own key and moves real funds on mainnet.
Install
npm install @three-ws/portfolio-mcp
Or run with npx (no install):
npx @three-ws/portfolio-mcp
Quick start
Claude Code, one line:
claude mcp add portfolio -- npx -y @three-ws/portfolio-mcp
Claude Desktop / Cursor (claude_desktop_config.json or mcp.json):
{
"mcpServers": {
"portfolio": {
"command": "npx",
"args": ["-y", "@three-ws/portfolio-mcp"],
"env": {
"THREE_WS_SESSION": "<your __Host-sid cookie>",
"SOLANA_SECRET_KEY": "<base58 secret of the sending wallet>"
}
}
}
}
THREE_WS_SESSION is only needed for the account-scoped reads; SOLANA_SECRET_KEY is only needed for send_transfer. The trade feed and on-chain balance reads work with no configuration at all.
Inspect the surface with the MCP Inspector:
npx -y @modelcontextprotocol/inspector npx @three-ws/portfolio-mcp
Tools
| Tool | Type | What it does |
|---|---|---|
get_portfolio_summary |
read · session | Live holdings + USD value across every agent wallet you own, with a per-wallet breakdown. Optional snapshot. |
get_portfolio_history |
read · session | Your total portfolio USD value over time, from stored snapshots — the performance chart. |
get_portfolio_asset |
read · session | One token deep-dive: which wallets hold it, your total amount/USD, plus live market data and a price-history chart. |
get_trades_feed |
read · public | The platform-wide feed of closed positions and their realized PnL — newest exit first, filterable by coin. |
get_wallet_balances |
read · public | Live on-chain SOL + SPL (incl. Token-2022) balances for any Solana address, straight from the RPC. |
send_transfer |
write · destructive | Sign and broadcast a real, irreversible Solana mainnet transfer of SOL or any SPL token from your own wallet. |
Everything reads live state — balances, feeds, and broadcasts all move between calls — so no tool is idempotent. send_transfer is the only tool that mutates anything.
Input parameters
get_portfolio_summary — snapshot (bool, default false — also persist a history point).
get_portfolio_history — days (1–365, default 90).
get_portfolio_asset: chain (solana | evm, required), id (native or the base58 mint / 0x contract, required), days (1 to 365, default 30), chain_id (optional EVM chain id: 8453 Base, 1 Ethereum, 42161 Arbitrum, 10 Optimism, 137 Polygon, 56 BNB, and the other chains the platform indexes). Leave chain_id off and the API prices the contract on whatever chain your wallets hold it on, defaulting to Base; set it when the same address exists on more than one chain.
get_trades_feed — network (mainnet | devnet, default mainnet), window (1h | 6h | 24h | 7d | 30d | all, default 24h), min_pnl_pct (default 10), limit (1–80, default 40), cursor (ISO timestamp for pagination), mint (filter to one coin).
get_wallet_balances — address (base58, required), include_tokens (bool, default true).
send_transfer — recipient (base58, required), amount (decimal string, required), mint (base58 SPL mint; omit / native for SOL), secret (base58, overrides SOLANA_SECRET_KEY), priorityMicroLamports (0–50,000,000), confirm (must be true to execute).
Realized vs. live value
Two different questions, two different tools:
- "What am I worth right now?" →
get_portfolio_summary/get_portfolio_asset— live holdings priced in USD. - "How have my closed trades done?" →
get_trades_feed— realized PnL per closed position (entry/exit in SOL, profit %, multiple, hold time).
The write tool — send_transfer
send_transfer broadcasts a real, irreversible transaction on Solana mainnet and moves funds out of the signing wallet. It signs locally with the per-call secret or SOLANA_SECRET_KEY — the three.ws API never holds your key. Guardrails:
confirm: truerequired whileREQUIRE_CONFIRMis on (the default) — the first call without it returns a refusal, not a broadcast.MAX_SOL_PER_TXcaps native SOL sends (default 0.5 SOL).RECIPIENT_ALLOWLIST, when set, restricts the destination to a known set.- The
mintis runtime input — pass the$THREEmint or any SPL token you hold. No mint is hardcoded.
For an SPL transfer it reads the mint's decimals on-chain, verifies your balance, and auto-creates the recipient's associated token account when missing. On a confirmation timeout it returns tx_unconfirmed with the signature rather than silently retrying — check Solscan before resending to avoid a double-spend.
Requirements
- Node.js >= 20.
- Network access to
https://three.ws(or your ownTHREE_WS_BASE) and a Solana RPC.
Environment variables
| Variable | Required | Default |
|---|---|---|
THREE_WS_BASE |
no | https://three.ws |
THREE_WS_TIMEOUT_MS |
no | 20000 |
THREE_WS_SESSION |
for account-scoped reads | — |
SOLANA_RPC_URL |
no | https://api.mainnet-beta.solana.com |
SOLANA_SECRET_KEY |
for send_transfer |
— |
MAX_SOL_PER_TX |
no | 0.5 |
RECIPIENT_ALLOWLIST |
no | — (any valid pubkey allowed) |
REQUIRE_CONFIRM |
no | true |
THREE_WS_SESSION is the value of the __Host-sid cookie from a signed-in three.ws browser session. Treat it — and SOLANA_SECRET_KEY — like a password.
Links
- Homepage: https://three.ws
- Changelog: https://three.ws/changelog
- Issues: https://github.com/nirholas/three.ws/issues
- License: Apache-2.0. See LICENSE.
Part of the three.ws SDK suite — 3D AI agents, on-chain identity, and agent payments.
Website · Changelog · GitHub
Facts
- Kind
- MCP server
- Group
- Uncategorized
- Stars
- 231
- License
- Apache-2.0
- Language
- JavaScript
- Last push
- 2026-10-12
- Forks
- 63
- MCP Registry
- io.github.nirholas/portfolio-mcp
- Homepage
- three.ws
- Topics
- animation, avatar, gltf, llm, mcp, webgl, 3d-generation, ai-agents, digital-human, generative-ai, glb, image-to-3d, mcp-server, model-context-protocol, solana, text-to-3d, threejs, web-components, webxr, x402
- 1REAio.github.morluto/reaReverse engineer anything from your terminal or agent with one CLI and MCP server.125.3k
- 2com.browser-use/browser-usecom.browser-use/browser-useControl a real Chrome browser to complete any task: fill forms, extract data, book flights.117.7k
- 3World Monitorapp.worldmonitor/mcpLive markets, conflicts, country risk, chokepoints, energy, and China decision signals. 93 tools.88.3k
- 4Scrapling MCP Serverd4vinci/scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scraplingdev86.9k
- 5Everythingmodelcontextprotocol/serversThis MCP server attempts to exercise all the features of the MCP protocol. It is not intended to be a useful server, but rather a test server for builders of MCP clients. It implements prompts, tools, resources, sampling, and more to showcase MCP capabilities.85.8k
- 6Fetchmodelcontextprotocol/serversA Model Context Protocol server that provides web content fetching capabilities. This server enables LLMs to retrieve and process content from web pages, converting HTML to markdown for easier consumption.85.8k