MCP, MCP server
Opik Mcp
The official Model Context Protocol (MCP) server for Opik, the open-source LLM observability and evaluation platform, built by Comet. Plug your AI host (Claude Code, Cursor, VS Code Copilot, Codex, opencode, or any
Compatibility: Not stated.
Grade C
One Medium finding. Read the findings before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Rescanned at commit d35976d3c439.
NETWORK_HOST_FROM_INPUT
Why this grade
- NETWORK_HOST_FROM_INPUT Medium
A file takes a URL or endpoint as input and has no fixed host list.
scripts/live_alert.py, line 432
with urllib.request.urlopen(request, timeout=20) as response:
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.
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
Concern
can delete files.
PERMISSION_DELETE_FILES
scripts/build_skills_pack.py, line 256
shutil.rmtree(out_root)
scripts/dev/install_branch.py, line 55
return subprocess.run(
scripts/dev/install_branch.py, line 71
shutil.rmtree(path, ignore_errors=True)
Show more
scripts/dev/install_branch.py, line 141
result = subprocess.run(command, cwd=cwd, capture_output=True, text=True, check=False)
scripts/dev/install_branch.py, line 164
subprocess.run(["claude", "mcp", "get", server], cwd=root, capture_output=True).returncode
scripts/dev/install_branch.py, line 287
result = subprocess.run(
src/opik_mcp/analytics/environment.py, line 271
out = subprocess.run(
src/opik_mcp/analytics/environment.py, line 287
out = subprocess.run(
src/opik_mcp/analytics/process_ancestry.py, line 131
out = subprocess.run(
src/opik_mcp/analytics/process_ancestry.py, line 150
out = subprocess.run(
src/opik_mcp/skills/opik-compare/evals/run_evals.py, line 117
shutil.rmtree(wd)
src/opik_mcp/skills/opik-diagnose/evals/run_evals.py, line 106
shutil.rmtree(wd)
src/opik_mcp/skills/opik-evaluate/evals/run_evals.py, line 115
shutil.rmtree(wd)
src/opik_mcp/skills/opik-explain/evals/run_evals.py, line 116
shutil.rmtree(wd)
src/opik_mcp/skills/opik-instrument/evals/run_evals.py, line 95
shutil.rmtree(wd)
src/opik_mcp/skills/opik-online-eval/evals/run_evals.py, line 112
shutil.rmtree(wd)
Install and update
Note
The docs document an installer that pipes a download into a shell.
INSTALL_DOCUMENTED_INSTALLER
README.md, line 91
curl -LsSf https://astral.sh/uv/install.sh | sh # macOS / Linux
legacy/typescript/MIGRATION.md, line 40
curl -LsSf https://astral.sh/uv/install.sh | sh # macOS / Linux
Network
Serious
accepts a host from input, with no fixed list in this file. can reach a host that is not written as a fixed address.
NETWORK_HOST_FROM_INPUT NETWORK_NO_FIXED_HOST
scripts/live_alert.py, line 432
with urllib.request.urlopen(request, timeout=20) as response:
scripts/live_alert.py, line 509
with urllib.request.urlopen(request, timeout=20) as response:
scripts/seed_e2e_backend.py, line 1107
while rows := fetch():
Show more
scripts/skills_trigger_eval.py, line 103
with urllib.request.urlopen(req, timeout=180) as r:
src/opik_mcp/client/base.py, line 137
resp = await http.request("GET", url, params=params, headers=self._headers())
src/opik_mcp/client/base.py, line 200
resp = await http.request(
src/opik_mcp/client/base.py, line 228
resp = await http.request(method, url, content=content, headers=self._headers())
src/opik_mcp/client/base.py, line 268
return await http.request(method, url, content=content, headers=headers)
src/opik_mcp/skills/opik/references/tracing-rest-api.md, line 23
curl -X GET 'http://localhost:5173/api/v1/private/projects'
src/opik_mcp/skills/opik/references/tracing-rest-api.md, line 30
curl -X GET 'https://www.comet.com/opik/api/v1/private/projects' \
src/opik_mcp/skills/opik/references/tracing-rest-api.md, line 45
curl -X POST 'https://www.comet.com/opik/api/v1/private/traces' \
src/opik_mcp/skills/opik/references/tracing-rest-api.md, line 81
curl -X PATCH 'https://www.comet.com/opik/api/v1/private/traces/550e8400-e29b-41d4-a716-446655440000' \
src/opik_mcp/skills/opik/references/tracing-rest-api.md, line 98
curl -X POST 'https://www.comet.com/opik/api/v1/private/spans' \
src/opik_mcp/skills/opik/references/tracing-rest-api.md, line 137
curl -X POST 'https://www.comet.com/opik/api/v1/private/spans/batch' \
src/opik_mcp/skills/opik/references/tracing-rest-api.md, line 170
curl -X POST 'https://www.comet.com/opik/api/v1/private/traces/feedback-scores' \
src/opik_mcp/skills/opik/references/tracing-rest-api.md, line 204
curl -X GET 'https://www.comet.com/opik/api/v1/private/traces/550e8400-e29b-41d4-a716-446655440000' \
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
scripts/live_alert.py, line 424
token = os.environ.get("GH_TOKEN")
scripts/seed_e2e_backend.py, line 694
return cls(base, workspace, os.environ.get("OPIK_API_KEY") or None)
scripts/skills_trigger_eval.py, line 76
key = os.environ.get("OPENAI_API_KEY")
Show more
src/opik_mcp/skills/opik/references/tracing-typescript.md, line 130
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
src/opik_mcp/skills/opik-instrument/evals/grader.py, line 65
# new files the agent added (e.g. .env, config) also count as instrumentation work
.claude/settings.json, line 35
"Read(./.env)",
.dockerignore, line 18
.env
.gitignore, line 32
.env
.gitignore, line 33
.env.local
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Note
the file cap was reached before every file was read.
OBFUSCATION_FILE_CAP_REACHED
tests/hermetic/fixtures/compare_row.json, line 1
{
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 d35976d3c439. can delete files. accepts a host from input, with no fixed list in this file. can reach a host that is not written as a fixed address. reads a credential or environment file. the file cap was reached before every file was read.
Date and source
Date checked:
github.com
Commit graded: d35976d3c439ab962a75361da25dedabec8858aa
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.