@sardis/mcp-server 0.1.0

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/CLAUDE_DESKTOP_CONFIG.md +180 -0
  3. package/LICENSE +21 -0
  4. package/README.md +375 -0
  5. package/dist/api.d.ts +25 -0
  6. package/dist/api.d.ts.map +1 -0
  7. package/dist/api.js +70 -0
  8. package/dist/api.js.map +1 -0
  9. package/dist/cli.d.ts +12 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +274 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/config.d.ts +47 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +82 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/index.d.ts +61 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +255 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/tools/agents.d.ts +7 -0
  22. package/dist/tools/agents.d.ts.map +1 -0
  23. package/dist/tools/agents.js +219 -0
  24. package/dist/tools/agents.js.map +1 -0
  25. package/dist/tools/approvals.d.ts +9 -0
  26. package/dist/tools/approvals.d.ts.map +1 -0
  27. package/dist/tools/approvals.js +308 -0
  28. package/dist/tools/approvals.js.map +1 -0
  29. package/dist/tools/cards.d.ts +9 -0
  30. package/dist/tools/cards.d.ts.map +1 -0
  31. package/dist/tools/cards.js +415 -0
  32. package/dist/tools/cards.js.map +1 -0
  33. package/dist/tools/fiat.d.ts +9 -0
  34. package/dist/tools/fiat.d.ts.map +1 -0
  35. package/dist/tools/fiat.js +394 -0
  36. package/dist/tools/fiat.js.map +1 -0
  37. package/dist/tools/holds.d.ts +7 -0
  38. package/dist/tools/holds.d.ts.map +1 -0
  39. package/dist/tools/holds.js +403 -0
  40. package/dist/tools/holds.js.map +1 -0
  41. package/dist/tools/index.d.ts +70 -0
  42. package/dist/tools/index.d.ts.map +1 -0
  43. package/dist/tools/index.js +152 -0
  44. package/dist/tools/index.js.map +1 -0
  45. package/dist/tools/payments.d.ts +47 -0
  46. package/dist/tools/payments.d.ts.map +1 -0
  47. package/dist/tools/payments.js +447 -0
  48. package/dist/tools/payments.js.map +1 -0
  49. package/dist/tools/policy.d.ts +41 -0
  50. package/dist/tools/policy.d.ts.map +1 -0
  51. package/dist/tools/policy.js +450 -0
  52. package/dist/tools/policy.js.map +1 -0
  53. package/dist/tools/spending.d.ts +9 -0
  54. package/dist/tools/spending.d.ts.map +1 -0
  55. package/dist/tools/spending.js +324 -0
  56. package/dist/tools/spending.js.map +1 -0
  57. package/dist/tools/types.d.ts +247 -0
  58. package/dist/tools/types.d.ts.map +1 -0
  59. package/dist/tools/types.js +71 -0
  60. package/dist/tools/types.js.map +1 -0
  61. package/dist/tools/wallet-management.d.ts +9 -0
  62. package/dist/tools/wallet-management.d.ts.map +1 -0
  63. package/dist/tools/wallet-management.js +222 -0
  64. package/dist/tools/wallet-management.js.map +1 -0
  65. package/dist/tools/wallets.d.ts +15 -0
  66. package/dist/tools/wallets.d.ts.map +1 -0
  67. package/dist/tools/wallets.js +112 -0
  68. package/dist/tools/wallets.js.map +1 -0
  69. package/mcp.json +283 -0
  70. package/package.json +145 -0
@@ -0,0 +1,450 @@
1
+ /**
2
+ * Sardis MCP Server - Policy Tools
3
+ *
4
+ * Tools for validating payments against spending policies.
5
+ */
6
+ import { PolicyCheckSchema, ComplianceCheckSchema } from './types.js';
7
+ import { apiRequest } from '../api.js';
8
+ import { getConfig, getBlockedVendors, getAllowedVendors } from '../config.js';
9
+ import { getWalletInfo } from './wallets.js';
10
+ function derivePolicyReasonCode(result) {
11
+ if (result.allowed)
12
+ return 'SARDIS.POLICY.ALLOW';
13
+ const checks = result.checks || [];
14
+ if (checks.some((c) => c.name === 'per_transaction_limit' && !c.passed)) {
15
+ return 'SARDIS.POLICY.LIMIT_EXCEEDED';
16
+ }
17
+ if (checks.some((c) => c.name === 'vendor_allowlist' && !c.passed)) {
18
+ return 'SARDIS.POLICY.VENDOR_BLOCKED';
19
+ }
20
+ if (checks.some((c) => c.name === 'category_check' && !c.passed)) {
21
+ return 'SARDIS.POLICY.CATEGORY_BLOCKED';
22
+ }
23
+ return 'SARDIS.POLICY.DENY';
24
+ }
25
+ function buildPolicyDecision(result) {
26
+ const config = getConfig();
27
+ return {
28
+ decision_id: `dec_pol_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`,
29
+ outcome: result.allowed ? 'APPROVED' : 'BLOCKED',
30
+ reason_code: derivePolicyReasonCode(result),
31
+ reason: result.reason || (result.allowed ? 'Allowed by policy' : 'Blocked by policy'),
32
+ context: {
33
+ agent_id: config.agentId || null,
34
+ wallet_id: config.walletId || null,
35
+ chain: config.chain,
36
+ mode: config.mode,
37
+ payment_identity_id: process.env.SARDIS_PAYMENT_IDENTITY || null,
38
+ },
39
+ };
40
+ }
41
+ /**
42
+ * Check policy via API or local validation
43
+ */
44
+ export async function checkPolicy(vendor, amount, category) {
45
+ const config = getConfig();
46
+ const checks = [];
47
+ let allPassed = true;
48
+ try {
49
+ // Get wallet limits
50
+ const wallet = await getWalletInfo();
51
+ const limitPerTx = parseFloat(wallet.limit_per_tx);
52
+ // Per-transaction limit check
53
+ if (amount <= limitPerTx) {
54
+ checks.push({ name: 'per_transaction_limit', passed: true });
55
+ }
56
+ else {
57
+ checks.push({
58
+ name: 'per_transaction_limit',
59
+ passed: false,
60
+ reason: `Amount $${amount} exceeds limit of $${limitPerTx}`,
61
+ });
62
+ allPassed = false;
63
+ }
64
+ // Wallet active check
65
+ if (wallet.is_active) {
66
+ checks.push({ name: 'wallet_active', passed: true });
67
+ }
68
+ else {
69
+ checks.push({
70
+ name: 'wallet_active',
71
+ passed: false,
72
+ reason: 'Wallet is not active',
73
+ });
74
+ allPassed = false;
75
+ }
76
+ // Vendor validation using configurable lists
77
+ const normalizedVendor = vendor.toLowerCase().trim();
78
+ const blockedVendors = getBlockedVendors();
79
+ const allowedVendors = getAllowedVendors();
80
+ // SECURITY: Use exact match instead of substring to prevent bypass.
81
+ // Substring matching allows "aws-evil.com" to match "aws" on the allowlist,
82
+ // or "not-gambling-site" to match "gambling" on the blocklist.
83
+ const isBlocked = blockedVendors.some((b) => normalizedVendor === b.toLowerCase());
84
+ const isAllowed = allowedVendors.some((v) => normalizedVendor === v.toLowerCase());
85
+ if (isBlocked) {
86
+ checks.push({
87
+ name: 'vendor_allowlist',
88
+ passed: false,
89
+ reason: `Vendor "${vendor}" is blocked by policy`,
90
+ });
91
+ allPassed = false;
92
+ }
93
+ else if (isAllowed) {
94
+ checks.push({ name: 'vendor_allowlist', passed: true });
95
+ }
96
+ else {
97
+ // Unknown vendor - could require approval based on config
98
+ if (config.requireExplicitApproval) {
99
+ checks.push({
100
+ name: 'vendor_allowlist',
101
+ passed: false,
102
+ reason: `Vendor "${vendor}" requires explicit approval`,
103
+ });
104
+ allPassed = false;
105
+ }
106
+ else {
107
+ checks.push({
108
+ name: 'vendor_allowlist',
109
+ passed: true,
110
+ reason: 'Vendor not blocked, implicit approval',
111
+ });
112
+ }
113
+ }
114
+ // Category check if provided
115
+ if (category) {
116
+ const blockedCategories = (process.env.SARDIS_POLICY_BLOCKED_CATEGORIES || 'gambling,adult')
117
+ .split(',')
118
+ .map((c) => c.trim().toLowerCase());
119
+ if (blockedCategories.includes(category.toLowerCase())) {
120
+ checks.push({
121
+ name: 'category_check',
122
+ passed: false,
123
+ reason: `Category "${category}" is not allowed`,
124
+ });
125
+ allPassed = false;
126
+ }
127
+ else {
128
+ checks.push({ name: 'category_check', passed: true });
129
+ }
130
+ }
131
+ return {
132
+ allowed: allPassed,
133
+ reason: allPassed
134
+ ? 'Payment allowed by policy'
135
+ : checks
136
+ .filter((c) => !c.passed)
137
+ .map((c) => c.reason)
138
+ .join('; '),
139
+ risk_score: allPassed ? 0.1 : 0.8,
140
+ checks,
141
+ };
142
+ }
143
+ catch (error) {
144
+ return {
145
+ allowed: false,
146
+ reason: `Policy check failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
147
+ risk_score: 1.0,
148
+ };
149
+ }
150
+ }
151
+ /**
152
+ * Validate payment limits only (without vendor checks)
153
+ */
154
+ export async function validateLimits(amount) {
155
+ const checks = [];
156
+ let allPassed = true;
157
+ try {
158
+ const wallet = await getWalletInfo();
159
+ const limitPerTx = parseFloat(wallet.limit_per_tx);
160
+ const limitTotal = parseFloat(wallet.limit_total);
161
+ // Per-transaction limit
162
+ if (amount <= limitPerTx) {
163
+ checks.push({ name: 'per_transaction_limit', passed: true });
164
+ }
165
+ else {
166
+ checks.push({
167
+ name: 'per_transaction_limit',
168
+ passed: false,
169
+ reason: `Amount $${amount} exceeds per-transaction limit of $${limitPerTx}`,
170
+ });
171
+ allPassed = false;
172
+ }
173
+ // Total limit (if we could track cumulative - for now just note it)
174
+ checks.push({
175
+ name: 'total_limit_check',
176
+ passed: true,
177
+ reason: `Daily limit: $${limitTotal}`,
178
+ });
179
+ return {
180
+ allowed: allPassed,
181
+ reason: allPassed
182
+ ? 'Within spending limits'
183
+ : checks
184
+ .filter((c) => !c.passed)
185
+ .map((c) => c.reason)
186
+ .join('; '),
187
+ risk_score: allPassed ? 0.1 : 0.7,
188
+ checks,
189
+ };
190
+ }
191
+ catch (error) {
192
+ return {
193
+ allowed: false,
194
+ reason: `Limit validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
195
+ risk_score: 1.0,
196
+ };
197
+ }
198
+ }
199
+ /**
200
+ * Check compliance status
201
+ */
202
+ export async function checkCompliance(address, amount) {
203
+ const config = getConfig();
204
+ if (!config.apiKey || config.mode === 'simulated') {
205
+ // Simulated compliance check
206
+ return {
207
+ status: 'pass',
208
+ checks: [
209
+ { type: 'sanctions', passed: true },
210
+ { type: 'kyc', passed: true },
211
+ { type: 'aml', passed: true },
212
+ ],
213
+ risk_level: 'low',
214
+ };
215
+ }
216
+ try {
217
+ return await apiRequest('POST', '/api/v2/compliance/check', {
218
+ address,
219
+ amount,
220
+ });
221
+ }
222
+ catch {
223
+ // Fail-closed on compliance errors
224
+ return {
225
+ status: 'fail',
226
+ checks: [{ type: 'error', passed: false, details: 'Compliance service unavailable' }],
227
+ risk_level: 'high',
228
+ };
229
+ }
230
+ }
231
+ // Tool definitions
232
+ export const policyToolDefinitions = [
233
+ {
234
+ name: 'sardis_check_policy',
235
+ description: 'Check if a payment would be allowed by the current spending policy without executing it. Use this to validate payments before execution.',
236
+ inputSchema: {
237
+ type: 'object',
238
+ properties: {
239
+ vendor: {
240
+ type: 'string',
241
+ description: 'The merchant to check',
242
+ },
243
+ amount: {
244
+ type: 'number',
245
+ description: 'Payment amount to validate',
246
+ },
247
+ category: {
248
+ type: 'string',
249
+ description: 'Optional merchant category for additional validation',
250
+ },
251
+ },
252
+ required: ['vendor', 'amount'],
253
+ },
254
+ },
255
+ {
256
+ name: 'sardis_validate_limits',
257
+ description: 'Check if a payment amount is within wallet spending limits without checking vendor restrictions.',
258
+ inputSchema: {
259
+ type: 'object',
260
+ properties: {
261
+ amount: {
262
+ type: 'number',
263
+ description: 'Payment amount to validate against limits',
264
+ },
265
+ },
266
+ required: ['amount'],
267
+ },
268
+ },
269
+ {
270
+ name: 'sardis_check_compliance',
271
+ description: 'Run compliance checks on an address including sanctions, KYC, and AML screening.',
272
+ inputSchema: {
273
+ type: 'object',
274
+ properties: {
275
+ address: {
276
+ type: 'string',
277
+ description: 'The wallet address to check (0x...)',
278
+ },
279
+ amount: {
280
+ type: 'number',
281
+ description: 'Transaction amount for risk assessment',
282
+ },
283
+ },
284
+ required: ['address', 'amount'],
285
+ },
286
+ },
287
+ {
288
+ name: 'sardis_get_policies',
289
+ description: 'Get all active spending policies for the wallet.',
290
+ inputSchema: {
291
+ type: 'object',
292
+ properties: {
293
+ wallet_id: {
294
+ type: 'string',
295
+ description: 'Wallet ID (optional, defaults to configured wallet)',
296
+ },
297
+ },
298
+ required: [],
299
+ },
300
+ },
301
+ // SECURITY: sardis_get_rules has been removed from agent-facing tools.
302
+ // Exposing the full policy ruleset (vendor allowlists, blocklists, limits,
303
+ // approval thresholds) to AI agents enables prompt-injected agents to
304
+ // craft requests that precisely bypass policy boundaries.
305
+ // Policy rules are accessible only via the admin API.
306
+ ];
307
+ // Tool handlers
308
+ export const policyToolHandlers = {
309
+ sardis_check_policy: async (args) => {
310
+ const parsed = PolicyCheckSchema.safeParse(args);
311
+ if (!parsed.success) {
312
+ return {
313
+ content: [{ type: 'text', text: `Invalid request: ${parsed.error.message}` }],
314
+ isError: true,
315
+ };
316
+ }
317
+ const { vendor, amount, category } = parsed.data;
318
+ const result = await checkPolicy(vendor, amount, category);
319
+ const decision = buildPolicyDecision(result);
320
+ return {
321
+ content: [
322
+ {
323
+ type: 'text',
324
+ text: JSON.stringify({
325
+ vendor,
326
+ amount,
327
+ category: category || 'unspecified',
328
+ allowed: result.allowed,
329
+ reason: result.reason,
330
+ reason_code: decision.reason_code,
331
+ risk_score: result.risk_score,
332
+ checks: result.checks,
333
+ decision,
334
+ }, null, 2),
335
+ },
336
+ ],
337
+ };
338
+ },
339
+ sardis_validate_limits: async (args) => {
340
+ const parsed = PolicyCheckSchema.pick({ amount: true }).safeParse(args);
341
+ if (!parsed.success) {
342
+ return {
343
+ content: [{ type: 'text', text: `Invalid request: ${parsed.error.message}` }],
344
+ isError: true,
345
+ };
346
+ }
347
+ const result = await validateLimits(parsed.data.amount);
348
+ return {
349
+ content: [
350
+ {
351
+ type: 'text',
352
+ text: JSON.stringify({
353
+ amount: parsed.data.amount,
354
+ within_limits: result.allowed,
355
+ reason: result.reason,
356
+ checks: result.checks,
357
+ }, null, 2),
358
+ },
359
+ ],
360
+ };
361
+ },
362
+ sardis_check_compliance: async (args) => {
363
+ const parsed = ComplianceCheckSchema.safeParse(args);
364
+ if (!parsed.success) {
365
+ return {
366
+ content: [{ type: 'text', text: `Invalid request: ${parsed.error.message}` }],
367
+ isError: true,
368
+ };
369
+ }
370
+ const result = await checkCompliance(parsed.data.address, parsed.data.amount);
371
+ return {
372
+ content: [
373
+ {
374
+ type: 'text',
375
+ text: JSON.stringify({
376
+ address: parsed.data.address,
377
+ amount: parsed.data.amount,
378
+ status: result.status,
379
+ risk_level: result.risk_level,
380
+ checks: result.checks,
381
+ }, null, 2),
382
+ },
383
+ ],
384
+ };
385
+ },
386
+ sardis_get_policies: async (args) => {
387
+ const config = getConfig();
388
+ const walletId = typeof args === 'object' && args !== null && 'wallet_id' in args
389
+ ? args.wallet_id || config.walletId
390
+ : config.walletId;
391
+ if (!config.apiKey || config.mode === 'simulated') {
392
+ return {
393
+ content: [{
394
+ type: 'text',
395
+ text: JSON.stringify({
396
+ wallet_id: walletId,
397
+ policies: [{
398
+ id: 'policy_default',
399
+ name: 'Default Spending Policy',
400
+ max_per_tx: '100.00',
401
+ max_daily: '500.00',
402
+ max_monthly: '5000.00',
403
+ is_active: true,
404
+ created_at: new Date().toISOString(),
405
+ }],
406
+ }, null, 2),
407
+ }],
408
+ };
409
+ }
410
+ try {
411
+ const wallet = await getWalletInfo();
412
+ return {
413
+ content: [{
414
+ type: 'text',
415
+ text: JSON.stringify({
416
+ wallet_id: wallet.id,
417
+ policies: [{
418
+ id: 'policy_active',
419
+ name: 'Active Policy',
420
+ max_per_tx: wallet.limit_per_tx,
421
+ max_daily: wallet.limit_total,
422
+ is_active: wallet.is_active,
423
+ }],
424
+ }, null, 2),
425
+ }],
426
+ };
427
+ }
428
+ catch (error) {
429
+ return {
430
+ content: [{
431
+ type: 'text',
432
+ text: `Failed to get policies: ${error instanceof Error ? error.message : 'Unknown error'}`,
433
+ }],
434
+ isError: true,
435
+ };
436
+ }
437
+ },
438
+ // SECURITY: sardis_get_rules handler removed — see tool definition comment above.
439
+ sardis_get_rules: async (_args) => ({
440
+ content: [{
441
+ type: 'text',
442
+ text: JSON.stringify({
443
+ error: 'Policy rule details are not available to AI agents for security reasons. '
444
+ + 'Use sardis_check_policy to verify if a specific payment would be allowed.',
445
+ }),
446
+ }],
447
+ isError: true,
448
+ }),
449
+ };
450
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/tools/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Spending Reports tools for MCP server
3
+ *
4
+ * Tools for getting spending analytics and reports.
5
+ */
6
+ import type { ToolDefinition, ToolHandler } from './types.js';
7
+ export declare const spendingToolDefinitions: ToolDefinition[];
8
+ export declare const spendingToolHandlers: Record<string, ToolHandler>;
9
+ //# sourceMappingURL=spending.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spending.d.ts","sourceRoot":"","sources":["../../src/tools/spending.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAuD1E,eAAO,MAAM,uBAAuB,EAAE,cAAc,EAoFnD,CAAC;AAGF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAoO5D,CAAC"}