Skip to main content
Glama

get_case_execution_history

Read-onlyIdempotent

Get a manual test case's historical performance across all executions and releases, returning a summary of pass, fail, blocked, and not-executed counts plus per-execution details.

Instructions

Get how one manual test case has fared over time, across every Manual Test Execution and release it appeared in, newest first. Returns executions and summary. The headline figures are NESTED under summary, not at the top level: summary carries totalExecutions, executedCount, passed, failed, blocked, inTesting, notExecuted and passRate. totalExecutions counts memberships, including times the case was added and never run. executedCount is every row that has actually been touched, which INCLUDES rows still in_testing, so passed + failed + blocked + notExecuted can come to less than totalExecutions and the shortfall is inTesting. passRate is passed divided by executedCount, so an unfinished in_testing row sits in the denominator and drags the rate down. That denominator is not the one list_executions uses: its progress.passRate divides by the total case count, counting never-run cases against the rate, so the two figures share a name and are not comparable. Each row carries id, status, runId, runName, executedBy, executedAt, notes and source. source is a STRING, not an object: it reads either "standalone", and then the row also carries executionId and executionName as siblings, or "release", and then it carries releaseId, releaseName and releaseVersion instead. Compare it as a string - row.source === "release" - because row.source.type is undefined on every row and filters silently to nothing. A row whose source is release carries releaseId, releaseName and releaseVersion but no executionId, even though it does sit inside a Manual Test Execution. It can still be traced there, by either of two joins: the row id is the same value get_execution_cases returns as executionCaseId, and the row runId is the same value get_execution returns as sources[].id. Both joins run FROM an execution, though, and nothing takes a runId or an executionCaseId and hands back the execution holding it. Use get_release on the releaseId the row does carry and match against its linkedExecutions: list_executions has NO releaseId filter, and an unrecognised argument is ignored rather than rejected, so passing one there silently returns every execution in the project. IMPORTANT: limit bounds the summary as well as the list, so those figures describe the returned page rather than the whole window, and days defaults to 30, so a case last tested longer ago returns almost nothing and reads as never tested. Pass days explicitly; 365 is the ceiling, so for a case older than a year there is no way to ask for all of its history at once. This covers MANUAL results only: use get_test_history for an automated test across launches, and get_execution_cases for the rows inside one execution.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
daysNoLookback period in days
limitNoMaximum number of executions to return
caseIdYesInternal numeric test case id (the "id" from list_test_cases / get_test_case / create_test_case). This is NOT the user-facing "TC-N" number (caseNumber/displayId) - if the user gave you a "TC-N", resolve it first via list_test_cases(search: "TC-N") and use the returned id. Project is derived from the case.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. First observedv1.5.0

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description's existing annotations declare readonly and non-destructive, and the description goes far beyond them by revealing the exact scenarios: summary figures are nested rather than top-level, passRate divides by executedCount while list_executions's progress.passRate divides by total case count, source is a STRING whose .type is undefined and filter silently to nothing, and totalExecutions counts memberships including never-run entries. It also discloses that limit bounds the summary aggregates, not just the list, and that no inverse join exists from runId/executionCaseId back to the owning execution — all non-obvious behavior that an agent would otherwise be unaware of.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The content is dense and earns its place, but the description is a single wall of text of roughly 400 words with no paragraph breaks, no bulleted structure, and several compressed explanations repeated (the source-is-a-string caveat is described twice, the passRate denominator difference appears both in the middle and near the end). The opening sentence is front-loaded and strong, but the mid-portion is very hard to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the full burden of explaining the return shape — and it does so thoroughly for both the row fields (id, status, runId, runName, executedBy, executedAt, notes, source with its standalone/release variants) and the summary fields — totalExecutions, executedCount, passed, failed, blocked, inTesting, notExecuted and passRate. It also documents edge cases (never-run memberships, inTesting shortfall, 365-day ceiling, both join paths and the lack of a reverse lookup) and identifies which sibling covers what, so nothing that an agent needs to invoke and interpret the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for all three parameters, so the baseline is 3. The description contributes additional semantics beyond schema: days at its default of 30 can produce a near-empty result that falsely reads as 'never tested,' 365 is a hard ceiling with no way to query all history at once, and limit bounds the summary aggregates rather than just page size — none of which the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb ('get'), a precise resource ('how one manual test case has fared over time'), and an explicit scope ('across every Manual Test Execution and release it appeared in, newest first'). It further differentiates itself from siblings by stating that only MANUAL results are covered, so an agent can distinguish it from get_test_history and get_execution_cases without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly routes to alternatives: 'use get_test_history for an automated test across launches, and get_execution_cases for the rows inside one execution.' It also warns against the tempting workaround of passing a releaseId to list_executions, since that tool has no releaseId filter and silently ignores unrecognized arguments, and instructs the caller to pass days explicitly because the 30-day default makes older cases read as never tested.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/m00nreport/mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server