Skip to main content
Glama
testit-mcp-server

testit-mcp-server

by iampopovich

TestIT MCP

npm version MIT License

Production-ready MCP server for TestIT focused on WorkItems, TestRuns, and TestPlans.

Features

  • Simple API Key authentication via PrivateToken or Bearer scheme.

  • Project-aware tools with optional default project via TESTIT_PROJECT_ID.

  • Project resolution by projectId (UUID) or projectName.

  • Support for TestIT v2 API.

  • stdio transport for local MCP clients (npx or local build).

Related MCP server: TestRail MCP Server

Tool Coverage

  • Projects: list, search, get, create, update, delete

  • Work Items: list, search, get, create, update, delete, history, versions, restore, attachments

  • Test Runs: list, get, create, start, stop, delete, results

  • Test Results: get, search, create, update

  • Test Plans: list, get, create, update, delete

  • Shared Steps: list, get (as specialized work items)

  • Configurations: list, get, create, update

  • Analytics: project analytics, test plan analytics, test run analytics

Authentication

This server uses the TestIT API Key:

  1. Use your user-generated API Secret Key in TESTIT_TOKEN.

  2. Server uses Authorization: PrivateToken {token} by default.

  3. If token starts with Bearer , it uses it as is.

Environment Variables

TESTIT_URL=https://testit.instance.com/
TESTIT_TOKEN=your-api-token
# Optional default project (UUID):
# TESTIT_PROJECT_ID=550e8400-e29b-41d4-a716-446655440000
  • TESTIT_URL required

  • TESTIT_TOKEN required

  • TESTIT_PROJECT_ID optional

  • TESTIT_READ_ONLY optional (true/1): expose only read-only tools (list/get/search)

  • TESTIT_TOOLSETS optional: comma-separated toolsets to expose (default: default) — projects, work-items, sections, test-runs, test-results, test-plans, test-suites, autotests, analytics, shared-steps, configurations, configuration-parameters, attachments, dictionaries; opt-in (hidden unless listed): admin (custom attributes, templates, webhooks, workflows, notifications, project settings), bulk (mass delete/restore/purge). Keywords: default = all non-opt-in toolsets, all = everything. Example: TESTIT_TOOLSETS=default,admin. Fewer tools = less model context.

Every tool carries MCP annotations (readOnlyHint, destructiveHint, idempotentHint), so clients can ask for confirmation before destructive calls (delete/purge and full-replacement update_*).

Run Locally

Prerequisites

  • Node.js v18+ and npm

Step-by-step

  1. Clone the repository:

git clone https://github.com/iampopovich/testit-mcp-server.git
cd testit-mcp-server
  1. Install dependencies:

npm install
  1. Create your local environment file from the example and fill required values:

cp .env.example .env
  1. Build the project:

npm run build
  1. Start the MCP server:

npm start

MCP Client Setup

{
  "mcpServers": {
    "testit": {
      "command": "npx",
      "args": ["-y", "testit-mcp-server"],
      "env": {
        "TESTIT_URL": "https://{testit-instance-address}",
        "TESTIT_TOKEN": "{your-api-token}",
        "TESTIT_PROJECT_ID": "{TestIT-project-uuid}"
      }
    }
  }
}

Available Tools

130 tools
assign_test_points_testerA
Idempotent

Assign a tester (user UUID) to the given test points of a test plan. TestIT has no user list API: take user ids from existing entities (createdById, testerId). Returns the affected point ids.

Inputs: id (required), userId (required), testPointIds (required).

complete_test_runA
Idempotent

Complete a test run (InProgress/Stopped -> Completed).

Inputs: id (required).

create_autotestA

Create an autotest. Linking it to test cases (workItemIds) makes those cases automated, which is required to create test runs from a test plan. Results are later sent by externalId (submit_test_run_results). Extra AutoTestCreateApiModel fields can go into "payload".

Inputs: name (required), externalId (required), tags, setup, +10 more.

create_configurationC

Create a configuration (environment such as browser/OS). Extra ConfigurationPostModel fields can go into "payload".

Inputs: name (required), payload, isDefault, projectId, +3 more.

create_configuration_parameterC

Create a configuration parameter with allowed values.

Inputs: name (required), values (required), projectId, projectIds, +1 more.

create_projectB

Create a new project (payload: CreateProjectApiModel, at least name). Cloud instances may answer 402 when the plan's project limit is reached.

Inputs: payload (required).

create_sectionB

Create a section. parentId defaults to the project's root section (TestIT rejects parentId=null).

Inputs: name (required), parentId, projectId, projectName, +2 more.

create_test_planB

Create a test plan (status New). Extra CreateTestPlanApiModel fields can be passed in "payload".

Inputs: name (required), tags, build, endDate, +7 more.

create_test_plan_cloneA

Clone a test plan (copy named " (1)", status New). Returns the new plan.

Inputs: id (required).

create_test_runB

Create an empty test run in a project (state NotStarted). Extra CreateEmptyTestRunApiModel fields (attachments, links) can be passed in "payload".

Inputs: name, tags, payload, projectId, +3 more.

create_test_run_from_autotestsA

Create a test run (not bound to a test plan) pre-filled with one result per autotest x configuration. Fill results via submit_test_run_results by autoTestExternalId.

Inputs: configurationIds (required), autoTestExternalIds (required), name, tags, +4 more.

create_test_run_from_test_pointsB

Create a test run inside a test plan from explicit selectors: for each configuration, the work items whose test points to include. Like create_test_run_from_work_items, only AUTOMATED test points are accepted.

Inputs: testPlanId (required), testPointSelectors (required), name, tags, +3 more.

create_test_run_from_work_itemsA

Create a test run inside a test plan for the given work items x configurations (the plan becomes InProgress). Only AUTOMATED work items are accepted (linked to an autotest, see link_autotest_work_item); TestIT rejects manual ones. Results are pre-created and filled via submit_test_run_results; the run completes when all results are in.

Inputs: testPlanId (required), workItemIds (required), configurationIds (required), name, +5 more.

create_test_suiteA

Create a test suite in a test plan (top-level, or nested under parentId). Then fill it with set_test_suite_work_items.

Inputs: name (required), testPlanId (required), type, parentId.

create_work_itemA

Create a test case, checklist or shared step. Defaults: entityTypeName=TestCases, state=NotReady, priority=Medium, duration=60000 ms (always 0 for SharedSteps — required by TestIT). Extra CreateWorkItemApiModel fields can be passed in "payload".

Inputs: name (required), tags, state, steps, +12 more.

create_work_item_commentC

Add a comment to a work item.

Inputs: text (required), workItemId (required).

delete_attachmentA
DestructiveIdempotent

Delete an attachment that is not linked to any entity (TestIT returns 422 for linked ones).

Inputs: id (required).

delete_autotestA
DestructiveIdempotent

Delete (archive) an autotest. Archived autotests return 404 from get_autotest and can only be found via search_autotests with isDeleted=true; the API has no restore or purge for autotests.

Inputs: id (required).

delete_configurationA
DestructiveIdempotent

Delete (archive) a configuration. Use restore_configuration to undo or purge_configuration to remove it for good.

Inputs: id (required).

delete_configuration_parameterC
DestructiveIdempotent

Delete a configuration parameter.

Inputs: id (required).

delete_projectC
DestructiveIdempotent

Delete a project by ID.

Inputs: id (required).

delete_sectionA
DestructiveIdempotent

Delete (archive) a section together with its subsections and work items.

Inputs: id (required).

delete_test_planA
DestructiveIdempotent

Delete (archive) a test plan. Use restore_test_plan to undo or purge_test_plan to remove it for good.

Inputs: id (required).

delete_test_result_attachmentC
DestructiveIdempotent

Delete an attachment from a test result.

Inputs: id (required), attachmentId (required).

delete_test_runA
DestructiveIdempotent

Delete (archive) a test run by ID. Use restore_test_run to undo or purge_test_run to remove permanently.

Inputs: id (required).

delete_test_suiteA
DestructiveIdempotent

Delete a test suite with its nested suites and test points.

Inputs: id (required).

delete_work_itemC
DestructiveIdempotent

Delete a work item by ID (UUID).

Inputs: id (required).

delete_work_item_commentC
DestructiveIdempotent

Delete a work item comment.

Inputs: commentId (required).

get_attachmentB
Read-only

Download an attachment; content is returned base64-encoded.

Inputs: id (required).

get_attachment_metadataC
Read-only

Attachment metadata: name, type, size, author, dates.

Inputs: id (required).

get_autotestC
Read-only

Get an autotest by UUID.

Inputs: id (required).

get_autotest_average_durationB
Read-only

Average duration (ms) of passed and failed results of an autotest.

Inputs: id (required).

get_autotest_results_historyB
Read-only

Results of an autotest across test runs (status, outcome, run, plan, configuration, duration), newest first.

Inputs: id (required), page, size, skip, +8 more.

get_configurationB
Read-only

Get a configuration by ID.

Inputs: id (required).

get_configuration_parameterB
Read-only

Get a configuration parameter with its values and projects.

Inputs: id (required).

get_projectB
Read-only

Get a project by ID.

Inputs: id (required).

get_project_analyticsB
Read-only

Get analytics for all test plans in a project.

Inputs: page, size, skip, take, +5 more.

get_sectionB
Read-only

Get a section with its precondition/postcondition steps.

Inputs: id (required), isDeleted.

get_shared_stepC
Read-only

Get a shared step by ID.

Inputs: id (required).

get_test_planC
Read-only

Get a test plan by ID.

Inputs: id (required).

get_test_plan_analyticsC
Read-only

Get analytics for a specific test plan.

Inputs: id (required).

get_test_plan_historyC
Read-only

Change history of a test plan.

Inputs: id (required), page, size, skip, +4 more.

get_test_plan_summaryB
Read-only

Test plan totals: test points (total/manual/automated/completed), defects, planned and spent duration.

Inputs: id (required).

get_test_point_work_itemC
Read-only

The work item (test case) a test point represents.

Inputs: id (required).

get_test_resultC
Read-only

Get a test result by ID.

Inputs: id (required).

get_test_result_attachmentA
Read-only

Download a test result attachment; content is returned base64-encoded.

Inputs: id (required), attachmentId (required).

get_test_result_rerunsA
Read-only

All attempts of a test result (original + reruns) with runNumber, outcome and status. The original result keeps its status; later attempts are separate results.

Inputs: id (required).

get_test_results_statisticsB
Read-only

Counts of test results by status (passed/failed/skipped/blocked/...) and failure category for a filter, e.g. one or more test runs.

Inputs: name, filter, className, namespace, +3 more.

get_test_runC
Read-only

Get a test run by ID.

Inputs: id (required).

get_test_run_resultsC
Read-only

Get test results for a test run.

Inputs: id (required).

get_test_run_statisticsB
Read-only

Get test result statistics for a specific test run, optionally filtered.

Inputs: id (required), filter.

get_test_suiteC
Read-only

Get a test suite by ID.

Inputs: id (required).

get_work_itemC
Read-only

Get a work item by ID (UUID).

Inputs: id (required).

get_work_item_historyC
Read-only

Get work item history.

Inputs: id (required), page, size, skip, +4 more.

get_work_item_test_results_historyB
Read-only

Test results of a work item across test runs/plans (newest first), with optional filters.

Inputs: id (required), to, from, page, +10 more.

get_work_item_versionsC
Read-only

Get all versions of a work item.

Inputs: id (required).

list_autotest_test_runsC
Read-only

Test runs that contain the autotest.

Inputs: id (required).

list_autotest_work_itemsC
Read-only

List work items (test cases) linked to an autotest.

Inputs: id (required).

list_configurationsB
Read-only

List configurations for a project. Every project has a default one ("Any"); test points and results are always bound to a configuration.

Inputs: projectId, projectName.

list_project_attributesB
Read-only

List custom attributes of a project (id, name, type, isRequired, options). Use attribute ids as keys of "attributes" when creating work items or test plans.

Inputs: isDeleted, projectId, projectName.

list_project_autotest_namespacesB
Read-only

Autotest namespaces of a project with their classes (for filtering search_autotests).

Inputs: projectId, projectName.

list_projectsB
Read-only

List projects, optionally filtered by name, archive or favorite flag.

Inputs: name, page, size, skip, +6 more.

list_sectionsA
Read-only

List all sections (folders) of a project as a flat list with parentId. The root section has parentId=null. Use section IDs as sectionId when creating work items.

Inputs: page, size, skip, take, +5 more.

list_shared_step_referencesC
Read-only

Where a shared step is used: work items whose steps reference it, and sections (target).

Inputs: id (required), page, size, skip, +5 more.

list_shared_stepsC
Read-only

List shared steps of a project, with optional filters.

Inputs: name, page, size, skip, +12 more.

list_tagsA
Read-only

List tags. With projectId/projectName: tags used by that project's work items (plain names). Without: all tags in the instance (search with searchValue).

Inputs: page, size, skip, take, +5 more.

list_test_plan_configurationsC
Read-only

Configurations used by the test points of a test plan.

Inputs: id (required).

list_test_plansB
Read-only

List test plans for a project.

Inputs: isDeleted, projectId, projectName.

list_test_plan_tagsC
Read-only

Tags used by test plans (instance-wide).

Inputs: page, size, skip, take, +3 more.

list_test_plan_test_runsB
Read-only

List test runs of a test plan, optionally filtered by state.

Inputs: id (required), page, size, skip, +8 more.

list_test_plan_test_suitesA
Read-only

Get the test suite tree of a test plan (suites with nested children).

Inputs: testPlanId (required).

list_test_point_test_runsC
Read-only

Test runs that include a test point.

Inputs: id (required).

list_test_result_attachmentsA
Read-only

List attachments of a test result (id, name, type, size).

Inputs: id (required).

list_test_runsC
Read-only

List test runs for a project.

Inputs: page, size, skip, take, +12 more.

list_test_statusesA
Read-only

List test result statuses (system and custom): code, name, type. Use "code" as statusCode in submit_test_run_results / set_test_result (codes are case-insensitive, e.g. PASSED, FAILED, BLOCKED).

Inputs: no named parameters.

list_test_suite_configurationsC
Read-only

Configurations of a test suite.

Inputs: id (required).

list_test_suite_test_pointsA
Read-only

List test points of a test suite (work item x configuration, with status and tester).

Inputs: id (required).

list_test_suite_test_resultsC
Read-only

Test results of all test points in a test suite (latest attempts, with autotest and configuration).

Inputs: id (required).

list_work_item_autotestsC
Read-only

Autotests linked to a work item.

Inputs: id (required).

list_work_item_commentsC
Read-only

List comments of a work item.

Inputs: id (required).

list_work_itemsC
Read-only

List work items (test cases, checklists, shared steps) of a project, with optional filters.

Inputs: name, page, size, skip, +13 more.

move_sectionA
Idempotent

Move a section (with its work items and subsections) under another parent. Optionally place it before nextSectionId.

Inputs: id (required), parentId (required), nextSectionId.

move_work_itemB
Idempotent

Move a work item to another section (optionally before nextWorkItemId).

Inputs: id (required), sectionId (required), nextWorkItemId.

purge_configurationA
DestructiveIdempotent

Permanently delete an archived configuration. Irreversible; delete (archive) it first.

Inputs: id (required).

purge_test_planA
DestructiveIdempotent

Permanently delete an archived test plan. Irreversible; delete (archive) it first.

Inputs: id (required).

purge_test_runA
DestructiveIdempotent

Permanently delete an archived test run. Irreversible; delete (archive) it first.

Inputs: id (required).

purge_work_itemA
DestructiveIdempotent

Permanently delete an archived work item. Irreversible; the item must be deleted (archived) first.

Inputs: id (required).

rename_sectionC
Idempotent

Rename a section.

Inputs: id (required), name (required).

rerun_test_run_resultsA

Re-run autotest results of a run: each selected result gets a new pending attempt and the run goes back to InProgress. Submit new results via submit_test_run_results; attempts are listed by get_test_result_reruns.

Inputs: id (required), testResultIds (required).

reset_test_pointsA
DestructiveIdempotent

Reset the given test points of a test plan back to NoResults (their results are discarded).

Inputs: id (required), testPointIds (required).

restore_configurationB
Idempotent

Restore an archived configuration.

Inputs: id (required).

restore_test_planA
Idempotent

Restore an archived (deleted) test plan.

Inputs: id (required).

restore_test_runA
Idempotent

Restore an archived (deleted) test run.

Inputs: id (required).

restore_work_itemA
Idempotent

Restore an archived (deleted) work item by ID.

Inputs: id (required).

search_autotestsB
Read-only

Search autotests. Typed fields are merged over an optional raw "filter" (AutoTestFilterApiModel). projectIds defaults to the current project.

Inputs: name, page, size, skip, +14 more.

search_configuration_parametersB
Read-only

List configuration parameters (e.g. browser, os) with their values and projects. Defaults to the current project; name filters by substring.

Inputs: name, projectId, projectName.

search_configurationsB
Read-only

Search configurations by name substring across projects (default: current project).

Inputs: name, page, size, skip, +7 more.

search_projectsC
Read-only

Search projects by filter.

Inputs: query (required), page, size, skip, +4 more.

search_test_pointsB
Read-only

Search test points across test plans/suites. Typed fields are merged with an optional raw "filter" (TestPointFilterRequestModel).

Inputs: name, page, size, skip, +10 more.

search_test_resultsB
Read-only

Search test results. Typed fields are merged with an optional raw "query" (TestResultsFilterApiModel) for advanced fields.

Inputs: name, page, size, skip, +9 more.

search_test_runsB
Read-only

Search test runs (across projects if no project given). Typed fields are merged over an optional raw "filter" (TestRunFilterApiModel). projectIds defaults to the current project.

Inputs: name, page, size, skip, +10 more.

search_work_itemsB
Read-only

Search work items across projects. Typed filter fields are combined with an optional raw "filter" object (TestIT WorkItemFilterApiModel) for advanced fields.

Inputs: name, page, size, skip, +15 more.

set_autotestA
Idempotent

Partially update an autotest (JSON Patch): only name, title, description, namespace, classname you pass change. externalId is the result-matching key and is not editable here.

Inputs: id (required), name, title, classname, +2 more.

set_autotests_flakyA
Idempotent

Mark (value=true) or unmark (value=false) autotests as flaky by id.

Inputs: value (required), autoTestIds (required).

set_configurationA
Idempotent

Partially update a configuration: only the given fields change (JSON Patch). Prefer this over update_configuration.

Inputs: id (required), name, isDefault, parameters, +1 more.

set_projectA
Idempotent

Partially update a project (JSON Patch): only name/description you pass change.

Inputs: id (required), name, description.

set_test_plan_stateA
Idempotent

Change test plan status: start (-> InProgress), pause (-> Paused), complete (-> Completed).

Inputs: id (required), action (required).

set_test_resultA
Idempotent

Change selected fields of a test result (JSON Patch) without touching the others. To change the result status use statusCode (patching outcome is ignored by TestIT). Raw RFC 6902 operations can be added via "operations".

Inputs: id (required), trace, comment, message, +3 more.

set_test_runB
Idempotent

Partially update a test run (JSON Patch): only name, description, tags you pass change.

Inputs: id (required), name, tags, description.

set_test_suiteA
Idempotent

Rename a test suite (JSON Patch on name).

Inputs: id (required), name (required).

set_test_suite_configurationsB
Idempotent

Set the configurations of a test suite (replaces the current list).

Inputs: id (required), configurationIds (required).

set_test_suite_work_itemsA
Idempotent

Set the work items of a test suite. REPLACES the current list; test points are created for each work item x suite configuration (the default configuration if none set).

Inputs: id (required), workItemIds (required).

set_work_itemA
Idempotent

Partially update a work item: only the given fields change (JSON Patch), each call creates a new version. Prefer this over update_work_item (full replacement). Use move_work_item to change section.

Inputs: id (required), name, tags, state, +2 more.

start_test_runB
Idempotent

Start a test run.

Inputs: id (required).

stop_test_runC
Idempotent

Stop a test run.

Inputs: id (required).

submit_test_run_resultsA

Send autotest results into a test run (POST /testRuns/{id}/testResults). Each result needs an existing autotest externalId and a configurationId. Returns created test result IDs.

Inputs: id (required), results (required).

unassign_test_points_testerB
DestructiveIdempotent

Remove the tester from the given test points of a test plan. Returns the affected point ids.

Inputs: id (required), testPointIds (required).

update_configurationA
DestructiveIdempotent

Replace a configuration (PUT, ConfigurationPutModel with id). Fields not sent are cleared; use set_configuration for partial changes.

Inputs: payload (required).

update_configuration_parameterA
DestructiveIdempotent

Replace a configuration parameter (PUT): name, the FULL list of values and projects. Values not sent are removed.

Inputs: id (required), name (required), values (required), projectId, +2 more.

update_projectA
DestructiveIdempotent

Replace a project (PUT, full model with id); fields not sent are cleared. Prefer set_project.

Inputs: payload (required).

update_test_planA
DestructiveIdempotent

Replace a test plan (PUT). Requires id, name, projectId in payload; fields not sent are cleared.

Inputs: payload (required).

update_test_resultA
DestructiveIdempotent

Replace a test result (PUT). WARNING: this is a full replacement — fields not sent (comment, message, links, step results...) are cleared. Prefer set_test_result for partial changes.

Inputs: id (required), trace, comment, message, +4 more.

update_work_itemA
DestructiveIdempotent

Replace a work item (PUT, full model with id). Fields not sent are cleared; prefer set_work_item.

Inputs: payload (required).

update_work_item_commentC
DestructiveIdempotent

Replace the text of a work item comment.

Inputs: text (required), commentId (required).

upload_attachmentA

Upload a file to TestIT and get its attachment id/metadata. Pass the id in attachmentIds of create_work_item to attach it.

Inputs: filename (required), contentType (required), contentBase64 (required).

upload_test_result_attachmentB

Attach a file (screenshot, log) to a test result. Returns the new attachment id.

Inputs: id (required), filename (required), contentType (required), contentBase64 (required).

upload_work_item_attachmentC

Upload an attachment to a work item.

Inputs: id (required), filename (required), contentType (required), contentBase64 (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 130 tools

    Disambiguation4/5

    Most tools target a distinct resource and action, and descriptions explicitly disambiguate close pairs such as list vs search, set vs update, and the multiple create_test_run_from_* variants. However, the 130-tool surface includes several near-duplicate patterns and lifecycle variants that can still cause misselection under load.

    Naming Consistency5/5

    Names consistently use snake_case verb_noun phrasing (list_, get_, create_, set_, delete_, restore_, purge_) across all resources. Minor variants like create_test_plan_clone and rerun_test_run_results remain readable and follow the same convention.

    Tool Count1/5

    130 tools far exceeds the 3-15 range appropriate for an MCP server and the 25+ threshold for 'too many'; even for a broad test-management API, this volume creates significant selection and context burden.

    Completeness5/5

    The surface covers CRUD and lifecycle operations for projects, work items, sections, test plans, suites, runs, results, autotests, configurations, attachments, comments, shared steps, tags, and analytics. Stated API limitations (e.g. no user list, no autotest restore/purge) are documented rather than hidden gaps.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers