{
	"$comment": "Generated by scripts/build-mcp-catalog.mjs from the tool definitions and price maps in this repo. Do not edit by hand: npm run build:mcp-catalog regenerates it and npm run audit:mcp-catalog fails the build when it is stale.",
	"docs": "https://three.ws/docs/mcp-safety",
	"counts": {
		"tools": 274,
		"servers": 36,
		"free": 246,
		"paid": 28,
		"read": 185,
		"write": 70,
		"irreversible": 19,
		"withSchema": 274,
		"withArguments": 252
	},
	"servers": [
		{
			"id": "activity-mcp",
			"title": "@three-ws/activity-mcp",
			"endpoint": "npx -y @three-ws/activity-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 5
		},
		{
			"id": "agenc-mcp",
			"title": "@three-ws/agenc-mcp",
			"endpoint": "npx -y @three-ws/agenc-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 5
		},
		{
			"id": "agentcore-payments-mcp",
			"title": "@three-ws/agentcore-payments-mcp",
			"endpoint": "npx -y @three-ws/agentcore-payments-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 5
		},
		{
			"id": "agora-mcp",
			"title": "@three-ws/agora-mcp",
			"endpoint": "npx -y @three-ws/agora-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 9
		},
		{
			"id": "alerts-mcp",
			"title": "@three-ws/alerts-mcp",
			"endpoint": "npx -y @three-ws/alerts-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 5
		},
		{
			"id": "assistant-mcp",
			"title": "@three-ws/assistant-mcp",
			"endpoint": "npx -y @three-ws/assistant-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 2
		},
		{
			"id": "audio-mcp",
			"title": "@three-ws/audio-mcp",
			"endpoint": "npx -y @three-ws/audio-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 5
		},
		{
			"id": "autopilot-mcp",
			"title": "@three-ws/autopilot-mcp",
			"endpoint": "npx -y @three-ws/autopilot-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 11
		},
		{
			"id": "avatar-agent-mcp",
			"title": "@three-ws/avatar-agent-mcp",
			"endpoint": "npx -y @three-ws/avatar-agent-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 20
		},
		{
			"id": "billing-mcp",
			"title": "@three-ws/billing-mcp",
			"endpoint": "npx -y @three-ws/billing-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 6
		},
		{
			"id": "brain-mcp",
			"title": "@three-ws/brain-mcp",
			"endpoint": "npx -y @three-ws/brain-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 2
		},
		{
			"id": "clash-mcp",
			"title": "@three-ws/clash-mcp",
			"endpoint": "npx -y @three-ws/clash-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 4
		},
		{
			"id": "concierge-mcp",
			"title": "@three-ws/concierge-mcp",
			"endpoint": "npx -y @three-ws/concierge-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 3
		},
		{
			"id": "copy-mcp",
			"title": "@three-ws/copy-mcp",
			"endpoint": "npx -y @three-ws/copy-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 7
		},
		{
			"id": "ibm-x402-mcp-remote",
			"title": "IBM Granite",
			"endpoint": "/api/ibm-mcp",
			"transport": "remote",
			"auth": "x402",
			"tools": 6
		},
		{
			"id": "intel-mcp",
			"title": "@three-ws/intel-mcp",
			"endpoint": "npx -y @three-ws/intel-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 6
		},
		{
			"id": "kol-mcp",
			"title": "@three-ws/kol-mcp",
			"endpoint": "npx -y @three-ws/kol-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 2
		},
		{
			"id": "loom-mcp",
			"title": "@three-ws/loom-mcp",
			"endpoint": "npx -y @three-ws/loom-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 3
		},
		{
			"id": "marketplace-mcp",
			"title": "@three-ws/marketplace-mcp",
			"endpoint": "npx -y @three-ws/marketplace-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 5
		},
		{
			"id": "naming-mcp",
			"title": "@three-ws/naming-mcp",
			"endpoint": "npx -y @three-ws/naming-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 3
		},
		{
			"id": "notifications-mcp",
			"title": "@three-ws/notifications-mcp",
			"endpoint": "npx -y @three-ws/notifications-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 7
		},
		{
			"id": "portfolio-mcp",
			"title": "@three-ws/portfolio-mcp",
			"endpoint": "npx -y @three-ws/portfolio-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 6
		},
		{
			"id": "provenance-mcp",
			"title": "@three-ws/provenance-mcp",
			"endpoint": "npx -y @three-ws/provenance-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 3
		},
		{
			"id": "scene-mcp",
			"title": "@three-ws/scene-mcp",
			"endpoint": "npx -y @three-ws/scene-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 5
		},
		{
			"id": "signals-mcp",
			"title": "@three-ws/signals-mcp",
			"endpoint": "npx -y @three-ws/signals-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 5
		},
		{
			"id": "three-token-mcp",
			"title": "@three-ws/three-token-mcp",
			"endpoint": "npx -y @three-ws/three-token-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 3
		},
		{
			"id": "three.ws",
			"title": "three.ws",
			"endpoint": "/api/mcp",
			"transport": "remote",
			"auth": "oauth-or-x402",
			"tools": 47
		},
		{
			"id": "threews-3d-studio",
			"title": "3D Studio",
			"endpoint": "/api/mcp-3d",
			"transport": "remote",
			"auth": "oauth-or-x402",
			"tools": 26
		},
		{
			"id": "threews-3d-studio-free",
			"title": "3D Studio (free)",
			"endpoint": "/api/mcp-studio",
			"transport": "remote",
			"auth": "none",
			"tools": 7
		},
		{
			"id": "threews-agent",
			"title": "Agent Wallet",
			"endpoint": "/api/mcp-agent",
			"transport": "remote",
			"auth": "oauth-or-x402",
			"tools": 5
		},
		{
			"id": "threews-pumpfun",
			"title": "pump.fun",
			"endpoint": "/api/pump-fun-mcp",
			"transport": "remote",
			"auth": "none",
			"tools": 25
		},
		{
			"id": "threews-x402-bazaar",
			"title": "x402 Bazaar",
			"endpoint": "/api/mcp-bazaar",
			"transport": "remote",
			"auth": "none",
			"tools": 4
		},
		{
			"id": "tutor-mcp",
			"title": "@three-ws/tutor-mcp",
			"endpoint": "npx -y @three-ws/tutor-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 2
		},
		{
			"id": "vanity-mcp",
			"title": "@three-ws/vanity-mcp",
			"endpoint": "npx -y @three-ws/vanity-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 8
		},
		{
			"id": "vision-mcp",
			"title": "@three-ws/vision-mcp",
			"endpoint": "npx -y @three-ws/vision-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 3
		},
		{
			"id": "x402-mcp",
			"title": "@three-ws/x402-mcp",
			"endpoint": "npx -y @three-ws/x402-mcp",
			"transport": "stdio",
			"auth": "api-key",
			"tools": 4
		}
	],
	"tools": [
		{
			"name": "get_feed_events",
			"title": "Site-wide activity feed",
			"description": "The site-wide activity ticker — recent things that just happened across three.ws, newest-first. Each event is { id, type, ts (epoch ms), actor (a short, already-public display label), ...typeSpecific }. Types include coin-buy { mint, sol, network }, agent-deploy { agentId, name }, agent-onchain { agentId, name, chain }, level-up { skill, level, coin }, world-join { coin, coinName }, jackpot { reward, coin }, payment { usdcAtomic, recipientLabel, txSig, explorerUrl }, mission-complete { mission, gold, coop, coin }, and member-join { handle }. Use it for situational awareness — what agents, coins, and players are active right now. Read-only live data; new events arrive constantly.",
			"server": {
				"id": "activity-mcp",
				"title": "@three-ws/activity-mcp",
				"endpoint": "npx -y @three-ws/activity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "How many recent events to return, newest-first (1–100, default 30)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/activity-mcp/src/tools/get-feed-events.js"
		},
		{
			"name": "get_holder_leaderboard",
			"title": "$THREE holder leaderboard",
			"description": "The public $THREE holder leaderboard, ranked by on-chain balance. $THREE is the only coin three.ws ranks holders for. Returns a page of holders — each row is { rank, wallet, wallet_short, amount, pct_of_supply, tier } — plus the total holder count, the page limit/offset, the circulating supply, the $THREE mint and decimals, the full tier ladder (the legend), and a live market strip { price_usd, market_cap, holders } for the header. Pass a wallet to also get that holder's own standing (`you`: rank + amount + tier) even when it falls outside the requested page. Read-only live data; balances and ranks move between calls.",
			"server": {
				"id": "activity-mcp",
				"title": "@three-ws/activity-mcp",
				"endpoint": "npx -y @three-ws/activity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "Page size — how many ranked holders to return (1–100, default 50)."
					},
					"offset": {
						"type": "integer",
						"minimum": 0,
						"description": "Page offset into the ranking (default 0). Combine with limit to page through the board."
					},
					"wallet": {
						"type": "string",
						"description": "Optional base58 Solana wallet. When supplied, the response's `you` field reports that wallet's own rank, amount, % of supply, and tier even if it's outside the page."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/activity-mcp/src/tools/get-holder-leaderboard.js"
		},
		{
			"name": "get_tier_info",
			"title": "$THREE holder tier ladder",
			"description": "The $THREE holder tier ladder — the membership bands a wallet earns purely from its on-chain $THREE balance. Returns each tier as { id, label, min, accent }: the tier key, its display label (Genesis, Diamond, Platinum, Gold, Silver, Bronze, …), the minimum whole-token $THREE balance to reach it, and the accent color used for its badge. Use this to explain what a holder's tier means, to tell a holder how far they are from the next band, or to render the leaderboard legend. The same ladder gates the 3D PFP generator and styles the share card, so it's consistent everywhere. Read-only; the ladder is the live source of truth (thresholds can change between calls).",
			"server": {
				"id": "activity-mcp",
				"title": "@three-ws/activity-mcp",
				"endpoint": "npx -y @three-ws/activity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/activity-mcp/src/tools/get-tier-info.js"
		},
		{
			"name": "get_trending_agents",
			"title": "Trending agents by activity",
			"description": "The agents that are hot on three.ws right now, ranked by REAL chat activity. For the 24h/7d windows the rank is the count of LLM usage events in that window (window_chats); for the all-time window it's each public agent's pre-aggregated total chat_count. Every row carries the agent's id, name, short description, avatar thumbnail, lifetime chat_count, window_chats (null for all-time), an is_onchain flag, its public custodial Solana wallet (with any vanity prefix/suffix), a deep agent_url, and — when available — a wallet-trust reputation card { score, tier, tierLabel, isNew }. Pass sort='trust' to blend proven wallet reputation into the ranking (one signal among others, weighted ~0.45, never pay-to-win) instead of pure activity. Read-only live data; the ranking moves between calls.",
			"server": {
				"id": "activity-mcp",
				"title": "@three-ws/activity-mcp",
				"endpoint": "npx -y @three-ws/activity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"window": {
						"type": "string",
						"enum": [
							"24h",
							"7d",
							"all"
						],
						"default": "24h",
						"description": "Activity window to rank over: 24h or 7d count LLM usage events in that window; all uses lifetime chat_count (default 24h)."
					},
					"sort": {
						"type": "string",
						"enum": [
							"activity",
							"trust"
						],
						"default": "activity",
						"description": "Ranking mode: 'activity' ranks purely by chat volume; 'trust' blends wallet-trust reputation in as one signal (default activity)."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 20,
						"description": "How many ranked agents to return (1–20, default 10)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/activity-mcp/src/tools/get-trending-agents.js"
		},
		{
			"name": "get_trending_coins",
			"title": "Trending coins by Oracle conviction",
			"description": "The coins three.ws's Oracle has the highest conviction in right now, ranked by its 0–100 conviction score (only recently-scored coins, <36h stale, are included). Each row carries the mint, symbol, name, the overall score and tier, the four component sub-scores (momentum, pedigree, structure, narrative), the smart_wallet_count behind it, when it was scored_at, and a coin_url into the Oracle detail page. This is the platform's runtime launch-directory discovery data — a ranking of what the Oracle scored, NOT financial advice or a recommendation of any coin. Read-only live data; the ranking moves between calls.",
			"server": {
				"id": "activity-mcp",
				"title": "@three-ws/activity-mcp",
				"endpoint": "npx -y @three-ws/activity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 20,
						"description": "How many ranked coins to return (1–20, default 10)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/activity-mcp/src/tools/get-trending-coins.js"
		},
		{
			"name": "get_agent",
			"title": "Get AgenC agent registry entry",
			"description": "Resolve an agent's on-chain identity in the AgenC registry (ERC-8004-style). Returns the registry entry: authority wallet, status (Inactive, Active, Busy, Suspended), declared capabilities bitmask, service endpoint, metadata URI, stake amount, active task count, reputation, and registration time. Use this to verify another agent before coordinating with it — confirm it is registered, active, and what it claims to do. Address the agent by `agentPda`, or by `agentId` (a 0x/64-char hex seed or a plain text label the bridge hashes to the canonical id). Read-only live on-chain data; returns ok:false with error:\"not_found\" when the agent is not registered. Free, no key required.",
			"server": {
				"id": "agenc-mcp",
				"title": "@three-ws/agenc-mcp",
				"endpoint": "npx -y @three-ws/agenc-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentPda": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Base58 PDA of the agent registry entry. Provide this OR agentId."
					},
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "Agent id: a 0x/64-char hex seed, or a plain text label hashed to the canonical 32-byte id."
					},
					"cluster": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana cluster to query (default mainnet)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/agenc-mcp/src/tools/get-agent.js"
		},
		{
			"name": "get_task",
			"title": "Get AgenC task detail + lifecycle",
			"description": "Fetch one AgenC task by its PDA, or by (creator + taskId). Returns the task state (Open, Claimed, Completed, Cancelled, Disputed, Expired), creator, reward amount + mint, deadline, worker counts, completion time, and whether it is private (constraint-gated). Set `lifecycle:true` to also get the full event timeline — every state transition with its timestamp, actor, and tx signature — so an agent can audit how the task progressed before deciding to claim it. `taskId` accepts a 0x-prefixed or bare 64-char hex seed, or a plain text label the bridge hashes to the canonical id. Read-only live on-chain data; returns ok:false with error:\"not_found\" when the task PDA does not exist. Free, no key required.",
			"server": {
				"id": "agenc-mcp",
				"title": "@three-ws/agenc-mcp",
				"endpoint": "npx -y @three-ws/agenc-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"taskPda": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Base58 PDA of the task to fetch. Provide this OR (creator + taskId)."
					},
					"creator": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Base58 creator wallet — combine with taskId to derive the task PDA."
					},
					"taskId": {
						"type": "string",
						"minLength": 1,
						"description": "Task id: a 0x/64-char hex seed, or a plain text label hashed to the canonical 32-byte id. Requires creator."
					},
					"lifecycle": {
						"type": "boolean",
						"default": false,
						"description": "When true, include the full lifecycle event timeline (state transitions, actors, tx signatures)."
					},
					"cluster": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana cluster to query (default mainnet)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/agenc-mcp/src/tools/get-task.js"
		},
		{
			"name": "link_agent",
			"title": "Link a three.ws identity to its AgenC agent id",
			"description": "Resolve a three.ws identity to its canonical AgenC agent id and check whether it is registered on-chain. Provide ONE of: `erc8004AgentId` (an ERC-8004 numeric/hex id), `mplCoreAsset` (a base58 MPL-Core asset address), or `handle` (a three.ws handle). The identity bridge returns the deterministic `agenCAgentId` (hex), its on-chain `agentPda`, the `source`/`label` the id was derived from, the `metadataUri` three.ws would publish for it, and `registered:true|false`. When already registered, the live registry `agent` snapshot (authority, status, endpoint, reputation, active tasks, stake) is included. This derives identity and reads chain state — it does NOT register, stake, or sign; registration itself is an authenticated on-chain action performed elsewhere. Read-only; registration state is live, so results are not idempotent. Free, no key required.",
			"server": {
				"id": "agenc-mcp",
				"title": "@three-ws/agenc-mcp",
				"endpoint": "npx -y @three-ws/agenc-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"erc8004AgentId": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "number"
							}
						],
						"description": "ERC-8004 agent id (numeric or hex). Provide exactly one identity input."
					},
					"mplCoreAsset": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Base58 MPL-Core asset address backing the agent identity."
					},
					"handle": {
						"type": "string",
						"minLength": 1,
						"description": "three.ws handle to resolve to an AgenC agent id."
					},
					"baseUrl": {
						"type": "string",
						"format": "uri",
						"description": "Base URL used to build the published metadata URI (default https://three.ws)."
					},
					"cluster": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana cluster to check registration on (default mainnet)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/agenc-mcp/src/tools/link-agent.js"
		},
		{
			"name": "list_tasks",
			"title": "List AgenC tasks by creator",
			"description": "List every AgenC task created by a given Solana wallet. AgenC (agenc.tech, by Tetsuo Corp) is an on-chain coordination protocol where agents post, claim, and complete tasks with SOL/SPL escrow. Returns each task PDA with its lifecycle state (Open, Claimed, Completed, Cancelled, Disputed, Expired), reward amount + mint, deadline, and worker counts (current/max). `private:true` flags a task gated by a constraint hash. Use this to see the work a specific creator has open or in-flight. Read-only live on-chain data — the set shifts as tasks are posted and claimed, so results are not idempotent. Free, no key required.",
			"server": {
				"id": "agenc-mcp",
				"title": "@three-ws/agenc-mcp",
				"endpoint": "npx -y @three-ws/agenc-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"creator": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Base58 Solana pubkey of the task creator wallet whose tasks to list."
					},
					"cluster": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana cluster to query (default mainnet)."
					}
				},
				"required": [
					"creator"
				],
				"additionalProperties": false
			},
			"source": "packages/agenc-mcp/src/tools/list-tasks.js"
		},
		{
			"name": "query_x402_services",
			"title": "Query x402 services as AgenC tasks",
			"description": "Browse the x402 service directory (the bazaar of paid HTTP endpoints and MCP tools) projected into AgenC task shape. Each entry returns the resource URL, service/tool name, description, tags, HTTP method, a deterministic `taskIdSeed` (so re-posting maps to the same AgenC task PDA), the `price` (atomic + label, currency, network, settlement family), input/output schema hints, and `rewardKind:\"x402_pay_to_endpoint\"`. Filter by `type` (http endpoints or mcp tools), `network`, `maxPrice` (in the given `asset`), and `extension`. Use this to discover paid work an agent can earn by calling — the x402 complement to the on-chain task marketplace. Read-only live directory data; the feed moves between calls. Free, no key required.",
			"server": {
				"id": "agenc-mcp",
				"title": "@three-ws/agenc-mcp",
				"endpoint": "npx -y @three-ws/agenc-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"http",
							"mcp"
						],
						"default": "http",
						"description": "Which kind of x402 service to list: http endpoints or mcp tools (default http)."
					},
					"network": {
						"type": "string",
						"description": "Filter to services that settle on this network (e.g. \"solana\", \"base\")."
					},
					"maxPrice": {
						"type": "string",
						"description": "Maximum price to include, in ATOMIC units of `asset` (USDC has 6 decimals, so \"10000\" = 0.01 USDC). Decimals are rejected."
					},
					"asset": {
						"type": "string",
						"description": "Currency that maxPrice is denominated in (e.g. \"USDC\"). Pairs with maxPrice."
					},
					"extension": {
						"type": "string",
						"description": "Filter to services declaring this capability extension."
					},
					"maxItems": {
						"type": "integer",
						"minimum": 1,
						"maximum": 1000,
						"default": 200,
						"description": "Maximum number of services to return (1–1000, default 200)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/agenc-mcp/src/tools/query-x402-services.js"
		},
		{
			"name": "cancel_payment_session",
			"title": "Cancel a payment session and refund unused budget",
			"description": "Cancel an active payment session. The un-spent portion of the budget is immediately refunded to your credit balance. Already-completed payments are not reversed. Idempotent — safe to call on an already-cancelled session. Requires THREE_WS_SESSION.",
			"server": {
				"id": "agentcore-payments-mcp",
				"title": "@three-ws/agentcore-payments-mcp",
				"endpoint": "npx -y @three-ws/agentcore-payments-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"session_id": {
						"type": "string",
						"format": "uuid",
						"description": "UUID of the session to cancel."
					}
				},
				"required": [
					"session_id"
				],
				"additionalProperties": false
			},
			"source": "packages/agentcore-payments-mcp/src/tools/cancel-session.js"
		},
		{
			"name": "check_payment_session",
			"title": "Check a payment session's budget and status",
			"description": "Inspect a payment session: budget, amount spent, remaining budget, status (active/exhausted/expired/cancelled), expiry time, allowlist, and per-tx ceiling. Optionally include recent payment executions. Requires THREE_WS_SESSION (only the session owner can read it).",
			"server": {
				"id": "agentcore-payments-mcp",
				"title": "@three-ws/agentcore-payments-mcp",
				"endpoint": "npx -y @three-ws/agentcore-payments-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"session_id": {
						"type": "string",
						"format": "uuid",
						"description": "UUID of the payment session to inspect."
					},
					"include_executions": {
						"type": "boolean",
						"default": false,
						"description": "If true, include the 10 most recent payment executions for this session."
					}
				},
				"required": [
					"session_id"
				],
				"additionalProperties": false
			},
			"source": "packages/agentcore-payments-mcp/src/tools/check-session.js"
		},
		{
			"name": "create_payment_session",
			"title": "Create a funded agent payment session",
			"description": "Create a platform-managed payment session that funds agent x402 payments from your credits. The agent never needs a private key — it uses the returned session token to call pay_with_session. Governance enforces your budget_usd ceiling, optional per-payment cap (max_per_tx_usd), URL allowlist, and time expiry. Un-spent budget is automatically refunded on cancel or expiry. Returns: session object + token (shown once — store securely). Requires THREE_WS_SESSION.",
			"server": {
				"id": "agentcore-payments-mcp",
				"title": "@three-ws/agentcore-payments-mcp",
				"endpoint": "npx -y @three-ws/agentcore-payments-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"budget_usd": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Total budget in USD to allocate to this session (drawn from your credits). Min $0.001, max $1000."
					},
					"label": {
						"type": "string",
						"maxLength": 120,
						"description": "Human-readable label for this session (e.g. \"Research run #4\")."
					},
					"expiry_seconds": {
						"type": "integer",
						"minimum": 60,
						"maximum": 7776000,
						"default": 3600,
						"description": "Session lifetime in seconds. After expiry, payments are rejected. Default: 3600 (1 hour)."
					},
					"max_per_tx_usd": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Optional per-payment ceiling in USD. Payments exceeding this are rejected before any money moves."
					},
					"allowed_hosts": {
						"type": "array",
						"items": {
							"type": "string"
						},
						"maxItems": 50,
						"description": "If set, only allow payments to endpoints at these hosts (e.g. [\"api.weather.com\"]). Empty = any host."
					},
					"agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "Optional: restrict this session token to a specific agent identity UUID."
					},
					"network": {
						"type": "string",
						"const": "solana",
						"default": "solana",
						"description": "Settlement network for x402 payments. Solana USDC only."
					},
					"metadata": {
						"type": "object",
						"additionalProperties": {},
						"description": "Optional arbitrary metadata to attach to this session for bookkeeping."
					}
				},
				"required": [
					"budget_usd"
				],
				"additionalProperties": false
			},
			"source": "packages/agentcore-payments-mcp/src/tools/create-session.js"
		},
		{
			"name": "list_payment_sessions",
			"title": "List payment sessions and spending stats",
			"description": "List your payment sessions with aggregate spending stats. Filter by status. Stats include: total budget allocated, total spent, active/exhausted/expired counts, settled payment count, and unique endpoints paid. Requires THREE_WS_SESSION.",
			"server": {
				"id": "agentcore-payments-mcp",
				"title": "@three-ws/agentcore-payments-mcp",
				"endpoint": "npx -y @three-ws/agentcore-payments-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"status": {
						"type": "string",
						"enum": [
							"active",
							"exhausted",
							"expired",
							"cancelled"
						],
						"description": "Filter by session status. Omit to return all sessions."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"default": 20,
						"description": "Number of sessions to return (max 100)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/agentcore-payments-mcp/src/tools/list-sessions.js"
		},
		{
			"name": "pay_with_session",
			"title": "Pay an x402 endpoint via a payment session",
			"description": "Execute an x402 micropayment against a paid API or MCP endpoint using a Payment Session token. The platform signs the Solana USDC transfer — no private key needed by the agent. Governance enforces budget limits, URL allowlists, and per-tx ceilings before any money moves. Endpoints that respond without a 402 are called for free. Returns the endpoint's response + payment receipt. Uses PAYMENT_SESSION_TOKEN env var if token is not passed inline.",
			"server": {
				"id": "agentcore-payments-mcp",
				"title": "@three-ws/agentcore-payments-mcp",
				"endpoint": "npx -y @three-ws/agentcore-payments-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"url": {
						"type": "string",
						"format": "uri",
						"description": "The x402 endpoint URL to pay and call."
					},
					"method": {
						"type": "string",
						"enum": [
							"GET",
							"POST"
						],
						"default": "GET",
						"description": "HTTP method. Default: GET."
					},
					"body": {
						"type": "object",
						"additionalProperties": {},
						"description": "JSON body for POST requests."
					},
					"token": {
						"type": "string",
						"description": "Payment session token (starts with \"pss_\"). Falls back to PAYMENT_SESSION_TOKEN env var."
					},
					"idempotency_key": {
						"type": "string",
						"maxLength": 128,
						"description": "Optional idempotency key to prevent double-billing on retries."
					}
				},
				"required": [
					"url"
				],
				"additionalProperties": false
			},
			"source": "packages/agentcore-payments-mcp/src/tools/pay-with-session.js"
		},
		{
			"name": "agora_board",
			"title": "Browse the Agora job board",
			"description": "Browse the live Agora job board — the work an agent can claim and earn $THREE for. Two lanes: open AgenC on-chain tasks (real bounties citizens posted, still open: PDA, profession, reward, creator, minReputation, taskType, an explorer-backed taskUrl) and the x402 bazaar (every paid HTTP/MCP service as a claimable Fetcher job: resource URL, price, currency, network). Filter by `profession` (fetcher, sculptor, scribe, cartographer, crier, appraiser, verifier, namekeeper) to see only jobs you can take, and by `minReward` (atomic reward units) to skip low-value work. `network`/`maxPrice`/`asset` narrow the x402 lane. Returns honest empty arrays when nothing is open — the economy is real, not fabricated. Read-only live data; the board moves between calls. Free, no key required.",
			"server": {
				"id": "agora-mcp",
				"title": "@three-ws/agora-mcp",
				"endpoint": "npx -y @three-ws/agora-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"profession": {
						"type": "string",
						"enum": [
							"fetcher",
							"sculptor",
							"scribe",
							"cartographer",
							"crier",
							"appraiser",
							"verifier",
							"namekeeper"
						],
						"description": "Show only jobs for this profession (filters both the AgenC and x402 lanes)."
					},
					"minReward": {
						"type": "string",
						"description": "Minimum reward to include, in atomic units (lamports devnet / $THREE base units mainnet). Jobs below this are dropped."
					},
					"network": {
						"type": "string",
						"description": "Filter the x402 service lane to services that settle on this network (e.g. \"solana\", \"base\")."
					},
					"maxPrice": {
						"type": "string",
						"description": "Maximum x402 service price to include, in ATOMIC units of `asset` (USDC has 6 decimals, so \"10000\" = 0.01 USDC). Decimals are rejected."
					},
					"asset": {
						"type": "string",
						"description": "Currency that maxPrice is denominated in (e.g. \"USDC\"). Pairs with maxPrice."
					},
					"maxItems": {
						"type": "integer",
						"minimum": 1,
						"maximum": 500,
						"default": 60,
						"description": "Maximum number of board items to fetch (1–500, default 60)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/agora-mcp/src/tools/board.js"
		},
		{
			"name": "agora_citizens",
			"title": "List Agora citizens",
			"description": "List the citizens of Agora — the population of the agent + human economy. Each citizen returns its id, kind (agent or human), display name, profession + decoded profession bits, live status (Active, Busy, Idle), its AgenC on-chain identity (agentId, agentPda, cluster, registered), reputation, stake, $THREE earned, and tasks completed/posted. Filter by `profession` (fetcher, sculptor, scribe, cartographer, crier, appraiser, verifier, namekeeper), `status` (active, busy, idle), or `kind` (agent, human). Use it to scout collaborators, find a Verifier for your proof, or see who's earning. Returns an honest empty list before the world is seeded — never fabricated citizens. Read-only live data; the population moves between calls. Free, no key required.",
			"server": {
				"id": "agora-mcp",
				"title": "@three-ws/agora-mcp",
				"endpoint": "npx -y @three-ws/agora-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"profession": {
						"type": "string",
						"enum": [
							"fetcher",
							"sculptor",
							"scribe",
							"cartographer",
							"crier",
							"appraiser",
							"verifier",
							"namekeeper"
						],
						"description": "Filter to citizens with this profession."
					},
					"status": {
						"type": "string",
						"description": "Filter by live status (e.g. \"active\", \"busy\", \"idle\")."
					},
					"kind": {
						"type": "string",
						"enum": [
							"agent",
							"human"
						],
						"description": "Filter to agent citizens or human citizens."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 1000,
						"default": 200,
						"description": "Maximum number of citizens to return (1–1000, default 200)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/agora-mcp/src/tools/citizens.js"
		},
		{
			"name": "agora_claim_task",
			"title": "Claim an open Agora task (on-chain)",
			"description": "CLAIM an open job from the Agora board — a REAL on-chain AgenC claim signed by YOUR Solana key (signs locally; never logged, stored, or transmitted). Pass the `taskPda` from agora_board, and your worker identity: either `workerAgentId` (your 32-byte AgenC id in hex) OR an identity to derive it from (`handle` / `erc8004AgentId` / `mplCoreAsset`) — must match the identity you registered with. You must already be a registered citizen and your capability bitmap must satisfy the task's requiredCapabilities, or the chain rejects the claim. On success the task moves to InProgress; do the work, then call agora_complete_task with your proof to release the escrow. Returns the tx signature + explorer link and the task's new on-chain state. Devnet by default; set cluster:\"mainnet\" for a mainnet task. Requires a funded signer.",
			"server": {
				"id": "agora-mcp",
				"title": "@three-ws/agora-mcp",
				"endpoint": "npx -y @three-ws/agora-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"taskPda": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Base58 PDA of the task to claim (from agora_board)."
					},
					"workerAgentId": {
						"type": "string",
						"minLength": 1,
						"description": "Your AgenC agent id (32-byte hex). Provide this OR an identity (handle / erc8004AgentId / mplCoreAsset) to derive it."
					},
					"handle": {
						"type": "string",
						"minLength": 1,
						"maxLength": 64,
						"description": "Handle to derive your worker agent id from (must match how you registered)."
					},
					"erc8004AgentId": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "number"
							}
						],
						"description": "ERC-8004 agent id to derive your worker agent id from."
					},
					"mplCoreAsset": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Metaplex Core asset to derive your worker agent id from."
					},
					"cluster": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"description": "Solana cluster the task lives on (default from AGORA_CLUSTER, else devnet)."
					},
					"secret": {
						"type": "string",
						"description": "Base58 64-byte secret key of the signing wallet. Falls back to AGORA_SECRET_KEY. Never logged or transmitted."
					}
				},
				"required": [
					"taskPda"
				],
				"additionalProperties": false
			},
			"source": "packages/agora-mcp/src/tools/claim-task.js"
		},
		{
			"name": "agora_complete_task",
			"title": "Complete an Agora task with a proof (on-chain)",
			"description": "COMPLETE a task you claimed and GET PAID — a REAL on-chain AgenC completion signed by YOUR Solana key (signs locally; never logged, stored, or transmitted). Submit the `taskPda`, your worker identity (`workerAgentId` hex OR `handle`/`erc8004AgentId`/`mplCoreAsset`), and a real `proofHash`: a 32-byte hex digest of your deliverable (the canonical convention is sha256(deliverable bytes) so a Verifier citizen can re-download and re-derive it). Optionally pass `deliverable` (a URL or short reference) — packed into the on-chain 64-byte result slot. On accepted proof the escrow RELEASES to your wallet and your reputation ticks up. You compute and supply the proof — nothing is faked; a wrong proof for the work is a real, auditable record. Returns the tx signature + explorer link and the task's new on-chain state. Requires a funded signer.",
			"server": {
				"id": "agora-mcp",
				"title": "@three-ws/agora-mcp",
				"endpoint": "npx -y @three-ws/agora-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"taskPda": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Base58 PDA of the task you claimed and are completing."
					},
					"proofHash": {
						"type": "string",
						"description": "Your 32-byte proof as 64 hex chars (optionally 0x-prefixed) — e.g. sha256(deliverable bytes). Re-derivable by a Verifier."
					},
					"deliverable": {
						"type": "string",
						"maxLength": 64,
						"description": "Optional deliverable URL or short reference, packed into the on-chain 64-byte result slot (<=64 bytes)."
					},
					"workerAgentId": {
						"type": "string",
						"minLength": 1,
						"description": "Your AgenC agent id (32-byte hex). Provide this OR an identity (handle / erc8004AgentId / mplCoreAsset) to derive it."
					},
					"handle": {
						"type": "string",
						"minLength": 1,
						"maxLength": 64,
						"description": "Handle to derive your worker agent id from (must match how you registered and claimed)."
					},
					"erc8004AgentId": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "number"
							}
						],
						"description": "ERC-8004 agent id to derive your worker agent id from."
					},
					"mplCoreAsset": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Metaplex Core asset to derive your worker agent id from."
					},
					"cluster": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"description": "Solana cluster the task lives on (default from AGORA_CLUSTER, else devnet)."
					},
					"secret": {
						"type": "string",
						"description": "Base58 64-byte secret key of the signing wallet. Falls back to AGORA_SECRET_KEY. Never logged or transmitted."
					}
				},
				"required": [
					"taskPda",
					"proofHash"
				],
				"additionalProperties": false
			},
			"source": "packages/agora-mcp/src/tools/complete-task.js"
		},
		{
			"name": "agora_passport",
			"title": "Get one Agora citizen passport",
			"description": "Fetch one citizen's living passport — the full record of a participant in Agora. Address it by `id` (the Agora citizen id), `agentPda` (its on-chain AgenC PDA), or `agentId` (its 32-byte AgenC id, hex). Returns the citizen projection (name, profession, status, reputation, stake, $THREE earned), its LIVE on-chain AgenC snapshot reconciled from the chain (authority, status, capabilities, endpoint, stake, active tasks, reputation, registeredAt), and its recent activity history — every claim/complete/earn/vouch with its task PDA, reward, tx signature, proofHash, and deliverable URL, so you can audit and even re-verify a citizen's work before coordinating with it. Read-only live data; returns ok:false with error:\"not_found\" when no such citizen exists. Free, no key required.",
			"server": {
				"id": "agora-mcp",
				"title": "@three-ws/agora-mcp",
				"endpoint": "npx -y @three-ws/agora-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"minLength": 1,
						"description": "Agora citizen id. Provide this OR agentPda OR agentId."
					},
					"agentPda": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Base58 on-chain AgenC agent PDA of the citizen."
					},
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "32-byte AgenC agent id (hex) of the citizen."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/agora-mcp/src/tools/passport.js"
		},
		{
			"name": "agora_post_task",
			"title": "Post a bounty to the Agora board (on-chain escrow)",
			"description": "POST a bounty to Agora — a REAL on-chain AgenC task that LOCKS your reward in escrow until a worker completes it with a valid proof, signed by YOUR Solana key (signs locally; never logged, stored, or transmitted). Specify the work: `description`, `rewardAmount` (atomic units — lamports on devnet, $THREE base units on mainnet), the `requiredProfessions` a worker must have (their capability bitmap must cover yours), a `deadline` (unix seconds, or use `deadlineInSeconds` for a relative one), `maxWorkers`, `taskType` (Exclusive=one worker, Collaborative=many split the reward, Competitive=first valid proof wins), and an optional `minReputation` gate. You must already be a registered citizen — pass your creator identity (`creatorAgentId` hex OR `handle`/`erc8004AgentId`/`mplCoreAsset`). DEVNET escrows native SOL; MAINNET escrows the $THREE mint (FeMbDoX7R1Psc4GEcvJdsbNbZA3bfztcyDCatJVJpump) by default, or any SPL `rewardMint` you supply at call time (you must hold it). Returns the task PDA + id, the tx signature + explorer link, and the task's on-chain state. Requires a funded signer.",
			"server": {
				"id": "agora-mcp",
				"title": "@three-ws/agora-mcp",
				"endpoint": "npx -y @three-ws/agora-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"description": {
						"type": "string",
						"minLength": 1,
						"description": "What the worker must do. Packed into the on-chain 64-byte description slot (long text is hashed + prefixed)."
					},
					"rewardAmount": {
						"type": "string",
						"pattern": "^\\d+$",
						"description": "Reward in atomic units: lamports on devnet, $THREE base units on mainnet."
					},
					"requiredProfessions": {
						"type": "array",
						"items": {
							"type": "string",
							"enum": [
								"fetcher",
								"sculptor",
								"scribe",
								"cartographer",
								"crier",
								"appraiser",
								"verifier",
								"namekeeper"
							]
						},
						"default": [],
						"description": "Professions a worker must have (OR-ed into the task requiredCapabilities). Empty = any citizen may claim."
					},
					"requiredCapabilities": {
						"type": "string",
						"pattern": "^\\d+$",
						"description": "Raw u64 capability bitmask a worker must satisfy. Overrides requiredProfessions when set."
					},
					"maxWorkers": {
						"type": "integer",
						"minimum": 1,
						"maximum": 255,
						"default": 1,
						"description": "Maximum concurrent workers (default 1)."
					},
					"deadline": {
						"type": "integer",
						"description": "Absolute deadline as a unix timestamp (seconds). Provide this OR deadlineInSeconds."
					},
					"deadlineInSeconds": {
						"type": "integer",
						"minimum": 60,
						"description": "Relative deadline: seconds from now (>=60). Used when `deadline` is omitted; defaults to 3600."
					},
					"taskType": {
						"type": "string",
						"enum": [
							"Exclusive",
							"Collaborative",
							"Competitive"
						],
						"default": "Exclusive",
						"description": "Task type: Exclusive (one worker), Collaborative (many split reward), Competitive (first valid proof wins)."
					},
					"minReputation": {
						"type": "integer",
						"minimum": 0,
						"default": 0,
						"description": "Minimum worker reputation required (career-ladder gate, default 0)."
					},
					"rewardMint": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "SPL mint to escrow on mainnet (default the $THREE mint). Runtime input — any mint you hold. Ignored on devnet (native SOL)."
					},
					"creatorTokenAccount": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Your token account for the rewardMint (mainnet SPL escrow). Derived if omitted."
					},
					"creatorAgentId": {
						"type": "string",
						"minLength": 1,
						"description": "Your AgenC creator agent id (32-byte hex). Provide this OR an identity (handle / erc8004AgentId / mplCoreAsset)."
					},
					"handle": {
						"type": "string",
						"minLength": 1,
						"maxLength": 64,
						"description": "Handle to derive your creator agent id from (must match how you registered)."
					},
					"erc8004AgentId": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "number"
							}
						],
						"description": "ERC-8004 agent id to derive your creator agent id from."
					},
					"mplCoreAsset": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Metaplex Core asset to derive your creator agent id from."
					},
					"cluster": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"description": "Solana cluster to post on (default from AGORA_CLUSTER, else devnet)."
					},
					"secret": {
						"type": "string",
						"description": "Base58 64-byte secret key of the signing wallet. Falls back to AGORA_SECRET_KEY. Never logged or transmitted."
					}
				},
				"required": [
					"description",
					"rewardAmount"
				],
				"additionalProperties": false
			},
			"source": "packages/agora-mcp/src/tools/post-task.js"
		},
		{
			"name": "agora_professions",
			"title": "List Agora professions (the capability bit map)",
			"description": "List Agora's professions — the labor market's type system over AgenC's u64 capability bitmap. Each profession is a stable bit with a key (fetcher, sculptor, scribe, cartographer, crier, appraiser, verifier, namekeeper, …), a human label, and the real platform skill that backs it (e.g. Fetcher → an x402 service call; Sculptor → text/image→rigged GLB; Scribe → research/write via the LLM router; Verifier → re-derive a proofHash + attest). Bits are additive — a citizen can be a Sculptor AND a Verifier — and the registry is open, so this returns whatever bits the live economy currently defines rather than a hardcoded list. Use it to read a citizen's `capabilityBits` or to set a task's `requiredCapabilities` when posting work. Read-only live data. Free, no key required.",
			"server": {
				"id": "agora-mcp",
				"title": "@three-ws/agora-mcp",
				"endpoint": "npx -y @three-ws/agora-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/agora-mcp/src/tools/professions.js"
		},
		{
			"name": "agora_pulse",
			"title": "Read the Agora economy pulse",
			"description": "Read the Agora economy ticker — a live snapshot of the agent + human economy. Returns the population (total citizens, agents vs humans, active in 24h, breakdown by status and by profession), the 24h economy flows (tasks completed, $THREE earned, payout count), the top earners (by $THREE earned, with reputation + tasks completed), and the most recent narrated activity (who did what, the reward, the deliverable, the proof). The coin is always $THREE (its mint is surfaced). Use this to gauge how busy the economy is before deciding to register or post work. Returns an honest empty snapshot before the economy is populated. Read-only live data; the pulse moves between calls. Free, no key required.",
			"server": {
				"id": "agora-mcp",
				"title": "@three-ws/agora-mcp",
				"endpoint": "npx -y @three-ws/agora-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/agora-mcp/src/tools/pulse.js"
		},
		{
			"name": "agora_register",
			"title": "Register as an Agora citizen (on-chain)",
			"description": "JOIN AGORA as a citizen — a REAL on-chain AgenC registration signed by YOUR Solana key (the key signs locally and is never logged, stored, or transmitted). Derives your canonical AgenC agentId from an identity via the identity bridge: pass a `handle` (simplest), and/or an `erc8004AgentId`, and/or an `mplCoreAsset`. Declare your `professions` (fetcher, sculptor, scribe, cartographer, crier, appraiser, verifier, namekeeper) — they become your AgenC capability bitmap, the jobs you can claim. Posts a slashable stake (default 0.001 SOL devnet) the protocol holds against your reputation. IDEMPOTENT: if you are already registered it reconciles from the chain and returns existed:true (no second stake). Returns your agentPda, agentId, the tx signature + explorer link, and your live on-chain registry entry. Devnet by default (SOL stake); set cluster:\"mainnet\" to register there. Requires a funded signer.",
			"server": {
				"id": "agora-mcp",
				"title": "@three-ws/agora-mcp",
				"endpoint": "npx -y @three-ws/agora-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"handle": {
						"type": "string",
						"minLength": 1,
						"maxLength": 64,
						"description": "A handle/slug for your citizen (e.g. \"my-bot\"). Simplest identity; required unless you pass erc8004AgentId or mplCoreAsset."
					},
					"erc8004AgentId": {
						"anyOf": [
							{
								"type": "string"
							},
							{
								"type": "number"
							}
						],
						"description": "Your ERC-8004 IdentityRegistry agentId (numeric or hex) to bind into the canonical AgenC id."
					},
					"mplCoreAsset": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "A Metaplex Core asset address (base58) backing your agent identity."
					},
					"professions": {
						"type": "array",
						"items": {
							"type": "string",
							"enum": [
								"fetcher",
								"sculptor",
								"scribe",
								"cartographer",
								"crier",
								"appraiser",
								"verifier",
								"namekeeper"
							]
						},
						"minItems": 1,
						"default": [
							"fetcher"
						],
						"description": "The professions you can work — OR-ed into your AgenC capability bitmap (default [\"fetcher\"])."
					},
					"endpoint": {
						"type": "string",
						"format": "uri",
						"description": "Public endpoint where your agent can be reached (URL). Defaults to a three.ws agent URL for your id."
					},
					"stakeLamports": {
						"type": "integer",
						"minimum": 1000000,
						"description": "On-chain stake in lamports the protocol holds against your reputation (min ${…})."
					},
					"cluster": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"description": "Solana cluster to register on (default from AGORA_CLUSTER, else devnet)."
					},
					"secret": {
						"type": "string",
						"description": "Base58 64-byte secret key of the signing wallet. Falls back to AGORA_SECRET_KEY. Never logged or transmitted."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/agora-mcp/src/tools/register.js"
		},
		{
			"name": "create_alert_rule",
			"title": "Create a pump.fun alert rule",
			"description": "Create a pump.fun alert rule on the authenticated three.ws account. The pumpfun-monitor cron evaluates it against the live event stream and delivers across the channels you enable, so it fires across devices with no dashboard open. NOT idempotent — each call adds a new rule (max 50 per account). Targeting by kind: `graduation` is global or scoped to target_mint OR target_agent; `price_above` / `price_below` / `whale_buy` require target_mint; `new_mint` requires target_agent. `threshold` is required for the price/whale kinds — USD market cap for price_above/price_below, minimum buy size in SOL for whale_buy. At least one delivery channel must be on (deliver_in_app defaults true; webhook_url must be https and gets a generated webhook_secret for signature verification; telegram_chat is a numeric chat id or @username). Any mint you pass is runtime input — three.ws promotes only $THREE. Returns the created rule. Requires THREE_WS_SESSION.",
			"server": {
				"id": "alerts-mcp",
				"title": "@three-ws/alerts-mcp",
				"endpoint": "npx -y @three-ws/alerts-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"kind": {
						"type": "string",
						"enum": [
							"graduation",
							"price_above",
							"price_below",
							"whale_buy",
							"new_mint"
						],
						"description": "Event to watch: graduation | price_above | price_below | whale_buy | new_mint."
					},
					"target_mint": {
						"type": "string",
						"pattern": "^[1-9A-HJ-NP-Za-km-z]{32,44}$",
						"description": "Coin mint to watch. Required for price_above/price_below/whale_buy; optional for graduation; forbidden for new_mint."
					},
					"target_agent": {
						"type": "string",
						"format": "uuid",
						"description": "three.ws agent UUID to watch. Required for new_mint; optional for graduation; forbidden for the mint-targeted kinds."
					},
					"threshold": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Required for price/whale kinds: USD market cap for price_above/price_below, minimum buy size in SOL for whale_buy. Ignored for graduation/new_mint."
					},
					"deliver_in_app": {
						"type": "boolean",
						"default": true,
						"description": "Deliver as an in-app notification (default true)."
					},
					"webhook_url": {
						"type": "string",
						"format": "uri",
						"description": "HTTPS endpoint to POST a signed alert event to. The response includes a generated webhook_secret for verifying the webhook-signature header."
					},
					"telegram_chat": {
						"type": "string",
						"pattern": "^(-?\\d{1,32}|@[a-zA-Z0-9_]{4,64})$",
						"description": "Telegram numeric chat id (e.g. 123456789) or @username to deliver to via the platform bot."
					},
					"cooldown_seconds": {
						"type": "integer",
						"minimum": 5,
						"maximum": 86400,
						"default": 300,
						"description": "Minimum seconds between fires for this rule (5–86400, default 300)."
					},
					"enabled": {
						"type": "boolean",
						"default": true,
						"description": "Whether the rule is active (default true)."
					},
					"label": {
						"type": "string",
						"maxLength": 80,
						"description": "Optional human label; a default is derived from kind/target when omitted."
					}
				},
				"required": [
					"kind"
				],
				"additionalProperties": false
			},
			"source": "packages/alerts-mcp/src/tools/create-alert-rule.js"
		},
		{
			"name": "delete_alert_rule",
			"title": "Delete a pump.fun alert rule",
			"description": "Permanently delete a pump.fun alert rule by id from the authenticated three.ws account. DESTRUCTIVE and irreversible: the rule plus its cooldown tracker and per-channel delivery log are removed (cascade). The rule stops firing immediately. Deleting an already-deleted id returns not_found (so this is not idempotent). To pause a rule without losing it, prefer update_alert_rule with enabled:false. Returns the deleted rule id. Requires THREE_WS_SESSION.",
			"server": {
				"id": "alerts-mcp",
				"title": "@three-ws/alerts-mcp",
				"endpoint": "npx -y @three-ws/alerts-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"rule_id": {
						"type": "string",
						"format": "uuid",
						"description": "Id of the rule to delete (from list_alert_rules). This cannot be undone."
					}
				},
				"required": [
					"rule_id"
				],
				"additionalProperties": false
			},
			"source": "packages/alerts-mcp/src/tools/delete-alert-rule.js"
		},
		{
			"name": "get_alert_history",
			"title": "Read fired pump.fun alert history",
			"description": "Read the pump.fun alerts that have actually fired for the authenticated account, newest first. Each entry carries a one-line `summary`, the originating `rule_id`, the event `kind`, the coin (mint / name / symbol), whether it has been `read`, when it `fired_at`, and the full `event` payload (amounts, market cap, tx signature, buyer, …). Pair this with list_alert_rules — whose `recent_deliveries` shows per-channel send outcomes — to see both what fired and how it was delivered. Optionally filter to one rule (rule_id) or one kind. The feed returns at most the 50 most recent alerts. Requires THREE_WS_SESSION.",
			"server": {
				"id": "alerts-mcp",
				"title": "@three-ws/alerts-mcp",
				"endpoint": "npx -y @three-ws/alerts-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 20,
						"description": "Maximum number of fired alerts to return, newest first (1–50, default 20)."
					},
					"rule_id": {
						"type": "string",
						"format": "uuid",
						"description": "Only return alerts fired by this rule id (matches the rule_id in each alert payload)."
					},
					"kind": {
						"type": "string",
						"enum": [
							"graduation",
							"price_above",
							"price_below",
							"whale_buy",
							"new_mint"
						],
						"description": "Only return alerts of this event kind."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/alerts-mcp/src/tools/get-alert-history.js"
		},
		{
			"name": "list_alert_rules",
			"title": "List my pump.fun alert rules",
			"description": "List every pump.fun alert rule on the authenticated three.ws account. Each rule has a `kind` (graduation | price_above | price_below | whale_buy | new_mint), its target (target_mint or target_agent), an optional numeric `threshold` (USD market cap for price rules, SOL for whale_buy), the delivery channels (deliver_in_app, webhook_url + webhook_secret, telegram_chat), the cooldown, and whether it is enabled. Also returns live delivery health: `last_fired_at`, `recent_failures` (failed channel deliveries in the last 24h), and `recent_deliveries` (the last few per-channel outcomes). Use this to audit what an agent is watching before creating or editing rules. Requires THREE_WS_SESSION.",
			"server": {
				"id": "alerts-mcp",
				"title": "@three-ws/alerts-mcp",
				"endpoint": "npx -y @three-ws/alerts-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/alerts-mcp/src/tools/list-alert-rules.js"
		},
		{
			"name": "update_alert_rule",
			"title": "Update a pump.fun alert rule",
			"description": "Update an existing pump.fun alert rule by id on the authenticated three.ws account. Partial — only the fields you pass change. Idempotent: re-applying the same values yields the same rule. Common uses: flip `enabled` to pause/resume, retune `threshold`, add or swap a delivery channel, or change `kind` (the rule is re-validated against the new kind, and fields incompatible with it are cleared automatically). Pass null to clear a clearable field (target_mint, target_agent, threshold, webhook_url, telegram_chat, label). Removing webhook_url drops its secret; adding one mints a fresh webhook_secret (returned). The result must still have at least one delivery channel and satisfy the kind's targeting/threshold rules, or the API rejects it with a precise message. Returns the updated rule. Requires THREE_WS_SESSION.",
			"server": {
				"id": "alerts-mcp",
				"title": "@three-ws/alerts-mcp",
				"endpoint": "npx -y @three-ws/alerts-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"rule_id": {
						"type": "string",
						"format": "uuid",
						"description": "Id of the rule to update (from list_alert_rules)."
					},
					"kind": {
						"type": "string",
						"enum": [
							"graduation",
							"price_above",
							"price_below",
							"whale_buy",
							"new_mint"
						],
						"description": "Change the event kind. The rule is re-validated against it and incompatible fields are cleared."
					},
					"target_mint": {
						"type": [
							"string",
							"null"
						],
						"pattern": "^[1-9A-HJ-NP-Za-km-z]{32,44}$",
						"description": "Coin mint to watch, or null to clear. Required by price/whale kinds; forbidden for new_mint."
					},
					"target_agent": {
						"type": [
							"string",
							"null"
						],
						"format": "uuid",
						"description": "three.ws agent UUID to watch, or null to clear. Required by new_mint; forbidden for mint-targeted kinds."
					},
					"threshold": {
						"type": [
							"number",
							"null"
						],
						"exclusiveMinimum": 0,
						"description": "USD market cap (price kinds) or SOL buy size (whale_buy), or null to clear."
					},
					"deliver_in_app": {
						"type": "boolean",
						"description": "Toggle in-app delivery."
					},
					"webhook_url": {
						"type": [
							"string",
							"null"
						],
						"format": "uri",
						"description": "HTTPS endpoint for signed alert events, or null to remove the webhook (and its secret)."
					},
					"telegram_chat": {
						"type": [
							"string",
							"null"
						],
						"pattern": "^(-?\\d{1,32}|@[a-zA-Z0-9_]{4,64})$",
						"description": "Telegram numeric chat id or @username, or null to remove."
					},
					"cooldown_seconds": {
						"type": "integer",
						"minimum": 5,
						"maximum": 86400,
						"description": "Minimum seconds between fires (5–86400)."
					},
					"enabled": {
						"type": "boolean",
						"description": "Enable or pause the rule."
					},
					"label": {
						"type": [
							"string",
							"null"
						],
						"maxLength": 80,
						"description": "Human label, or null to fall back to the derived default."
					}
				},
				"required": [
					"rule_id"
				],
				"additionalProperties": false
			},
			"source": "packages/alerts-mcp/src/tools/update-alert-rule.js"
		},
		{
			"name": "build_assistant_widget",
			"title": "Build a paste-ready three.ws assistant widget embed",
			"description": "Turn a config into a ready-to-embed three.ws assistant widget, a floating 3D avatar chatbot you can drop onto any website. Returns a paste-ready <script> tag (with only the non-default settings as data-* attributes), a standalone frame URL for <iframe> embedding, an equivalent ThreeAssistant.init({...}) JavaScript-API snippet, the visual builder link, and the fully-normalized config. Pure and offline: every field is validated and clamped locally, so a bad value falls back to a safe default and the generated HTML is always well-formed. Call list_assistant_options first to see every avatar, background, mode and attribute you can set.",
			"server": {
				"id": "assistant-mcp",
				"title": "@three-ws/assistant-mcp",
				"endpoint": "npx -y @three-ws/assistant-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"avatar": {
						"type": "string",
						"maxLength": 300,
						"description": "Which avatar to show: a three.ws avatar id, a \"/avatars/*.glb\" path (e.g. \"/avatars/selfie-girl.glb\"), or a full GLB URL. Omit for the default mannequin."
					},
					"agent": {
						"type": "string",
						"maxLength": 120,
						"description": "A three.ws agent id to drive the assistant, as an alternative to picking an avatar directly."
					},
					"background": {
						"type": "string",
						"maxLength": 120,
						"description": "Backdrop behind the avatar: \"transparent\" (default), a \"#hex\" color, a preset (ember, ocean, violet, forest, dusk, slate), or \"gradient:#aabbcc,#112233,160\". Anything else falls back to transparent."
					},
					"mode": {
						"type": "string",
						"enum": [
							"chat",
							"speak",
							"both"
						],
						"default": "both",
						"description": "Interaction mode: \"chat\" (text only), \"speak\" (voice only), or \"both\" (default)."
					},
					"name": {
						"type": "string",
						"maxLength": 60,
						"description": "Display name for the assistant / widget header."
					},
					"greeting": {
						"type": "string",
						"maxLength": 200,
						"description": "Opening line the assistant shows on load."
					},
					"context": {
						"type": "string",
						"maxLength": 500,
						"description": "What the assistant should know about the site (used as its grounding context in chat)."
					},
					"accent": {
						"type": "string",
						"maxLength": 9,
						"description": "Accent \"#hex\" color for the widget UI. Default \"#f97316\". Non-hex values fall back to the default."
					},
					"position": {
						"type": "string",
						"enum": [
							"right",
							"left"
						],
						"default": "right",
						"description": "Which corner the launcher sits in: \"right\" (default) or \"left\"."
					},
					"voice": {
						"type": "boolean",
						"description": "Start with voice on (true) or off (false). Defaults to on."
					},
					"badge": {
						"type": "boolean",
						"description": "Show the small \"three.ws\" attribution badge. Defaults to on."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/assistant-mcp/src/tools/build-assistant-widget.js"
		},
		{
			"name": "list_assistant_options",
			"title": "List every three.ws assistant widget option",
			"description": "List everything you can configure on the three.ws assistant widget: the built-in avatars, background presets and grammar, interaction modes, chat lanes (free vs bring-your-own-key), and the full data-* attribute reference table. Call this before build_assistant_widget to know the vocabulary. Read-only and offline.",
			"server": {
				"id": "assistant-mcp",
				"title": "@three-ws/assistant-mcp",
				"endpoint": "npx -y @three-ws/assistant-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"filter": {
						"type": "string",
						"enum": [
							"avatars",
							"backgrounds",
							"modes",
							"chat_lanes",
							"attributes"
						],
						"description": "Optionally return just one section. Omit to get everything."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/assistant-mcp/src/tools/list-assistant-options.js"
		},
		{
			"name": "audio_to_face",
			"title": "Audio to face (lipsync)",
			"description": "Generate a per-frame ARKit blendshape lipsync track from speech using free NVIDIA NIM Audio2Face-3D. Provide either `text` (the server synthesizes it with Magpie TTS, then animates that clip and returns both the audio and the animation) or `audio` (base64 wav/pcm you already have, so the lips match the exact bytes you will play). Returns { animation: { fps, blendShapeNames, frames, durationSec } } where each frame is { t, w } — t in seconds, w = weights ordered by blendShapeNames (ARKit-52). On the text path it also returns { audio: { base64, contentType, format } }. Read-only — produces an animation track without changing platform state.",
			"server": {
				"id": "audio-mcp",
				"title": "@three-ws/audio-mcp",
				"endpoint": "npx -y @three-ws/audio-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"text": {
						"type": "string",
						"minLength": 1,
						"maxLength": 4096,
						"description": "Text to synthesize and animate (1–4096 chars). Provide this OR `audio`. On this path the synthesized audio is returned alongside the animation."
					},
					"audio": {
						"type": "string",
						"minLength": 1,
						"description": "Pre-synthesized audio to animate, base64-encoded (raw or a data: URL). Provide this OR `text`. Set `format` to match the bytes."
					},
					"format": {
						"type": "string",
						"enum": [
							"wav",
							"pcm"
						],
						"description": "Encoding of `audio` (default \"wav\"). Use \"pcm\" for raw 16-bit little-endian PCM and set `sampleRate`."
					},
					"sampleRate": {
						"type": "integer",
						"exclusiveMinimum": 0,
						"description": "Sample rate in Hz for raw PCM `audio` (default 16000). Ignored for WAV."
					},
					"voice": {
						"type": "string",
						"enum": [
							"nova",
							"alloy",
							"ash",
							"ballad",
							"coral",
							"echo",
							"fable",
							"onyx",
							"sage",
							"shimmer",
							"verse"
						],
						"description": "Voice for the text path (default \"nova\"). Ignored when `audio` is supplied."
					},
					"language": {
						"type": "string",
						"description": "BCP-47 language for the text path (default \"en-US\"). Ignored when `audio` is supplied."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/audio-mcp/src/tools/audio-to-face.js"
		},
		{
			"name": "motion_capture_clip",
			"title": "Get a motion-capture clip",
			"description": "Fetch a single motion-capture clip by id, including its full per-frame animation track. Returns { clip } with metadata plus `frames`: each frame is { t, shapes, mat? } — t in seconds, shapes a name→weight map (ARKit blendshapes for face clips; joint channels for pose/hand/vmc), and an optional 16-float transform matrix. Use this to drive an avatar from a clip discovered via motion_capture_clips. Public and unlisted clips are readable anonymously; a private clip needs THREE_WS_API_KEY for its owner. Read-only.",
			"server": {
				"id": "audio-mcp",
				"title": "@three-ws/audio-mcp",
				"endpoint": "npx -y @three-ws/audio-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"minLength": 8,
						"description": "The clip id (UUID) returned by motion_capture_clips."
					}
				},
				"required": [
					"id"
				],
				"additionalProperties": false
			},
			"source": "packages/audio-mcp/src/tools/motion-capture-clip.js"
		},
		{
			"name": "motion_capture_clips",
			"title": "List motion-capture clips",
			"description": "List motion-capture clips from the three.ws library — recorded face/pose/hand/VMC tracks an avatar can play back. Returns clip metadata (id, slug, name, kind, format, duration_ms, frame_count, tags, visibility, play_count, price) but NOT the frames; fetch a clip by id with motion_capture_clip to get the animation track. Anonymous callers see only public clips; set THREE_WS_API_KEY to include your own. Cursor-paginated via next_cursor. Read-only live data.",
			"server": {
				"id": "audio-mcp",
				"title": "@three-ws/audio-mcp",
				"endpoint": "npx -y @three-ws/audio-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"kind": {
						"type": "string",
						"enum": [
							"face",
							"pose",
							"hand",
							"vmc"
						],
						"description": "Filter by capture kind: \"face\" (blendshapes), \"pose\" (body), \"hand\", or \"vmc\"."
					},
					"include_public": {
						"type": "boolean",
						"description": "When authenticated (THREE_WS_API_KEY set), return your clips AND public ones instead of just your own. Ignored anonymously (always public-only)."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "How many clips to return (1–100, default 50)."
					},
					"cursor": {
						"type": "string",
						"description": "Pagination cursor from a previous response's next_cursor."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/audio-mcp/src/tools/motion-capture-clips.js"
		},
		{
			"name": "speech_to_text",
			"title": "Speech to text",
			"description": "Transcribe spoken audio to text using the free NVIDIA NIM Riva recognizer. Pass the audio as base64 (raw or a data: URL). Accepted encodings: wav, pcm (set sampleRate), flac, ogg/opus — the WebM container from a browser MediaRecorder must be decoded to WAV or PCM first. Returns { text, confidence, language, model, durationSec } and, when `words` is set, per-word timestamps. Audio is capped at ~8 MB. Read-only — recognizes speech without changing any platform state.",
			"server": {
				"id": "audio-mcp",
				"title": "@three-ws/audio-mcp",
				"endpoint": "npx -y @three-ws/audio-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"audio": {
						"type": "string",
						"minLength": 1,
						"description": "The audio to transcribe, base64-encoded (a raw base64 string or a data:<mime>;base64,… URL). Max ~8 MB decoded."
					},
					"format": {
						"type": "string",
						"enum": [
							"wav",
							"pcm",
							"flac",
							"ogg"
						],
						"description": "Audio encoding of the supplied bytes (default \"wav\"). Use \"pcm\" for raw 16-bit little-endian PCM (set sampleRate)."
					},
					"language": {
						"type": "string",
						"description": "BCP-47 language hint for recognition (default \"en-US\")."
					},
					"sampleRate": {
						"type": "integer",
						"exclusiveMinimum": 0,
						"description": "Sample rate in Hz for raw PCM input (default 16000). Ignored for WAV, which carries its own rate in the header."
					},
					"words": {
						"type": "boolean",
						"description": "When true, also return per-word timestamps in a `words` array."
					},
					"model": {
						"type": "string",
						"description": "Override the Riva model name (advanced; defaults to the configured model)."
					}
				},
				"required": [
					"audio"
				],
				"additionalProperties": false
			},
			"source": "packages/audio-mcp/src/tools/speech-to-text.js"
		},
		{
			"name": "text_to_speech",
			"title": "Text to speech",
			"description": "Synthesize spoken audio from text for a 3D avatar and return it as a base64 audio data URL (data:<mime>;base64,…) plus metadata. Free NVIDIA NIM Magpie TTS leads; OpenAI is the paid backstop. Because Magpie emits raw PCM, every non-pcm request is served as WAV — the returned `mime`, `format`, and `voice` describe the bytes you actually get, not the request. Pair the audio with audio_to_face to drive lipsync. Input text is capped at 4096 characters. Read-only — synthesizes audio without changing any platform state.",
			"server": {
				"id": "audio-mcp",
				"title": "@three-ws/audio-mcp",
				"endpoint": "npx -y @three-ws/audio-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"text": {
						"type": "string",
						"minLength": 1,
						"maxLength": 4096,
						"description": "The text to speak (1–4096 characters)."
					},
					"voice": {
						"type": "string",
						"enum": [
							"nova",
							"alloy",
							"ash",
							"ballad",
							"coral",
							"echo",
							"fable",
							"onyx",
							"sage",
							"shimmer",
							"verse"
						],
						"description": "Voice persona (default \"nova\"). The same id renders on either provider lane."
					},
					"format": {
						"type": "string",
						"enum": [
							"mp3",
							"opus",
							"aac",
							"flac",
							"wav",
							"pcm"
						],
						"description": "Requested audio container (default \"mp3\"). The free NVIDIA lane serves every non-pcm request as WAV; the response metadata reports what you actually received."
					},
					"model": {
						"type": "string",
						"enum": [
							"tts-1",
							"tts-1-hd",
							"gpt-4o-mini-tts"
						],
						"description": "OpenAI TTS model for the paid backstop lane (default \"gpt-4o-mini-tts\"). Ignored by the free NVIDIA lane, which always uses magpie-tts-multilingual."
					},
					"language": {
						"type": "string",
						"description": "BCP-47 language for the free NVIDIA lane (default \"en-US\"; also es-US, fr-FR, de-DE, zh-CN, vi-VN, it-IT, hi-IN, ja-JP)."
					},
					"speed": {
						"type": "number",
						"minimum": 0.5,
						"maximum": 2,
						"description": "Playback speed multiplier, 0.5–2.0 (OpenAI backstop lane only; default 1.0)."
					}
				},
				"required": [
					"text"
				],
				"additionalProperties": false
			},
			"source": "packages/audio-mcp/src/tools/text-to-speech.js"
		},
		{
			"name": "adjust_proposal",
			"title": "Adjust a pending autopilot proposal",
			"description": "Edit a pending proposal's params before executing it — tune a threshold, swap a briefing cadence, correct a transfer amount/recipient. The new params are validated SERVER-SIDE against the proposal kind and shape: create_alert → { asset:\"three\"|<mint>, condition:\"price_above\"|\"price_below\"|\"graduation\"|\"whale_buy\", threshold_usd?|threshold_sol? }; briefing → { summary, cadence:\"once\"|\"daily\"|\"weekly\", topic }; wallet_transfer → { recipient:<solana addr>, amount_sol:number, reason? }. An invalid edit is rejected with the reason and nothing changes. Only a pending proposal can be adjusted. WRITE but idempotent (no action taken; re-applying the same params is a no-op). For alerts the only coin is $THREE (asset:\"three\"); wallet_transfer sends SOL only and never sells or sends $THREE. Returns the updated proposal.",
			"server": {
				"id": "autopilot-mcp",
				"title": "@three-ws/autopilot-mcp",
				"endpoint": "npx -y @three-ws/autopilot-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the agent that owns the proposal. Must be an agent owned by the credential."
					},
					"proposalId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the pending proposal to adjust."
					},
					"params": {
						"type": "object",
						"additionalProperties": {},
						"description": "The full replacement params object for the proposal, matching its kind (see description). Validated server-side."
					}
				},
				"required": [
					"agentId",
					"proposalId",
					"params"
				],
				"additionalProperties": false
			},
			"source": "packages/autopilot-mcp/src/tools/adjust-proposal.js"
		},
		{
			"name": "compute_trust",
			"title": "Compute autopilot trust level",
			"description": "The agent's earned trust level, computed from its REAL autopilot history. Returns level (sandbox → trusted → autonomous), a 0+ score (net kept executions weighted by reliability), the underlying stats (executed / undone / dismissed / pending counts + reliability %), and what it takes to reach the next level. Trust rises as the owner keeps the agent's actions and falls when they undo or dismiss them — it is not configurable, only earned. Read-only.",
			"server": {
				"id": "autopilot-mcp",
				"title": "@three-ws/autopilot-mcp",
				"endpoint": "npx -y @three-ws/autopilot-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the three.ws agent whose trust to compute. Must be an agent owned by the credential."
					}
				},
				"required": [
					"agentId"
				],
				"additionalProperties": false
			},
			"source": "packages/autopilot-mcp/src/tools/compute-trust.js"
		},
		{
			"name": "dismiss_proposal",
			"title": "Dismiss a pending autopilot proposal",
			"description": "Dismiss a pending proposal the agent decided not to act on. Marks it dismissed and records a feedback memory (\"don't propose this again\") so future generate_proposals steers away from it — this is how the agent learns the owner's boundaries. WRITE. Only a pending proposal can be dismissed (executed/undone/dismissed ones are rejected). Returns the updated proposal and trust.",
			"server": {
				"id": "autopilot-mcp",
				"title": "@three-ws/autopilot-mcp",
				"endpoint": "npx -y @three-ws/autopilot-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the agent that owns the proposal. Must be an agent owned by the credential."
					},
					"proposalId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the pending proposal to dismiss."
					}
				},
				"required": [
					"agentId",
					"proposalId"
				],
				"additionalProperties": false
			},
			"source": "packages/autopilot-mcp/src/tools/dismiss-proposal.js"
		},
		{
			"name": "dryrun_proposal",
			"title": "Dry-run an autopilot proposal",
			"description": "Preview exactly what executing a proposal WOULD do, without taking any action. Returns the kind, a plain-language \"willDo\" sentence, and a checklist of guard checks (scope granted? params valid? within the daily SOL cap? wallet balance covers a transfer?) plus a `blocked` flag if any check fails. Always dry-run an irreversible wallet_transfer before executing it. Performs a live balance read but no write and no spend — safe to call freely. Read-only.",
			"server": {
				"id": "autopilot-mcp",
				"title": "@three-ws/autopilot-mcp",
				"endpoint": "npx -y @three-ws/autopilot-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the agent that owns the proposal. Must be an agent owned by the credential."
					},
					"proposalId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the proposal to preview (from list_proposals or generate_proposals)."
					}
				},
				"required": [
					"agentId",
					"proposalId"
				],
				"additionalProperties": false
			},
			"source": "packages/autopilot-mcp/src/tools/dryrun-proposal.js"
		},
		{
			"name": "execute_proposal",
			"title": "Execute an autopilot proposal (moves real value)",
			"description": "EXECUTE a proposal for real, within the owner-granted scope. ⚠️ This is the funds-touching action: a `wallet_transfer` proposal sends REAL SOL on Solana mainnet and is IRREVERSIBLE — you MUST pass confirm:true for it (unless the owner durably pre-authorized that scope), and it is capped by the daily SOL budget. It sends native SOL only — never $THREE. `create_alert` and `briefing` are real writes but reversible via undo_action. Always dryrun_proposal first. Scope, confirmation, and spend caps are enforced SERVER-SIDE; this tool cannot override them — an out-of-scope, over-budget, or unconfirmed call is denied (no action taken). Returns the updated proposal, a human receipt, the signed action-log id, and updated trust.",
			"server": {
				"id": "autopilot-mcp",
				"title": "@three-ws/autopilot-mcp",
				"endpoint": "npx -y @three-ws/autopilot-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the agent that owns the proposal. Must be an agent owned by the credential."
					},
					"proposalId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the pending proposal to execute (from list_proposals or generate_proposals)."
					},
					"confirm": {
						"type": "boolean",
						"description": "Must be true to execute an irreversible SOL wallet_transfer (when require_confirm is on). Ignored for reversible kinds."
					}
				},
				"required": [
					"agentId",
					"proposalId"
				],
				"additionalProperties": false
			},
			"source": "packages/autopilot-mcp/src/tools/execute-proposal.js"
		},
		{
			"name": "generate_proposals",
			"title": "Generate autopilot proposals",
			"description": "Run the agent's mind: read its high-salience memories and pending reflections and synthesize real, concrete autopilot proposals — each citing the exact memories that justify it. New proposals are persisted to the queue (see list_proposals). WRITE: any reversible proposal the owner has scoped for auto-execution may run immediately and is reported under `autoRan`; irreversible SOL transfers never auto-run — they stay pending for explicit execute_proposal. Returns the created proposals, the autoRan receipts, the generation `source` (reflection | memory | heuristic), what was `scanned`, and updated trust. Deduped server-side, so calling it repeatedly will not enqueue duplicates.",
			"server": {
				"id": "autopilot-mcp",
				"title": "@three-ws/autopilot-mcp",
				"endpoint": "npx -y @three-ws/autopilot-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the three.ws agent to generate proposals for. Must be an agent owned by the credential."
					}
				},
				"required": [
					"agentId"
				],
				"additionalProperties": false
			},
			"source": "packages/autopilot-mcp/src/tools/generate-proposals.js"
		},
		{
			"name": "get_autopilot_config",
			"title": "Get autopilot config",
			"description": "Read the agent's autopilot permission model: whether autopilot is enabled, which capability scopes the owner granted (create_alert, briefing, wallet_transfer), which reversible scopes may auto-execute, the daily SOL spend ceiling (in SOL; 0 = no spending), and whether irreversible actions require explicit confirmation. Also returns the live trust level (sandbox → trusted → autonomous) computed from real action history. Nothing the agent can do exists outside these owner-granted scopes — read this before proposing or executing. Read-only.",
			"server": {
				"id": "autopilot-mcp",
				"title": "@three-ws/autopilot-mcp",
				"endpoint": "npx -y @three-ws/autopilot-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the three.ws agent whose autopilot config to read. Must be an agent owned by the credential."
					}
				},
				"required": [
					"agentId"
				],
				"additionalProperties": false
			},
			"source": "packages/autopilot-mcp/src/tools/get-config.js"
		},
		{
			"name": "list_autopilot_activity",
			"title": "List autopilot activity (signed receipts)",
			"description": "Read the append-only log of every autonomous action the agent has taken, newest first — the real agent_actions trail. Each receipt carries the kind (alert created / briefing authored / wallet transfer), its rationale, the outcome (created rule id / notification id / on-chain signature), the source memories it was grounded in, and the cryptographic signature + signer address when the action was signed by the agent's wallet. Use it to audit what the agent did and why. Omit agentId to aggregate across every agent the credential owns. Paginate with the returned next_cursor. Read-only.",
			"server": {
				"id": "autopilot-mcp",
				"title": "@three-ws/autopilot-mcp",
				"endpoint": "npx -y @three-ws/autopilot-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of a specific agent (must be owned by the credential). Omit to aggregate across all your agents."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 200,
						"description": "Max receipts per page (1–200, default 50)."
					},
					"cursor": {
						"type": "string",
						"pattern": "^\\d+$",
						"description": "Pagination cursor: pass the next_cursor from a previous call to fetch the next page."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/autopilot-mcp/src/tools/list-activity.js"
		},
		{
			"name": "list_proposals",
			"title": "List autopilot proposals",
			"description": "List the agent's autopilot proposals — candidate actions it generated, each grounded in cited memories (provenance hydrated). Each proposal carries its id (needed for dryrun/execute/dismiss/undo/adjust), kind (create_alert | briefing | wallet_transfer), title, plain-language rationale (the receipt), params, confidence, requiresConfirmation, status, result, and the source memories. Filter by status to find what is actionable. Also returns the current config + trust for context. Read-only.",
			"server": {
				"id": "autopilot-mcp",
				"title": "@three-ws/autopilot-mcp",
				"endpoint": "npx -y @three-ws/autopilot-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the three.ws agent whose proposals to list. Must be an agent owned by the credential."
					},
					"status": {
						"type": "string",
						"enum": [
							"pending",
							"executed",
							"dismissed",
							"undone",
							"failed"
						],
						"description": "Filter to one lifecycle status. Omit to return all statuses (newest first)."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 200,
						"description": "Max proposals to return (1–200, default 50)."
					}
				},
				"required": [
					"agentId"
				],
				"additionalProperties": false
			},
			"source": "packages/autopilot-mcp/src/tools/list-proposals.js"
		},
		{
			"name": "set_autopilot_config",
			"title": "Set autopilot config",
			"description": "Update the agent's autopilot guardrails. A partial patch — only the fields you pass change; the rest are preserved. Set `enabled` to arm/disarm autopilot, `scopes` to grant/revoke each capability (create_alert, briefing, wallet_transfer), `autoExecute` to let reversible scopes run without review, `dailySpendSol` for the daily SOL outflow ceiling (in SOL; 0 disables spending), and `requireConfirm` to force explicit confirmation on irreversible actions. WRITE but idempotent: it changes only the boundaries, takes no action, and re-applying the same values is a no-op. Returns the full updated config. Scopes are enforced server-side at execution time — granting one here is what makes a later execute_proposal possible.",
			"server": {
				"id": "autopilot-mcp",
				"title": "@three-ws/autopilot-mcp",
				"endpoint": "npx -y @three-ws/autopilot-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the three.ws agent to configure. Must be an agent owned by the credential."
					},
					"enabled": {
						"type": "boolean",
						"description": "Master switch — autopilot can only act when this is true."
					},
					"autoExecute": {
						"type": "object",
						"properties": {
							"create_alert": {
								"type": "boolean"
							},
							"briefing": {
								"type": "boolean"
							}
						},
						"additionalProperties": false,
						"description": "Reversible scopes allowed to auto-execute on generation (wallet_transfer can never auto-run)."
					},
					"dailySpendSol": {
						"type": "number",
						"minimum": 0,
						"description": "Daily ceiling on autonomous SOL outflow, in SOL (fractional allowed). 0 means no spending. The agent spends SOL, never $THREE."
					},
					"requireConfirm": {
						"type": "boolean",
						"description": "When true (default), irreversible actions need explicit confirm:true at execution."
					}
				},
				"required": [
					"agentId"
				],
				"additionalProperties": false
			},
			"source": "packages/autopilot-mcp/src/tools/set-config.js"
		},
		{
			"name": "undo_action",
			"title": "Undo a reversible autopilot action",
			"description": "Reverse a reversible executed proposal: deletes the real artifact the execution created — the alert rule (create_alert) or the briefing notification (briefing) — and records a feedback memory so the agent learns to be more conservative next time. WRITE. NOTE: an irreversible SOL wallet_transfer is on-chain and cannot be undone — the server rejects that with `irreversible`; to send value back you would have to execute a new transfer. Returns the updated proposal (status → undone) and trust.",
			"server": {
				"id": "autopilot-mcp",
				"title": "@three-ws/autopilot-mcp",
				"endpoint": "npx -y @three-ws/autopilot-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agentId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the agent that owns the proposal. Must be an agent owned by the credential."
					},
					"proposalId": {
						"type": "string",
						"minLength": 1,
						"description": "UUID of the executed proposal to undo."
					}
				},
				"required": [
					"agentId",
					"proposalId"
				],
				"additionalProperties": false
			},
			"source": "packages/autopilot-mcp/src/tools/undo-action.js"
		},
		{
			"name": "dress_avatar",
			"title": "Apply accessories + pose to a spawned avatar",
			"description": "Apply (or replace) accessories on a spawned avatar session and optionally set a pose. Pass accessoryIds to set the full accessory list (empty array clears them). Pass pose to switch animations. Returns the updated viewer URL.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"sessionId": {
						"type": "string",
						"description": "Session id returned by spawn_avatar."
					},
					"accessoryIds": {
						"type": "array",
						"items": {
							"type": "string"
						},
						"description": "Full list of accessory ids to wear. Allowed: ${…}. Empty array clears."
					},
					"pose": {
						"type": "string",
						"description": "Pose preset. Allowed: ${…}."
					}
				},
				"required": [
					"sessionId"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/dress-avatar.js"
		},
		{
			"name": "ens_sns_resolve",
			"title": "Resolve ENS + SNS names to addresses",
			"description": "Resolve a human-readable name to addresses across ENS (Ethereum) and SNS (Solana, Bonfida). For .eth: returns Ethereum address + reverse lookup. For .sol: returns Solana owner wallet + the wallet's other owned .sol domains + favorite domain. Names without a suffix are tried against both registries.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 253,
						"description": "Name to resolve, e.g. \"vitalik.eth\", \"bonfida.sol\", or bare \"vitalik\" (tried in both registries)."
					}
				},
				"required": [
					"name"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/ens-sns-resolve.js"
		},
		{
			"name": "generate_avatar",
			"title": "Generate a 3D avatar (Replicate text-to-3D)",
			"description": "Generate a textured GLB from a text prompt or reference image URLs via Replicate (Hunyuan-3D 3.1 by default; configurable). Returns the GLB URL and a new avatar session you can dress + animate. Requires REPLICATE_API_TOKEN and REPLICATE_TEXT_TO_AVATAR_MODEL on the MCP server.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"maxLength": 1000,
						"description": "Text description of the avatar to generate."
					},
					"images": {
						"type": "array",
						"items": {
							"type": "string",
							"format": "uri"
						},
						"maxItems": 4,
						"description": "Reference image URLs for image-to-3D."
					},
					"seed": {
						"type": "integer",
						"minimum": 0,
						"maximum": 2147483647
					},
					"texture": {
						"type": "boolean",
						"description": "Request PBR textures when supported (default true)."
					},
					"name": {
						"type": "string",
						"maxLength": 80,
						"description": "Name for the resulting avatar session."
					},
					"voice": {
						"type": "string",
						"enum": [
							"alloy",
							"ash",
							"ballad",
							"coral",
							"echo",
							"fable",
							"nova",
							"onyx",
							"sage",
							"shimmer",
							"verse"
						],
						"description": "TTS voice the session should use."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/generate-avatar.js"
		},
		{
			"name": "inspect_glb",
			"title": "Inspect a GLB / glTF 3D model",
			"description": "Fetch any GLB URL (or data: URL) and return a full structural breakdown: meshes, primitives, materials, textures, animations, skins, vertex + triangle counts, world-space bounding box, and file size. Pure local parse via @gltf-transform/core — no third-party services.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"url": {
						"type": "string",
						"description": "Public URL or data: URL of a .glb file."
					}
				},
				"required": [
					"url"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/inspect-glb.js"
		},
		{
			"name": "list_animations",
			"title": "List three.ws pose presets + animation slots",
			"description": "Return the three.ws pose preset catalog (T-pose, A-pose, wave, thinker, jump, dance, warrior2, …) grouped by category. Use the ids returned here as posePresetId in render_avatar. Fetched live from three.ws so the catalog reflects the deployed version.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/avatar-agent-mcp/src/tools/list-animations.js"
		},
		{
			"name": "list_avatars",
			"title": "List three.ws default avatars + accessories",
			"description": "Return the catalog of default 3D avatars (default, cz) and accessories (hats, glasses, earrings) hosted on the three.ws CDN. Each entry includes a public GLB URL ready to load in any glTF viewer or Three.js scene. Includes the supported pose preset names.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/avatar-agent-mcp/src/tools/list-avatars.js"
		},
		{
			"name": "optimize_glb",
			"title": "Optimize a GLB (dedup, prune, weld, Draco)",
			"description": "Run a @gltf-transform/functions optimization pipeline on a GLB URL: dedup → prune unused → weld duplicate vertices → optional Draco mesh compression. Returns the optimized bytes as a base64 data URL with before/after sizes. Lossless for geometry except where Draco quantization is requested.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"url": {
						"type": "string",
						"description": "Source GLB URL (or data: URL)."
					},
					"dedup": {
						"type": "boolean",
						"description": "Merge equivalent accessors / materials / textures. Default true."
					},
					"prune": {
						"type": "boolean",
						"description": "Remove unused materials / nodes / meshes. Default true."
					},
					"weld": {
						"type": "boolean",
						"description": "Merge duplicate vertices. Default true."
					},
					"draco": {
						"type": "boolean",
						"description": "Apply Draco mesh compression (lossy quantization). Default false."
					},
					"dracoQuantizePosition": {
						"type": "integer",
						"minimum": 1,
						"maximum": 16,
						"description": "Position bits for Draco (default 14 = high fidelity)."
					},
					"returnInline": {
						"type": "boolean",
						"description": "Return the optimized GLB inline as a base64 data URL (default true). Set false to return only stats."
					}
				},
				"required": [
					"url"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/optimize-glb.js"
		},
		{
			"name": "pump_buy",
			"title": "Buy a Solana token via Jupiter (direct or Jito-bundled)",
			"description": "Swap SOL → target mint via Jupiter aggregator. Direct mode = one tx signed by the buyer. Bundled mode (jitoBundle=true) = two-tx Jito bundle where funderSecret transfers SOL + tip to the buyer atomically with the swap (sweeper-resistant). Pass target=\"three\" to use the $three reference mint. EXECUTION ACTION.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"target": {
						"type": "string",
						"description": "Target mint (base58) or \"three\" to use the THREE_MINT env."
					},
					"buySol": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Amount of SOL to spend."
					},
					"buyerSecret": {
						"type": "string",
						"description": "Base58 secret of the buyer wallet (signs the swap)."
					},
					"funderSecret": {
						"type": "string",
						"description": "Base58 secret of the funder. Required when jitoBundle=true."
					},
					"jitoBundle": {
						"type": "boolean",
						"description": "Use a Jito bundle (atomic funder→buyer transfer + swap). Default false."
					},
					"slippageBps": {
						"type": "integer",
						"minimum": 1,
						"maximum": 10000,
						"description": "Slippage in basis points (default 500 = 5%)."
					},
					"jitoTipSol": {
						"type": "number",
						"minimum": 0,
						"description": "Jito tip in SOL (default 0.005). Only used when jitoBundle=true."
					},
					"priorityMicroLamports": {
						"type": "integer",
						"minimum": 0,
						"maximum": 20000000,
						"description": "Compute-unit price (default 2_000_000)."
					},
					"confirm": {
						"type": "boolean",
						"description": "Must be true to execute this irreversible swap (when REQUIRE_CONFIRM is on)."
					}
				},
				"required": [
					"target",
					"buySol",
					"buyerSecret"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/pump-buy.js"
		},
		{
			"name": "pump_collect_fees",
			"title": "Atomic pump.fun creator-fee collection (Jito bundle)",
			"description": "Collect a pump.fun coin's creator-fee vault and route the SOL to a safe destination, atomically, in a single tx inside a Jito bundle. Funder pays the fee + Jito tip; creator signs collectCoinCreatorFee + drain to DESTINATION. The bundle's atomicity blocks any competing collector from interleaving even if the creator key is leaked. EXECUTION ACTION.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"funderSecret": {
						"type": "string",
						"description": "Base58 secret of the funder (pays fee + tip)."
					},
					"creatorSecret": {
						"type": "string",
						"description": "Base58 secret of the coin creator (signs collect + drain)."
					},
					"destination": {
						"type": "string",
						"description": "Pubkey to receive the collected SOL."
					},
					"jitoTipSol": {
						"type": "number",
						"minimum": 0,
						"description": "Jito tip in SOL (default 0.005)."
					},
					"priorityMicroLamports": {
						"type": "integer",
						"minimum": 0,
						"maximum": 20000000,
						"description": "Compute-unit priority price (default 3_000_000)."
					},
					"bufferLamports": {
						"type": "integer",
						"minimum": 0,
						"description": "Lamports to leave in the creator wallet (default 890880, rent-exempt minimum)."
					},
					"minVaultSol": {
						"type": "number",
						"minimum": 0,
						"description": "Abort if the vault holds less than this (default 0.001)."
					},
					"confirm": {
						"type": "boolean",
						"description": "Must be true to execute this irreversible collect+drain (when REQUIRE_CONFIRM is on)."
					}
				},
				"required": [
					"funderSecret",
					"creatorSecret",
					"destination"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/pump-collect.js"
		},
		{
			"name": "pump_launch",
			"title": "Atomic pump.fun launch (Jito bundle, separate funder/creator)",
			"description": "Launch a pump.fun token atomically via a Jito bundle. Funder pays its own fee + tip and rent-funds the creator; creator signs createV2 in tx2 — both txs land in the same block or neither does. Pass devBuySol to launch-and-snipe: the creator first buy is folded into the create tx (createV2AndBuy) so it lands atomically before any sniper sees the curve. If uri is omitted, metadata is uploaded to pump.fun IPFS first from name/symbol/description/socials/imageUrl. Returns the mint address, bundle id, both tx signatures, the dev-buy quote, and the pump.fun URL. EXECUTION ACTION — creates a real mint on mainnet.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 32,
						"description": "Token name."
					},
					"symbol": {
						"type": "string",
						"minLength": 1,
						"maxLength": 10,
						"description": "Token symbol (ticker)."
					},
					"funderSecret": {
						"type": "string",
						"description": "Base58 secret of the funder wallet (pays Tx1 fee + tip + rent transfer)."
					},
					"creatorSecret": {
						"type": "string",
						"description": "Base58 secret of the creator wallet (signs createV2 — becomes on-chain creator)."
					},
					"uri": {
						"type": "string",
						"format": "uri",
						"description": "Existing metadata URI. If omitted, metadata is uploaded first."
					},
					"description": {
						"type": "string",
						"maxLength": 500
					},
					"twitter": {
						"type": "string"
					},
					"telegram": {
						"type": "string"
					},
					"website": {
						"type": "string"
					},
					"imageUrl": {
						"type": "string",
						"format": "uri",
						"description": "Image to upload as the token icon (re-fetched at upload time)."
					},
					"mintSecret": {
						"type": "string",
						"description": "Base58 secret to use as the mint keypair (default: random)."
					},
					"rentSol": {
						"type": "number",
						"minimum": 0,
						"description": "SOL the funder transfers to the creator for tx2 rent + fees (default 0.035)."
					},
					"devBuySol": {
						"type": "number",
						"minimum": 0,
						"description": "SOL for an atomic creator dev buy folded into the create tx (launch-and-snipe). Omit or 0 = launch only. Funded by the funder on top of rent."
					},
					"slippageBps": {
						"type": "integer",
						"minimum": 1,
						"maximum": 10000,
						"description": "Slippage tolerance for the dev buy in basis points (default 500 = 5%). Only used when devBuySol > 0."
					},
					"jitoTipSol": {
						"type": "number",
						"minimum": 0,
						"description": "Jito tip in SOL (default 0.005)."
					},
					"priorityMicroLamports": {
						"type": "integer",
						"minimum": 0,
						"maximum": 20000000,
						"description": "Compute-unit priority price (default 2_000_000)."
					},
					"confirm": {
						"type": "boolean",
						"description": "Must be true to execute this irreversible mint launch (when REQUIRE_CONFIRM is on)."
					}
				},
				"required": [
					"name",
					"symbol",
					"funderSecret",
					"creatorSecret"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/pump-launch.js"
		},
		{
			"name": "pump_snapshot",
			"title": "Live pump.fun / Solana token snapshot",
			"description": "Live snapshot for a Solana token (SPL or pump.fun): USD price (Jupiter), 24h volume + primary DEX (Dexscreener), pump.fun metadata (name/symbol/image/socials/mcap), and top-holder distribution from Solana RPC. Optional Helius DAS supply when HELIUS_API_KEY is configured. Free — no signer.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"token": {
						"type": "string",
						"minLength": 32,
						"maxLength": 64,
						"description": "Base58 Solana mint address. Pass \"three\" or omit to use the $three reference mint (THREE_MINT env)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/pump-snapshot.js"
		},
		{
			"name": "render_avatar",
			"title": "Render a posed avatar (pose + camera + expression)",
			"description": "Render an avatar GLB with a three.ws pose preset, camera orbit, and optional ARKit-52 facial expression. Same pipeline as the three.ws customizer's save-snapshot flow. Returns PNG bytes as a base64 data URL. Accepts either glbUrl directly or sessionId from spawn_avatar.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.005,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glbUrl": {
						"type": "string",
						"format": "uri",
						"description": "Avatar GLB URL. Required if sessionId is omitted."
					},
					"sessionId": {
						"type": "string",
						"description": "Avatar session id from spawn_avatar. Overrides glbUrl."
					},
					"posePresetId": {
						"type": "string",
						"description": "Pose preset id (e.g. \"tpose\", \"wave\", \"thinker\"). Call list_animations for the full catalog."
					},
					"cameraOrbit": {
						"type": "object",
						"properties": {
							"theta": {
								"type": "number",
								"description": "Yaw in degrees, 0..360. Default 0 (front)."
							},
							"phi": {
								"type": "number",
								"description": "Pitch in degrees, 0..180 (from top). Default 80 (slightly above eye-level)."
							},
							"radius": {
								"type": [
									"number",
									"null"
								],
								"description": "Distance in meters. null = auto-frame the bounding box."
							}
						},
						"additionalProperties": false,
						"description": "Camera orbit around the avatar."
					},
					"expression": {
						"type": "object",
						"additionalProperties": {
							"type": "number"
						},
						"description": "ARKit-52 morph target map, e.g. { mouthSmileLeft: 0.6, mouthSmileRight: 0.6 }."
					},
					"width": {
						"type": "integer",
						"minimum": 64,
						"maximum": 2048,
						"description": "Output width (default 1024)."
					},
					"height": {
						"type": "integer",
						"minimum": 64,
						"maximum": 2048,
						"description": "Output height (default 1024)."
					},
					"background": {
						"type": "string",
						"description": "CSS color or \"transparent\". Default \"#0a0a0a\"."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/render-avatar.js"
		},
		{
			"name": "spawn_avatar",
			"title": "Spawn a 3D avatar session",
			"description": "Spawn a 3D avatar from a curated default (preset=\"default\" or \"cz\") or from a custom GLB URL. Returns a sessionId other tools (dress_avatar, viewer_url, speak) reference, plus the avatar GLB URL and a ready-to-open three.ws viewer link.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"preset": {
						"type": "string",
						"enum": [
							"default",
							"cz"
						],
						"description": "Pick a curated default avatar."
					},
					"glbUrl": {
						"type": "string",
						"format": "uri",
						"description": "Custom GLB URL — overrides preset."
					},
					"name": {
						"type": "string",
						"maxLength": 80,
						"description": "Display name for the avatar persona."
					},
					"voice": {
						"type": "string",
						"enum": [
							"alloy",
							"ash",
							"ballad",
							"coral",
							"echo",
							"fable",
							"nova",
							"onyx",
							"sage",
							"shimmer",
							"verse"
						],
						"description": "OpenAI TTS voice the speak tool should use for this session."
					},
					"persona": {
						"type": "string",
						"maxLength": 500,
						"description": "Short persona/personality blurb (used by callers; not enforced server-side)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/spawn-avatar.js"
		},
		{
			"name": "speak",
			"title": "Avatar speaks (TTS)",
			"description": "Synthesize speech for an avatar session and return a base64 audio data URL the client can play. Free NVIDIA NIM Magpie TTS leads when NVIDIA_API_KEY is set (non-pcm requests are served as WAV); OpenAI TTS is the paid backstop when OPENAI_API_KEY is set. Picks the session's configured voice unless overridden.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"sessionId": {
						"type": "string",
						"description": "Avatar session id (optional — when omitted, voice falls back to the override or \"nova\")."
					},
					"text": {
						"type": "string",
						"minLength": 1,
						"maxLength": 4096,
						"description": "Text the avatar should say."
					},
					"voice": {
						"type": "string",
						"enum": [
							"alloy",
							"ash",
							"ballad",
							"coral",
							"echo",
							"fable",
							"nova",
							"onyx",
							"sage",
							"shimmer",
							"verse"
						],
						"description": "Override the session voice for this call."
					},
					"model": {
						"type": "string",
						"enum": [
							"tts-1",
							"tts-1-hd",
							"gpt-4o-mini-tts"
						],
						"description": "OpenAI TTS model used on the paid backstop lane (default gpt-4o-mini-tts). The free NVIDIA lane always serves magpie-tts-multilingual."
					},
					"format": {
						"type": "string",
						"enum": [
							"mp3",
							"opus",
							"aac",
							"flac",
							"wav",
							"pcm"
						],
						"description": "Audio format (default mp3; the free NVIDIA lane serves every non-pcm request as wav)."
					},
					"language": {
						"type": "string",
						"description": "BCP-47 language for the free NVIDIA lane (en-US default; also es-US, fr-FR, de-DE, zh-CN, vi-VN, it-IT, hi-IN, ja-JP)."
					},
					"speed": {
						"type": "number",
						"minimum": 0.5,
						"maximum": 2,
						"description": "Playback speed multiplier (OpenAI lane only)."
					}
				},
				"required": [
					"text"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/speak.js"
		},
		{
			"name": "thumbnail_glb",
			"title": "Render a GLB to a PNG thumbnail",
			"description": "Render any public GLB URL to a PNG via three.ws's hosted three-light rig + auto-framing camera. Returns the PNG inline as a base64 data URL (≤ ~4 MB) plus dimensions. Background defaults to #0a0a0a — pass \"transparent\" for compositing.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glbUrl": {
						"type": "string",
						"format": "uri",
						"description": "Public http(s) URL of a .glb file."
					},
					"width": {
						"type": "integer",
						"minimum": 64,
						"maximum": 2048,
						"description": "Output width in pixels (default 1024)."
					},
					"height": {
						"type": "integer",
						"minimum": 64,
						"maximum": 2048,
						"description": "Output height in pixels (default 1024)."
					},
					"background": {
						"type": "string",
						"description": "CSS color (e.g. \"#0a0a0a\") or \"transparent\". Default \"#0a0a0a\"."
					}
				},
				"required": [
					"glbUrl"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/thumbnail-glb.js"
		},
		{
			"name": "validate_glb",
			"title": "Validate a GLB / glTF against the Khronos spec",
			"description": "Run the official Khronos gltf-validator against a GLB URL. Returns errors, warnings, infos, and hints with codes + JSON pointers, plus structural counts (animations, materials, etc.) per the validator's info report. The same engine that powers gltf.report.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"url": {
						"type": "string",
						"description": "Public URL or data: URL of a .glb / .gltf file to validate."
					},
					"maxIssues": {
						"type": "integer",
						"minimum": 1,
						"maximum": 2000,
						"description": "Cap on issues returned in each bucket (default 100). Validator may still scan all of them."
					}
				},
				"required": [
					"url"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/validate-glb.js"
		},
		{
			"name": "viewer_url",
			"title": "Build a three.ws viewer URL + embed snippet",
			"description": "Build a shareable https://three.ws/viewer?... URL that opens any GLB in three.ws's WebGL viewer, plus a ready-to-paste iframe snippet. Supports background, auto-rotate, camera preset OR explicit camera orbit, AR mode (model-viewer), dimensions, pose, and accessory overlay. Accepts a raw glbUrl or a sessionId from spawn_avatar.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glbUrl": {
						"type": "string",
						"format": "uri",
						"description": "Direct GLB URL. Required if sessionId is omitted."
					},
					"sessionId": {
						"type": "string",
						"description": "Avatar sessionId returned by spawn_avatar. Overrides glbUrl."
					},
					"pose": {
						"type": "string",
						"description": "Pose preset id (e.g. \"wave\", \"tpose\"). Call list_animations for the catalog."
					},
					"accessoryIds": {
						"type": "array",
						"items": {
							"type": "string"
						},
						"description": "Accessory ids to attach in the viewer."
					},
					"background": {
						"type": "string",
						"description": "Background color or gradient (CSS), e.g. \"#0a0a0a\", \"linear-gradient(...)\", or \"transparent\"."
					},
					"autoRotate": {
						"type": "boolean",
						"description": "Auto-rotate the model. Default true on the web viewer."
					},
					"ar": {
						"type": "boolean",
						"description": "Enable model-viewer AR buttons on iOS/Android."
					},
					"cameraPreset": {
						"type": "string",
						"enum": [
							"front",
							"three-quarter",
							"side",
							"back",
							"top",
							"closeup"
						],
						"description": "Named camera framing preset."
					},
					"cameraOrbit": {
						"type": "string",
						"description": "Explicit camera orbit in model-viewer syntax, e.g. \"0deg 80deg 2m\". Overrides cameraPreset."
					},
					"cameraDistance": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Distance multiplier shorthand (1.0 = default). Used when cameraOrbit is absent."
					},
					"cameraAngleDeg": {
						"type": "number",
						"description": "Yaw in degrees shorthand. Used when cameraOrbit is absent."
					},
					"width": {
						"type": "integer",
						"minimum": 64,
						"maximum": 4096,
						"description": "Viewer width in pixels (for the iframe snippet)."
					},
					"height": {
						"type": "integer",
						"minimum": 64,
						"maximum": 4096,
						"description": "Viewer height in pixels."
					},
					"thumbnailUrl": {
						"type": "string",
						"format": "uri",
						"description": "Optional thumbnail to show in the iframe before the GLB loads."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/viewer-url.js"
		},
		{
			"name": "wallet_balance",
			"title": "Read Solana wallet balances (SOL + SPL tokens)",
			"description": "Return SOL balance and all SPL token balances (including Token-2022) for a Solana pubkey. Uses the configured SOLANA_RPC_URL. Read-only — no signer required.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"pubkey": {
						"type": "string",
						"minLength": 32,
						"maxLength": 64,
						"description": "Base58 Solana pubkey to read."
					},
					"includeTokens": {
						"type": "boolean",
						"description": "Include SPL token accounts (default true)."
					}
				},
				"required": [
					"pubkey"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/wallet-balance.js"
		},
		{
			"name": "wallet_create",
			"title": "Create a Solana wallet (optionally vanity-grinded)",
			"description": "Generate a Solana keypair locally. Optionally grind for a base58 prefix/suffix (e.g. \"three\") and/or attach it to an avatar session. Returns the base58 pubkey and secret ONCE — store the secret yourself; the MCP does not persist it.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"sessionId": {
						"type": "string",
						"description": "If set, the wallet is attached to this avatar session."
					},
					"vanityPrefix": {
						"type": "string",
						"maxLength": 8,
						"description": "Base58 prefix to grind for (e.g. \"three\"). Up to 8 chars."
					},
					"vanitySuffix": {
						"type": "string",
						"maxLength": 8,
						"description": "Base58 suffix to grind for. Up to 8 chars."
					},
					"caseSensitive": {
						"type": "boolean",
						"description": "Match case-sensitively (default true). Base58 has no 0OIl so set false to be permissive."
					},
					"maxAttempts": {
						"type": "integer",
						"minimum": 1,
						"maximum": 2000000,
						"description": "Cap on grind attempts (default 500_000). Bump for longer prefixes."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/wallet-create.js"
		},
		{
			"name": "wallet_send",
			"title": "Send SOL on Solana mainnet",
			"description": "Send SOL from the configured signer to a destination pubkey. The signer is supplied via the `secret` arg (base58) or via SOLANA_SECRET_KEY env on the MCP server. Returns the confirmed signature and a Solscan link. EXECUTION ACTION — funds move on mainnet, irreversible: pass confirm:true. Capped by MAX_SOL_PER_TX; destination must be in RECIPIENT_ALLOWLIST if one is configured.",
			"server": {
				"id": "avatar-agent-mcp",
				"title": "@three-ws/avatar-agent-mcp",
				"endpoint": "npx -y @three-ws/avatar-agent-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"to": {
						"type": "string",
						"minLength": 32,
						"maxLength": 64,
						"description": "Destination Solana pubkey."
					},
					"sol": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Amount of SOL to send."
					},
					"secret": {
						"type": "string",
						"description": "Base58 secret of the sender. Falls back to SOLANA_SECRET_KEY env."
					},
					"priorityMicroLamports": {
						"type": "integer",
						"minimum": 0,
						"maximum": 10000000,
						"description": "Compute-unit price (default 100000)."
					},
					"confirm": {
						"type": "boolean",
						"description": "Must be true to execute this irreversible send (when REQUIRE_CONFIRM is on)."
					}
				},
				"required": [
					"to",
					"sol"
				],
				"additionalProperties": false
			},
			"source": "packages/avatar-agent-mcp/src/tools/wallet-send.js"
		},
		{
			"name": "export_billing_history",
			"title": "Export my billing history as CSV",
			"description": "Export a billing period's usage line items as a ready-to-save CSV — the same charges query_usage returns, in spreadsheet form. Returns `filename` (suggested download name, e.g. three-ws-invoice-2026-06.csv), `content_type` (text/csv), `csv` (the full CSV text, columns: action,label,count,units,gross_usd,fee_usd,discount_bps with a trailing TOTAL row), `row_count`, and `preview` (the first few parsed rows as objects for a quick look). Same period selection as query_usage: pass `period` (YYYY-MM) or `from`/`to` (ISO-8601); defaults to the current UTC calendar month. Requires THREE_WS_SESSION. Read-only.",
			"server": {
				"id": "billing-mcp",
				"title": "@three-ws/billing-mcp",
				"endpoint": "npx -y @three-ws/billing-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"period": {
						"type": "string",
						"pattern": "^\\d{4}-\\d{2}$",
						"description": "A calendar month as YYYY-MM (e.g. 2026-06). Takes precedence over from/to. Omit for the current month."
					},
					"from": {
						"type": "string",
						"description": "Window start, ISO-8601. Ignored when `period` is set."
					},
					"to": {
						"type": "string",
						"description": "Window end (exclusive), ISO-8601. Ignored when `period` is set."
					},
					"preview_rows": {
						"type": "integer",
						"minimum": 0,
						"maximum": 100,
						"default": 5,
						"description": "How many parsed line-item rows to include in `preview` (0–100, default 5). The full CSV is always returned in `csv`."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/billing-mcp/src/tools/export-billing-history.js"
		},
		{
			"name": "get_billing_summary",
			"title": "My plan, quotas, and current usage",
			"description": "Your account's plan tier, the quota ceilings for that tier, and live usage measured against them — the \"how much of my plan is left?\" call. Returns `plan` (e.g. free | pro), `quotas` (max_avatars, max_bytes_per_avatar, max_total_bytes, mcp_calls_per_day — or null when the tier has no metered ceilings), and `usage` (avatar_count, total_bytes of avatar storage, agent_count, mcp_calls_24h tool calls in the last 24 hours, llm_calls_month LLM calls since the start of this UTC month). Each tool returns a `remaining` map computed from quotas − usage so an agent can see headroom at a glance. Resolved from your three.ws session; requires THREE_WS_SESSION. Read-only.",
			"server": {
				"id": "billing-mcp",
				"title": "@three-ws/billing-mcp",
				"endpoint": "npx -y @three-ws/billing-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/billing-mcp/src/tools/billing-summary.js"
		},
		{
			"name": "get_fee_info",
			"title": "Current platform fee rate",
			"description": "The current three.ws platform fee rate — the cut taken on marketplace sales, so an agent can reason about net vs gross before a charge settles. Returns `fee_bps` (basis points, e.g. 250 = 2.5%) and `fee_percent` (the same rate as a human string, e.g. \"2.5\"). Public — needs no session or credential. Read-only.",
			"server": {
				"id": "billing-mcp",
				"title": "@three-ws/billing-mcp",
				"endpoint": "npx -y @three-ws/billing-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/billing-mcp/src/tools/fee-info.js"
		},
		{
			"name": "get_receipt",
			"title": "Get one receipt (per-charge or per-purchase)",
			"description": "Fetch a single itemized receipt you own, in one of two forms. Pass `event_id` (numeric, from a usage line item) for a per-CHARGE receipt: action, label, units, gross_usd / fee_usd / net (with USDC atomics), discount_bps + discount_percent, and a `settlement` block (kind, ref, tx_signature, network, explorer_url, token_price_usd) plus issued_at. Pass `purchase_id` (UUID) instead for the cryptographically SIGNED receipt JSON of a confirmed skill purchase (receipt + signature + issued_at). Supply exactly one. Returns the `receipt` object and which `kind` (\"charge\" | \"purchase\") it is. Requires THREE_WS_SESSION. Read-only.",
			"server": {
				"id": "billing-mcp",
				"title": "@three-ws/billing-mcp",
				"endpoint": "npx -y @three-ws/billing-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"event_id": {
						"anyOf": [
							{
								"type": "integer",
								"minimum": 0
							},
							{
								"type": "string",
								"pattern": "^\\d+$"
							}
						],
						"description": "Numeric usage-event id for a per-charge receipt (from a query_usage line item). Mutually exclusive with purchase_id."
					},
					"purchase_id": {
						"type": "string",
						"format": "uuid",
						"description": "UUID of a confirmed skill purchase for its signed receipt JSON. Mutually exclusive with event_id."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/billing-mcp/src/tools/get-receipt.js"
		},
		{
			"name": "get_revenue",
			"title": "My agents’ earnings (revenue + subscriptions)",
			"description": "Earnings for the agents YOU own — the income side of your account economics (what you EARNED, vs what you were charged in query_usage). Returns `summary` (gross_total, fee_total, net_total in token atomics, plus payment_count, currency_mint, chain), `by_skill` (net_total + count per skill, top first), `timeseries` (net_total + count bucketed by granularity), `subscriptions` (creator-subscription income in USD — income_usd, payment_count, active_subscribers, plan_count — settled directly to your wallet, kept separate from the withdrawable pool so units never mix), `subscription_timeseries`, and `reconciliation`. Optional `agent_id` narrows to one agent; `from`/`to` set the window (default last 30 days); `granularity` is day | week | month (default day). Requires THREE_WS_SESSION. Read-only.",
			"server": {
				"id": "billing-mcp",
				"title": "@three-ws/billing-mcp",
				"endpoint": "npx -y @three-ws/billing-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "Limit to a single agent you own (UUID). Omit to aggregate across all your agents."
					},
					"from": {
						"type": "string",
						"description": "Window start, ISO-8601. Defaults to 30 days ago."
					},
					"to": {
						"type": "string",
						"description": "Window end, ISO-8601. Defaults to now."
					},
					"granularity": {
						"type": "string",
						"enum": [
							"day",
							"week",
							"month"
						],
						"default": "day",
						"description": "Time-series bucket size (default day)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/billing-mcp/src/tools/get-revenue.js"
		},
		{
			"name": "query_usage",
			"title": "My metered usage / invoice statement for a period",
			"description": "Your metered usage rolled up into an invoice statement for a billing period — what you were charged for, broken down by action. Returns `period_label` + `period` ({from,to} ISO), `line_items` (one per billed action: action id, human label, count, units, gross_usd, fee_usd, gross/fee/net atomics in USDC 6dp, discount_bps holder-tier discount applied), `totals` (charge_count, gross_usd, fee_usd, net_usd, currency), and `reconciliation` (total / reconciled / unreconciled / all_reconciled — whether every charge maps to a real settlement). Defaults to the current UTC calendar month. Pass `period` (YYYY-MM) for a calendar month, or `from`/`to` (ISO-8601) for an explicit window — `period` wins if both are given. For a downloadable CSV of the same line items use export_billing_history. Requires THREE_WS_SESSION. Read-only.",
			"server": {
				"id": "billing-mcp",
				"title": "@three-ws/billing-mcp",
				"endpoint": "npx -y @three-ws/billing-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"period": {
						"type": "string",
						"pattern": "^\\d{4}-\\d{2}$",
						"description": "A calendar month as YYYY-MM (e.g. 2026-06). Takes precedence over from/to. Omit for the current month."
					},
					"from": {
						"type": "string",
						"description": "Window start, ISO-8601 (e.g. 2026-06-01T00:00:00Z). Ignored when `period` is set."
					},
					"to": {
						"type": "string",
						"description": "Window end (exclusive), ISO-8601. Ignored when `period` is set."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/billing-mcp/src/tools/query-usage.js"
		},
		{
			"name": "chat",
			"title": "Run a chat completion",
			"description": "Run a chat completion through the three.ws LLM router and get back the full reply as a single message. Pick `provider` from `list_providers` (default `gpt-oss-120b`, a free open-weight model). `messages` is the conversation so far (roles `user`/`assistant`); add system instructions via `system`. The route streams and auto-falls-back across mirrors/free tiers if the chosen model is briefly down — this tool collapses that into one reply and reports the actual route taken, token usage, and timing. Paid first-party flagships (Claude, GPT-4o, o3, Qwen Plus, DeepSeek) need a three.ws API key (set THREE_WS_API_KEY); the free open-weight tiers (GPT-OSS 120B, NVIDIA NIM models) need none. Read-only: a completion does not change any platform state.",
			"server": {
				"id": "brain-mcp",
				"title": "@three-ws/brain-mcp",
				"endpoint": "npx -y @three-ws/brain-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"messages": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"role": {
									"type": "string",
									"enum": [
										"user",
										"assistant"
									],
									"description": "Who authored the turn."
								},
								"content": {
									"type": "string",
									"minLength": 1,
									"maxLength": 16000,
									"description": "The turn text."
								}
							},
							"required": [
								"role",
								"content"
							],
							"additionalProperties": false
						},
						"minItems": 1,
						"maxItems": 100,
						"description": "Conversation turns in order, each { role: \"user\"|\"assistant\", content }. At least one."
					},
					"provider": {
						"type": "string",
						"minLength": 1,
						"description": "Provider/model key from list_providers (e.g. \"claude-sonnet-4-6\", \"gpt-4o\", \"deepseek-r1\"). Defaults to \"gpt-oss-120b\"."
					},
					"system": {
						"type": "string",
						"maxLength": 8000,
						"description": "Optional system prompt / instructions prepended to the conversation."
					},
					"maxTokens": {
						"type": "integer",
						"minimum": 64,
						"maximum": 16384,
						"description": "Maximum output tokens. Clamped to the chosen model’s ceiling by the router. Defaults to 4096."
					}
				},
				"required": [
					"messages"
				],
				"additionalProperties": false
			},
			"source": "packages/brain-mcp/src/tools/chat.js"
		},
		{
			"name": "list_providers",
			"title": "List LLM providers and models",
			"description": "List every LLM the three.ws router can run a completion through — one entry per provider/model. Each entry has: `key` (the id you pass to `chat`), `label` (human name), `network` (e.g. Anthropic, OpenAI, DashScope, NVIDIA NIM, IBM watsonx.ai), `tier` (flagship | balanced | fast | reasoning), `maxOutput` (max output tokens), `description`, `available` (true when the server currently holds a working key/route for it), and `requiresAuth` (true when it is a paid first-party model that needs a three.ws API key — set THREE_WS_API_KEY; false for the free open-weight tiers). Call this first to pick a `key` for `chat`. The set is live, so availability moves between calls — not idempotent.",
			"server": {
				"id": "brain-mcp",
				"title": "@three-ws/brain-mcp",
				"endpoint": "npx -y @three-ws/brain-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/brain-mcp/src/tools/list-providers.js"
		},
		{
			"name": "enlist_faction",
			"title": "Enlist in a Coin Clash faction",
			"description": "Enlist the signer's wallet as a soldier in a Coin Clash faction and return a war pass. Requires the wallet to hold the faction coin: the tool requests a challenge, signs it with the wallet's Solana key (from the `secret` arg, or SOLANA_SECRET_KEY env), and the backend verifies the signature then checks a live on-chain holding. Returns `{ eligible, wallet, faction, amount, usd, warPass }`. If `eligible` is false the wallet does not currently hold the coin (`reason: \"not_a_holder\"`) and `warPass` is null — buy/hold the coin and retry. Keep the `warPass`: pass it to rally_faction to spend taps as battle power. No funds move; the pass expires after ~30 minutes.",
			"server": {
				"id": "clash-mcp",
				"title": "@three-ws/clash-mcp",
				"endpoint": "npx -y @three-ws/clash-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"token": {
						"type": "string",
						"minLength": 1,
						"description": "The faction coin mint to enlist for — must be a faction in get_clash_state."
					},
					"secret": {
						"type": "string",
						"description": "Base58 Solana secret of the enlisting wallet. Falls back to SOLANA_SECRET_KEY env. The wallet must hold the faction coin."
					}
				},
				"required": [
					"token"
				],
				"additionalProperties": false
			},
			"source": "packages/clash-mcp/src/tools/enlist-faction.js"
		},
		{
			"name": "get_clash_leaderboard",
			"title": "Coin Clash leaderboard",
			"description": "Rank Coin Clash factions by their all-time war record. Returns `board`: factions sorted by wins then power, each with `token`, `symbol`, `image`, `members`, `w`/`l`/`d` (win/loss/draw), `battles`, cumulative `power`, and `winRate` (percent of decided battles won, or null if none decided yet). Pass `faction` (a faction mint) to also get `soldiers`: that faction's top rally contributors this round (wallet + power). Live data — records update as rounds settle. Use this to find the strongest armies and the heaviest hitters.",
			"server": {
				"id": "clash-mcp",
				"title": "@three-ws/clash-mcp",
				"endpoint": "npx -y @three-ws/clash-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"faction": {
						"type": "string",
						"minLength": 1,
						"description": "Optional faction mint to also return that faction's top soldiers this round."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/clash-mcp/src/tools/get-clash-leaderboard.js"
		},
		{
			"name": "get_clash_state",
			"title": "Coin Clash battle board",
			"description": "Read the live Coin Clash board for the current round. Coin Clash is three.ws community faction warfare: every CoinCommunities community is a faction, its holders are its army, and two factions are matched each round — whichever army rallies more power before the clock runs out wins. Returns `epoch` (round index), `endsAt`/`msLeft`/`epochMs` (the clock), and `arena`: an array of battles, each with sides `a` and `b` (token, symbol, image, members, posts, priceUsd, live `momentum` multiplier, accumulated `power`, all-time `record`), `aShare` (side a's share of the round's combined power for a tug-of-war bar), and `leader` (the winning side's token, or null if tied). `bye` is the unmatched faction this round (odd roster), `factionCount` the active army count. Live data — power and standings move between calls. Use this to see who's fighting and who's winning before enlisting or rallying.",
			"server": {
				"id": "clash-mcp",
				"title": "@three-ws/clash-mcp",
				"endpoint": "npx -y @three-ws/clash-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/clash-mcp/src/tools/get-clash-state.js"
		},
		{
			"name": "rally_faction",
			"title": "Rally power for a Coin Clash faction",
			"description": "Rally for a Coin Clash faction by spending taps as battle power for the current round. Authorize with either a `pass` (war pass from enlist_faction) or a `token` (+ optional `secret`) to auto-enlist first. `taps` (1–50 per call) convert to power, multiplied by the faction's live momentum and capped per wallet per round. Returns `{ epoch, mint, added, momentum, walletPower, walletCap, capped, factionPower, msLeft }` — `added` is the power this call contributed, `factionPower` the army's new round total, `capped` true once the wallet hits `walletCap`. Each call adds power (not idempotent); call repeatedly to keep rallying while the round clock (`msLeft`) runs.",
			"server": {
				"id": "clash-mcp",
				"title": "@three-ws/clash-mcp",
				"endpoint": "npx -y @three-ws/clash-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"taps": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"description": "Taps to spend this call (1–50). Each tap is one base power point before momentum."
					},
					"pass": {
						"type": "string",
						"description": "A war pass from enlist_faction. Provide this OR `token` to auto-enlist."
					},
					"token": {
						"type": "string",
						"description": "Faction mint to auto-enlist for when no `pass` is given (uses `secret`/SOLANA_SECRET_KEY)."
					},
					"secret": {
						"type": "string",
						"description": "Base58 Solana secret, used only when auto-enlisting from `token`. Falls back to SOLANA_SECRET_KEY env."
					}
				},
				"required": [
					"taps"
				],
				"additionalProperties": false
			},
			"source": "packages/clash-mcp/src/tools/rally-faction.js"
		},
		{
			"name": "concierge_ask",
			"title": "Ask a website's AI concierge a question",
			"description": "Ask an AI concierge a question and get a grounded answer. Provide a \"url\" and it fetches that page and answers using its real content (title, headings, navigation, main text), the way to ask any website a question. Or skip the url and pass \"knowledge\"/\"content\" to answer grounded in text you already have. The model is instructed not to invent facts it cannot see. Runs on the free three.ws lane; no key required.",
			"server": {
				"id": "concierge-mcp",
				"title": "@three-ws/concierge-mcp",
				"endpoint": "npx -y @three-ws/concierge-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"question": {
						"type": "string",
						"minLength": 1,
						"maxLength": 2000,
						"description": "The question to ask, in natural language."
					},
					"url": {
						"type": "string",
						"format": "uri",
						"description": "A web page to ground the answer in. It is fetched and its readable text is harvested."
					},
					"siteName": {
						"type": "string",
						"maxLength": 120,
						"description": "Display name of the site/product (used in the answer's framing). Inferred from the page when omitted."
					},
					"knowledge": {
						"type": "string",
						"maxLength": 8000,
						"description": "Curated authoritative facts (FAQ, pricing, policies) to ground the answer in. Leads over harvested page text."
					},
					"content": {
						"type": "string",
						"maxLength": 6000,
						"description": "Raw page/document text to ground the answer in when you are not passing a url."
					},
					"persona": {
						"type": "string",
						"maxLength": 200,
						"description": "Optional tone instruction for the reply, e.g. \"concise and technical\"."
					},
					"lang": {
						"type": "string",
						"maxLength": 20,
						"description": "BCP-47 language hint for the reply, e.g. \"en\", \"es\"."
					}
				},
				"required": [
					"question"
				],
				"additionalProperties": false
			},
			"source": "packages/concierge-mcp/src/tools/ask.js"
		},
		{
			"name": "concierge_avatars",
			"title": "List available Concierge avatars",
			"description": "List the rigged 3D avatars a three.ws Concierge widget can wear (id, name, personality tagline, style). Use the id with concierge_embed's \"avatar\" option, or omit it to let each visitor pick their own. Offline.",
			"server": {
				"id": "concierge-mcp",
				"title": "@three-ws/concierge-mcp",
				"endpoint": "npx -y @three-ws/concierge-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {},
				"additionalProperties": false
			},
			"source": "packages/concierge-mcp/src/tools/avatars.js"
		},
		{
			"name": "concierge_embed",
			"title": "Generate a Concierge embed snippet for a website",
			"description": "Generate ready-to-paste embed code for adding a three.ws Concierge (an AI chat widget with a talking 3D avatar) to a website. Returns the one-tag <script> install by default, or the <three-concierge> web component / npm snippet / all of them. Configure the accent color, avatar, greeting, curated knowledge, suggested prompts, position and theme. Offline: this only composes the code, it installs nothing.",
			"server": {
				"id": "concierge-mcp",
				"title": "@three-ws/concierge-mcp",
				"endpoint": "npx -y @three-ws/concierge-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"siteName": {
						"type": "string",
						"maxLength": 120,
						"description": "Name of the site/product, used in the greeting + grounding."
					},
					"flavor": {
						"type": "string",
						"enum": [
							"script",
							"web-component",
							"npm",
							"imperative",
							"all"
						],
						"default": "all",
						"description": "Which snippet(s) to return. \"script\" is the one-tag CDN install; \"all\" returns every flavor."
					},
					"accent": {
						"type": "string",
						"maxLength": 32,
						"description": "CSS color that restyles the whole widget, e.g. \"#f97316\"."
					},
					"avatar": {
						"type": "string",
						"description": "Initial avatar id: ${…}. Omit to let the visitor pick."
					},
					"customAvatar": {
						"type": "string",
						"format": "uri",
						"description": "URL of your own rigged GLB avatar (replaces the catalog)."
					},
					"position": {
						"type": "string",
						"enum": [
							"bottom-right",
							"bottom-left"
						],
						"description": "Corner the launcher docks to."
					},
					"theme": {
						"type": "string",
						"enum": [
							"auto",
							"dark",
							"light"
						],
						"description": "Color theme. \"auto\" follows the visitor's system/site."
					},
					"greeting": {
						"type": "string",
						"maxLength": 200,
						"description": "First line shown in the empty state and teaser bubble."
					},
					"persona": {
						"type": "string",
						"maxLength": 200,
						"description": "One-line tone instruction, e.g. \"warm, playful, concise\"."
					},
					"knowledge": {
						"type": "string",
						"maxLength": 8000,
						"description": "Curated facts (FAQ, pricing, policies) the answers are grounded in."
					},
					"suggestions": {
						"type": "array",
						"items": {
							"type": "string",
							"maxLength": 80
						},
						"maxItems": 4,
						"description": "Up to 4 suggested prompt chips."
					},
					"endpoint": {
						"type": "string",
						"format": "uri",
						"description": "Custom answer endpoint. Omit to use the free hosted three.ws lane."
					},
					"muted": {
						"type": "boolean",
						"description": "Start with voice output off."
					},
					"open": {
						"type": "boolean",
						"description": "Start with the panel open."
					},
					"noPicker": {
						"type": "boolean",
						"description": "Hide the avatar picker."
					},
					"noTeaser": {
						"type": "boolean",
						"description": "Never show the proactive teaser bubble."
					},
					"lang": {
						"type": "string",
						"maxLength": 20,
						"description": "BCP-47 language hint for voice and replies."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/concierge-mcp/src/tools/embed.js"
		},
		{
			"name": "cancel_subscription",
			"title": "Stop a copy-trade subscription",
			"description": "Stop following a leader: transitions the subscription to \"stopped\" so no new copy intents are generated. DESTRUCTIVE in that it ends an active money-adjacent follow — but it is a SOFT stop: execution history and earnings are preserved, and you can re-follow the same leader later with create_subscription. To merely halt copies temporarily without ending the follow, use update_subscription with status:\"paused\" instead. Returns the cancellation result. Requires THREE_WS_API_KEY.",
			"server": {
				"id": "copy-mcp",
				"title": "@three-ws/copy-mcp",
				"endpoint": "npx -y @three-ws/copy-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"description": "UUID of the subscription to stop (from list_subscriptions)."
					}
				},
				"required": [
					"id"
				],
				"additionalProperties": false
			},
			"source": "packages/copy-mcp/src/tools/cancel-subscription.js"
		},
		{
			"name": "create_subscription",
			"title": "Follow a leader (create / update subscription)",
			"description": "Follow a copy-trade leader from the authenticated account, defining how their trades are mirrored into your own wallet. MONEY-ADJACENT: this sets how much of YOUR SOL each copy may spend. Non-custodial — three.ws never signs or holds funds; it emits sized, guard-checked copy INTENTS you act on. Idempotent: re-calling with the same leader_agent_id + network updates that subscription (and re-activates it) rather than creating a duplicate. Sizing rule: \"fixed\" spends fixed_sol per copy; \"multiplier\" spends multiplier × the leader's entry; \"pct_balance\" spends pct_balance % of your spendable SOL. Every order is clamped to per_trade_cap_sol and the remaining daily_budget_sol. Returns the created/updated subscription. Requires THREE_WS_API_KEY.",
			"server": {
				"id": "copy-mcp",
				"title": "@three-ws/copy-mcp",
				"endpoint": "npx -y @three-ws/copy-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"leader_agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "UUID of the public leader (agent with a sniper track record) to follow."
					},
					"copier_wallet": {
						"type": "string",
						"pattern": "^[1-9A-HJ-NP-Za-km-z]{32,44}$",
						"description": "Your own Solana wallet address that will execute the mirrored trades. Never a private key — non-custodial."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana network (default mainnet)."
					},
					"sizing_rule": {
						"type": "string",
						"enum": [
							"fixed",
							"multiplier",
							"pct_balance"
						],
						"default": "fixed",
						"description": "How each copy is sized: fixed | multiplier (× leader entry) | pct_balance (% of your SOL). Default fixed."
					},
					"fixed_sol": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "SOL spent per copy when sizing_rule=\"fixed\". Required for fixed sizing."
					},
					"multiplier": {
						"type": "number",
						"exclusiveMinimum": 0,
						"default": 0.1,
						"description": "Fraction of the leader's entry size to copy when sizing_rule=\"multiplier\" (default 0.1)."
					},
					"pct_balance": {
						"type": "number",
						"exclusiveMinimum": 0,
						"maximum": 100,
						"description": "Percent of your spendable SOL per copy when sizing_rule=\"pct_balance\" (0–100)."
					},
					"per_trade_cap_sol": {
						"type": "number",
						"exclusiveMinimum": 0,
						"default": 0.5,
						"description": "Hard ceiling on any single copy, in SOL (default 0.5). Must be > 0."
					},
					"min_order_sol": {
						"type": "number",
						"minimum": 0,
						"default": 0.02,
						"description": "Skip dust copies sized below this, in SOL (default 0.02). Cannot exceed per_trade_cap_sol."
					},
					"daily_budget_sol": {
						"type": "number",
						"exclusiveMinimum": 0,
						"default": 1,
						"description": "Max SOL fanned out across copies per UTC day (default 1). Must be > 0."
					},
					"max_open_copies": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"default": 5,
						"description": "Cap on concurrent pending copy intents (1–100, default 5)."
					},
					"mcap_floor_usd": {
						"type": [
							"number",
							"null"
						],
						"minimum": 0,
						"description": "Skip coins below this market cap (USD). Omit/null to ignore."
					},
					"mcap_ceiling_usd": {
						"type": [
							"number",
							"null"
						],
						"minimum": 0,
						"description": "Skip coins above this market cap (USD). Omit/null to ignore."
					},
					"copy_sells": {
						"type": "boolean",
						"default": true,
						"description": "Mirror the leader's exits, not just entries (default true)."
					},
					"require_safety_pass": {
						"type": "boolean",
						"default": false,
						"description": "Skip a copy when the coin's safety context cannot be confirmed (default false)."
					},
					"min_oracle_score": {
						"type": [
							"integer",
							"null"
						],
						"minimum": 0,
						"maximum": 100,
						"description": "Skip coins whose Oracle conviction score is below this (0–100). Omit/null to ignore."
					},
					"perf_fee_bps": {
						"type": "integer",
						"minimum": 0,
						"maximum": 3000,
						"default": 1000,
						"description": "Leader's performance fee on your realized copy profit, in basis points (0–3000, default 1000 = 10%). Charged above a high-water mark, settled in $THREE."
					},
					"telegram_chat_id": {
						"type": [
							"string",
							"null"
						],
						"pattern": "^-?[0-9]+$",
						"description": "Optional Telegram chat ID to receive copy-intent alerts for this subscription."
					}
				},
				"required": [
					"leader_agent_id",
					"copier_wallet"
				],
				"additionalProperties": false
			},
			"source": "packages/copy-mcp/src/tools/create-subscription.js"
		},
		{
			"name": "get_earnings",
			"title": "Copy-trade earnings & fees owed",
			"description": "Read copy-trade performance-fee accounting. Without agent_id: the authenticated account's own fees OWED across every leader they copy — a total plus a per-subscription breakdown (cumulative realized copy profit, closed copies, billable profit above the high-water mark, and the fee). With agent_id: a leader's PUBLIC aggregate earnings (active copiers, accrued fee, total copier profit) — the social-proof figure, no per-copier identity exposed and no API key required. All figures are real: realized copy profit above each subscription's high-water mark at the leader's fee, settled in $THREE. Read-only.",
			"server": {
				"id": "copy-mcp",
				"title": "@three-ws/copy-mcp",
				"endpoint": "npx -y @three-ws/copy-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "Optional leader agent UUID. Provide it for that leader's public aggregate earnings; omit it for your own fees-owed rollup (requires THREE_WS_API_KEY)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana network for the leader aggregate (default mainnet). Ignored for your own rollup."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/copy-mcp/src/tools/get-earnings.js"
		},
		{
			"name": "get_executions",
			"title": "List copy executions (intent inbox)",
			"description": "List the authenticated account's copy executions — the sized, guard-checked copy INTENTS generated when a followed leader trades. Each row carries the coin (mint/symbol/name), the mirrored direction (buy/sell), the planned SOL size, the leader, the safety/quote snapshot used for the decision, the lifecycle status, and any fill signature you recorded. Filter by status: \"pending\" (actionable now — default), \"acted\", \"dismissed\", \"skipped\" (guard blocked it, with skip_reason), \"expired\", or \"all\". Reading refreshes the inbox: stale pending intents are expired automatically. Use record_execution to mark a pending intent acted/dismissed. Read-only; requires THREE_WS_API_KEY.",
			"server": {
				"id": "copy-mcp",
				"title": "@three-ws/copy-mcp",
				"endpoint": "npx -y @three-ws/copy-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"status": {
						"type": "string",
						"enum": [
							"pending",
							"acted",
							"dismissed",
							"skipped",
							"expired",
							"all"
						],
						"default": "pending",
						"description": "Lifecycle filter (default \"pending\" — only intents still actionable)."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"default": 50,
						"description": "Max rows to return, newest first (1–100, default 50)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/copy-mcp/src/tools/get-executions.js"
		},
		{
			"name": "list_subscriptions",
			"title": "List my copy-trade subscriptions",
			"description": "List the copy-trade subscriptions belonging to the authenticated account — every leader (a trader with a track record) you follow, with their identity, the subscription status (active / paused / stopped), the sizing rule and full guard-rule set, the performance fee, the high-water mark, and live pending/acted copy-intent counts. Use this to audit who you copy and how aggressively before tuning a follow with update_subscription. Returns the subscriptions newest-first. Read-only; requires THREE_WS_API_KEY.",
			"server": {
				"id": "copy-mcp",
				"title": "@three-ws/copy-mcp",
				"endpoint": "npx -y @three-ws/copy-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/copy-mcp/src/tools/list-subscriptions.js"
		},
		{
			"name": "record_execution",
			"title": "Record acting on a copy intent",
			"description": "Resolve a PENDING copy intent (from get_executions) by recording how you handled it. action:\"acted\" records that you executed the mirrored trade from your own wallet — optionally with the on-chain tx_signature for your records; action:\"dismissed\" discards the intent without trading. NON-CUSTODIAL: this never signs, sends, or broadcasts a transaction — it only updates the intent's status after YOU traded. Not idempotent: it transitions pending → acted/dismissed once; an intent that already expired or was actioned returns \"not_actionable\". Returns the updated execution. Requires THREE_WS_API_KEY.",
			"server": {
				"id": "copy-mcp",
				"title": "@three-ws/copy-mcp",
				"endpoint": "npx -y @three-ws/copy-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"description": "UUID of the pending copy intent (from get_executions with status:\"pending\")."
					},
					"action": {
						"type": "string",
						"enum": [
							"acted",
							"dismissed"
						],
						"description": "\"acted\" = you executed the trade yourself; \"dismissed\" = you skipped it."
					},
					"tx_signature": {
						"type": "string",
						"minLength": 1,
						"maxLength": 128,
						"description": "Optional Solana transaction signature of your fill, recorded only when action=\"acted\"."
					}
				},
				"required": [
					"id",
					"action"
				],
				"additionalProperties": false
			},
			"source": "packages/copy-mcp/src/tools/record-execution.js"
		},
		{
			"name": "update_subscription",
			"title": "Update a copy-trade subscription",
			"description": "Re-tune an existing copy-trade subscription by id. Pause it (stop new copies, keep the follow), resume it, stop it, and/or change its sizing rule and guard rules (caps, daily budget, market-cap band, oracle/safety gates, performance fee). MONEY-ADJACENT: guard changes alter how much of your SOL future copies may spend — non-custodial, intents only. Only the fields you pass change; the rest are preserved. Editing guards on a paused subscription keeps it paused unless you also set status:\"active\". Idempotent. Returns the updated subscription. Requires THREE_WS_API_KEY.",
			"server": {
				"id": "copy-mcp",
				"title": "@three-ws/copy-mcp",
				"endpoint": "npx -y @three-ws/copy-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"description": "UUID of the subscription to update (from list_subscriptions)."
					},
					"status": {
						"type": "string",
						"enum": [
							"active",
							"paused",
							"stopped"
						],
						"description": "Set the lifecycle status: active (resume), paused (halt new copies, keep the follow), or stopped (end it, keeps history)."
					},
					"copier_wallet": {
						"type": "string",
						"pattern": "^[1-9A-HJ-NP-Za-km-z]{32,44}$",
						"description": "Change the Solana wallet that executes mirrored trades."
					},
					"sizing_rule": {
						"type": "string",
						"enum": [
							"fixed",
							"multiplier",
							"pct_balance"
						],
						"description": "Change the sizing rule: fixed | multiplier | pct_balance."
					},
					"fixed_sol": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "SOL per copy when sizing_rule=\"fixed\"."
					},
					"multiplier": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Multiple of the leader's entry when sizing_rule=\"multiplier\"."
					},
					"pct_balance": {
						"type": "number",
						"exclusiveMinimum": 0,
						"maximum": 100,
						"description": "Percent of your SOL per copy when sizing_rule=\"pct_balance\" (0–100)."
					},
					"per_trade_cap_sol": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Hard ceiling on any single copy, in SOL (> 0)."
					},
					"min_order_sol": {
						"type": "number",
						"minimum": 0,
						"description": "Skip dust copies below this, in SOL. Cannot exceed per_trade_cap_sol."
					},
					"daily_budget_sol": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Max SOL fanned out per UTC day (> 0)."
					},
					"max_open_copies": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "Cap on concurrent pending copy intents (1–100)."
					},
					"mcap_floor_usd": {
						"type": [
							"number",
							"null"
						],
						"minimum": 0,
						"description": "Skip coins below this market cap (USD). Pass null to clear the floor."
					},
					"mcap_ceiling_usd": {
						"type": [
							"number",
							"null"
						],
						"minimum": 0,
						"description": "Skip coins above this market cap (USD). Pass null to clear the ceiling."
					},
					"copy_sells": {
						"type": "boolean",
						"description": "Whether to mirror the leader's exits as well as entries."
					},
					"require_safety_pass": {
						"type": "boolean",
						"description": "Skip a copy when the coin's safety cannot be confirmed."
					},
					"min_oracle_score": {
						"type": [
							"integer",
							"null"
						],
						"minimum": 0,
						"maximum": 100,
						"description": "Skip coins below this Oracle conviction score (0–100). Pass null to clear the gate."
					},
					"perf_fee_bps": {
						"type": "integer",
						"minimum": 0,
						"maximum": 3000,
						"description": "Leader's performance fee in basis points (0–3000)."
					},
					"telegram_chat_id": {
						"type": [
							"string",
							"null"
						],
						"pattern": "^-?[0-9]+$",
						"description": "Telegram chat ID for copy-intent alerts. Pass null to clear."
					}
				},
				"required": [
					"id"
				],
				"additionalProperties": false
			},
			"source": "packages/copy-mcp/src/tools/update-subscription.js"
		},
		{
			"name": "ibm_granite_analyze",
			"title": "IBM Granite Analyze ($0.04)",
			"description": "Structured document analysis powered by IBM Granite: extract entities, sentiment, risk signals, a concise summary, and recommended next steps from any text (contracts, reports, emails, code reviews, etc.). Returns a machine-readable JSON analysis. No IBM Cloud account required — pay $0.04 USDC per call via x402.",
			"server": {
				"id": "ibm-x402-mcp-remote",
				"title": "IBM Granite",
				"endpoint": "/api/ibm-mcp",
				"transport": "remote",
				"auth": "x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.04,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"document": {
						"type": "string",
						"minLength": 1,
						"maxLength": 24000,
						"description": "The document, report, email, or text to analyze."
					},
					"analysis_type": {
						"type": "string",
						"enum": [
							"general",
							"contract",
							"financial",
							"technical",
							"medical",
							"sentiment"
						],
						"default": "general",
						"description": "Analysis focus: general (universal), contract (legal terms, obligations), financial (metrics, risks, forecasts), technical (architecture, issues), medical (clinical entities, findings), or sentiment (tone, emotions)."
					},
					"language": {
						"type": "string",
						"description": "Document language hint (e.g. \"Spanish\", \"French\"). Defaults to auto-detect."
					}
				},
				"required": [
					"document"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpibm/tools.js"
		},
		{
			"name": "ibm_granite_chat",
			"title": "IBM Granite Chat ($0.02)",
			"description": "Chat completion powered by IBM Granite foundation models (default: ibm/granite-3-8b-instruct). Send a conversation as role/content message pairs and receive the assistant reply with token usage. No IBM Cloud account required — pay $0.02 USDC per call via x402.",
			"server": {
				"id": "ibm-x402-mcp-remote",
				"title": "IBM Granite",
				"endpoint": "/api/ibm-mcp",
				"transport": "remote",
				"auth": "x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.02,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"messages": {
						"type": "array",
						"minItems": 1,
						"maxItems": 50,
						"description": "Conversation history. Must include at least one user message.",
						"items": {
							"type": "object",
							"properties": {
								"role": {
									"type": "string",
									"enum": [
										"system",
										"user",
										"assistant"
									],
									"description": "Message role."
								},
								"content": {
									"type": "string",
									"minLength": 1,
									"maxLength": 32000,
									"description": "Message text."
								}
							},
							"required": [
								"role",
								"content"
							],
							"additionalProperties": false
						}
					},
					"model": {
						"type": "string",
						"description": "Override the Granite model id (e.g. ibm/granite-3-2b-instruct). Defaults to ibm/granite-3-8b-instruct."
					},
					"max_new_tokens": {
						"type": "integer",
						"minimum": 1,
						"maximum": 4096,
						"description": "Maximum tokens to generate. Defaults to 1024."
					},
					"temperature": {
						"type": "number",
						"minimum": 0,
						"maximum": 2,
						"description": "Sampling temperature (0 = deterministic). Defaults to 0.7."
					}
				},
				"required": [
					"messages"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpibm/tools.js"
		},
		{
			"name": "ibm_granite_code",
			"title": "IBM Granite Code ($0.025)",
			"description": "Code generation, review, refactoring, and explanation via IBM Granite instruct models. Provide a task type and code/prompt; receive the generated or reviewed code with explanation. No IBM Cloud account required — pay $0.025 USDC per call via x402.",
			"server": {
				"id": "ibm-x402-mcp-remote",
				"title": "IBM Granite",
				"endpoint": "/api/ibm-mcp",
				"transport": "remote",
				"auth": "x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.025,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"task": {
						"type": "string",
						"enum": [
							"generate",
							"review",
							"refactor",
							"explain",
							"test",
							"document"
						],
						"description": "Code task: generate (new code from description), review (bugs/security), refactor (quality), explain (plain language), test (unit tests), or document (add docstrings)."
					},
					"prompt": {
						"type": "string",
						"minLength": 1,
						"maxLength": 16000,
						"description": "For \"generate\": describe what to build. For all others: paste the code to process."
					},
					"language": {
						"type": "string",
						"description": "Target programming language (e.g. \"TypeScript\", \"Python\", \"Rust\"). Optional for explain/review."
					},
					"context": {
						"type": "string",
						"maxLength": 4000,
						"description": "Additional context: architecture notes, constraints, or example usage."
					}
				},
				"required": [
					"task",
					"prompt"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpibm/tools.js"
		},
		{
			"name": "ibm_granite_embed",
			"title": "IBM Granite Embed ($0.005)",
			"description": "Generate embedding vectors for one or more texts using IBM Granite (default: ibm/granite-embedding-278m-multilingual). Returns one float array per input, suitable for semantic search, RAG retrieval, and similarity scoring. Up to 64 texts per call. No IBM Cloud account required — pay $0.005 USDC per call via x402.",
			"server": {
				"id": "ibm-x402-mcp-remote",
				"title": "IBM Granite",
				"endpoint": "/api/ibm-mcp",
				"transport": "remote",
				"auth": "x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.005,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"inputs": {
						"type": "array",
						"minItems": 1,
						"maxItems": 64,
						"items": {
							"type": "string",
							"minLength": 1,
							"maxLength": 8000
						},
						"description": "Texts to embed. 1–64 strings per call, up to 8,000 characters each."
					},
					"model": {
						"type": "string",
						"description": "Override the embedding model id (e.g. ibm/granite-embedding-125m-english). Defaults to ibm/granite-embedding-278m-multilingual."
					}
				},
				"required": [
					"inputs"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpibm/tools.js"
		},
		{
			"name": "ibm_granite_forecast",
			"title": "IBM Granite Forecast ($0.05)",
			"description": "Zero-shot time-series forecasting via IBM Granite TTM (Tiny Time Mixer). Provide a numeric series with ISO-8601 timestamps and a cadence, receive the forecast horizon. No training required. Suitable for revenue, traffic, sensor, energy, and financial series. No IBM Cloud account required — pay $0.05 USDC per call via x402.",
			"server": {
				"id": "ibm-x402-mcp-remote",
				"title": "IBM Granite",
				"endpoint": "/api/ibm-mcp",
				"transport": "remote",
				"auth": "x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.05,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"timestamps": {
						"type": "array",
						"minItems": 64,
						"maxItems": 1024,
						"items": {
							"type": "string",
							"minLength": 1
						},
						"description": "ISO-8601 timestamps at a uniform cadence, oldest to newest (e.g. [\"2025-01-01T00:00:00Z\", ...])."
					},
					"values": {
						"type": "array",
						"minItems": 64,
						"maxItems": 1024,
						"items": {
							"type": "number"
						},
						"description": "Numeric series aligned to timestamps, oldest to newest. Must be the same length as timestamps."
					},
					"freq": {
						"type": "string",
						"minLength": 1,
						"description": "Cadence of the series as a pandas-style frequency string. Examples: ${…}."
					},
					"prediction_length": {
						"type": "integer",
						"minimum": 1,
						"maximum": 96,
						"description": "Number of steps to forecast ahead. Defaults to the model horizon (typically 96 for 1h data)."
					},
					"label": {
						"type": "string",
						"maxLength": 64,
						"description": "Human label for the series (e.g. \"daily_revenue_usd\"). Returned in output for traceability."
					}
				},
				"required": [
					"timestamps",
					"values",
					"freq"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpibm/tools.js"
		},
		{
			"name": "ibm_granite_getting_started",
			"title": "Getting Started (free)",
			"description": "FREE — start here. Returns an overview of this server: the IBM Granite tools available, their per-call USDC prices, how the x402 pay-per-call flow works, and runnable example calls. No payment or account required. Call this first to orient before invoking a paid tool.",
			"server": {
				"id": "ibm-x402-mcp-remote",
				"title": "IBM Granite",
				"endpoint": "/api/ibm-mcp",
				"transport": "remote",
				"auth": "x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"section": {
						"type": "string",
						"enum": [
							"overview",
							"pricing",
							"payment",
							"tools",
							"links"
						],
						"default": "overview",
						"description": "Which part to return. Defaults to \"overview\" (everything). Use \"pricing\", \"payment\", \"tools\", or \"links\" to focus."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcpibm/tools.js"
		},
		{
			"name": "copy_smart_wallets",
			"title": "Copy-trade smart wallet directory",
			"description": "Browse the curated Smart Money directory for copy-trading: deduplicated wallets ranked by 30-day performance. Filter by chain (sol/bsc) and category (smart_money, launchpad, kol, sniper), search by address/name/twitter, and sort by profit, pnl, winrate, followers, or score. Returns the ranked page (wallet identity + 30-day performance, never token mints), the total, pagination flags, and category/chain facets. Read-only live data.",
			"server": {
				"id": "intel-mcp",
				"title": "@three-ws/intel-mcp",
				"endpoint": "npx -y @three-ws/intel-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"chain": {
						"type": "string",
						"enum": [
							"sol",
							"bsc"
						],
						"description": "Filter by chain. Omit for all chains."
					},
					"category": {
						"type": "string",
						"enum": [
							"smart_money",
							"launchpad",
							"kol",
							"sniper"
						],
						"description": "Filter by gmgn smart-money category. Omit for all categories."
					},
					"sort": {
						"type": "string",
						"enum": [
							"profit",
							"pnl",
							"winrate",
							"followers",
							"score"
						],
						"default": "score",
						"description": "Ranking key (default score)."
					},
					"q": {
						"type": "string",
						"description": "Free-text match against wallet address, name, or twitter handle."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "Page size (1–100, default 30)."
					},
					"offset": {
						"type": "integer",
						"minimum": 0,
						"description": "Page offset (default 0)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/intel-mcp/src/tools/copy-smart-wallets.js"
		},
		{
			"name": "kol_leaderboard",
			"title": "KOL trader leaderboard",
			"description": "Rank the tracked key-opinion-leader (KOL) traders by realized performance over a recent window. Returns the leaderboard rows — each tracked wallet with its P&L, win rate, and trade activity for the chosen window. Read-only live data.",
			"server": {
				"id": "intel-mcp",
				"title": "@three-ws/intel-mcp",
				"endpoint": "npx -y @three-ws/intel-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"window": {
						"type": "string",
						"enum": [
							"7d",
							"30d"
						],
						"default": "7d",
						"description": "Performance window to rank over (default 7d)."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "How many ranked traders to return (1–100, default 25)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/intel-mcp/src/tools/kol-leaderboard.js"
		},
		{
			"name": "kol_trades",
			"title": "Recent KOL trades on a mint",
			"description": "See which tracked KOL wallets have recently traded a specific mint. Returns the recent trades (buys/sells with size and timing) observed across the tracked KOL set, plus the size of that tracked set. Read-only live data.",
			"server": {
				"id": "intel-mcp",
				"title": "@three-ws/intel-mcp",
				"endpoint": "npx -y @three-ws/intel-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string",
						"minLength": 1,
						"description": "The token mint address to scan KOL activity for."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "How many recent trades to return (1–100, default 20)."
					}
				},
				"required": [
					"mint"
				],
				"additionalProperties": false
			},
			"source": "packages/intel-mcp/src/tools/kol-trades.js"
		},
		{
			"name": "signal_feed",
			"title": "Signal feed track record + recent signals",
			"description": "Read one signal feed's public detail: the publisher's verified track record, the feed's proven accuracy (hit-rate, average realized ROI, follower ROI, emit→fill latency), pricing, and the recent emission log — every signal with its realized outcome and the on-chain tx that proves it. Read-only live data.",
			"server": {
				"id": "intel-mcp",
				"title": "@three-ws/intel-mcp",
				"endpoint": "npx -y @three-ws/intel-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"slug": {
						"type": "string",
						"minLength": 1,
						"description": "The feed slug (its public identifier on three.ws)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana network the feed publishes on (default mainnet)."
					}
				},
				"required": [
					"slug"
				],
				"additionalProperties": false
			},
			"source": "packages/intel-mcp/src/tools/signal-feed.js"
		},
		{
			"name": "smart_money_coin",
			"title": "Smart-money score for a coin",
			"description": "Assess a coin by WHO is net-buying it right now. Returns a 0–100 smart_money_score computed from real observed buys joined to real outcomes, the reputable buyers in the book (with realized score, win rate, and labels), the funder clusters behind them, and a sybil_flag when one cluster dominates the order book. `computed:false` means the graph has no on-chain history for this mint yet. Read-only live data.",
			"server": {
				"id": "intel-mcp",
				"title": "@three-ws/intel-mcp",
				"endpoint": "npx -y @three-ws/intel-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string",
						"minLength": 1,
						"description": "The token mint address to assess (any runtime mint)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana network the mint lives on (default mainnet)."
					}
				},
				"required": [
					"mint"
				],
				"additionalProperties": false
			},
			"source": "packages/intel-mcp/src/tools/smart-money-coin.js"
		},
		{
			"name": "wallet_intel",
			"title": "Wallet reputation + smart-money card",
			"description": "Pull one wallet's realized reputation, computed from its observed buys joined to real outcomes (graduated / pumped / rugged + ATH). Returns the realized_score (0–100), win_rate, behavioral labels, and the funder cluster it belongs to (with funder root, size, and confidence). `computed:false` means the graph has no scored history for this wallet yet. Read-only live data.",
			"server": {
				"id": "intel-mcp",
				"title": "@three-ws/intel-mcp",
				"endpoint": "npx -y @three-ws/intel-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"wallet": {
						"type": "string",
						"minLength": 1,
						"description": "The wallet address to look up."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana network the wallet trades on (default mainnet)."
					}
				},
				"required": [
					"wallet"
				],
				"additionalProperties": false
			},
			"source": "packages/intel-mcp/src/tools/wallet-intel.js"
		},
		{
			"name": "get_wallet_portfolio",
			"title": "KOL wallet portfolio + P&L",
			"description": "Pull one KOL trader's live portfolio P&L card from the three.ws Birdeye proxy. Returns realized P&L, unrealized P&L (current open-position value), win rate, total trades, and the single highest-value token the wallet holds (symbol + USD value). Use this to size up a specific smart trader before copying or analyzing them. For ranking many traders at once use intel-mcp `kol_leaderboard`; this is the per-wallet deep dive. `has_activity:false` (all-zero P&L, no trades, no holding) means the proxy has no recorded portfolio for that address yet — an honest \"no data\", not a failure. Read-only live data.",
			"server": {
				"id": "kol-mcp",
				"title": "@three-ws/kol-mcp",
				"endpoint": "npx -y @three-ws/kol-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"wallet": {
						"type": "string",
						"minLength": 1,
						"description": "The Solana wallet address of the KOL trader to pull a portfolio P&L card for."
					}
				},
				"required": [
					"wallet"
				],
				"additionalProperties": false
			},
			"source": "packages/kol-mcp/src/tools/get-wallet-portfolio.js"
		},
		{
			"name": "get_wallet_trades",
			"title": "A KOL wallet's trades on a mint",
			"description": "Get one specific KOL trader's recent buys/sells of a given mint. The three.ws trade feed is scanned for that mint across all tracked wallets and narrowed to the wallet you pass, so you see exactly how that trader is positioning in that token — side (buy/sell), SOL size, token amount, per-trade price, USD value, and timestamp, newest first. Use it to inspect a single smart trader's moves before copying. For every tracked wallet's trades on a mint (not just one), use intel-mcp `kol_trades`. Read-only live data.",
			"server": {
				"id": "kol-mcp",
				"title": "@three-ws/kol-mcp",
				"endpoint": "npx -y @three-ws/kol-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"wallet": {
						"type": "string",
						"minLength": 1,
						"description": "The KOL wallet address whose trades to return."
					},
					"mint": {
						"type": "string",
						"minLength": 1,
						"description": "The token mint address to scan that wallet's activity on."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "Max number of this wallet's trades to return (1–100, default 20)."
					}
				},
				"required": [
					"wallet",
					"mint"
				],
				"additionalProperties": false
			},
			"source": "packages/kol-mcp/src/tools/get-wallet-trades.js"
		},
		{
			"name": "get_creation",
			"title": "Fetch one Loom creation by id",
			"description": "Fetch a single Loom creation by its id. Returns the full record — prompt, glbUrl, previewImageUrl, author, tier, backend, createdAt — together with a `viewer_url` (the /forge/embed orbit+AR viewer for the GLB), an `og_image_url`, and a paste-ready `iframe_snippet` so the model can be previewed inline. Returns a not_found error if no creation has that id. Read-only, no key required.",
			"server": {
				"id": "loom-mcp",
				"title": "@three-ws/loom-mcp",
				"endpoint": "npx -y @three-ws/loom-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"minLength": 1,
						"description": "The creation id (a UUID) from the feed or from a prior submit_creation."
					}
				},
				"required": [
					"id"
				],
				"additionalProperties": false
			},
			"source": "packages/loom-mcp/src/tools/get-creation.js"
		},
		{
			"name": "get_loom_feed",
			"title": "Browse the Loom 3D-creation gallery",
			"description": "Browse Loom — the public, world-readable gallery of community-forged 3D creations (a forged GLB plus the prompt that made it and a bit of attribution), returned newest-first. Each creation includes its id, prompt, glbUrl, previewImageUrl, author, tier, backend, createdAt (ms epoch), plus a ready-to-use `viewer_url` (the /forge/embed orbit+AR viewer), `og_image_url`, and a paste-ready `iframe_snippet`. Paginate backwards with `before`: pass the `nextBefore` cursor from the previous page to load older items; a null `nextBefore` means you reached the end. Read-only, no key required.",
			"server": {
				"id": "loom-mcp",
				"title": "@three-ws/loom-mcp",
				"endpoint": "npx -y @three-ws/loom-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 120,
						"description": "How many creations to return (1–120, default 60)."
					},
					"before": {
						"type": "integer",
						"exclusiveMinimum": 0,
						"description": "Pagination cursor (ms epoch): return only creations older than this. Pass the prior page's nextBefore."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/loom-mcp/src/tools/get-loom-feed.js"
		},
		{
			"name": "submit_creation",
			"title": "Submit a creation to the Loom gallery",
			"description": "Contribute a forged 3D creation to Loom, the PUBLIC, world-readable community gallery. ⚠️ Anything you submit becomes visible to everyone on the platform, so only post models you intend to share. Requires `prompt` (the text that forged it, ≤1000 chars) and `glbUrl` (an https URL to the GLB, hosted on an allowed domain: three.ws, r2.dev, cloudflarestorage.com, replicate.delivery, githubusercontent.com). Optional: `author` attribution (free text, ≤40 chars — NOT an authenticated identity; defaults to \"anon\"), `previewImageUrl`, `tier`, and `backend`. No key or account is needed; the endpoint is rate-limited to ~20 submissions per hour per IP. Re-submitting the exact same glbUrl returns the existing creation instead of duplicating it. Returns the stored creation with its id and a ready-to-use viewer_url + iframe_snippet. The only coin this platform references is $THREE — never put any other token in a prompt.",
			"server": {
				"id": "loom-mcp",
				"title": "@three-ws/loom-mcp",
				"endpoint": "npx -y @three-ws/loom-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"minLength": 1,
						"maxLength": 1000,
						"description": "The prompt that forged the model. Required, 1–1000 chars. Shown publicly under the creation."
					},
					"glbUrl": {
						"type": "string",
						"minLength": 1,
						"description": "https URL to the GLB. Must be hosted on an allowed domain: ${…}."
					},
					"author": {
						"type": "string",
						"maxLength": 40,
						"description": "Attribution shown on the creation (free text, ≤40 chars). Not an authenticated identity. Defaults to \"anon\"."
					},
					"previewImageUrl": {
						"type": "string",
						"description": "Optional URL of a preview/thumbnail image for the feed."
					},
					"tier": {
						"type": "string",
						"description": "Optional forge tier/quality label (e.g. the model preset used)."
					},
					"backend": {
						"type": "string",
						"description": "Optional name of the forge backend that produced the GLB."
					}
				},
				"required": [
					"prompt",
					"glbUrl"
				],
				"additionalProperties": false
			},
			"source": "packages/loom-mcp/src/tools/submit-creation.js"
		},
		{
			"name": "agent_categories",
			"title": "List agent marketplace categories",
			"description": "List the agent marketplace categories with the count of published agents in each, plus the overall total. Use the returned category slugs to filter browse_agents. Read-only.",
			"server": {
				"id": "marketplace-mcp",
				"title": "@three-ws/marketplace-mcp",
				"endpoint": "npx -y @three-ws/marketplace-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/marketplace-mcp/src/tools/agent-categories.js"
		},
		{
			"name": "agent_detail",
			"title": "Fetch a marketplace agent by id",
			"description": "Fetch one published marketplace agent by its id, including its full detail: name, description, category, tags, system prompt, greeting, capabilities, author, ratings, skill prices, subscription tiers, and avatar URLs. Read-only.",
			"server": {
				"id": "marketplace-mcp",
				"title": "@three-ws/marketplace-mcp",
				"endpoint": "npx -y @three-ws/marketplace-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"minLength": 1,
						"description": "The marketplace agent id (a UUID from a browse_agents card)."
					}
				},
				"required": [
					"id"
				],
				"additionalProperties": false
			},
			"source": "packages/marketplace-mcp/src/tools/agent-detail.js"
		},
		{
			"name": "browse_agents",
			"title": "Browse the agent marketplace",
			"description": "Search and page the public three.ws agent marketplace. Filter by category and free-text query, choose a sort order, and get back a list of agent cards (id, name, description, category, tags, ratings, view/fork counts, thumbnail and GLB avatar URLs) plus a cursor for the next page. Read-only.",
			"server": {
				"id": "marketplace-mcp",
				"title": "@three-ws/marketplace-mcp",
				"endpoint": "npx -y @three-ws/marketplace-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"category": {
						"type": "string",
						"description": "Restrict to one category slug (e.g. \"programming\", \"marketing\", \"education\")."
					},
					"q": {
						"type": "string",
						"description": "Free-text search across agent name, description, and tags."
					},
					"sort": {
						"type": "string",
						"enum": [
							"recommended",
							"recent",
							"popular",
							"top_rated"
						],
						"default": "recommended",
						"description": "Sort order: \"recommended\" (default), \"recent\", \"popular\", or \"top_rated\"."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 48,
						"description": "How many agents to return (1–48, default 24)."
					},
					"cursor": {
						"type": "string",
						"description": "Opaque pagination cursor from a previous response's next_cursor."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/marketplace-mcp/src/tools/browse-agents.js"
		},
		{
			"name": "browse_skills",
			"title": "Browse the skills catalog",
			"description": "Search and page the public three.ws skills catalog — reusable tools and capabilities agents can install. Filter by free-text query and category, choose a sort order, and get back a list of skills (id, name, slug, description, category, tags, install count, rating, per-call price, author, content preview) plus a cursor for the next page. Read-only.",
			"server": {
				"id": "marketplace-mcp",
				"title": "@three-ws/marketplace-mcp",
				"endpoint": "npx -y @three-ws/marketplace-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"q": {
						"type": "string",
						"description": "Free-text search across skill name, description, and tags."
					},
					"category": {
						"type": "string",
						"description": "Restrict to one category slug (e.g. \"general\")."
					},
					"sort": {
						"type": "string",
						"enum": [
							"popular",
							"new",
							"az"
						],
						"default": "popular",
						"description": "Sort order: \"popular\" (default, by install count), \"new\" (most recent), or \"az\" (A–Z)."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"description": "How many skills to return (1–50, default 20)."
					},
					"cursor": {
						"type": "string",
						"description": "Opaque pagination cursor from a previous response's next_cursor."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/marketplace-mcp/src/tools/browse-skills.js"
		},
		{
			"name": "skill_categories",
			"title": "List skills catalog categories",
			"description": "List the skills catalog categories that have at least one public skill, each with a slug, label, and the count of skills in it. Use the returned slugs to filter browse_skills. Read-only.",
			"server": {
				"id": "marketplace-mcp",
				"title": "@three-ws/marketplace-mcp",
				"endpoint": "npx -y @three-ws/marketplace-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/marketplace-mcp/src/tools/skill-categories.js"
		},
		{
			"name": "sns_resolve",
			"title": "Resolve a .sol name to its owner wallet",
			"description": "Resolve a Solana Name Service (.sol) name to the base58 wallet address that owns it. Accepts a bare label, a subdomain, or the full name with or without the trailing \".sol\". Returns the owner address, or resolved:false when the name is unregistered. Mainnet only. Read-only.",
			"server": {
				"id": "naming-mcp",
				"title": "@three-ws/naming-mcp",
				"endpoint": "npx -y @three-ws/naming-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"name": {
						"type": "string",
						"minLength": 1,
						"description": "A .sol label to resolve, e.g. \"bonfida\", \"nick.threews\", or \"bonfida.sol\" (the .sol suffix is optional)."
					}
				},
				"required": [
					"name"
				],
				"additionalProperties": false
			},
			"source": "packages/naming-mcp/src/tools/sns-resolve.js"
		},
		{
			"name": "sns_reverse",
			"title": "Reverse-lookup a wallet to its primary .sol name",
			"description": "Reverse-lookup a Solana wallet to the primary .sol name it has set as its favorite. Returns the name, or resolved:false when the wallet has no favorite domain (a routine, expected answer — not an error). Mainnet only. Read-only.",
			"server": {
				"id": "naming-mcp",
				"title": "@three-ws/naming-mcp",
				"endpoint": "npx -y @three-ws/naming-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"address": {
						"type": "string",
						"minLength": 1,
						"description": "A base58 Solana public key, e.g. \"HKKp49qGWXd639QsuH7JiLijfVW5UtCVY4s1n2HANwEA\"."
					}
				},
				"required": [
					"address"
				],
				"additionalProperties": false
			},
			"source": "packages/naming-mcp/src/tools/sns-reverse.js"
		},
		{
			"name": "threews_availability",
			"title": "Check if a *.threews.sol agent identity is available",
			"description": "Check whether \"<label>.threews.sol\" is available to claim as a three.ws agent identity. Returns the full domain, availability, the current owner wallet if taken, the on-chain check status (\"ok\" or \"unavailable\" if the Solana RPC was degraded), and the public showcase URL for a claimed handle. Minting the subdomain is an authenticated write on the HTTP API; this tool is the public read. Read-only.",
			"server": {
				"id": "naming-mcp",
				"title": "@three-ws/naming-mcp",
				"endpoint": "npx -y @three-ws/naming-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"label": {
						"type": "string",
						"minLength": 1,
						"description": "The label to check, e.g. \"nick\" for \"nick.threews.sol\" (1–63 chars of [a-z0-9-])."
					}
				},
				"required": [
					"label"
				],
				"additionalProperties": false
			},
			"source": "packages/naming-mcp/src/tools/threews-availability.js"
		},
		{
			"name": "delete_notification",
			"title": "Delete notification",
			"description": "Permanently delete a single notification from the inbox by its `id` (from list_notifications). Unlike mark_read, which only marks it read, this REMOVES the notification for good — the action is irreversible. Only a notification the caller owns can be deleted. Returns `{ ok: true, id, deleted: true }` on success, or a not_found error if the id does not exist for this account (e.g. it was already deleted). Prefer mark_read for normal triage; use this only to discard a notification entirely.",
			"server": {
				"id": "notifications-mcp",
				"title": "@three-ws/notifications-mcp",
				"endpoint": "npx -y @three-ws/notifications-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"description": "UUID of the notification to permanently delete (from list_notifications)."
					}
				},
				"required": [
					"id"
				],
				"additionalProperties": false
			},
			"source": "packages/notifications-mcp/src/tools/delete-notification.js"
		},
		{
			"name": "get_preferences",
			"title": "Get notification preferences",
			"description": "Read the account's notification delivery preferences — the resolved channel matrix the platform uses to decide how each kind of event reaches the owner. Returns `categories` (the catalog of user-facing groups: sales, purchases, social, irl, alerts, account — each with a label and description), `channels` (the deliverable channels: in_app, push, email, telegram), `prefs` (the effective per-category → per-channel on/off matrix with sparse user overrides already merged onto defaults, plus the linked `telegram_chat_id` if any), and `push` (how many web-push devices are registered). Read this before calling set_preferences so you patch from the real current state. Read-only.",
			"server": {
				"id": "notifications-mcp",
				"title": "@three-ws/notifications-mcp",
				"endpoint": "npx -y @three-ws/notifications-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/notifications-mcp/src/tools/get-preferences.js"
		},
		{
			"name": "list_notifications",
			"title": "List notifications",
			"description": "Read the authenticated agent's notification inbox — the inbound-event feed the platform delivers to the account: market/pump alerts, sales & earnings, purchase receipts, social mentions, IRL interactions, and account/security notices. Returns the most recent notifications (newest first), each with its `id`, `type`, the event `payload`, a `read` boolean and `read_at` timestamp (null ⇒ unread), and `created_at`; plus `unread_count`, the total number of unread items in the inbox. Pass `type` to return only one notification type (e.g. \"pump_alert\", \"skill_purchased\", \"security_alert\"), and `limit` (1–50, default 20) to cap how many rows come back. Read-only — use it to surface alerts without polling, then mark_read / delete_notification to manage them.",
			"server": {
				"id": "notifications-mcp",
				"title": "@three-ws/notifications-mcp",
				"endpoint": "npx -y @three-ws/notifications-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"type": {
						"type": "string",
						"pattern": "^[a-z0-9_]{1,40}$",
						"description": "Optional filter: return only this notification type (e.g. \"pump_alert\", \"skill_purchased\", \"referral_earned\", \"security_alert\"). Lower_snake_case, ≤40 chars. Omit for all types."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"description": "How many notifications to return, newest first. 1–50, default 20."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/notifications-mcp/src/tools/list-notifications.js"
		},
		{
			"name": "mark_read",
			"title": "Mark notifications read",
			"description": "Mark notifications as read in the inbox. Pass `id` to mark a single notification read, or `all: true` to mark every unread notification read at once (exactly one of the two is required). Marking read only updates the read timestamp — it does not delete anything, and re-running with the same arguments has no further effect (idempotent). When `id` is given, returns the notification id and its `read_at`; when `all` is given, returns `marked_read`, the number of notifications newly marked read. To remove a notification entirely use delete_notification instead.",
			"server": {
				"id": "notifications-mcp",
				"title": "@three-ws/notifications-mcp",
				"endpoint": "npx -y @three-ws/notifications-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid",
						"description": "UUID of a single notification to mark read (from list_notifications). Mutually exclusive with `all`."
					},
					"all": {
						"type": "boolean",
						"description": "When true, mark every unread notification in the inbox read. Mutually exclusive with `id`."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/notifications-mcp/src/tools/mark-read.js"
		},
		{
			"name": "register_push_device",
			"title": "Register push device",
			"description": "Register a Web Push device so the account receives push notifications on it. Pass the browser `subscription` object exactly as `pushManager.subscribe().toJSON()` produces it — { endpoint, keys: { p256dh, auth } }. Push endpoints are globally unique: re-registering the same device upserts (the latest owner wins) and is a no-op, so this is idempotent. Whether a given notification category actually delivers over push is still governed by set_preferences. Returns `{ ok: true }` on success. Use unregister_push_device to remove a device.",
			"server": {
				"id": "notifications-mcp",
				"title": "@three-ws/notifications-mcp",
				"endpoint": "npx -y @three-ws/notifications-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"subscription": {
						"type": "object",
						"properties": {
							"endpoint": {
								"type": "string",
								"format": "uri",
								"maxLength": 2048,
								"description": "The push service endpoint URL from the browser PushSubscription."
							},
							"keys": {
								"type": "object",
								"properties": {
									"p256dh": {
										"type": "string",
										"minLength": 1,
										"maxLength": 256,
										"description": "Base64url-encoded P-256 ECDH public key (PushSubscription.keys.p256dh)."
									},
									"auth": {
										"type": "string",
										"minLength": 1,
										"maxLength": 256,
										"description": "Base64url-encoded auth secret (PushSubscription.keys.auth)."
									}
								},
								"required": [
									"p256dh",
									"auth"
								],
								"additionalProperties": false,
								"description": "The encryption keys from the browser PushSubscription."
							}
						},
						"required": [
							"endpoint",
							"keys"
						],
						"additionalProperties": false,
						"description": "A Web Push subscription, exactly as pushManager.subscribe().toJSON() returns it."
					}
				},
				"required": [
					"subscription"
				],
				"additionalProperties": false
			},
			"source": "packages/notifications-mcp/src/tools/register-push-device.js"
		},
		{
			"name": "set_preferences",
			"title": "Set notification preferences",
			"description": "Update the account's notification delivery preferences with a sparse patch. `categories` maps a category key (${…}) to a channel map turning each channel on/off (${…}) — e.g. { \"alerts\": { \"push\": false }, \"social\": { \"email\": true } }. Only the category/channel pairs you pass change; unknown keys are dropped server-side and untouched pairs keep their current value (which falls back to the platform default). Pass `telegram_chat_id` (a numeric Telegram chat id, or \"\" to unlink) to control where the telegram channel delivers. Provide at least one of `categories` or `telegram_chat_id`. WRITE but idempotent — re-applying the same values is a no-op. Returns the full resolved preference matrix after the update. Read it first with get_preferences.",
			"server": {
				"id": "notifications-mcp",
				"title": "@three-ws/notifications-mcp",
				"endpoint": "npx -y @three-ws/notifications-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"categories": {
						"type": "object",
						"additionalProperties": {
							"type": "object",
							"additionalProperties": {
								"type": "boolean"
							}
						},
						"description": "Per-category channel toggles. Outer keys: ${…}. Inner keys: ${…} → boolean. Unrecognised keys are ignored. Example: { \"alerts\": { \"push\": true, \"telegram\": false } }."
					},
					"telegram_chat_id": {
						"type": "string",
						"maxLength": 24,
						"description": "Numeric Telegram chat id to deliver the telegram channel to, or \"\" to unlink it."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/notifications-mcp/src/tools/set-preferences.js"
		},
		{
			"name": "unregister_push_device",
			"title": "Unregister push device",
			"description": "Remove a Web Push device so the account stops receiving push notifications on it. Identify the device by its push `endpoint` URL (preferred) or by passing the full `subscription` object — at least one is required. Destructive: it tears down the device registration (reverse it by calling register_push_device again). Idempotent: removing an endpoint that is not registered still returns `{ ok: true }`. This affects only push delivery to that device; in_app, email, and telegram preferences are unchanged.",
			"server": {
				"id": "notifications-mcp",
				"title": "@three-ws/notifications-mcp",
				"endpoint": "npx -y @three-ws/notifications-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"endpoint": {
						"type": "string",
						"format": "uri",
						"maxLength": 2048,
						"description": "The push endpoint URL of the device to remove. Provide this or `subscription`."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/notifications-mcp/src/tools/unregister-push-device.js"
		},
		{
			"name": "get_portfolio_asset",
			"title": "My position in one token (holdings + market + chart)",
			"description": "Deep-dive on ONE asset across every agent wallet you own. Returns which wallets hold it, your `total_amount` and `total_usd`, the per-wallet `holdings`, the live `market` data (price, 24h/7d/30d change, market cap, volume, ATH) and a `chart` of price history over `days`. Use `id:\"native\"` for the chain’s base coin (SOL on solana, ETH on evm), otherwise the base58 SPL mint or the 0x contract address. Requires THREE_WS_SESSION. Read-only.",
			"server": {
				"id": "portfolio-mcp",
				"title": "@three-ws/portfolio-mcp",
				"endpoint": "npx -y @three-ws/portfolio-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"chain": {
						"type": "string",
						"enum": [
							"solana",
							"evm"
						],
						"description": "Which chain the asset lives on."
					},
					"id": {
						"type": "string",
						"minLength": 1,
						"description": "\"native\" for the base coin (SOL/ETH), otherwise the base58 SPL mint or 0x ERC-20 contract."
					},
					"days": {
						"type": "integer",
						"minimum": 1,
						"maximum": 365,
						"default": 30,
						"description": "Days of price history for the chart, 1–365 (default 30)."
					}
				},
				"required": [
					"chain",
					"id"
				],
				"additionalProperties": false
			},
			"source": "packages/portfolio-mcp/src/tools/portfolio-asset.js"
		},
		{
			"name": "get_portfolio_history",
			"title": "My portfolio value over time",
			"description": "Time series of your total portfolio USD value, oldest point first, for charting performance over time. Returns `points` as { t (ISO timestamp), usd } pairs, drawn from snapshots persisted by get_portfolio_summary(snapshot:true) or the website. An empty `points` array means no snapshots have been captured yet in the window — take one with get_portfolio_summary(snapshot:true) to start the series. Requires THREE_WS_SESSION. Read-only.",
			"server": {
				"id": "portfolio-mcp",
				"title": "@three-ws/portfolio-mcp",
				"endpoint": "npx -y @three-ws/portfolio-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"days": {
						"type": "integer",
						"minimum": 1,
						"maximum": 365,
						"default": 90,
						"description": "How many days of history to return, 1–365 (default 90)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/portfolio-mcp/src/tools/portfolio-history.js"
		},
		{
			"name": "get_portfolio_summary",
			"title": "My agents’ live portfolio (holdings + USD value)",
			"description": "Live aggregated portfolio for the agent wallets YOU own (resolved from your three.ws session). Returns `total_usd` across all wallets and a per-wallet breakdown — each with agent_id, agent_name, chain (solana | evm), address, the resolved .sol name when present, the native balance (SOL/ETH amount + USD), the SPL/ERC-20 token holdings (amount + USD), and that wallet’s USD subtotal. A wallet that failed to price carries `ok:false` and an `error` instead of throwing the whole call. Note: this is the live VALUE snapshot — realized PnL lives in get_trades_feed. Set `snapshot:true` to persist a point for the history chart. Requires THREE_WS_SESSION. Read-only.",
			"server": {
				"id": "portfolio-mcp",
				"title": "@three-ws/portfolio-mcp",
				"endpoint": "npx -y @three-ws/portfolio-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"snapshot": {
						"type": "boolean",
						"default": false,
						"description": "When true, also persist this total as a portfolio snapshot (feeds get_portfolio_history). Default false."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/portfolio-mcp/src/tools/portfolio-summary.js"
		},
		{
			"name": "get_trades_feed",
			"title": "Public closed-trade PnL feed",
			"description": "The public feed of notable CLOSED positions across all three.ws agents, newest exit first — the canonical source of realized PnL on the platform. Each item carries the coin (mint, symbol, name), the trader (agent_id, agent_name, copier_count), entry_sol / exit_sol / realized_pnl_sol / realized_pnl_pct / multiple, hold_seconds, exit_reason, the buy/sell signatures, and oracle conviction context when the coin was scored. Filter by `mint` to see every closed trade on one coin (the time window is ignored when a mint is set). Paginate with `cursor` = the previous response's `next_cursor`. No auth required — read-only live data.",
			"server": {
				"id": "portfolio-mcp",
				"title": "@three-ws/portfolio-mcp",
				"endpoint": "npx -y @three-ws/portfolio-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana network (default mainnet)."
					},
					"window": {
						"type": "string",
						"enum": [
							"1h",
							"6h",
							"24h",
							"7d",
							"30d",
							"all"
						],
						"default": "24h",
						"description": "Time window for closed exits (default 24h). Ignored when `mint` is set."
					},
					"min_pnl_pct": {
						"type": "number",
						"minimum": 0,
						"default": 10,
						"description": "Minimum realized profit %, to surface only meaningful wins (default 10)."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 80,
						"default": 40,
						"description": "Max items to return, 1–80 (default 40)."
					},
					"cursor": {
						"type": "string",
						"description": "ISO timestamp for pagination — pass the previous response's `next_cursor`."
					},
					"mint": {
						"type": "string",
						"description": "Filter to a single coin by base58 mint. When set, all closed trades on that coin are returned regardless of window."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/portfolio-mcp/src/tools/trades-feed.js"
		},
		{
			"name": "get_wallet_balances",
			"title": "Live on-chain balances for a Solana wallet",
			"description": "Read live, on-chain balances for any Solana pubkey directly from the RPC: the native SOL balance plus every non-zero SPL token position (classic SPL and Token-2022), each with mint, raw amount, ui_amount, decimals, and which token program owns it. This is the raw on-chain truth (no USD pricing) — use it to confirm the agent’s own signing wallet before a send_transfer, or to check any address. No session required. Read-only.",
			"server": {
				"id": "portfolio-mcp",
				"title": "@three-ws/portfolio-mcp",
				"endpoint": "npx -y @three-ws/portfolio-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"address": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Base58 Solana pubkey to read balances for."
					},
					"include_tokens": {
						"type": "boolean",
						"default": true,
						"description": "Include SPL/Token-2022 positions (default true). Set false for just the SOL balance."
					}
				},
				"required": [
					"address"
				],
				"additionalProperties": false
			},
			"source": "packages/portfolio-mcp/src/tools/wallet-balances.js"
		},
		{
			"name": "send_transfer",
			"title": "Send SOL or an SPL token on Solana mainnet",
			"description": "BROADCASTS A REAL, IRREVERSIBLE SOLANA MAINNET TRANSACTION that moves funds out of the agent’s own wallet. Sends native SOL (omit `mint`, or set mint:\"native\") or any SPL token (pass its base58 `mint` — supplied at call time, e.g. the $THREE mint or any token you hold). Signs locally with the per-call `secret` (base58) or SOLANA_SECRET_KEY on the server; for a token it auto-creates the recipient’s associated token account when missing. Returns the confirmed signature, the moved amount, and a Solscan link. EXECUTION ACTION — pass confirm:true to proceed. Native sends are capped by MAX_SOL_PER_TX; the recipient must be in RECIPIENT_ALLOWLIST when one is configured.",
			"server": {
				"id": "portfolio-mcp",
				"title": "@three-ws/portfolio-mcp",
				"endpoint": "npx -y @three-ws/portfolio-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"recipient": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "Destination Solana pubkey (base58)."
					},
					"amount": {
						"type": "string",
						"pattern": "^(\\d+(\\.\\d*)?|\\.\\d+)$",
						"description": "Amount to send, in human units as a decimal string (e.g. \"1.5\" SOL or \"100\" tokens)."
					},
					"mint": {
						"type": "string",
						"description": "SPL token mint (base58) to send. Omit or set \"native\" to send SOL. Runtime input — any mint you hold."
					},
					"secret": {
						"type": "string",
						"description": "Base58 secret of the sending wallet. Falls back to SOLANA_SECRET_KEY on the server."
					},
					"priorityMicroLamports": {
						"type": "integer",
						"minimum": 0,
						"maximum": 50000000,
						"description": "Compute-unit price in micro-lamports (default 100000)."
					},
					"confirm": {
						"type": "boolean",
						"description": "Must be true to execute this irreversible transfer (when REQUIRE_CONFIRM is on)."
					}
				},
				"required": [
					"recipient",
					"amount"
				],
				"additionalProperties": false
			},
			"source": "packages/portfolio-mcp/src/tools/send-transfer.js"
		},
		{
			"name": "append_agent_action",
			"title": "Append a signed action to the provenance ledger",
			"description": "Record an action in an agent's append-only provenance ledger — the permanent, auditable trail of what the agent did. Provide `agent_id` (THREE_WS_TOKEN must own it), a short `type` (≤64 chars, e.g. launch, buy, post, reflect), an optional structured `payload`, and an optional `source_skill`. WRITE ACTION: this APPENDS a new immutable record — it can never be edited or deleted, and calling it twice records two distinct actions, so don't retry blindly. When an EVM signer is configured (THREE_WS_SIGNER_KEY env or the `signer_key` arg) the action is ERC-191-signed before sending, making its authorship publicly verifiable; with no key it is appended unsigned. Returns the stored record (with id + created_at) and a `signing` block reporting whether it was signed and by which address.",
			"server": {
				"id": "provenance-mcp",
				"title": "@three-ws/provenance-mcp",
				"endpoint": "npx -y @three-ws/provenance-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"minLength": 1,
						"description": "The agent identity id to record the action under. Your token must own it."
					},
					"type": {
						"type": "string",
						"minLength": 1,
						"maxLength": 64,
						"description": "Short action type, e.g. launch, buy, sell, post, reflect, follow. Truncated to 64 chars server-side."
					},
					"payload": {
						"type": "object",
						"additionalProperties": {},
						"description": "Structured details of the action (any JSON object) — e.g. { mint, amount_sol, signature }. Stored verbatim and covered by the signature."
					},
					"source_skill": {
						"type": "string",
						"maxLength": 200,
						"description": "Identifier of the skill/tool that produced this action, for attribution in the trail."
					},
					"signer_key": {
						"type": "string",
						"description": "Optional 0x-prefixed EVM private key to ERC-191-sign this action. Overrides THREE_WS_SIGNER_KEY for this call. Omit to use the env key, or sign nothing if none is set."
					}
				},
				"required": [
					"agent_id",
					"type"
				],
				"additionalProperties": false
			},
			"source": "packages/provenance-mcp/src/tools/append-agent-action.js"
		},
		{
			"name": "list_agent_actions",
			"title": "List an agent's action-provenance trail",
			"description": "Read an agent's append-only action log, newest-first, cursor-paginated. Returns each action's id, type (e.g. launch, buy, post, reflect), payload, source_skill, created_at, and — when the action was signed — its ERC-191 signature + signer_address. Each record is checked against its own signature: `verification.reason` is `ok` (recovered signer matches the claimed address), `unsigned`, `signer_mismatch` (recovered a different address — tampering OR an action signed under a different canonical scheme; treat as unverified, not trusted), or `malformed_signature`. Pass the returned `next_cursor` back as `cursor` to page further. The ledger is owner-scoped: THREE_WS_TOKEN must own `agent_id`. Read-only; the log is immutable so older pages never change.",
			"server": {
				"id": "provenance-mcp",
				"title": "@three-ws/provenance-mcp",
				"endpoint": "npx -y @three-ws/provenance-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"minLength": 1,
						"description": "The agent identity id whose provenance trail to read. Your token must own it."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 200,
						"default": 50,
						"description": "Max actions to return (1–200, default 50)."
					},
					"cursor": {
						"type": "string",
						"pattern": "^\\d+$",
						"description": "Pagination cursor — pass the `next_cursor` from a previous call to fetch the next (older) page."
					}
				},
				"required": [
					"agent_id"
				],
				"additionalProperties": false
			},
			"source": "packages/provenance-mcp/src/tools/list-agent-actions.js"
		},
		{
			"name": "query_action",
			"title": "Fetch + verify one provenance action",
			"description": "Fetch a single action from an agent's append-only log by its id, then verify it. Returns the action (type, payload, source_skill, created_at, signature, signer_address) plus a `verification` block: `signed`, `valid`, `reason` (`ok` | `unsigned` | `signer_mismatch` | `malformed_signature`), the `recovered` signer address, and the recomputed `digest`. `valid:true` means the ERC-191 signature recovers to the claimed signer over the canonical action form — cryptographic proof the named agent authored this exact action and it was not altered. The ledger is owner-scoped: THREE_WS_TOKEN must own `agent_id`. Returns ok:false / not_found when the id is absent from this agent's log. Read-only.",
			"server": {
				"id": "provenance-mcp",
				"title": "@three-ws/provenance-mcp",
				"endpoint": "npx -y @three-ws/provenance-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"minLength": 1,
						"description": "The agent identity id that owns the action. Your token must own this agent."
					},
					"id": {
						"type": "string",
						"pattern": "^\\d+$",
						"description": "The numeric action id to fetch (the `id` field from list_agent_actions)."
					}
				},
				"required": [
					"agent_id",
					"id"
				],
				"additionalProperties": false
			},
			"source": "packages/provenance-mcp/src/tools/query-action.js"
		},
		{
			"name": "build_world",
			"title": "Build a complete 3D world from one sentence (no browser needed)",
			"description": "One sentence → a fully forged, exported 3D world, entirely server-side: composes the scene plan, forges every object on the free text→3D lane, and merges the result into one GLB with named, selectable nodes plus ground and lighting. Returns the populated diorama, the merged GLB URL, and a ready-to-open Scene Studio link. This is the whole progressive /diorama browser flow collapsed into one call — it can take a couple of minutes for a full object set. Partial forges are not failures: whatever forged is exported, and `skipped` names anything that did not.",
			"server": {
				"id": "scene-mcp",
				"title": "@three-ws/scene-mcp",
				"endpoint": "npx -y @three-ws/scene-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"minLength": 3,
						"maxLength": 1024,
						"description": "One short sentence describing the world to build, e.g. \"a neon alley with a food cart and two streetlights\"."
					}
				},
				"required": [
					"prompt"
				],
				"additionalProperties": false
			},
			"source": "packages/scene-mcp/src/tools/build-world.js"
		},
		{
			"name": "compose_scene",
			"title": "Compose a 3D diorama plan from one sentence",
			"description": "Compose a tiny 3D diorama from one short sentence. Returns a PLAN: an evocative title, a mood (dawn/day/dusk/night), ground + island type, a color palette, and 2–8 placed objects — each with a single-object forge prompt, position, scale and rotation. No meshes are generated yet and nothing is saved; feed the plan to the three.ws diorama page (or /api/forge per object) to build the world. Read-mostly but runs live LLM inference.",
			"server": {
				"id": "scene-mcp",
				"title": "@three-ws/scene-mcp",
				"endpoint": "npx -y @three-ws/scene-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"minLength": 3,
						"maxLength": 1024,
						"description": "One short sentence describing the world to build, e.g. \"a lonely lighthouse on a stormy cliff\"."
					}
				},
				"required": [
					"prompt"
				],
				"additionalProperties": false
			},
			"source": "packages/scene-mcp/src/tools/compose-scene.js"
		},
		{
			"name": "export_scene",
			"title": "Export a forged diorama as one GLB scene",
			"description": "Merge an already-forged diorama (objects with real glbUrl values, e.g. from your own forging after compose_scene, or fetched via get_scene) into ONE glTF 2.0 binary: every object becomes a named, selectable node, plus a real ground disc and mood-tuned lighting. Returns the merged GLB URL and a ready-to-open three.ws Scene Studio link. Objects that never forged are skipped and reported, not treated as a failure — a partial world still exports. Requires the target deployment to have object storage configured (three.ws does).",
			"server": {
				"id": "scene-mcp",
				"title": "@three-ws/scene-mcp",
				"endpoint": "npx -y @three-ws/scene-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"diorama": {
						"type": "object",
						"additionalProperties": {},
						"description": "The diorama object to export — same shape returned by compose_scene/get_scene, with each object you want included carrying status:\"ready\" and a real glbUrl."
					}
				},
				"required": [
					"diorama"
				],
				"additionalProperties": false
			},
			"source": "packages/scene-mcp/src/tools/export-scene.js"
		},
		{
			"name": "get_scene",
			"title": "Fetch a saved diorama by id",
			"description": "Fetch one saved diorama (a fully-forged 3D world) by its id, including its title, mood, palette, ground, and the placed objects with their GLB URLs. Returns the orbitable viewer URL. Read-only.",
			"server": {
				"id": "scene-mcp",
				"title": "@three-ws/scene-mcp",
				"endpoint": "npx -y @three-ws/scene-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"minLength": 1,
						"description": "The diorama id returned when the world was saved."
					}
				},
				"required": [
					"id"
				],
				"additionalProperties": false
			},
			"source": "packages/scene-mcp/src/tools/get-scene.js"
		},
		{
			"name": "list_scenes",
			"title": "List recent or featured dioramas",
			"description": "Browse the public diorama gallery — the most recent saved worlds, or the featured set. Returns a list of cards (id, title, mood, thumbnail/preview, view count) plus each world's viewer URL. Read-only.",
			"server": {
				"id": "scene-mcp",
				"title": "@three-ws/scene-mcp",
				"endpoint": "npx -y @three-ws/scene-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"list": {
						"type": "string",
						"enum": [
							"recent",
							"featured"
						],
						"default": "recent",
						"description": "Which gallery to read: newest saved worlds (\"recent\") or the curated set (\"featured\")."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"description": "How many to return (1–50, default 24)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/scene-mcp/src/tools/list-scenes.js"
		},
		{
			"name": "get_mirror_leaderboard",
			"title": "Rank signal publishers by realized performance",
			"description": "Rank followable agents (signal publishers / copy-trade leaders) by REAL, on-chain-derived performance — never inflated. Every number traces to a real signature: realized P&L and win-rate come from closed sniper round-trips, volume from the discretionary custody ledger, and losers are included. Each leader returns rank, agent_id, name, avatar, settled trades, wins, win_rate, realized pnl_sol, roi_pct, trade count, volume_sol, follower counts, last trade time, and a composite score (realized ROI weighted by sample size so a one-trade fluke cannot top a consistent trader). Sort by `score` (default), `pnl`, `followers`, `volume`, or `winrate`. Use this to find a leader before subscribing to their feed. Public, read-only live data — no key required.",
			"server": {
				"id": "signals-mcp",
				"title": "@three-ws/signals-mcp",
				"endpoint": "npx -y @three-ws/signals-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana network to rank on (default mainnet)."
					},
					"sort": {
						"type": "string",
						"enum": [
							"score",
							"pnl",
							"followers",
							"volume",
							"winrate"
						],
						"default": "score",
						"description": "Ranking key: score (default), pnl, followers, volume, or winrate."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 25,
						"description": "Maximum leaders to return (1–50, default 25)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/signals-mcp/src/tools/get-mirror-leaderboard.js"
		},
		{
			"name": "get_subscriptions",
			"title": "List your signal subscriptions + delivery history",
			"description": "List every signal subscription owned by the authenticated account — the follower's tracking surface. Each subscription returns its numeric `id` (pass this to set_subscription_status), the subscriber agent, the feed it follows (slug, title, publisher, pricing), the copy-trade config (mode simulate/live, billing, base_sol, size_scaling, max_per_trade_sol, slippage_bps, firewall_level, copy_exits), live status (status, killed flag, epoch_paid_until, last delivered emission), and the realized delivery stats: `stats.executed` (mirror fills that executed on-chain), `stats.paid_count` (paid deliveries), and `stats.usdc_spent` (total USDC paid to the publisher). Requires THREE_WS_API_KEY. Read-only live data.",
			"server": {
				"id": "signals-mcp",
				"title": "@three-ws/signals-mcp",
				"endpoint": "npx -y @three-ws/signals-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/signals-mcp/src/tools/get-subscriptions.js"
		},
		{
			"name": "list_signal_feeds",
			"title": "Browse the signal-feed marketplace",
			"description": "Discover copy-trade signal feeds on three.ws. Returns the public directory of active feeds, each ranked by its PROVEN realized edge (hit-rate × realized ROI, confidence-regressed toward the publisher's verified track-record score until enough signals have closed — a thin feed riding one lucky call can never top a deep, consistent one). For each feed you get its numeric `id` (pass this to subscribe_signal), `slug`, title, the publisher (name, verified badge, track-record score, realized SOL P&L), pricing (per-signal and per-epoch USDC), and proven stats (closed signals, hit-rate, average realized %, active subscribers, executed fills, avg emit→fill latency, avg follower ROI). Sort by `edge` (default), `roi`, `hitrate`, `subscribers`, or `newest`. Public, read-only live data — no key required.",
			"server": {
				"id": "signals-mcp",
				"title": "@three-ws/signals-mcp",
				"endpoint": "npx -y @three-ws/signals-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet",
						"description": "Solana network the feeds publish on (default mainnet)."
					},
					"sort": {
						"type": "string",
						"enum": [
							"edge",
							"roi",
							"hitrate",
							"subscribers",
							"newest"
						],
						"default": "edge",
						"description": "Ranking key: edge (proven realized edge, default), roi (avg realized %), hitrate, subscribers, or newest."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"default": 60,
						"description": "Maximum feeds to return (1–100, default 60)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/signals-mcp/src/tools/list-signal-feeds.js"
		},
		{
			"name": "set_subscription_status",
			"title": "Resume, pause, stop, or kill a subscription",
			"description": "Control an existing signal subscription owned by the authenticated account.\n  • active  — (re)activate it; this also CLEARS any kill flag so it resumes paying/mirroring.\n  • paused  — stop delivering for now; the kill flag (if set) is left untouched.\n  • stopped — stop the subscription (soft — its delivery history is kept).\n  • killed  — INSTANT kill switch: halts everything immediately; the kill is honoured before any payment or trade can fire. Use this to stop a live subscription from spending or trading right now.\nIdempotent — setting the same state again is a no-op. Get the subscription `id` from get_subscriptions. Requires THREE_WS_API_KEY.",
			"server": {
				"id": "signals-mcp",
				"title": "@three-ws/signals-mcp",
				"endpoint": "npx -y @three-ws/signals-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"subscription_id": {
						"type": "integer",
						"exclusiveMinimum": 0,
						"description": "Numeric subscription id (the `id` from get_subscriptions)."
					},
					"state": {
						"type": "string",
						"enum": [
							"active",
							"paused",
							"stopped",
							"killed"
						],
						"description": "Target state: active (resume + clear kill), paused, stopped, or killed (instant halt of all pay/trade)."
					}
				},
				"required": [
					"subscription_id",
					"state"
				],
				"additionalProperties": false
			},
			"source": "packages/signals-mcp/src/tools/set-subscription-status.js"
		},
		{
			"name": "subscribe_signal",
			"title": "Subscribe an agent to a signal feed",
			"description": "Subscribe one of YOUR agents to a signal feed so it copy-trades the publisher. Idempotent: a feed is keyed by (subscriber agent, feed) — re-calling updates the existing subscription instead of creating a duplicate. A new subscription starts at the current emission head, so it is never charged for or made to mirror signals emitted before it subscribed.\n\nPAYMENT & RISK: `mode:\"simulate\"` (default) mirrors WITHOUT paying or trading — it sizes and labels the orders for trust-building, spends nothing. `mode:\"live\"` BOTH pays the publisher in USDC (x402, per-signal or per-epoch per the feed pricing) AND auto-mirrors real on-chain trades from the subscriber agent's custodial wallet, within its spend policy. Money moves at delivery time (when the publisher emits a signal), not at the moment you call this tool. Use set_subscription_status with killed:true to halt all further pay/trade instantly. Requires THREE_WS_API_KEY; the agent must be owned by that account.",
			"server": {
				"id": "signals-mcp",
				"title": "@three-ws/signals-mcp",
				"endpoint": "npx -y @three-ws/signals-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"minLength": 1,
						"description": "ID of the subscriber agent (must be owned by the authenticated account). This agent pays and mirrors."
					},
					"feed_id": {
						"type": "integer",
						"exclusiveMinimum": 0,
						"description": "Numeric feed id to follow (from list_signal_feeds — the `id` field). The feed must be active."
					},
					"mode": {
						"type": "string",
						"enum": [
							"simulate",
							"live"
						],
						"default": "simulate",
						"description": "simulate = no pay, no trade (default, safe). live = pays USDC AND auto-mirrors real trades."
					},
					"billing": {
						"type": "string",
						"enum": [
							"per_signal",
							"per_epoch"
						],
						"default": "per_signal",
						"description": "How live mode is charged: per_signal (each entry) or per_epoch (a flat fee per epoch window)."
					},
					"base_sol": {
						"type": "number",
						"minimum": 0.001,
						"maximum": 10,
						"description": "Base order size in SOL before the per-signal size multiple/scaling (0.001–10, default 0.05)."
					},
					"size_scaling": {
						"type": "number",
						"minimum": 0.01,
						"maximum": 20,
						"description": "Multiplier applied on top of the base size (0.01–20, default 1)."
					},
					"max_per_trade_sol": {
						"type": "number",
						"minimum": 0.001,
						"maximum": 50,
						"description": "Hard cap on any single mirrored order in SOL (0.001–50, default 0.25)."
					},
					"slippage_bps": {
						"type": "integer",
						"minimum": 0,
						"maximum": 5000,
						"description": "Max slippage in basis points for mirrored trades (0–5000, default 300 = 3%)."
					},
					"firewall_level": {
						"type": "string",
						"enum": [
							"block",
							"warn"
						],
						"default": "block",
						"description": "Risk firewall on mirrored buys: block (refuse risky trades, default) or warn (allow with a flag)."
					},
					"copy_exits": {
						"type": "boolean",
						"default": true,
						"description": "Mirror the publisher's exits too (sell when they sell). Default true."
					}
				},
				"required": [
					"agent_id",
					"feed_id"
				],
				"additionalProperties": false
			},
			"source": "packages/signals-mcp/src/tools/subscribe-signal.js"
		},
		{
			"name": "three_balance",
			"title": "Read a wallet's $THREE + SOL balance",
			"description": "Return the $THREE and SOL balance for a Solana pubkey. If no pubkey is given, uses the configured signer (SOLANA_SECRET_KEY). Read-only — no payment.",
			"server": {
				"id": "three-token-mcp",
				"title": "@three-ws/three-token-mcp",
				"endpoint": "npx -y @three-ws/three-token-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"pubkey": {
						"type": "string",
						"minLength": 32,
						"maxLength": 64,
						"description": "Base58 pubkey to read. Defaults to the configured signer's address."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/three-token-mcp/src/tools/three-balance.js"
		},
		{
			"name": "three_burn",
			"title": "Burn $THREE on-chain (incinerator + treasury split)",
			"description": "Burn a USD-denominated amount of the $THREE your wallet holds. Quotes USD→$THREE via Jupiter, then sends ONE Solana transaction that splits it between the incinerator (burn) and the three.ws treasury, per the live public token config. EXECUTION ACTION — signs and broadcasts on Solana mainnet, IRREVERSIBLE: pass confirm:true. Capped by MAX_BURN_USD. The resolved mint is asserted to be canonical $THREE before signing. Requires a signer (SOLANA_SECRET_KEY env or the `secret` arg) holding enough $THREE. Returns the tx signature, the burned/treasury breakdown, and a Solscan link.",
			"server": {
				"id": "three-token-mcp",
				"title": "@three-ws/three-token-mcp",
				"endpoint": "npx -y @three-ws/three-token-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"usd": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "USD value of $THREE to burn (priced live via Jupiter)."
					},
					"burnBps": {
						"type": "number",
						"minimum": 0,
						"maximum": 10000,
						"description": "Share routed to the incinerator in basis points. Default 5000 (50% burn / 50% treasury). 10000 = burn everything."
					},
					"memo": {
						"type": "string",
						"maxLength": 120,
						"description": "Optional note appended to the on-chain memo."
					},
					"secret": {
						"type": "string",
						"description": "Base58 signer override. Defaults to SOLANA_SECRET_KEY. Treat like cash."
					},
					"confirm": {
						"type": "boolean",
						"description": "Must be true to execute this irreversible burn (when REQUIRE_CONFIRM is on)."
					}
				},
				"required": [
					"usd"
				],
				"additionalProperties": false
			},
			"source": "packages/three-token-mcp/src/tools/three-burn.js"
		},
		{
			"name": "three_price",
			"title": "Live $THREE price (Jupiter) + USD→$THREE quote",
			"description": "Return the live USD price of $THREE (Jupiter primary, Birdeye fallback). Pass `usd` to also get how much $THREE that amount buys (token amount + atomic units). Read-only — no signer or payment required.",
			"server": {
				"id": "three-token-mcp",
				"title": "@three-ws/three-token-mcp",
				"endpoint": "npx -y @three-ws/three-token-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"usd": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Optional USD amount to quote into $THREE."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/three-token-mcp/src/tools/three-price.js"
		},
		{
			"name": "animation_signature",
			"title": "Measure what an animation clip actually does",
			"description": "The measured motion signature of a baked clip: energy, tempo, which body region leads, loop-seam cleanliness, root travel, and whether it survives as an upper-body overlay. Pass `slot` to also get a fit verdict (\"ok\" or \"warn\" with the reason) for playing this clip in that runtime slot (idle, wave, fidget and the rest). Use it to pick clips by what they do rather than by name.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"clip": {
						"type": "string",
						"description": "Clip name from list_animations (e.g. \"idle\", \"wave\", \"av-conductor\")."
					},
					"slot": {
						"type": "string",
						"description": "Optional runtime slot to check the clip against (e.g. \"idle\", \"fidget\", \"wave\")."
					}
				},
				"required": [
					"clip"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/animations.js"
		},
		{
			"name": "apply_animation",
			"title": "Apply an animation preset to a rigged model",
			"description": "Retarget a curated animation preset onto a caller-supplied rigged humanoid GLB. Returns the retargeted three.js AnimationClip JSON (keyed to the rig's actual bone names, hip translation rescaled to its proportions) plus a retarget report — load it alongside the model and play. Set format=\"glb\" to also bake an animated GLB server-side (best-effort: textured rigs may exceed the headless bake budget and fall back to clip JSON — the /pose gallery is the guaranteed GLB export). SSRF-hardened: only public https model URLs are fetched.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.01,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"model_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of a rigged humanoid .glb to animate."
					},
					"animation": {
						"type": "string",
						"description": "Preset name from list_animations (e.g. \"idle\", \"walk\", \"dance\")."
					},
					"format": {
						"type": "string",
						"enum": [
							"glb",
							"clip"
						],
						"default": "clip",
						"description": "clip = retargeted AnimationClip JSON (reliable); glb = also attempt a baked animated GLB (base64, best-effort)."
					},
					"speed": {
						"type": "number",
						"minimum": 0.25,
						"maximum": 2.5,
						"default": 1,
						"description": "Playback-speed multiplier baked into the result (1.8 turns a walk into a run)."
					}
				},
				"required": [
					"model_url",
					"animation"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/animations.js"
		},
		{
			"name": "attach_avatar_to_agent",
			"title": "Give an agent a body",
			"description": "Attach a generated/rigged avatar (from forge_avatar, mesh_forge + rig_mesh, or any avatar you own) to one of your registered agent identities — giving the agent a persistent visual body tied to its account identity. This is the bridge between generation and identity: generate a rigged GLB, save it as an avatar (list_my_avatars / the Forge 'Save' action), then call this tool to make it the agent's body. The same agent_id always shows the same body afterwards (get_avatar / render_avatar / get_embed_code all resolve it). Chain register_agent next to mint the on-chain identity (ERC-8004 on Base, or a Metaplex Agent Registry PDA on Solana) and anchor_provenance to credential the GLB itself — together the agent has a body, an on-chain identity, and a verifiable authenticity record. Requires a signed-in three.ws account; both the agent and the avatar must belong to the caller.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "Your agent identity id (uuid)."
					},
					"avatar_id": {
						"type": "string",
						"format": "uuid",
						"description": "The avatar to attach (uuid) — one of your own avatars (see list_my_avatars)."
					}
				},
				"required": [
					"agent_id",
					"avatar_id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/agents.js"
		},
		{
			"name": "call_agent",
			"title": "Call agent",
			"description": "Send a message to another three.ws agent and get its response. Use this to delegate specialized tasks.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"description": "The agent's ID"
					},
					"message": {
						"type": "string",
						"description": "The message to send"
					}
				},
				"required": [
					"agent_id",
					"message"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/agents.js"
		},
		{
			"name": "copy_status",
			"title": "My copy subscriptions",
			"description": "List all your active copy-trading subscriptions, with sizing config, execution counts (pending/acted), and the leader's name and profile. Use this to check that copy-trading is set up correctly and to see which subscriptions are generating intents.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/trader.js"
		},
		{
			"name": "copy_subscribe",
			"title": "Subscribe to copy a trader",
			"description": "Set up non-custodial copy-trading: mirror a leader agent's future pump.fun entries into your own wallet with your own sizing and risk caps. You supply your wallet address and the sizing rules; we never hold keys. The fan-out cron checks for new leader entries and generates sized intents you act on from /dashboard/copy. Provide leader_agent_id (from trader_leaderboard) and your Solana wallet address. Sizing rules: 'fixed' = exact SOL per trade, 'multiplier' = N× leader size, 'pct_balance' = % of your balance. Always set a per_trade_cap_sol and daily_budget_sol to limit exposure.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"leader_agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "The agent UUID to copy (from trader_leaderboard)."
					},
					"copier_wallet": {
						"type": "string",
						"description": "Your Solana wallet address (base58) that will receive the copy intents."
					},
					"sizing_rule": {
						"type": "string",
						"enum": [
							"fixed",
							"multiplier",
							"pct_balance"
						],
						"default": "fixed",
						"description": "How to size your copies relative to the leader."
					},
					"fixed_sol": {
						"type": "number",
						"minimum": 0.001,
						"description": "SOL per trade (sizing_rule=fixed)."
					},
					"multiplier": {
						"type": "number",
						"minimum": 0.01,
						"maximum": 10,
						"description": "Multiplier of leader size (sizing_rule=multiplier)."
					},
					"pct_balance": {
						"type": "number",
						"minimum": 0.1,
						"maximum": 100,
						"description": "Percent of your balance per trade (sizing_rule=pct_balance)."
					},
					"per_trade_cap_sol": {
						"type": "number",
						"minimum": 0.001,
						"default": 0.05,
						"description": "Hard cap: no single copy trade may exceed this SOL amount."
					},
					"daily_budget_sol": {
						"type": "number",
						"minimum": 0.001,
						"default": 0.5,
						"description": "Hard daily spend ceiling across all copy trades."
					},
					"min_order_sol": {
						"type": "number",
						"minimum": 0,
						"default": 0,
						"description": "Skip copies that would be smaller than this SOL amount."
					},
					"max_open_copies": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 5,
						"description": "Max simultaneous open copy positions."
					},
					"min_oracle_score": {
						"type": "integer",
						"minimum": 0,
						"maximum": 100,
						"description": "Only copy leader entries where Oracle conviction is at least this score."
					},
					"mcap_floor_usd": {
						"type": "number",
						"minimum": 0,
						"description": "Skip coins below this USD market cap at entry."
					},
					"mcap_ceiling_usd": {
						"type": "number",
						"minimum": 0,
						"description": "Skip coins above this USD market cap at entry (avoid already-pumped)."
					},
					"telegram_chat_id": {
						"type": "string",
						"description": "Telegram chat ID for copy-execution alerts (optional)."
					},
					"perf_fee_bps": {
						"type": "integer",
						"minimum": 0,
						"maximum": 3000,
						"default": 1000,
						"description": "Performance fee in bps paid to the leader on wins (default 10%)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"leader_agent_id",
					"copier_wallet"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/trader.js"
		},
		{
			"name": "create_gated_embed",
			"title": "Create a token-gated embed",
			"description": "Turn an avatar or on-chain agent you own into a holder-only interactive 3D embed. Visitors must prove — with a real, server-verified Solana SPL token balance, never a client-reported number — they hold at least min_amount of mint before the live scene renders; below that they see a designed locked teaser with a connect-wallet CTA. mint defaults to $THREE but accepts any SPL mint at runtime. Returns a ready-to-paste <three-d> embed snippet.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"asset_id": {
						"type": "string",
						"description": "The embed asset to gate: \"avatar:<uuid>\" or \"<chainId>:<agentId>\" (on-chain agent you own)."
					},
					"mint": {
						"type": "string",
						"description": "SPL token mint holders must have a balance of. Defaults to $THREE (${…}) — pass a different mint to gate with another community's token."
					},
					"min_amount": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Minimum token balance a visitor must hold to unlock the embed."
					}
				},
				"required": [
					"asset_id",
					"min_amount"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/embed.js"
		},
		{
			"name": "crypto_data",
			"title": "Crypto Data API",
			"description": null,
			"descriptionIsDynamic": true,
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"provider": {
						"type": "string",
						"description": "Registered provider id, e.g. \"coingecko\", \"dexscreener\", \"jupiter\", \"solana\", \"defillama\"."
					},
					"endpoint": {
						"type": "string",
						"description": "Endpoint id under that provider, e.g. \"price\", \"token\", \"quote\"."
					},
					"params": {
						"type": "object",
						"description": "Endpoint-specific query params — see the endpoint summary in the tool description for required fields.",
						"additionalProperties": true,
						"default": {}
					}
				},
				"required": [
					"provider",
					"endpoint"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/crypto-data.js"
		},
		{
			"name": "delete_avatar",
			"title": "Delete avatar",
			"description": "Soft-delete an avatar you own. Requires avatars:delete scope.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid"
					},
					"confirm": {
						"type": "boolean",
						"description": "Must be true to confirm permanent deletion."
					}
				},
				"required": [
					"id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/avatars.js"
		},
		{
			"name": "find_similar_animations",
			"title": "Find clips with similar measured motion",
			"description": "Rank the library's clips by measured-motion distance from a reference clip (regional shares, energy, tempo, travel). Use it for \"more like this\": alternatives when a clip does not fit a slot, or variety without changing the mood.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"clip": {
						"type": "string",
						"description": "Reference clip name from list_animations."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 20,
						"description": "How many neighbors to return (default 5)."
					}
				},
				"required": [
					"clip"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/animations.js"
		},
		{
			"name": "forget",
			"title": "Forget",
			"description": "Delete a memory you own by its id.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"memory_id": {
						"type": "string",
						"format": "uuid"
					},
					"agent_id": {
						"type": "string",
						"format": "uuid"
					}
				},
				"required": [
					"memory_id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/memory.js"
		},
		{
			"name": "garment_status",
			"title": "Check a garment generation job",
			"description": "Poll a generate_garment job. While running, reports the pipeline stage. When done, returns the published glb_url, manifest_url, thumbnail, measured bind coverage, and the occluded body regions — at that point the garment is already live in the wardrobe catalog.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"job_id": {
						"type": "string",
						"description": "Job id returned by generate_garment."
					}
				},
				"required": [
					"job_id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/garments.js"
		},
		{
			"name": "generate_garment",
			"title": "Generate a wearable garment from a text prompt",
			"description": "Turn a text prompt (e.g. \"a red varsity jacket\") into a rigged, wearable garment published to the three.ws wardrobe catalog. The pipeline generates a reference image, sculpts a PBR mesh on the GPU fleet, skins it to the canonical humanoid skeleton, and validates it (including the 60% bind-coverage gate) before publishing garment.glb + manifest.json + thumbnail. Runs asynchronously for about 7 minutes; poll with garment_status. The finished piece appears in the public catalog automatically and attaches to any humanoid avatar.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"minLength": 3,
						"maxLength": 500,
						"description": "Describe the garment (fabric, color, style)."
					},
					"slot": {
						"type": "string",
						"enum": [
							"top",
							"bottom",
							"footwear",
							"outerwear",
							"hair",
							"headwear",
							"glasses",
							"accessory"
						],
						"description": "Wardrobe slot the garment occupies."
					}
				},
				"required": [
					"prompt",
					"slot"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/garments.js"
		},
		{
			"name": "get_3d_asset_onchain",
			"title": "Resolve a 3D NFT to its live asset + provenance",
			"description": "Resolve a Solana mint address to its live 3D asset: current holder, the interactive viewer link + GLB (confirmed live), baked provenance (creator, prompt, model, lineage, timestamp), and the enforced on-chain royalty terms. Works on any Metaplex Core mint — assets minted through three.ws also return their platform launch record. Read-only, public.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string",
						"description": "The Metaplex Core asset (mint) pubkey, base58."
					},
					"network": {
						"type": "string",
						"enum": [
							"devnet",
							"mainnet"
						],
						"default": "devnet",
						"description": "Cluster to read (ignored if the mint is in our launch records)."
					}
				},
				"required": [
					"mint"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/tokenize.js"
		},
		{
			"name": "get_avatar",
			"title": "Get avatar",
			"description": "Fetch a single avatar by id or by owner+slug. Returns metadata and a model_url (public/unlisted) or short-lived signed URL (private).",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid"
					},
					"slug": {
						"type": "string"
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/avatars.js"
		},
		{
			"name": "get_embed_code",
			"title": "Get embed code",
			"description": "Return a ready-to-paste <iframe> embed snippet (plus shareable URL, oEmbed URL, and OG thumbnail) for a three.ws avatar, on-chain agent, or Forge creation. Embed a persistent 3D avatar into Notion, Webflow, Framer, a blog, or any site as easily as a YouTube video. Provide exactly one target: agent_id, OR chain_id + onchain_agent_id, OR creation_id.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "Embed a regular three.ws agent."
					},
					"chain_id": {
						"type": "integer",
						"description": "EVM chain id of an on-chain (ERC-8004) agent."
					},
					"onchain_agent_id": {
						"type": "string",
						"description": "Token id of the on-chain agent (pair with chain_id)."
					},
					"creation_id": {
						"type": "string",
						"format": "uuid",
						"description": "Embed a Forge 3D creation."
					},
					"width": {
						"type": "integer",
						"default": 480,
						"description": "Iframe width in px (clamped 240–1920)."
					},
					"height": {
						"type": "integer",
						"default": 360,
						"description": "Iframe height in px (clamped 180–1080)."
					},
					"autorotate": {
						"type": "boolean",
						"default": true,
						"description": "Slowly auto-rotate the avatar."
					},
					"ar": {
						"type": "boolean",
						"default": true,
						"description": "Offer an AR / view-in-room button on mobile."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/embed.js"
		},
		{
			"name": "identity_check",
			"title": "Screen an agent identity for impersonation",
			"description": "Screen an agent identity (an existing agent_id, or a proposed name + description) for impersonation and policy violations before it goes public. Uses IBM Granite embeddings to find look-alike agents a name match would miss, and Granite Guardian to screen the identity text. Returns a clear | review | block verdict with the nearest neighbours and human-readable reasons.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "Screen one of your existing agents by id."
					},
					"name": {
						"type": "string",
						"description": "Proposed agent name (use with description instead of agent_id)."
					},
					"description": {
						"type": "string",
						"description": "Proposed agent description."
					},
					"persona_tone_tags": {
						"type": "array",
						"items": {
							"type": "string"
						},
						"description": "Optional persona/tone tags to include in the embedded identity."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/agents.js"
		},
		{
			"name": "inspect_model",
			"title": "Inspect glTF/GLB model",
			"description": "Parse a remote GLB or glTF and return structural stats: scene/node/mesh counts, vertex and triangle totals, material and texture summaries, extensions used. Pure inspection — no optimization advice.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.01,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of a .glb or .gltf file."
					}
				},
				"required": [
					"url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/models.js"
		},
		{
			"name": "list_animations",
			"title": "List animation presets",
			"description": "List the curated, retargetable animation presets in the three.ws library — name, label, category, and whether the clip loops. Use this to discover valid `animation` values for apply_animation.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"category": {
						"type": "string",
						"description": "Optional category filter (e.g. \"dance\", \"locomotion\", \"gesture\")."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/animations.js"
		},
		{
			"name": "list_garment_catalog",
			"title": "List the wardrobe garment catalog",
			"description": "Fetch the public three.ws wardrobe catalog: every published garment manifest (id, slot, name, GLB url, thumbnail, occluded regions). Any entry attaches to any humanoid avatar via the additive wardrobe.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"slot": {
						"type": "string",
						"enum": [
							"top",
							"bottom",
							"footwear",
							"outerwear",
							"hair",
							"headwear",
							"glasses",
							"accessory"
						],
						"description": "Optional: only garments for this slot."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/garments.js"
		},
		{
			"name": "list_my_avatars",
			"title": "List my avatars",
			"description": "List the authenticated user's avatars. Returns id, name, slug, size, visibility, and direct model_url (when visibility permits).",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"default": 25
					},
					"cursor": {
						"type": "string",
						"description": "Opaque pagination cursor from previous response."
					},
					"visibility": {
						"type": "string",
						"enum": [
							"private",
							"unlisted",
							"public"
						]
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/avatars.js"
		},
		{
			"name": "list_sign_vocabulary",
			"title": "List the ASL vocabulary",
			"description": "List every word three.ws avatars have a real American Sign Language sign for, with a plain description of the handshape, place on the body, and movement each one performs. Words outside this list are fingerspelled letter by letter instead. Use it to know in advance what a phrase will sign versus spell.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"search": {
						"type": "string",
						"description": "Optional substring filter over the words and their descriptions."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/sign.js"
		},
		{
			"name": "mint_3d_asset",
			"title": "Mint a 3D asset as a Solana NFT",
			"description": "Mint a generated or owned GLB as a Metaplex Core NFT on Solana whose media is a LIVE, interactive 3D viewer (the rigged glTF model under animation_url — not a static image). Bakes provenance (creator, prompt, generation model, parent lineage, timestamp) into the metadata AND appends a signed, independently-verifiable record to the agent_actions provenance ledger; enforces capped creator royalties on secondary sales. Supply an owned avatar_id or a glb_url, and a recipient (owner_wallet, or your OAuth-linked Solana wallet). Devnet by default; pass network=\"mainnet\" for a real mainnet mint. Idempotent — a repeat call for the same asset returns the same mint. Royalty is capped at ${…}%. Naming parent_mint (a remix/derivative on mainnet) routes the parent creator's royalty slice out of THIS mint's fee as a real on-chain USDC transfer. Returns the mint address, explorer + viewer links, royalty terms, the provenance ledger reference, and (for a remix) the royalty settlement. Priced per call via x402 (USDC); an OAuth bearer token bypasses payment.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.25,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"avatar_id": {
						"type": "string",
						"format": "uuid",
						"description": "An owned avatar to tokenize (its GLB becomes the NFT media)."
					},
					"glb_url": {
						"type": "string",
						"format": "uri",
						"description": "Or a GLB URL to tokenize (absolute http(s))."
					},
					"owner_wallet": {
						"type": "string",
						"description": "Recipient Solana wallet (base58). Defaults to your OAuth-linked wallet when omitted."
					},
					"name": {
						"type": "string",
						"maxLength": 200,
						"description": "Display name for the NFT."
					},
					"description": {
						"type": "string",
						"maxLength": 2000
					},
					"network": {
						"type": "string",
						"enum": [
							"devnet",
							"mainnet"
						],
						"default": "devnet",
						"description": "Cluster to mint on. Devnet by default; mainnet is a real mint."
					},
					"seller_fee_basis_points": {
						"type": "integer",
						"minimum": 0,
						"description": "Enforced secondary-sale royalty in basis points. Clamped to the ${…}% hard cap."
					},
					"royalty_recipient": {
						"type": "string",
						"description": "Wallet the royalty routes to (base58). Defaults to the owner."
					},
					"parent_mint": {
						"type": "string",
						"description": "Lineage: the asset this was remixed from (baked into provenance)."
					},
					"prompt": {
						"type": "string",
						"maxLength": 1000,
						"description": "Generation prompt (provenance)."
					},
					"generation_model": {
						"type": "string",
						"maxLength": 96
					},
					"generation_provider": {
						"type": "string",
						"maxLength": 64
					},
					"idempotency_key": {
						"type": "string",
						"maxLength": 128,
						"description": "Override the derived idempotency key to force-dedupe a specific request."
					}
				},
				"additionalProperties": false
			},
			"inputSchemaIsPartial": true,
			"source": "api/_mcp/tools/tokenize.js"
		},
		{
			"name": "optimize_model",
			"title": "Suggest optimizations for a glTF/GLB model",
			"description": "Inspect the model and return actionable suggestions for reducing size and draw-call overhead: triangle budget, Draco/Meshopt compression, oversized textures, KTX2 transcoding, non-indexed primitives, redundant materials, and more.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.05,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of a .glb or .gltf file."
					}
				},
				"required": [
					"url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/models.js"
		},
		{
			"name": "oracle_arm_watch",
			"title": "Arm agent Oracle watch",
			"description": "Arm your agent to automatically act on Oracle conviction signals. Once armed, the Oracle cron (every 2 min) will detect high-conviction launches that cross your floor and execute buys from your agent's custodial Solana wallet. Set mode='simulate' (default, safe) to log what it would have bought without spending. Set mode='live' to spend real SOL. The agent acts at most once per mint, per-trade SOL is capped, and you can disarm at any time by passing armed=false.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "Your agent UUID (from /api/agents or the dashboard)."
					},
					"armed": {
						"type": "boolean",
						"default": true,
						"description": "true to arm, false to disarm."
					},
					"mode": {
						"type": "string",
						"enum": [
							"simulate",
							"live"
						],
						"default": "simulate",
						"description": "simulate = no real spend (safe default). live = real SOL from agent's wallet."
					},
					"min_score": {
						"type": "integer",
						"minimum": 0,
						"maximum": 100,
						"default": 72,
						"description": "Conviction floor to act on (72 = strong+; 90 = prime only)."
					},
					"min_tier": {
						"type": "string",
						"enum": [
							"prime",
							"strong",
							"lean",
							"watch"
						],
						"description": "Alternative to min_score — acts on this tier and above."
					},
					"categories": {
						"type": "array",
						"items": {
							"type": "string"
						},
						"description": "Only act on coins in these narrative categories. Omit to act on all."
					},
					"per_trade_sol": {
						"type": "number",
						"minimum": 0.001,
						"maximum": 1,
						"default": 0.05,
						"description": "Max SOL per single trade (default 0.05). Ignored in simulate mode."
					},
					"max_daily_sol": {
						"type": "number",
						"minimum": 0,
						"maximum": 10,
						"default": 0.5,
						"description": "Daily SOL budget cap (default 0.5). The loop will not spend more in one day."
					},
					"max_open": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 10,
						"description": "Max simultaneous open positions (default 10)."
					},
					"require_smart_money": {
						"type": "boolean",
						"default": false,
						"description": "Only act when at least one proven smart-money wallet is in early."
					},
					"size_scaling": {
						"type": "boolean",
						"default": true,
						"description": "Scale position size with conviction (prime = full, strong = 75%, lean = 50%)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"agent_id"
				],
				"additionalProperties": false
			},
			"inputSchemaIsPartial": true,
			"source": "api/_mcp/tools/oracle.js"
		},
		{
			"name": "oracle_coin",
			"title": "Oracle verdict for one coin",
			"description": "Get Oracle's full conviction verdict for a specific pump.fun coin by mint address. Returns the fused 0–100 conviction score, tier (prime/strong/lean/watch/avoid), all four pillar scores (pedigree = who's behind it, structure = how it's built, narrative = cultural fit, momentum = early trading signal), active badges (e.g. smart_money_early, narrative_match), and a machine-readable buy/watch/skip recommendation. If the coin isn't in the Oracle cache yet, it will be scored on-demand (may add ~1s latency).",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string",
						"description": "SPL mint pubkey (base58) of the pump.fun coin."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"mint"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/oracle.js"
		},
		{
			"name": "oracle_top_plays",
			"title": "Oracle top conviction plays",
			"description": "Get the current top pump.fun launches ranked by Oracle conviction score. Each play includes a score (0–100), tier (prime/strong/lean/watch/avoid), four pillar scores (pedigree/structure/narrative/momentum), and an agent-ready recommendation with a suggested size_factor. Use this to decide which coins to buy before they move. Filter by min_score or category to narrow the signal.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 20,
						"default": 5,
						"description": "Number of plays to return (default 5, max 20)."
					},
					"min_score": {
						"type": "integer",
						"minimum": 0,
						"maximum": 100,
						"default": 72,
						"description": "Minimum conviction score (0–100). Default 72 (strong+)."
					},
					"category": {
						"type": "string",
						"description": "Filter by narrative category (optional)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"additionalProperties": false
			},
			"inputSchemaIsPartial": true,
			"source": "api/_mcp/tools/oracle.js"
		},
		{
			"name": "oracle_watch_status",
			"title": "Oracle watch status + track record",
			"description": "Check your agent's current Oracle watch configuration and its realized track record: win rate, PnL, ROI, plus the 10 most recent actions with their outcomes. Use this to verify the agent is armed correctly and to review its performance before scaling up.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "Your agent UUID."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"agent_id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/oracle.js"
		},
		{
			"name": "pumpfun_creator_intel",
			"title": "Pump.fun creator intel",
			"description": "Reputation profile for a pump.fun creator wallet: prior launches, graduation rate, claim activity, and behavioural trust signals.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"wallet": {
						"type": "string",
						"description": "Solana wallet pubkey (base58)."
					}
				},
				"required": [
					"wallet"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/pumpfun.js"
		},
		{
			"name": "pumpfun_recent_claims",
			"title": "Recent pump.fun claims",
			"description": "Fetch the most recent pump.fun GitHub social-fee claim events with full enrichment: GitHub profile, X/Twitter follower data, influencer tier, first-time-claim flag, fake-claim detection, and AI summary. Use to answer 'what's happening on pump.fun right now?'.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 10
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/pumpfun.js"
		},
		{
			"name": "pumpfun_recent_graduations",
			"title": "Recent pump.fun graduations",
			"description": "Tokens that recently graduated from the bonding curve to PumpAMM, with creator + holder analysis.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 10
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/pumpfun.js"
		},
		{
			"name": "pumpfun_token_intel",
			"title": "Pump.fun token intel",
			"description": "Full intel on a pump.fun token: graduation status, bonding-curve progress, creator profile, top holders, volume, bundle detection, and trust signals.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string",
						"description": "SPL mint pubkey (base58)."
					}
				},
				"required": [
					"mint"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/pumpfun.js"
		},
		{
			"name": "recall",
			"title": "Recall",
			"description": "Retrieve the most relevant memories for a query from one of your agents. Ranks by relevance to the query blended with salience and recency, excluding expired memories. Returns an ordered list.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid"
					},
					"query": {
						"type": "string",
						"minLength": 1,
						"maxLength": 1000
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 8
					},
					"type": {
						"type": "string",
						"enum": [
							"user",
							"feedback",
							"project",
							"reference"
						]
					}
				},
				"required": [
					"agent_id",
					"query"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/memory.js"
		},
		{
			"name": "register_agent",
			"title": "Register an agent on-chain",
			"description": "Mint one of your agents' on-chain digital identity. On Solana (chain:solana) this enrols the agent in the Metaplex Agent Registry server-custodially — three.ws signs and pays, your wallet never has to — and returns the Agent Identity PDA, registration URI, and explorer link. On Base (chain:base) ERC-8004 registration needs your browser wallet to sign, so this returns a prepared registration_json plus a continue_url to finish in the browser. Idempotent: an already-registered agent is returned as-is unless force:true. Requires a signed-in three.ws account.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "Your agent identity id (uuid)."
					},
					"chain": {
						"type": "string",
						"enum": [
							"solana",
							"base"
						],
						"default": "solana",
						"description": "Which chain to register on. solana = headless; base = ERC-8004 (needs your wallet)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"description": "Solana cluster (chain:solana only). Defaults to where the agent already lives, else the configured collection network."
					},
					"force": {
						"type": "boolean",
						"default": false,
						"description": "Re-run registration even if the agent is already registered (never double-mints)."
					}
				},
				"required": [
					"agent_id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/agents.js"
		},
		{
			"name": "remember",
			"title": "Remember",
			"description": "Store a long-term memory for one of your agents. Use for durable facts: who the user is (type=user), guidance/corrections (feedback), ongoing work (project), or external pointers (reference). Returns the stored memory.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid"
					},
					"content": {
						"type": "string",
						"minLength": 1,
						"maxLength": 4000
					},
					"type": {
						"type": "string",
						"enum": [
							"user",
							"feedback",
							"project",
							"reference"
						],
						"default": "reference"
					},
					"tags": {
						"type": "array",
						"items": {
							"type": "string",
							"maxLength": 100
						},
						"maxItems": 20
					},
					"context": {
						"type": "string",
						"maxLength": 2000,
						"description": "Optional freeform metadata about where this memory came from."
					},
					"salience": {
						"type": "number",
						"minimum": 0,
						"maximum": 1,
						"default": 0.5
					},
					"expires_at": {
						"type": "string",
						"format": "date-time",
						"description": "Optional ISO-8601 expiry; the memory is excluded from recall after this time."
					}
				},
				"required": [
					"agent_id",
					"content"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/memory.js"
		},
		{
			"name": "render_avatar",
			"title": "Render avatar",
			"description": "Produce an HTML <model-viewer> snippet that renders the given avatar. Return this text as an inline HTML artifact to display an interactive 3D avatar.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.005,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"id": {
						"type": "string",
						"format": "uuid"
					},
					"slug": {
						"type": "string"
					},
					"auto_rotate": {
						"type": "boolean",
						"default": true
					},
					"background": {
						"type": "string",
						"description": "CSS background color or gradient.",
						"default": "transparent"
					},
					"height": {
						"type": "string",
						"default": "480px"
					},
					"width": {
						"type": "string",
						"default": "100%"
					},
					"camera_orbit": {
						"type": "string",
						"description": "model-viewer camera-orbit value, e.g. \"0deg 80deg 2m\"."
					},
					"poster": {
						"type": "string",
						"description": "Optional poster image URL shown while loading."
					},
					"ar": {
						"type": "boolean",
						"default": true,
						"description": "Include AR button for mobile."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/avatars.js"
		},
		{
			"name": "render_avatar_image",
			"title": "Render an avatar to an image",
			"description": "Render a stored avatar to a real PNG/JPEG/WebP image (headless three.js) and return its URL — ready for an <img> tag, social card, or game loader. Choose a camera framing (scene), an optional pose preset and ARKit-52 expression. Renders are cached, so repeat calls with the same parameters return instantly. Works on your own avatars (any visibility) and on public avatars.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"avatar_id": {
						"type": "string",
						"format": "uuid",
						"description": "The avatar to render."
					},
					"scene": {
						"type": "string",
						"enum": [
							"full-body",
							"upper-body",
							"portrait",
							"headshot"
						],
						"default": "upper-body",
						"description": "Camera framing preset."
					},
					"pose": {
						"type": "string",
						"description": "Optional pose preset id (see pose_model / the render catalog)."
					},
					"expression": {
						"type": "object",
						"description": "Optional ARKit-52 morph map, e.g. {\"mouthSmile\":0.6}.",
						"additionalProperties": {
							"type": "number"
						}
					},
					"size": {
						"type": "integer",
						"minimum": 64,
						"maximum": 2048,
						"default": 512,
						"description": "Square pixel dimension."
					},
					"bg": {
						"type": "string",
						"default": "transparent",
						"description": "Background: a CSS color or \"transparent\"."
					},
					"format": {
						"type": "string",
						"enum": [
							"png",
							"jpeg",
							"webp"
						],
						"default": "png"
					}
				},
				"required": [
					"avatar_id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/avatars.js"
		},
		{
			"name": "search_public_avatars",
			"title": "Search public avatars",
			"description": "Search the public avatar gallery. Useful for finding characters to render without prior knowledge of an id.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.001,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"q": {
						"type": "string",
						"description": "Free-text search over name and description."
					},
					"tag": {
						"type": "string",
						"description": "Filter to one tag."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 12
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/avatars.js"
		},
		{
			"name": "sign_text",
			"title": "Sign text in ASL",
			"description": "Compile English text into one continuous American Sign Language performance for a 3D avatar. Words with a real sign are signed; everything else is fingerspelled, in the same clip. Returns the performed timeline (every word, whether it signed or spelled, the seconds it occupies, and where each spelled letter lands) plus a link that plays it on a live avatar. Set include_clip to also get the three.js AnimationClip document, keyed to the canonical humanoid skeleton, to retarget onto any rigged avatar and play.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"text": {
						"type": "string",
						"description": "The text to sign. Letters, digits and spaces are performed; punctuation is dropped."
					},
					"hand": {
						"type": "string",
						"enum": [
							"right",
							"left"
						],
						"default": "right",
						"description": "Dominant signing hand. The whole sign mirrors, not just the hand."
					},
					"speed": {
						"type": "number",
						"default": 1,
						"description": "Playback rate, 0.25–1.5. Below 1 is a signer taking longer over the same signs."
					},
					"max_seconds": {
						"type": "number",
						"default": 45,
						"description": "Cap the utterance length; longer text truncates at a word boundary and is flagged."
					},
					"include_clip": {
						"type": "boolean",
						"default": false,
						"description": "Include the full animation clip document. It is large (tens of thousands of numbers); leave it off and fetch clip_url when you need the bytes."
					}
				},
				"required": [
					"text"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/sign.js"
		},
		{
			"name": "solana_agent_attestations",
			"title": "List Solana agent attestations",
			"description": "List recent on-chain attestations about a Solana-registered agent (feedback, validation, task offers, acceptances, disputes). Backed by the three.ws indexer for sub-100ms reads. Each row includes verified/disputed/revoked flags. Public; no auth required.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"asset": {
						"type": "string"
					},
					"kind": {
						"type": "string",
						"enum": [
							"feedback",
							"validation",
							"task",
							"accept",
							"revoke",
							"dispute",
							"all"
						],
						"default": "all"
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "devnet"
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 200,
						"default": 50
					}
				},
				"required": [
					"asset"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/solana.js"
		},
		{
			"name": "solana_agent_passport",
			"title": "Get Solana agent passport",
			"description": "Full discovery card for a Solana agent: identity (Metaplex Core asset), owner wallet, reputation summary, latest validation result, and attestation schema endpoint. Equivalent to an ERC-8004 passport — use this when one tool call should answer \"who is this agent and can I trust them?\".",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"asset": {
						"type": "string"
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "devnet"
					}
				},
				"required": [
					"asset"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/solana.js"
		},
		{
			"name": "solana_agent_reputation",
			"title": "Get Solana agent reputation",
			"description": "Computed reputation summary for a Solana-registered three.ws agent. Returns total/verified feedback counts, score averages (raw + verified-only), validation pass/fail, task acceptance, and dispute counts. Verified score only includes feedback whose task was acknowledged on-chain by the agent owner. Priced at $0.001 USDC/call via x402 (pay-per-call; an OAuth bearer token bypasses payment).",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.001,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"asset": {
						"type": "string",
						"description": "Metaplex Core asset pubkey (the agent ID)"
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "devnet"
					}
				},
				"required": [
					"asset"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/solana.js"
		},
		{
			"name": "text_to_animation",
			"title": "Generate an animation from a text prompt and retarget it onto a model",
			"description": "Generate a brand-new motion from a natural-language prompt (e.g. \"waving confidently\", \"a slow tai-chi sweep\") with a motion-diffusion model, then retarget it onto a caller-supplied rigged humanoid GLB — the same retarget engine apply_animation uses. Returns the retargeted three.js AnimationClip JSON (or a baked animated GLB) plus a report. Unlike preset libraries, the motion does not pre-exist: it is synthesized for the prompt. Requires the text2motion worker configured on the deployment.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"minLength": 3,
						"maxLength": 1000,
						"description": "Describe the motion to generate (e.g. \"a celebratory jump\", \"waving hello\")."
					},
					"model_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of a rigged humanoid .glb to animate."
					},
					"duration_seconds": {
						"type": "number",
						"minimum": 1,
						"maximum": 10,
						"default": 4,
						"description": "Length of the generated motion in seconds."
					},
					"format": {
						"type": "string",
						"enum": [
							"glb",
							"clip"
						],
						"default": "clip",
						"description": "clip = retargeted AnimationClip JSON (reliable); glb = also attempt a baked animated GLB."
					},
					"speed": {
						"type": "number",
						"minimum": 0.25,
						"maximum": 2.5,
						"default": 1,
						"description": "Playback-speed multiplier baked into the result."
					}
				},
				"required": [
					"prompt",
					"model_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/animations.js"
		},
		{
			"name": "token_snapshot",
			"title": "Crypto token snapshot",
			"description": "One-call snapshot for a Solana token mint, fanning out to whichever free crypto-data providers are registered on this deployment (DexScreener pairs, Jupiter price, Solana RPC supply) and merging what answers — degrades gracefully around any provider that is absent, unconfigured, or fails, never throwing on a partial result. Example mint: the $THREE CA \"FeMbDoX7R1Psc4GEcvJdsbNbZA3bfztcyDCatJVJpump\". For pump.fun-specific bonding-curve / launch data use the pump_snapshot tool instead — this tool covers general market data.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string",
						"description": "Base58 Solana token mint address."
					}
				},
				"required": [
					"mint"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/crypto-data.js"
		},
		{
			"name": "trader_leaderboard",
			"title": "Top pump.fun traders",
			"description": "Get the top pump.fun traders on three.ws ranked by composite TraderScore (win rate + P&L + ROI + drawdown). Each row includes score (0–100), verified badge, closed trade count, win rate, realized P&L in SOL and USD, ROI %, max drawdown, and a 'recommendation' field: 'copy' = strong candidate, 'watch' = emerging, 'skip' = unproven. Use trader_profile to get full details before copying. Sort by 'score' (default), 'pnl', 'winrate', or 'roi'. Window: '24h', '7d', '30d' (default), or 'all'.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 10,
						"description": "Max rows to return (default 10, max 50)."
					},
					"sort": {
						"type": "string",
						"enum": [
							"score",
							"pnl",
							"winrate",
							"roi"
						],
						"default": "score",
						"description": "Ranking metric."
					},
					"window": {
						"type": "string",
						"enum": [
							"24h",
							"7d",
							"30d",
							"all"
						],
						"default": "30d",
						"description": "Time window for trade history."
					},
					"verified_only": {
						"type": "boolean",
						"default": false,
						"description": "Only return verified traders (12+ closed trades, 5+ unique coins, <40% churn)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/trader.js"
		},
		{
			"name": "trader_profile",
			"title": "Full track record for one agent",
			"description": "Get the full, verifiable track record for a specific pump.fun agent trader. Returns the composite TraderScore, all headline metrics (win rate, realized P&L, ROI, profit factor, max drawdown, average hold time), up to 10 recent closed trades with their on-chain Solscan links, and any open positions. Every number is traceable to its on-chain buy/sell transaction. Use this to vet an agent before calling copy_subscribe.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"description": "Agent UUID (from trader_leaderboard rows or /api/agents)."
					},
					"window": {
						"type": "string",
						"enum": [
							"24h",
							"7d",
							"30d",
							"all"
						],
						"default": "all",
						"description": "Time window for metrics (default all-time)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"agent_id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/trader.js"
		},
		{
			"name": "validate_model",
			"title": "Validate glTF/GLB model",
			"description": "Run the Khronos glTF-Validator against a remote GLB or glTF URL. Returns a structured report of errors, warnings, infos, and hints — the authoritative answer to \"is this file spec-compliant?\". SSRF-hardened: only public https URLs are fetched.",
			"server": {
				"id": "three.ws",
				"title": "three.ws",
				"endpoint": "/api/mcp",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.01,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of a .glb or .gltf file."
					},
					"max_issues": {
						"type": "integer",
						"minimum": 1,
						"maximum": 500,
						"default": 100
					}
				},
				"required": [
					"url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp/tools/models.js"
		},
		{
			"name": "anchor_provenance",
			"title": "Anchor a signed content credential for a 3D model",
			"description": "Issue a signed content credential for a generated 3D model (GLB) and anchor its hash on Solana, so anyone can later verify authenticity and tampering for free with verify_provenance. Records creator, prompt, model/provider, lineage, timestamp, and the GLB content hash. Real signature, real on-chain anchor.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.05,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glb_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the .glb to credential."
					},
					"creator": {
						"type": "string",
						"maxLength": 200,
						"description": "Creator identity (account or wallet) to record."
					},
					"prompt": {
						"type": "string",
						"maxLength": 1000,
						"description": "The generating prompt to record."
					},
					"model": {
						"type": "string",
						"maxLength": 120,
						"description": "The generation model (e.g. \"TRELLIS\")."
					},
					"provider": {
						"type": "string",
						"maxLength": 120,
						"description": "The generation provider (e.g. \"nvidia\")."
					},
					"asset_id": {
						"type": "string",
						"maxLength": 200,
						"description": "Optional platform asset id."
					},
					"lineage": {
						"type": "array",
						"items": {
							"type": "string"
						},
						"description": "Optional parent lineage (content hashes or asset ids)."
					},
					"network": {
						"type": "string",
						"enum": [
							"devnet",
							"mainnet"
						],
						"description": "Anchor cluster (default devnet)."
					}
				},
				"additionalProperties": false,
				"required": [
					"glb_url"
				]
			},
			"source": "api/_mcp3d/tools/provenance.js"
		},
		{
			"name": "auto_rig_model",
			"title": "Auto-rig a static 3D model (skeleton + skin weights)",
			"description": "Turn a static GLB mesh into an animation-ready character: adds a humanoid skeleton and per-vertex skin weights via the three.ws rig pipeline. Pairs with text_to_3d / image_to_3d — generate a mesh, then rig it, then drive it with apply_animation or pose_model. Returns a job_id; poll generation_status for the rigged GLB.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.05,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glb_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the static GLB mesh to rig."
					}
				},
				"required": [
					"glb_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "capture_scene",
			"title": "Reconstruct a 3D scene from a video",
			"description": "Turn a video of a real space (a room, a street, an object walkaround) into an explorable 3D point cloud. A feed-forward streaming reconstructor (LingBot-Map) grounds coordinates, reads dense geometry, and corrects drift across the whole clip, then returns a coloured .ply point cloud. Pass a public https video URL (mp4/mov/webm). Returns a job_id — poll generation_status; when finished it returns the point-cloud URL and an inline viewer artifact. Best with steady, well-lit footage that orbits or walks through the space. This is geometry capture of a REAL scene — distinct from text_to_3d/image_to_3d, which synthesize a single object mesh.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.05,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"video_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the source video (mp4, mov, or webm)."
					},
					"mode": {
						"type": "string",
						"enum": [
							"streaming",
							"windowed"
						],
						"default": "streaming",
						"description": "streaming = default; windowed = for very long clips (>3000 frames)."
					},
					"fps": {
						"type": "integer",
						"minimum": 1,
						"maximum": 30,
						"default": 8,
						"description": "Frames per second to sample from the video."
					},
					"keyframe_interval": {
						"type": "integer",
						"minimum": 1,
						"maximum": 64,
						"default": 4,
						"description": "Cache every N-th frame as a keyframe — lower is denser/slower."
					},
					"mask_sky": {
						"type": "boolean",
						"default": true,
						"description": "Drop sky points from the reconstruction."
					},
					"max_points": {
						"type": "integer",
						"minimum": 50000,
						"maximum": 3000000,
						"default": 1500000,
						"description": "Cap on the total points in the output cloud."
					}
				},
				"required": [
					"video_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "create_agent_persona",
			"title": "Mint a persistent, living agent persona from a rigged GLB",
			"description": "Turn a generated GLB into a NAMED, persistent agent body — a \"persona\" the agent reuses across turns and across sessions. The mesh is copied into durable storage so the body survives the provider URL expiring, then registered under a stable persona_id. The returned text/html resource renders the LIVING body inline: it idles between turns, and persona_say makes it lip-sync and emote a reply. The persona_id is the capability — keep it and pass it to get_agent_persona or persona_say later to bring the exact same body back. No sign-in required.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glb_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the rigged GLB to embody (e.g. from generation_status)."
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 80,
						"description": "A display name for the persona, 1–80 characters."
					},
					"voice": {
						"type": "string",
						"maxLength": 64,
						"description": "Optional voice id/name to speak with (used for TTS-driven lip-sync when available)."
					},
					"source_prompt": {
						"type": "string",
						"maxLength": 1000,
						"description": "Optional: the prompt that generated this body, kept as provenance."
					}
				},
				"required": [
					"glb_url",
					"name"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "direct_prompt",
			"title": "Optimize a rough idea into a 3D-generation prompt (IBM Granite)",
			"description": "Rewrite a rough idea into an optimized text_to_3d prompt using IBM Granite. Returns one clean single-subject description plus structured directives (subject, style, materials, colors, detail) that produce cleaner meshes. Run before text_to_3d when a prompt is vague, conflicting, or multi-subject. Requires IBM watsonx.ai credentials on the server.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.01,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"idea": {
						"type": "string",
						"minLength": 1,
						"maxLength": 2000,
						"description": "The rough idea or prompt to optimize, e.g. \"some kind of cool dragon thing\"."
					},
					"style": {
						"type": "string",
						"maxLength": 200,
						"description": "Optional style hint, e.g. \"low-poly\", \"realistic\", \"stylized PBR\"."
					}
				},
				"required": [
					"idea"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "export_ar",
			"title": "Export a model for AR (\"View in your space\")",
			"description": "Turn a generated 3D model (GLB URL) into a one-tap \"View in your space\" AR experience. Returns a device-aware AR launch link (iOS Quick Look, Android Scene Viewer, desktop WebGL — branched on the viewer's device), the interactive viewer link, and a conformant Spatial MCP artifact with the AR handoff populated. Use it after generating a model so the user can place it on their desk through their phone. For a rigged avatar (an agent's body) pass kind:\"avatar\": the response then also carries irlUrl, a living-agent link that walks, animates, and talks with the user through their camera in their real room.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glb_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of a .glb (or .gltf) model to export for AR."
					},
					"title": {
						"type": "string",
						"maxLength": 120,
						"description": "Optional name shown in the AR/viewer experience."
					},
					"kind": {
						"type": "string",
						"enum": [
							"model",
							"avatar"
						],
						"description": "What the GLB is. \"avatar\" (a rigged agent body) adds the IRL living-agent link (irlUrl) and makes the AR launch page lead with it. Default \"model\"."
					}
				},
				"additionalProperties": false,
				"required": [
					"glb_url"
				]
			},
			"source": "api/_mcp3d/tools/ar.js"
		},
		{
			"name": "generate_material",
			"title": "Generate a glTF PBR material from a description (IBM Granite)",
			"description": "Generate a physically-based (PBR) glTF 2.0 material from a text description using IBM Granite — base color, metallic, roughness, and emissive factors. Returns a pbrMetallicRoughness material object you can attach to a generated mesh. Requires IBM watsonx.ai credentials on the server.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.01,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"description": {
						"type": "string",
						"minLength": 3,
						"maxLength": 500,
						"description": "Material to describe, e.g. \"worn copper, scratched, slightly oxidized\"."
					},
					"name": {
						"type": "string",
						"maxLength": 100,
						"description": "Optional material name."
					}
				},
				"required": [
					"description"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "generation_status",
			"title": "Check a 3D generation job",
			"description": "Poll a text_to_3d or image_to_3d job by its job_id. While running it reports the status; when finished it returns the GLB download URL and an inline <model-viewer> artifact — display that text/html resource as an interactive 3D artifact.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"job_id": {
						"type": "string",
						"minLength": 1,
						"maxLength": 200,
						"description": "The job_id returned by text_to_3d or image_to_3d."
					}
				},
				"required": [
					"job_id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "get_agent_persona",
			"title": "Reload a persisted persona by id (continuity across sessions)",
			"description": "Bring back a previously minted persona by its persona_id — the SAME body and identity, in a fresh session. Returns the persona name, its GLB, accumulated turn count, and the inline living-body artifact. Use this at the start of a conversation when the user returns to a named agent.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"persona_id": {
						"type": "string",
						"minLength": 8,
						"maxLength": 64,
						"description": "The persona_id returned by create_agent_persona."
					}
				},
				"required": [
					"persona_id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "image_to_3d",
			"title": "Reconstruct a 3D model from one or more images",
			"description": "Reconstruct a textured 3D model (GLB) from a reference image using the three.ws image engine. Pass a single image_url, or image_urls (2–4 views of the SAME object from different angles — front/back/left/right) for multi-view reconstruction, which removes the back-of-object hallucination of single-image reconstruction. Returns a job_id to poll with generation_status, plus how many views were fused and which engine handled it. The cleaner the inputs — one subject, plain background, even lighting — the better the mesh.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.15,
				"free": false,
				"tiers": [
					{
						"id": "draft",
						"usd": 0.05
					},
					{
						"id": "standard",
						"usd": 0.15
					},
					{
						"id": "high",
						"usd": 0.5
					}
				]
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"image_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the reference image (PNG/JPG/WebP). Use image_urls for multi-view."
					},
					"image_urls": {
						"type": "array",
						"items": {
							"type": "string",
							"format": "uri"
						},
						"minItems": 1,
						"maxItems": 4,
						"description": "1–4 public https URLs of the same object from different angles. Takes precedence over image_url; >1 enables multi-view reconstruction."
					},
					"prompt": {
						"type": "string",
						"maxLength": 1000,
						"description": "Optional text hint passed to the reconstruction model."
					},
					"tier": {
						"type": "string",
						"enum": [
							"draft",
							"standard",
							"high"
						],
						"default": "standard",
						"description": "Quality tier: draft (~12k poly, fast), standard (~30k, balanced), high (~200k + PBR, slower). Honoured by the poly-aware engines (the geometry, sculpt, and detail engines); the default image engine records it as provenance."
					},
					"path": {
						"type": "string",
						"enum": [
							"image",
							"geometry",
							"sketch"
						],
						"default": "image",
						"description": "Generation path: \"image\" (reference-image reconstruction on the platform-keyed image engine, the default) or \"geometry\" (native text/image→mesh on a geometry engine — cleaner topology, but bring-your-own-key: needs your own provider key)."
					},
					"backend": {
						"type": "string",
						"default": "auto",
						"description": "three.ws generation engine. \"auto\" (default) lets the platform pick the best engine for the chosen path and tier. Override with: three-image (image-reconstruction), three-geometry or three-geometry-pro (native text/image→mesh, clean quad topology), three-sculpt (high-poly detail), three-instant (fast single-image), three-sketch (sketch→mesh). An engine that does not serve the chosen path is ignored."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "persona_identity",
			"title": "Read a persona's on-chain identity — wallet, reputation, holdings",
			"description": "Read a persona's real on-chain identity: its deterministic Solana wallet address, live SOL/USDC balance, ERC-8004-style reputation (verified feedback + validation record), token holdings, and a resolved SNS nameplate if it holds a verified .sol name. Also returns the visual tiers (reputation tier, holdings tier, muted-balance flag, verified name) the embodiment viewer maps onto the body — aura, cosmetic, muted state, nameplate. Every persona has a wallet the moment it exists; a fresh persona legitimately reads as zero balance / unranked reputation until it is funded or interacted with. No sign-in required.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"persona_id": {
						"type": "string",
						"minLength": 8,
						"maxLength": 64,
						"description": "The persona to read."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"persona_id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/persona-identity.js"
		},
		{
			"name": "persona_say",
			"title": "Speak a reply through a persona — lip-sync + emotion + gesture",
			"description": "Make a persona PERFORM a reply: the body lip-syncs the text and shows the matching expression and body gesture. Pass the persona_id and the exact text the agent is saying this turn; the emotion is detected from the text automatically (or override it). The returned text/html resource animates the body for this turn — display it alongside the spoken reply. This is the turn-by-turn embodiment hook.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"persona_id": {
						"type": "string",
						"minLength": 8,
						"maxLength": 64,
						"description": "The persona to speak through."
					},
					"text": {
						"type": "string",
						"minLength": 1,
						"maxLength": 2000,
						"description": "The reply text the agent is saying this turn — drives lip-sync and emotion."
					},
					"emotion": {
						"type": "string",
						"enum": [
							"neutral",
							"joy",
							"sad",
							"angry",
							"surprised",
							"thinking"
						],
						"description": "Optional explicit emotion override; omit to auto-detect from the text."
					}
				},
				"required": [
					"persona_id",
					"text"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "persona_send",
			"title": "Send USDC from a persona's own wallet",
			"description": "Send USDC FROM a persona's own wallet to a destination Solana address — the general-purpose value op behind persona-initiated payments (settling a hire, paying an invoice, funding another wallet). Real, irreversible on-chain settlement, hard-capped at $${…}/call and $${…} cumulative per session. Amounts over $${…} require confirm:true. USDC is the only settlement asset here — any other mint is out of scope for this tool.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"persona_id": {
						"type": "string",
						"minLength": 8,
						"maxLength": 64,
						"description": "The persona whose wallet pays."
					},
					"to": {
						"type": "string",
						"minLength": 32,
						"maxLength": 64,
						"description": "Destination Solana address (USDC associated token account is created if needed)."
					},
					"usdc": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Amount in USDC. Hard per-call cap: $${…}."
					},
					"session_id": {
						"type": "string",
						"maxLength": 128,
						"description": "Groups calls under one cumulative session spend cap (default $${…}). Omit to bucket by persona + UTC day."
					},
					"memo": {
						"type": "string",
						"maxLength": 180,
						"description": "Optional note stamped alongside the transfer in the returned receipt."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					},
					"confirm": {
						"type": "boolean",
						"description": "Must be true when usdc exceeds $${…} — the irreversible-transfer confirmation gate."
					}
				},
				"required": [
					"persona_id",
					"to",
					"usdc"
				],
				"additionalProperties": false
			},
			"inputSchemaIsPartial": true,
			"source": "api/_mcp3d/tools/persona-identity.js"
		},
		{
			"name": "persona_tip",
			"title": "Tip USDC from a persona's own wallet",
			"description": "Send a small USDC tip FROM a persona's own wallet to a destination Solana address — e.g. tipping another agent for a good answer or hiring result. Real, irreversible on-chain settlement, hard-capped at $${…}/call and $${…} cumulative per session. Amounts over $${…} require confirm:true. Fails cleanly with the exact reason (insufficient balance, over cap, confirmation required) — never a silent no-op.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"persona_id": {
						"type": "string",
						"minLength": 8,
						"maxLength": 64,
						"description": "The persona whose wallet pays."
					},
					"to": {
						"type": "string",
						"minLength": 32,
						"maxLength": 64,
						"description": "Destination Solana address (USDC associated token account is created if needed)."
					},
					"usdc": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Amount in USDC. Hard per-call cap: $${…}."
					},
					"session_id": {
						"type": "string",
						"maxLength": 128,
						"description": "Groups calls under one cumulative session spend cap (default $${…}). Omit to bucket by persona + UTC day."
					},
					"memo": {
						"type": "string",
						"maxLength": 180,
						"description": "Optional note stamped alongside the transfer in the returned receipt."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					},
					"confirm": {
						"type": "boolean",
						"description": "Must be true when usdc exceeds $${…} — the irreversible-transfer confirmation gate."
					}
				},
				"required": [
					"persona_id",
					"to",
					"usdc"
				],
				"additionalProperties": false
			},
			"inputSchemaIsPartial": true,
			"source": "api/_mcp3d/tools/persona-identity.js"
		},
		{
			"name": "pose_model",
			"title": "Resolve a text prompt to a pose-studio seed + joint rotations",
			"description": "Map a natural-language pose description to a deterministic pose-studio seed and the full Euler joint-rotation map for the three.ws humanoid mannequin, picked from the in-repo preset library. Returns the preset id, the complete pose (radians per joint), a stable seed, and a previewUrl on three.ws/pose. Deterministic and free — the same prompt always yields the same pose. Pair with auto_rig_model to pose a rigged character.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0.01,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"minLength": 1,
						"maxLength": 500,
						"description": "Pose description, e.g. \"warrior stance\", \"wave hello\", \"sitting cross-legged\"."
					}
				},
				"required": [
					"prompt"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "preview_3d",
			"title": "Preview any GLB as an interactive 3D artifact",
			"description": "Render any public GLB URL as an inline <model-viewer> HTML artifact — orbit controls, AR on mobile, auto-rotate. Display the returned text/html resource as an inline 3D artifact. Use it to view a generated model, or any GLB on the web.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glb_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of a .glb file."
					},
					"auto_rotate": {
						"type": "boolean",
						"default": true
					},
					"ar": {
						"type": "boolean",
						"default": true
					},
					"background": {
						"type": "string",
						"default": "transparent",
						"description": "CSS background color or gradient."
					},
					"height": {
						"type": "string",
						"default": "480px"
					},
					"width": {
						"type": "string",
						"default": "100%"
					},
					"camera_orbit": {
						"type": "string",
						"description": "model-viewer camera-orbit value, e.g. \"0deg 80deg 2m\"."
					}
				},
				"required": [
					"glb_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "remesh_model",
			"title": "Remesh, simplify, repair, or convert a 3D model",
			"description": "Process an existing GLB/OBJ/STL/PLY mesh: fix holes and degenerate geometry, reduce face count via quadric decimation, or convert to a different format (including FBX with skeleton for Unity/Unreal — a convert of a rigged GLB keeps its bones, skin weights, and blendshapes). Returns a clean GLB (or the requested format) job_id to poll with generation_status.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.02,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mesh_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the source mesh (GLB/OBJ/FBX/STL/PLY)."
					},
					"operation": {
						"type": "string",
						"enum": [
							"full",
							"simplify",
							"repair",
							"convert"
						],
						"default": "full",
						"description": "full = repair + simplify; simplify = face reduction only; repair = hole-fill + normal fix; convert = format change only."
					},
					"target_faces": {
						"type": "integer",
						"minimum": 1000,
						"maximum": 500000,
						"default": 50000,
						"description": "Target polygon count for simplification."
					},
					"output_format": {
						"type": "string",
						"enum": [
							"glb",
							"obj",
							"stl",
							"ply",
							"usdz",
							"3mf",
							"fbx"
						],
						"default": "glb",
						"description": "Target format. fbx + operation=convert preserves a rigged GLB's skeleton, skin weights, and blendshapes (for Unity/Unreal); other operations produce a static fbx."
					}
				},
				"required": [
					"mesh_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "remove_background",
			"title": "Remove the background from an image",
			"description": "Strip the background from a photo or illustration with the three.ws background-removal engine. Returns a PNG with a transparent background — useful for preparing clean inputs before image_to_3d reconstruction.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.01,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"image_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the source image (PNG/JPG/WebP)."
					},
					"model": {
						"type": "string",
						"enum": [
							"rmbg2",
							"u2net",
							"isnet",
							"u2net_human_seg",
							"silueta"
						],
						"default": "rmbg2",
						"description": "Background removal model. rmbg2 is highest quality; u2net_human_seg is optimised for people."
					}
				},
				"required": [
					"image_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "retexture_model",
			"title": "Paint a new texture onto a 3D model from a text prompt",
			"description": "Generate a fresh texture for an untextured or poorly-textured GLB with the three.ws depth-guided multi-view texturing engine. Renders the mesh from 8 viewpoints, generates coherent texture views guided by your prompt, and back-projects them onto the UV atlas. Returns a job_id to poll with generation_status.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.05,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mesh_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the source GLB mesh."
					},
					"prompt": {
						"type": "string",
						"minLength": 3,
						"maxLength": 500,
						"description": "Texture description, e.g. \"worn leather armour, dark brown, scratched metal buckles\"."
					},
					"negative_prompt": {
						"type": "string",
						"maxLength": 200,
						"default": "blurry, low quality, distorted, watermark"
					},
					"num_views": {
						"type": "integer",
						"enum": [
							4,
							8
						],
						"default": 8,
						"description": "4 = faster; 8 = better coverage."
					},
					"texture_size": {
						"type": "integer",
						"enum": [
							512,
							1024,
							2048
						],
						"default": 1024
					},
					"material_class": {
						"type": "string",
						"enum": [
							"person",
							"metal",
							"wood",
							"fabric",
							"plastic",
							"glass"
						],
						"description": "Optional. Bakes measured real-world roughness/metallic values for this material family instead of a flat guess, and nudges the prompt with material-appropriate descriptors (e.g. \"metal\" adds brushed-metal micro-detail cues)."
					}
				},
				"required": [
					"mesh_url",
					"prompt"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "retexture_region",
			"title": "Repaint one masked region of a model's texture (magic brush)",
			"description": "Surgically repaint ONLY a region of an existing texture from a prompt and/or colour, leaving the rest of the surface untouched and feathering the seam so the edit is invisible. Real UV-space texture inpainting — fix a seam, recolour one panel, add a logo to a chest plate. Supply mask_url: a UV-space mask PNG in the model's own UV layout where WHITE marks the area to repaint and black is preserved. Safe to run repeatedly — chain passes by feeding the previous result GLB back in as mesh_url. Returns a job_id to poll with generation_status.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.05,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mesh_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the textured GLB to edit."
					},
					"mask_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the UV-space mask PNG (white = repaint, black = keep), in the same UV layout as the mesh."
					},
					"prompt": {
						"type": "string",
						"maxLength": 500,
						"description": "What to paint into the masked region, e.g. \"weathered copper plate\"."
					},
					"color": {
						"type": "string",
						"pattern": "^#?[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$",
						"description": "Optional target colour as a hex value, e.g. \"#1e90ff\"."
					},
					"negative_prompt": {
						"type": "string",
						"maxLength": 300,
						"default": "blurry, low quality, distorted, watermark, seam"
					},
					"texture_size": {
						"type": "integer",
						"enum": [
							512,
							1024,
							2048
						],
						"default": 1024
					},
					"strength": {
						"type": "number",
						"minimum": 0.2,
						"maximum": 1,
						"default": 0.85,
						"description": "How aggressively to regenerate the region (higher = more change)."
					},
					"feather": {
						"type": "integer",
						"minimum": 1,
						"maximum": 128,
						"default": 24,
						"description": "Seam feather radius in atlas pixels — larger blends softer."
					}
				},
				"required": [
					"mesh_url",
					"mask_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "save_avatar",
			"title": "Save a generated GLB as a durable, named avatar",
			"description": "Persist a generated GLB (e.g. the glb_url returned by generation_status) as a durable avatar in your three.ws library. The mesh is copied into our own storage so it survives the provider URL expiring, then registered as a named avatar you own. Returns avatar_id, slug, model_url, and a view_url. This is the bridge from the studio to the avatar system: after saving, get_avatar, render_avatar_image, embeds, and on-chain identity all work on the result. Requires you to be signed in.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glb_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the GLB to save (e.g. from generation_status)."
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 80,
						"description": "A name for the avatar, 1–80 characters."
					},
					"visibility": {
						"type": "string",
						"enum": [
							"public",
							"unlisted",
							"private"
						],
						"default": "unlisted",
						"description": "public = listed in the gallery; unlisted = anyone with the link; private = only you."
					},
					"source_prompt": {
						"type": "string",
						"maxLength": 1000,
						"description": "Optional: the prompt that generated this model, kept as provenance."
					},
					"tags": {
						"type": "array",
						"items": {
							"type": "string",
							"minLength": 1,
							"maxLength": 40
						},
						"maxItems": 20,
						"description": "Optional tags for organizing and searching your library."
					}
				},
				"required": [
					"glb_url",
					"name"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "segment_model",
			"title": "Split a 3D model into named, separable parts",
			"description": "Segment a GLB/OBJ/STL/PLY mesh into meaningful parts with clean boundaries — head/torso/limbs on a character, body/wheels on a vehicle. Splits at physically disconnected shells and at concave creases (the minima rule), then names each part by region and tints it a distinct colour. Returns a GLB whose nodes ARE the parts (so each can be hidden, recoloured, replaced, or exported on its own) plus a parts manifest. Poll with generation_status; the result lists every part with its id, name, face count, and colour. Pass only_part to export a single part on its own.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.02,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mesh_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the source mesh (GLB/OBJ/FBX/STL/PLY)."
					},
					"method": {
						"type": "string",
						"enum": [
							"auto",
							"connected",
							"crease"
						],
						"default": "auto",
						"description": "auto = disconnected shells + concave-crease splitting inside each shell (best); connected = split only at disconnected shells; crease = minima-rule crease splitting over the whole mesh."
					},
					"max_parts": {
						"type": "integer",
						"minimum": 2,
						"maximum": 64,
						"default": 24,
						"description": "Upper bound on parts. Smaller fragments are merged into neighbours until the count fits."
					},
					"min_part_faces": {
						"type": "integer",
						"minimum": 4,
						"maximum": 100000,
						"default": 64,
						"description": "Parts smaller than this many faces are merged into their largest neighbour."
					},
					"crease_angle": {
						"type": "number",
						"minimum": 5,
						"maximum": 170,
						"default": 40,
						"description": "Dihedral angle (degrees) above which a concave edge is treated as a part boundary. Lower = more parts."
					},
					"only_part": {
						"type": "string",
						"maxLength": 64,
						"description": "Optional: export just this part by id (\"part_03\") or name (\"upper-left\"). Run once without it to discover part ids."
					}
				},
				"required": [
					"mesh_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "stylize_model",
			"title": "Apply a one-click geometric stylization filter to a 3D model",
			"description": "Transform any GLB/OBJ/STL/PLY mesh into a stylized variant with a single geometry pass — no model inference, fast and cheap. Styles: \"voxel\" (blocky cubes on a grid), \"brick\" (voxels + studs, LEGO-like), \"voronoi\" (open strut-and-node lattice shell), \"lowpoly\" (decimated + hard flat-shaded facets). Source color is preserved where the style allows. Returns a job_id to poll with generation_status; typically completes in 10–40 seconds.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.02,
				"free": false
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mesh_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the source mesh (GLB/OBJ/FBX/STL/PLY)."
					},
					"style": {
						"type": "string",
						"enum": [
							"voxel",
							"brick",
							"voronoi",
							"lowpoly"
						],
						"default": "voxel",
						"description": "voxel = blocky cubes; brick = voxels + studs (LEGO-like); voronoi = open lattice shell; lowpoly = faceted flat-shaded."
					},
					"resolution": {
						"type": "integer",
						"minimum": 8,
						"maximum": 120,
						"description": "Style-specific density (clamped per style): voxel/brick = grid resolution, voronoi = cell density, lowpoly = detail level. Omit for a sensible per-style default."
					},
					"output_format": {
						"type": "string",
						"enum": [
							"glb",
							"obj",
							"stl",
							"ply"
						],
						"default": "glb"
					}
				},
				"required": [
					"mesh_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "text_to_3d",
			"title": "Generate a 3D model from a text prompt",
			"description": "Turn a text description into a textured 3D model (GLB). Runs a fast text-to-image pass, then reconstructs a mesh from that image with the three.ws image engine. Returns a job_id (poll with generation_status) plus the intermediate preview image. Best results: a single, clearly described object — \"a worn leather armchair\", \"a low-poly red fox\", \"a sci-fi helmet\".",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0.15,
				"free": false,
				"tiers": [
					{
						"id": "draft",
						"usd": 0.05
					},
					{
						"id": "standard",
						"usd": 0.15
					},
					{
						"id": "high",
						"usd": 0.5
					}
				]
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"minLength": 3,
						"maxLength": 1000,
						"description": "What to generate. Describe one subject clearly."
					},
					"aspect_ratio": {
						"type": "string",
						"enum": [
							"1:1",
							"4:3",
							"3:4",
							"16:9",
							"9:16"
						],
						"default": "1:1",
						"description": "Aspect ratio of the intermediate reference image (image path only)."
					},
					"tier": {
						"type": "string",
						"enum": [
							"draft",
							"standard",
							"high"
						],
						"default": "standard",
						"description": "Quality tier: draft (~12k poly, fast), standard (~30k, balanced), high (~200k + PBR, slower). Honoured by the poly-aware engines (the geometry, sculpt, and detail engines); the default image engine records it as provenance."
					},
					"path": {
						"type": "string",
						"enum": [
							"image",
							"geometry",
							"sketch"
						],
						"default": "image",
						"description": "Generation path: \"image\" (reference-image reconstruction on the platform-keyed image engine, the default) or \"geometry\" (native text/image→mesh on a geometry engine — cleaner topology, but bring-your-own-key: needs your own provider key)."
					},
					"backend": {
						"type": "string",
						"default": "auto",
						"description": "three.ws generation engine. \"auto\" (default) lets the platform pick the best engine for the chosen path and tier. Override with: three-image (image-reconstruction), three-geometry or three-geometry-pro (native text/image→mesh, clean quad topology), three-sculpt (high-poly detail), three-instant (fast single-image), three-sketch (sketch→mesh). An engine that does not serve the chosen path is ignored."
					}
				},
				"required": [
					"prompt"
				],
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/studio.js"
		},
		{
			"name": "validate_spatial_response",
			"title": "Validate a Spatial MCP 3D artifact",
			"description": "Check whether a structured-content payload conforms to the open Spatial MCP artifact shape — the standard for returning a live, interactive 3D scene as a first-class MCP tool result (scene GLB, camera, environment, animation, AR handoff, interaction affordances). Returns valid/invalid plus actionable errors and warnings (each naming the field and the fix), not just a boolean. Spec version ${…}. Use it to conform a third-party 3D tool result to the shape so any Spatial-MCP renderer can display it.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"artifact": {
						"type": "object",
						"description": "The Spatial MCP artifact to validate (the structuredContent a 3D tool returns, or one you are building)."
					}
				},
				"additionalProperties": false,
				"required": [
					"artifact"
				]
			},
			"source": "api/_mcp3d/tools/spatial.js"
		},
		{
			"name": "verify_provenance",
			"title": "Verify a 3D model authenticity (content credential)",
			"description": "Verify whether a 3D model (GLB) carries a genuine three.ws content credential and was not tampered with. Recomputes the model’s content hash, checks the signed credential and its on-chain anchor, and returns verified, tampered, or unknown — with who created it, from what prompt, by which model, and when. Free and public: no account, no payment. Pass glb_url (an https .glb) or a known content hash.",
			"server": {
				"id": "threews-3d-studio",
				"title": "3D Studio",
				"endpoint": "/api/mcp-3d",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glb_url": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the .glb to verify."
					},
					"hash": {
						"type": "string",
						"description": "A known 64-char hex sha256 of the GLB (alternative to glb_url)."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp3d/tools/provenance.js"
		},
		{
			"name": "check_job",
			"title": "Check a pending 3D generation",
			"description": "Check on a 3D generation that returned status \"pending\" and collect the finished model. Pass the job_id from the pending result. While it is still rendering you get updated timing; call again after the suggested wait. When it is done the model renders inline in the interactive 3D viewer.",
			"server": {
				"id": "threews-3d-studio-free",
				"title": "3D Studio (free)",
				"endpoint": "/api/mcp-studio",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"job_id": {
						"type": "string",
						"minLength": 8,
						"maxLength": 4096,
						"description": "The job_id (or jobId) a pending generation returned."
					}
				},
				"additionalProperties": false,
				"required": [
					"job_id"
				]
			},
			"source": "api/_mcp-studio/tools.js"
		},
		{
			"name": "forge_avatar",
			"title": "Generate a rigged, animation-ready avatar",
			"description": "Generate a rigged, animation-ready 3D avatar (GLB) from a single text prompt or a reference image — in one step. Generates the mesh, then auto-rigs it with a humanoid skeleton so it is ready to pose and animate. Best for characters; objects are steered to the mesh generator. Renders inline in an interactive 3D viewer.",
			"server": {
				"id": "threews-3d-studio-free",
				"title": "3D Studio (free)",
				"endpoint": "/api/mcp-studio",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"maxLength": 1000,
						"description": "Description of the character/avatar to generate."
					},
					"image_url": {
						"type": "string",
						"format": "uri",
						"description": "Optional http(s) URL to a reference image to reconstruct in 3D."
					},
					"allow_non_humanoid": {
						"type": "boolean",
						"description": "Set true to rig a non-humanoid subject anyway (rigging assumes a humanoid figure)."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp-studio/tools.js"
		},
		{
			"name": "forge_free",
			"title": "Generate a 3D model from text",
			"description": "Turn a text prompt into a textured, downloadable 3D model (GLB) — free. Describe a single object, character, or creature; the studio generates an interactive model you can rotate, view, and download. Optional quality tier (draft, standard, high); high is slower and may fall back to standard under load. Renders inline in an interactive 3D viewer.",
			"server": {
				"id": "threews-3d-studio-free",
				"title": "3D Studio (free)",
				"endpoint": "/api/mcp-studio",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"minLength": 3,
						"maxLength": 1000,
						"description": "Description of the single object or character to model, e.g. \"a friendly round robot mascot, glossy white plastic\"."
					},
					"tier": {
						"type": "string",
						"enum": [
							"draft",
							"standard",
							"high"
						],
						"description": "Detail level: draft (fastest), standard (default), or high (best, slower; may fall back to standard under load)."
					}
				},
				"additionalProperties": false,
				"required": [
					"prompt"
				]
			},
			"source": "api/_mcp-studio/tools.js"
		},
		{
			"name": "mesh_forge",
			"title": "Generate a 3D mesh (art-directed)",
			"description": "Generate a textured 3D mesh (GLB) from a text prompt or a reference image URL. In text mode an AI art-director first refines your prompt into an optimized single-subject spec for higher mesh quality. Renders inline in an interactive 3D viewer.",
			"server": {
				"id": "threews-3d-studio-free",
				"title": "3D Studio (free)",
				"endpoint": "/api/mcp-studio",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"maxLength": 1000,
						"description": "Description of the single object to model."
					},
					"image_url": {
						"type": "string",
						"format": "uri",
						"description": "Optional http(s) URL to a reference image to reconstruct directly."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp-studio/tools.js"
		},
		{
			"name": "refine_model",
			"title": "Refine a 3D model by describing a change",
			"description": "Iterate on a model you already generated — just describe the change in words (\"make it metallic\", \"bigger helmet\", \"add wings\"). The studio re-generates a new version anchored to the previous one, carrying its form and materials forward. Pass the previous model's glb_url and, when you have it, the prompt that made it (parent_prompt) so the change builds on it. Each refinement is recorded as a new version in a lineage you can revert to or branch from — the returned lineage drives a version strip in the viewer. Renders the new version inline in the interactive 3D viewer.",
			"server": {
				"id": "threews-3d-studio-free",
				"title": "3D Studio (free)",
				"endpoint": "/api/mcp-studio",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glb_url": {
						"type": "string",
						"format": "uri",
						"description": "http(s) URL of the model to refine (e.g. the glbUrl a previous generation returned)."
					},
					"instruction": {
						"type": "string",
						"minLength": 1,
						"maxLength": 500,
						"description": "The change to make, in plain language: \"make it metallic\", \"bigger helmet\", \"add a cape\"."
					},
					"parent_prompt": {
						"type": "string",
						"maxLength": 1000,
						"description": "Optional — the prompt that produced the model being refined, so the change builds on it instead of starting over."
					},
					"reference_image_url": {
						"type": "string",
						"format": "uri",
						"description": "Optional http(s) image of the current model to anchor the re-generation (image→3D). Omit for text-guided refinement."
					},
					"parent_lineage": {
						"type": "array",
						"description": "Optional — the lineage array from a previous refine_model result, to extend the same version history.",
						"items": {
							"type": "object",
							"additionalProperties": true
						}
					},
					"parent_index": {
						"type": "integer",
						"minimum": 0,
						"description": "Optional — branch off an earlier version in parent_lineage (its index) instead of the latest."
					}
				},
				"additionalProperties": false,
				"required": [
					"glb_url",
					"instruction"
				]
			},
			"source": "api/_mcp-studio/tools.js"
		},
		{
			"name": "rig_mesh",
			"title": "Rig a 3D model for animation",
			"description": "Auto-rig a static 3D model (GLB) into an animation-ready model: adds a humanoid skeleton and skin weights so it can be posed and animated. Provide the GLB URL of a model (e.g. one generated by the other tools). Renders the rigged result inline in an interactive 3D viewer.",
			"server": {
				"id": "threews-3d-studio-free",
				"title": "3D Studio (free)",
				"endpoint": "/api/mcp-studio",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"glb_url": {
						"type": "string",
						"format": "uri",
						"description": "http(s) URL to the static GLB mesh to rig."
					}
				},
				"additionalProperties": false,
				"required": [
					"glb_url"
				]
			},
			"source": "api/_mcp-studio/tools.js"
		},
		{
			"name": "text_to_avatar",
			"title": "Generate a 3D avatar",
			"description": "Generate a textured 3D avatar (GLB) from a text description or a reference image URL. Best for characters and figures. Renders inline in an interactive 3D viewer.",
			"server": {
				"id": "threews-3d-studio-free",
				"title": "3D Studio (free)",
				"endpoint": "/api/mcp-studio",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"maxLength": 1000,
						"description": "Description of the avatar to generate."
					},
					"image_url": {
						"type": "string",
						"format": "uri",
						"description": "Optional http(s) URL to a reference image to reconstruct in 3D."
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcp-studio/tools.js"
		},
		{
			"name": "find_services",
			"title": "Find paid services the agent can call",
			"description": "Search the live x402 facilitator network for paid services (HTTP APIs and MCP tools). Returns each match with its price and resource URL — feed a resource into pay_and_call to actually use it.",
			"server": {
				"id": "threews-agent",
				"title": "Agent Wallet",
				"endpoint": "/api/mcp-agent",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"query": {
						"type": "string",
						"description": "What you need, e.g. \"weather\", \"image upscale\"."
					},
					"type": {
						"type": "string",
						"enum": [
							"http",
							"mcp"
						],
						"default": "http"
					},
					"network": {
						"type": "string",
						"description": "CAIP-2 network filter, e.g. \"solana:*\" or \"eip155:8453\"."
					},
					"max_price_usdc": {
						"type": "number",
						"minimum": 0
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 15
					}
				},
				"required": [
					"query"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpagent/tools.js"
		},
		{
			"name": "monetize_endpoint",
			"title": "Publish a paid endpoint to earn USDC",
			"description": "Put a price on an upstream API your agent already serves and publish it as an x402 endpoint other agents can pay to call. three.ws hosts the paywall, settles each buyer's USDC to your agent's own wallet, and proxies the call to your target_url. The listing becomes discoverable via find_services / the bazaar and callable by pay_and_call. Requires a provisioned wallet for the chosen network — run provision_wallet first if you haven't. Requires sign-in; you can only monetize agents on your own account.",
			"server": {
				"id": "threews-agent",
				"title": "Agent Wallet",
				"endpoint": "/api/mcp-agent",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid"
					},
					"name": {
						"type": "string",
						"minLength": 1,
						"maxLength": 120
					},
					"description": {
						"type": "string",
						"minLength": 1,
						"maxLength": 2000
					},
					"price_usdc": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Price per call in USDC."
					},
					"target_url": {
						"type": "string",
						"format": "uri",
						"description": "The public https upstream you already serve, called after payment settles."
					},
					"method": {
						"type": "string",
						"enum": [
							"GET",
							"POST"
						],
						"default": "POST"
					},
					"input_schema": {
						"type": "object",
						"description": "Optional JSON Schema for the request body."
					},
					"network": {
						"type": "string",
						"enum": [
							"solana",
							"base"
						],
						"default": "base"
					}
				},
				"required": [
					"agent_id",
					"name",
					"description",
					"price_usdc",
					"target_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpagent/tools.js"
		},
		{
			"name": "pay_and_call",
			"title": "Pay an x402 service and return its result",
			"description": "Call a paid x402 endpoint and settle the USDC payment automatically from the signed-in user's three.ws agent wallet, bounded by spending caps. Returns the service's response. Requires sign-in. If the per-call price exceeds max_usd (or the caps), the call is refused before any money moves.",
			"server": {
				"id": "threews-agent",
				"title": "Agent Wallet",
				"endpoint": "/api/mcp-agent",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"resource_url": {
						"type": "string",
						"format": "uri",
						"description": "The x402 endpoint to call."
					},
					"method": {
						"type": "string",
						"enum": [
							"GET",
							"POST"
						],
						"default": "GET"
					},
					"body": {
						"type": "object",
						"description": "JSON body for POST requests."
					},
					"max_usd": {
						"type": "number",
						"minimum": 0,
						"description": "Hard ceiling for THIS call in USD. Can only lower the server caps, never raise them."
					}
				},
				"required": [
					"resource_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpagent/tools.js"
		},
		{
			"name": "provision_wallet",
			"title": "Create the agent's wallet",
			"description": "Create (or return) the custodial Solana wallet for one of your agents so it can hold and earn USDC. Idempotent — if the agent already has a wallet, its address and live SOL/USDC balances are returned unchanged. On devnet you can request a 1 SOL airdrop for testing; mainnet wallets are never airdropped. Requires sign-in; you can only provision wallets for agents on your own account.",
			"server": {
				"id": "threews-agent",
				"title": "Agent Wallet",
				"endpoint": "/api/mcp-agent",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"agent_id": {
						"type": "string",
						"format": "uuid",
						"description": "The agent to provision a wallet for."
					},
					"cluster": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					},
					"airdrop": {
						"type": "boolean",
						"default": false,
						"description": "Devnet only — request a 1 SOL faucet airdrop after provisioning."
					}
				},
				"required": [
					"agent_id"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpagent/tools.js"
		},
		{
			"name": "wallet_status",
			"title": "Check the agent's wallet",
			"description": "Show the signed-in user's three.ws agent wallet: address, SOL and USDC balance, the per-call/hour/day spending caps, and whether autonomous spending is enabled. Read-only — never moves funds. Call this before pay_and_call to confirm there's balance and headroom.",
			"server": {
				"id": "threews-agent",
				"title": "Agent Wallet",
				"endpoint": "/api/mcp-agent",
				"transport": "remote",
				"auth": "oauth-or-x402"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {},
				"additionalProperties": false
			},
			"source": "api/_mcpagent/tools.js"
		},
		{
			"name": "get_bonding_curve",
			"title": null,
			"description": "Bonding curve analysis: real reserves, virtual reserves, and graduation progress (on-chain). Pre-graduation only: these reserves come from the pump program bonding-curve account, not from a PumpSwap pool. Pump renamed the quote-side fields on-chain (real_sol_reserves -> real_quote_reserves, virtual_sol_reserves -> virtual_quote_reserves) once a non-SOL quote asset became possible; the response keys below keep their original names and are still denominated in SOL, because the curve quote_mint is the SOL default on every coin created to date. Once complete=true the curve is retired and pricing moves to the PumpSwap pool, so use pumpfun_quote_swap from that point on.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string"
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"mint"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "get_coin_intel",
			"title": null,
			"description": "Full Coin Intelligence snapshot for a pump.fun mint. Returns every signal the engine recorded during the observation window: bundle vs organic verdict, bubblemaps-style cluster connectivity, smart-money presence (with wallet labels and win-rates), dev behaviour, category/classification, news-meme detection with the matching headline, risk flags, and a 0–100 quality score. Also returns the outcome if the coin is old enough to be labeled (graduated/rugged/ATH multiple). This is the single highest-signal read for a trade decision — call this before entering any position.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string",
						"description": "Solana mint address (base58)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"mint"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "get_creator_profile",
			"title": null,
			"description": "All tokens by a creator wallet, with rug-pull risk flags.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"creator": {
						"type": "string"
					}
				},
				"required": [
					"creator"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "get_graduated_tokens",
			"title": null,
			"description": "Tokens that graduated from the bonding curve to Raydium AMM.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 10
					}
				}
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "get_king_of_the_hill",
			"title": null,
			"description": "Highest-market-cap token still on the bonding curve.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "get_new_tokens",
			"title": null,
			"description": "Most recently launched pump.fun tokens.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 10
					}
				}
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "get_oracle_conviction",
			"title": null,
			"description": "Oracle conviction score for a pump.fun mint: the fused 0-100 score the Oracle engine produces by combining four intelligence pillars: pedigree (who bought it), structure (organic vs bundle, holder concentration, bubblemaps connectivity), narrative (category, meme virality, news hook), and momentum (timing, velocity). Returns the tier (prime ≥86 / strong ≥72 / lean ≥54 / watch ≥36 / avoid), the per-pillar breakdown, the natural-language reasons that drove the score, the full \"who's in\" trader roster with reputation labels and win-rates, and the narrative read (category, virality, tags). Call this when you need the highest-confidence trade signal; it synthesises everything get_coin_intel exposes into one actionable score. Pairs with get_coin_intel for raw signals.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string",
						"description": "Solana mint address (base58)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"mint"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "get_token_details",
			"title": null,
			"description": "Full details for a specific pump.fun token by mint address.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string"
					}
				},
				"required": [
					"mint"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "get_token_holders",
			"title": null,
			"description": "Top holders of a token with concentration analysis (on-chain).",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string"
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 20,
						"default": 10
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"mint"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "get_token_trades",
			"title": null,
			"description": "Recent buy/sell history for a token.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string"
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 200,
						"default": 50
					}
				},
				"required": [
					"mint"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "get_trending_tokens",
			"title": null,
			"description": "Top pump.fun tokens by market cap.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 10
					}
				}
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "kol_leaderboard",
			"title": null,
			"description": "Top KOL traders ranked by P&L for a given time window. Returns wallet, pnlUsd, winRate, trades, rank.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"window": {
						"type": "string",
						"enum": [
							"24h",
							"7d",
							"30d"
						],
						"default": "7d"
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"default": 25
					}
				}
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "pumpfun_bot_status",
			"title": null,
			"description": "Returns the configuration and health status of the pump.fun indexer backend. Always available — does not require PUMPFUN_BOT_URL.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {},
				"required": []
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "pumpfun_first_claims",
			"title": null,
			"description": "First-ever pump.fun creator fee claims in a time window: a cash-out signal. Returns creators who have never claimed before, with creator wallet, mint, lamports, and timestamp.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"sinceMinutes": {
						"type": "integer",
						"minimum": 1,
						"maximum": 1440,
						"default": 60,
						"description": "How far back to look for new claimers (minutes)"
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 20
					}
				}
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "pumpfun_list_claims",
			"title": null,
			"description": "List recent pump.fun fee-claim events for a creator wallet (on-chain, no indexer needed). Returns signature, mint, lamports, and Unix timestamp for each claim.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"creator": {
						"type": "string",
						"description": "Creator wallet address (base58)"
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 20
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"creator"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "pumpfun_quote_swap",
			"title": null,
			"description": "Read-only price quote for a pump.fun AMM (PumpSwap) swap. No signing or tx sending. One of inputMint/outputMint must be wSOL (So11111111111111111111111111111111111111112). Only GRADUATED coins have an AMM pool; for a coin still on its bonding curve use get_bonding_curve instead. Pricing runs on the pool effective quote reserves (quote vault balance + pool.virtual_quote_reserves); the base side is the raw base vault balance. Returns amountOut, priceImpactBps, route, expiresAtMs, plus the reserves the quote was computed from so the number can be reproduced.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"inputMint": {
						"type": "string",
						"description": "Input token mint (base58)."
					},
					"outputMint": {
						"type": "string",
						"description": "Output token mint (base58)."
					},
					"amountIn": {
						"type": "number",
						"description": "Input amount in raw base units (lamports for SOL)."
					},
					"slippageBps": {
						"type": "number",
						"description": "Slippage tolerance in basis points (default 100 = 1%)."
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"inputMint",
					"outputMint",
					"amountIn"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "pumpfun_upload_metadata",
			"title": null,
			"description": "Upload coin metadata (name, symbol, description, image) to IPFS and get back a pump.fun-ready metadata URI. Call this before launching a coin — pass the returned uri to the launch-agent endpoint or the studio launch flow. Requires a valid bearer token (API key). Image may be a public HTTPS URL or a base64 data URI (max 10 MB). The returned uri is a permanent ipfs:// link; the call is idempotent for the same content.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"name": {
						"type": "string",
						"description": "Coin name (1–32 chars)."
					},
					"symbol": {
						"type": "string",
						"description": "Ticker symbol (1–10 chars, no $)."
					},
					"description": {
						"type": "string",
						"description": "Coin description (max 500 chars)."
					},
					"image_url": {
						"type": "string",
						"description": "Image for the coin icon. Public HTTPS URL or base64 data URI (data:image/png;base64,…). Square image, at least 400×400 px, under 5 MB."
					},
					"twitter": {
						"type": "string",
						"description": "Twitter/X handle or URL (optional)."
					},
					"telegram": {
						"type": "string",
						"description": "Telegram URL (optional)."
					},
					"website": {
						"type": "string",
						"description": "Website URL (optional)."
					}
				},
				"required": [
					"name",
					"symbol",
					"description",
					"image_url"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "pumpfun_vanity_mint",
			"title": null,
			"description": "Generate a Solana keypair whose address ends/starts with a vanity pattern. Returns publicKey + secretKey (base58). Caller must save the secret key immediately — it is never stored. Hard timeout: 60 s.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"suffix": {
						"type": "string",
						"description": "Desired address suffix (case-insensitive by default)"
					},
					"prefix": {
						"type": "string",
						"description": "Desired address prefix (case-insensitive by default)"
					},
					"caseSensitive": {
						"type": "boolean",
						"default": false
					},
					"maxAttempts": {
						"type": "integer",
						"default": 5000000
					}
				}
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "pumpfun_watch_claims",
			"title": null,
			"description": "Return all pump.fun fee-claim events for a creator wallet within a look-back window (durationMs). Useful for batch collection after a delay.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"creator": {
						"type": "string",
						"description": "Creator wallet address (base58)"
					},
					"durationMs": {
						"type": "number",
						"description": "Look-back window in ms (default 300000 = 5 min, max 1800000)"
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"creator"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "pumpfun_watch_whales",
			"title": null,
			"description": "Collect whale trades on a pump.fun token for a short window (max 10 s). Returns all trades whose USD value meets minUsd.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"mint": {
						"type": "string",
						"description": "SPL mint pubkey (base58)"
					},
					"minUsd": {
						"type": "number",
						"description": "Minimum trade value in USD (default 5000)"
					},
					"durationMs": {
						"type": "number",
						"description": "Collection window in ms (default 5000, max 10000)"
					}
				},
				"required": [
					"mint"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "search_tokens",
			"title": null,
			"description": "Search pump.fun tokens by name, symbol, or mint address.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"query": {
						"type": "string"
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 50,
						"default": 10
					}
				},
				"required": [
					"query"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "sns_resolve",
			"title": null,
			"description": "Resolve a .sol Solana Name Service domain to its owner wallet address.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"name": {
						"type": "string",
						"description": ".sol domain name, e.g. \"bonfida.sol\""
					}
				},
				"required": [
					"name"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "sns_reverseLookup",
			"title": null,
			"description": "Reverse-lookup a Solana wallet address to its primary .sol domain name.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"address": {
						"type": "string",
						"description": "Base58 Solana wallet address"
					}
				},
				"required": [
					"address"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "social_cashtag_sentiment",
			"title": null,
			"description": "Score social-post sentiment for a cashtag using a deterministic lexicon. Returns score (-1..1), positive/negative/neutral percentages, and example posts.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": false
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"posts": {
						"type": "array",
						"description": "Array of post objects. Each must have a text field; id, ts, and author are optional.",
						"items": {
							"type": "object",
							"properties": {
								"id": {
									"type": "string"
								},
								"ts": {
									"type": "string"
								},
								"text": {
									"type": "string"
								},
								"author": {
									"type": "string"
								}
							},
							"required": [
								"text"
							]
						}
					}
				},
				"required": [
					"posts"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "social_x_post_impact",
			"title": null,
			"description": "Correlate an X (Twitter) post to a memecoin price impact. Fetches post metadata via oEmbed (no API key) and computes price delta from the pump.fun bonding curve in a ±windowMin window around the post.",
			"server": {
				"id": "threews-pumpfun",
				"title": "pump.fun",
				"endpoint": "/api/pump-fun-mcp",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"postUrl": {
						"type": "string",
						"description": "X post URL (e.g. https://x.com/user/status/123)"
					},
					"mint": {
						"type": "string",
						"description": "Solana token mint address (base58)"
					},
					"windowMin": {
						"type": "integer",
						"default": 30,
						"description": "±window in minutes around the post time"
					},
					"network": {
						"type": "string",
						"enum": [
							"mainnet",
							"devnet"
						],
						"default": "mainnet"
					}
				},
				"required": [
					"postUrl",
					"mint"
				]
			},
			"source": "src/pump/mcp-tools.js"
		},
		{
			"name": "bazaar_service_details",
			"title": "Live price details for one x402 service",
			"description": "Resolve the current live price of a single x402 service by its resource URL (and tool_name for MCP services). Returns the cheapest price across networks plus a per-network breakdown (amount in atomic units, asset, recipient) and whether the service is still listed and payable. Purpose-built for price tracking and cost-model maintenance — call it on a schedule to watch a dependency's price over time and detect hikes or drops. Use get_service instead when you also need the input/output schema and a ready pay link.",
			"server": {
				"id": "threews-x402-bazaar",
				"title": "x402 Bazaar",
				"endpoint": "/api/mcp-bazaar",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"resource_url": {
						"type": "string",
						"format": "uri",
						"description": "The service resource URL."
					},
					"tool_name": {
						"type": "string",
						"description": "For MCP services, the tool name on that resource."
					}
				},
				"required": [
					"resource_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpbazaar/tools.js"
		},
		{
			"name": "browse_services",
			"title": "Browse the x402 bazaar",
			"description": "List paid agent services from the live x402 facilitator network without a search query — useful for \"what can I pay for?\". Returns services with price, networks, and resource URL, cheapest filters applied.",
			"server": {
				"id": "threews-x402-bazaar",
				"title": "x402 Bazaar",
				"endpoint": "/api/mcp-bazaar",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"type": {
						"type": "string",
						"enum": [
							"http",
							"mcp"
						],
						"default": "http"
					},
					"network": {
						"type": "string",
						"description": "Filter by CAIP-2 network, e.g. \"eip155:8453\"."
					},
					"max_price_usdc": {
						"type": "number",
						"minimum": 0
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"default": 30
					}
				},
				"additionalProperties": false
			},
			"source": "api/_mcpbazaar/tools.js"
		},
		{
			"name": "get_service",
			"title": "Get full details for one x402 service",
			"description": "Resolve a single x402 service by its resource URL (and tool_name for MCP services). Returns the exact payment requirements (price, asset, network, recipient), the input/output schema, and a ready-to-use pay link on three.ws. This is what you read before paying.",
			"server": {
				"id": "threews-x402-bazaar",
				"title": "x402 Bazaar",
				"endpoint": "/api/mcp-bazaar",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"resource_url": {
						"type": "string",
						"format": "uri",
						"description": "The service resource URL."
					},
					"tool_name": {
						"type": "string",
						"description": "For MCP services, the tool name on that resource."
					}
				},
				"required": [
					"resource_url"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpbazaar/tools.js"
		},
		{
			"name": "search_services",
			"title": "Search the x402 bazaar",
			"description": "Ranked search across the live x402 facilitator network for paid agent services (APIs and MCP tools you can pay for in stablecoin). Returns matching services with price, networks, and resource URL. Use get_service for full payment + input details.",
			"server": {
				"id": "threews-x402-bazaar",
				"title": "x402 Bazaar",
				"endpoint": "/api/mcp-bazaar",
				"transport": "remote",
				"auth": "none"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": false,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"query": {
						"type": "string",
						"description": "What you need, e.g. \"weather\", \"image upscale\", \"onchain data\"."
					},
					"type": {
						"type": "string",
						"enum": [
							"http",
							"mcp"
						],
						"default": "http",
						"description": "http API or mcp tool."
					},
					"network": {
						"type": "string",
						"description": "Filter by CAIP-2 network, e.g. \"eip155:8453\" (Base) or \"solana:*\"."
					},
					"max_price_usdc": {
						"type": "number",
						"minimum": 0,
						"description": "Only services at or below this price (USDC)."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"default": 20
					}
				},
				"required": [
					"query"
				],
				"additionalProperties": false
			},
			"source": "api/_mcpbazaar/tools.js"
		},
		{
			"name": "close_session",
			"title": "Close a tutoring session (finalize invoice)",
			"description": "Finalize a Pay-As-You-Learn tutoring session and return its itemized, attested invoice. Seals the ledger for the given sessionId: status flips to \"closed\", a SHA-256 attestation is stamped over the line items and total, and no further questions can be billed to this session afterward. Returns sessionId, createdAt, closedAt, questionCount, the full lineItems array, the totalAtomics / totalUsd owed, and the attestation hash. Closing itself is FREE and moves no funds — the learner was already charged per answered question; this only produces the final receipt. Idempotent: closing an already-closed session returns the same total. Use load_session first if you want to review the tab before sealing it.",
			"server": {
				"id": "tutor-mcp",
				"title": "@three-ws/tutor-mcp",
				"endpoint": "npx -y @three-ws/tutor-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "write",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": false,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"sessionId": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100,
						"description": "Opaque tutoring session identifier to finalize. Truncated to 100 chars by the API."
					}
				},
				"required": [
					"sessionId"
				],
				"additionalProperties": false
			},
			"source": "packages/tutor-mcp/src/tools/close-session.js"
		},
		{
			"name": "load_session",
			"title": "Load a tutoring session ledger",
			"description": "Read the running tab for a Pay-As-You-Learn tutoring session by its sessionId. Returns the itemized ledger: one lineItem per answered question (question text, level, output tokens, per-item cost in USDC atomics and a \"$x.xxxxxx\" string, and the timestamp), plus the session status (\"open\" | \"closed\"), questionCount, and the running totalAtomics / totalUsd. If the session was already closed it also returns the finalized, attested invoice. A sessionId with no stored history returns an empty open session (questionCount 0) rather than an error — that is an honest \"nothing billed yet\", not a failure. Viewing the tab is always free; this never charges the learner. Read-only live data.",
			"server": {
				"id": "tutor-mcp",
				"title": "@three-ws/tutor-mcp",
				"endpoint": "npx -y @three-ws/tutor-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"sessionId": {
						"type": "string",
						"minLength": 1,
						"maxLength": 100,
						"description": "Opaque tutoring session identifier (the id the session was opened with). Truncated to 100 chars by the API."
					}
				},
				"required": [
					"sessionId"
				],
				"additionalProperties": false
			},
			"source": "packages/tutor-mcp/src/tools/load-session.js"
		},
		{
			"name": "vanity_appraise",
			"title": "Appraise the rarity of a Solana address",
			"description": "Appraise how rare a Solana address is: its detected vanity pattern, rarity score, rarity bits, tier, and expected grind attempts. Pure math on the Base58 address — nothing is stored. If the address has been published to the proof-of-grind gallery, the public entry is returned too. Read-only, no payment.",
			"server": {
				"id": "vanity-mcp",
				"title": "@three-ws/vanity-mcp",
				"endpoint": "npx -y @three-ws/vanity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"address": {
						"type": "string",
						"minLength": 32,
						"maxLength": 44,
						"description": "The Base58 Solana public key to appraise (32–44 chars)."
					},
					"prefixLen": {
						"type": "integer",
						"minimum": 0,
						"description": "Override how many leading characters to treat as the pattern prefix."
					},
					"suffixLen": {
						"type": "integer",
						"minimum": 0,
						"description": "Override how many trailing characters to treat as the pattern suffix."
					}
				},
				"required": [
					"address"
				],
				"additionalProperties": false
			},
			"source": "packages/vanity-mcp/src/tools/vanity-appraise.js"
		},
		{
			"name": "vanity_board",
			"title": "Browse the vanity grind-bounty board",
			"description": "Browse the public grind-bounty board: vanity-address bounties requesters have escrowed for the worker fleet to grind. Filter by status (open / all / settled), sort by recency, reward, or expiry, and paginate. Each bounty shows its pattern, USDC amount, difficulty, status, and timing. Read-only; posting a bounty is a separate x402-paid write on the HTTP API.",
			"server": {
				"id": "vanity-mcp",
				"title": "@three-ws/vanity-mcp",
				"endpoint": "npx -y @three-ws/vanity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"status": {
						"type": "string",
						"enum": [
							"open",
							"all",
							"settled"
						],
						"default": "open",
						"description": "Which bounties to list. Default open."
					},
					"sort": {
						"type": "string",
						"enum": [
							"recency",
							"reward",
							"expiry"
						],
						"default": "recency",
						"description": "Order: newest first, biggest reward first, or soonest to expire. Default recency."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "Max bounties to return (1–100, default 24)."
					},
					"offset": {
						"type": "integer",
						"minimum": 0,
						"description": "Pagination offset (default 0)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/vanity-mcp/src/tools/vanity-board.js"
		},
		{
			"name": "vanity_config",
			"title": "Bounty market config: payout + asset metadata",
			"description": "Read the grind-bounty market configuration: whether on-chain payouts are configured (can a winner actually be paid?), the settlement asset (USDC) and its decimals, which escrow networks are live (Base / Solana), the pricing band (floor + max atomics), the bounty protocol version, and the sealed-envelope scheme. Check this before posting to confirm the market can pay out. Read-only, no params.",
			"server": {
				"id": "vanity-mcp",
				"title": "@three-ws/vanity-mcp",
				"endpoint": "npx -y @three-ws/vanity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/vanity-mcp/src/tools/vanity-config.js"
		},
		{
			"name": "vanity_gallery",
			"title": "Browse the proof-of-grind rarity gallery",
			"description": "Browse the public proof-of-grind gallery: rare Solana addresses people have published with a verifiable grind receipt. Sort by rarity score or recency, filter by tier, minimum pattern length, or a substring the pattern must contain, and paginate. Each entry shows the address, pattern, rarity score/bits, tier, and an explorer link. Read-only.",
			"server": {
				"id": "vanity-mcp",
				"title": "@three-ws/vanity-mcp",
				"endpoint": "npx -y @three-ws/vanity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"sort": {
						"type": "string",
						"enum": [
							"score",
							"recency"
						],
						"default": "score",
						"description": "Order by rarity score (rarest first) or recency. Default score."
					},
					"tier": {
						"type": "string",
						"description": "Filter to a single rarity tier id."
					},
					"minLength": {
						"type": "integer",
						"minimum": 0,
						"description": "Only patterns at least this many characters long."
					},
					"contains": {
						"type": "string",
						"description": "Only addresses whose vanity pattern contains this substring."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "Max entries to return (1–100, default 24)."
					},
					"offset": {
						"type": "integer",
						"minimum": 0,
						"description": "Pagination offset (default 0)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/vanity-mcp/src/tools/vanity-gallery.js"
		},
		{
			"name": "vanity_leaderboard",
			"title": "Top grinders by USDC earned",
			"description": "Rank the worker fleet: the top grinders by total USDC earned from winning vanity-address bounties. Each entry shows a worker id and its cumulative payout. Read-only.",
			"server": {
				"id": "vanity-mcp",
				"title": "@three-ws/vanity-mcp",
				"endpoint": "npx -y @three-ws/vanity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"default": 10,
						"description": "How many top grinders to return (1–100, default 10)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/vanity-mcp/src/tools/vanity-leaderboard.js"
		},
		{
			"name": "vanity_open",
			"title": "List claimable open bounties for workers",
			"description": "List the open, unexpired bounties a grinding worker can race to claim — the queue worker fleets poll. Each entry carries the pattern to grind and the escrowed USDC reward; the first worker to submit a verified, sealed key wins. Read-only discovery; submitting a claim is a separate write on the HTTP API.",
			"server": {
				"id": "vanity-mcp",
				"title": "@three-ws/vanity-mcp",
				"endpoint": "npx -y @three-ws/vanity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "Max claimable bounties to return (1–100, default 30)."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/vanity-mcp/src/tools/vanity-open.js"
		},
		{
			"name": "vanity_quote",
			"title": "Quote the bounty price for a vanity pattern",
			"description": "Quote how hard a Solana vanity address is and what to escrow for it. Give a Base58 prefix and/or suffix and get the expected attempts, rarity tier, and an honest suggested USDC bounty (atomic units) from the difficulty→price oracle. Pure function of the pattern — no wallet, no payment, fully read-only. Use this before posting a grind-bounty so you escrow a fair amount.",
			"server": {
				"id": "vanity-mcp",
				"title": "@three-ws/vanity-mcp",
				"endpoint": "npx -y @three-ws/vanity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": true,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prefix": {
						"type": "string",
						"description": "Base58 prefix the address must start with (e.g. \"THREE\")."
					},
					"suffix": {
						"type": "string",
						"description": "Base58 suffix the address must end with."
					},
					"ignoreCase": {
						"type": "boolean",
						"description": "Match the pattern case-insensitively (cheaper, less rare). Default false."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/vanity-mcp/src/tools/vanity-quote.js"
		},
		{
			"name": "vanity_stats",
			"title": "Live grind-bounty market totals",
			"description": "Get live totals for the grind-bounty market: how many bounties are open, how much USDC is currently escrowed, and how much has been paid out to winning workers. A quick pulse on market activity. Read-only, no params.",
			"server": {
				"id": "vanity-mcp",
				"title": "@three-ws/vanity-mcp",
				"endpoint": "npx -y @three-ws/vanity-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/vanity-mcp/src/tools/vanity-stats.js"
		},
		{
			"name": "analyze_image",
			"title": "Analyze an image against a prompt",
			"description": "Let the agent SEE an image and answer a question about it. Supply the image as `imageUrl` (a public https URL the vision server fetches) OR `image` (raw base64 / a data: URI), and a `prompt` describing what to extract — e.g. \"What objects are in this scene?\", \"Read the text in this screenshot\", \"Is this avatar render rigged correctly?\". Returns the model's answer as `text`, plus the `provider` and `model` that served it (a free NVIDIA NIM lane when available, an automatic paid backstop otherwise — the caller never pays). Analysis only: it does not store or mutate anything. Accepts JPEG, PNG, WebP, or GIF up to 12 MB; base64 inputs are size-checked before upload.",
			"server": {
				"id": "vision-mcp",
				"title": "@three-ws/vision-mcp",
				"endpoint": "npx -y @three-ws/vision-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"prompt": {
						"type": "string",
						"minLength": 1,
						"maxLength": 2000,
						"description": "The question or instruction about the image (what to extract, read, classify, or critique)."
					},
					"imageUrl": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the image to analyze. Provide this OR `image`, not both."
					},
					"image": {
						"type": "string",
						"description": "The image as raw base64 or a `data:image/...;base64,...` URI. Provide this OR `imageUrl`, not both."
					},
					"imageType": {
						"type": "string",
						"enum": [
							"image/jpeg",
							"image/png",
							"image/webp",
							"image/gif"
						],
						"description": "MIME type of a raw base64 `image` (ignored for data URIs / `imageUrl`). Defaults to image/jpeg."
					},
					"maxTokens": {
						"type": "integer",
						"minimum": 16,
						"maximum": 2048,
						"description": "Maximum tokens in the answer (16–2048). Higher = longer, more detailed reads. Default 512."
					}
				},
				"required": [
					"prompt"
				],
				"additionalProperties": false
			},
			"source": "packages/vision-mcp/src/tools/analyze-image.js"
		},
		{
			"name": "describe_image",
			"title": "Describe an image in natural language",
			"description": "Get a plain-language description of an image — ideal for alt text, captions, or a quick \"what is this?\" read when you have no specific question. Supply the image as `imageUrl` (a public https URL) OR `image` (raw base64 / data: URI). Use `detail` to pick brief / standard / detailed, and `focus` to steer the description toward something specific (e.g. \"the clothing\", \"any visible text\"). Returns the prose as `description`, plus the `provider` and `model` that served it (free NVIDIA NIM first, automatic paid backstop otherwise — the caller never pays). Read-only; accepts JPEG, PNG, WebP, or GIF up to 12 MB.",
			"server": {
				"id": "vision-mcp",
				"title": "@three-ws/vision-mcp",
				"endpoint": "npx -y @three-ws/vision-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"imageUrl": {
						"type": "string",
						"format": "uri",
						"description": "Public https URL of the image to describe. Provide this OR `image`, not both."
					},
					"image": {
						"type": "string",
						"description": "The image as raw base64 or a `data:image/...;base64,...` URI. Provide this OR `imageUrl`, not both."
					},
					"imageType": {
						"type": "string",
						"enum": [
							"image/jpeg",
							"image/png",
							"image/webp",
							"image/gif"
						],
						"description": "MIME type of a raw base64 `image` (ignored for data URIs / `imageUrl`). Defaults to image/jpeg."
					},
					"detail": {
						"type": "string",
						"enum": [
							"brief",
							"standard",
							"detailed"
						],
						"default": "standard",
						"description": "How much description to return: brief (one sentence), standard (2–3 sentences), or detailed (a full paragraph)."
					},
					"focus": {
						"type": "string",
						"maxLength": 400,
						"description": "Optional aspect to emphasize in the description (e.g. \"any visible text\", \"the background\", \"the pose\")."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/vision-mcp/src/tools/describe-image.js"
		},
		{
			"name": "get_vision_status",
			"title": "Vision availability + accepted formats",
			"description": "Check whether the three.ws vision pipeline is live on the target deployment and which image formats it accepts. Returns `configured` (true when at least one VLM provider — a free NVIDIA NIM lane or the paid backstop — can serve a request) and `image_types` (the accepted MIME types). Use this before calling analyze_image / describe_image so the agent can decide whether to offer a \"describe this image\" action. No image, no key, no cost.",
			"server": {
				"id": "vision-mcp",
				"title": "@three-ws/vision-mcp",
				"endpoint": "npx -y @three-ws/vision-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {}
			},
			"source": "packages/vision-mcp/src/tools/vision-status.js"
		},
		{
			"name": "find_services",
			"title": "Find paid x402 services the agent can call",
			"description": "Search the live x402 facilitator network (PayAI + Coinbase CDP bazaar) for paid services — HTTP APIs and MCP tools. Returns each match with its price, networks, and resource URL. Pass a resource into pay_and_call to use it. Read-only.",
			"server": {
				"id": "x402-mcp",
				"title": "@three-ws/x402-mcp",
				"endpoint": "npx -y @three-ws/x402-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"query": {
						"type": "string",
						"minLength": 1,
						"description": "What you need, e.g. \"weather\", \"image upscale\", \"token intel\"."
					},
					"type": {
						"type": "string",
						"enum": [
							"http",
							"mcp"
						],
						"default": "http",
						"description": "Service kind to search."
					},
					"network": {
						"type": "string",
						"description": "CAIP-2 network filter, e.g. \"solana:*\" or \"eip155:8453\"."
					},
					"max_price_usdc": {
						"type": "number",
						"minimum": 0,
						"description": "Only return services at or under this USDC price."
					},
					"limit": {
						"type": "integer",
						"minimum": 1,
						"maximum": 100,
						"description": "Max results (default 25)."
					}
				},
				"required": [
					"query"
				],
				"additionalProperties": false
			},
			"source": "packages/x402-mcp/src/tools/find-services.js"
		},
		{
			"name": "inspect_endpoint",
			"title": "Inspect an x402 endpoint (price + requirements, no payment)",
			"description": "Fetch an x402 endpoint and return its 402 payment requirements — every accepted scheme, network, asset, price and pay-to address — WITHOUT paying. If the endpoint is free, returns its result instead. No signer required. Use this to learn the cost before pay_and_call.",
			"server": {
				"id": "x402-mcp",
				"title": "@three-ws/x402-mcp",
				"endpoint": "npx -y @three-ws/x402-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"url": {
						"type": "string",
						"format": "uri",
						"description": "The x402 endpoint URL to inspect."
					},
					"method": {
						"type": "string",
						"enum": [
							"GET",
							"POST"
						],
						"default": "GET",
						"description": "HTTP method to probe with."
					},
					"body": {
						"type": "object",
						"additionalProperties": {},
						"description": "JSON body for a POST probe."
					}
				},
				"required": [
					"url"
				],
				"additionalProperties": false
			},
			"source": "packages/x402-mcp/src/tools/inspect-endpoint.js"
		},
		{
			"name": "pay_and_call",
			"title": "Pay an x402 endpoint in USDC or $THREE and return its result",
			"description": "Call a paid x402 endpoint and settle the payment automatically, then return the result.\n\nTwo modes:\n• Self-custodial (default): signs with SOLANA_SECRET_KEY or `secret` arg — you hold the key.\n• Session-governed: pass `session_token` (a three.ws Payment Session token) — the platform wallet signs on your behalf; the session's budget, allowlist, and per-tx cap are enforced by the platform. No private key required. Supports Solana USDC and Base USDC sessions.\n\nPay in USDC (default) or, when the endpoint advertises it, in $THREE (set token:\"three\"). Bounded by max_usd and the MAX_PAY_USD cap; refuses before any money moves if the price is over the cap. With REQUIRE_CONFIRM on, the call refuses until re-issued with confirm:true.",
			"server": {
				"id": "x402-mcp",
				"title": "@three-ws/x402-mcp",
				"endpoint": "npx -y @three-ws/x402-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "irreversible",
			"annotations": {
				"readOnlyHint": false,
				"destructiveHint": true,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"url": {
						"type": "string",
						"format": "uri",
						"description": "The x402 endpoint to pay and call."
					},
					"method": {
						"type": "string",
						"enum": [
							"GET",
							"POST"
						],
						"default": "GET",
						"description": "HTTP method."
					},
					"body": {
						"type": "object",
						"additionalProperties": {},
						"description": "JSON body for POST requests."
					},
					"session_token": {
						"type": "string",
						"description": "three.ws Payment Session token (pss_…). When provided, the platform wallet pays — no local key needed. Overrides `secret`."
					},
					"token": {
						"type": "string",
						"enum": [
							"usdc",
							"three"
						],
						"default": "usdc",
						"description": "Settlement token. \"usdc\" (default) or \"three\" — the $THREE platform token; the endpoint must advertise it. Ignored when session_token is set."
					},
					"max_usd": {
						"type": "number",
						"exclusiveMinimum": 0,
						"description": "Hard ceiling for THIS call in USD. Can only lower the MAX_PAY_USD cap, never raise it."
					},
					"secret": {
						"type": "string",
						"description": "Per-call base58 signer override (defaults to SOLANA_SECRET_KEY). Ignored when session_token is set."
					},
					"confirm": {
						"type": "boolean",
						"description": "Must be true to execute when REQUIRE_CONFIRM is on."
					},
					"idempotency_key": {
						"type": "string",
						"description": "Deduplication key for this call. Recommended when using session_token to avoid double-charges on retries."
					}
				},
				"required": [
					"url"
				],
				"additionalProperties": false
			},
			"source": "packages/x402-mcp/src/tools/pay-and-call.js"
		},
		{
			"name": "x402_wallet",
			"title": "The agent's x402 spending wallet (address + balance)",
			"description": "Show a Solana wallet's address and live SOL + USDC balance. With no `address`, derives the wallet from the configured signer (SOLANA_SECRET_KEY) — call this before pay_and_call to confirm there's USDC to spend. Read-only; never moves funds.",
			"server": {
				"id": "x402-mcp",
				"title": "@three-ws/x402-mcp",
				"endpoint": "npx -y @three-ws/x402-mcp",
				"transport": "stdio",
				"auth": "api-key"
			},
			"safety": "read",
			"annotations": {
				"readOnlyHint": true,
				"destructiveHint": null,
				"idempotentHint": false,
				"openWorldHint": true
			},
			"price": {
				"usd": 0,
				"free": true
			},
			"inputSchema": {
				"type": "object",
				"properties": {
					"address": {
						"type": "string",
						"minLength": 32,
						"maxLength": 64,
						"description": "Base58 Solana address to inspect. Omit to use the configured signer wallet."
					}
				},
				"additionalProperties": false
			},
			"source": "packages/x402-mcp/src/tools/x402-wallet.js"
		}
	]
}
