@oobe-protocol-labs/sap-mcp-server 0.8.0 → 0.9.1
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/.env.example +30 -0
- package/CHANGELOG.md +59 -1
- package/README.md +19 -2
- package/USER_DOCS/00_START_HERE.md +1 -0
- package/USER_DOCS/01_HOSTED_REMOTE_MCP.md +17 -3
- package/USER_DOCS/03_PAYMENTS_X402_PAYSH.md +11 -1
- package/USER_DOCS/04_CLIENT_CONFIGS.md +4 -3
- package/USER_DOCS/05_SKILLS_AND_TOOLS.md +27 -3
- package/USER_DOCS/06_DESKTOP_GUI_WIZARD.md +14 -7
- package/USER_DOCS/07_SMITHERY_AND_MARKETPLACES.md +163 -0
- package/assets/logos/claude.png +0 -0
- package/assets/logos/codex.webp +0 -0
- package/assets/logos/hermes.png +0 -0
- package/assets/logos/openclaw.svg +22 -0
- package/config.schema.json +5 -0
- package/dist/config/env.d.ts +4 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +3 -0
- package/dist/config/env.js.map +1 -1
- package/dist/config/mcp-client-injection.js +2 -2
- package/dist/config/mcp-client-injection.js.map +1 -1
- package/dist/config/paths.d.ts +6 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +14 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/wizard.js +3 -3
- package/dist/config/wizard.js.map +1 -1
- package/dist/core/constants.d.ts +1 -1
- package/dist/core/constants.js +1 -1
- package/dist/payments/pricing.d.ts +1 -1
- package/dist/payments/pricing.d.ts.map +1 -1
- package/dist/payments/pricing.js +21 -3
- package/dist/payments/pricing.js.map +1 -1
- package/dist/payments/x402-paid-call.d.ts +96 -0
- package/dist/payments/x402-paid-call.d.ts.map +1 -1
- package/dist/payments/x402-paid-call.js +264 -2
- package/dist/payments/x402-paid-call.js.map +1 -1
- package/dist/policy/local-policy-engine.js +1 -1
- package/dist/policy/local-policy-engine.js.map +1 -1
- package/dist/prompts/context/sap-agent-context.prompt.js +8 -1
- package/dist/prompts/context/sap-agent-context.prompt.js.map +1 -1
- package/dist/prompts/context/sap-agent-start.prompt.d.ts +14 -0
- package/dist/prompts/context/sap-agent-start.prompt.d.ts.map +1 -0
- package/dist/prompts/context/sap-agent-start.prompt.js +96 -0
- package/dist/prompts/context/sap-agent-start.prompt.js.map +1 -0
- package/dist/prompts/developer/generate-sap-integration.prompt.js +1 -1
- package/dist/prompts/developer/generate-sap-integration.prompt.js.map +1 -1
- package/dist/prompts/register-prompts.d.ts.map +1 -1
- package/dist/prompts/register-prompts.js +3 -1
- package/dist/prompts/register-prompts.js.map +1 -1
- package/dist/remote/public-home/index.d.ts.map +1 -1
- package/dist/remote/public-home/index.js +2 -1
- package/dist/remote/public-home/index.js.map +1 -1
- package/dist/remote/public-home/scripts.d.ts +1 -1
- package/dist/remote/public-home/scripts.d.ts.map +1 -1
- package/dist/remote/public-home/scripts.js +29 -0
- package/dist/remote/public-home/scripts.js.map +1 -1
- package/dist/remote/public-home/sections.d.ts +5 -0
- package/dist/remote/public-home/sections.d.ts.map +1 -1
- package/dist/remote/public-home/sections.js +76 -4
- package/dist/remote/public-home/sections.js.map +1 -1
- package/dist/remote/public-home/styles.d.ts +1 -1
- package/dist/remote/public-home/styles.d.ts.map +1 -1
- package/dist/remote/public-home/styles.js +460 -16
- package/dist/remote/public-home/styles.js.map +1 -1
- package/dist/remote/public-home/types.d.ts +2 -0
- package/dist/remote/public-home/types.d.ts.map +1 -1
- package/dist/remote/rate-limiter.d.ts +2 -0
- package/dist/remote/rate-limiter.d.ts.map +1 -1
- package/dist/remote/rate-limiter.js +23 -0
- package/dist/remote/rate-limiter.js.map +1 -1
- package/dist/remote/server.d.ts +72 -1
- package/dist/remote/server.d.ts.map +1 -1
- package/dist/remote/server.js +424 -15
- package/dist/remote/server.js.map +1 -1
- package/dist/runtime/module-resolution.d.ts.map +1 -1
- package/dist/runtime/module-resolution.js +41 -8
- package/dist/runtime/module-resolution.js.map +1 -1
- package/dist/schemas/settlement.schema.d.ts +2 -2
- package/dist/security/tool-permissions.d.ts.map +1 -1
- package/dist/security/tool-permissions.js +1 -6
- package/dist/security/tool-permissions.js.map +1 -1
- package/dist/tools/agent-start-tool.d.ts +12 -0
- package/dist/tools/agent-start-tool.d.ts.map +1 -0
- package/dist/tools/agent-start-tool.js +156 -0
- package/dist/tools/agent-start-tool.js.map +1 -0
- package/dist/tools/client-sdk-tools.d.ts +7 -0
- package/dist/tools/client-sdk-tools.d.ts.map +1 -1
- package/dist/tools/client-sdk-tools.js +80 -4
- package/dist/tools/client-sdk-tools.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/register-tools.d.ts.map +1 -1
- package/dist/tools/register-tools.js +5 -1
- package/dist/tools/register-tools.js.map +1 -1
- package/dist/tools/sap-sdk-tools.d.ts +1 -1
- package/dist/tools/sap-sdk-tools.d.ts.map +1 -1
- package/dist/tools/sap-sdk-tools.js +108 -105
- package/dist/tools/sap-sdk-tools.js.map +1 -1
- package/dist/tools/sap-sns-tools.d.ts +4 -4
- package/dist/tools/sap-sns-tools.js +4 -4
- package/dist/tools/skills-tools.js +1 -1
- package/dist/tools/skills-tools.js.map +1 -1
- package/dist/tools/x402-paid-call-tool.d.ts.map +1 -1
- package/dist/tools/x402-paid-call-tool.js +50 -4
- package/dist/tools/x402-paid-call-tool.js.map +1 -1
- package/dist/tui/config-wizard.js +2 -2
- package/dist/tui/config-wizard.js.map +1 -1
- package/dist/tui/wizard-save.d.ts.map +1 -1
- package/dist/tui/wizard-save.js +7 -3
- package/dist/tui/wizard-save.js.map +1 -1
- package/dist/wizard-core/desktop-flow.d.ts +1 -1
- package/dist/wizard-core/desktop-flow.d.ts.map +1 -1
- package/dist/wizard-core/desktop-flow.js +6 -5
- package/dist/wizard-core/desktop-flow.js.map +1 -1
- package/docs/03_CONFIGURATION_AND_WIZARD.md +1 -0
- package/docs/05_REMOTE_VPS_DEPLOYMENT.md +32 -0
- package/docs/06_PAYMENTS_X402_AND_PAYSH.md +12 -0
- package/docs/07_ENDPOINTS_AND_CLIENTS.md +1 -1
- package/docs/09_TOOLS_SKILLS_AND_AGENT_GUIDE.md +42 -11
- package/docs/14_DESKTOP_WIZARD_RELEASE.md +2 -1
- package/docs/README.md +6 -3
- package/docs/_sidebar.md +1 -0
- package/package.json +3 -2
- package/server.json +3 -3
- package/skills/README.md +2 -2
- package/skills/sap-escrow-settlement/SKILL.md +15 -11
- package/skills/sap-mcp/SKILL.md +39 -20
- package/skills/sap-mcp/TOOL_REFERENCE.md +6 -5
- package/skills/sap-operations/SKILL.md +6 -7
- package/smithery.config.schema.json +59 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/payments/pricing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGnE;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS,GAAG,cAAc,GAAG,OAAO,CAAC;AAEzF;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB;IACE,QAAQ,EAAE,KAAK,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B,GACD;IACE,QAAQ,EAAE,IAAI,CAAC;IACf,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/payments/pricing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGnE;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS,GAAG,cAAc,GAAG,OAAO,CAAC;AAEzF;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB;IACE,QAAQ,EAAE,KAAK,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B,GACD;IACE,QAAQ,EAAE,IAAI,CAAC;IACf,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AA8IN;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,gBAAgB,EAC/B,MAAM,EAAE,wBAAwB,GAC/B,eAAe,CAqCjB;AASD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,wBAAwB,GAC/B,WAAW,CAyCb;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,wBAAwB,EAAE,aAAa,CAAC,GAAG,WAAW,CAgClH;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGvD"}
|
package/dist/payments/pricing.js
CHANGED
|
@@ -15,6 +15,7 @@ const FREE_MCP_METHODS = new Set([
|
|
|
15
15
|
'resources/read',
|
|
16
16
|
]);
|
|
17
17
|
const FREE_TOOLS = new Set([
|
|
18
|
+
'sap_agent_start',
|
|
18
19
|
'sol_get_balance',
|
|
19
20
|
'spl-token_getBalance',
|
|
20
21
|
'spl-token_getTokenAccounts',
|
|
@@ -29,6 +30,22 @@ const FREE_TOOLS = new Set([
|
|
|
29
30
|
'sap_skills_install',
|
|
30
31
|
'sap_get_network_overview',
|
|
31
32
|
'sap_payments_profile_current',
|
|
33
|
+
'sap_payments_readiness',
|
|
34
|
+
'sap_payments_prepare_challenge',
|
|
35
|
+
'sap_payments_sign_challenge',
|
|
36
|
+
'sap_payments_call_paid_tool',
|
|
37
|
+
'sap_payments_verify_receipt',
|
|
38
|
+
]);
|
|
39
|
+
const STRICT_FREE_TOOLS = new Set([
|
|
40
|
+
'sap_agent_start',
|
|
41
|
+
'sap_profile_current',
|
|
42
|
+
'sap_profile_list',
|
|
43
|
+
'sap_profile_public_key',
|
|
44
|
+
'sap_skills_list',
|
|
45
|
+
'sap_skills_bundle',
|
|
46
|
+
'sap_skills_install',
|
|
47
|
+
'sap_payments_profile_current',
|
|
48
|
+
'sap_payments_readiness',
|
|
32
49
|
'sap_payments_prepare_challenge',
|
|
33
50
|
'sap_payments_sign_challenge',
|
|
34
51
|
'sap_payments_call_paid_tool',
|
|
@@ -163,7 +180,7 @@ function toPaidTier(tier) {
|
|
|
163
180
|
* @description Classifies and prices a single MCP tool invocation.
|
|
164
181
|
*/
|
|
165
182
|
export function priceToolCall(toolCall, config) {
|
|
166
|
-
const tier = classifyTool(toolCall.toolName);
|
|
183
|
+
const tier = classifyTool(toolCall.toolName, config);
|
|
167
184
|
if (tier === 'free') {
|
|
168
185
|
return {
|
|
169
186
|
toolName: toolCall.toolName,
|
|
@@ -203,8 +220,9 @@ export function priceToolCall(toolCall, config) {
|
|
|
203
220
|
* @name classifyTool
|
|
204
221
|
* @description Maps a tool name to the default hosted monetization tier.
|
|
205
222
|
*/
|
|
206
|
-
export function classifyTool(toolName) {
|
|
207
|
-
|
|
223
|
+
export function classifyTool(toolName, config) {
|
|
224
|
+
const freeTools = config?.strictTools ? STRICT_FREE_TOOLS : FREE_TOOLS;
|
|
225
|
+
if (freeTools.has(toolName)) {
|
|
208
226
|
return 'free';
|
|
209
227
|
}
|
|
210
228
|
if (READ_PREMIUM_TOOLS.has(toolName)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/payments/pricing.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/payments/pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* @description Local helper for paying and retrying hosted SAP MCP x402 tool calls with a user-controlled SAP profile signer.
|
|
5
5
|
*/
|
|
6
6
|
import type { PaymentPayload, PaymentRequired, PaymentRequirements, SettleResponse } from '@x402/core/types';
|
|
7
|
+
import { type SapMcpConfig } from '../config/env.js';
|
|
7
8
|
export declare const DEFAULT_X402_PAID_CALL_ENDPOINT = "https://mcp.sap.oobeprotocol.ai/mcp";
|
|
8
9
|
/**
|
|
9
10
|
* @name X402PaidCallInput
|
|
@@ -87,6 +88,67 @@ export interface X402ReceiptInspectionResult {
|
|
|
87
88
|
network?: string;
|
|
88
89
|
warning?: string;
|
|
89
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* @name AgentCommercePolicySnapshot
|
|
93
|
+
* @description Redacted local policy limits used by agents before paying or moving value.
|
|
94
|
+
*/
|
|
95
|
+
export interface AgentCommercePolicySnapshot {
|
|
96
|
+
autoPayX402BelowUsd: number;
|
|
97
|
+
dailyX402LimitUsd?: number;
|
|
98
|
+
maxTradeUsd?: number;
|
|
99
|
+
maxSlippageBps: number;
|
|
100
|
+
requireConfirmationAboveUsd: number;
|
|
101
|
+
allowedProtocols: readonly string[];
|
|
102
|
+
maxAttempts: number;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* @name X402PaymentReadinessResult
|
|
106
|
+
* @description Full local readiness snapshot for hosted paid/write SAP MCP workflows.
|
|
107
|
+
*/
|
|
108
|
+
export interface X402PaymentReadinessResult {
|
|
109
|
+
hostedMcp: {
|
|
110
|
+
endpoint: string;
|
|
111
|
+
accountModel: 'hosted-remote-accountless';
|
|
112
|
+
toolNamespace: 'sap';
|
|
113
|
+
};
|
|
114
|
+
localBridge: {
|
|
115
|
+
status: 'connected';
|
|
116
|
+
toolNamespace: 'sap_payments';
|
|
117
|
+
preferredTool: 'sap_payments_call_paid_tool';
|
|
118
|
+
readinessTool: 'sap_payments_readiness';
|
|
119
|
+
};
|
|
120
|
+
profile: {
|
|
121
|
+
activeProfile: string;
|
|
122
|
+
configPath: string;
|
|
123
|
+
mode: SapMcpConfig['mode'];
|
|
124
|
+
network: string;
|
|
125
|
+
rpcUrl: string;
|
|
126
|
+
programId: string;
|
|
127
|
+
walletPathConfigured: boolean;
|
|
128
|
+
walletFileExists: boolean;
|
|
129
|
+
signerConfigured: boolean;
|
|
130
|
+
signerPublicKey?: string;
|
|
131
|
+
agentPubkey?: string;
|
|
132
|
+
secretMaterial: 'keypair-bytes-never-returned';
|
|
133
|
+
};
|
|
134
|
+
balances: {
|
|
135
|
+
checked: boolean;
|
|
136
|
+
sol?: number;
|
|
137
|
+
usdc?: number;
|
|
138
|
+
usdcMint: string;
|
|
139
|
+
payerBalanceEnoughForAutoPay?: boolean;
|
|
140
|
+
error?: string;
|
|
141
|
+
};
|
|
142
|
+
policy: AgentCommercePolicySnapshot;
|
|
143
|
+
readiness: {
|
|
144
|
+
status: 'ready' | 'degraded' | 'not-ready';
|
|
145
|
+
canPayX402: boolean;
|
|
146
|
+
canExecuteWriteTools: boolean;
|
|
147
|
+
issues: readonly string[];
|
|
148
|
+
nextAction: string;
|
|
149
|
+
};
|
|
150
|
+
agentInstruction: string;
|
|
151
|
+
}
|
|
90
152
|
/**
|
|
91
153
|
* @name X402PaidCallResult
|
|
92
154
|
* @description Result returned after a hosted MCP paid request is completed.
|
|
@@ -106,6 +168,35 @@ export interface X402PaidCallResult {
|
|
|
106
168
|
response: unknown;
|
|
107
169
|
attempts: number;
|
|
108
170
|
transientRetries: readonly string[];
|
|
171
|
+
audit: X402PaidCallAudit;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* @name X402PaidCallAudit
|
|
175
|
+
* @description Agent-readable proof object for one hosted paid MCP execution.
|
|
176
|
+
*/
|
|
177
|
+
export interface X402PaidCallAudit {
|
|
178
|
+
intentId: string;
|
|
179
|
+
profileName: string;
|
|
180
|
+
signerAddress: string;
|
|
181
|
+
endpoint: string;
|
|
182
|
+
toolName?: string;
|
|
183
|
+
requestMethod: string;
|
|
184
|
+
payment: {
|
|
185
|
+
amountUsd: number;
|
|
186
|
+
network: string;
|
|
187
|
+
asset: string;
|
|
188
|
+
payTo: string;
|
|
189
|
+
};
|
|
190
|
+
receipt: {
|
|
191
|
+
present: boolean;
|
|
192
|
+
transaction?: string;
|
|
193
|
+
network?: string;
|
|
194
|
+
amount?: string;
|
|
195
|
+
payer?: string;
|
|
196
|
+
};
|
|
197
|
+
attempts: number;
|
|
198
|
+
transientRetries: readonly string[];
|
|
199
|
+
secretMaterial: 'keypair-bytes-never-returned';
|
|
109
200
|
}
|
|
110
201
|
interface JsonRpcRequest {
|
|
111
202
|
jsonrpc: '2.0';
|
|
@@ -118,6 +209,11 @@ interface JsonRpcRequest {
|
|
|
118
209
|
* @description Initializes MCP, obtains x402 payment requirements, signs locally, retries the call, and returns the settlement receipt.
|
|
119
210
|
*/
|
|
120
211
|
export declare function executeX402PaidCall(input: X402PaidCallInput): Promise<X402PaidCallResult>;
|
|
212
|
+
/**
|
|
213
|
+
* @name getX402PaymentReadiness
|
|
214
|
+
* @description Checks local profile, signer, RPC, balances, and commerce policy for hosted paid/write workflows.
|
|
215
|
+
*/
|
|
216
|
+
export declare function getX402PaymentReadiness(profileName?: string, endpoint?: string): Promise<X402PaymentReadinessResult>;
|
|
121
217
|
/**
|
|
122
218
|
* @name probeX402PaymentChallenge
|
|
123
219
|
* @description Initializes hosted MCP and returns a parsed x402 challenge for one unpaid tool call without signing.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x402-paid-call.d.ts","sourceRoot":"","sources":["../../src/payments/x402-paid-call.ts"],"names":[],"mappings":";AACA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"x402-paid-call.d.ts","sourceRoot":"","sources":["../../src/payments/x402-paid-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,18 +3,22 @@
|
|
|
3
3
|
* @name X402PaidCallHelper
|
|
4
4
|
* @description Local helper for paying and retrying hosted SAP MCP x402 tool calls with a user-controlled SAP profile signer.
|
|
5
5
|
*/
|
|
6
|
-
import { readFileSync } from 'fs';
|
|
6
|
+
import { existsSync, readFileSync } from 'fs';
|
|
7
|
+
import { createHash } from 'crypto';
|
|
7
8
|
import { x402Client, x402HTTPClient } from '@x402/core/client';
|
|
8
9
|
import { registerExactSvmScheme } from '@x402/svm/exact/client';
|
|
9
10
|
import { createKeyPairSignerFromBytes } from '@solana/kit';
|
|
11
|
+
import { Connection, PublicKey } from '@solana/web3.js';
|
|
10
12
|
import { loadConfig } from '../config/env.js';
|
|
11
|
-
import { getProfileConfigPath } from '../config/profiles.js';
|
|
13
|
+
import { getActiveProfile, getProfileConfigPath } from '../config/profiles.js';
|
|
12
14
|
import { MCP_SERVER_VERSION } from '../core/constants.js';
|
|
13
15
|
export const DEFAULT_X402_PAID_CALL_ENDPOINT = 'https://mcp.sap.oobeprotocol.ai/mcp';
|
|
14
16
|
const MCP_PROTOCOL_VERSION = '2025-06-18';
|
|
15
17
|
const DEFAULT_MAX_ATTEMPTS = 3;
|
|
16
18
|
const MAX_ALLOWED_ATTEMPTS = 5;
|
|
17
19
|
const RETRY_BASE_DELAY_MS = 500;
|
|
20
|
+
const MAINNET_USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
|
|
21
|
+
const DEVNET_USDC_MINT = '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU';
|
|
18
22
|
/**
|
|
19
23
|
* @name executeX402PaidCall
|
|
20
24
|
* @description Initializes MCP, obtains x402 payment requirements, signs locally, retries the call, and returns the settlement receipt.
|
|
@@ -22,6 +26,7 @@ const RETRY_BASE_DELAY_MS = 500;
|
|
|
22
26
|
export async function executeX402PaidCall(input) {
|
|
23
27
|
validateInput(input);
|
|
24
28
|
const endpoint = input.endpoint ?? DEFAULT_X402_PAID_CALL_ENDPOINT;
|
|
29
|
+
const profileName = input.profileName ?? getActiveProfile();
|
|
25
30
|
const config = loadPaymentProfile(input.profileName);
|
|
26
31
|
const signer = await loadClientSigner(config);
|
|
27
32
|
const httpClient = createHttpPaymentClient(signer);
|
|
@@ -37,6 +42,7 @@ export async function executeX402PaidCall(input) {
|
|
|
37
42
|
signerAddress: String(signer.address),
|
|
38
43
|
httpClient,
|
|
39
44
|
requestBody,
|
|
45
|
+
profileName,
|
|
40
46
|
maxPriceUsd: input.maxPriceUsd,
|
|
41
47
|
attempt,
|
|
42
48
|
transientRetries,
|
|
@@ -53,6 +59,89 @@ export async function executeX402PaidCall(input) {
|
|
|
53
59
|
}
|
|
54
60
|
throw new Error('x402 paid call exhausted retries.');
|
|
55
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* @name getX402PaymentReadiness
|
|
64
|
+
* @description Checks local profile, signer, RPC, balances, and commerce policy for hosted paid/write workflows.
|
|
65
|
+
*/
|
|
66
|
+
export async function getX402PaymentReadiness(profileName, endpoint = DEFAULT_X402_PAID_CALL_ENDPOINT) {
|
|
67
|
+
const activeProfile = profileName ?? getActiveProfile();
|
|
68
|
+
const configPath = getProfileConfigPath(activeProfile);
|
|
69
|
+
let config;
|
|
70
|
+
let signerAddress;
|
|
71
|
+
const issues = [];
|
|
72
|
+
try {
|
|
73
|
+
config = loadPaymentProfile(profileName);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
77
|
+
issues.push(`profile_load_failed: ${message}`);
|
|
78
|
+
}
|
|
79
|
+
if (config) {
|
|
80
|
+
try {
|
|
81
|
+
const signer = await loadClientSigner(config);
|
|
82
|
+
signerAddress = String(signer.address);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
86
|
+
issues.push(`signer_unavailable: ${message}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const policy = readAgentCommercePolicy();
|
|
90
|
+
const network = networkFromRpcUrl(config?.rpcUrl);
|
|
91
|
+
const usdcMint = usdcMintForNetwork(network);
|
|
92
|
+
const balances = await readBalanceSnapshot(config?.rpcUrl, signerAddress, usdcMint, policy.autoPayX402BelowUsd);
|
|
93
|
+
if (balances.error) {
|
|
94
|
+
issues.push(`balance_check_degraded: ${balances.error}`);
|
|
95
|
+
}
|
|
96
|
+
const walletFileExists = Boolean(config?.walletPath && existsSync(config.walletPath));
|
|
97
|
+
if (config?.walletPath && !walletFileExists) {
|
|
98
|
+
issues.push('wallet_file_missing');
|
|
99
|
+
}
|
|
100
|
+
const canPayX402 = Boolean(signerAddress && balances.payerBalanceEnoughForAutoPay !== false);
|
|
101
|
+
const canExecuteWriteTools = Boolean(signerAddress && config?.mode !== 'readonly');
|
|
102
|
+
const status = !config || !signerAddress || !walletFileExists
|
|
103
|
+
? 'not-ready'
|
|
104
|
+
: issues.length > 0
|
|
105
|
+
? 'degraded'
|
|
106
|
+
: 'ready';
|
|
107
|
+
return {
|
|
108
|
+
hostedMcp: {
|
|
109
|
+
endpoint,
|
|
110
|
+
accountModel: 'hosted-remote-accountless',
|
|
111
|
+
toolNamespace: 'sap',
|
|
112
|
+
},
|
|
113
|
+
localBridge: {
|
|
114
|
+
status: 'connected',
|
|
115
|
+
toolNamespace: 'sap_payments',
|
|
116
|
+
preferredTool: 'sap_payments_call_paid_tool',
|
|
117
|
+
readinessTool: 'sap_payments_readiness',
|
|
118
|
+
},
|
|
119
|
+
profile: {
|
|
120
|
+
activeProfile,
|
|
121
|
+
configPath,
|
|
122
|
+
mode: config?.mode ?? 'readonly',
|
|
123
|
+
network,
|
|
124
|
+
rpcUrl: redactUrl(config?.rpcUrl),
|
|
125
|
+
programId: config?.programId ?? '',
|
|
126
|
+
walletPathConfigured: Boolean(config?.walletPath),
|
|
127
|
+
walletFileExists,
|
|
128
|
+
signerConfigured: Boolean(signerAddress),
|
|
129
|
+
...(signerAddress ? { signerPublicKey: signerAddress } : {}),
|
|
130
|
+
...(config?.agentPubkey ? { agentPubkey: config.agentPubkey } : {}),
|
|
131
|
+
secretMaterial: 'keypair-bytes-never-returned',
|
|
132
|
+
},
|
|
133
|
+
balances,
|
|
134
|
+
policy,
|
|
135
|
+
readiness: {
|
|
136
|
+
status,
|
|
137
|
+
canPayX402,
|
|
138
|
+
canExecuteWriteTools,
|
|
139
|
+
issues,
|
|
140
|
+
nextAction: readinessNextAction(status, issues, canPayX402),
|
|
141
|
+
},
|
|
142
|
+
agentInstruction: 'Call sap_payments_readiness first for hosted paid/write workflows. If status is ready or degraded with canPayX402=true, use sap_payments_call_paid_tool for paid hosted tools. Do not infer local wallet state from hosted sap_profile_current.',
|
|
143
|
+
};
|
|
144
|
+
}
|
|
56
145
|
/**
|
|
57
146
|
* @name probeX402PaymentChallenge
|
|
58
147
|
* @description Initializes hosted MCP and returns a parsed x402 challenge for one unpaid tool call without signing.
|
|
@@ -156,6 +245,31 @@ async function executePaidAttempt(options) {
|
|
|
156
245
|
if (isJsonRpcError(paid.body)) {
|
|
157
246
|
throw new Error(`Paid MCP call returned JSON-RPC error: ${JSON.stringify(paid.body.error)}`);
|
|
158
247
|
}
|
|
248
|
+
const toolName = extractToolName(options.requestBody);
|
|
249
|
+
const audit = {
|
|
250
|
+
intentId: buildIntentId(options.requestBody, options.sessionId),
|
|
251
|
+
profileName: options.profileName,
|
|
252
|
+
signerAddress: options.signerAddress,
|
|
253
|
+
endpoint: options.endpoint,
|
|
254
|
+
...(toolName ? { toolName } : {}),
|
|
255
|
+
requestMethod: options.requestBody.method,
|
|
256
|
+
payment: {
|
|
257
|
+
amountUsd,
|
|
258
|
+
network: selectedRequirements.network,
|
|
259
|
+
asset: selectedRequirements.asset,
|
|
260
|
+
payTo: selectedRequirements.payTo,
|
|
261
|
+
},
|
|
262
|
+
receipt: {
|
|
263
|
+
present: Boolean(paymentResult.settleResponse),
|
|
264
|
+
...(paymentResult.settleResponse?.transaction ? { transaction: paymentResult.settleResponse.transaction } : {}),
|
|
265
|
+
...(paymentResult.settleResponse?.network ? { network: paymentResult.settleResponse.network } : {}),
|
|
266
|
+
...(paymentResult.settleResponse?.amount ? { amount: paymentResult.settleResponse.amount } : {}),
|
|
267
|
+
...(paymentResult.settleResponse?.payer ? { payer: paymentResult.settleResponse.payer } : {}),
|
|
268
|
+
},
|
|
269
|
+
attempts: options.attempt,
|
|
270
|
+
transientRetries: options.transientRetries,
|
|
271
|
+
secretMaterial: 'keypair-bytes-never-returned',
|
|
272
|
+
};
|
|
159
273
|
return {
|
|
160
274
|
success: true,
|
|
161
275
|
endpoint: options.endpoint,
|
|
@@ -171,6 +285,7 @@ async function executePaidAttempt(options) {
|
|
|
171
285
|
response: paid.body,
|
|
172
286
|
attempts: options.attempt,
|
|
173
287
|
transientRetries: options.transientRetries,
|
|
288
|
+
audit,
|
|
174
289
|
};
|
|
175
290
|
}
|
|
176
291
|
function validateInput(input) {
|
|
@@ -394,6 +509,153 @@ function sleep(ms) {
|
|
|
394
509
|
function isJsonRpcError(value) {
|
|
395
510
|
return value !== null && typeof value === 'object' && 'error' in value;
|
|
396
511
|
}
|
|
512
|
+
function networkFromRpcUrl(value) {
|
|
513
|
+
if (!value) {
|
|
514
|
+
return 'mainnet-beta';
|
|
515
|
+
}
|
|
516
|
+
if (value.includes('mainnet')) {
|
|
517
|
+
return 'mainnet-beta';
|
|
518
|
+
}
|
|
519
|
+
if (value.includes('testnet')) {
|
|
520
|
+
return 'testnet';
|
|
521
|
+
}
|
|
522
|
+
if (value.includes('localhost') || value.includes('127.0.0.1') || value.includes('localnet')) {
|
|
523
|
+
return 'localnet';
|
|
524
|
+
}
|
|
525
|
+
return 'devnet';
|
|
526
|
+
}
|
|
527
|
+
function usdcMintForNetwork(network) {
|
|
528
|
+
return network === 'devnet' ? DEVNET_USDC_MINT : MAINNET_USDC_MINT;
|
|
529
|
+
}
|
|
530
|
+
function redactUrl(value) {
|
|
531
|
+
if (!value) {
|
|
532
|
+
return '';
|
|
533
|
+
}
|
|
534
|
+
try {
|
|
535
|
+
const url = new URL(value);
|
|
536
|
+
if (url.search) {
|
|
537
|
+
url.search = '?redacted=true';
|
|
538
|
+
}
|
|
539
|
+
return url.toString();
|
|
540
|
+
}
|
|
541
|
+
catch {
|
|
542
|
+
return value.includes('?') ? `${value.split('?')[0]}?redacted=true` : value;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
async function readBalanceSnapshot(rpcUrl, signerAddress, usdcMint, autoPayX402BelowUsd) {
|
|
546
|
+
if (!rpcUrl || !signerAddress) {
|
|
547
|
+
return {
|
|
548
|
+
checked: false,
|
|
549
|
+
usdcMint,
|
|
550
|
+
error: 'missing_rpc_or_signer',
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
try {
|
|
554
|
+
const connection = new Connection(rpcUrl, 'confirmed');
|
|
555
|
+
const owner = new PublicKey(signerAddress);
|
|
556
|
+
const mint = new PublicKey(usdcMint);
|
|
557
|
+
const [lamports, tokenAccounts] = await Promise.all([
|
|
558
|
+
connection.getBalance(owner, 'confirmed'),
|
|
559
|
+
connection.getParsedTokenAccountsByOwner(owner, { mint }, 'confirmed'),
|
|
560
|
+
]);
|
|
561
|
+
const usdc = tokenAccounts.value.reduce((total, account) => {
|
|
562
|
+
const parsed = account.account.data.parsed;
|
|
563
|
+
if (!isRecord(parsed) || !isRecord(parsed.info) || !isRecord(parsed.info.tokenAmount)) {
|
|
564
|
+
return total;
|
|
565
|
+
}
|
|
566
|
+
const amount = parsed.info.tokenAmount.uiAmount;
|
|
567
|
+
return total + (typeof amount === 'number' && Number.isFinite(amount) ? amount : 0);
|
|
568
|
+
}, 0);
|
|
569
|
+
return {
|
|
570
|
+
checked: true,
|
|
571
|
+
sol: lamports / 1_000_000_000,
|
|
572
|
+
usdc,
|
|
573
|
+
usdcMint,
|
|
574
|
+
payerBalanceEnoughForAutoPay: usdc >= autoPayX402BelowUsd,
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
catch (error) {
|
|
578
|
+
return {
|
|
579
|
+
checked: false,
|
|
580
|
+
usdcMint,
|
|
581
|
+
error: error instanceof Error ? error.message : String(error),
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
function readAgentCommercePolicy() {
|
|
586
|
+
return {
|
|
587
|
+
autoPayX402BelowUsd: readPositiveNumberEnv('SAP_MCP_X402_AUTO_PAY_MAX_USD', 0.02),
|
|
588
|
+
dailyX402LimitUsd: readOptionalPositiveNumberEnv('SAP_MCP_X402_DAILY_LIMIT_USD'),
|
|
589
|
+
maxTradeUsd: readOptionalPositiveNumberEnv('SAP_MCP_MAX_TRADE_USD') ?? 10,
|
|
590
|
+
maxSlippageBps: readPositiveNumberEnv('SAP_MCP_MAX_SLIPPAGE_BPS', 100),
|
|
591
|
+
requireConfirmationAboveUsd: readPositiveNumberEnv('SAP_MCP_REQUIRE_CONFIRMATION_ABOVE_USD', 1),
|
|
592
|
+
allowedProtocols: readListEnv('SAP_MCP_ALLOWED_PROTOCOLS', ['jupiter', 'sns', 'sap', 'metaplex']),
|
|
593
|
+
maxAttempts: readIntegerEnv('SAP_MCP_X402_MAX_ATTEMPTS', DEFAULT_MAX_ATTEMPTS, 1, MAX_ALLOWED_ATTEMPTS),
|
|
594
|
+
};
|
|
595
|
+
}
|
|
596
|
+
function readPositiveNumberEnv(name, fallback) {
|
|
597
|
+
const value = process.env[name];
|
|
598
|
+
if (!value) {
|
|
599
|
+
return fallback;
|
|
600
|
+
}
|
|
601
|
+
const parsed = Number(value);
|
|
602
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;
|
|
603
|
+
}
|
|
604
|
+
function readOptionalPositiveNumberEnv(name) {
|
|
605
|
+
const value = process.env[name];
|
|
606
|
+
if (!value) {
|
|
607
|
+
return undefined;
|
|
608
|
+
}
|
|
609
|
+
const parsed = Number(value);
|
|
610
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;
|
|
611
|
+
}
|
|
612
|
+
function readIntegerEnv(name, fallback, min, max) {
|
|
613
|
+
const value = process.env[name];
|
|
614
|
+
if (!value) {
|
|
615
|
+
return fallback;
|
|
616
|
+
}
|
|
617
|
+
const parsed = Number(value);
|
|
618
|
+
return Number.isInteger(parsed) && parsed >= min && parsed <= max ? parsed : fallback;
|
|
619
|
+
}
|
|
620
|
+
function readListEnv(name, fallback) {
|
|
621
|
+
const value = process.env[name];
|
|
622
|
+
if (!value) {
|
|
623
|
+
return fallback;
|
|
624
|
+
}
|
|
625
|
+
const parsed = value.split(',').map(item => item.trim()).filter(Boolean);
|
|
626
|
+
return parsed.length > 0 ? parsed : fallback;
|
|
627
|
+
}
|
|
628
|
+
function readinessNextAction(status, issues, canPayX402) {
|
|
629
|
+
if (status === 'ready') {
|
|
630
|
+
return 'Use sap_payments_call_paid_tool for hosted paid/write SAP MCP calls.';
|
|
631
|
+
}
|
|
632
|
+
if (canPayX402) {
|
|
633
|
+
return 'Proceed with paid calls if the user accepts degraded readiness; retry transient RPC errors with fresh challenges.';
|
|
634
|
+
}
|
|
635
|
+
if (issues.some(issue => issue.includes('wallet_file_missing'))) {
|
|
636
|
+
return 'Run the SAP MCP wizard repair or update the active profile walletPath to an existing dedicated keypair.';
|
|
637
|
+
}
|
|
638
|
+
if (issues.some(issue => issue.includes('signer_unavailable'))) {
|
|
639
|
+
return 'Run the SAP MCP wizard full setup or repair the local signer before paid/write calls.';
|
|
640
|
+
}
|
|
641
|
+
return 'Run the SAP MCP wizard repair flow, restart the agent runtime, then call sap_payments_readiness again.';
|
|
642
|
+
}
|
|
643
|
+
function extractToolName(requestBody) {
|
|
644
|
+
if (requestBody.method !== 'tools/call' || !isRecord(requestBody.params)) {
|
|
645
|
+
return undefined;
|
|
646
|
+
}
|
|
647
|
+
const name = requestBody.params.name;
|
|
648
|
+
return typeof name === 'string' ? name : undefined;
|
|
649
|
+
}
|
|
650
|
+
function buildIntentId(requestBody, sessionId) {
|
|
651
|
+
const source = JSON.stringify({
|
|
652
|
+
method: requestBody.method,
|
|
653
|
+
params: requestBody.params ?? null,
|
|
654
|
+
sessionId,
|
|
655
|
+
at: Date.now(),
|
|
656
|
+
});
|
|
657
|
+
return `sap-intent-${createHash('sha256').update(source).digest('hex').slice(0, 16)}`;
|
|
658
|
+
}
|
|
397
659
|
function parseCliArgs(argv) {
|
|
398
660
|
const parsed = { confirm: false };
|
|
399
661
|
for (let index = 0; index < argv.length; index += 1) {
|