@oobe-protocol-labs/sap-mcp-server 0.2.1 → 0.7.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/.env.example +3 -0
- package/CHANGELOG.md +238 -1
- package/README.md +64 -1
- package/USER_DOCS/00_START_HERE.md +23 -1
- package/USER_DOCS/01_HOSTED_REMOTE_MCP.md +55 -0
- package/USER_DOCS/03_PAYMENTS_X402_PAYSH.md +63 -7
- package/USER_DOCS/04_CLIENT_CONFIGS.md +164 -11
- package/USER_DOCS/06_DESKTOP_GUI_WIZARD.md +262 -0
- package/dist/adapters/mcp/sdk-compat.d.ts.map +1 -1
- package/dist/adapters/mcp/sdk-compat.js +32 -18
- package/dist/adapters/mcp/sdk-compat.js.map +1 -1
- package/dist/config/mcp-client-injection.d.ts +72 -2
- package/dist/config/mcp-client-injection.d.ts.map +1 -1
- package/dist/config/mcp-client-injection.js +691 -15
- package/dist/config/mcp-client-injection.js.map +1 -1
- package/dist/config/setup.js +1 -1
- package/dist/config/setup.js.map +1 -1
- package/dist/config/wizard.d.ts.map +1 -1
- package/dist/config/wizard.js +164 -85
- 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/core/logger.js +1 -1
- package/dist/payments/facilitator-rpc-fallback.d.ts +43 -0
- package/dist/payments/facilitator-rpc-fallback.d.ts.map +1 -0
- package/dist/payments/facilitator-rpc-fallback.js +228 -0
- package/dist/payments/facilitator-rpc-fallback.js.map +1 -0
- package/dist/payments/json-rpc.d.ts.map +1 -1
- package/dist/payments/json-rpc.js +2 -1
- package/dist/payments/json-rpc.js.map +1 -1
- package/dist/payments/monetization-gate.d.ts +43 -2
- package/dist/payments/monetization-gate.d.ts.map +1 -1
- package/dist/payments/monetization-gate.js +618 -9
- package/dist/payments/monetization-gate.js.map +1 -1
- package/dist/payments/oobe-facilitator-server.d.ts +12 -1
- package/dist/payments/oobe-facilitator-server.d.ts.map +1 -1
- package/dist/payments/oobe-facilitator-server.js +109 -8
- package/dist/payments/oobe-facilitator-server.js.map +1 -1
- package/dist/payments/pay-sh-spec.js +1 -1
- package/dist/payments/pricing.d.ts.map +1 -1
- package/dist/payments/pricing.js +1 -0
- package/dist/payments/pricing.js.map +1 -1
- package/dist/payments/usage-ledger.d.ts +10 -0
- package/dist/payments/usage-ledger.d.ts.map +1 -1
- package/dist/payments/usage-ledger.js +51 -0
- package/dist/payments/usage-ledger.js.map +1 -1
- package/dist/payments/x402-paid-call.d.ts +53 -0
- package/dist/payments/x402-paid-call.d.ts.map +1 -0
- package/dist/payments/x402-paid-call.js +370 -0
- package/dist/payments/x402-paid-call.js.map +1 -0
- package/dist/prompts/context/sap-agent-context.prompt.js +33 -6
- package/dist/prompts/context/sap-agent-context.prompt.js.map +1 -1
- package/dist/prompts/developer/debug-sap-error.prompt.js +1 -1
- package/dist/prompts/developer/debug-sap-error.prompt.js.map +1 -1
- package/dist/prompts/developer/generate-sap-integration.prompt.js +6 -2
- package/dist/prompts/developer/generate-sap-integration.prompt.js.map +1 -1
- package/dist/prompts/execution-proof/explain-proof-of-execution.prompt.js +1 -1
- package/dist/prompts/execution-proof/explain-proof-of-execution.prompt.js.map +1 -1
- package/dist/prompts/execution-proof/verify-execution-proof.prompt.js +1 -1
- package/dist/prompts/execution-proof/verify-execution-proof.prompt.js.map +1 -1
- package/dist/prompts/payments/create-paid-api.prompt.js +1 -1
- package/dist/prompts/payments/create-paid-api.prompt.js.map +1 -1
- package/dist/prompts/payments/explain-x402-settlement.prompt.js +1 -1
- package/dist/prompts/payments/explain-x402-settlement.prompt.js.map +1 -1
- package/dist/prompts/register-prompts.js +2 -2
- package/dist/prompts/register-prompts.js.map +1 -1
- package/dist/prompts/registry/analyze-sap-agent.prompt.js +1 -1
- package/dist/prompts/registry/analyze-sap-agent.prompt.js.map +1 -1
- package/dist/prompts/registry/register-sap-agent.prompt.js +2 -2
- package/dist/prompts/registry/register-sap-agent.prompt.js.map +1 -1
- package/dist/remote/server.d.ts +150 -1
- package/dist/remote/server.d.ts.map +1 -1
- package/dist/remote/server.js +1176 -84
- package/dist/remote/server.js.map +1 -1
- package/dist/resources/current/sap-current-config.resource.d.ts.map +1 -1
- package/dist/resources/current/sap-current-config.resource.js +22 -2
- package/dist/resources/current/sap-current-config.resource.js.map +1 -1
- package/dist/resources/execution-proof/sap-execution-record.resource.js +1 -1
- package/dist/resources/execution-proof/sap-execution-record.resource.js.map +1 -1
- package/dist/resources/memory/sap-memory.resource.js +1 -1
- package/dist/resources/memory/sap-memory.resource.js.map +1 -1
- package/dist/resources/profile/sap-active-profile.resource.js +1 -1
- package/dist/resources/profile/sap-active-profile.resource.js.map +1 -1
- package/dist/resources/register-resources.js +2 -2
- package/dist/resources/register-resources.js.map +1 -1
- package/dist/resources/registry/sap-agent.resource.js +1 -1
- package/dist/resources/registry/sap-agent.resource.js.map +1 -1
- package/dist/resources/registry/sap-global-registry.resource.js +1 -1
- package/dist/resources/registry/sap-global-registry.resource.js.map +1 -1
- package/dist/resources/reputation/sap-reputation.resource.js +1 -1
- package/dist/resources/reputation/sap-reputation.resource.js.map +1 -1
- package/dist/resources/stats/sap-network-stats.resource.js +1 -1
- package/dist/resources/stats/sap-network-stats.resource.js.map +1 -1
- package/dist/resources/tool-schema/sap-tool-schema.resource.js +1 -1
- package/dist/resources/tool-schema/sap-tool-schema.resource.js.map +1 -1
- package/dist/sap/sap-client-manager.js +6 -6
- package/dist/sap/sap-client-manager.js.map +1 -1
- package/dist/security/tool-permissions.d.ts.map +1 -1
- package/dist/security/tool-permissions.js +1 -0
- package/dist/security/tool-permissions.js.map +1 -1
- package/dist/server/create-server.js +5 -5
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/register-capabilities.js +4 -4
- package/dist/server/register-capabilities.js.map +1 -1
- package/dist/server/server-metadata.js +1 -1
- package/dist/signer/signer-resolver.js +12 -5
- package/dist/signer/signer-resolver.js.map +1 -1
- package/dist/tools/client-sdk-tools.js +7 -7
- package/dist/tools/client-sdk-tools.js.map +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/magicblock-tools.d.ts +28 -0
- package/dist/tools/magicblock-tools.d.ts.map +1 -0
- package/dist/tools/magicblock-tools.js +578 -0
- package/dist/tools/magicblock-tools.js.map +1 -0
- package/dist/tools/profile-tools.d.ts.map +1 -1
- package/dist/tools/profile-tools.js +44 -0
- package/dist/tools/profile-tools.js.map +1 -1
- package/dist/tools/register-tools.d.ts.map +1 -1
- package/dist/tools/register-tools.js +11 -2
- package/dist/tools/register-tools.js.map +1 -1
- package/dist/tools/sap-sdk-tools.js +2 -2
- package/dist/tools/sap-sdk-tools.js.map +1 -1
- package/dist/tools/sap-sns-tools.js +2 -2
- package/dist/tools/sap-sns-tools.js.map +1 -1
- package/dist/tools/skills-tools.d.ts +1 -1
- package/dist/tools/skills-tools.d.ts.map +1 -1
- package/dist/tools/skills-tools.js +10 -1
- package/dist/tools/skills-tools.js.map +1 -1
- package/dist/tools/tool-aliases.d.ts +10 -0
- package/dist/tools/tool-aliases.d.ts.map +1 -0
- package/dist/tools/tool-aliases.js +23 -0
- package/dist/tools/tool-aliases.js.map +1 -0
- package/dist/tools/x402-paid-call-tool.d.ts +12 -0
- package/dist/tools/x402-paid-call-tool.d.ts.map +1 -0
- package/dist/tools/x402-paid-call-tool.js +118 -0
- package/dist/tools/x402-paid-call-tool.js.map +1 -0
- package/dist/tui/config-wizard.js +2 -2
- package/dist/tui/config-wizard.js.map +1 -1
- package/dist/wizard-core/desktop-flow.d.ts +82 -0
- package/dist/wizard-core/desktop-flow.d.ts.map +1 -0
- package/dist/wizard-core/desktop-flow.js +181 -0
- package/dist/wizard-core/desktop-flow.js.map +1 -0
- package/docs/00_README.md +3 -0
- package/docs/03_CONFIGURATION_AND_WIZARD.md +31 -5
- package/docs/06_PAYMENTS_X402_AND_PAYSH.md +70 -7
- package/docs/07_ENDPOINTS_AND_CLIENTS.md +56 -1
- package/docs/10_OPERATIONS_RELEASE_AND_PM2.md +7 -6
- package/docs/13_BOUNTY_PROGRAM_PROPOSAL.md +469 -0
- package/docs/14_DESKTOP_WIZARD_RELEASE.md +264 -0
- package/docs/README.md +104 -0
- package/docs/_sidebar.md +31 -0
- package/docs/magicblock-tools.md +166 -0
- package/docs/x402-protocol-spec.md +984 -0
- package/package.json +23 -2
- package/server.json +71 -0
- package/skills/README.md +3 -2
- package/skills/sap-defi/SKILL.md +8 -0
- package/skills/sap-mcp/SKILL.md +124 -2
- package/skills/sap-payments-x402/SKILL.md +54 -2
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
## 1. Hosted Remote MCP
|
|
4
4
|
|
|
5
|
-
Use this when the client supports remote Streamable HTTP MCP
|
|
5
|
+
Use this when the client supports remote Streamable HTTP MCP and expects a root
|
|
6
|
+
`mcpServers` object. Do not paste this JSON into Codex `config.toml`.
|
|
6
7
|
|
|
7
8
|
```json
|
|
8
9
|
{
|
|
@@ -15,7 +16,88 @@ Use this when the client supports remote Streamable HTTP MCP:
|
|
|
15
16
|
}
|
|
16
17
|
```
|
|
17
18
|
|
|
18
|
-
## 2.
|
|
19
|
+
## 2. Hosted Codex TOML
|
|
20
|
+
|
|
21
|
+
Codex supports Streamable HTTP MCP servers and uses TOML config, usually at:
|
|
22
|
+
|
|
23
|
+
- macOS/Linux: `~/.codex/config.toml`
|
|
24
|
+
- Windows: `%USERPROFILE%\.codex\config.toml`
|
|
25
|
+
|
|
26
|
+
Use this hosted remote entry:
|
|
27
|
+
|
|
28
|
+
```toml
|
|
29
|
+
[mcp_servers.sap]
|
|
30
|
+
url = "https://mcp.sap.oobeprotocol.ai/mcp"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Paid/write tools also need a local non-custodial payment bridge. The wizard can
|
|
34
|
+
write both entries automatically. Choose:
|
|
35
|
+
|
|
36
|
+
```txt
|
|
37
|
+
Configure Codex automatically: hosted sap + local sap_payments bridge
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The final Codex setup should look like this:
|
|
41
|
+
|
|
42
|
+
```toml
|
|
43
|
+
[mcp_servers.sap]
|
|
44
|
+
url = "https://mcp.sap.oobeprotocol.ai/mcp"
|
|
45
|
+
|
|
46
|
+
[mcp_servers.sap_payments]
|
|
47
|
+
command = "npx.cmd"
|
|
48
|
+
args = ["--yes", "--package", "@oobe-protocol-labs/sap-mcp-server", "sap-mcp-server"]
|
|
49
|
+
enabled_tools = ["sap_x402_paid_call", "sap_profile_current", "sap_x402_estimate_cost"]
|
|
50
|
+
tool_timeout_sec = 300
|
|
51
|
+
|
|
52
|
+
[mcp_servers.sap_payments.env]
|
|
53
|
+
SAP_MCP_ALLOW_ENV_CONFIG_OVERRIDE = "false"
|
|
54
|
+
SAP_ALLOWED_TOOLS = "sap_x402_paid_call,sap_profile_current,sap_x402_estimate_cost"
|
|
55
|
+
SAP_LOG_LEVEL = "info"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
On macOS/Linux, use `command = "npx"` instead of `npx.cmd`.
|
|
59
|
+
|
|
60
|
+
Restart Codex after editing the file. Do not paste the JSON `mcpServers`
|
|
61
|
+
snippet into Codex; Codex expects TOML. If you specifically want Codex to start
|
|
62
|
+
the complete local stdio SAP MCP process instead of using the hosted endpoint, use:
|
|
63
|
+
|
|
64
|
+
```toml
|
|
65
|
+
[mcp_servers.sap]
|
|
66
|
+
command = "npx.cmd"
|
|
67
|
+
args = ["--yes", "--package", "@oobe-protocol-labs/sap-mcp-server", "sap-mcp-server"]
|
|
68
|
+
|
|
69
|
+
[mcp_servers.sap.env]
|
|
70
|
+
SAP_MCP_ALLOW_ENV_CONFIG_OVERRIDE = "false"
|
|
71
|
+
SAP_LOG_LEVEL = "info"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
On macOS/Linux, use `command = "npx"` instead of `npx.cmd`.
|
|
75
|
+
|
|
76
|
+
## 3. Hosted Hermes Configs
|
|
77
|
+
|
|
78
|
+
Hermes global `~/.hermes/mcp.json` uses flat server entries:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"sap": {
|
|
83
|
+
"url": "https://mcp.sap.oobeprotocol.ai/mcp",
|
|
84
|
+
"transport": "streamable-http"
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Hermes profile YAML uses `mcp_servers` with a flat server block:
|
|
90
|
+
|
|
91
|
+
```yaml
|
|
92
|
+
mcp_servers:
|
|
93
|
+
sap:
|
|
94
|
+
url: https://mcp.sap.oobeprotocol.ai/mcp
|
|
95
|
+
transport: streamable-http
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Do not nest `mcpServers.sap` inside a Hermes `mcp_servers.sap` block.
|
|
99
|
+
|
|
100
|
+
## 4. Local Stdio MCP
|
|
19
101
|
|
|
20
102
|
Use this when the client requires stdio:
|
|
21
103
|
|
|
@@ -27,15 +109,15 @@ Use this when the client requires stdio:
|
|
|
27
109
|
"args": ["/absolute/path/to/sap-mcp-server/dist/bin/sap-mcp-server.js"],
|
|
28
110
|
"cwd": "/absolute/path/to/sap-mcp-server",
|
|
29
111
|
"env": {
|
|
30
|
-
"
|
|
31
|
-
"
|
|
112
|
+
"SAP_MCP_ALLOW_ENV_CONFIG_OVERRIDE": "false",
|
|
113
|
+
"SAP_LOG_LEVEL": "info"
|
|
32
114
|
}
|
|
33
115
|
}
|
|
34
116
|
}
|
|
35
117
|
}
|
|
36
118
|
```
|
|
37
119
|
|
|
38
|
-
##
|
|
120
|
+
## 5. Local Hermes YAML Concept
|
|
39
121
|
|
|
40
122
|
```yaml
|
|
41
123
|
mcp_servers:
|
|
@@ -45,11 +127,11 @@ mcp_servers:
|
|
|
45
127
|
- /absolute/path/to/sap-mcp-server/dist/bin/sap-mcp-server.js
|
|
46
128
|
cwd: /absolute/path/to/sap-mcp-server
|
|
47
129
|
env:
|
|
48
|
-
|
|
49
|
-
|
|
130
|
+
SAP_MCP_ALLOW_ENV_CONFIG_OVERRIDE: "false"
|
|
131
|
+
SAP_LOG_LEVEL: info
|
|
50
132
|
```
|
|
51
133
|
|
|
52
|
-
##
|
|
134
|
+
## 6. Local Codex TOML Concept
|
|
53
135
|
|
|
54
136
|
```toml
|
|
55
137
|
[mcp_servers.sap]
|
|
@@ -58,11 +140,11 @@ args = ["/absolute/path/to/sap-mcp-server/dist/bin/sap-mcp-server.js"]
|
|
|
58
140
|
cwd = "/absolute/path/to/sap-mcp-server"
|
|
59
141
|
|
|
60
142
|
[mcp_servers.sap.env]
|
|
61
|
-
|
|
62
|
-
|
|
143
|
+
SAP_MCP_ALLOW_ENV_CONFIG_OVERRIDE = "false"
|
|
144
|
+
SAP_LOG_LEVEL = "info"
|
|
63
145
|
```
|
|
64
146
|
|
|
65
|
-
##
|
|
147
|
+
## 7. Wizard Injection
|
|
66
148
|
|
|
67
149
|
The wizard can automatically detect and update supported client config files. If a SAP MCP entry already exists, the wizard should show the existing config and ask whether to merge, override, skip, or print manual instructions.
|
|
68
150
|
|
|
@@ -71,3 +153,74 @@ Run:
|
|
|
71
153
|
```bash
|
|
72
154
|
npm exec --yes --package @oobe-protocol-labs/sap-mcp-server -- sap-mcp-config wizard
|
|
73
155
|
```
|
|
156
|
+
|
|
157
|
+
## 8. x402 Paid-Call Addon
|
|
158
|
+
|
|
159
|
+
Hosted SAP MCP paid tools return an x402 challenge. Some agent runtimes expose remote MCP tools but do not yet have a native x402 replay path. The wizard can install a local addon bundle for Hermes, Claude, Codex, OpenClaw, or custom runtimes:
|
|
160
|
+
|
|
161
|
+
```txt
|
|
162
|
+
~/.config/mcp-sap/addons/x402-paid-call
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
The addon command is:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
npm exec --yes --package @oobe-protocol-labs/sap-mcp-server -- sap-mcp-x402-paid-call \
|
|
169
|
+
--tool sap_list_all_agents \
|
|
170
|
+
--arguments '{"limit":5}' \
|
|
171
|
+
--max-usd 0.02 \
|
|
172
|
+
--confirm
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
For Codex, the recommended runtime integration is the local `sap_payments` MCP
|
|
176
|
+
bridge shown above. It exposes only:
|
|
177
|
+
|
|
178
|
+
```txt
|
|
179
|
+
sap_x402_paid_call
|
|
180
|
+
sap_profile_current
|
|
181
|
+
sap_x402_estimate_cost
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
For Claude Code, use the official MCP CLI pattern:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
claude mcp add --transport http sap https://mcp.sap.oobeprotocol.ai/mcp
|
|
188
|
+
claude mcp add --transport stdio sap_payments -- npx --yes --package @oobe-protocol-labs/sap-mcp-server sap-mcp-server
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Set `SAP_ALLOWED_TOOLS=sap_x402_paid_call,sap_profile_current,sap_x402_estimate_cost`
|
|
192
|
+
in the local bridge environment if your Claude runtime exposes environment
|
|
193
|
+
configuration. This keeps the local bridge focused on payment retries.
|
|
194
|
+
|
|
195
|
+
Hermes plugin/addon concept:
|
|
196
|
+
|
|
197
|
+
```json
|
|
198
|
+
{
|
|
199
|
+
"plugins": {
|
|
200
|
+
"x402_paid_call": {
|
|
201
|
+
"command": "sap-mcp-x402-paid-call",
|
|
202
|
+
"description": "Pay and retry hosted SAP MCP x402 tool calls with the active local SAP MCP profile.",
|
|
203
|
+
"args": [],
|
|
204
|
+
"env": {
|
|
205
|
+
"SAP_MCP_ALLOW_ENV_CONFIG_OVERRIDE": "false"
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Local MCP tool alternative:
|
|
213
|
+
|
|
214
|
+
```json
|
|
215
|
+
{
|
|
216
|
+
"name": "sap_x402_paid_call",
|
|
217
|
+
"arguments": {
|
|
218
|
+
"toolName": "sap_list_all_agents",
|
|
219
|
+
"arguments": { "limit": 5 },
|
|
220
|
+
"maxPriceUsd": 0.02,
|
|
221
|
+
"confirm": true
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Do not add wallet paths, keypair bytes, RPC API keys, or profile-specific overrides to hosted MCP client config. Hosted MCP config points to `https://mcp.sap.oobeprotocol.ai/mcp`; the local addon/profile signs only the payment payload on the user's machine.
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# Desktop GUI Wizard
|
|
2
|
+
|
|
3
|
+
## 1. What It Is
|
|
4
|
+
|
|
5
|
+
The SAP MCP Desktop Wizard is the normie-friendly installer for users who do not want to edit MCP JSON, TOML, or YAML by hand.
|
|
6
|
+
|
|
7
|
+
It creates the same real SAP MCP profile as the CLI/TUI wizard:
|
|
8
|
+
|
|
9
|
+
- a named profile under `~/.config/mcp-sap`;
|
|
10
|
+
- a dedicated local SAP MCP wallet or external signer boundary;
|
|
11
|
+
- conservative policy limits;
|
|
12
|
+
- hosted MCP config for `https://mcp.sap.oobeprotocol.ai/mcp`;
|
|
13
|
+
- optional local x402 paid-call bridge for agent runtimes.
|
|
14
|
+
|
|
15
|
+
The desktop app is not a mock installer. It calls the same setup modules used by `sap-mcp-config wizard`.
|
|
16
|
+
|
|
17
|
+
The first screen lets you choose one of two modes:
|
|
18
|
+
|
|
19
|
+
| Mode | Use It When |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| **Full SAP MCP setup** | You are creating or refreshing a SAP MCP profile, wallet boundary, policy limits, hosted MCP entry, and x402 payment bridge. |
|
|
22
|
+
| **Install x402 payment client only** | You already have `~/.config/mcp-sap` configured, hosted tools are visible, but paid/write calls still return `payment_required`. |
|
|
23
|
+
|
|
24
|
+
## 2. When To Use It
|
|
25
|
+
|
|
26
|
+
Use the desktop wizard when:
|
|
27
|
+
|
|
28
|
+
1. You want hosted SAP MCP but local signing.
|
|
29
|
+
2. You are setting up Codex, Hermes, Claude, OpenClaw, or another MCP client.
|
|
30
|
+
3. You need paid/write tools to work through x402.
|
|
31
|
+
4. You want a dedicated SAP MCP wallet separate from Solana CLI.
|
|
32
|
+
5. You prefer a guided GUI instead of terminal prompts.
|
|
33
|
+
|
|
34
|
+
Use the CLI wizard instead when you are on a server, SSH session, CI environment, or headless machine.
|
|
35
|
+
|
|
36
|
+
## 3. Download Options
|
|
37
|
+
|
|
38
|
+
The hosted endpoint exposes the installer descriptor:
|
|
39
|
+
|
|
40
|
+
```txt
|
|
41
|
+
https://mcp.sap.oobeprotocol.ai/.well-known/sap-mcp-wizard.json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Release artifacts are published on GitHub releases:
|
|
45
|
+
|
|
46
|
+
```txt
|
|
47
|
+
https://github.com/OOBE-PROTOCOL/sap-mcp/releases
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Expected artifacts:
|
|
51
|
+
|
|
52
|
+
| Platform | Artifact |
|
|
53
|
+
| --- | --- |
|
|
54
|
+
| macOS | `SAP-MCP-Wizard-<version>-<arch>.dmg` or `.zip` |
|
|
55
|
+
| Windows | `SAP-MCP-Wizard-Setup-<version>-x64.exe` |
|
|
56
|
+
| Linux | `sap-mcp-wizard-<version>-<arch>.tar.gz` |
|
|
57
|
+
|
|
58
|
+
macOS builds must be signed and notarized for a zero-warning double-click install after downloading from Chrome, Safari, or another browser. Free public builds are ad-hoc signed but not Apple-notarized, so macOS may block them as "damaged" until you remove the quarantine flag.
|
|
59
|
+
|
|
60
|
+
For an unsigned SAP MCP Wizard build that you downloaded from the official GitHub release, copy the app to `/Applications`, then run:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
xattr -dr com.apple.quarantine "/Applications/SAP MCP Wizard.app"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Then open the app again from Finder.
|
|
67
|
+
|
|
68
|
+
Do not paste wallet/keypair material into support chats while troubleshooting installer issues.
|
|
69
|
+
|
|
70
|
+
## 4. GUI Flow
|
|
71
|
+
|
|
72
|
+
The desktop wizard walks through:
|
|
73
|
+
|
|
74
|
+
1. **Setup**: choose full setup or x402 payment-client-only repair.
|
|
75
|
+
2. **Profile**: choose a real profile name; the wizard refuses ambiguous `default` profiles.
|
|
76
|
+
3. **Wallet**: create a dedicated SAP MCP wallet or point to an existing dedicated keypair path.
|
|
77
|
+
4. **Policy**: set max transaction value, daily limits, log level, and optional Bento Guard settings.
|
|
78
|
+
5. **Runtimes**: detect local agent runtimes and configure hosted SAP MCP plus local `sap_payments`.
|
|
79
|
+
6. **Review**: show config path, wallet boundary, hosted MCP endpoint, and runtime actions before writing.
|
|
80
|
+
|
|
81
|
+
In x402 payment-client-only mode, the wizard skips profile, wallet, and policy steps. It only installs or repairs runtime MCP client entries and the optional addon bundle.
|
|
82
|
+
|
|
83
|
+
The renderer never receives keypair bytes. Wallet creation and file writes happen in the local main process.
|
|
84
|
+
|
|
85
|
+
## 5. Codex Setup From GUI
|
|
86
|
+
|
|
87
|
+
For Codex, the desktop wizard can write both entries:
|
|
88
|
+
|
|
89
|
+
```toml
|
|
90
|
+
[mcp_servers.sap]
|
|
91
|
+
url = "https://mcp.sap.oobeprotocol.ai/mcp"
|
|
92
|
+
|
|
93
|
+
[mcp_servers.sap_payments]
|
|
94
|
+
command = "npx"
|
|
95
|
+
args = ["--yes", "--package", "@oobe-protocol-labs/sap-mcp-server", "sap-mcp-server"]
|
|
96
|
+
enabled_tools = ["sap_x402_paid_call", "sap_profile_current", "sap_x402_estimate_cost"]
|
|
97
|
+
tool_timeout_sec = 300
|
|
98
|
+
|
|
99
|
+
[mcp_servers.sap_payments.env]
|
|
100
|
+
SAP_MCP_ALLOW_ENV_CONFIG_OVERRIDE = "false"
|
|
101
|
+
SAP_ALLOWED_TOOLS = "sap_x402_paid_call,sap_profile_current,sap_x402_estimate_cost"
|
|
102
|
+
SAP_LOG_LEVEL = "info"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
On Windows, the command is `npx.cmd`.
|
|
106
|
+
|
|
107
|
+
The hosted `sap` server lists and executes remote SAP MCP tools. The local `sap_payments` bridge signs x402 payment proofs with the active local SAP MCP profile and retries paid hosted calls without exposing keypair bytes.
|
|
108
|
+
|
|
109
|
+
## 6. Runtime Configs Written By The GUI
|
|
110
|
+
|
|
111
|
+
The GUI writes runtime-native config shapes. It does not paste profile names, wallet paths, RPC API keys, or keypair bytes into hosted MCP entries.
|
|
112
|
+
|
|
113
|
+
### 6.1 Claude Desktop
|
|
114
|
+
|
|
115
|
+
Claude Desktop uses a root `mcpServers` JSON object:
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
{
|
|
119
|
+
"mcpServers": {
|
|
120
|
+
"sap": {
|
|
121
|
+
"type": "http",
|
|
122
|
+
"url": "https://mcp.sap.oobeprotocol.ai/mcp"
|
|
123
|
+
},
|
|
124
|
+
"sap_payments": {
|
|
125
|
+
"command": "npx",
|
|
126
|
+
"args": ["--yes", "--package", "@oobe-protocol-labs/sap-mcp-server", "sap-mcp-server"],
|
|
127
|
+
"env": {
|
|
128
|
+
"SAP_MCP_ALLOW_ENV_CONFIG_OVERRIDE": "false",
|
|
129
|
+
"SAP_ALLOWED_TOOLS": "sap_x402_paid_call,sap_profile_current,sap_x402_estimate_cost",
|
|
130
|
+
"SAP_LOG_LEVEL": "info"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Known paths:
|
|
138
|
+
|
|
139
|
+
| OS | Path |
|
|
140
|
+
| --- | --- |
|
|
141
|
+
| macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
|
|
142
|
+
| Windows | `%USERPROFILE%\AppData\Roaming\Claude\claude_desktop_config.json` |
|
|
143
|
+
| Linux | `~/.config/Claude/claude_desktop_config.json` |
|
|
144
|
+
|
|
145
|
+
### 6.2 Hermes
|
|
146
|
+
|
|
147
|
+
Hermes global `mcp.json` uses flat server entries:
|
|
148
|
+
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"sap": {
|
|
152
|
+
"url": "https://mcp.sap.oobeprotocol.ai/mcp",
|
|
153
|
+
"transport": "streamable-http"
|
|
154
|
+
},
|
|
155
|
+
"sap_payments": {
|
|
156
|
+
"command": "npx",
|
|
157
|
+
"args": ["--yes", "--package", "@oobe-protocol-labs/sap-mcp-server", "sap-mcp-server"],
|
|
158
|
+
"env": {
|
|
159
|
+
"SAP_MCP_ALLOW_ENV_CONFIG_OVERRIDE": "false",
|
|
160
|
+
"SAP_ALLOWED_TOOLS": "sap_x402_paid_call,sap_profile_current,sap_x402_estimate_cost",
|
|
161
|
+
"SAP_LOG_LEVEL": "info"
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Hermes profile YAML uses top-level `mcp_servers`:
|
|
168
|
+
|
|
169
|
+
```yaml
|
|
170
|
+
mcp_servers:
|
|
171
|
+
sap:
|
|
172
|
+
url: https://mcp.sap.oobeprotocol.ai/mcp
|
|
173
|
+
transport: streamable-http
|
|
174
|
+
sap_payments:
|
|
175
|
+
command: npx
|
|
176
|
+
args:
|
|
177
|
+
- --yes
|
|
178
|
+
- --package
|
|
179
|
+
- @oobe-protocol-labs/sap-mcp-server
|
|
180
|
+
- sap-mcp-server
|
|
181
|
+
env:
|
|
182
|
+
SAP_MCP_ALLOW_ENV_CONFIG_OVERRIDE: "false"
|
|
183
|
+
SAP_ALLOWED_TOOLS: sap_x402_paid_call,sap_profile_current,sap_x402_estimate_cost
|
|
184
|
+
SAP_LOG_LEVEL: info
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 6.3 OpenClaw
|
|
188
|
+
|
|
189
|
+
OpenClaw MCP JSON uses the same root `mcpServers` structure as generic MCP clients:
|
|
190
|
+
|
|
191
|
+
```json
|
|
192
|
+
{
|
|
193
|
+
"mcpServers": {
|
|
194
|
+
"sap": {
|
|
195
|
+
"url": "https://mcp.sap.oobeprotocol.ai/mcp",
|
|
196
|
+
"transport": "streamable-http"
|
|
197
|
+
},
|
|
198
|
+
"sap_payments": {
|
|
199
|
+
"command": "npx",
|
|
200
|
+
"args": ["--yes", "--package", "@oobe-protocol-labs/sap-mcp-server", "sap-mcp-server"],
|
|
201
|
+
"env": {
|
|
202
|
+
"SAP_MCP_ALLOW_ENV_CONFIG_OVERRIDE": "false",
|
|
203
|
+
"SAP_ALLOWED_TOOLS": "sap_x402_paid_call,sap_profile_current,sap_x402_estimate_cost",
|
|
204
|
+
"SAP_LOG_LEVEL": "info"
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
On Windows, command-backed bridge entries use `npx.cmd`.
|
|
212
|
+
|
|
213
|
+
## 7. x402 Client Addon
|
|
214
|
+
|
|
215
|
+
The GUI can also install the x402 addon bundle under:
|
|
216
|
+
|
|
217
|
+
```txt
|
|
218
|
+
~/.config/mcp-sap/addons/x402-paid-call
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Direct helper command:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
npm exec --yes --package @oobe-protocol-labs/sap-mcp-server -- sap-mcp-x402-paid-call \
|
|
225
|
+
--tool sap_list_all_agents \
|
|
226
|
+
--arguments '{"limit":5}' \
|
|
227
|
+
--max-usd 0.02 \
|
|
228
|
+
--confirm
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Use the helper when your agent runtime can see hosted tools but cannot natively sign and replay x402 challenges.
|
|
232
|
+
|
|
233
|
+
## 8. CLI Fallback
|
|
234
|
+
|
|
235
|
+
The same setup can always be done from terminal:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
npm exec --yes --package @oobe-protocol-labs/sap-mcp-server -- sap-mcp-config wizard
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Show active profile:
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
npm exec --yes --package @oobe-protocol-labs/sap-mcp-server -- sap-mcp-config show
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Install from hosted script:
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
curl -fsSL https://mcp.sap.oobeprotocol.ai/wizard/install.sh | bash
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Read the script before running it when operating in a security-sensitive environment.
|
|
254
|
+
|
|
255
|
+
## 9. Security Rules
|
|
256
|
+
|
|
257
|
+
1. Do not paste keypair bytes into agent chat, MCP config, GitHub issues, or support tickets.
|
|
258
|
+
2. Do not configure hosted MCP with `SAP_WALLET_PATH` or RPC API-key overrides.
|
|
259
|
+
3. Keep the SAP MCP wallet separate from `~/.config/solana/id.json`.
|
|
260
|
+
4. Use the local `sap_payments` bridge only for x402 helper tools.
|
|
261
|
+
5. Restart the agent runtime after the wizard updates client config.
|
|
262
|
+
6. For production wallets, prefer external signer or delegated session mode once available for your runtime.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-compat.d.ts","sourceRoot":"","sources":["../../../src/adapters/mcp/sdk-compat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,MAAM,EACP,MAAM,oCAAoC,CAAC;AAW5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"sdk-compat.d.ts","sourceRoot":"","sources":["../../../src/adapters/mcp/sdk-compat.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListResourceTemplatesRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
16
16
|
import { logger } from '../../core/logger.js';
|
|
17
17
|
import { checkToolPermissions, privateKeyGuard } from '../../security/index.js';
|
|
18
|
+
import { canonicalizeToolName } from '../../tools/tool-aliases.js';
|
|
18
19
|
// Track which handlers have been registered to avoid duplicates
|
|
19
20
|
const handlerRegistry = new WeakMap();
|
|
20
21
|
const executionContexts = new WeakMap();
|
|
@@ -288,6 +289,18 @@ function ensureHandlerRegistry(server) {
|
|
|
288
289
|
}
|
|
289
290
|
return handlerRegistry.get(server);
|
|
290
291
|
}
|
|
292
|
+
/**
|
|
293
|
+
* @name filterVisibleTools
|
|
294
|
+
* @description Applies the configured allow-list to tools/list so bridge-only MCP clients do not see the full tool surface.
|
|
295
|
+
*/
|
|
296
|
+
function filterVisibleTools(server, tools) {
|
|
297
|
+
const context = executionContexts.get(server);
|
|
298
|
+
if (!context || context.config.allowedTools === 'all') {
|
|
299
|
+
return tools;
|
|
300
|
+
}
|
|
301
|
+
const allowed = new Set(context.config.allowedTools);
|
|
302
|
+
return tools.filter((tool) => allowed.has(tool.name));
|
|
303
|
+
}
|
|
291
304
|
/**
|
|
292
305
|
* Tool registration helper
|
|
293
306
|
*
|
|
@@ -313,18 +326,19 @@ export function registerTool(server, name, definition, handler) {
|
|
|
313
326
|
if (!registry.tools) {
|
|
314
327
|
// Register tools/list handler
|
|
315
328
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
316
|
-
const tools = withRegistrationStore(server).tools || [];
|
|
329
|
+
const tools = filterVisibleTools(server, withRegistrationStore(server).tools || []);
|
|
317
330
|
logger.debug('Handling tools/list', { count: tools.length });
|
|
318
331
|
return { tools };
|
|
319
332
|
});
|
|
320
333
|
// Register tools/call handler
|
|
321
334
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
322
335
|
const { name: toolName, arguments: args } = request.params;
|
|
323
|
-
|
|
336
|
+
const canonicalToolName = canonicalizeToolName(toolName);
|
|
337
|
+
logger.debug('Handling tools/call', { tool: toolName, canonicalTool: canonicalToolName, args });
|
|
324
338
|
const handlers = withRegistrationStore(server).toolHandlers || {};
|
|
325
|
-
const handler = handlers[
|
|
339
|
+
const handler = handlers[canonicalToolName];
|
|
326
340
|
if (!handler) {
|
|
327
|
-
logger.error('Tool not found', { tool: toolName });
|
|
341
|
+
logger.error('Tool not found', { tool: toolName, canonicalTool: canonicalToolName });
|
|
328
342
|
throw new Error(`Tool not found: ${toolName}`);
|
|
329
343
|
}
|
|
330
344
|
try {
|
|
@@ -332,35 +346,35 @@ export function registerTool(server, name, definition, handler) {
|
|
|
332
346
|
if (context) {
|
|
333
347
|
const keyGuard = privateKeyGuard(args || {});
|
|
334
348
|
if (!keyGuard.safe) {
|
|
335
|
-
logger.warn('Tool call blocked by private key guard', { tool: toolName, reason: keyGuard.reason });
|
|
349
|
+
logger.warn('Tool call blocked by private key guard', { tool: canonicalToolName, requestedTool: toolName, reason: keyGuard.reason });
|
|
336
350
|
throw new Error(keyGuard.reason || 'Potential private key detected');
|
|
337
351
|
}
|
|
338
|
-
const permission = checkToolPermissions(context,
|
|
352
|
+
const permission = checkToolPermissions(context, canonicalToolName);
|
|
339
353
|
if (!permission.allowed) {
|
|
340
|
-
logger.warn('Tool call blocked by permissions', { tool: toolName, reason: permission.reason });
|
|
341
|
-
throw new Error(permission.reason || `Tool '${
|
|
354
|
+
logger.warn('Tool call blocked by permissions', { tool: canonicalToolName, requestedTool: toolName, reason: permission.reason });
|
|
355
|
+
throw new Error(permission.reason || `Tool '${canonicalToolName}' is not allowed`);
|
|
342
356
|
}
|
|
343
|
-
const policy = await context.policyEngine.checkPermission(
|
|
344
|
-
toolName,
|
|
357
|
+
const policy = await context.policyEngine.checkPermission(canonicalToolName, {
|
|
358
|
+
toolName: canonicalToolName,
|
|
345
359
|
args: isPlainObject(args) ? args : {},
|
|
346
360
|
user: context.signer?.publicKey.toBase58() || context.session?.agentId || 'local-mcp-client',
|
|
347
361
|
});
|
|
348
362
|
if (!policy.allowed) {
|
|
349
|
-
logger.warn('Tool call blocked by policy', { tool: toolName, reason: policy.reason });
|
|
350
|
-
throw new Error(policy.reason || `Tool '${
|
|
363
|
+
logger.warn('Tool call blocked by policy', { tool: canonicalToolName, requestedTool: toolName, reason: policy.reason });
|
|
364
|
+
throw new Error(policy.reason || `Tool '${canonicalToolName}' is blocked by policy`);
|
|
351
365
|
}
|
|
352
366
|
}
|
|
353
367
|
const result = await handler(args || {});
|
|
354
|
-
logger.debug('Tool call completed', { tool: toolName });
|
|
368
|
+
logger.debug('Tool call completed', { tool: canonicalToolName, requestedTool: toolName });
|
|
355
369
|
return toToolCallResult(result);
|
|
356
370
|
}
|
|
357
371
|
catch (error) {
|
|
358
|
-
logger.error('Tool call failed', { tool: toolName, error });
|
|
372
|
+
logger.error('Tool call failed', { tool: canonicalToolName, requestedTool: toolName, error });
|
|
359
373
|
throw error;
|
|
360
374
|
}
|
|
361
375
|
});
|
|
362
376
|
registry.tools = true;
|
|
363
|
-
logger.
|
|
377
|
+
logger.debug('JSON-RPC handlers registered for tools');
|
|
364
378
|
}
|
|
365
379
|
return tool;
|
|
366
380
|
}
|
|
@@ -414,7 +428,7 @@ export function registerResource(server, uri, schema, definition, handler) {
|
|
|
414
428
|
}
|
|
415
429
|
});
|
|
416
430
|
registry.resources = true;
|
|
417
|
-
logger.
|
|
431
|
+
logger.debug('JSON-RPC handlers registered for resources');
|
|
418
432
|
}
|
|
419
433
|
return resource;
|
|
420
434
|
}
|
|
@@ -505,7 +519,7 @@ export function registerResourceTemplate(server, uriTemplate, schema, definition
|
|
|
505
519
|
throw new Error(`Resource not found: ${resourceUri}`);
|
|
506
520
|
});
|
|
507
521
|
registry.resources = true;
|
|
508
|
-
logger.
|
|
522
|
+
logger.debug('JSON-RPC handlers registered for resource templates');
|
|
509
523
|
}
|
|
510
524
|
return template;
|
|
511
525
|
}
|
|
@@ -568,7 +582,7 @@ export function registerPrompt(server, name, schema, definition, handler) {
|
|
|
568
582
|
}
|
|
569
583
|
});
|
|
570
584
|
registry.prompts = true;
|
|
571
|
-
logger.
|
|
585
|
+
logger.debug('JSON-RPC handlers registered for prompts');
|
|
572
586
|
}
|
|
573
587
|
return prompt;
|
|
574
588
|
}
|