Certyn runs a remote MCP server over Streamable HTTP. It exposes 56 tools that read and write the same projects, test cases, runs, and issues you see in the app.
Endpoint
https://api.certyn.io/api/mcp
Manifest:
https://certyn.io/server.json
Auth model
- Transport:
streamable-http - Authentication: a user bearer token via Auth0/OIDC, or an API key in the
X-API-Keyheader. A key is scope-limited, so pick the scopes deliberately: see choosing scopes. - Prompts: supported. Five are advertised —
setup_project,write_test_cases,run_gate,triage_failure,release_readiness. - Unsupported: demo tokens, resources
For the pre-registered Claude, ChatGPT, and Cursor OAuth Client IDs and setup values, see Connect via MCP. The clients are public PKCE clients and do not use a client secret.
Common arguments
Most tools accept the same selectors:
projectIdOrSlug: project ID or slug, resolved by Certyn server-sideenvironmentKey: environment key such asstagingorproduction. Calllist_environmentsfor a project's keys.testCaseId: Certyn test case IDticketId: Certyn ticket ID, external issue ID, or project ticket numberexecutionId: Certyn execution ID, returned by every run tool
Response conventions
So a response shape can be predicted rather than discovered:
- Collections are named after the entity.
list_ticketsreturnstickets,list_test_casesreturnstestCases,list_environmentsreturnsenvironments. Listing and searching agree, sosearch_issuesalso returnstickets. The exception is a weekly plan, whose contents areitemsbecause "plan items" is what they are. - Paging is
pageandpageSize, 1-based, defaulting to 50 and capped at 100. Tools that return an explicit top-N takelimitinstead, anddaysBackis a time filter rather than paging. Paged responses carrytotalCountandhasNextPage, so a truncated answer is distinguishable from a complete one. - A detail tool returns everything its list tool returned, plus more.
get_execution_detailcarries theenvironmentKeyanddurationSecondsthatlist_executionsshows, so drilling into a row never loses context.
All tools
Read tools carry the MCP read-only annotation, so a client can show you which calls are safe before it makes them.
| Tool | Mode | What it does |
|---|---|---|
whoami | read | Which workspace this connection is bound to, and what the server can do |
list_projects | read | Projects visible to the current tenant |
create_project | write | Create a project and point its default environment at a base URL |
list_environments | read | Environments across the tenant, or one project's |
create_environment | write | Add an environment to a project |
update_environment | write | Change an environment's base URL, version, or changelog |
list_env_vars | read | A project environment's variables, secrets masked |
add_env_var | write | Add a variable to a project environment |
update_env_var | write | Change an existing variable's value or description |
delete_env_var | write | Remove a variable from an environment |
get_project_wiki | read | Project wiki and agent memory sections |
update_wiki | write | Replace one or more wiki sections |
list_test_cases | read | Paged test cases, filterable by tag and quarantine |
get_test_case | read | One test case in full |
search_test_cases | read | Semantic search over test cases |
create_test_case | write | Create one test case |
create_test_cases_batch | write | Create up to 50 test cases in one call |
update_test_case | write | Update a test case, omitted fields unchanged |
delete_test_case | write | Delete one test case |
list_tickets | read | Paged issues, filterable by type, severity, status |
get_ticket | read | One issue in full |
search_issues | read | Semantic search over issues |
search | read | One search across issues, test cases, runs, memories, and the wiki |
create_ticket | write | File an issue against an environment |
update_ticket | write | Update an issue's content |
retest_ticket | write | Re-run the agent against an agent-found issue |
list_processes | read | A project's processes and each one's latest run |
create_process | write | Create a process that selects test cases by tag |
get_process | read | One process and the test cases it currently resolves to |
run_process | write | Start a process run |
run_quick_test | write | Start an ad-hoc exploratory test |
run_test_case | write | Run one saved test case |
wait_for_execution | read | Block until one execution finishes, then return it |
wait_for_process_run | read | Block until a process run finishes, then return it |
get_ci_setup | read | Generate ready-to-commit CI configuration for this project |
create_ci_api_key | write | Mint a CI-scoped API key (signed-in connections only) |
list_ci_runs | read | Recent CI runs, including uploaded reports |
get_ci_run | read | One CI run: state, conclusion, pass/fail counts |
get_process_run_status | read | Run progress, pass/fail counts, per-item outcomes |
list_executions | read | Recent executions and their status |
get_execution_detail | read | One execution: outcome, summary, artifacts, links |
get_execution_transcript | read | The agent's messages, tool calls, and tool results |
get_debug_execution | read | Console errors and failed network requests |
get_image_by_tool_id | read | One screenshot from an execution, on demand |
get_recent_failures | read | Recent failures with reasons and flaky classification |
get_project_stats | read | Quality snapshot: counts, pass rates, activity |
ask_certyn | read | Open-ended question answered from the project's data |
get_weekly_plan | read | The current weekly QA plan for an environment |
propose_weekly_plan | write | Propose a weekly QA plan |
update_weekly_plan | write | Revise a proposed or approved plan |
approve_weekly_plan | write | Approve a plan so its items self-execute |
list_test_sources | read | Browse TestRail, Zephyr, Xray, or Azure projects and suites |
create_external_suite | write | Turn an external suite into a runnable Certyn process |
list_conversations | read | Recent Ask Certyn conversations |
get_conversation | read | Full message history for one conversation |
get_coding_task_context | read | Issue, reproduction, and evidence for a coding task |
Projects, environments, and context
list_projects
Lists projects visible to the current tenant user. No arguments.
Returns the same overview payload the app uses, including project IDs, slugs, default environment hints, onboarding status, and counts.
list_environments
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | no | When omitted, returns environments across all tenant projects |
page | integer | no | 1-based, defaults to 1 |
pageSize | integer | no | Defaults to 50, capped at 100 |
Returns totalCount and hasNextPage alongside environments, so you can tell a complete answer
from a truncated one.
list_env_vars
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
environmentKey | string | yes |
Secret values are masked: only the name is returned. Non-secret values are returned in full.
add_env_var
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
environmentKey | string | yes | |
name | string | yes | |
value | string | yes | |
description | string | no | |
isSecret | boolean | no | Defaults to true. Sensitive-looking names are always treated as secret. |
Fails if a variable with the same name already exists in that environment.
get_project_wiki
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes |
Returns overview, business logic, rules, common memory, Explorer memory, and lastEditedAt.
update_wiki
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
overviewMarkdown | string | no | Complete replacement for the section |
businessLogicMarkdown | string | no | |
rulesMarkdown | string | no | |
commonMemoryMarkdown | string | no | |
explorerMemoryMarkdown | string | no | |
expectedLastEditedAt | datetime | no | Optimistic lock, from get_project_wiki.lastEditedAt |
Each supplied section is replaced whole. Omitted sections are left unchanged.
Test cases
list_test_cases
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
tag | string | no | |
isQuarantined | boolean | no | |
page | integer | no | 1-based, defaults to 1 |
pageSize | integer | no | Defaults to 50, capped at 100 |
get_test_case
| Argument | Type | Required |
|---|---|---|
projectIdOrSlug | string | yes |
testCaseId | string | yes |
search_test_cases
Semantic (vector) search by meaning, ranked by relevance, with a text-match fallback.
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
query | string | no | Omit to list recent test cases |
tag | string | no | |
isQuarantined | boolean | no |
create_test_case
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
name | string | yes | Test case title |
instructions | string | yes | Step-by-step instructions |
description | string | no | |
tags | string[] | no | |
coverageKey | string | no | Reusable coverage key |
{
"projectIdOrSlug": "acme-web",
"name": "Checkout accepts valid cart",
"instructions": "1. Add an item.\n2. Place the order.\nExpected: confirmation appears.",
"description": "Smoke coverage for checkout.",
"tags": ["checkout", "smoke"],
"coverageKey": "checkout:valid-cart"
}
create_test_cases_batch
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
testCases | object[] | yes | Maximum 50 per call. Same shape as create_test_case without the project. |
update_test_case
| Argument | Type | Required |
|---|---|---|
projectIdOrSlug | string | yes |
testCaseId | string | yes |
name | string | no |
description | string | no |
instructions | string | no |
tags | string[] | no |
needsReview | boolean | no |
isQuarantined | boolean | no |
isObsolete | boolean | no |
reviewReason | string | no |
supersededByTestCaseId | string | no |
coverageKey | string | no |
Updates only the fields supplied.
Issues
list_tickets
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
type | string | no | bug, improvement, task, or vulnerability |
severity | string | no | critical, major, minor, or trivial |
status | string | no | in_review, shadow, or closed |
agentId | string | no | Agent template ID |
environmentKey | string | no | |
environmentVersion | string | no | |
page | integer | no | 1-based, defaults to 1 |
pageSize | integer | no | Defaults to 50, capped at 100 |
get_ticket
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
ticketId | string | yes | Internal ID, external issue ID, or project ticket number |
Returns status, severity, attachments, linked test case, latest run state, and external tracker metadata.
search_issues
Semantic search over a project's issues, with a text-match fallback.
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
query | string | no | Omit to list recent issues |
status | string | no | in_review, shadow, or closed |
type | string | no | |
severity | string | no |
search
Searches everything recorded for a project in one call: issues, test cases, past runs, learned
memories, and the wiki. Each kind is matched both literally and semantically, and exact matches rank
above semantic ones — so a friendly id like PROJ-142 or an exact title returns that record first.
Prefer search_issues or search_test_cases when you want one kind and need its filters.
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
query | string | yes | Natural language, an exact phrase, or an id like PROJ-142 |
types | string | no | Comma-separated: issue, test_case, execution, memory, wiki. Defaults to all |
limit | number | no | 1–50, defaults to 20 |
Each hit carries type, id, title, excerpt, score, and exact, plus number, status, and
severity for the kinds that have them.
create_ticket
Files a native Certyn issue. It does not create a remote Linear, Jira, or GitHub issue.
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
title | string | yes | |
environmentKey | string | yes | The issue appears on that environment's Issues page |
description | string | no | |
type | string | no | Defaults to bug |
severity | string | no | Defaults to minor |
labels | string[] | no |
update_ticket
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
ticketId | string | yes | |
title | string | no | |
description | string | no | |
type | string | no | |
severity | string | no | |
labels | string[] | no | Replacement set. Omit to leave labels unchanged. |
retest_ticket
Re-runs the agent against a shadow (agent-found) issue to confirm whether it still reproduces.
| Argument | Type | Required |
|---|---|---|
projectIdOrSlug | string | yes |
ticketId | string | yes |
Returns the new executionId. Poll it with get_execution_detail.
Starting a run
list_processes
Lists a project's processes (test suites, agent explorations, and external-suite processes) with each one's latest run status. Use it to discover what run_process can execute.
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
includeInactive | boolean | no | Defaults to false |
limit | integer | no | Defaults to 20, capped at 50 |
run_process
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
process | string | yes | Name, slug, or ID from list_processes |
environmentKey | string | no | Defaults to the project's default environment |
Returns a processRunId. Poll it with get_process_run_status.
run_quick_test
Starts an ad-hoc exploratory test from a natural-language description.
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
description | string | yes | What to test |
environmentKey | string | no | Defaults to the project's default environment |
Returns an executionId. Poll it with get_execution_detail.
run_test_case
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
testCaseId | string | yes | Runs against the project's default environment |
Returns an executionId.
Results and evidence
get_process_run_status
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
processRunId | string | no | A specific run |
processName | string | no | Find a process's latest run by partial name match |
Give one of processRunId or processName, or neither to list recent runs.
list_executions
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
status | string | no | queued, running, completed, failed, aborted |
outcome | string | no | passed, failed, blocked |
daysBack | integer | no | Defaults to 30, capped at 90 |
limit | integer | no | Defaults to 20, capped at 50 |
get_execution_detail
| Argument | Type | Required |
|---|---|---|
projectIdOrSlug | string | yes |
executionId | string | yes |
Returns status, outcome, summary, artifacts, notes, and linked issues.
get_execution_transcript
The agent's messages, tool calls, and tool results, in order, so you can see exactly what it did and why.
| Argument | Type | Required | Notes |
|---|---|---|---|
executionId | string | yes | |
page | integer | no | Page 1 is the most recent page; raise it for earlier events |
pageSize | integer | no | Defaults to 30, capped at 200 |
Events are oldest-first within a page. Screenshot bytes are stored separately: fetch one with get_image_by_tool_id rather than pulling every image into the transcript.
get_debug_execution
Browser-side signal captured during a run: JavaScript console events and failed network requests. Use this to work out why an execution failed. For summary, artifacts and linked issues use get_execution_detail instead.
| Argument | Type | Required | Notes |
|---|---|---|---|
executionId | string | yes | |
limit | integer | no | Per category, defaults to 50, capped at 200 |
get_image_by_tool_id
| Argument | Type | Required | Notes |
|---|---|---|---|
executionId | string | yes | |
toolCallId | string | yes | From a tool_result event in get_execution_transcript |
Returns the image itself, so you can view one screenshot on demand.
Analysis
get_recent_failures
Triages recent failures in one call: failed executions in a window, each with its reason, any linked issues, and a flaky-versus-new classification.
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
daysBack | integer | no | Defaults to 7, capped at 90 |
limit | integer | no | Defaults to 20, capped at 50 |
includeBlocked | boolean | no | Also include blocked outcomes. Defaults to false. |
get_project_stats
| Argument | Type | Required |
|---|---|---|
projectIdOrSlug | string | yes |
Test case counts, issue counts, pass rates, and recent session activity.
ask_certyn
Asks an open-ended question and returns a synthesized answer. Reach for it when no other tool answers the question directly: it pulls together the project's test cases, issues, failures, coverage, wiki, and run history to explain why something is happening or what the overall state is, rather than returning rows.
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | Provides the context the answer reasons over |
question | string | yes | |
context | string | no | Extra context, such as a failing URL, a hypothesis, or a ticket ID |
Weekly QA plan
get_weekly_plan
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
environmentKey | string | no | Required unless planId is given |
planId | string | no | When given, environmentKey is ignored |
Returns each item's status and any linked runs.
propose_weekly_plan
Proposes a week of QA work for one environment. Gather evidence first with get_weekly_plan, get_recent_failures, and list_tickets. Proposing supersedes any open plan whose week overlaps.
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
environmentKey | string | yes | |
notCoveringMarkdown | string | yes | What is explicitly not covered this week, and why |
items | object[] | yes | Each item has a kind (process, exploratory, or retest), an area, a why-now rationale, and a scheduled time inside the week |
introMarkdown | string | no | Plan-level rationale |
periodStartUtc | datetime | no | Defaults to the current week's Monday |
periodEndUtc | datetime | no | Exclusive |
timeZone | string | no | IANA zone, for example America/New_York |
update_weekly_plan
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
planId | string | yes | |
removeItemIds | string[] | no | |
updateItems | object[] | no | Field updates to existing items |
addItems | object[] | no | Same shape as propose_weekly_plan items |
notCoveringMarkdown | string | no | Replacement section |
Items added to an already-approved plan are scheduled immediately.
approve_weekly_plan
| Argument | Type | Required |
|---|---|---|
projectIdOrSlug | string | yes |
planId | string | yes |
Approving lets the plan's items self-execute at their scheduled times.
External test management
list_test_sources
Browses a connected TestRail, Zephyr Scale, Xray, or Azure Test Plans account.
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
systemType | string | no | testrail, zephyr, xray, or azure. Defaults to testrail. |
externalProjectId | string | no | Omit to list projects. Provide one to list that project's suites. |
A suite's id is the externalSourceId you pass to create_external_suite.
create_external_suite
Creates a reusable Certyn process that runs an external suite. Run it afterwards with run_process.
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | yes | |
name | string | yes | For example TestRail Release Smoke |
externalSourceType | string | yes | testrail, zephyr, xray, or azure |
externalSourceId | string | yes | Provider selector, for example TestRail projectId:suiteId or Azure project:planId:suiteId |
slug | string | no | |
description | string | no |
See Connect a Test Management Tool for the credentials each provider needs.
Conversations and coding tasks
list_conversations
| Argument | Type | Required | Notes |
|---|---|---|---|
projectIdOrSlug | string | no | Filter to one project |
limit | integer | no | Defaults to 20, capped at 100 |
get_conversation
| Argument | Type | Required |
|---|---|---|
conversationId | string | yes |
get_coding_task_context
Returns the Certyn issue, reproduction result, evidence, and related runs for a coding task. Call it before implementing a coding-task fix.
| Argument | Type | Required | Notes |
|---|---|---|---|
codingTaskId | string | yes | Supplied in the task prompt |
Behavior notes
- All tool access is filtered to the current tenant and the signed-in user's permissions. MCP cannot reach anything you could not open in the app yourself.
- Project resolution accepts either a project ID or a slug.
- Write tools carry MCP write annotations, so a client can ask for confirmation before mutating project records.
- List limits are clamped server-side. Asking for more than the cap returns the cap.
- Run tools return an ID and finish immediately. Poll with
get_process_run_statusorget_execution_detailrather than waiting on the call.