Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Opik

PYPI · OPIK-MCP · 2 COMPONENTS

Read and score Opik traces, experiments, datasets and prompts from your AI assistant.

+47 this week 80 Trust /100

Last scanned (23 hours ago)

Scores higher than 82% of PyPI servers

Category Monitoring and Observability

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security94
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Declares code that runs automatically (build-time code we could not rule out (a Hatch, PDM or setuptools build hook, a dynamic version we could not read statically, shipped VCS metadata or a stray root module)) and that we could not recognise. It may be perfectly ordinary, but we have not established what it does. View diagnostics → Partial
  • 0 of 30 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to comet-ml/opik-mcp). View diagnostics → Pass
  • Clear OSI-approved license (Apache-2.0).Pass
  • Actively maintained (last published 7 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability81
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 6412 tokens (~125/item across 51 items; 5 tools + 46 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 5 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 7 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 14 Oct 26 +47
    • Injection markers: unverified → pass ▲ security
    • Malware scan: unverified → pass ▲ security
    • First check of Judged manipulation: pass security
    • Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
    • MCP protocol: unverified → pass ▲ functional
    • Schema quality: unverified → 100 ▲ functional
    • Tool coverage: unverified → 100 ▲ functional
    • First check of Tool coverage: 100 functional
    • First check of Schema quality: good functional
    • First check of Schema quality: fail functional
    • First check of Destructive annotations: pass functional
    • First check of Schema quality: fail functional
  • 13 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
  • 12 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 9 Oct 26 33

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 16 Oct 2026 · Analysed pypi/opik-mcp@3.0.5

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo comet-ml/opik-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/comet-ml/opik-mcp/.github/workflows/release.yaml@refs/heads/main
Rekor log index 3149779537
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:8552dd4f560a18844c6975fd9bca97d1d737728098ea58c0f770faa5d578a1ed

Background: How many MCP packages publish verified provenance →

Install scripts 2 scripts
Hook Tier Command
build_backend allowlisted hatchling.build
build_hook unreviewed tool.hatch.version.source

Background: Why install scripts are a supply-chain risk →

Dependencies 30 packages
Packages resolved 30
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 5 exposed · ~3,966 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
list ~1,249

List Opik entities with optional filters and pagination. Output is a pipe-delimited table with id, name, and a few entity-specific columns, plus a pagination footer when more pages exist. When filters apply, the first line echoes what was applied. Use read() to get full details on any specific item. Project-scoped types require their parent: - trace: project_id or project_name - span: project_id or project_name (searches spans across the project) - thread: project_id or project_name - agent_insights_issue: project_id or project_name (Diagnostics issues, open ones by default; columns: severity, status, total_occurrences, latest_count, last_seen) - score_name: project_id or project_name (the project's feedback score names — trace, span and thread scores together, paged, no id) - online_rule: project_id or project_name (the automation rules scoring this project's traces) - project_metric: project_id or project_name, plus metric_type — one metric over time. Rows are time buckets, so page/size/sort are refused. - dataset_item: dataset_id, or experiment_ids to compare runs case by case. Filter the dataset's own cases on data.<key>, full_data, tags, source, trace_id (no sort); read('dataset_item', id) is one case whole - prompt_version: prompt_id Workspace-wide types (project, experiment, prompt, dataset) accept an optional `name` substring filter. trace, span, thread, experiment and dataset_item accept an OQL `filters` string; all but dataset_item also take a `sort`, and trace, span, thread take a `since`/`until` window and free-text `search`.

NameTypeReqDescription
breakdown––project_metric only: group each bucket by this field, or 'metadata.<key>'. Not valid for every metric — schema('list.project_metric') says which.
dataset_id––Required when listing dataset_items, unless experiment_ids is given. UUID of the dataset.
entity_typestringyesOne of: agent_insights_issue, dataset, dataset_item, experiment, online_rule, project, project_metric, prompt, prompt_version, score_name, span, thread, trace.
experiment_ids––dataset_item: compare these experiments case by case — which cases regressed, not two averages. First id is the baseline; up to 10. Resolves the dataset itself; sort and search apply to the runs, and…
fields––Return only these columns, uncut: any name from the page's 'fields:' line ('data.question', 'feedback_scores.helpfulness', 'usage.total_tokens'). Each row keeps the id that opens the next level. An u…
filters––OQL filter for trace, span, thread, experiment, dataset_item, project_metric: <field>[.<key>] <op> <value> [AND ...]; ops = != > >= < <= contains not_contains starts_with ends_with is_empty is_not_em…
interval––project_metric only: bucket width. Omitted, it follows the window the way the Metrics tab does: hourly up to 3 days, daily up to 30, weekly beyond.
metric_type––project_metric only: which metric to chart. Reference: schema('list.project_metric').
name––Optional substring filter on entity name. Supported for project, experiment, prompt, dataset; ignored for sub-collections.
pageinteger–Page number (1-indexed).
project_id––Parent project UUID for project-scoped lists (trace, span, thread, agent_insights_issue). Pass this OR project_name.
project_name––Parent project name — alternative to project_id for project-scoped lists; no UUID lookup needed.
prompt_id––Required when listing prompt_versions. UUID of the prompt.
search––Free text for trace, span, thread: matches anywhere in id, name, input, output, metadata, tags, thread_id (spans: model, provider too). Expensive on large projects; narrow with since first.
series––project_metric only, with breakdown: which series to group — a percentile (p50/p90/p99), a score name, or a usage key.
since––Start of the time window for trace, span, thread, project_metric, agent_insights_issue: a relative span ('30m', '1h', '24h', '7d') or an ISO-8601 instant with timezone. Trace/span/thread windows are…
sizeinteger–Items per page. Capped at 100.
sort––Sort for trace, span, thread, experiment: '<field> [asc|desc]', desc by default. E.g. 'duration desc', 'total_estimated_cost', 'feedback_scores.accuracy asc', 'usage.total_tokens'. One field only.
status––agent_insights_issue only: which Diagnostics issues to list. Defaults to 'open' (what is broken now); 'resolved' and 'closed' show issues already dealt with. Ignored for other entity types.
until––End of the time window, same forms as since.

No output schema declared.

No examples provided.

read ~1,020

Read any Opik entity by ID, name, or opik:// URI. A UUID `id` costs one API call. A name also works for project, experiment, prompt and dataset: two calls, and a name several records share returns them as candidates to retry by id. Special shapes: - project: returns {project, summary, vocabulary, contains, url} — the week's figures against the 7 days before (SDK traffic only, as the Logs cards show, though the UI opens on 30 days), the score names and usage keys to filter on, and the freshest experiment / dataset / prompt version / run. `since`/`until` move the summary's window; the rest is current. - trace: returns {trace, spans, spansTruncated} with up to 200 spans inlined, their bodies slim, and spanBodies saying what the cut took. - prompt: returns {prompt, versions, versionsTruncated} with up to 100 versions. - thread: returns {thread, messages, messagesTruncated, messageBodies} — each message is one turn's trace input/output + a trace_id to read('trace', id). Bodies are slim, the thread's own first/last message included, since those are copies of the first and last turn. Needs project scope: pass a thread link/URI, or project_id/project_name. - An inlined collection longer than what fits sets its …Truncated flag and adds moreSpans / moreMessages / moreVersions: the count, and the exact list(...) call that continues from where the inlined part stopped. - agent_insights_issue: returns {issue, example_trace_ids, details, url, trace_url_template} — the Diagnostics issue with cause and suggested fix, the deduped ids of traces that exhibit it (open one with read('trace', id)), the per-day breakdown, the issue's Diagnostics page link, and a template for linking any example trace (both links omitted when the Opik URL or the session's workspace is unknown). Needs project scope like thread. - All others: the flat record from /v1/private/{entity}/{id}. Output is a one-line `[read: …]` header (entity_type, id, size in tokens) followed b…

NameTypeReqDescription
entity_typestringyesOne of: agent_insights_issue, dataset, dataset_item, experiment, project, prompt, span, thread, trace.
fields––Return only these paths of the record, uncut: dotted into nested objects ('trace.output'), arrays whole ('spans'). The record's id is always kept; an unknown path is refused with the valid ones. The…
idstringyesUUID, entity name (for nameable types), full opik:// URI (e.g. opik://traces/<uuid>), or a pasted Opik link — a thread link or a Diagnostics page link (…/projects/<pid>/diagnostics?issue=<id>). When…
project_id––Project UUID. Required for entity_type='thread' and 'agent_insights_issue' unless the id is a full Opik URL/URI (which carries the project). Ignored for globally-unique entities like trace/span.
project_name––Project name — alternative to project_id for project-scoped reads (thread, agent_insights_issue).
since––Start of the window, as a relative span ('7d', '24h') or an ISO-8601 instant with timezone. On read: project (the summary's period, 7d by default) and agent_insights_issue (per-day details, truncated…
until––End of the window, same forms as since.

No output schema declared.

No examples provided.

read_skill ~576

Load one Opik agent skill — the same skills Opik publishes for coding agents. Use it when the skill you need is not already in your context. WHEN TO CALL: before instrumenting, evaluating, or debugging with Opik, when the relevant skill below is NOT already loaded — no local copy in the project, and nothing fetched earlier this session. If you already have it, read what you have instead of fetching it again. Match the user's task to a skill: - opik: "why aren't my traces showing up", "how do I add metadata to a span", "how do I version a prompt" — any SDK lookup. To instrument, use opik-instrument. - opik-compare: "did my fix work", "compare against the baseline", "run the regression suite", "why did quality drop", "which cases regressed", "compare these two experiments". - opik-diagnose: "what is broken in production", "which traces need attention", "find failing or slow traces", "triage my agent". - opik-evaluate: "evaluate my agent", "measure quality", "build an eval", "write an LLM judge", "how good is my RAG" — a first experiment with scores. - opik-explain: "why did this trace fail", "explain this trace", "debug this trace", "why is my agent slow or wrong". - opik-instrument: "instrument my code", "add opik tracing", "add observability", "trace my agent". - opik-online-eval: "score production traces", "monitor hallucinations in prod", "take this judge live", "set up an online evaluation rule". - opik-optimize: "optimize this prompt", "improve my system prompt", "tune the prompt against my dataset", "run the prompt optimizer". - opik-test: "turn this into a test", "add a regression case for this trace", "make sure this doesn't happen again", "capture this failure". - opik-verify: "is this safe to ship", "can I merge this", "go/no-go on this change", "gate this release" — a ship/hold verdict against a release policy. `skill_name` accepts any of these forms: - `opik` — the skill itself - `<skill>/references/<file>.md` — one document inside a skill; a SKILL.md…

NameTypeReqDescription
skill_namestringyesA skill name ('opik-instrument'), a path inside a skill ('opik/references/tracing-python.md'), or a resource URI ('opik://skills/opik/SKILL.md'). A SKILL.md ends with the list of its references.

No output schema declared.

No examples provided.

schema ~118

Return the JSON Schema, OAuth scope, and one validated example for a write operation's `data` payload, or — for `list.trace` / `list.span` / `list.thread` / `list.experiment` — the list tool's filterable fields with their operators and its sortable fields. Pure lookup — no backend call.

NameTypeReqDescription
operationstringyesWrite operation whose schema to return, or list.<entity> (list.trace, list.span, list.thread, list.experiment) for the filter and sort reference of the list tool.

No output schema declared.

No examples provided.

write ~1,003

Create, update, or annotate Opik entities. The `operation` field selects which entity/verb pair to invoke; `data` carries the payload for that operation (single object, or array up to 1000 for batch). Operations: - trace.create: Log a single trace (or a batch). Sets up the parent for spans/scores/comments. (batch ok) - trace.update: Finalize or amend an existing trace by id. (batch ok) - span.create: Log a single span on an existing trace (or a batch).; required: trace_id (batch ok) - score.create: Attach a numeric feedback score to a trace, span, or thread.; required: target, target_id (batch ok) - comment.create: Attach a free-text comment to a trace, span, or thread.; required: target, target_id - prompt_version.save: Save a new prompt version. Creates the prompt by name if missing; BE auto-assigns the commit when omitted. - dataset.create: Create a dataset. Pass type='test_suite' for an evaluation suite (items carry assertions and run as tests); default is a plain dataset. - dataset_item.upsert: Upsert items into a dataset or test suite; data is the envelope {dataset_name|dataset_id, items: [...]}.; required: dataset_name, dataset_id - experiment.create: Create an experiment scoped to a dataset or test suite.; required: dataset_name, dataset_id - experiment_item.create: Attach trace + dataset_item rows to an experiment. Always the array envelope.; required: experiment_id, dataset_item_id, trace_id (batch ok) - thread.close: Close a thread (mark it inactive/done). Pass thread_id + project (project_name or project_id). - thread.open: Reopen a previously closed thread (mark it active). Pass thread_id + project (project_name or project_id). - agent_insights_issue.resolve: Mark a Diagnostics (Agent Insights) issue resolved — the failure it groups has been dealt with. It leaves the default issue list and shows under status='resolved'. Pass issue_id + project_id or project_name. Do this only when the user asks: whether a failure is fixed is their call, not an inferen…

NameTypeReqDescription
data–yesPayload for the operation. Object for a single write, or array (max 1000 elements) for batch. Always-envelope operations (dataset_item.upsert, experiment_item.create) take their list inside the envel…
dry_runboolean–Validate against the operation's schema and OAuth scope without calling the backend. Returns {dry_run: true, would_call: ...}.
idempotency_key––Optional client-supplied UUID. Re-running with the same key is a no-op on the backend. Takes precedence over data.id when both are set.
operationstringyesThe entity/verb pair to invoke. See tool description for the list. Call schema(operation) for the JSON Schema, example, and required scope.

No output schema declared.

No examples provided.

Install

How do I install the Opik MCP server?

Opik runs locally as a PyPI package, launched with uvx opik-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · opik-mcp

# add to Claude Code
claude mcp add comet-ml-opik-mcp -- uvx opik-mcp
Common questions

What is the Opik MCP server?

Opik is an MCP server listed in the public MCP registry as io.github.comet-ml/opik-mcp. Read and score Opik traces, experiments, datasets and prompts from your AI assistant. This page covers its PyPI package (opik-mcp).

Is the Opik MCP server safe to use?

Opik scores 80 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 16 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Opik MCP server expose?

Opik exposes 5 tools: read, list, write, schema, read_skill. Their descriptions and schemas cost roughly 3,966 tokens of context every time the server is loaded.

Is the Opik MCP server still maintained?

Opik is still listed as active in the MCP registry. We last reached this channel on 16 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Opik MCP server under?

Opik declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.