MCP Guide

Use OMG IQ from your AI agent

OMG IQ runs a Model Context Protocol server, so an AI-agent fleet — Claude Code, Cursor, Codex, or anything MCP-compatible — can search, read, create, and move findings — and plan and run the backlog (epics, stories, sprints) — without leaving its context. The agent works the same data your team does, with the same permissions.

What is MCP?

Model Context Protocol is an open standard for connecting AI agents to external tools. Instead of pasting logs into a chat, the agent calls typed tools directly. OMG IQ exposes its quality workflow as MCP tools so an agent can, for example, "find the open Safari checkout regression, read its trace, and re-open it" in one turn.

1-step install

The MCP endpoint is:

https://api.omgiq.com/mcp

First, generate an API key under Account → API keys. Keys are project-scoped by default (least privilege): the agent can only see and act on the one project you pick — it cannot read or touch findings in any other project, enforced on the server. Grant it only the scopes it needs (a read-only key can search and read but never mutate); “entire workspace” is a deliberate, broader choice. Then paste one of the configs below and replace the token.

Claude Code

Add the server with a single command (or drop the JSON into ~/.claude.json). Use --scope user to make it available in every repo on your machine, or --scope project to register it only for the current repo (writes a .mcp.json in that repo — handy when each repo maps to a different workspace):

claude mcp add --scope user --transport http omgiq https://api.omgiq.com/mcp \ --header "Authorization: Bearer omg_live_•••••••••"

The API key already binds to one workspace, so no other header is needed — in particular you do not send X-Org-Slug (that is only for interactive user logins).

Cursor

Add to ~/.cursor/mcp.json (or the project's .cursor/mcp.json):

{ "mcpServers": { "omgiq": { "url": "https://api.omgiq.com/mcp", "headers": { "Authorization": "Bearer omg_live_•••••••••" } } } }

Any MCP client

{ "mcpServers": { "omgiq": { "type": "http", "url": "https://api.omgiq.com/mcp", "headers": { "Authorization": "Bearer omg_live_•••••••••" } } } }
MCP directories can discover the server from its machine-readable manifest at /.well-known/mcp (also at /mcp/manifest) — it lists the server name, description, every tool and how to authenticate.
Which workspace, and which project? The API key is the boundary — and by default it is scoped to a single project, so an agent's reach is exactly one project.
  • Workspace is fixed by the key — each key belongs to one workspace, so the agent never chooses one and no header selects it.
  • Project — with a project-scoped key (the default) the agent is locked to that project: list_projects returns only it, and any search_findings / create_finding / finding lookup for another project is rejected on the server (not found / forbidden). A workspace-scoped key (the broader, opt-in choice) instead lets the agent pick a project per call via list_projects + projectId.
Running Claude across several projects on one machine? Give each repo its own project-scoped key, so the agent in one repo physically cannot see another project's findings:
  • Register one server per repo with --scope project (each repo's .mcp.json carries its own project key), or give each a distinct name — omgiq-acme, omgiq-globex.
  • This holds even for two projects in the same workspace: two project-scoped keys keep them isolated. Only reach for a workspace-scoped key when one agent genuinely needs several projects at once (e.g. a cross-project report).

Tools

ToolWhat it does
list_projectsList the projects in the current organization.
search_findingsList/filter findings in a project by status, paged.
search_findings_textFull-text search findings across the org.
find_similar_findingsSemantic neighbours of a finding (duplicate detection).
get_finding_detailsGet the full details of a finding by id.
get_finding_evidenceList a finding's evidence attachments (metadata).
download_evidenceShort-lived download URL for an attachment's bytes (screenshots, traces, logs).
list_test_runsList recent automated test runs for a project (read).
get_project_analyticsRelease-readiness rollup for a project (read).
create_findingFile a new finding (type, severity, priority, description).
transition_findingMove a finding through its workflow (e.g. triage → in progress → resolved).
upload_evidenceAttach evidence to a finding (returns an upload URL).
complete_evidenceConfirm an evidence upload finished (after PUTting the bytes).
add_commentAdd a comment (or internal note) to a finding.
request_acceptanceMove a finding to ReadyForAcceptance after a fix ships — it walks any legal intermediate statuses itself.
link_prLink a pull request / commit / issue to a finding.
link_finding_commitLink a git commit to a finding by SHA (repository is enough — OMG IQ builds the commit URL), so record_deployment can resolve it.

The write tools (create_finding, transition_finding, upload_evidence, add_comment, request_acceptance, link_pr, link_finding_commit) all run through the same agent governance gate: the per-agent policy (read-only / approval / autonomous), the tool allow-list and the hourly cap are enforced, and every decision is audited.

Plan & backlog tools

OMG IQ isn't only findings. The same MCP server — same key, same governance gate — also exposes the epics & stories layer, so an agent can read your roadmap, author and triage work, move it through the workflow, and wire up the whole structure: modules, cross-module contracts, roadmap decisions and sprints. Each story body is materialized as a BMad .md, so nothing is lost.

ToolWhat it does
list_modules / list_epics / list_storiesRead the module catalog, epics, and stories (filter by epic / state / module / assignee).
get_story_detailsGet a full story — body, state, priority, labels, links, and its comment thread inline (the human context behind the work).
list_story_commentsPull just a story's comments (the discussion thread) for context.
add_story_commentAdd a comment to a story's thread — write context (repro, root cause, decision) back for humans and other agents.
create_epicCreate an epic; its key prefixes the stories under it.
create_storyCreate or upsert a story in one call — module, labels, priority, initial state, and your own external key.
classify_story / prioritize_story / move_stateSet module & labels, set priority & sprint, step it through the workflow.
assign_story / develop_story / publish_storyAssign to a user, start development, publish a ready story.
link_related / reference_documentLink related stories (Blocks / BlockedBy / …) and attach supporting documents.
submit_triage / create_story_from_requestCapture intent in the triage inbox, then convert it into a story.
create_module / set_module_metadata / create_contract / create_decision / create_cycle / create_documentAuthor the project structure: module catalog, cross-module contracts, roadmap decisions, sprints, and documents.
get_story_by_external_keyResolve a story by your own key — for idempotent checks and resuming a migration.

Migrate a whole backlog in one call

import_structure pushes an entire project — modules, epics, stories, their links and documents — in a single governed call instead of hundreds of round-trips. It's idempotent and resumable: modules are upserted by name, epics by key, and stories by your own externalKey, so re-running after an interruption updates in place instead of duplicating. In approval mode the whole import is one approval, replayed once.

import_structure(structureJson = { "projectId": "…", "modules": [{ "name": "Checkout", "phase": "LIVE" }], "epics": [{ "key": "CDP", "title": "Customer Data Platform" }], "stories": [{ "externalKey": "CDP-E1-S1", "epicKey": "CDP", "title": "Lock down CORS", "state": "Done", "priority": "high", "labels": ["security"], "related": [{ "relatedExternalKey": "CDP-E1-S2", "relation": "BlockedBy" }] }] })

Every write here runs through the same agent governance gate as the finding tools — per-key mode, allow-list, hourly cap, and a full audit trail.

Coordination, review & the acceptance gate

When a whole fleet of agents works the backlog at once, they coordinate through OMG IQ rather than colliding: they register by role, atomically claim the next ready item, funnel every change through one serialized merge lane, and stop at the human acceptance gate.

ToolWhat it does
register_worker / heartbeat_worker / deregister_worker / list_workersJoin the fleet under a role, keep a live heartbeat, and see who's active.
claim_nextAtomically claim the next ready item for your role — a story, or a finding with kind: 'finding'. No two agents take the same work.
get_work_queue / set_work_queue_scope / order_queue / list_claimable_findingsRead and shape the shared work queue.
submit_for_merge / list_merge_queue / merge_status / resolve_mergeHand a change to the single serialized merge lane and track it through.
submit_review / record_review_outcome / record_gate_outcomeRecord review and quality-gate results on the work.
request_acceptance / accept_storyMove work to the gate — accept_story (human-only) is what crosses it to Done.
set_acceptance_criteria / mark_acceptance_criterionDefine a story's acceptance criteria and tick them off.
raise_decision_request / answer_decision_request / list_decision_requestsEscalate a call to a human's decisions inbox, and read the answer.
record_deployment / get_last_deployment / link_commitRecord what shipped and wire deployments to the stories and findings in them.
get_roadmap / get_workflow_funnel / get_eventsRead the roadmap, the delivery funnel, and the live coordination event stream.
The gate holds here too. Agents reach Ready for Acceptance / Ready for Retest; only a human calls accept_story or resolves a finding. Every tool runs under the same per-agent governance — mode, allow-list, hourly cap, audit.

Guardrails for agent writes

Giving an agent write access shouldn't mean giving up control. Every agent (API key) acts under an explicit, per-key governance policy rather than ambient trust — directly addressing OWASP "excessive agency". The policy has four independent dials:

Mode

Read-only blocks all mutating tools. Approval (the safe default) queues each write for an admin to approve in the app, then runs it. Autonomous lets writes apply immediately — still inside the key's scopes and allow-list.

Tool allow-list

Restrict a key to a named subset of tools (e.g. let it create_finding and add_comment but never transition_finding). An empty list means "all tools the key's scopes already permit".

Hourly rate cap

An optional per-agent ceiling on write actions per hour bounds the blast radius of a runaway or compromised agent.

Org override & full audit

An org-wide policy can tighten every agent at once, and each gate decision — allowed, queued, denied, or rate-limited — is written to the tamper-evident audit log.

This sits on top of the project-scoped key boundary above: by default a key can only see and act on a single project (see scoping), and the governance policy then bounds what it may do within that project. Defense in depth — the scope limits reach, the policy limits authority.

Ingest from agentic QA tools

Already running an agentic test tool? Post its output straight to OMG IQ and it lands as test runs and findings (failures dedupe into findings automatically). One endpoint, one adapter per source:

POST https://api.omgiq.com/api/v1/ingest/{source}?projectId={id}
SourceAdapterPayload
genericFullOMG IQ normalized JSON: { run, results[], findings[] }.
playwright-mcpFullPlaywright JSON report (suites → specs → tests → results).
momenticDocumented{ run, results[] } — name, status, durationMs, error.
mablDocumented{ metadata, testResults[] } — name, status, failureReason.
qawolfDocumented{ runs[] } — name, status, url, error.

The generic adapter lets any tool integrate today by emitting the normalized shape; the named adapters map a vendor payload onto it. Either way, ingestion reuses the same create paths as the rest of OMG IQ, so de-duplication applies.

How agents read findings

Agents pull findings from OMG IQ the same way a person would in the UI — they search, fetch one, and read the evidence — but they do it through typed MCP tools instead of clicking. Every read is scoped to the agent's project, attributed to the API key, and counted in the audit trail.

Search by text

When the agent has a rough idea of what it's looking for, full-text search ranks across the project's findings — title, description, comments, evidence captions:

# find the Safari checkout regression search_findings_text(query="safari checkout", projectId="…")

Filter by status and severity

For a tighter query, list findings in the project and filter on the fields the UI exposes — status, severity, type, priority, assignee:

# all open high-severity bugs in this project, first page search_findings(projectId="…", status="open", page=1)

Fetch one finding, end-to-end

A finding id (returned from the searches above) is enough to read its body, its evidence attachments (trace, video, screenshot, HAR), the comments, and any duplicate neighbours — a single read pass:

# 1. the finding itself get_finding_details(findingId="…") # 2. its evidence attachments (metadata) get_finding_evidence(findingId="…") # 3. short-lived download URL for the trace download_evidence(evidenceId="…") # 4. similar findings — semantically ranked duplicates find_similar_findings(findingId="…", limit=5) # 5. its full comment thread list_finding_comments(findingId="…")
Project scope, not workspace scope. The agent only ever sees the project its key is bound to — other projects' findings are not found on the server, even if you pass their id. This is enforced on every read, not enforced at the UI.

How agents create findings

When an agent spots a quality signal of its own — a flaky test, a runtime exception, a console error, a code smell — it files a Finding the same way a human QA engineer would. The create path takes a small, stable shape (type, severity, priority, description), and the agent then enriches it with evidence and comments. Every create goes through the same agent governance gate as every other write.

File a finding

# minimal: type + severity + a one-line title create_finding( projectId="…", projectKey="CHK", title="Console error on /checkout when card declined", type="bug", severity="high", priority="p1", description="Expected the 402 path to log a warning; got an unhandled promise rejection.", )

Attach evidence

Evidence uploads bypass the API (no bytes through the server). The agent asks for a short-lived signed URL, PUTs the file straight to storage, then confirms the upload so the attachment moves to Processed with a thumbnail:

# 1. register the attachment — get a short-lived upload URL upload_evidence( findingId="…", fileName="trace.zip", size=482133, contentType="application/zip", kind="trace", ) # 2. PUT the bytes to the returned uploadUrl # 3. confirm so the platform processes the attachment complete_evidence(evidenceId="…")

Discuss and link

Findings are a conversation, not just a record — agents (and humans) thread comments onto them, link the PR that ships the fix, and walk the status forward. Each step is its own typed tool with its own audit entry:

# leave a triage note for humans + sibling agents add_comment(findingId="…", body="Reproduces on Safari 17 only; CI green on Chromium.", internal=false) # link the PR that ships the fix — status moves when it merges link_pr(findingId="…", url="https://github.com/org/repo/pull/4127", kind="PullRequest") # walk it through the workflow transition_finding(findingId="…", status="In Progress") request_acceptance(findingId="…", note="Fix PR #4127 merged — retested.")
Read or write — both are governed. Every tool above runs under the same per-key policy: read-only blocks the writes, approval queues them for a human, autonomous runs them inside the key's allow-list. The tool allow-list can narrow further — let the agent create_finding and add_comment but not transition_finding, for example.

Example tools & use cases

A representative tool from each family, and a concrete scenario where it shines — these are the same calls the reading and creating sections above compose into a full agent loop.

🔍 Example tool — find_similar_findings

Tool family: read / discovery. Given a finding id, returns the closest semantic neighbours (vector similarity over the title + description + comments) — the fastest way to catch a duplicate before an agent files a fresh finding, and the same call a human reviewer uses in the UI's "similar findings" panel.

📌 Example tool — create_finding

Tool family: write / intake. The single intake for every quality signal — bug, regression, observation, risk, incident, question, improvement — typed, severity- ranked, and deduplicated by signature on the server. Run it under approval mode and a human sees every bug an agent wants to file before it lands in the inbox.

🧭 Use case — triaging a CI regression

A regression shows up in nightly Playwright runs. An agent on the team (Claude Code, Cursor, or Codex) reads the new Finding, fetches the trace, checks duplicates with find_similar_findings, comments a root-cause hypothesis, and links the Story it files to drive the fix. The human reviews the triage before the agent writes the code.

� Use case — shipping the fix end-to-end

Once triaged, an agent claims the Finding, opens a Story on the same board, writes the fix in an isolated worktree, runs make verify green, pushes the branch, opens a PR, and hands it to the serialized merge lane via submit_for_merge. The Finding moves to Ready for retest when the PR merges; a human closes it.

Prefer plain HTTP? Every tool above maps to a REST endpoint — see the API Reference for the full list, request shapes, and auth.

OMG IQ — Governed agent fleets for verified software delivery.

Documentation · API Reference · MCP Guide · Playwright · Home

Privacy · Cookie Policy · Terms · Trust & security