Keploy is a network-layer testing tool that uses eBPF to capture real API traffic, database queries, and streaming events, then replays them as tests without code changes. This server gives Claude access to Keploy's test generation and execution capabilities through its remote API. You can generate tests from OpenAPI specs, curl commands, Postman collections, or recorded user traffic, then run those tests with virtualized infrastructure dependencies like Postgres, MongoDB, Kafka, and RabbitMQ. It calculates both traditional code coverage (statement, branch) and API-specific metrics (schema coverage, business flow coverage). Useful when you need to build integration test suites from existing traffic or spec files, especially for polyglot applications where language-agnostic capture matters. The server connects via streamable HTTP to Keploy's cloud API.
claude mcp add --transport http mcp https://api.keploy.io/client/v1/mcp --header 'Authorization: YOUR_AUTHORIZATION'Run in your terminal. Add --scope user to make it available in every project.
Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.
Verified live against the running server on Jun 10, 2026.
bulkDeleteTestSuitesPOST /apps/{appId}/test-suites/bulk-delete — Bulk-delete test suites — Requires scope: `write`.2 paramsPOST /apps/{appId}/test-suites/bulk-delete — Bulk-delete test suites — Requires scope: `write`.
appId*stringtest_suite_ids*arraycreateAPIKeyPOST /api-keys — Create an API key — Requires scope: `admin`. The raw key is returned only once in the response.3 paramsPOST /api-keys — Create an API key — Requires scope: `admin`. The raw key is returned only once in the response.
name*stringscopes*arrayttl_daysnumbercreateAppPOST /apps — Create an app — Requires scope: `write`.9 paramsPOST /apps — Create an app — Requires scope: `write`.
authobjectdocsstringname*stringschemastringendpointstringwebhook_urlstringapi_examplesstringmax_test_suitesnumberdisable_schema_assertionbooleancreateCIBranchPOST /apps/{appId}/branches/ci — Find-or-create a CI branch — Creates a new Keploy branch (or returns the existing one) for a CI pipeline run. Idempotent on the (appId, name) pair. Requires scope: `write`.3 paramsPOST /apps/{appId}/branches/ci — Find-or-create a CI branch — Creates a new Keploy branch (or returns the existing one) for a CI pipeline run. Idempotent on the (appId, name) pair. Requires scope: `write`.
name*stringappId*stringgit_refobjectcreateClusterPOST /clusters — Create a cluster — Provisions a new cluster in the authenticated company and returns its access key. The access key is shown only once. Requires scope: `admin`.2 paramsPOST /clusters — Create a cluster — Provisions a new cluster in the authenticated company and returns its access key. The access key is shown only once. Requires scope: `admin`.
name*stringdeployment_typestringcreateMockPOST /apps/{appId}/recordings/{testSetId}/mocks — Author one mock under a recording — Insert a single mock into the given test set. When `branch_id` is supplied, the mock lands on that branch's overlay (`branch_sandbox_ops`) and only surfaces to main on merge. Without `branch_...5 paramsPOST /apps/{appId}/recordings/{testSetId}/mocks — Author one mock under a recording — Insert a single mock into the given test set. When `branch_id` is supplied, the mock lands on that branch's overlay (`branch_sandbox_ops`) and only surfaces to main on merge. Without `branch_...
mockobjectappId*stringbranch_idstringmock_yamlstringtestSetId*stringcreateTestSuitePOST /apps/{appId}/test-suites — Create a test suite — Requires scope: `write`.2 paramsPOST /apps/{appId}/test-suites — Create a test suite — Requires scope: `write`.
appId*stringbranch_idstringcreate_branchCreate a Keploy branch on an app — find-or-create on name conflict. Pass the dev's CURRENT GIT BRANCH as the name. Detect it BEFORE calling this tool: Bash: `git rev-parse --abbrev-ref HEAD` in the dev's app_dir. Exit non-zero or output "HEAD" → not in a git repo / detached HE...2 paramsCreate a Keploy branch on an app — find-or-create on name conflict. Pass the dev's CURRENT GIT BRANCH as the name. Detect it BEFORE calling this tool: Bash: `git rev-parse --abbrev-ref HEAD` in the dev's app_dir. Exit non-zero or output "HEAD" → not in a git repo / detached HE...
name*stringapp_id*stringcreate_mockAuthor a single mock inside a test set. Use this when the dev wants to add a hand-written downstream-call recording (HTTP response, DB result, etc.) without re-running the full record session. Authoring shape — pick ONE: * `mock_yaml` (PREFERRED) — canonical single-doc YAML en...5 paramsAuthor a single mock inside a test set. Use this when the dev wants to add a hand-written downstream-call recording (HTTP response, DB result, etc.) without re-running the full record session. Authoring shape — pick ONE: * `mock_yaml` (PREFERRED) — canonical single-doc YAML en...
mockobjectapp_id*stringbranch_id*stringmock_yamlstringtest_set_id*stringcreate_test_suiteCreate a new API test suite with test steps. Each step defines an HTTP request and assertions to validate the response. Steps can extract values from responses into variables for chaining requests. ═══════════════════════════════════════════════════════════════════ TEMPLATES F...8 paramsCreate a new API test suite with test steps. Each step defines an HTTP request and assertions to validate the response. Steps can extract values from responses into variables for chaining requests. ═══════════════════════════════════════════════════════════════════ TEMPLATES F...
name*stringapp_id*stringlabelsstringapp_dirstringapp_url*stringbranch_id*stringsteps_json*stringdescriptionstringdeleteAppDELETE /apps/{appId} — Delete an app — Requires scope: `admin`.1 paramsDELETE /apps/{appId} — Delete an app — Requires scope: `admin`.
appId*stringdeleteMockDELETE /apps/{appId}/recordings/{testSetId}/mocks/{mockId} — Drop one mock — Idempotent — returns 200 even if the mock is already gone. Path `{mockId}` accepts both the UUID `_id` and the human-readable Name (resolved within the test set). Branch-aware via optional `branch_id`...4 paramsDELETE /apps/{appId}/recordings/{testSetId}/mocks/{mockId} — Drop one mock — Idempotent — returns 200 even if the mock is already gone. Path `{mockId}` accepts both the UUID `_id` and the human-readable Name (resolved within the test set). Branch-aware via optional `branch_id`...
appId*stringmockId*stringbranch_idstringtestSetId*stringdeleteTestSuiteDELETE /apps/{appId}/test-suites/{suiteId} — Delete a test suite — Requires scope: `write`.3 paramsDELETE /apps/{appId}/test-suites/{suiteId} — Delete a test suite — Requires scope: `write`.
appId*stringsuiteId*stringbranch_idstringdelete_mockDrop one mock from a test set. Idempotent — returns 200 even if the mock is already gone, so retries on a network blip are safe. Accepts UUID or Name as `mock_id`. `branch_id` is REQUIRED — the delete lays a tombstone overlay on the branch (mergeable). Direct deletes from main...4 paramsDrop one mock from a test set. Idempotent — returns 200 even if the mock is already gone, so retries on a network blip are safe. Accepts UUID or Name as `mock_id`. `branch_id` is REQUIRED — the delete lays a tombstone overlay on the branch (mergeable). Direct deletes from main...
app_id*stringmock_id*stringbranch_id*stringtest_set_id*stringdelete_recordingWholesale-delete a recording (test set + its cases + mocks + mapping). `branch_id` is REQUIRED — the delete lays a tombstone overlay on the branch (mergeable). Direct deletes from main via MCP are blocked. Returns { deleted: true } on success, 404 when the (app_id, test_set_id...3 paramsWholesale-delete a recording (test set + its cases + mocks + mapping). `branch_id` is REQUIRED — the delete lays a tombstone overlay on the branch (mergeable). Direct deletes from main via MCP are blocked. Returns { deleted: true } on success, 404 when the (app_id, test_set_id...
app_id*stringbranch_id*stringtest_set_id*stringdelete_test_suiteDelete a test suite on a Keploy branch — synchronous, no playbook to walk. USE THIS when: * The dev's update_test_suite call was rejected with "preserves no steps from the existing suite — that's a full rewrite, not an edit". Delete the existing suite and re-author from scratc...4 paramsDelete a test suite on a Keploy branch — synchronous, no playbook to walk. USE THIS when: * The dev's update_test_suite call was rejected with "preserves no steps from the existing suite — that's a full rewrite, not an edit". Delete the existing suite and re-author from scratc...
app_id*stringreasonstringsuite_id*stringbranch_id*stringdevloop_begin_oauth_installStart the Path B agent-walked install for the V1 flow. Returns a playbook the AI walks with the dev to land a kep_* PAT in their editor's MCP config. Current implementation routes through app.keploy.io/settings/api-keys (the existing PAT-issuance surface). The full auto-provis...1 paramsStart the Path B agent-walked install for the V1 flow. Returns a playbook the AI walks with the dev to land a kep_* PAT in their editor's MCP config. Current implementation routes through app.keploy.io/settings/api-keys (the existing PAT-issuance surface). The full auto-provis...
editorstringdevloop_detect_appResolve a Keploy app and return a playbook the AI should walk to inspect the dev's repo for V1 ("user maintains the flow") test generation. This MCP server has no filesystem access — the AI is the inspector. The tool returns: the resolved app metadata (id, name, base_url, stor...3 paramsResolve a Keploy app and return a playbook the AI should walk to inspect the dev's repo for V1 ("user maintains the flow") test generation. This MCP server has no filesystem access — the AI is the inspector. The tool returns: the resolved app metadata (id, name, base_url, stor...
app_idstringapp_dir*stringapp_name_hintstringdevloop_expand_coverageExpand V1 API-test coverage from the single seed flow to the remaining detected resources. Use this AFTER devloop_mutation_demo has surfaced a positive catch result for the FIRST resource — that's the "manufactured proof" gate the dev needed before agreeing to scale. Returns a...3 paramsExpand V1 API-test coverage from the single seed flow to the remaining detected resources. Use this AFTER devloop_mutation_demo has surfaced a positive catch result for the FIRST resource — that's the "manufactured proof" gate the dev needed before agreeing to scale. Returns a...
app_id*stringapp_dir*stringbase_url*stringdevloop_generate_resource_flowGenerate one chained-CRUD API test for a single resource. Behavior depends on the app's devloop_storage_mode (set this first via devloop_resolve_storage / devloop_set_storage_mode): * repo mode → returns a PLAYBOOK for you to walk. Steps: (1) run "keploy test-gen generate-from...5 paramsGenerate one chained-CRUD API test for a single resource. Behavior depends on the app's devloop_storage_mode (set this first via devloop_resolve_storage / devloop_set_storage_mode): * repo mode → returns a PLAYBOOK for you to walk. Steps: (1) run "keploy test-gen generate-from...
app_id*stringapp_dir*stringbase_url*stringresource*stringframeworkstringdevloop_install_repo_artifactsGenerate the agent-discovery files that let dev #2 onboard via their AI agent without a human pointing at docs. The doc-stated "loop closure" step. Emits THREE files (the AI writes them with its Write tool): * `.claude/skills/keploy/SKILL.md` — Claude Code skill. Has YAML fron...1 paramsGenerate the agent-discovery files that let dev #2 onboard via their AI agent without a human pointing at docs. The doc-stated "loop closure" step. Emits THREE files (the AI writes them with its Write tool): * `.claude/skills/keploy/SKILL.md` — Claude Code skill. Has YAML fron...
app_dir*stringdevloop_mutation_demoProve the just-generated API test actually catches bugs by applying 3 real source-level mutations to the handler, running the test against each, and reverting. The doc-stated "manufactured proof in the first session" moment. OPT-IN, NOT OPT-OUT — this tool TOUCHES THE DEV'S SO...4 paramsProve the just-generated API test actually catches bugs by applying 3 real source-level mutations to the handler, running the test against each, and reverting. The doc-stated "manufactured proof in the first session" moment. OPT-IN, NOT OPT-OUT — this tool TOUCHES THE DEV'S SO...
app_id*stringapp_dir*stringbase_urlstringresource*stringdevloop_record_sandboxRecord mocks for V1 repo-mode API tests using the V1-native CLI command `keploy sandbox local record`. Runs the dev's app under the keploy eBPF agent, drives the V1 chained-CRUD tests from `keploy/api-tests/<resource>/test.yaml`, captures every outbound call (DB queries, Redis...8 paramsRecord mocks for V1 repo-mode API tests using the V1-native CLI command `keploy sandbox local record`. Runs the dev's app under the keploy eBPF agent, drives the V1 chained-CRUD tests from `keploy/api-tests/<resource>/test.yaml`, captures every outbound call (DB queries, Redis...
app_id*stringapp_dir*stringapp_url*stringsuite_namestringapp_command*stringcontainer_namestringskip_mock_uploadbooleanskip_report_uploadbooleandevloop_resolve_storageResolve the storage mode for V1 ("user maintains the flow") API tests on this app. ═══════════════════════════════════════════════════════════════════ **MUST BE YOUR FIRST MCP CALL** for ANY of these dev verbs/intents: ══════════════════════════════════════════════════════════...3 paramsResolve the storage mode for V1 ("user maintains the flow") API tests on this app. ═══════════════════════════════════════════════════════════════════ **MUST BE YOUR FIRST MCP CALL** for ANY of these dev verbs/intents: ══════════════════════════════════════════════════════════...
app_idstringapp_dirstringapp_name_hintstringdevloop_scaffold_ciScaffold the GitHub Actions workflow that runs the V1 API tests on every PR. Returns the exact YAML content to write to .github/workflows/keploy.yml + the Bash command to set the KEPLOY_API_KEY secret. The AI walks the playbook with its Write tool + the `gh` CLI. PRECONDITIONS...12 paramsScaffold the GitHub Actions workflow that runs the V1 API tests on every PR. Returns the exact YAML content to write to .github/workflows/keploy.yml + the Bash command to set the KEPLOY_API_KEY secret. The AI walks the playbook with its Write tool + the `gh` CLI. PRECONDITIONS...
app_id*stringapp_dir*stringci_modestringapp_binarystringgo_versionstringsetup_modestringapp_servicestringbase_branchstringapp_languagestringcompose_filestringtime_freezingbooleanapp_startup_delay_secondsnumberdevloop_schema_drift_reportReport the gap between the app's OpenAPI spec and its V1 API-tests coverage. Reuses the existing schema-coverage endpoint that get_coverage_gaps consumes, but frames the result for V1: which endpoints are uncovered, the recommended order to generate tests for them next (highes...1 paramsReport the gap between the app's OpenAPI spec and its V1 API-tests coverage. Reuses the existing schema-coverage endpoint that get_coverage_gaps consumes, but frames the result for V1: which endpoints are uncovered, the recommended order to generate tests for them next (highes...
app_id*stringdevloop_self_healDiagnose a failing V1 API test and propose an action. Triggered when: * keploy test-gen run exited non-zero in a fresh agent session (the dev's code changed since the test was authored). * A PR Keploy comment surfaced a failure and the dev says "fix it". Action classes (mutual...3 paramsDiagnose a failing V1 API test and propose an action. Triggered when: * keploy test-gen run exited non-zero in a fresh agent session (the dev's code changed since the test was authored). * A PR Keploy comment surfaced a failure and the dev says "fix it". Action classes (mutual...
app_dir*stringtest_dirstringreport_jsonstringdevloop_set_storage_modePersist the V1 storage mode on an app. Call this AFTER devloop_resolve_storage returned source="asked" (the dev gave you a yes/no) or source="inferred" (you confirmed keploy/api-tests/ exists on disk). Switching repo→cloud when local tests exist warns the dev that the existing...3 paramsPersist the V1 storage mode on an app. Call this AFTER devloop_resolve_storage returned source="asked" (the dev gave you a yes/no) or source="inferred" (you confirmed keploy/api-tests/ exists on disk). Switching repo→cloud when local tests exist warns the dev that the existing...
mode*stringapp_id*stringreasonstringdevloop_setup_instructionsReturn the V1 "user maintains the flow" install guide — covers Path A (clipboard one-liner), Path B (agent-walked OAuth), and the keploy/api-tests/ on-disk layout V1 creates. Safe to call without authentication; call this when the dev asks 'how do I add Keploy to this repo?' o...Return the V1 "user maintains the flow" install guide — covers Path A (clipboard one-liner), Path B (agent-walked OAuth), and the keploy/api-tests/ on-disk layout V1 creates. Safe to call without authentication; call this when the dev asks 'how do I add Keploy to this repo?' o...
No parameters — call it with no arguments.
devloop_switch_to_sandboxSwitch the app's V1 CI from "boot the real app + deps" mode to sandbox mode (mocks fetched by content-hash from the cloud canonical pool). The doc-stated trigger: ~1 week after CI is wired, when the dev has felt the slow runs / flakes and you can pitch "your CI takes 90s and f...3 paramsSwitch the app's V1 CI from "boot the real app + deps" mode to sandbox mode (mocks fetched by content-hash from the cloud canonical pool). The doc-stated trigger: ~1 week after CI is wired, when the dev has felt the slow runs / flakes and you can pitch "your CI takes 90s and f...
app_id*stringapp_dir*stringbase_branchstringdownload_recordingDownload a recording — a session of captured API traffic (request/response pairs + outbound mocks) stored as a test_set. Recordings are INPUT artifacts captured by `keploy record`: they're raw traffic that AI generation (generate_and_wait) and manual create_test_suite flows tu...3 paramsDownload a recording — a session of captured API traffic (request/response pairs + outbound mocks) stored as a test_set. Recordings are INPUT artifacts captured by `keploy record`: they're raw traffic that AI generation (generate_and_wait) and manual create_test_suite flows tu...
app_id*stringtest_set_id*stringinclude_mocksbooleaneditMockMappingPOST /apps/{appId}/recordings/{testSetId}/test-cases/{testCaseId}/mock-mapping — Link or unlink a mock from a test case — Targeted mutation of the test case's entry in the mapping doc. Add appends a mock entry if not already present; remove drops the entry by name. Both idempo...7 paramsPOST /apps/{appId}/recordings/{testSetId}/test-cases/{testCaseId}/mock-mapping — Link or unlink a mock from a test case — Targeted mutation of the test case's entry in the mapping doc. Add appends a mock entry if not already present; remove drops the entry by name. Both idempo...
appId*stringaction*stringbranch_idstringmock_kindstringmock_name*stringtestSetId*stringtestCaseId*stringexportRecordingGET /apps/{appId}/recordings/{testSetId}/export — Export a recording bundle — Export a complete recording bundle: test set metadata, all test cases, mocks, and test-to-mock mappings as a single JSON response. Use ?include_mocks=false to exclude mocks. Requires scope: `read`.3 paramsGET /apps/{appId}/recordings/{testSetId}/export — Export a recording bundle — Export a complete recording bundle: test set metadata, all test cases, mocks, and test-to-mock mappings as a single JSON response. Use ?include_mocks=false to exclude mocks. Requires scope: `read`.
appId*stringtestSetId*stringinclude_mocksbooleangenerateTestSuitesPOST /apps/{appId}/test-suites/generate — Generate test suites via AI — Requires scope: `write`.13 paramsPOST /apps/{appId}/test-suites/generate — Generate test suites via AI — Requires scope: `write`.
authobjectdocsstringappId*stringschemastringtimeoutnumberbase_url*stringexamplesstringrate_limitnumberuser_promptstringwebhook_urlstringcode_snippetstringmax_test_suitesnumberignore_endpointsarraygenerate_and_waitGenerate test suites from an OpenAPI spec and wait for completion.5 paramsGenerate test suites from an OpenAPI spec and wait for completion.
app_id*stringschemastringbase_url*stringuser_promptstringmax_test_suitesnumbergetAppGET /apps/{appId} — Get an app — Requires scope: `read`. Optional `fields` query parameter projects the response to a subset of properties — useful for MCP / AI callers that only need a few identity fields (e.g. `["name","namespace","deployment","origin.clusterName"]`) and don...2 paramsGET /apps/{appId} — Get an app — Requires scope: `read`. Optional `fields` query parameter projects the response to a subset of properties — useful for MCP / AI callers that only need a few identity fields (e.g. `["name","namespace","deployment","origin.clusterName"]`) and don...
appId*stringfieldsstringgetCurrentUserGET /users/me — Get current user — Requires scope: `read`. Returns the user associated with the API key.GET /users/me — Get current user — Requires scope: `read`. Returns the user associated with the API key.
No parameters — call it with no arguments.
getGeneratedSchemaGET /apps/{appId}/generated-schema — Get auto-generated OpenAPI schema — Returns the OpenAPI schema auto-generated from recorded traffic. Requires scope: `read`.1 paramsGET /apps/{appId}/generated-schema — Get auto-generated OpenAPI schema — Returns the OpenAPI schema auto-generated from recorded traffic. Requires scope: `read`.
appId*stringgetGenerationHistoryDetailsGET /apps/{appId}/generation-history/{jobId} — Get generation history details — Requires scope: `read`.2 paramsGET /apps/{appId}/generation-history/{jobId} — Get generation history details — Requires scope: `read`.
appId*stringjobId*stringgetJobGET /jobs/{jobId} — Get a job — Requires scope: `read`.1 paramsGET /jobs/{jobId} — Get a job — Requires scope: `read`.
jobId*stringgetLoadTestReportGET /apps/{appId}/load-tests/{runId} — Get a load test report — Requires scope: `read`.2 paramsGET /apps/{appId}/load-tests/{runId} — Get a load test report — Requires scope: `read`.
appId*stringrunId*stringgetMockGET /apps/{appId}/recordings/{testSetId}/mocks/{mockId} — Read one mock's canonical YAML — Returns the canonical mock YAML doc (version/kind/name/spec) for the named mock in the given test set. Branch-aware: when `branch_id` is supplied, a branch-only upsert or tombstone takes...4 paramsGET /apps/{appId}/recordings/{testSetId}/mocks/{mockId} — Read one mock's canonical YAML — Returns the canonical mock YAML doc (version/kind/name/spec) for the named mock in the given test set. Branch-aware: when `branch_id` is supplied, a branch-only upsert or tombstone takes...
appId*stringmockId*stringbranch_idstringtestSetId*stringgetMockMappingGET /apps/{appId}/recordings/{testSetId}/test-cases/{testCaseId}/mock-mapping — Read the mocks currently linked to a test case — Returns the mock entries in the mapping doc for the named test case. Branch-aware via `branch_id` — when set, the branch overlay's mapping wins over...4 paramsGET /apps/{appId}/recordings/{testSetId}/test-cases/{testCaseId}/mock-mapping — Read the mocks currently linked to a test case — Returns the mock entries in the mapping doc for the named test case. Branch-aware via `branch_id` — when set, the branch overlay's mapping wins over...
appId*stringbranch_idstringtestSetId*stringtestCaseId*stringgetRecordingGET /apps/{appId}/recordings/{testSetId} — Get recorded test cases — Returns individual recorded test cases within a test set, including HTTP request/response data. Requires scope: `read`.4 paramsGET /apps/{appId}/recordings/{testSetId} — Get recorded test cases — Returns individual recorded test cases within a test set, including HTTP request/response data. Requires scope: `read`.
appId*stringlimitnumberoffsetnumbertestSetId*stringgetSchemaCoverageGET /apps/{appId}/schema-coverage — Get schema coverage — Requires scope: `read`.1 paramsGET /apps/{appId}/schema-coverage — Get schema coverage — Requires scope: `read`.
appId*stringgetSubscriptionGET /company/subscription — Get company subscription — Requires scope: `read`.GET /company/subscription — Get company subscription — Requires scope: `read`.
No parameters — call it with no arguments.
getSuiteReportGET /apps/{appId}/test-runs/{runId}/suite-reports/{reportId} — Get a suite report — Requires scope: `read`.3 paramsGET /apps/{appId}/test-runs/{runId}/suite-reports/{reportId} — Get a suite report — Requires scope: `read`.
appId*stringrunId*stringreportId*stringgetTestCaseGET /apps/{appId}/recordings/{testSetId}/test-cases/{testCaseId} — Get a single test case — Returns a single recorded test case identified by its friendly **name** (e.g. `test-4` — the name in the recording yaml) within a recording session. Within `(testSetId, branchId)` the n...4 paramsGET /apps/{appId}/recordings/{testSetId}/test-cases/{testCaseId} — Get a single test case — Returns a single recorded test case identified by its friendly **name** (e.g. `test-4` — the name in the recording yaml) within a recording session. Within `(testSetId, branchId)` the n...
appId*stringbranch_idstringtestSetId*stringtestCaseId*stringgetTestReportGET /apps/{appId}/test-reports/{reportId} — Get a test run report — Returns the rollup view of a single test run by ID — counts, CI metadata, normalize/coverage data. Cheap and lightweight. For per-test-case diffs and mock mismatches use `getTestReportFull`. Requires scope: `r...2 paramsGET /apps/{appId}/test-reports/{reportId} — Get a test run report — Returns the rollup view of a single test run by ID — counts, CI metadata, normalize/coverage data. Cheap and lightweight. For per-test-case diffs and mock mismatches use `getTestReportFull`. Requires scope: `r...
appId*stringreportId*stringgetTestReportFullGET /apps/{appId}/test-reports/{reportId}/full — Get a fully-inflated test run report — Returns everything about a single legacy /tr test run in one call: the rollup (counts, CI metadata, normalize/coverage data), every test-set report, and — when `include_oss_report=true` (de...7 paramsGET /apps/{appId}/test-reports/{reportId}/full — Get a fully-inflated test run report — Returns everything about a single legacy /tr test run in one call: the rollup (counts, CI metadata, normalize/coverage data), every test-set report, and — when `include_oss_report=true` (de...
appId*stringfieldsstringreportId*stringfailed_onlybooleaninclude_oss_reportbooleanmock_mismatches_onlybooleanmax_test_cases_per_setnumbergetTestRunGET /apps/{appId}/test-runs/{runId} — Get a test run — Requires scope: `read`.2 paramsGET /apps/{appId}/test-runs/{runId} — Get a test run — Requires scope: `read`.
appId*stringrunId*stringgetTestSuiteGET /apps/{appId}/test-suites/{suiteId} — Get a test suite — Requires scope: `read`.3 paramsGET /apps/{appId}/test-suites/{suiteId} — Get a test suite — Requires scope: `read`.
appId*stringsuiteId*stringbranch_idstringgetUsageGET /company/usage — Get company usage — Requires scope: `read`.GET /company/usage — Get company usage — Requires scope: `read`.
No parameters — call it with no arguments.
getValidationResultGET /jobs/{jobId}/validation-result — Get job validation result — Requires scope: `read`.1 paramsGET /jobs/{jobId}/validation-result — Get job validation result — Requires scope: `read`.
jobId*stringget_app_testing_contextFetch comprehensive context about an app's API plus the canonical test-suite authoring schema. Returns: * app — config, auth shape, appLevelCustomVariables (READ THIS for R32 — your extract keys must not collide with these names) * coverage — API coverage report (which endpoin...1 paramsFetch comprehensive context about an app's API plus the canonical test-suite authoring schema. Returns: * app — config, auth shape, appLevelCustomVariables (READ THIS for R32 — your extract keys must not collide with these names) * coverage — API coverage report (which endpoin...
app_id*stringget_auth_statusCheck whether the current MCP session has a valid-looking Keploy PAT attached. Returns { authenticated, auth_header_present, hint }. Useful as a first step for an agent to decide whether to call other tools or show setup instructions — differentiates 'no header at all' from 'h...Check whether the current MCP session has a valid-looking Keploy PAT attached. Returns { authenticated, auth_header_present, hint }. Useful as a first step for an agent to decide whether to call other tools or show setup instructions — differentiates 'no header at all' from 'h...
No parameters — call it with no arguments.
get_coverage_gapsGet API coverage and prioritized suggestions for uncovered endpoints.1 paramsGet API coverage and prioritized suggestions for uncovered endpoints.
app_id*stringget_session_reportFetch the report for a completed run. ONE tool, THREE report kinds — the response's top-level `kind` field discriminates which kind it is (rerecord / sandbox_run / test_suite_run) and which question the report answers (see core glossary's "three reports"). Read `kind` first, t...3 paramsFetch the report for a completed run. ONE tool, THREE report kinds — the response's top-level `kind` field discriminates which kind it is (rerecord / sandbox_run / test_suite_run) and which question the report answers (see core glossary's "three reports"). Read `kind` first, t...
app_id*stringverbosebooleantest_run_id*stringget_setup_instructionsReturn step-by-step instructions for connecting this MCP server to Cursor, Windsurf, VS Code, Claude Desktop, Claude Code, or Trae. Safe to call without authentication — use this when the user asks 'how do I set up Keploy MCP?' or when a tool call fails with an auth error.Return step-by-step instructions for connecting this MCP server to Cursor, Windsurf, VS Code, Claude Desktop, Claude Code, or Trae. Safe to call without authentication — use this when the user asks 'how do I set up Keploy MCP?' or when a tool call fails with an auth error.
No parameters — call it with no arguments.
importRecordingPOST /apps/{appId}/recordings/{testSetId}/import — Import test case changes into a recording — Bulk import test case changes: update existing test cases (by ID), insert new ones (without ID), and delete specified test cases. Pass `branch_id` (query or body) to scope the import...5 paramsPOST /apps/{appId}/recordings/{testSetId}/import — Import test case changes into a recording — Bulk import test case changes: update existing test cases (by ID), insert new ones (without ID), and delete specified test cases. Pass `branch_id` (query or body) to scope the import...
appId*stringbranch_idstringtestSetId*stringtest_casesarraydelete_test_case_idsarraylistAPIKeysGET /api-keys — List API keys — Requires scope: `admin`.GET /api-keys — List API keys — Requires scope: `admin`.
No parameters — call it with no arguments.
listAppsGET /apps — List apps — Returns the tenant's apps. Use the optional `q` query parameter to name-filter (case-insensitive substring, e.g. `?q=orderflow` → apps whose name contains 'orderflow'); without it the full paginated list is returned. Callers that know the app's folder /...3 paramsGET /apps — List apps — Returns the tenant's apps. Use the optional `q` query parameter to name-filter (case-insensitive substring, e.g. `?q=orderflow` → apps whose name contains 'orderflow'); without it the full paginated list is returned. Callers that know the app's folder /...
qstringlimitnumberoffsetnumberlistAppsByClusterGET /apps/by-cluster/{clusterId} — List apps in a cluster — Returns apps belonging to a specific cluster. More efficient than iterating all apps. Requires scope: `read`.1 paramsGET /apps/by-cluster/{clusterId} — List apps in a cluster — Returns apps belonging to a specific cluster. More efficient than iterating all apps. Requires scope: `read`.
clusterId*stringlistAppsWithRecordingsGET /apps/with-recordings — List proxy apps with network recordings — Returns all k8s-proxy apps (origin.type=PROXY). These apps are auto-created by the Keploy k8s-proxy agent on first recording and contain network recordings of ingress HTTP traffic (as Keploy test cases) and...GET /apps/with-recordings — List proxy apps with network recordings — Returns all k8s-proxy apps (origin.type=PROXY). These apps are auto-created by the Keploy k8s-proxy agent on first recording and contain network recordings of ingress HTTP traffic (as Keploy test cases) and...
No parameters — call it with no arguments.
listBranchesGET /apps/{appId}/branches — List Keploy branches on an app — Returns every Keploy branch on an app, optionally filtered by status. Used by MCP write tools and CI integrations to enumerate branches without shelling out to the CLI. Requires scope: `read`.2 paramsGET /apps/{appId}/branches — List Keploy branches on an app — Returns every Keploy branch on an app, optionally filtered by status. Used by MCP write tools and CI integrations to enumerate branches without shelling out to the CLI. Requires scope: `read`.
appId*stringstatusstringopen · review_requested · approved · changes_requested · merged · closedlistClustersGET /clusters — List clusters — Returns all clusters for the authenticated company. Requires scope: `read`.GET /clusters — List clusters — Returns all clusters for the authenticated company. Requires scope: `read`.
No parameters — call it with no arguments.
listGenerationHistoryGET /apps/{appId}/generation-history — List generation history — Requires scope: `read`. Returns all entries (no pagination).1 paramsGET /apps/{appId}/generation-history — List generation history — Requires scope: `read`. Returns all entries (no pagination).
appId*stringlistJobsGET /jobs — List jobs — Requires scope: `read`.2 paramsGET /jobs — List jobs — Requires scope: `read`.
limitnumberoffsetnumberlistLoadTestRunsGET /apps/{appId}/load-tests — List load test runs — Requires scope: `read`. Returns all runs (no pagination).1 paramsGET /apps/{appId}/load-tests — List load test runs — Requires scope: `read`. Returns all runs (no pagination).
appId*stringlistMocksGET /apps/{appId}/recordings/{testSetId}/mocks — List mocks for a recording — Returns mock reference metadata and optionally parsed mock specs for a test set. Use ?include_specs=true to download and parse the actual mock YAML from object storage. Pass `branch_id` to scope the...4 paramsGET /apps/{appId}/recordings/{testSetId}/mocks — List mocks for a recording — Returns mock reference metadata and optionally parsed mock specs for a test set. Use ?include_specs=true to download and parse the actual mock YAML from object storage. Pass `branch_id` to scope the...
appId*stringbranch_idstringtestSetId*stringinclude_specsbooleanlistRecordingsGET /apps/{appId}/recordings — List recording sessions — Returns test sets (recording sessions) for an app. Requires scope: `read`.3 paramsGET /apps/{appId}/recordings — List recording sessions — Returns test sets (recording sessions) for an app. Requires scope: `read`.
appId*stringlimitnumberoffsetnumberlistSuiteReportsGET /apps/{appId}/test-runs/{runId}/suite-reports — List suite reports for a test run — Requires scope: `read`. Supports cursor-based pagination.5 paramsGET /apps/{appId}/test-runs/{runId}/suite-reports — List suite reports for a test run — Requires scope: `read`. Supports cursor-based pagination.
afterstringappId*stringrunId*stringbeforestringpage_sizenumberlistTestCaseReportsGET /apps/{appId}/test-reports/{reportId}/test-set-reports/{testSetReportId}/test-cases — List test case reports — Returns individual test case results with expected/actual diffs within a test set report. Requires scope: `read`.5 paramsGET /apps/{appId}/test-reports/{reportId}/test-set-reports/{testSetReportId}/test-cases — List test case reports — Returns individual test case results with expected/actual diffs within a test set report. Requires scope: `read`.
appId*stringlimitnumberoffsetnumberreportId*stringtestSetReportId*stringlistTestReportsGET /apps/{appId}/test-reports — List test run reports — Browse legacy /tr test runs for an app. Combine `status` + `source` to scope to specific run kinds — e.g. `status=FAILED` + `source=ci` shows broken CI runs only. Use `branch_id` to scope to a Keploy branch overlay. Use...8 paramsGET /apps/{appId}/test-reports — List test run reports — Browse legacy /tr test runs for an app. Combine `status` + `source` to scope to specific run kinds — e.g. `status=FAILED` + `source=ci` shows broken CI runs only. Use `branch_id` to scope to a Keploy branch overlay. Use...
appId*stringlimitnumbersincenumberuntilnumberoffsetnumbersourcestringci · manualstatusstringPASSED · FAILED · RUNNING · PENDING · IGNORED · OBSOLETEbranch_idstringlistTestRunsGET /apps/{appId}/test-runs — List test runs — List test runs for an app. Optional `kind` query param filters by run kind: `rerecord` (record_sandbox_test runs), `sandbox_run` (replay_sandbox_test runs), or `test_suite_run` (replay_test_suite live runs). Omit to return runs of...4 paramsGET /apps/{appId}/test-runs — List test runs — List test runs for an app. Optional `kind` query param filters by run kind: `rerecord` (record_sandbox_test runs), `sandbox_run` (replay_sandbox_test runs), or `test_suite_run` (replay_test_suite live runs). Omit to return runs of...
kindstringrerecord · sandbox_run · test_suite_runappId*stringlimitnumberoffsetnumberlistTestSetReportsGET /apps/{appId}/test-reports/{reportId}/test-set-reports — List test set reports within a run — Returns per-test-set results within a test run report. Requires scope: `read`.4 paramsGET /apps/{appId}/test-reports/{reportId}/test-set-reports — List test set reports within a run — Returns per-test-set results within a test run report. Requires scope: `read`.
appId*stringlimitnumberoffsetnumberreportId*stringlistTestSuitesGET /apps/{appId}/test-suites — List test suites — List test suites for an app. Optional `has_sandbox_test` query param filters by sandbox-test linkage: `true` returns only suites that have a sandbox test (linked=true / test_set_id populated); `false` returns only suites witho...7 paramsGET /apps/{appId}/test-suites — List test suites — List test suites for an app. Optional `has_sandbox_test` query param filters by sandbox-test linkage: `true` returns only suites that have a sandbox test (linked=true / test_set_id populated); `false` returns only suites witho...
qstringafterstringappId*stringbeforestringbranch_idstringpage_sizenumberhas_sandbox_teststringtrue · falselist_branchesList Keploy branches on an app. Use this BEFORE any write tool (create_test_suite, update_test_suite, sandbox flows) to see if a branch already exists for the dev's current work. If one matches the dev's git branch, pass its branch_id (or branch_name) to the write tool. Otherw...2 paramsList Keploy branches on an app. Use this BEFORE any write tool (create_test_suite, update_test_suite, sandbox flows) to see if a branch already exists for the dev's current work. If one matches the dev's git branch, pass its branch_id (or branch_name) to the write tool. Otherw...
app_id*stringstatusstringnormalizeSuiteReportPOST /apps/{appId}/test-runs/{runId}/suite-reports/{reportId}/normalize — Normalize a suite report — Requires scope: `write`.3 paramsPOST /apps/{appId}/test-runs/{runId}/suite-reports/{reportId}/normalize — Normalize a suite report — Requires scope: `write`.
appId*stringrunId*stringreportId*stringnormalizeTestRunPOST /apps/{appId}/test-runs/{runId}/normalize — Normalize a test run — Requires scope: `write`.2 paramsPOST /apps/{appId}/test-runs/{runId}/normalize — Normalize a test run — Requires scope: `write`.
appId*stringrunId*string
🌟 The must-have tool for developers in the AI-Gen era for 90% test coverage 🌟
Keploy is a developer‑centric API and integration testing tool that auto‑generates tests and data‑mocks faster than unit tests.
It records API calls, database queries, and streaming events — then replays them as tests. Under the hood, Keploy uses eBPF to capture traffic at the network layer, but for you it’s completely code‑less and language‑agnostic.
🐰 Fun fact: Keploy uses itself for testing! Check out our swanky coverage badge:
![]()
Just run your app with keploy record. Real API + integration flows are automatically captured as tests and mocks. (Keploy uses eBPF under the hood to capture traffic, so you don’t need to add any SDKs or modify code.)
Keploy can record and replay complex, distributed API flows as mocks and stubs. It's like having a very light-weight time machine for your tests—saving you tons of time!
👉 Read the docs on record-replay
Unlike tools that only mock HTTP endpoints, Keploy records databases (Postgres, MySQL, MongoDB), streaming/queues (Kafka, RabbitMQ), external APIs, and more.
It replays them deterministically so you can run tests without re‑provisioning infra.
👉 Read the docs on infra virtualisation
If you’re a developer, you probably care about statement and branch coverage — Keploy calculates that for you.
If you’re a QA, you focus more on API schema and business use‑case coverage — Keploy calculates that too. This way coverage isn’t subjective anymore.
Keploy uses existing recordings, Swagger/OpenAPI Schema to find: boundary values, missing/extra fields, wrong types, out‑of‑order sequences, retries/timeouts.
This helps expand API Schema, Statement, and Branch Coverage.
🌐 CI/CD Integration: Run tests with mocks anywhere you like—locally on the CLI, in your CI pipeline (Jenkins, Github Actions..) , or even across a Kubernetes cluster. Read more
🎭 Multi-Purpose Mocks: You can also use Keploy-generated Mocks, as server Tests!
📊 Reporting: Unified reports for API, integration, unit, and e2e coverage with insights directly in your CI or PRs.
🖥️ Console: A developer-friendly console to view, manage, and debug recorded tests and mocks.
⏱️ Time Freezing: Deterministically replay tests by freezing system time during execution. Read more
📚 Mock Registry: Centralized registry to manage, reuse, and version mocks across teams and environments. Read more
curl --silent -O -L https://keploy.io/install.sh && source install.sh
Start your app under Keploy to convert real API calls into tests and mocks.
keploy record -c "CMD_TO_RUN_APP"
Example for Python:
keploy record -c "python main.py"
Run tests offline without external dependencies.
keploy test -c "CMD_TO_RUN_APP" --delay 10
Because Keploy intercepts at the network layer (eBPF), it works with any language, framework, or runtime—no SDK required.
Note: Some of the dependencies are not open-source by nature because their protocols and parsings are not open-sourced. It's not supported in Keploy enterprise.
Want a guided walkthrough, dedicated support, or help planning enterprise rollout?
Prefer a calendar invite? Mention your availability in the email—we’ll send a calendar invite right away.
Whether you're new or experienced, your input matters. Help us improve Keploy by contributing code, reporting issues, or sharing feedback.
Together, let's build better testing tools for modern applications.