Grades are a hygiene check, not a security guarantee.

MCP, MCP server

SAP MCP Server

Solana-native MCP gateway for SAP, DeFi tools, SNS identity, and x402 payments.

Compatibility: Not stated.

Grade D

Two or more Medium findings, or a High finding. Only try it in a sandbox.

Graded by PlugVetRubric v2

Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.

Rescanned at commit 06de6718d0e2, unchanged since the check below.

INSTALL_REMOTE_SCRIPT OBFUSCATION_ENCODED_BLOB

Why this grade

  • INSTALL_REMOTE_SCRIPT High

    Fetches a script from the network and runs it (a pipe to a shell, or an install hook with a URL).

    packages/hosted-gateway/src/server.ts, line 2073 installScriptCommand: 'curl -fsSL https://mcp.sap.oobeprotocol.ai/wizard/install.sh | sh',

  • OBFUSCATION_ENCODED_BLOB Medium

    Contains a long base64 shaped string in a file that should be readable.

    pnpm-lock.yaml, line 1 lockfileVersion: '9.0'

Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.

If you think this grade is wrong, email [email protected] with the entry link and your evidence. We aim to acknowledge within two working days and decide within seven. If we confirm an error, we aim to correct it within 24 hours of confirming it. These are aims, not guarantees.

Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.

What was checked

Plain notes from the hygiene checks.

  • Permissions

    Pass

    No shell or command execution found, and no extra permission was declared.

  • Install and update

    Serious

    install fetches a script from the network. The docs document an installer that pipes a download into a shell.

    INSTALL_REMOTE_SCRIPT INSTALL_DOCUMENTED_INSTALLER

    USER_DOCS/06_DESKTOP_WIZARD_INSTALL_RUNBOOK.md, line 283

    curl -fsSL https://mcp.sap.oobeprotocol.ai/wizard/install.sh | bash

    docs/05_HOSTED_STREAMABLE_HTTP_DEPLOYMENT.md, line 171

    curl -fsSL https://mcp.sap.oobeprotocol.ai/wizard/install.sh | sh

    packages/hosted-gateway/src/server.ts, line 2073

    installScriptCommand: 'curl -fsSL https://mcp.sap.oobeprotocol.ai/wizard/install.sh | sh',

    Show more

    scripts/setup-user.sh, line 6

    # Usage: curl -sSL https://raw.githubusercontent.com/OOBE-PROTOCOL/sap-mcp-server/main/scripts/setup-user.sh | bash

    scripts/setup-user.sh, line 9

    # wget -qO- https://raw.githubusercontent.com/OOBE-PROTOCOL/sap-mcp-server/main/scripts/setup-user.sh | bash

    src/remote/server.test.ts, line 845

    expect(root).toContain('curl -fsSL https://mcp.sap.oobeprotocol.ai/wizard/install.sh | sh');

  • Network

    Concern

    can reach a host that is not written as a fixed address. can reach api.example.com. The description does not name that host.

    NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST

    private-swap.mjs, line 40

    const quoteRes = await fetch(quoteUrl, { method: 'GET', headers: { 'Content-Type': 'application/json' } });

    private-swap.mjs, line 55

    const swapRes = await fetch(`${PAYMENTS_API}/v1/swap/swap`, {

    apps/desktop/main.mjs, line 143

    const response = await fetch(url, {

    Show more

    packages/observability/src/metrics.ts, line 129

    let entry = state.requests.get(endpoint);

    packages/payments/src/facilitator-rpc-fallback.ts, line 335

    const response = await fetch(endpoint.rpcUrl, {

    packages/payments/src/monetization-gate.ts, line 435

    // For non-MCP clients (x402 scanners, curl without Accept header), always

    packages/payments/src/monetization-gate.ts, line 924

    const response = await fetch(buildFacilitatorUrl(this.monetization, path), {

    packages/payments/src/x402-paid-call.ts, line 1266

    const response = await fetch(endpoint, {

  • Secrets

    Concern

    reads a credential or environment file.

    SECRETS_ENV_READ SECRETS_PATH_DOTENV

    apps/desktop/notarize.cjs, line 20

    const appleIdPassword = process.env.APPLE_APP_SPECIFIC_PASSWORD;

    packages/config-runtime/src/env.ts, line 283

    * 3. .env file in project directory

    packages/config-runtime/src/env.ts, line 288

    // Load .env from project root

    Show more

    packages/config-runtime/src/env.ts, line 290

    const envPath = join(projectRoot, '.env');

    packages/config-runtime/src/env.ts, line 296

    // Load .env from user config directory

    packages/config-runtime/src/env.ts, line 297

    const userEnvPath = join(getConfigDir(), '.env');

    packages/config-runtime/src/env.ts, line 615

    const effectiveBentoEnabled = Boolean(bentoEnabled || process.env.SAP_MCP_BENTO_API_KEY);

    packages/config-runtime/src/env.ts, line 673

    apiKey: process.env.SAP_MCP_BENTO_API_KEY || asOptionalString(bentoConfig.apiKey),

    packages/config-runtime/src/mcp-client-injection.ts, line 1299

    existingEnv: preserved.get(SAP_PAYMENT_BRIDGE_SERVER_NAME)?.env,

    packages/config-runtime/src/mcp-client-injection.ts, line 1352

    existingEnv: preserved.get(SAP_PAYMENT_BRIDGE_SERVER_NAME)?.env,

    packages/config-runtime/src/mcp-client-injection.ts, line 1413

    lines.push(`[mcp_servers.${SAP_SERVER_NAME}.env]`);

    packages/hosted-gateway/src/server.ts, line 629

    const secret = process.env.SAP_MCP_AUTH_SECRET?.trim() ?? '';

    packages/hosted-gateway/src/server.ts, line 672

    const keys = parseApiKeys(process.env.SAP_MCP_API_KEYS);

    packages/hosted-gateway/src/server.ts, line 697

    process.env.SAP_MCP_X402_FACILITATOR_PUBLIC_KEY

    packages/payments/src/monetization-gate.ts, line 153

    const explicitTokens = splitCsv(process.env.SAP_MCP_TRUSTED_SPONSOR_TOKENS);

    packages/payments/src/monetization-gate.ts, line 154

    const apiKeyTokens = splitCsv(process.env.SAP_MCP_API_KEYS)

  • Agent instructions

    Pass

    No instruction to ignore earlier instructions or to hide a step.

  • Obfuscation

    Concern

    contains an encoded blob in a file that should be readable.

    OBFUSCATION_ENCODED_BLOB

    pnpm-lock.yaml, line 1

    lockfileVersion: '9.0'

    packages/perps/src/adrena/adrena-idl.ts, line 1

    /**

    packages/tool-plugin-template/package.json, line 1

    {

    Show more

    packages/tools/src/oobe-launchpad/dbc-launch.ts, line 49

    '005a6202000000003c0096000000000000004e0000000000000001010100cb10c7bab88d060000000000000000000a007800881360a4dc00570900000001000006003200325673ca7f190000005e1ac30024237e01000000000

    packages/ui-cards/src/card-templates.ts, line 34

    const SAP_LOGO_URI = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAACxLAAAsSwGlPZapAAAPx0lEQVR4nOVaaVCc931eEMfuvnu+154cAknoAoSExClgWUDc97ILLKdYDgkJ

    packages/ui-cards/src/card-templates.ts, line 37

    const OOBE_LOGO_URI = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAACxLAAAsSwGlPZapAAAPx0lEQVR4nOVaaVCc931eEMfuvnu+154cAknoAoSExClgWUDc97ILLKdYDgk

    packages/ui-cards/src/logos.ts, line 20

    export const SOL_LOGO_URI = `data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNC4wLjAsIFNWRyBFeHBvcnQgU

    packages/ui-cards/src/logos.ts, line 22

    export const USDC_LOGO_URI = `data:image/svg+xml;base64,PHN2ZyBkYXRhLW5hbWU9Ijg2OTc3Njg0LTEyZGItNDg1MC04ZjMwLTIzM2E3YzI2N2QxMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3

    packages/ui-cards/src/logos.ts, line 24

    export const USDT_LOGO_URI = `data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMzkuNDMg

    packages/ui-cards/src/logos.ts, line 26

    export const JUPITER_LOGO_URI = `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAzMyAzMiI+CiAgPGcgY2xpcC1wYXRoPSJ1c

    packages/ui-cards/src/logos.ts, line 28

    export const ORCA_LOGO_URI = `data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNC4wLjAsIFNWRyBFeHBvcnQg

  • Licence

    Pass

    A licence file is present (LICENSE).

  • Maintainer activity

    Pass

    The latest commit is within the last 365 days.

Note

Hygiene check of commit 06de6718d0e2. install fetches a script from the network. The docs document an installer that pipes a download into a shell. can reach a host that is not written as a fixed address. can reach api.example.com. The description does not name that host. reads a credential or environment file. contains an encoded blob in a file that should be readable.

Date and source

Date checked:

View source

github.com

Commit graded: 06de6718d0e2f98547a24885e4b85f3e7bdfd869

This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.

Read how this letter is chosen