@iflow-mcp/mission69b-t2000 0.22.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -0
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +1337 -0
- package/dist/bin.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +1336 -0
- package/dist/index.js.map +1 -0
- package/package.json +62 -0
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/unlock.ts","../src/errors.ts","../src/tools/read.ts","../src/mutex.ts","../src/tools/write.ts","../src/tools/safety.ts","../src/prompts.ts","../src/index.ts","../src/bin.ts"],"names":["pin","z"],"mappings":"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","file":"bin.js","sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\n\nconst SESSION_PATH = resolve(homedir(), '.t2000', '.session');\n\nasync function resolvePin(): Promise<string> {\n const envPin = process.env.T2000_PIN ?? process.env.T2000_PASSPHRASE;\n if (envPin) return envPin;\n\n try {\n const session = await readFile(SESSION_PATH, 'utf-8');\n if (session.trim()) return session.trim();\n } catch { /* no session */ }\n\n throw new Error(\n 'No PIN available. Either:\\n' +\n ' 1. Run `t2000 balance` first (creates session), or\\n' +\n ' 2. Set T2000_PIN environment variable',\n );\n}\n\nexport async function createAgent(keyPath?: string): Promise<T2000> {\n // Test mode: create temporary wallet for MCP testing\n if (process.env.T2000_TEST_MODE === 'true') {\n const pin = await resolvePin();\n const { agent } = await T2000.init({ pin, sponsored: false });\n return agent as any;\n }\n \n const pin = await resolvePin();\n return T2000.create({ pin, keyPath });\n}\n","import { T2000Error, SafeguardError } from '@t2000/sdk';\n\ninterface McpToolError {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n}\n\nexport function mapError(err: unknown): McpToolError {\n if (err instanceof SafeguardError) {\n return {\n code: 'SAFEGUARD_BLOCKED',\n message: err.message,\n retryable: false,\n details: { rule: err.rule, ...err.details },\n };\n }\n\n if (err instanceof T2000Error) {\n return {\n code: err.code,\n message: err.message,\n retryable: err.retryable,\n };\n }\n\n return {\n code: 'UNKNOWN',\n message: err instanceof Error ? err.message : String(err),\n retryable: false,\n };\n}\n\nexport function errorResult(err: unknown) {\n const mapped = mapError(err);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(mapped) }],\n isError: true,\n };\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { T2000 } from '@t2000/sdk';\nimport { errorResult } from '../errors.js';\n\nexport function registerReadTools(server: McpServer, agent: T2000): void {\n\n // ---------------------------------------------------------------------------\n // Composite tool — the single best call for \"how's my account?\"\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_overview',\n 'Complete account snapshot in ONE call — balance, savings positions, health factor, yield earnings, fund status, and pending rewards. Use this for morning briefings, general account questions, or any time you need the full picture. Prefer this over calling individual tools.',\n {},\n async () => {\n try {\n const [balance, positions, health, earnings, fundStatus, pendingRewards] =\n await Promise.allSettled([\n agent.balance(),\n agent.positions(),\n agent.healthFactor(),\n agent.earnings(),\n agent.fundStatus(),\n agent.getPendingRewards(),\n ]);\n\n const result = {\n balance: balance.status === 'fulfilled' ? balance.value : null,\n positions: positions.status === 'fulfilled' ? positions.value : null,\n health: health.status === 'fulfilled' ? health.value : null,\n earnings: earnings.status === 'fulfilled' ? earnings.value : null,\n fundStatus: fundStatus.status === 'fulfilled' ? fundStatus.value : null,\n pendingRewards: pendingRewards.status === 'fulfilled' ? pendingRewards.value : null,\n };\n\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n // ---------------------------------------------------------------------------\n // Individual read tools\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_balance',\n \"Get agent's current balance — available (checking), savings, credit (debt), gas reserve, and net total. All values in USD. For a full account snapshot, prefer t2000_overview instead.\",\n {},\n async () => {\n try {\n const result = await agent.balance();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_address',\n \"Get the agent's Sui wallet address for receiving funds.\",\n {},\n async () => {\n try {\n const address = agent.address();\n return { content: [{ type: 'text', text: JSON.stringify({ address }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_positions',\n 'View current lending positions on NAVI — deposits, borrows, APYs. For a full account snapshot, prefer t2000_overview instead.',\n {},\n async () => {\n try {\n const result = await agent.positions();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_rates',\n 'Get best available interest rates per asset across all lending protocols. Use alongside t2000_positions to compare current vs best rates.',\n {},\n async () => {\n try {\n const result = await agent.rates();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_health',\n \"Check the agent's health factor — measures how safe current borrows are. Below 1.0 risks liquidation. Also shows supplied, borrowed, max borrow, and liquidation threshold.\",\n {},\n async () => {\n try {\n const result = await agent.healthFactor();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_history',\n 'View recent transactions — sends, saves, borrows, MPP (paid API) payments. Each entry includes a transaction digest that can be viewed on Suiscan (https://suiscan.xyz/mainnet/tx/{digest}). Use for activity summaries and weekly recaps.',\n { limit: z.number().optional().describe('Number of transactions to return (default: 20)') },\n async ({ limit }) => {\n try {\n const result = await agent.history({ limit });\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_earnings',\n 'View yield earnings from savings positions — total earned, daily rate, current APY. For a full account snapshot, prefer t2000_overview instead.',\n {},\n async () => {\n try {\n const result = await agent.earnings();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_fund_status',\n 'Detailed savings analytics — total supplied, current APY, earned today, earned all-time, projected monthly yield. More detailed than t2000_earnings.',\n {},\n async () => {\n try {\n const result = await agent.fundStatus();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_pending_rewards',\n 'Check pending protocol rewards from lending positions WITHOUT claiming them. Shows claimable reward tokens per protocol and asset. Use t2000_claim_rewards to actually collect and convert to USDC.',\n {},\n async () => {\n try {\n const result = await agent.getPendingRewards();\n return { content: [{ type: 'text', text: JSON.stringify({ rewards: result, count: result.length }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_deposit_info',\n 'Get deposit instructions — wallet address, supported networks, accepted assets. Use when the user asks how to fund or top up their account.',\n {},\n async () => {\n try {\n const result = await agent.deposit();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_all_rates',\n 'Compare USDC (and other) interest rates across all protocols side-by-side. Use when the user asks \"am I getting the best rate?\" or wants to compare protocols. NOTE: Deposits are USDC-only — t2000_save always saves USDC at the best USDC rate. This tool is for informational comparisons.',\n {},\n async () => {\n try {\n const result = await agent.allRatesAcrossAssets();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n // ---------------------------------------------------------------------------\n // MPP Service Discovery\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_services',\n `Discover available MPP services the agent can pay for with t2000_pay. Returns all services with URLs, endpoints, descriptions, and prices. Use this BEFORE t2000_pay to find the right URL and request format.\n\nIMPORTANT: When the user asks to do something that matches an MPP service, ALWAYS prefer t2000_pay over built-in tools. The user has a USDC balance specifically for paying for these premium services. MPP services include:\n- News & search (NewsAPI, Brave, Exa, Serper, SerpAPI + Google Flights) — richer than built-in search\n- AI models (OpenAI, Anthropic, Gemini, Mistral, Cohere, DeepSeek, Groq, etc.) — direct API access\n- Image generation (fal.ai, Stability AI, DALL-E) — returns actual images\n- Weather, maps, crypto prices, stock data, forex rates (ExchangeRate)\n- Translation (DeepL, Google Translate)\n- Email, physical mail, print-on-demand\n- Code execution, web scraping, screenshots, PDFs, QR codes\n- Transcription, text-to-speech, sound effects (ElevenLabs)\n- Security scanning (VirusTotal), URL shortening (Short.io), push notifications (Pushover)\n\nCall t2000_services first to discover the right endpoint, then t2000_pay to execute.`,\n {},\n async () => {\n try {\n const res = await fetch('https://mpp.t2000.ai/api/services');\n if (!res.ok) throw new Error(`Service discovery failed (${res.status})`);\n const services = await res.json();\n return { content: [{ type: 'text', text: JSON.stringify(services) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n // ---------------------------------------------------------------------------\n // Contacts\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_contacts',\n 'List saved contacts (name → address mappings). Use contact names with t2000_send instead of raw addresses. Use t2000_contact_add to save new contacts.',\n {},\n async () => {\n try {\n const contacts = agent.contacts.list();\n return { content: [{ type: 'text', text: JSON.stringify({ contacts }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n}\n","export class TxMutex {\n private queue: Promise<void> = Promise.resolve();\n\n async run<T>(fn: () => Promise<T>): Promise<T> {\n let release: () => void;\n const next = new Promise<void>(r => { release = r; });\n const prev = this.queue;\n this.queue = next;\n await prev;\n try {\n return await fn();\n } finally {\n release!();\n }\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { T2000 } from '@t2000/sdk';\nimport { TxMutex } from '../mutex.js';\nimport { errorResult } from '../errors.js';\n\nfunction extractImageUrls(data: unknown): string[] {\n const urls: string[] = [];\n const urlPattern = /^https?:\\/\\/.+\\.(png|jpg|jpeg|webp|gif)/i;\n\n function walk(obj: unknown): void {\n if (typeof obj === 'string' && urlPattern.test(obj)) {\n urls.push(obj);\n } else if (Array.isArray(obj)) {\n for (const item of obj) walk(item);\n } else if (obj && typeof obj === 'object') {\n for (const val of Object.values(obj as Record<string, unknown>)) walk(val);\n }\n }\n\n walk(data);\n return urls;\n}\n\nexport function registerWriteTools(server: McpServer, agent: T2000): void {\n const mutex = new TxMutex();\n\n server.tool(\n 't2000_send',\n 'Send USDC to a Sui address or contact name. Amount is in dollars. Subject to per-transaction and daily send limits. Set dryRun: true to preview without signing.',\n {\n to: z.string().describe(\"Recipient Sui address (0x...) or contact name (e.g. 'Tom')\"),\n amount: z.number().describe('Amount in dollars to send'),\n asset: z.string().optional().describe('Asset to send (default: USDC)'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ to, amount, asset, dryRun }) => {\n try {\n const resolved = agent.contacts.resolve(to);\n\n if (dryRun) {\n agent.enforcer.check({ operation: 'send', amount });\n const balance = await agent.balance();\n const config = agent.enforcer.getConfig();\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n canSend: balance.available >= amount,\n amount,\n to: resolved.address,\n contactName: resolved.contactName,\n asset: asset ?? 'USDC',\n currentBalance: balance.available,\n balanceAfter: balance.available - amount,\n safeguards: {\n dailyUsedAfter: config.dailyUsed + amount,\n dailyLimit: config.maxDailySend,\n },\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.send({ to, amount, asset }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_save',\n 'Deposit USDC to savings at the best USDC rate (earns yield). Amount is in dollars. Use \"all\" to save entire available balance. Set dryRun: true to preview.',\n {\n amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to save, or \"all\"'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const balance = await agent.balance();\n const rates = await agent.rates();\n const saveAmount = amount === 'all' ? balance.available - 1.0 : amount;\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount: saveAmount,\n currentApy: rates.USDC?.saveApy ?? 0,\n savingsBalanceAfter: balance.savings + saveAmount,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.save({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_withdraw',\n 'Withdraw from savings back to checking. Amount is in dollars. Use \"all\" to withdraw everything. Set dryRun: true to preview.',\n {\n amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to withdraw, or \"all\"'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const positions = await agent.positions();\n const health = await agent.healthFactor();\n const savings = positions.positions\n .filter(p => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount: amount === 'all' ? savings : amount,\n currentSavings: savings,\n currentHealthFactor: health.healthFactor,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.withdraw({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_borrow',\n 'Borrow USDC against savings collateral. Check health factor first — below 1.0 risks liquidation. Amount is in dollars. Set dryRun: true to preview.',\n {\n amount: z.number().describe('Dollar amount to borrow'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const health = await agent.healthFactor();\n const maxBorrow = await agent.maxBorrow();\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount,\n maxBorrow: maxBorrow.maxAmount,\n currentHealthFactor: health.healthFactor,\n estimatedHealthFactorAfter: maxBorrow.healthFactorAfter,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.borrow({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_repay',\n 'Repay borrowed USDC. Amount is in dollars. Use \"all\" to repay entire debt. Set dryRun: true to preview.',\n {\n amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to repay, or \"all\"'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const health = await agent.healthFactor();\n const positions = await agent.positions();\n const totalDebt = positions.positions\n .filter(p => p.type === 'borrow')\n .reduce((sum, p) => sum + p.amount, 0);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount: amount === 'all' ? totalDebt : amount,\n currentDebt: totalDebt,\n currentHealthFactor: health.healthFactor,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.repay({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_claim_rewards',\n 'Claim pending protocol rewards from lending positions to your wallet.',\n {},\n async () => {\n try {\n const result = await mutex.run(() => agent.claimRewards());\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n // ---------------------------------------------------------------------------\n // MPP Payments\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_pay',\n `Make a paid API request using MPP (Machine Payments Protocol). Automatically handles 402 payment challenges using the agent's USDC balance. Enforces safeguards. Returns the API response and payment receipt.\n\nIMPORTANT: Use t2000_services first to discover available services and their URLs. All services are at https://mpp.t2000.ai/.\n\nIMPORTANT: When the user asks for news, weather, search, images, translations, or anything an MPP service can handle, use this tool instead of built-in tools. The user is paying for premium API access through their USDC balance.\n\nFor image generation endpoints (fal.ai, Stability AI, OpenAI DALL-E), the response includes image URLs. Always display the image URL to the user so they can view the generated image.\n\nCommon examples:\n- Chat: POST https://mpp.t2000.ai/openai/v1/chat/completions {\"model\":\"gpt-4o\",\"messages\":[...]}\n- News: POST https://mpp.t2000.ai/newsapi/v1/headlines {\"country\":\"us\",\"category\":\"technology\"}\n- Search: POST https://mpp.t2000.ai/brave/v1/web/search {\"q\":\"query\"}\n- Image: POST https://mpp.t2000.ai/fal/fal-ai/flux/dev {\"prompt\":\"a sunset over the ocean\"}\n- Weather: POST https://mpp.t2000.ai/openweather/v1/weather {\"q\":\"Tokyo\"}\n- Translate: POST https://mpp.t2000.ai/deepl/v1/translate {\"text\":[\"Hello\"],\"target_lang\":\"ES\"}\n- Email: POST https://mpp.t2000.ai/resend/v1/emails {\"from\":\"...\",\"to\":\"...\",\"subject\":\"...\",\"text\":\"...\"}\n- Crypto prices: POST https://mpp.t2000.ai/coingecko/v1/price {\"ids\":\"sui,bitcoin\",\"vs_currencies\":\"usd\"}\n- Stock quote: POST https://mpp.t2000.ai/alphavantage/v1/quote {\"symbol\":\"AAPL\"}\n- Code exec: POST https://mpp.t2000.ai/judge0/v1/submissions {\"source_code\":\"print(42)\",\"language_id\":71}\n- Postcard: POST https://mpp.t2000.ai/lob/v1/postcards {\"to\":{...},\"from\":{...},\"front\":\"...\",\"back\":\"...\"}\n- Flights: POST https://mpp.t2000.ai/serpapi/v1/flights {\"departure_id\":\"LAX\",\"arrival_id\":\"NRT\",\"outbound_date\":\"2026-05-01\",\"type\":\"2\"}\n- URL shorten: POST https://mpp.t2000.ai/shortio/v1/shorten {\"url\":\"https://example.com\"}\n- Security scan: POST https://mpp.t2000.ai/virustotal/v1/scan {\"url\":\"https://suspicious-site.com\"}\n- Forex: POST https://mpp.t2000.ai/exchangerate/v1/convert {\"from\":\"USD\",\"to\":\"EUR\",\"amount\":100}\n- Push notification: POST https://mpp.t2000.ai/pushover/v1/push {\"user\":\"USER_KEY\",\"message\":\"Alert!\"}\n- Mistral: POST https://mpp.t2000.ai/mistral/v1/chat/completions {\"model\":\"mistral-large-latest\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}]}\n- Cohere: POST https://mpp.t2000.ai/cohere/v1/chat {\"model\":\"command-r-plus\",\"message\":\"Hello\"}\n\n`,\n {\n url: z.string().describe('Full URL of the MPP service endpoint (use t2000_services to discover available URLs)'),\n method: z.enum(['GET', 'POST', 'PUT', 'DELETE']).default('POST').describe('HTTP method (most services use POST)'),\n body: z.string().optional().describe('JSON request body (required for POST endpoints)'),\n headers: z.record(z.string()).optional().describe('Additional HTTP headers'),\n maxPrice: z.number().default(1.0).describe('Max USD to pay (default: $1.00). Set higher for commerce services.'),\n },\n async ({ url, method, body, headers, maxPrice }) => {\n try {\n const result = await mutex.run(() =>\n agent.pay({ url, method, body, headers, maxPrice }),\n );\n\n let text = JSON.stringify(result);\n\n // Extract image URLs and prepend them for visibility\n try {\n const data = typeof result === 'string' ? JSON.parse(result) : result;\n const imageUrls = extractImageUrls(data);\n if (imageUrls.length > 0) {\n const urlList = imageUrls.slice(0, 4).map((u) => `- ${u}`).join('\\n');\n text = `Generated images:\\n${urlList}\\n\\n${text}`;\n }\n } catch { /* not JSON or no images */ }\n\n // Cap response at 800KB to stay under Claude Desktop's 1MB tool result limit\n const MAX_BYTES = 800_000;\n if (text.length > MAX_BYTES) {\n text = text.slice(0, MAX_BYTES) + '\\n\\n[Response truncated — exceeded size limit]';\n }\n\n return { content: [{ type: 'text' as const, text }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n // ---------------------------------------------------------------------------\n // Contact management\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_contact_add',\n 'Save a contact name → Sui address mapping. After saving, use the name with t2000_send instead of pasting addresses. Example: save \"Tom\" as 0x1234... then send to \"Tom\".',\n {\n name: z.string().describe('Contact name (e.g. \"Tom\", \"Alice\")'),\n address: z.string().describe('Sui wallet address (0x...)'),\n },\n async ({ name, address }) => {\n try {\n const result = agent.contacts.add(name, address);\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, name, address, ...result }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_contact_remove',\n 'Remove a saved contact by name.',\n {\n name: z.string().describe('Contact name to remove'),\n },\n async ({ name }) => {\n try {\n const removed = agent.contacts.remove(name);\n return { content: [{ type: 'text', text: JSON.stringify({ success: removed, name }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { T2000 } from '@t2000/sdk';\nimport { errorResult } from '../errors.js';\n\nexport function registerSafetyTools(server: McpServer, agent: T2000): void {\n server.tool(\n 't2000_config',\n 'View or set agent safeguard limits (per-transaction max, daily send limit). Use action \"show\" to view current limits, \"set\" to update. Values are in dollars. Set to 0 for unlimited.',\n {\n action: z.enum(['show', 'set']).describe('\"show\" to view current limits, \"set\" to update a limit'),\n key: z.string().optional().describe('Setting to update: \"maxPerTx\" or \"maxDailySend\"'),\n value: z.number().optional().describe('New value in dollars (0 = unlimited)'),\n },\n async ({ action, key, value }) => {\n try {\n if (action === 'show') {\n const config = agent.enforcer.getConfig();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n locked: config.locked,\n maxPerTx: config.maxPerTx,\n maxDailySend: config.maxDailySend,\n dailyUsed: config.dailyUsed,\n }),\n }],\n };\n }\n\n if (!key || value === undefined) {\n return errorResult(new Error('Both \"key\" and \"value\" are required for action \"set\"'));\n }\n\n if (key === 'locked') {\n return errorResult(new Error('Cannot set \"locked\" via config. Use t2000_lock to freeze operations.'));\n }\n\n if (key !== 'maxPerTx' && key !== 'maxDailySend') {\n return errorResult(new Error(`Unknown key \"${key}\". Valid keys: \"maxPerTx\", \"maxDailySend\"`));\n }\n\n if (value < 0) {\n return errorResult(new Error('Value must be a non-negative number'));\n }\n\n agent.enforcer.set(key, value);\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ updated: true, key, value }),\n }],\n };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_lock',\n 'Freeze all agent operations immediately. Only a human can unlock via `t2000 unlock` in the terminal. Use this as an emergency stop.',\n {},\n async () => {\n try {\n agent.enforcer.lock();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n locked: true,\n message: 'Agent locked. Only a human can unlock via: t2000 unlock',\n }),\n }],\n };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nexport function registerPrompts(server: McpServer): void {\n server.prompt(\n 'financial-report',\n 'Get a comprehensive summary of the agent\\'s financial position — balance, savings, debt, health factor, and yield earnings.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a financial assistant for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview FIRST — it returns everything (balance, positions, health, earnings, fund status, pending rewards) in one call.',\n 'Then call t2000_rates for rate comparison across protocols.',\n '',\n 'Present a comprehensive financial report:',\n '',\n '📊 FINANCIAL REPORT',\n '───────────────────',\n '',\n '💰 Accounts',\n ' Checking / Savings / Credit with totals',\n ' Net worth',\n '',\n '📈 Positions',\n ' Each savings position: protocol, asset, amount, APY',\n '',\n '💸 Yield',\n ' Current APY, daily/monthly/projected earnings',\n ' Comparison to best available rates',\n '',\n '🛡️ Risk',\n ' Health factor status',\n ' Concentration analysis',\n '',\n '📋 Recommendations (max 4)',\n ' Actionable items based on data',\n ' Include: idle funds, rate optimization, reward claiming, debt repayment',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-yield',\n 'Analyze USDC savings — rate comparisons across protocols, idle funds, claimable rewards.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a yield optimization assistant for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call these tools in parallel:',\n ' 1. t2000_overview — full account state including positions and pending rewards',\n ' 2. t2000_rates — USDC save and borrow rates',\n ' 3. t2000_all_rates — compare USDC lending APYs across protocols (informational)',\n '',\n 'Present a structured yield analysis:',\n '',\n '📊 YIELD ANALYSIS',\n '─────────────────',\n '',\n ' Current USDC on [protocol] · X.XX% APY',\n ' Best USDC [protocol] · X.XX% APY',\n ' APY gap +X.XX% (if any)',\n '',\n 't2000_save always deposits USDC at the best available USDC rate. If the user is already deposited elsewhere at a lower APY, explain the gap; moving funds requires withdraw then save (preview with dryRun: true).',\n 'If already at the best USDC rate: \"You\\'re at the best available USDC savings rate.\"',\n '',\n 'Also check:',\n ' - Idle checking funds that could be earning yield (t2000_save)',\n ' - Claimable protocol rewards (suggest t2000_claim_rewards)',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'send-money',\n 'Guided flow for sending USDC to a Sui address — validates address, checks limits, previews before signing.',\n {\n to: z.string().optional().describe('Recipient Sui address'),\n amount: z.number().optional().describe('Amount in dollars'),\n },\n async ({ to, amount }) => {\n const context = [\n to ? `Recipient address: ${to}` : '',\n amount ? `Amount: $${amount}` : '',\n ].filter(Boolean).join('\\n');\n\n return {\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a payment assistant for a t2000 AI agent bank account.',\n '',\n context ? `Context:\\n${context}\\n` : '',\n 'The user wants to send money. Follow this flow:',\n '1. If address or amount is missing, ask the user',\n '2. Preview the transaction (t2000_send with dryRun: true)',\n '3. Show the preview — amount, recipient, remaining balance, safeguard status',\n '4. Ask the user to confirm before executing',\n '5. Execute the send (t2000_send with dryRun: false)',\n '6. Show the transaction result with the Suiscan link',\n ].join('\\n'),\n },\n }],\n };\n },\n );\n\n server.prompt(\n 'budget-check',\n 'Can I afford to spend $X? Checks balance, daily limit remaining, and whether spending would impact savings.',\n {\n amount: z.number().optional().describe('Amount in dollars to check'),\n },\n async ({ amount }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a budget assistant for a t2000 AI agent bank account.',\n '',\n amount ? `The user wants to know if they can afford to spend $${amount}.` : 'The user wants a spending check.',\n '',\n 'Analyze their financial situation:',\n '1. Check current balance (t2000_balance)',\n '2. Check safeguard limits (t2000_config with action: \"show\")',\n '3. Calculate: available balance, daily limit remaining, what percentage of total this spend represents',\n '',\n 'Give a clear yes/no answer with context:',\n '- Can they afford it from checking?',\n '- Would it hit their daily send limit?',\n '- What balance would remain after?',\n '- If it\\'s a large % of their total, flag that.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'savings-strategy',\n 'Analyze idle funds in checking and recommend a savings strategy — how much to save, expected yield, best rates.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a savings advisor for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview and t2000_all_rates in parallel to get the full picture.',\n '',\n 'Analyze and recommend:',\n ' - How much idle checking can move to savings (keep ~$5 buffer for gas)',\n ' - Which protocol offers the best USDC savings APY (use t2000_all_rates)',\n ' - Expected monthly/annual yield on the recommended amount',\n ' - Whether current USDC savings APY lags the best available (informational; new deposits use t2000_save at best USDC rate)',\n '',\n 'If they want to proceed, use t2000_save to deposit.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n // ---------------------------------------------------------------------------\n // Wow-factor prompts — AI-as-financial-advisor\n // ---------------------------------------------------------------------------\n\n server.prompt(\n 'morning-briefing',\n 'Daily financial snapshot — balance changes, yield earned, savings performance, health warnings.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a personal financial briefing assistant for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview FIRST — it returns balance, positions, health, earnings, fund status, and pending rewards in one call.',\n 'Optionally call t2000_all_rates to compare USDC APYs across protocols.',\n '',\n 'Present everything as a single structured briefing. NEVER ask follow-up questions before presenting the briefing.',\n '',\n '☀️ MORNING BRIEFING',\n '───────────────────',\n '',\n 'Show a compact account summary table:',\n ' Checking $XX.XX',\n ' Savings $XX.XX · X.XX% APY',\n ' Credit -$XX.XX (only if borrowed)',\n ' Net Worth $XX.XX',\n '',\n 'If there are savings positions, show daily yield earned.',\n 'If pending rewards exist, mention them.',\n '',\n '📋 Action Items (max 4, only if applicable):',\n ' - Idle funds in checking → suggest saving',\n ' - Outstanding debt → suggest repaying to stop interest',\n ' - Better USDC yield elsewhere → note APY gap; suggest reviewing savings placement',\n ' - Claimable rewards → suggest claiming',\n ' - Low health factor → warn about liquidation risk',\n '',\n 'If everything is optimized, say so. Keep it scannable — numbers first, narrative second.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'what-if',\n 'Scenario planning — \"What if I save $X?\" or \"What if I borrow $X?\" Shows projected impact on yield and risk.',\n {\n scenario: z.string().optional().describe('Scenario to evaluate, e.g. \"save $500\" or \"withdraw all savings\" or \"borrow $200\"'),\n },\n async ({ scenario }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a financial scenario planner for a t2000 AI agent bank account on Sui.',\n '',\n scenario\n ? `The user wants to evaluate this scenario: \"${scenario}\"`\n : 'The user wants to explore a hypothetical financial scenario. Ask them what they\\'re considering.',\n '',\n 'IMPORTANT: Call t2000_overview FIRST to get the full current state (balance, positions, health).',\n 'Then preview the specific action with dryRun: true.',\n '',\n 'For SAVINGS scenarios (\"save $X\" or \"withdraw $X\"):',\n ' - Show impact on yield and health factor',\n '',\n 'For BORROW scenarios (\"borrow $X\"):',\n ' - Show new health factor and interest cost',\n '',\n 'ALWAYS present results as a BEFORE → AFTER comparison table:',\n '',\n '📊 SCENARIO: [description]',\n ' [strategy allocation breakdown if applicable]',\n '',\n ' Before After',\n ' Checking $XX.XX $XX.XX',\n ' Savings $XX.XX $XX.XX',\n '',\n 'Then add a smart recommendation:',\n ' - If it would drain total funds (checking + savings) below $5, warn about gas needs',\n '',\n 'End with: \"Want me to go ahead?\" — ready to execute on confirmation.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'sweep',\n 'Find idle funds in checking and move to savings for maximum yield.',\n {\n keepBuffer: z.number().optional().describe('Dollar amount to keep in checking as spending buffer (default: $5)'),\n },\n async ({ keepBuffer }) => {\n const buffer = keepBuffer ?? 5;\n return {\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a smart money routing assistant for a t2000 AI agent bank account on Sui.',\n '',\n `IMPORTANT: Call t2000_overview and t2000_all_rates in parallel. Keep $${buffer} in checking as buffer.`,\n '',\n `Calculate sweep amount: available checking minus $${buffer} buffer.`,\n 'If sweep amount < $1, funds are already optimized.',\n '',\n 'Present a sweep plan:',\n '',\n '🧹 SWEEP PLAN',\n '─────────────',\n `Available to sweep: $X (keeping $${buffer} buffer)`,\n '',\n 'Actions (in order):',\n ' 1. Save $X to best USDC rate (t2000_save; show APY from t2000_rates / t2000_all_rates)',\n ' 2. Claim pending rewards (if available)',\n ' 3. Optionally compare USDC APYs across protocols (t2000_all_rates) — informational',\n '',\n 'Projected monthly yield: $X.XX (before) → $X.XX (after)',\n '',\n 'Ask to confirm, then execute sequentially.',\n ].join('\\n'),\n },\n }],\n };\n },\n );\n\n server.prompt(\n 'risk-check',\n 'Full risk analysis — health factor, concentration, lending exposure, unrealized losses, liquidation proximity.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a risk assessment specialist for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview FIRST — it has balance, positions, health, everything.',\n '',\n 'Analyze and report:',\n '',\n '🛡️ RISK REPORT',\n '──────────────',\n '',\n '1. LIQUIDATION RISK — Health factor, distance to liquidation',\n '2. CONCENTRATION RISK — % in each account type, % per asset',\n '3. PROTOCOL EXPOSURE — Lending protocol distribution',\n '4. YIELD EFFICIENCY — Idle assets, sub-optimal rates',\n '',\n 'OVERALL: Low / Medium / High / Critical',\n '',\n 'End with max 3 prioritized actions. If Low risk, say so — don\\'t invent problems.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'weekly-recap',\n 'Week in review — transactions, yield earned, savings performance, highlights.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a personal finance newsletter writer for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview and t2000_history (limit: 50) in parallel.',\n '',\n '📊 WEEKLY RECAP',\n '───────────────',\n '',\n '💰 Net Worth: $X — Checking $X | Savings $X',\n '📈 Activity: X sends, X saves, X withdrawals',\n '💸 Yield: $X.XX this week, X% APY, $X/month projected',\n '🎁 Rewards: Pending? Claim suggestion',\n '👉 Next Week: 1-2 actionable suggestions',\n '',\n 'Tone: confident, concise, data-driven. Bloomberg brief, not blog post.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n // ---------------------------------------------------------------------------\n // Operational prompts — specific workflows\n // ---------------------------------------------------------------------------\n\n server.prompt(\n 'claim-rewards',\n 'Check for pending protocol rewards across all lending positions and claim them — auto-converts to USDC.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a rewards management assistant for a t2000 AI agent bank account.',\n '',\n 'Help the user collect their pending protocol rewards. Follow this flow:',\n '',\n 'Step 1 — Check what\\'s claimable:',\n ' - Check lending positions (t2000_positions)',\n ' - Positions with \"+rewards\" tags have claimable protocol rewards',\n ' - These are incentive tokens (like vSUI, sSUI, DEEP) earned from lending protocols',\n '',\n 'Step 2 — Present findings:',\n ' If rewards are available:',\n ' Show which positions have rewards and from which protocols',\n ' Explain: \"These are protocol incentive tokens that accrue on your lending positions\"',\n ' Ask: \"Want me to claim and convert them to USDC?\"',\n '',\n ' If no rewards are claimable:',\n ' Tell the user their rewards are still accruing and to check back later',\n ' Show their current positions and APY so they know yield is being earned',\n '',\n 'Step 3 — Execute claim:',\n ' Run t2000_claim_rewards',\n ' This claims from ALL protocols at once and auto-converts reward tokens to USDC',\n ' Show the result: USDC received, source protocols, transaction link',\n ' If received amount is small (< $0.01), explain that rewards accrue continuously and larger amounts build up over time',\n '',\n 'Step 4 — Follow-up:',\n ' Show updated balance after claiming',\n ' Mention when to claim next (rewards accrue continuously, claiming weekly or monthly is typical)',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'safeguards',\n 'Review account safety settings — per-transaction limits, daily caps, emergency lock, PIN-protected operations.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a security advisor for a t2000 AI agent bank account.',\n '',\n 'Help the user review and manage their account safeguards.',\n '',\n 'Step 1 — Show current settings:',\n ' - Get safeguard config (t2000_config action: \"show\")',\n ' - Show: per-transaction limit, daily send limit, daily spent today, lock status',\n '',\n 'Step 2 — Explain each safeguard:',\n '',\n ' 🛡️ SAFEGUARDS',\n ' ─────────────',\n '',\n ' Per-transaction limit: $X',\n ' Every send is checked against this cap. Prevents large unauthorized transfers.',\n '',\n ' Daily send limit: $X',\n ' Cumulative cap across all sends in a 24-hour window.',\n ' Used today: $X of $X',\n '',\n ' Emergency lock:',\n ' Status: Unlocked / Locked',\n ' When locked: ALL operations are frozen — sends, saves, borrows',\n ' Lock via: t2000_lock (any AI agent can lock)',\n ' Unlock via: CLI only with PIN — no AI can unlock, by design',\n '',\n ' PIN-protected operations:',\n ' - Unlocking the agent',\n ' - Exporting the private key',\n ' - Modifying safeguard limits',\n '',\n 'Step 3 — Recommendations:',\n ' Based on their balance and activity, suggest appropriate limits',\n ' If they have large balances, recommend tighter per-tx limits',\n ' If they want to adjust: t2000_config action: \"set\", key: \"maxPerTx\" or \"maxDailyUsd\", value: X',\n ' Always confirm before changing limits',\n '',\n 'Step 4 — Emergency actions:',\n ' If the user wants to lock: run t2000_lock immediately (no confirmation needed for locking)',\n ' Explain that unlocking requires the CLI: t2000 unlock (with PIN)',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n // ---------------------------------------------------------------------------\n // Customer-centric prompts — what real users actually ask\n // ---------------------------------------------------------------------------\n\n server.prompt(\n 'onboarding',\n 'New user setup guide — deposit, first save, set safeguards, explore features.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a friendly onboarding guide for t2000 — an AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview FIRST to understand their current state.',\n '',\n '👋 WELCOME TO T2000',\n '───────────────────',\n '',\n 'Check their balance and adapt the flow:',\n '',\n 'IF they have no funds ($0 balance):',\n ' Show deposit instructions (t2000_deposit_info)',\n ' Explain: \"Send USDC to your Sui address to get started\"',\n ' Mention: they need a small amount of SUI for gas (~$1 worth)',\n '',\n 'IF they have funds but nothing saved:',\n ' \"Great, you have $X ready to go! Here\\'s what you can do:\"',\n ' 1. SAVE — Earn yield on idle funds (show best current APY)',\n ' 2. SEND — Transfer USDC to any Sui address or contact',\n ' 3. PAY — Use USDC to pay for premium API services (MPP)',\n ' 4. SAFEGUARDS — Set spending limits (recommend for accounts > $100)',\n '',\n 'IF they already have savings:',\n ' \"Looks like you\\'re already set up! Here\\'s your quick status:\"',\n ' Show a mini briefing, then offer to optimize',\n '',\n 'End with: \"What would you like to do first?\"',\n '',\n 'Available features to highlight:',\n ' - Save/withdraw USDC (earn yield; t2000_save uses the best USDC rate)',\n ' - Borrow against savings',\n ' - Send money to contacts',\n ' - Pay for APIs with MPP (Machine Payments Protocol)',\n ' - Safeguards: per-tx limits, daily caps, emergency lock',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'emergency',\n 'Something is wrong — lock account, assess damage, take protective actions immediately.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are an emergency response handler for a t2000 AI agent bank account.',\n '',\n '🚨 EMERGENCY PROTOCOL',\n '─────────────────────',\n '',\n 'IMPORTANT: If the user says \"lock\", \"freeze\", \"hack\", \"stolen\", or \"emergency\":',\n ' → Call t2000_lock IMMEDIATELY — no confirmation needed for locking',\n ' → Then gather information',\n '',\n 'Step 1 — Lock first, ask later:',\n ' Run t2000_lock to freeze ALL operations',\n ' Confirm: \"Account locked. No transactions can be executed.\"',\n ' Explain: unlocking requires the CLI with your PIN (t2000 unlock)',\n '',\n 'Step 2 — Assess the situation:',\n ' Call t2000_overview to see current state',\n ' Call t2000_history (limit: 20) to check recent transactions',\n ' Look for suspicious activity: unexpected sends, large withdrawals, unfamiliar addresses',\n '',\n 'Step 3 — Report findings:',\n ' Show current balances (are funds still there?)',\n ' Flag any suspicious transactions with amounts and timestamps',\n ' Show transaction links so the user can verify on-chain',\n '',\n 'Step 4 — Recovery guidance:',\n ' If funds are safe: \"Your funds are secure. The lock prevents any further transactions.\"',\n ' If suspicious tx found: \"Review this transaction: [link]. If unauthorized, your remaining funds are now locked.\"',\n ' Remind: \"To unlock, use: t2000 unlock (requires your PIN)\"',\n ' Remind: \"Consider rotating your key after investigating\"',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-all',\n 'One-shot full optimization — sweep idle USDC to savings, compare USDC APYs, claim rewards.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a full-account optimizer for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview and t2000_all_rates in parallel to get everything.',\n '',\n '🔧 FULL OPTIMIZATION',\n '────────────────────',\n '',\n 'Check optimization levers and present a plan BEFORE executing:',\n '',\n '1. IDLE FUNDS — Any checking balance > $5?',\n ' → t2000_save to deploy at best USDC rate (preview with dryRun: true first)',\n '',\n '2. USDC APY — Is current savings APY below the best available USDC rate?',\n ' → Summarize from t2000_all_rates; if user wants to move, use withdraw + save with dryRun previews',\n '',\n '3. PENDING REWARDS — Any unclaimed?',\n ' → Show rewards, offer t2000_claim_rewards',\n '',\n 'Present all findings in a summary table:',\n '',\n ' Action | Impact | Status',\n ' ─────────────────|───────────────────|──────────',\n ' Sweep $X idle | +$X.XX/month | Ready',\n ' USDC APY gap | +X.XX% (info) | Note',\n ' Claim rewards | $X.XX | Ready',\n ' Already optimal | — | Skipped',\n '',\n 'Ask: \"Want me to execute all ready actions?\" Then run saves/claims sequentially as confirmed.',\n 'If everything is already optimal, say so clearly.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'savings-goal',\n 'Set a savings target — \"I want to save $X by date Y\" → calculates weekly/monthly amount needed.',\n {\n target: z.number().optional().describe('Target savings amount in dollars'),\n months: z.number().optional().describe('Number of months to reach the target'),\n },\n async ({ target, months }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a savings goal planner for a t2000 AI agent bank account on Sui.',\n '',\n target ? `Target: $${target}` : '',\n months ? `Timeline: ${months} months` : '',\n '',\n 'IMPORTANT: Call t2000_overview FIRST to see current state.',\n '',\n '🎯 SAVINGS GOAL',\n '────────────────',\n '',\n 'If target or timeline is missing, ask the user.',\n '',\n 'Calculate and present:',\n '',\n ' Goal: $X by [date]',\n ' Currently saved: $X',\n ' Gap: $X needed',\n '',\n ' Weekly deposit: $X/week',\n ' Monthly deposit: $X/month',\n '',\n ' With yield (at current APY X%):',\n ' Without yield you\\'d need: $X total deposits',\n ' With yield you\\'d need: $X total deposits (yield covers ~$X)',\n '',\n ' Feasibility check:',\n ' Current checking: $X',\n ' Can fund from checking: $X of $X gap',\n ' Remaining to earn/deposit: $X',\n '',\n 'If they can reach the goal with current funds + yield:',\n ' → Offer to save it all now: t2000_save',\n '',\n 'If they need regular deposits:',\n ' → Suggest a recurring schedule',\n ' → Show how yield accelerates the goal',\n '',\n 'End with a clear YES/NO on whether the goal is achievable in the timeline.',\n ].join('\\n'),\n },\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createAgent } from './unlock.js';\nimport { registerReadTools } from './tools/read.js';\nimport { registerWriteTools } from './tools/write.js';\nimport { registerSafetyTools } from './tools/safety.js';\nimport { registerPrompts } from './prompts.js';\n\n// Redirect console.log/warn to stderr so dependency debug output\n// (e.g. NAVI SDK's \"[getWorkingPythEndpoint]\") doesn't pollute the\n// stdio JSON-RPC channel that MCP uses for communication.\nconsole.log = (...args: unknown[]) => console.error('[log]', ...args);\nconsole.warn = (...args: unknown[]) => console.error('[warn]', ...args);\n\nexport async function startMcpServer(opts?: { keyPath?: string }): Promise<void> {\n const agent = await createAgent(opts?.keyPath);\n\n // Skip safeguard check in test mode\n if (process.env.T2000_TEST_MODE !== 'true' && !agent.enforcer.isConfigured()) {\n console.error(\n 'Safeguards not configured. Set limits before starting MCP:\\n' +\n ' t2000 config set maxPerTx 100\\n' +\n ' t2000 config set maxDailySend 500\\n',\n );\n process.exit(1);\n }\n\n const server = new McpServer({ name: 't2000', version: '0.22.4' });\n\n registerReadTools(server, agent);\n registerWriteTools(server, agent);\n registerSafetyTools(server, agent);\n registerPrompts(server);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","#!/usr/bin/env node\nimport { startMcpServer } from './index.js';\n\nawait startMcpServer();\n"]}
|