@t2000/mcp 0.12.1 → 0.12.3

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/dist/bin.js CHANGED
@@ -58,7 +58,7 @@ function errorResult(err) {
58
58
  function registerReadTools(server, agent) {
59
59
  server.tool(
60
60
  "t2000_balance",
61
- "Get agent's current balance \u2014 available (checking), savings, gas reserve, and total. All values in USD.",
61
+ "Get agent's current balance \u2014 available (checking), savings, credit (debt), gas reserve, and net total. All values in USD.",
62
62
  {},
63
63
  async () => {
64
64
  try {
package/dist/bin.js.map CHANGED
@@ -1 +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":["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 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 server.tool(\n 't2000_balance',\n \"Get agent's current balance — available (checking), savings, gas reserve, and total. All values in USD.\",\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.\",\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 across protocols (NAVI, Suilend) — deposits, borrows, APYs.',\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.',\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.\",\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, swaps, etc.).',\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.',\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","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 { T2000, validateAddress } from '@t2000/sdk';\nimport { TxMutex } from '../mutex.js';\nimport { errorResult } from '../errors.js';\n\nexport function registerWriteTools(server: McpServer, agent: T2000): void {\n const mutex = new TxMutex();\n\n server.tool(\n 't2000_send',\n 'Send USDC or stablecoins to a Sui address. 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...)'),\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 if (!validateAddress(to)) {\n return errorResult(new Error(`Invalid Sui address: ${to}`));\n }\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,\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 (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_exchange',\n 'Swap assets via Cetus DEX (e.g. USDC to SUI, SUI to USDC). Amount is in source asset units. Set dryRun: true to get a quote without executing.',\n {\n amount: z.number().describe('Amount to swap (in source asset units)'),\n from: z.string().describe('Source asset (e.g. USDC, SUI)'),\n to: z.string().describe('Target asset (e.g. SUI, USDC)'),\n maxSlippage: z.number().optional().describe('Max slippage percentage (default: 3%)'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, from, to, maxSlippage, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const quote = await agent.exchangeQuote({ from, to, amount });\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n from,\n to,\n amount,\n expectedOutput: quote.expectedOutput,\n priceImpact: quote.priceImpact,\n fee: quote.fee.amount,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() =>\n agent.exchange({ from, to, amount, maxSlippage }),\n );\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_rebalance',\n 'Optimize yield by moving funds to the highest-rate protocol. Always previews first — set dryRun: false to execute. Shows plan with expected APY gain and break-even period.',\n {\n dryRun: z.boolean().optional().describe('Preview without executing (default: true)'),\n minYieldDiff: z.number().optional().describe('Min APY difference to rebalance (default: 0.5%)'),\n maxBreakEven: z.number().optional().describe('Max break-even days (default: 30)'),\n },\n async ({ dryRun, minYieldDiff, maxBreakEven }) => {\n try {\n const result = await mutex.run(() =>\n agent.rebalance({\n dryRun: dryRun ?? true,\n minYieldDiff,\n maxBreakEven,\n }),\n );\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\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.',\n '',\n 'Please provide a comprehensive financial report by:',\n '1. Check the current balance (t2000_balance)',\n '2. Review lending positions (t2000_positions)',\n '3. Check the health factor (t2000_health)',\n '4. Show yield earnings (t2000_earnings)',\n '5. Review current interest rates (t2000_rates)',\n '',\n 'Summarize the agent\\'s financial health in a clear, concise format with actionable recommendations.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-yield',\n 'Analyze savings positions and suggest yield optimizations — rate comparisons, rebalancing opportunities.',\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.',\n '',\n 'Please analyze the current yield strategy:',\n '1. Check current positions (t2000_positions)',\n '2. Compare rates across protocols (t2000_rates)',\n '3. Run a dry-run rebalance to see if optimization is available (t2000_rebalance with dryRun: true)',\n '',\n 'If a rebalance would improve yield, explain the trade-off (gas cost vs yield gain, break-even period) and ask if the user wants to proceed.',\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.',\n '',\n 'Analyze the user\\'s funds and recommend a savings strategy:',\n '1. Check current balance (t2000_balance) — how much is idle in checking?',\n '2. Check current positions (t2000_positions) — what\\'s already in savings?',\n '3. Compare rates across protocols (t2000_rates) — where\\'s the best yield?',\n '',\n 'Recommend:',\n '- How much to move from checking to savings (keep a reasonable buffer for gas + daily spending)',\n '- Which protocol offers the best rate right now',\n '- Expected annual yield on the recommended amount',\n '- If they should rebalance existing savings (t2000_rebalance with dryRun: true)',\n '',\n 'If they want to proceed, use t2000_save to deposit. Always preview first.',\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\nexport async function startMcpServer(opts?: { keyPath?: string }): Promise<void> {\n const agent = await createAgent(opts?.keyPath);\n\n if (!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.12.0' });\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"]}
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":["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 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 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.\",\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.\",\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 across protocols (NAVI, Suilend) — deposits, borrows, APYs.',\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.',\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.\",\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, swaps, etc.).',\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.',\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","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 { T2000, validateAddress } from '@t2000/sdk';\nimport { TxMutex } from '../mutex.js';\nimport { errorResult } from '../errors.js';\n\nexport function registerWriteTools(server: McpServer, agent: T2000): void {\n const mutex = new TxMutex();\n\n server.tool(\n 't2000_send',\n 'Send USDC or stablecoins to a Sui address. 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...)'),\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 if (!validateAddress(to)) {\n return errorResult(new Error(`Invalid Sui address: ${to}`));\n }\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,\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 (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_exchange',\n 'Swap assets via Cetus DEX (e.g. USDC to SUI, SUI to USDC). Amount is in source asset units. Set dryRun: true to get a quote without executing.',\n {\n amount: z.number().describe('Amount to swap (in source asset units)'),\n from: z.string().describe('Source asset (e.g. USDC, SUI)'),\n to: z.string().describe('Target asset (e.g. SUI, USDC)'),\n maxSlippage: z.number().optional().describe('Max slippage percentage (default: 3%)'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, from, to, maxSlippage, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const quote = await agent.exchangeQuote({ from, to, amount });\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n from,\n to,\n amount,\n expectedOutput: quote.expectedOutput,\n priceImpact: quote.priceImpact,\n fee: quote.fee.amount,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() =>\n agent.exchange({ from, to, amount, maxSlippage }),\n );\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_rebalance',\n 'Optimize yield by moving funds to the highest-rate protocol. Always previews first — set dryRun: false to execute. Shows plan with expected APY gain and break-even period.',\n {\n dryRun: z.boolean().optional().describe('Preview without executing (default: true)'),\n minYieldDiff: z.number().optional().describe('Min APY difference to rebalance (default: 0.5%)'),\n maxBreakEven: z.number().optional().describe('Max break-even days (default: 30)'),\n },\n async ({ dryRun, minYieldDiff, maxBreakEven }) => {\n try {\n const result = await mutex.run(() =>\n agent.rebalance({\n dryRun: dryRun ?? true,\n minYieldDiff,\n maxBreakEven,\n }),\n );\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\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.',\n '',\n 'Please provide a comprehensive financial report by:',\n '1. Check the current balance (t2000_balance)',\n '2. Review lending positions (t2000_positions)',\n '3. Check the health factor (t2000_health)',\n '4. Show yield earnings (t2000_earnings)',\n '5. Review current interest rates (t2000_rates)',\n '',\n 'Summarize the agent\\'s financial health in a clear, concise format with actionable recommendations.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-yield',\n 'Analyze savings positions and suggest yield optimizations — rate comparisons, rebalancing opportunities.',\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.',\n '',\n 'Please analyze the current yield strategy:',\n '1. Check current positions (t2000_positions)',\n '2. Compare rates across protocols (t2000_rates)',\n '3. Run a dry-run rebalance to see if optimization is available (t2000_rebalance with dryRun: true)',\n '',\n 'If a rebalance would improve yield, explain the trade-off (gas cost vs yield gain, break-even period) and ask if the user wants to proceed.',\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.',\n '',\n 'Analyze the user\\'s funds and recommend a savings strategy:',\n '1. Check current balance (t2000_balance) — how much is idle in checking?',\n '2. Check current positions (t2000_positions) — what\\'s already in savings?',\n '3. Compare rates across protocols (t2000_rates) — where\\'s the best yield?',\n '',\n 'Recommend:',\n '- How much to move from checking to savings (keep a reasonable buffer for gas + daily spending)',\n '- Which protocol offers the best rate right now',\n '- Expected annual yield on the recommended amount',\n '- If they should rebalance existing savings (t2000_rebalance with dryRun: true)',\n '',\n 'If they want to proceed, use t2000_save to deposit. Always preview first.',\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\nexport async function startMcpServer(opts?: { keyPath?: string }): Promise<void> {\n const agent = await createAgent(opts?.keyPath);\n\n if (!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.12.0' });\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"]}
package/dist/index.js CHANGED
@@ -58,7 +58,7 @@ function errorResult(err) {
58
58
  function registerReadTools(server, agent) {
59
59
  server.tool(
60
60
  "t2000_balance",
61
- "Get agent's current balance \u2014 available (checking), savings, gas reserve, and total. All values in USD.",
61
+ "Get agent's current balance \u2014 available (checking), savings, credit (debt), gas reserve, and net total. All values in USD.",
62
62
  {},
63
63
  async () => {
64
64
  try {
package/dist/index.js.map CHANGED
@@ -1 +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"],"names":["z"],"mappings":"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","file":"index.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 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 server.tool(\n 't2000_balance',\n \"Get agent's current balance — available (checking), savings, gas reserve, and total. All values in USD.\",\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.\",\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 across protocols (NAVI, Suilend) — deposits, borrows, APYs.',\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.',\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.\",\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, swaps, etc.).',\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.',\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","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 { T2000, validateAddress } from '@t2000/sdk';\nimport { TxMutex } from '../mutex.js';\nimport { errorResult } from '../errors.js';\n\nexport function registerWriteTools(server: McpServer, agent: T2000): void {\n const mutex = new TxMutex();\n\n server.tool(\n 't2000_send',\n 'Send USDC or stablecoins to a Sui address. 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...)'),\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 if (!validateAddress(to)) {\n return errorResult(new Error(`Invalid Sui address: ${to}`));\n }\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,\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 (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_exchange',\n 'Swap assets via Cetus DEX (e.g. USDC to SUI, SUI to USDC). Amount is in source asset units. Set dryRun: true to get a quote without executing.',\n {\n amount: z.number().describe('Amount to swap (in source asset units)'),\n from: z.string().describe('Source asset (e.g. USDC, SUI)'),\n to: z.string().describe('Target asset (e.g. SUI, USDC)'),\n maxSlippage: z.number().optional().describe('Max slippage percentage (default: 3%)'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, from, to, maxSlippage, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const quote = await agent.exchangeQuote({ from, to, amount });\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n from,\n to,\n amount,\n expectedOutput: quote.expectedOutput,\n priceImpact: quote.priceImpact,\n fee: quote.fee.amount,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() =>\n agent.exchange({ from, to, amount, maxSlippage }),\n );\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_rebalance',\n 'Optimize yield by moving funds to the highest-rate protocol. Always previews first — set dryRun: false to execute. Shows plan with expected APY gain and break-even period.',\n {\n dryRun: z.boolean().optional().describe('Preview without executing (default: true)'),\n minYieldDiff: z.number().optional().describe('Min APY difference to rebalance (default: 0.5%)'),\n maxBreakEven: z.number().optional().describe('Max break-even days (default: 30)'),\n },\n async ({ dryRun, minYieldDiff, maxBreakEven }) => {\n try {\n const result = await mutex.run(() =>\n agent.rebalance({\n dryRun: dryRun ?? true,\n minYieldDiff,\n maxBreakEven,\n }),\n );\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\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.',\n '',\n 'Please provide a comprehensive financial report by:',\n '1. Check the current balance (t2000_balance)',\n '2. Review lending positions (t2000_positions)',\n '3. Check the health factor (t2000_health)',\n '4. Show yield earnings (t2000_earnings)',\n '5. Review current interest rates (t2000_rates)',\n '',\n 'Summarize the agent\\'s financial health in a clear, concise format with actionable recommendations.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-yield',\n 'Analyze savings positions and suggest yield optimizations — rate comparisons, rebalancing opportunities.',\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.',\n '',\n 'Please analyze the current yield strategy:',\n '1. Check current positions (t2000_positions)',\n '2. Compare rates across protocols (t2000_rates)',\n '3. Run a dry-run rebalance to see if optimization is available (t2000_rebalance with dryRun: true)',\n '',\n 'If a rebalance would improve yield, explain the trade-off (gas cost vs yield gain, break-even period) and ask if the user wants to proceed.',\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.',\n '',\n 'Analyze the user\\'s funds and recommend a savings strategy:',\n '1. Check current balance (t2000_balance) — how much is idle in checking?',\n '2. Check current positions (t2000_positions) — what\\'s already in savings?',\n '3. Compare rates across protocols (t2000_rates) — where\\'s the best yield?',\n '',\n 'Recommend:',\n '- How much to move from checking to savings (keep a reasonable buffer for gas + daily spending)',\n '- Which protocol offers the best rate right now',\n '- Expected annual yield on the recommended amount',\n '- If they should rebalance existing savings (t2000_rebalance with dryRun: true)',\n '',\n 'If they want to proceed, use t2000_save to deposit. Always preview first.',\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\nexport async function startMcpServer(opts?: { keyPath?: string }): Promise<void> {\n const agent = await createAgent(opts?.keyPath);\n\n if (!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.12.0' });\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"]}
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"],"names":["z"],"mappings":"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","file":"index.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 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 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.\",\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.\",\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 across protocols (NAVI, Suilend) — deposits, borrows, APYs.',\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.',\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.\",\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, swaps, etc.).',\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.',\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","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 { T2000, validateAddress } from '@t2000/sdk';\nimport { TxMutex } from '../mutex.js';\nimport { errorResult } from '../errors.js';\n\nexport function registerWriteTools(server: McpServer, agent: T2000): void {\n const mutex = new TxMutex();\n\n server.tool(\n 't2000_send',\n 'Send USDC or stablecoins to a Sui address. 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...)'),\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 if (!validateAddress(to)) {\n return errorResult(new Error(`Invalid Sui address: ${to}`));\n }\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,\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 (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_exchange',\n 'Swap assets via Cetus DEX (e.g. USDC to SUI, SUI to USDC). Amount is in source asset units. Set dryRun: true to get a quote without executing.',\n {\n amount: z.number().describe('Amount to swap (in source asset units)'),\n from: z.string().describe('Source asset (e.g. USDC, SUI)'),\n to: z.string().describe('Target asset (e.g. SUI, USDC)'),\n maxSlippage: z.number().optional().describe('Max slippage percentage (default: 3%)'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, from, to, maxSlippage, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const quote = await agent.exchangeQuote({ from, to, amount });\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n from,\n to,\n amount,\n expectedOutput: quote.expectedOutput,\n priceImpact: quote.priceImpact,\n fee: quote.fee.amount,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() =>\n agent.exchange({ from, to, amount, maxSlippage }),\n );\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_rebalance',\n 'Optimize yield by moving funds to the highest-rate protocol. Always previews first — set dryRun: false to execute. Shows plan with expected APY gain and break-even period.',\n {\n dryRun: z.boolean().optional().describe('Preview without executing (default: true)'),\n minYieldDiff: z.number().optional().describe('Min APY difference to rebalance (default: 0.5%)'),\n maxBreakEven: z.number().optional().describe('Max break-even days (default: 30)'),\n },\n async ({ dryRun, minYieldDiff, maxBreakEven }) => {\n try {\n const result = await mutex.run(() =>\n agent.rebalance({\n dryRun: dryRun ?? true,\n minYieldDiff,\n maxBreakEven,\n }),\n );\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\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.',\n '',\n 'Please provide a comprehensive financial report by:',\n '1. Check the current balance (t2000_balance)',\n '2. Review lending positions (t2000_positions)',\n '3. Check the health factor (t2000_health)',\n '4. Show yield earnings (t2000_earnings)',\n '5. Review current interest rates (t2000_rates)',\n '',\n 'Summarize the agent\\'s financial health in a clear, concise format with actionable recommendations.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-yield',\n 'Analyze savings positions and suggest yield optimizations — rate comparisons, rebalancing opportunities.',\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.',\n '',\n 'Please analyze the current yield strategy:',\n '1. Check current positions (t2000_positions)',\n '2. Compare rates across protocols (t2000_rates)',\n '3. Run a dry-run rebalance to see if optimization is available (t2000_rebalance with dryRun: true)',\n '',\n 'If a rebalance would improve yield, explain the trade-off (gas cost vs yield gain, break-even period) and ask if the user wants to proceed.',\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.',\n '',\n 'Analyze the user\\'s funds and recommend a savings strategy:',\n '1. Check current balance (t2000_balance) — how much is idle in checking?',\n '2. Check current positions (t2000_positions) — what\\'s already in savings?',\n '3. Compare rates across protocols (t2000_rates) — where\\'s the best yield?',\n '',\n 'Recommend:',\n '- How much to move from checking to savings (keep a reasonable buffer for gas + daily spending)',\n '- Which protocol offers the best rate right now',\n '- Expected annual yield on the recommended amount',\n '- If they should rebalance existing savings (t2000_rebalance with dryRun: true)',\n '',\n 'If they want to proceed, use t2000_save to deposit. Always preview first.',\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\nexport async function startMcpServer(opts?: { keyPath?: string }): Promise<void> {\n const agent = await createAgent(opts?.keyPath);\n\n if (!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.12.0' });\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t2000/mcp",
3
- "version": "0.12.1",
3
+ "version": "0.12.3",
4
4
  "description": "MCP server for AI agent bank accounts on Sui — 16 tools, 5 prompts, stdio transport",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -39,7 +39,7 @@
39
39
  "dependencies": {
40
40
  "@modelcontextprotocol/sdk": "^1.27.0",
41
41
  "zod": "^3.25.0",
42
- "@t2000/sdk": "0.11.0"
42
+ "@t2000/sdk": "0.11.2"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^20",