@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.
- package/CHANGELOG.md +69 -0
- package/CLAUDE_DESKTOP_CONFIG.md +180 -0
- package/LICENSE +21 -0
- package/README.md +375 -0
- package/dist/api.d.ts +25 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +70 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +274 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +47 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +82 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +255 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/agents.d.ts +7 -0
- package/dist/tools/agents.d.ts.map +1 -0
- package/dist/tools/agents.js +219 -0
- package/dist/tools/agents.js.map +1 -0
- package/dist/tools/approvals.d.ts +9 -0
- package/dist/tools/approvals.d.ts.map +1 -0
- package/dist/tools/approvals.js +308 -0
- package/dist/tools/approvals.js.map +1 -0
- package/dist/tools/cards.d.ts +9 -0
- package/dist/tools/cards.d.ts.map +1 -0
- package/dist/tools/cards.js +415 -0
- package/dist/tools/cards.js.map +1 -0
- package/dist/tools/fiat.d.ts +9 -0
- package/dist/tools/fiat.d.ts.map +1 -0
- package/dist/tools/fiat.js +394 -0
- package/dist/tools/fiat.js.map +1 -0
- package/dist/tools/holds.d.ts +7 -0
- package/dist/tools/holds.d.ts.map +1 -0
- package/dist/tools/holds.js +403 -0
- package/dist/tools/holds.js.map +1 -0
- package/dist/tools/index.d.ts +70 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +152 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/payments.d.ts +47 -0
- package/dist/tools/payments.d.ts.map +1 -0
- package/dist/tools/payments.js +447 -0
- package/dist/tools/payments.js.map +1 -0
- package/dist/tools/policy.d.ts +41 -0
- package/dist/tools/policy.d.ts.map +1 -0
- package/dist/tools/policy.js +450 -0
- package/dist/tools/policy.js.map +1 -0
- package/dist/tools/spending.d.ts +9 -0
- package/dist/tools/spending.d.ts.map +1 -0
- package/dist/tools/spending.js +324 -0
- package/dist/tools/spending.js.map +1 -0
- package/dist/tools/types.d.ts +247 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +71 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/wallet-management.d.ts +9 -0
- package/dist/tools/wallet-management.d.ts.map +1 -0
- package/dist/tools/wallet-management.js +222 -0
- package/dist/tools/wallet-management.js.map +1 -0
- package/dist/tools/wallets.d.ts +15 -0
- package/dist/tools/wallets.d.ts.map +1 -0
- package/dist/tools/wallets.js +112 -0
- package/dist/tools/wallets.js.map +1 -0
- package/mcp.json +283 -0
- package/package.json +145 -0
package/dist/api.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sardis API Client for MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Handles all API communication with the Sardis backend.
|
|
5
|
+
*/
|
|
6
|
+
import { getConfig } from './config.js';
|
|
7
|
+
/**
|
|
8
|
+
* Make an API request to Sardis
|
|
9
|
+
*/
|
|
10
|
+
export async function apiRequest(method, path, body) {
|
|
11
|
+
const config = getConfig();
|
|
12
|
+
const url = `${config.apiUrl}${path.startsWith('/') ? path : '/' + path}`;
|
|
13
|
+
const paymentIdentity = process.env.SARDIS_PAYMENT_IDENTITY;
|
|
14
|
+
const response = await fetch(url, {
|
|
15
|
+
method,
|
|
16
|
+
headers: {
|
|
17
|
+
'X-API-Key': config.apiKey,
|
|
18
|
+
'Content-Type': 'application/json',
|
|
19
|
+
'User-Agent': 'sardis-mcp-server/0.1.0',
|
|
20
|
+
...(paymentIdentity ? { 'X-Sardis-Payment-Identity': paymentIdentity } : {}),
|
|
21
|
+
},
|
|
22
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
23
|
+
});
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
const errorBody = await response.text();
|
|
26
|
+
throw new Error(`API error ${response.status}: ${errorBody}`);
|
|
27
|
+
}
|
|
28
|
+
return response.json();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate unique mandate ID
|
|
32
|
+
*
|
|
33
|
+
* SECURITY: Uses crypto.randomUUID() for cryptographically secure IDs.
|
|
34
|
+
* Math.random() is not suitable for security-relevant identifiers.
|
|
35
|
+
*/
|
|
36
|
+
export function generateMandateId() {
|
|
37
|
+
const id = (typeof crypto !== 'undefined' && crypto.randomUUID)
|
|
38
|
+
? crypto.randomUUID().replace(/-/g, '').substring(0, 16)
|
|
39
|
+
: Array.from((typeof crypto !== 'undefined' && crypto.getRandomValues)
|
|
40
|
+
? crypto.getRandomValues(new Uint8Array(8))
|
|
41
|
+
: new Uint8Array(8).map(() => Math.floor(Math.random() * 256))).map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
42
|
+
return `mnd_${id}`;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Create SHA-256 hash for audit
|
|
46
|
+
*
|
|
47
|
+
* SECURITY: The fallback now uses Node.js crypto module instead of a
|
|
48
|
+
* predictable timestamp string. Audit hashes must provide collision
|
|
49
|
+
* resistance for financial integrity.
|
|
50
|
+
*/
|
|
51
|
+
export async function createAuditHash(data) {
|
|
52
|
+
if (typeof crypto !== 'undefined' && crypto.subtle) {
|
|
53
|
+
const encoder = new TextEncoder();
|
|
54
|
+
const dataBuffer = encoder.encode(data);
|
|
55
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', dataBuffer);
|
|
56
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
57
|
+
return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
58
|
+
}
|
|
59
|
+
// Fallback: use Node.js crypto (always available in Node environments)
|
|
60
|
+
try {
|
|
61
|
+
const { createHash } = await import('node:crypto');
|
|
62
|
+
return createHash('sha256').update(data).digest('hex');
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// SECURITY: Refuse to produce a fake hash — fail-closed.
|
|
66
|
+
throw new Error('No cryptographic hash function available. '
|
|
67
|
+
+ 'Audit integrity cannot be guaranteed without SHA-256.');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Sardis MCP Server CLI
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx @sardis/mcp-server start
|
|
7
|
+
* npx @sardis/mcp-server init
|
|
8
|
+
* npx @sardis/mcp-server --version
|
|
9
|
+
* npx @sardis/mcp-server --help
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Sardis MCP Server CLI
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx @sardis/mcp-server start
|
|
7
|
+
* npx @sardis/mcp-server init
|
|
8
|
+
* npx @sardis/mcp-server --version
|
|
9
|
+
* npx @sardis/mcp-server --help
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'node:fs/promises';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
import { runServer } from './index.js';
|
|
14
|
+
const args = process.argv.slice(2);
|
|
15
|
+
function printHelp() {
|
|
16
|
+
console.log(`
|
|
17
|
+
Sardis MCP Server v0.1.0
|
|
18
|
+
The Payment OS for the Agent Economy
|
|
19
|
+
|
|
20
|
+
USAGE:
|
|
21
|
+
npx @sardis/mcp-server start Start the MCP server (stdio transport)
|
|
22
|
+
npx @sardis/mcp-server init Bootstrap local MCP config (.env.sardis)
|
|
23
|
+
npx @sardis/mcp-server --help Show this help message
|
|
24
|
+
npx @sardis/mcp-server --version Show version
|
|
25
|
+
|
|
26
|
+
DESCRIPTION:
|
|
27
|
+
Sardis MCP Server enables AI agents to execute secure payments
|
|
28
|
+
using Model Context Protocol. It exposes 36 tools across 8 categories:
|
|
29
|
+
|
|
30
|
+
Wallet (5): sardis_get_wallet, sardis_get_balance, sardis_create_wallet,
|
|
31
|
+
sardis_update_wallet_policy, sardis_list_wallets
|
|
32
|
+
|
|
33
|
+
Payment (3): sardis_pay, sardis_get_transaction, sardis_list_transactions
|
|
34
|
+
|
|
35
|
+
Policy (3): sardis_check_policy, sardis_validate_limits, sardis_check_compliance
|
|
36
|
+
|
|
37
|
+
Hold (6): sardis_create_hold, sardis_capture_hold, sardis_void_hold,
|
|
38
|
+
sardis_get_hold, sardis_list_holds, sardis_extend_hold
|
|
39
|
+
|
|
40
|
+
Agent (4): sardis_create_agent, sardis_get_agent, sardis_list_agents,
|
|
41
|
+
sardis_update_agent
|
|
42
|
+
|
|
43
|
+
Card (6): sardis_issue_card, sardis_get_card, sardis_list_cards,
|
|
44
|
+
sardis_freeze_card, sardis_unfreeze_card, sardis_cancel_card
|
|
45
|
+
|
|
46
|
+
Fiat (4): sardis_fund_wallet, sardis_withdraw_to_bank,
|
|
47
|
+
sardis_get_funding_status, sardis_get_withdrawal_status
|
|
48
|
+
|
|
49
|
+
Approval (2): sardis_request_approval, sardis_get_approval_status
|
|
50
|
+
|
|
51
|
+
Analytics (3): sardis_get_spending_summary, sardis_get_spending_by_vendor,
|
|
52
|
+
sardis_get_spending_by_category
|
|
53
|
+
|
|
54
|
+
CONFIGURATION (Claude Desktop):
|
|
55
|
+
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
|
|
56
|
+
|
|
57
|
+
{
|
|
58
|
+
"mcpServers": {
|
|
59
|
+
"sardis": {
|
|
60
|
+
"command": "npx",
|
|
61
|
+
"args": ["@sardis/mcp-server", "start"]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
ENVIRONMENT VARIABLES:
|
|
67
|
+
SARDIS_API_KEY Your Sardis API key (optional for simulated mode)
|
|
68
|
+
SARDIS_WALLET_ID Default wallet ID
|
|
69
|
+
SARDIS_AGENT_ID Agent ID for this connection
|
|
70
|
+
SARDIS_PAYMENT_IDENTITY Signed one-click identity for MCP bootstrap
|
|
71
|
+
SARDIS_MODE 'live' or 'simulated' (default: simulated)
|
|
72
|
+
|
|
73
|
+
LEARN MORE:
|
|
74
|
+
Documentation: https://docs.sardis.network
|
|
75
|
+
GitHub: https://github.com/sardis-network/sardis
|
|
76
|
+
`);
|
|
77
|
+
}
|
|
78
|
+
function printVersion() {
|
|
79
|
+
console.log('Sardis MCP Server v0.1.0');
|
|
80
|
+
}
|
|
81
|
+
function readArgValue(argv, name) {
|
|
82
|
+
const eqPrefix = `--${name}=`;
|
|
83
|
+
const eqMatch = argv.find((a) => a.startsWith(eqPrefix));
|
|
84
|
+
if (eqMatch) {
|
|
85
|
+
return eqMatch.slice(eqPrefix.length);
|
|
86
|
+
}
|
|
87
|
+
const idx = argv.indexOf(`--${name}`);
|
|
88
|
+
if (idx >= 0 && idx + 1 < argv.length) {
|
|
89
|
+
return argv[idx + 1];
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
function hasFlag(argv, name) {
|
|
94
|
+
return argv.includes(`--${name}`) || argv.some((a) => a.startsWith(`--${name}=`));
|
|
95
|
+
}
|
|
96
|
+
function parseInitOptions(argv) {
|
|
97
|
+
const mode = (readArgValue(argv, 'mode') || process.env.SARDIS_MODE || 'simulated');
|
|
98
|
+
const output = readArgValue(argv, 'output') || '.env.sardis';
|
|
99
|
+
const issueCard = hasFlag(argv, 'issue-card');
|
|
100
|
+
return {
|
|
101
|
+
mode,
|
|
102
|
+
apiUrl: (readArgValue(argv, 'api-url') || process.env.SARDIS_API_URL || 'https://api.sardis.network').replace(/\/$/, ''),
|
|
103
|
+
apiKey: readArgValue(argv, 'api-key') || process.env.SARDIS_API_KEY || '',
|
|
104
|
+
paymentIdentity: readArgValue(argv, 'payment-identity') || process.env.SARDIS_PAYMENT_IDENTITY || '',
|
|
105
|
+
agentId: readArgValue(argv, 'agent-id') || process.env.SARDIS_AGENT_ID || '',
|
|
106
|
+
agentName: readArgValue(argv, 'agent-name') || `Sardis MCP Agent ${new Date().toISOString().slice(0, 10)}`,
|
|
107
|
+
walletId: readArgValue(argv, 'wallet-id') || process.env.SARDIS_WALLET_ID || '',
|
|
108
|
+
chain: readArgValue(argv, 'chain') || process.env.SARDIS_CHAIN || 'base_sepolia',
|
|
109
|
+
output,
|
|
110
|
+
issueCard,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
async function apiRequestWithKey(apiUrl, apiKey, method, route, body) {
|
|
114
|
+
const response = await fetch(`${apiUrl}${route}`, {
|
|
115
|
+
method,
|
|
116
|
+
headers: {
|
|
117
|
+
'X-API-Key': apiKey,
|
|
118
|
+
'Content-Type': 'application/json',
|
|
119
|
+
'User-Agent': 'sardis-mcp-server/0.1.0',
|
|
120
|
+
},
|
|
121
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
122
|
+
});
|
|
123
|
+
if (!response.ok) {
|
|
124
|
+
const errorBody = await response.text();
|
|
125
|
+
throw new Error(`${method} ${route} failed (${response.status}): ${errorBody}`);
|
|
126
|
+
}
|
|
127
|
+
return response.json();
|
|
128
|
+
}
|
|
129
|
+
async function upsertEnvFile(filePath, updates) {
|
|
130
|
+
let existing = '';
|
|
131
|
+
try {
|
|
132
|
+
existing = await fs.readFile(filePath, 'utf8');
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
existing = '';
|
|
136
|
+
}
|
|
137
|
+
const lineMap = new Map();
|
|
138
|
+
for (const line of existing.split('\n')) {
|
|
139
|
+
const trimmed = line.trim();
|
|
140
|
+
if (!trimmed || trimmed.startsWith('#') || !trimmed.includes('=')) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const idx = trimmed.indexOf('=');
|
|
144
|
+
const key = trimmed.slice(0, idx).trim();
|
|
145
|
+
const value = trimmed.slice(idx + 1).trim();
|
|
146
|
+
lineMap.set(key, value);
|
|
147
|
+
}
|
|
148
|
+
for (const [key, value] of Object.entries(updates)) {
|
|
149
|
+
lineMap.set(key, value);
|
|
150
|
+
}
|
|
151
|
+
const output = [
|
|
152
|
+
'# Sardis MCP bootstrap configuration',
|
|
153
|
+
'# Generated by: npx @sardis/mcp-server init',
|
|
154
|
+
'',
|
|
155
|
+
];
|
|
156
|
+
for (const key of Array.from(lineMap.keys()).sort()) {
|
|
157
|
+
output.push(`${key}=${lineMap.get(key) || ''}`);
|
|
158
|
+
}
|
|
159
|
+
output.push('');
|
|
160
|
+
await fs.writeFile(filePath, output.join('\n'), 'utf8');
|
|
161
|
+
}
|
|
162
|
+
function randomId(prefix) {
|
|
163
|
+
return `${prefix}_${Math.random().toString(36).slice(2, 10)}${Date.now().toString(36).slice(-4)}`;
|
|
164
|
+
}
|
|
165
|
+
async function runInit(argv) {
|
|
166
|
+
const options = parseInitOptions(argv);
|
|
167
|
+
const outputFile = path.resolve(process.cwd(), options.output);
|
|
168
|
+
let agentId = options.agentId;
|
|
169
|
+
let walletId = options.walletId;
|
|
170
|
+
let chain = options.chain;
|
|
171
|
+
let cardId = null;
|
|
172
|
+
const warnings = [];
|
|
173
|
+
if (options.mode === 'live' && options.apiKey) {
|
|
174
|
+
try {
|
|
175
|
+
if (options.paymentIdentity) {
|
|
176
|
+
const identity = await apiRequestWithKey(options.apiUrl, options.apiKey, 'GET', `/api/v2/agents/payment-identities/${encodeURIComponent(options.paymentIdentity)}`);
|
|
177
|
+
agentId = agentId || identity.agent_id || '';
|
|
178
|
+
walletId = walletId || identity.wallet_id || '';
|
|
179
|
+
if (identity.chain && !readArgValue(argv, 'chain') && !process.env.SARDIS_CHAIN) {
|
|
180
|
+
chain = identity.chain;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (!agentId) {
|
|
184
|
+
const createdAgent = await apiRequestWithKey(options.apiUrl, options.apiKey, 'POST', '/api/v2/agents', {
|
|
185
|
+
name: options.agentName,
|
|
186
|
+
create_wallet: false,
|
|
187
|
+
});
|
|
188
|
+
agentId = createdAgent.agent_id || createdAgent.id || '';
|
|
189
|
+
}
|
|
190
|
+
if (!walletId && agentId) {
|
|
191
|
+
const createdWallet = await apiRequestWithKey(options.apiUrl, options.apiKey, 'POST', '/api/v2/wallets', {
|
|
192
|
+
agent_id: agentId,
|
|
193
|
+
mpc_provider: 'turnkey',
|
|
194
|
+
currency: 'USDC',
|
|
195
|
+
});
|
|
196
|
+
walletId = createdWallet.wallet_id || createdWallet.id || '';
|
|
197
|
+
}
|
|
198
|
+
if (options.issueCard && walletId) {
|
|
199
|
+
const createdCard = await apiRequestWithKey(options.apiUrl, options.apiKey, 'POST', '/api/v2/cards', {
|
|
200
|
+
wallet_id: walletId,
|
|
201
|
+
});
|
|
202
|
+
cardId = createdCard.card_id || createdCard.id || null;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
warnings.push(error instanceof Error ? error.message : 'Live provisioning failed');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (!agentId) {
|
|
210
|
+
agentId = options.mode === 'live' ? randomId('agent') : 'agent_simulated';
|
|
211
|
+
}
|
|
212
|
+
if (!walletId) {
|
|
213
|
+
walletId = options.mode === 'live' ? randomId('wallet') : 'wallet_simulated';
|
|
214
|
+
}
|
|
215
|
+
await upsertEnvFile(outputFile, {
|
|
216
|
+
SARDIS_API_KEY: options.apiKey,
|
|
217
|
+
SARDIS_API_URL: options.apiUrl,
|
|
218
|
+
SARDIS_AGENT_ID: agentId,
|
|
219
|
+
SARDIS_WALLET_ID: walletId,
|
|
220
|
+
SARDIS_CHAIN: chain,
|
|
221
|
+
SARDIS_MODE: options.mode,
|
|
222
|
+
SARDIS_PAYMENT_IDENTITY: options.paymentIdentity,
|
|
223
|
+
});
|
|
224
|
+
console.log('Sardis MCP initialization complete.');
|
|
225
|
+
console.log(`Config file: ${outputFile}`);
|
|
226
|
+
console.log(`Mode: ${options.mode}`);
|
|
227
|
+
console.log(`Agent ID: ${agentId}`);
|
|
228
|
+
console.log(`Wallet ID: ${walletId}`);
|
|
229
|
+
console.log(`Chain: ${chain}`);
|
|
230
|
+
if (cardId) {
|
|
231
|
+
console.log(`Card ID: ${cardId}`);
|
|
232
|
+
}
|
|
233
|
+
if (!options.apiKey) {
|
|
234
|
+
console.log('Note: SARDIS_API_KEY is empty. Set it before live API usage.');
|
|
235
|
+
}
|
|
236
|
+
if (warnings.length > 0) {
|
|
237
|
+
console.log('');
|
|
238
|
+
console.log('Warnings:');
|
|
239
|
+
for (const warning of warnings) {
|
|
240
|
+
console.log(`- ${warning}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async function main() {
|
|
245
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
246
|
+
printHelp();
|
|
247
|
+
process.exit(0);
|
|
248
|
+
}
|
|
249
|
+
if (args.includes('--version') || args.includes('-v')) {
|
|
250
|
+
printVersion();
|
|
251
|
+
process.exit(0);
|
|
252
|
+
}
|
|
253
|
+
if (args[0] === 'init') {
|
|
254
|
+
await runInit(args.slice(1));
|
|
255
|
+
process.exit(0);
|
|
256
|
+
}
|
|
257
|
+
if (args[0] === 'start' || args.length === 0) {
|
|
258
|
+
console.error('Sardis MCP Server v0.1.0 starting...');
|
|
259
|
+
console.error('Mode: ' + (process.env.SARDIS_MODE || 'simulated'));
|
|
260
|
+
console.error('Tools: 36 tools across 8 categories');
|
|
261
|
+
console.error('Ready. Waiting for MCP client connection...');
|
|
262
|
+
await runServer();
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
console.error(`Unknown command: ${args[0]}`);
|
|
266
|
+
console.error('Run "npx @sardis/mcp-server --help" for usage.');
|
|
267
|
+
process.exit(1);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
main().catch((error) => {
|
|
271
|
+
console.error('Fatal error:', error);
|
|
272
|
+
process.exit(1);
|
|
273
|
+
});
|
|
274
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Configuration
|
|
3
|
+
*
|
|
4
|
+
* Loads configuration from environment variables with sensible defaults.
|
|
5
|
+
* Supports both live and simulated modes for development.
|
|
6
|
+
*/
|
|
7
|
+
export interface MCPConfig {
|
|
8
|
+
apiKey: string;
|
|
9
|
+
apiUrl: string;
|
|
10
|
+
walletId: string;
|
|
11
|
+
agentId: string;
|
|
12
|
+
chain: string;
|
|
13
|
+
mode: 'live' | 'simulated';
|
|
14
|
+
policyBlockedVendors: string[];
|
|
15
|
+
policyAllowedVendors: string[];
|
|
16
|
+
fetchAgentPolicy: boolean;
|
|
17
|
+
requireExplicitApproval: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Load configuration from environment variables
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadConfig(): MCPConfig;
|
|
23
|
+
/**
|
|
24
|
+
* Get the global configuration instance
|
|
25
|
+
*/
|
|
26
|
+
export declare function getConfig(): MCPConfig;
|
|
27
|
+
/**
|
|
28
|
+
* Reset configuration (for testing)
|
|
29
|
+
*/
|
|
30
|
+
export declare function resetConfig(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get blocked vendors list
|
|
33
|
+
*/
|
|
34
|
+
export declare function getBlockedVendors(): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Get allowed vendors list
|
|
37
|
+
*/
|
|
38
|
+
export declare function getAllowedVendors(): string[];
|
|
39
|
+
/**
|
|
40
|
+
* Check if vendor is blocked
|
|
41
|
+
*/
|
|
42
|
+
export declare function isVendorBlocked(vendor: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Check if vendor is explicitly allowed
|
|
45
|
+
*/
|
|
46
|
+
export declare function isVendorAllowed(vendor: string): boolean;
|
|
47
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,SAAS;IAExB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IAGf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAGhB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAG3B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAqCtC;AAKD;;GAEG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAKrC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGvD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Configuration
|
|
3
|
+
*
|
|
4
|
+
* Loads configuration from environment variables with sensible defaults.
|
|
5
|
+
* Supports both live and simulated modes for development.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Load configuration from environment variables
|
|
9
|
+
*/
|
|
10
|
+
export function loadConfig() {
|
|
11
|
+
// Parse comma-separated vendor lists from environment
|
|
12
|
+
const parseVendorList = (envVar, defaults) => {
|
|
13
|
+
if (!envVar)
|
|
14
|
+
return defaults;
|
|
15
|
+
return envVar.split(',').map((v) => v.trim().toLowerCase()).filter(Boolean);
|
|
16
|
+
};
|
|
17
|
+
// Default blocked vendors (can be overridden)
|
|
18
|
+
const defaultBlockedVendors = ['amazon', 'ebay', 'aliexpress', 'wish'];
|
|
19
|
+
// Default allowed SaaS vendors (can be overridden)
|
|
20
|
+
const defaultAllowedVendors = [
|
|
21
|
+
'openai', 'anthropic', 'aws', 'gcp', 'azure', 'vercel',
|
|
22
|
+
'supabase', 'stripe', 'github', 'netlify', 'cloudflare',
|
|
23
|
+
'mongodb', 'redis', 'postgresql', 'datadog', 'sentry',
|
|
24
|
+
];
|
|
25
|
+
return {
|
|
26
|
+
apiKey: process.env.SARDIS_API_KEY || '',
|
|
27
|
+
apiUrl: (process.env.SARDIS_API_URL || 'https://api.sardis.network').replace(/\/$/, ''),
|
|
28
|
+
walletId: process.env.SARDIS_WALLET_ID || '',
|
|
29
|
+
agentId: process.env.SARDIS_AGENT_ID || '',
|
|
30
|
+
chain: process.env.SARDIS_CHAIN || 'base_sepolia',
|
|
31
|
+
mode: (process.env.SARDIS_MODE || 'simulated'),
|
|
32
|
+
// Policy configuration from environment
|
|
33
|
+
policyBlockedVendors: parseVendorList(process.env.SARDIS_POLICY_BLOCKED_VENDORS, defaultBlockedVendors),
|
|
34
|
+
policyAllowedVendors: parseVendorList(process.env.SARDIS_POLICY_ALLOWED_VENDORS, defaultAllowedVendors),
|
|
35
|
+
fetchAgentPolicy: process.env.SARDIS_FETCH_AGENT_POLICY === 'true',
|
|
36
|
+
requireExplicitApproval: process.env.SARDIS_REQUIRE_EXPLICIT_APPROVAL === 'true',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// Global config instance
|
|
40
|
+
let _config = null;
|
|
41
|
+
/**
|
|
42
|
+
* Get the global configuration instance
|
|
43
|
+
*/
|
|
44
|
+
export function getConfig() {
|
|
45
|
+
if (!_config) {
|
|
46
|
+
_config = loadConfig();
|
|
47
|
+
}
|
|
48
|
+
return _config;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Reset configuration (for testing)
|
|
52
|
+
*/
|
|
53
|
+
export function resetConfig() {
|
|
54
|
+
_config = null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get blocked vendors list
|
|
58
|
+
*/
|
|
59
|
+
export function getBlockedVendors() {
|
|
60
|
+
return getConfig().policyBlockedVendors;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get allowed vendors list
|
|
64
|
+
*/
|
|
65
|
+
export function getAllowedVendors() {
|
|
66
|
+
return getConfig().policyAllowedVendors;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if vendor is blocked
|
|
70
|
+
*/
|
|
71
|
+
export function isVendorBlocked(vendor) {
|
|
72
|
+
const normalized = vendor.toLowerCase().trim();
|
|
73
|
+
return getBlockedVendors().some((b) => normalized.includes(b));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if vendor is explicitly allowed
|
|
77
|
+
*/
|
|
78
|
+
export function isVendorAllowed(vendor) {
|
|
79
|
+
const normalized = vendor.toLowerCase().trim();
|
|
80
|
+
return getAllowedVendors().some((a) => normalized.includes(a));
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sardis MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Model Context Protocol server that exposes Sardis payment capabilities
|
|
5
|
+
* to AI agents running in Claude Desktop, Cursor, and other MCP-compatible clients.
|
|
6
|
+
*
|
|
7
|
+
* Tools:
|
|
8
|
+
* - Wallet: sardis_get_wallet, sardis_get_balance
|
|
9
|
+
* - Payments: sardis_pay, sardis_get_transaction, sardis_list_transactions
|
|
10
|
+
* - Policy: sardis_check_policy, sardis_validate_limits, sardis_check_compliance
|
|
11
|
+
* - Holds: sardis_create_hold, sardis_capture_hold, sardis_void_hold, sardis_get_hold, sardis_list_holds, sardis_extend_hold
|
|
12
|
+
* - Agents: sardis_create_agent, sardis_get_agent, sardis_list_agents, sardis_update_agent
|
|
13
|
+
*
|
|
14
|
+
* Environment Variables:
|
|
15
|
+
* - SARDIS_API_KEY: API key for Sardis API (required)
|
|
16
|
+
* - SARDIS_API_URL: API base URL (default: https://api.sardis.network)
|
|
17
|
+
* - SARDIS_WALLET_ID: Default wallet ID
|
|
18
|
+
* - SARDIS_AGENT_ID: Agent ID for attribution
|
|
19
|
+
* - SARDIS_CHAIN: Default chain (default: base_sepolia)
|
|
20
|
+
* - SARDIS_MODE: 'live' or 'simulated' (default: simulated)
|
|
21
|
+
* - SARDIS_POLICY_BLOCKED_VENDORS: Comma-separated blocked vendors
|
|
22
|
+
* - SARDIS_POLICY_ALLOWED_VENDORS: Comma-separated allowed vendors
|
|
23
|
+
* - SARDIS_REQUIRE_EXPLICIT_APPROVAL: Require explicit vendor approval (default: false)
|
|
24
|
+
*/
|
|
25
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
26
|
+
export declare function createServer(): Promise<Server<{
|
|
27
|
+
method: string;
|
|
28
|
+
params?: {
|
|
29
|
+
[x: string]: unknown;
|
|
30
|
+
_meta?: {
|
|
31
|
+
[x: string]: unknown;
|
|
32
|
+
progressToken?: string | number | undefined;
|
|
33
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
34
|
+
taskId: string;
|
|
35
|
+
} | undefined;
|
|
36
|
+
} | undefined;
|
|
37
|
+
} | undefined;
|
|
38
|
+
}, {
|
|
39
|
+
method: string;
|
|
40
|
+
params?: {
|
|
41
|
+
[x: string]: unknown;
|
|
42
|
+
_meta?: {
|
|
43
|
+
[x: string]: unknown;
|
|
44
|
+
progressToken?: string | number | undefined;
|
|
45
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
46
|
+
taskId: string;
|
|
47
|
+
} | undefined;
|
|
48
|
+
} | undefined;
|
|
49
|
+
} | undefined;
|
|
50
|
+
}, {
|
|
51
|
+
[x: string]: unknown;
|
|
52
|
+
_meta?: {
|
|
53
|
+
[x: string]: unknown;
|
|
54
|
+
progressToken?: string | number | undefined;
|
|
55
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
56
|
+
taskId: string;
|
|
57
|
+
} | undefined;
|
|
58
|
+
} | undefined;
|
|
59
|
+
}>>;
|
|
60
|
+
export declare function runServer(): Promise<void>;
|
|
61
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAiBnE,wBAAsB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuOjC;AAED,wBAAsB,SAAS,kBAc9B"}
|