Atlas / MCP servers / wandb / W&B

W&BBLOCK

mcp/wandb/w-b

The official implementation of the W&B Models and Weave MCP server.

Verdict
BLOCK
Grade
D
Trust score
62 /100
Exposed tools
21 17r · 4w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
70
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Query and analyze your Weights & Biases data using natural language through the Model Context Protocol.

[](https://github.com/wandb/wandb-mcp-server/actions/workflows/ci.yml)

[](https://wandb.ai/wandb/mcp-server-ci/weave) [](https://wandb.ai/wandb/mcp-server-ci/weave)

What's new in 0.4

  • Structured experiment queries and legacy GraphQL inputs work through the same

query_wandb_tool interface.

  • Targeted summary/config reads and sparse multi-key history make it easier
Read from source at commit d75006fc7a58OBSERVED · 2026-10-07
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add wandb_mcp_server --env DD_API_KEY=${DD_API_KEY} --env MCP_AUTH_DISABLED=${MCP_AUTH_DISABLED} --env MCP_SERVER_SECRETS_PROJECT=${MCP_SERVER_SECRETS_PROJECT} --env MCP_SERVER_SECRETS_PROVIDER=${MCP_SERVER_SECRETS_PROVIDER} -- uvx wandb_mcp_server
claude-desktop
{
  "mcpServers": {
    "wandb_mcp_server": {
      "command": "uvx",
      "args": [
        "wandb_mcp_server"
      ],
      "env": {
        "DD_API_KEY": "${DD_API_KEY}",
        "MCP_AUTH_DISABLED": "${MCP_AUTH_DISABLED}",
        "MCP_SERVER_SECRETS_PROJECT": "${MCP_SERVER_SECRETS_PROJECT}",
        "MCP_SERVER_SECRETS_PROVIDER": "${MCP_SERVER_SECRETS_PROVIDER}"
      }
    }
  }
}
03

Exposed tools (21)

17 read · 4 write · 0 destructive.

ToolRiskDescription
create_wandb_report_toolwritetime.sleep(0.05)
exception_toolreadraise ValueError(
failing_toolreadraise ValueError(
healthy_toolreadreturn
legacyreadreturn payload
list_entities_toolwritestarted.set()
local_async_toolreadreturn await run_sync_in_current_tool(lambda: observed_threads.append(threading.get_ident()) or
local_sync_toolwriteobserved_threads.append(threading.get_ident())
log_analysis_to_wandbreaderror = RuntimeError(
nested_helper_toolreadwith track_tool_execution(
query_public_toolreadwith track_tool_execution(
query_wandb_toolreadbackend()
query_weave_traces_toolreaddef blocking_sdk_call() -> str:
readreadreturn {
read_toolreadrequest = httpx.Request(
slow_async_toolreadawait asyncio.sleep(1)
slow_local_toolreadawait asyncio.sleep(1)
slow_toolreadawait asyncio.sleep(0.05)
structured_error_toolreadreturn json.dumps(
sync_toolwritereturn threading.current_thread().name
untrusted_error_toolreadreturn json.dumps({
04

Trust audit

BLOCKgrade D · trust 62/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (9 observation(s))
Shell
none-observed
Dependencies
pinned
Secrets in source
found

Findings (25)

HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
scripts/agent_lens_smoke.py:221
print("No W&B API key found in WANDB_API_KEY, .netrc, or .env.", file=sys.stderr)
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/wandb_mcp_server/server.py:474
"4. .netrc file: machine api.wandb.ai login user password YOUR_KEY\n"
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/wandb_mcp_server/utils.py:420
nrc = netrc.netrc(netrc_path)
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/wandb_mcp_server/utils.py:429
for filepath in ("~/.netrc", "~/_netrc"):
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/wandb_mcp_server/utils.py:468
"W&B API key was not found through command-line arguments, .netrc, or WANDB_API_KEY environment variable. "
Why it matters. touches a credential store
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/wandb_mcp_server/server.py:1627
logger.info(f"API Key configured: {'Yes' if api_key else 'No'}")
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/mcp_stdio_smoke.py:180
"HTTP_PROXY": "http://127.0.0.1:9",
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/mcp_stdio_smoke.py:181
"HTTPS_PROXY": "http://127.0.0.1:9",
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/mcp_stdio_smoke.py:182
"ALL_PROXY": "http://127.0.0.1:9",
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/mcp_stdio_smoke.py:184
"http_proxy": "http://127.0.0.1:9",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_aria.py:1236
api_key = "explicit-super-secret-token"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_aria.py:1455
api_key = "explicit-super-secret-token"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_aria.py:1482
api_key = "boundary-super-secret-token"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_aria_registration.py:171
secret = "oversized-error-secret-token"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_error_sanitizer.py:26
SECRET = "test-secret-api-key-123456"
LOWInventory / provenance · inv.hidden_file · CWE-1104
.pre-commit-config.yaml
.pre-commit-config.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
tests/test_error_sanitizer.py:144
restored = pickle.loads(pickle.dumps(record))
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
CONTRIBUTING.md:63
curl --fail http://127.0.0.1:8080/health
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
README.md:12
<a href="https://cursor.com/en/install-mcp?name=wandb&config=eyJ0cmFuc3BvcnQiOiJodHRwIiwidXJsIjoiaHR0cHM6Ly9tY3Aud2l0aHdhbmRiLmNvbS9tY3AiLCJoZWFkZXJzIjp7IkF1dGhvcml6YXRpb24iOiJCZWFyZXIge3tXQU5EQl9BUEl
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/wandb_mcp_server/mcp_tools/query_wandb.py:239
raw = base64.b64decode((encoded + padding).encode("ascii"), altchars=b"-_", validate=True)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/wandb_mcp_server/session_manager.py:182
decoded = base64.b64decode(value + ("=" * (-len(value) % 4)), altchars=b"-_", validate=True)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/wandb_mcp_server/tokenizer.py:35
ranks[base64.b64decode(token, validate=True)] = int(rank)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/wandb_mcp_server/wandb_selective_reads.py:627
raw = base64.b64decode((encoded + padding).encode("ascii"), altchars=b"-_", validate=True)
LOWSupply chain · prompt.pipe_to_shell · CWE-829, CWE-1357
README.md:442
curl -LsSf https://astral.sh/uv/install.sh | sh
INFOInventory / provenance · inv.oversize · CWE-1104
src/wandb_mcp_server/data/cl100k_base.tiktoken
src/wandb_mcp_server/data/cl100k_base.tiktoken
Why it matters. 1681126 bytes not read

Gates applied: no_behavioural_pass.

Audited 2026-10-07 · audit v0.4.1 · source sha d75006fc7a58full audit observations/trust-audit/mcp-server/wandb__w-b.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-07d75006fc7a58BLOCKD62first audit
06

Questions

What is the W&B MCP server?

The official implementation of the W&B Models and Weave MCP server.

What tools does W&B expose?

21 in total: 17 read-only, 4 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is W&B safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (62/100) and found 5 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does W&B need?

It reads DD_API_KEY, MCP_AUTH_DISABLED, MCP_SERVER_SECRETS_PROJECT, MCP_SERVER_SECRETS_PROVIDER and WANDB_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does W&B run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on PyPI as wandb_mcp_server.

How current is this page?

The grade is for one exact copy of the source (d75006fc7a58), read on 2026-10-07. The repository is watched and re-audited when it changes.

Advertisement